Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart |
| index cd8f703106ae89a78f856cefe57a7ccff4382b42..121195bf5bfcec803fff7ad9c0a5a70c9b9190f7 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart |
| @@ -70,23 +70,37 @@ class ClassEmitter extends CodeEmitterHelper { |
| }); |
| } |
| String constructorName = namer.getNameOfClass(classElement); |
| + |
| task.precompiledFunction.add(new jsAst.FunctionDeclaration( |
| new jsAst.VariableDeclaration(constructorName), |
| - js.fun(fields, fields.map( |
| - (name) => js('this.$name = $name')).toList()))); |
| + js('function(#) { #; }', |
|
floitsch
2014/04/22 16:11:18
not correctly indented.
sra1
2014/04/23 02:33:50
Done.
|
| + [fields, fields.map((name) => js('this.# = #', [name, name]))]))); |
|
floitsch
2014/04/22 16:11:18
split arguments and body in separate lines.
sra1
2014/04/23 02:33:50
Done.
|
| + // TODO(sra): Implement placeholders in VariableDeclaration position: |
|
floitsch
2014/04/22 16:11:18
Move TODO before the 'new'.
sra1
2014/04/23 02:33:50
Done.
|
| + // task.precompiledFunction.add(js.statement('function #(#) { #; }', |
| + // [ constructorName, fields, |
| + // fields.map( |
| + // (name) => js('this.# = #', [name, name]))])); |
| if (runtimeName == null) { |
| runtimeName = constructorName; |
| } |
| - task.precompiledFunction.addAll([ |
| - js('$constructorName.builtin\$cls = "$runtimeName"'), |
| - js.if_('!"name" in $constructorName', |
| - js('$constructorName.name = "$constructorName"')), |
| - js('\$desc=\$collectedClasses.$constructorName'), |
| - js.if_('\$desc instanceof Array', js('\$desc = \$desc[1]')), |
| - js('$constructorName.prototype = \$desc'), |
| - ]); |
| - |
| - task.precompiledConstructorNames.add(js(constructorName)); |
| + |
| + task.precompiledFunction.add( |
| + js.statement('''{ |
|
floitsch
2014/04/22 16:11:18
make raw string?
sra1
2014/04/23 02:33:50
Done.
|
| + #.builtin\$cls = #; |
| + if (!"name" in #) |
| + #.name = #; |
| + \$desc=\$collectedClasses.#; |
| + if (\$desc instanceof Array) \$desc = \$desc[1]; |
| + #.prototype = \$desc; |
| + }''', |
| + [ constructorName, js.string(runtimeName), |
| + constructorName, |
| + constructorName, js.string(constructorName), |
| + constructorName, |
| + constructorName |
| + ])); |
| + |
| + task.precompiledConstructorNames.add(js('#', constructorName)); |
| } |
| /// Returns `true` if fields added. |
| @@ -302,7 +316,7 @@ class ClassEmitter extends CodeEmitterHelper { |
| if (backend.isNeededForReflection(classElement)) { |
| Link typeVars = classElement.typeVariables; |
| Iterable typeVariableProperties = task.typeVariableHandler |
| - .typeVariablesOf(classElement).map(js.toExpression); |
| + .typeVariablesOf(classElement).map(js.number); |
| ClassElement superclass = classElement.superclass; |
| bool hasSuper = superclass != null; |
| @@ -520,11 +534,12 @@ class ClassEmitter extends CodeEmitterHelper { |
| String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this'; |
| List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : []; |
| task.precompiledFunction.add( |
| - js('$className.prototype.$getterName = #', |
| - js.fun(args, js.return_(js('$receiver.$fieldName'))))); |
| + js('#.prototype.# = function(#) { return #.# }', |
| + [className, getterName, args, receiver, fieldName])); |
| if (backend.isNeededForReflection(member)) { |
| task.precompiledFunction.add( |
| - js('$className.prototype.$getterName.${namer.reflectableField} = 1')); |
| + js('#.prototype.#.${namer.reflectableField} = 1', |
| + [className, getterName])); |
| } |
| } |
| @@ -534,14 +549,15 @@ class ClassEmitter extends CodeEmitterHelper { |
| ClassElement cls = member.getEnclosingClass(); |
| String className = namer.getNameOfClass(cls); |
| String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this'; |
| - List<String> args = |
| - backend.isInterceptedMethod(member) ? ['receiver', 'v'] : ['v']; |
| + List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : []; |
| task.precompiledFunction.add( |
| - js('$className.prototype.$setterName = #', |
| - js.fun(args, js.return_(js('$receiver.$fieldName = v'))))); |
| + // TODO: remove 'return'? |
| + js('#.prototype.# = function(#, v) { return #.# = v; }', |
| + [className, setterName, args, receiver, fieldName])); |
| if (backend.isNeededForReflection(member)) { |
| task.precompiledFunction.add( |
| - js('$className.prototype.$setterName.${namer.reflectableField} = 1')); |
| + js('#.prototype.#.${namer.reflectableField} = 1', |
| + [className, setterName])); |
| } |
| } |
| @@ -578,7 +594,7 @@ class ClassEmitter extends CodeEmitterHelper { |
| TypeVariableElement element) { |
| String name = namer.readTypeVariableName(element); |
| jsAst.Expression index = |
| - js.toExpression(RuntimeTypes.getTypeVariableIndex(element)); |
| + js.number(RuntimeTypes.getTypeVariableIndex(element)); |
| jsAst.Expression computeTypeVariable; |
| Substitution substitution = |
| @@ -586,9 +602,9 @@ class ClassEmitter extends CodeEmitterHelper { |
| cls, element.enclosingElement, alwaysGenerateFunction: true); |
| if (substitution != null) { |
| jsAst.Expression typeArguments = |
| - substitution.getCode(backend.rti, true)['apply']( |
| - ['null', r'this.$builtinTypeInfo']); |
| - computeTypeVariable = typeArguments[index]; |
| + js(r'#.apply(null, this.$builtinTypeInfo)', |
| + substitution.getCode(backend.rti, true)); |
| + computeTypeVariable = js('#[#]', [typeArguments, index]); |
| } else { |
| // TODO(ahe): These can be generated dynamically. |
| computeTypeVariable = |
| @@ -596,8 +612,8 @@ class ClassEmitter extends CodeEmitterHelper { |
| } |
| jsAst.Expression convertRtiToRuntimeType = |
| namer.elementAccess(compiler.findHelper('convertRtiToRuntimeType')); |
| - builder.addProperty( |
| - name, js.fun( |
| - [], [js.return_(convertRtiToRuntimeType(computeTypeVariable))])); |
| + builder.addProperty(name, |
| + js('function () { return #(#) }', |
| + [convertRtiToRuntimeType, computeTypeVariable])); |
| } |
| } |