Simplifies Object.toString alias generation.

Change-Id: Ib93059627c34e4e50c3e396438a6a08643148f89
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index 2c98b69..d6b8e70 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.dev.jjs.impl;
 
+import static com.google.gwt.dev.js.JsUtils.createAssignment;
+
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.linker.impl.StandardSymbolData;
 import com.google.gwt.dev.CompilerContext;
@@ -2195,10 +2197,6 @@
       }
     }
 
-    private JsExpression createAssignment(JsExpression lhs, JsExpression rhs) {
-      return new JsBinaryOperation(lhs.getSourceInfo(), JsBinaryOperator.ASG, lhs, rhs);
-    }
-
     private JsExpression createCommaExpression(JsExpression lhs, JsExpression rhs) {
       if (lhs == null) {
         return rhs;
@@ -2208,14 +2206,6 @@
       return new JsBinaryOperation(lhs.getSourceInfo(), JsBinaryOperator.COMMA, lhs, rhs);
     }
 
-    private JsNameRef createNativeToStringRef(JsExpression qualifier) {
-      JsName toStringName = objectScope.declareName("toString");
-      toStringName.setObfuscatable(false);
-      JsNameRef toStringRef = toStringName.makeRef(qualifier.getSourceInfo());
-      toStringRef.setQualifier(qualifier);
-      return toStringRef;
-    }
-
     private JsExpression generateCastableTypeMap(JClassType x) {
       JCastMap castMap = program.getCastMap(x);
       if (castMap != null) {
@@ -2607,29 +2597,11 @@
     }
 
     private void generateToStringAlias(JClassType x, List<JsStatement> globalStmts) {
-      JMethod toStringMeth = program.getIndexedMethod("Object.toString");
-      if (x.getMethods().contains(toStringMeth)) {
-        SourceInfo sourceInfo = x.getSourceInfo();
-        // _.toString = function(){return this.java_lang_Object_toString();}
-
-        // lhs
-        JsNameRef lhs = createNativeToStringRef(getPrototypeQualifierOf(x, sourceInfo));
-
-        // rhs
-        JsNameRef toStringRef = new JsNameRef(sourceInfo, polymorphicNames.get(toStringMeth));
-        toStringRef.setQualifier(new JsThisRef(sourceInfo));
-        JsInvocation call = new JsInvocation(sourceInfo, toStringRef);
-        JsReturn jsReturn = new JsReturn(sourceInfo, call);
-        JsFunction rhs = new JsFunction(sourceInfo, topScope);
-        JsBlock body = new JsBlock(sourceInfo);
-        body.getStatements().add(jsReturn);
-        rhs.setBody(body);
-
-        // asg
-        JsExpression asg = createAssignment(lhs, rhs);
-        JsExprStmt stmt = asg.makeStmt();
-        globalStmts.add(stmt);
-        typeForStatMap.put(stmt, program.getTypeJavaLangObject());
+      JMethod toStringMethod = program.getIndexedMethod("Object.toString");
+      if (x.getMethods().contains(toStringMethod)) {
+        JsName toStringName = objectScope.declareName("toString");
+        toStringName.setObfuscatable(false);
+        generateVTableAlias(globalStmts, toStringMethod, toStringName);
       }
     }