Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(282)

Unified Diff: sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart

Issue 11602016: Emit classes using ASTs (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 58debdba0858b1686abc9702ca6cd7ce12610569..0d5c55cfda7f12c7124171d885904bdfa96bc108 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -25,6 +25,25 @@ class ClosureInvocationElement extends FunctionElement {
}
/**
+ * A convenient type alias for some functions that emit keyed values.
+ */
+typedef void DefineStubFunction(String invocationName, js.Expression value);
+
+/**
+ * A data structure for collecting fragments of a class definition.
+ */
+class ClassBuilder {
+ final List<js.Property> properties = <js.Property>[];
+
+ // Has the same signature as [DefineStubFunction].
+ void addProperty(String name, js.Expression value) {
+ properties.add(new js.Property(js.string(name), value));
+ }
+
+ js.Expression toObjectInitializer() => new js.ObjectInitializer(properties);
+}
+
+/**
* Generates the code for all used classes in the program. Static fields (even
* in classes) are ignored, since they can be treated as non-class elements.
*
@@ -427,7 +446,7 @@ $lazyInitializerLogic
*/
void addParameterStub(FunctionElement member,
Selector selector,
- DefineMemberFunction defineInstanceMember,
+ DefineStubFunction defineStub,
Set<String> alreadyGenerated) {
FunctionSignature parameters = member.computeSignature(compiler);
int positionalArgumentCount = selector.positionalArgumentCount;
@@ -531,13 +550,11 @@ $lazyInitializerLogic
js.Fun function = new js.Fun(parametersBuffer, new js.Block(body));
- CodeBuffer buffer = new CodeBuffer();
- buffer.add(js.prettyPrint(function, compiler));
- defineInstanceMember(invocationName, buffer);
+ defineStub(invocationName, function);
}
void addParameterStubs(FunctionElement member,
- DefineMemberFunction defineInstanceMember) {
+ DefineStubFunction defineStub) {
// We fill the lists depending on the selector. For example,
// take method foo:
// foo(a, b, {c, d});
@@ -577,16 +594,14 @@ $lazyInitializerLogic
? computeNamedSelectors(signature, member)
: computeOptionalSelectors(signature, member);
for (Selector selector in selectors) {
- addParameterStub(
- member, selector, defineInstanceMember, generatedStubNames);
+ addParameterStub(member, selector, defineStub, generatedStubNames);
}
} else {
Set<Selector> selectors = compiler.codegenWorld.invokedNames[member.name];
if (selectors == null) return;
for (Selector selector in selectors) {
if (!selector.applies(member, compiler)) continue;
- addParameterStub(
- member, selector, defineInstanceMember, generatedStubNames);
+ addParameterStub(member, selector, defineStub, generatedStubNames);
}
}
}
@@ -673,8 +688,7 @@ $lazyInitializerLogic
*
* Invariant: [member] must be a declaration element.
*/
- void addInstanceMember(Element member,
- DefineMemberFunction defineInstanceMember) {
+ void addInstanceMember(Element member, ClassBuilder builder) {
assert(invariant(member, member.isDeclaration));
// TODO(floitsch): we don't need to deal with members of
// uninstantiated classes, that have been overwritten by subclasses.
@@ -683,23 +697,23 @@ $lazyInitializerLogic
|| member.isGenerativeConstructorBody()
|| member.isAccessor()) {
if (member.isAbstract(compiler)) return;
- CodeBuffer codeBuffer = compiler.codegenWorld.generatedCode[member];
- if (codeBuffer == null) return;
- defineInstanceMember(namer.getName(member), codeBuffer);
- codeBuffer = compiler.codegenWorld.generatedBailoutCode[member];
- if (codeBuffer != null) {
- defineInstanceMember(namer.getBailoutName(member), codeBuffer);
+ js.Expression code = compiler.codegenWorld.generatedCode[member];
+ if (code == null) return;
+ builder.addProperty(namer.getName(member), code);
+ code = compiler.codegenWorld.generatedBailoutCode[member];
+ if (code != null) {
+ builder.addProperty(namer.getBailoutName(member), code);
}
FunctionElement function = member;
FunctionSignature parameters = function.computeSignature(compiler);
if (!parameters.optionalParameters.isEmpty) {
- addParameterStubs(member, defineInstanceMember);
+ addParameterStubs(member, builder.addProperty);
}
} else if (!member.isField()) {
compiler.internalError('unexpected kind: "${member.kind}"',
element: member);
}
- emitExtraAccessors(member, defineInstanceMember);
+ emitExtraAccessors(member, builder);
}
/**
@@ -708,20 +722,11 @@ $lazyInitializerLogic
* Invariant: [classElement] must be a declaration element.
*/
void emitInstanceMembers(ClassElement classElement,
- CodeBuffer buffer,
- bool emitLeadingComma) {
+ ClassBuilder builder) {
assert(invariant(classElement, classElement.isDeclaration));
- void defineInstanceMember(String name, StringBuffer memberBuffer) {
- if (emitLeadingComma) buffer.add(',');
- emitLeadingComma = true;
- buffer.add('\n');
- buffer.add('$_$name:$_');
- buffer.add(memberBuffer);
- }
-
JavaScriptBackend backend = compiler.backend;
if (classElement == backend.objectInterceptorClass) {
- emitInterceptorMethods(defineInstanceMember);
+ emitInterceptorMethods(builder);
// The ObjectInterceptor does not have any instance methods.
return;
}
@@ -730,22 +735,20 @@ $lazyInitializerLogic
(ClassElement enclosing, Element member) {
assert(invariant(classElement, member.isDeclaration));
if (member.isInstanceMember()) {
- addInstanceMember(member, defineInstanceMember);
+ addInstanceMember(member, builder);
}
},
includeBackendMembers: true);
generateIsTestsOn(classElement, (Element other) {
- String code;
+ js.Expression code;
if (compiler.objectClass == other) return;
if (nativeEmitter.requiresNativeIsCheck(other)) {
- code = 'function()$_{${_}return true;$_}';
+ code = js.fun([], js.block1(js.return_(new js.LiteralBool(true))));
} else {
- code = 'true';
+ code = new js.LiteralBool(true);
}
- CodeBuffer typeTestBuffer = new CodeBuffer();
- typeTestBuffer.add(code);
- defineInstanceMember(namer.operatorIs(other), typeTestBuffer);
+ builder.addProperty(namer.operatorIs(other), code);
});
if (identical(classElement, compiler.objectClass)
@@ -755,7 +758,7 @@ $lazyInitializerLogic
// them. Note that this helper is invoked before analyzing the
// full JS script.
if (!nativeEmitter.handleNoSuchMethod) {
- emitNoSuchMethodHandlers(defineInstanceMember);
+ emitNoSuchMethodHandlers(builder.addProperty);
}
}
}
@@ -879,15 +882,20 @@ $lazyInitializerLogic
}
void generateGetter(Element member, String fieldName, String accessorName,
- CodeBuffer buffer) {
+ ClassBuilder builder) {
String getterName = namer.getterNameFromAccessorName(accessorName);
- buffer.add("$getterName: function() { return this.$fieldName; }");
+ builder.addProperty(getterName,
+ js.fun([], js.block1(js.return_(js.use('this').dot(fieldName)))));
}
void generateSetter(Element member, String fieldName, String accessorName,
- CodeBuffer buffer) {
+ ClassBuilder builder) {
String setterName = namer.setterNameFromAccessorName(accessorName);
- buffer.add("$setterName: function(v) { this.$fieldName = v; }");
+ builder.addProperty(setterName,
+ js.fun(['v'],
+ js.block1(
+ new js.ExpressionStatement(
+ js.assign(js.use('this').dot(fieldName), js.use('v'))))));
}
bool canGenerateCheckedSetter(Element member) {
@@ -904,39 +912,43 @@ $lazyInitializerLogic
void generateCheckedSetter(Element member,
String fieldName,
String accessorName,
- CodeBuffer buffer) {
+ ClassBuilder builder) {
assert(canGenerateCheckedSetter(member));
DartType type = member.computeType(compiler);
SourceString helper = compiler.backend.getCheckedModeHelper(type);
FunctionElement helperElement = compiler.findHelper(helper);
String helperName = namer.isolateAccess(helperElement);
- String additionalArgument = '';
+ List<js.Expression> arguments = <js.Expression>[js.use('v')];
if (helperElement.computeSignature(compiler).parameterCount != 1) {
- additionalArgument = ",$_'${namer.operatorIs(type.element)}'";
+ arguments.add(js.string(namer.operatorIs(type.element)));
}
+
String setterName = namer.setterNameFromAccessorName(accessorName);
- buffer.add("$setterName:${_}function(v)$_{$_"
- "this.$fieldName$_=$_$helperName(v$additionalArgument);}");
+ builder.addProperty(setterName,
+ js.fun(['v'],
+ js.block1(
+ new js.ExpressionStatement(
+ js.assign(
+ js.use('this').dot(fieldName),
+ js.call(js.use(helperName), arguments))))));
}
- void emitClassConstructor(ClassElement classElement, CodeBuffer buffer) {
+ void emitClassConstructor(ClassElement classElement, ClassBuilder builder) {
/* Do nothing. */
}
- void emitSuper(String superName, CodeBuffer buffer) {
+ void emitSuper(String superName, ClassBuilder builder) {
/* Do nothing. */
}
void emitClassFields(ClassElement classElement,
- CodeBuffer buffer,
- bool emitEndingComma,
+ ClassBuilder builder,
{ String superClass: "",
bool classIsNative: false}) {
bool isFirstField = true;
- bool isAnythingOutput = false;
+ StringBuffer buffer = new StringBuffer();
if (!classIsNative) {
- buffer.add('"":"$superClass;');
- isAnythingOutput = true;
+ buffer.add('$superClass;');
}
visitClassFields(classElement, (Element member,
String name,
@@ -954,12 +966,8 @@ $lazyInitializerLogic
// Emit correct commas.
if (isFirstField) {
isFirstField = false;
- if (!isAnythingOutput) {
- buffer.add('"":"');
- isAnythingOutput = true;
- }
} else {
- buffer.add(",");
+ buffer.add(',');
}
int flag = 0;
if (!needsAccessor) {
@@ -986,25 +994,15 @@ $lazyInitializerLogic
}
}
});
- if (isAnythingOutput) {
- buffer.add('"');
- if (emitEndingComma) {
- buffer.add(',');
- }
+
+ String compactClassData = buffer.toString();
+ if (compactClassData.length > 0) {
+ builder.addProperty('', js.string(compactClassData));
}
}
- /** Each getter/setter must be prefixed with a ",\n ". */
void emitClassGettersSetters(ClassElement classElement,
- CodeBuffer buffer,
- bool emitLeadingComma) {
- emitComma() {
- if (emitLeadingComma) {
- buffer.add(",\n$_");
- } else {
- emitLeadingComma = true;
- }
- }
+ ClassBuilder builder) {
visitClassFields(classElement, (Element member,
String name,
@@ -1014,17 +1012,14 @@ $lazyInitializerLogic
bool needsCheckedSetter) {
if (needsCheckedSetter) {
assert(!needsSetter);
- emitComma();
- generateCheckedSetter(member, name, accessorName, buffer);
+ generateCheckedSetter(member, name, accessorName, builder);
}
if (!getterAndSetterCanBeImplementedByFieldSpec) {
if (needsGetter) {
- emitComma();
- generateGetter(member, name, accessorName, buffer);
+ generateGetter(member, name, accessorName, builder);
}
if (needsSetter) {
- emitComma();
- generateSetter(member, name, accessorName, buffer);
+ generateSetter(member, name, accessorName, builder);
}
}
});
@@ -1055,23 +1050,26 @@ $lazyInitializerLogic
superName = namer.getName(superclass);
}
- buffer.add('$classesCollector.$className$_=$_{');
- emitClassConstructor(classElement, buffer);
- emitSuper(superName, buffer);
- emitClassFields(classElement, buffer, false,
+ ClassBuilder builder = new ClassBuilder();
+
+ emitClassConstructor(classElement, builder);
+ emitSuper(superName, builder);
+ emitClassFields(classElement, builder,
superClass: superName, classIsNative: false);
- // TODO(floitsch): the emitInstanceMember should simply always emit a ',\n'.
- // That does currently not work because the native classes have a different
- // syntax.
- emitClassGettersSetters(classElement, buffer, true);
- emitInstanceMembers(classElement, buffer, true);
- buffer.add('$n}$N$n');
+ emitClassGettersSetters(classElement, builder);
+ emitInstanceMembers(classElement, builder);
+
+ js.Expression init =
+ js.assign(
+ js.use(classesCollector).dot(className),
+ builder.toObjectInitializer());
+ buffer.add(js.prettyPrint(init, compiler));
+ buffer.add('$N$n');
}
bool get getterAndSetterCanBeImplementedByFieldSpec => true;
- void emitInterceptorMethods(
- void defineInstanceMember(String name, StringBuffer memberBuffer)) {
+ void emitInterceptorMethods(ClassBuilder builder) {
JavaScriptBackend backend = compiler.backend;
// Emit forwarders for the ObjectInterceptor class. We need to
// emit all possible sends on intercepted methods.
@@ -1105,10 +1103,7 @@ $lazyInitializerLogic
new js.VariableUse('receiver')
.dot(name)
.callWith(arguments))]));
-
- CodeBuffer code = new CodeBuffer();
- code.add(js.prettyPrint(function, compiler));
- defineInstanceMember(name, code);
+ builder.addProperty(name, function);
}
}
@@ -1274,13 +1269,12 @@ $lazyInitializerLogic
}
}
- void emitStaticFunctionWithNamer(CodeBuffer buffer,
- Element element,
- CodeBuffer functionBuffer,
- String functionNamer(Element element)) {
- String functionName = functionNamer(element);
- buffer.add('$isolateProperties.$functionName$_=$_');
- buffer.add(functionBuffer);
+ void emitStaticFunction(CodeBuffer buffer,
+ String name,
+ js.Expression functionExpression) {
+ js.Expression assignment =
+ js.assign(js.use(isolateProperties).dot(name), functionExpression);
+ buffer.add(js.prettyPrint(assignment, compiler));
buffer.add('$N$n');
}
@@ -1296,14 +1290,13 @@ $lazyInitializerLogic
isStaticFunction));
for (Element element in Elements.sortedByPosition(elements)) {
- CodeBuffer code = compiler.codegenWorld.generatedCode[element];
- emitStaticFunctionWithNamer(buffer, element, code, namer.getName);
- CodeBuffer bailoutCode =
+ js.Expression code = compiler.codegenWorld.generatedCode[element];
+ emitStaticFunction(buffer, namer.getName(element), code);
+ js.Expression bailoutCode =
compiler.codegenWorld.generatedBailoutCode[element];
if (bailoutCode != null) {
pendingElementsWithBailouts.remove(element);
- emitStaticFunctionWithNamer(
- buffer, element, bailoutCode, namer.getBailoutName);
+ emitStaticFunction(buffer, namer.getBailoutName(element), bailoutCode);
}
}
@@ -1312,16 +1305,14 @@ $lazyInitializerLogic
Elements.sortedByPosition(pendingElementsWithBailouts)) {
CodeBuffer bailoutCode =
compiler.codegenWorld.generatedBailoutCode[element];
- emitStaticFunctionWithNamer(
- buffer, element, bailoutCode, namer.getBailoutName);
+ emitStaticFunction(buffer, namer.getBailoutName(element), bailoutCode);
}
}
void emitStaticFunctionGetters(CodeBuffer buffer) {
Set<FunctionElement> functionsNeedingGetter =
compiler.codegenWorld.staticFunctionsNeedingGetter;
- for (FunctionElement element in
- Elements.sortedByPosition(functionsNeedingGetter)) {
+ for (FunctionElement element in functionsNeedingGetter) {
// The static function does not have the correct name. Since
// [addParameterStubs] use the name to create its stubs we simply
// create a fake element with the correct name.
@@ -1333,9 +1324,17 @@ $lazyInitializerLogic
String invocationName = namer.instanceMethodName(callElement);
String fieldAccess = '$isolateProperties.$staticName';
buffer.add("$fieldAccess.$invocationName$_=$_$fieldAccess$N");
- addParameterStubs(callElement, (String name, CodeBuffer value) {
- buffer.add('$fieldAccess.$name$_=$_$value$N');
+
+ addParameterStubs(callElement, (String name, js.Expression value) {
+ js.Expression assignment =
+ js.assign(
+ js.use(isolateProperties).dot(staticName).dot(name),
+ value);
+ buffer.add(
+ js.prettyPrint(new js.ExpressionStatement(assignment), compiler));
+ buffer.add('$N');
});
+
// If a static function is used as a closure we need to add its name
// in case it is used in spawnFunction.
String fieldName = namer.STATIC_CLOSURE_NAME_NAME;
@@ -1352,9 +1351,9 @@ $lazyInitializerLogic
void emitBoundClosureClassHeader(String mangledName,
String superName,
List<String> fieldNames,
- CodeBuffer buffer) {
- buffer.add('$classesCollector.$mangledName$_=$_'
- '{"":"$superName;${Strings.join(fieldNames,',')}",');
+ ClassBuilder builder) {
+ builder.addProperty('',
+ js.string("$superName;${Strings.join(fieldNames,',')}"));
}
/**
@@ -1363,7 +1362,7 @@ $lazyInitializerLogic
* Invariant: [member] must be a declaration element.
*/
void emitDynamicFunctionGetter(FunctionElement member,
- DefineMemberFunction defineInstanceMember) {
+ DefineStubFunction defineStub) {
assert(invariant(member, member.isDeclaration));
// For every method that has the same name as a property-get we create a
// getter that returns a bound closure. Say we have a class 'A' with method
@@ -1426,8 +1425,9 @@ $lazyInitializerLogic
// Define the constructor with a name so that Object.toString can
// find the class name of the closure class.
+ ClassBuilder boundClosureBuilder = new ClassBuilder();
emitBoundClosureClassHeader(
- mangledName, superName, fieldNames, boundClosureBuffer);
+ mangledName, superName, fieldNames, boundClosureBuilder);
// Now add the methods on the closure class. The instance method does not
// have the correct name. Since [addParameterStubs] use the name to create
// its stubs we simply create a fake element with the correct name.
@@ -1458,20 +1458,20 @@ $lazyInitializerLogic
new js.This().dot(fieldNames[0]),
new js.This().dot(fieldNames[1]))
.callWith(arguments))]));
+ boundClosureBuilder.addProperty(invocationName, fun);
- boundClosureBuffer.add(
- '$_$invocationName:$_${js.prettyPrint(fun,compiler)}');
-
- addParameterStubs(callElement, (String stubName, CodeBuffer memberValue) {
- boundClosureBuffer.add(',\n$_$stubName:$_$memberValue');
- });
-
+ addParameterStubs(callElement, boundClosureBuilder.addProperty);
typedefChecks.forEach((Element typedef) {
String operator = namer.operatorIs(typedef);
- boundClosureBuffer.add(',\n$_$operator$_:${_}true');
+ boundClosureBuilder.addProperty(operator, new js.LiteralBool(true));
});
- boundClosureBuffer.add("$n}$N");
+ js.Expression init =
+ js.assign(
+ js.use(classesCollector).dot(mangledName),
+ boundClosureBuilder.toObjectInitializer());
+ boundClosureBuffer.add(js.prettyPrint(init, compiler));
+ boundClosureBuffer.add("$N");
closureClass = namer.isolateAccess(closureClassElement);
@@ -1488,7 +1488,7 @@ $lazyInitializerLogic
List<js.Parameter> parameters = <js.Parameter>[];
List<js.Expression> arguments = <js.Expression>[];
arguments.add(new js.This());
- arguments.add(new js.LiteralString("'$targetName'"));
+ arguments.add(js.string(targetName));
if (inInterceptor) {
parameters.add(new js.Parameter(extraArg));
arguments.add(new js.VariableUse(extraArg));
@@ -1503,9 +1503,7 @@ $lazyInitializerLogic
new js.VariableUse(closureClass),
arguments))]));
- CodeBuffer getterBuffer = new CodeBuffer();
- getterBuffer.add(js.prettyPrint(getterFunction, compiler));
- defineInstanceMember(getterName, getterBuffer);
+ defineStub(getterName, getterFunction);
}
/**
@@ -1515,7 +1513,7 @@ $lazyInitializerLogic
*/
void emitCallStubForGetter(Element member,
Set<Selector> selectors,
- DefineMemberFunction defineInstanceMember) {
+ DefineStubFunction defineStub) {
assert(invariant(member, member.isDeclaration));
LibraryElement memberLibrary = member.getLibrary();
JavaScriptBackend backend = compiler.backend;
@@ -1571,9 +1569,7 @@ $lazyInitializerLogic
buildGetter().dot(closureCallName)
.callWith(arguments))]));
- CodeBuffer getterBuffer = new CodeBuffer();
- getterBuffer.add(js.prettyPrint(function, compiler));
- defineInstanceMember(invocationName, getterBuffer);
+ defineStub(invocationName, function);
}
}
}
@@ -1605,7 +1601,7 @@ $lazyInitializerLogic
needsLazyInitializer = true;
for (VariableElement element in lazyFields) {
assert(compiler.codegenWorld.generatedBailoutCode[element] == null);
- StringBuffer code = compiler.codegenWorld.generatedCode[element];
+ js.Expression code = compiler.codegenWorld.generatedCode[element];
assert(code != null);
// The code only computes the initial value. We build the lazy-check
// here:
@@ -1621,7 +1617,7 @@ $lazyInitializerLogic
buffer.add("',$_'");
buffer.add(namer.getLazyInitializerName(element));
buffer.add("',$_");
- buffer.add(code);
+ buffer.add(js.prettyPrint(code, compiler));
emitLazyInitializedGetter(element, buffer);
buffer.add(")$N");
}
@@ -1677,22 +1673,21 @@ $lazyInitializerLogic
*
* Invariant: [member] must be a declaration element.
*/
- void emitExtraAccessors(Element member,
- DefineMemberFunction defineInstanceMember) {
+ void emitExtraAccessors(Element member, ClassBuilder builder) {
assert(invariant(member, member.isDeclaration));
if (member.isGetter() || member.isField()) {
Set<Selector> selectors = compiler.codegenWorld.invokedNames[member.name];
if (selectors != null && !selectors.isEmpty) {
- emitCallStubForGetter(member, selectors, defineInstanceMember);
+ emitCallStubForGetter(member, selectors, builder.addProperty);
}
} else if (member.isFunction()) {
if (compiler.codegenWorld.hasInvokedGetter(member, compiler)) {
- emitDynamicFunctionGetter(member, defineInstanceMember);
+ emitDynamicFunctionGetter(member, builder.addProperty);
}
}
}
- void emitNoSuchMethodHandlers(DefineMemberFunction defineInstanceMember) {
+ void emitNoSuchMethodHandlers(DefineStubFunction defineStub) {
// Do not generate no such method handlers if there is no class.
if (compiler.codegenWorld.instantiatedClasses.isEmpty) return;
@@ -1738,7 +1733,7 @@ $lazyInitializerLogic
List<js.Expression> argNames =
selector.getOrderedNamedArguments().map((SourceString name) =>
- new js.LiteralString('"${name.slowToString()}"'));
+ js.string(name.slowToString()));
String internalName = namer.invocationMirrorInternalName(selector);
@@ -1754,12 +1749,11 @@ $lazyInitializerLogic
.dot(createInvocationMirror)
.callWith(
<js.Expression>[
- new js.LiteralString('"$methodName"'),
- new js.LiteralString('"$internalName"'),
+ js.string(methodName),
+ js.string(internalName),
new js.LiteralNumber('$type'),
new js.ArrayInitializer.from(
- parameters.map((param) =>
- new js.VariableUse(param.name))),
+ parameters.map((param) => js.use(param.name))),
new js.ArrayInitializer.from(argNames)])]);
js.Expression function =
new js.Fun(parameters,
@@ -1857,9 +1851,7 @@ $lazyInitializerLogic
String jsName = namer.invocationMirrorInternalName(selector);
if (!addedJsNames.contains(jsName)) {
js.Expression method = generateMethod(jsName, selector);
- CodeBuffer jsCode = new CodeBuffer();
- jsCode.add(js.prettyPrint(method, compiler));
- defineInstanceMember(jsName, jsCode);
+ defineStub(jsName, method);
addedJsNames.add(jsName);
}
}
@@ -2161,7 +2153,7 @@ if (typeof document !== 'undefined' && document.readyState !== 'complete') {
addLazyInitializerFunctionIfNecessary(mainBuffer);
emitFinishIsolateConstructor(mainBuffer);
mainBuffer.add('}\n');
- compiler.assembledCode = mainBuffer.toString();
+ compiler.assembledCode = mainBuffer.getText();
if (generateSourceMap) {
SourceFile compiledFile = new SourceFile(null, compiler.assembledCode);
@@ -2183,8 +2175,6 @@ if (typeof document !== 'undefined' && document.readyState !== 'complete') {
}
}
-typedef void DefineMemberFunction(String invocationName, CodeBuffer definition);
-
const String GENERATED_BY = """
// Generated by dart2js, the Dart to JavaScript compiler.
""";

Powered by Google App Engine
This is Rietveld 408576698