Chromium Code Reviews| Index: dart/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart |
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/dart/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart |
| index 8d0c6a9bdcd39808fd44a6ceef4e6769a9975993..967c4c7a55d2827e3b1b95080f79f19db3d527b7 100644 |
| --- a/dart/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart |
| +++ b/dart/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart |
| @@ -911,55 +911,6 @@ class CodeEmitterTask extends CompilerTask { |
| return field is ClosureFieldElement; |
| } |
| - /** |
| - * Documentation wanted -- johnniwinther |
| - * |
| - * Invariant: [member] must be a declaration element. |
| - */ |
| - 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. |
| - |
| - if (member.isFunction() |
| - || member.isGenerativeConstructorBody() |
| - || member.isAccessor()) { |
| - if (member.isAbstract(compiler)) return; |
| - jsAst.Expression code = backend.generatedCode[member]; |
| - if (code == null) return; |
| - String name = namer.getNameOfInstanceMember(member); |
| - if (backend.isInterceptedMethod(member)) { |
| - interceptorInvocationNames.add(name); |
| - } |
| - code = extendWithMetadata(member, code); |
| - builder.addProperty(name, code); |
| - String reflectionName = getReflectionName(member, name); |
| - if (reflectionName != null) { |
| - var reflectable = |
| - js(backend.isAccessibleByReflection(member) ? '1' : '0'); |
| - builder.addProperty('+$reflectionName', reflectable); |
| - jsAst.Node defaultValues = reifyDefaultArguments(member); |
| - if (defaultValues != null) { |
| - String unmangledName = member.name.slowToString(); |
| - builder.addProperty('*$unmangledName', defaultValues); |
| - } |
| - } |
| - code = backend.generatedBailoutCode[member]; |
| - if (code != null) { |
| - builder.addProperty(namer.getBailoutName(member), code); |
| - } |
| - FunctionElement function = member; |
| - FunctionSignature parameters = function.computeSignature(compiler); |
| - if (!parameters.optionalParameters.isEmpty) { |
| - containerBuilder.addParameterStubs(function, builder.addProperty); |
| - } |
| - } else if (!member.isField()) { |
| - compiler.internalError('unexpected kind: "${member.kind}"', |
| - element: member); |
| - } |
| - containerBuilder.emitExtraAccessors(member, builder); |
| - } |
| - |
| /// Returns the "reflection name" of an [Element] or [Selector]. |
| /// The reflection name of a getter 'foo' is 'foo'. |
| /// The reflection name of a setter 'foo' is 'foo='. |
| @@ -1082,7 +1033,7 @@ class CodeEmitterTask extends CompilerTask { |
| void visitMember(ClassElement enclosing, Element member) { |
| assert(invariant(classElement, member.isDeclaration)); |
| if (member.isInstanceMember()) { |
| - addInstanceMember(member, builder); |
| + containerBuilder.addMember(member, builder); |
| } |
| } |
| @@ -2038,18 +1989,6 @@ class CodeEmitterTask extends CompilerTask { |
| } |
| } |
| - void emitStaticFunction(CodeBuffer buffer, |
| - String name, |
| - jsAst.Expression functionExpression) { |
| - // TODO(ahe): This method (emitStaticFunction) should return a |
| - // jsAst.Expression. |
| - if (!buffer.isEmpty) { |
| - buffer.write(',$n$n'); |
| - } |
| - buffer.write('$name:$_'); |
| - buffer.write(jsAst.prettyPrint(functionExpression, compiler)); |
| - } |
| - |
| void emitStaticFunctions(CodeBuffer eagerBuffer) { |
| bool isStaticFunction(Element element) => |
| !element.isInstanceMember() && !element.isField(); |
| @@ -2062,27 +2001,11 @@ class CodeEmitterTask extends CompilerTask { |
| .toSet(); |
| for (Element element in Elements.sortedByPosition(elements)) { |
| - CodeBuffer buffer = bufferForElement(element, eagerBuffer); |
| - jsAst.Expression code = backend.generatedCode[element]; |
| - String name = namer.getNameOfGlobalFunction(element); |
| - code = extendWithMetadata(element, code); |
| - emitStaticFunction(buffer, name, code); |
| - String reflectionName = getReflectionName(element, name); |
| - if (reflectionName != null) { |
| - var reflectable = backend.isAccessibleByReflection(element) ? 1 : 0; |
| - buffer.write(',$n$n"+$reflectionName":${_}$reflectable'); |
| - jsAst.Node defaultValues = reifyDefaultArguments(element); |
| - if (defaultValues != null) { |
| - String unmangledName = element.name.slowToString(); |
| - buffer.write(',$n$n"*$unmangledName":${_}'); |
| - buffer.write(jsAst.prettyPrint(defaultValues, compiler)); |
| - } |
| - } |
| - jsAst.Expression bailoutCode = backend.generatedBailoutCode[element]; |
| - if (bailoutCode != null) { |
| - pendingElementsWithBailouts.remove(element); |
| - emitStaticFunction(buffer, namer.getBailoutName(element), bailoutCode); |
| - } |
| + pendingElementsWithBailouts.remove(element); |
| + ClassBuilder builder = new ClassBuilder(); |
| + containerBuilder.addMember(element, builder); |
| + builder.writeOn( |
| + bufferForElement(element, eagerBuffer), compiler, ',$n$n'); |
|
kasperl
2013/10/03 07:08:37
Nit: I'd compute the buffer and throw it in a loca
ahe
2013/10/03 07:20:17
I find code more readable when I can easily see th
|
| } |
| if (!pendingElementsWithBailouts.isEmpty) { |
| @@ -2091,9 +2014,10 @@ class CodeEmitterTask extends CompilerTask { |
| // Is it possible the primary function was inlined but the bailout was not? |
| for (Element element in |
| Elements.sortedByPosition(pendingElementsWithBailouts)) { |
| - CodeBuffer buffer = bufferForElement(element, eagerBuffer); |
| jsAst.Expression bailoutCode = backend.generatedBailoutCode[element]; |
| - emitStaticFunction(buffer, namer.getBailoutName(element), bailoutCode); |
| + new ClassBuilder() |
| + ..addProperty(namer.getBailoutName(element), bailoutCode) |
| + ..writeOn(bufferForElement(element, eagerBuffer), compiler, ',$n$n'); |
| } |
| } |
| @@ -3066,33 +2990,6 @@ class CodeEmitterTask extends CompilerTask { |
| }); |
| } |
| - jsAst.Fun extendWithMetadata(FunctionElement element, jsAst.Fun code) { |
| - if (!backend.retainMetadataOf(element)) return code; |
| - return compiler.withCurrentElement(element, () { |
| - List<int> metadata = <int>[]; |
| - FunctionSignature signature = element.functionSignature; |
| - if (element.isConstructor()) { |
| - metadata.add(reifyType(element.getEnclosingClass().thisType)); |
| - } else { |
| - metadata.add(reifyType(signature.returnType)); |
| - } |
| - signature.forEachParameter((Element parameter) { |
| - metadata |
| - ..add(reifyName(parameter.name)) |
| - ..add(reifyType(parameter.computeType(compiler))); |
| - }); |
| - Link link = element.metadata; |
| - // TODO(ahe): Why is metadata sometimes null? |
| - if (link != null) { |
| - for (; !link.isEmpty; link = link.tail) { |
| - metadata.add(reifyMetadata(link.head)); |
| - } |
| - } |
| - code.body.statements.add(js.string(metadata.join(',')).toStatement()); |
| - return code; |
| - }); |
| - } |
| - |
| void emitMetadata(CodeBuffer buffer) { |
| var literals = backend.typedefTypeLiterals.toList(); |
| Elements.sortedByPosition(literals); |