| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of js_backend; | 5 part of js_backend; |
| 6 | 6 |
| 7 class ConstantEmitter { | 7 class ConstantEmitter { |
| 8 ConstantReferenceEmitter _referenceEmitter; | 8 ConstantReferenceEmitter _referenceEmitter; |
| 9 ConstantLiteralEmitter _literalEmitter; | 9 ConstantLiteralEmitter _literalEmitter; |
| 10 | 10 |
| 11 ConstantEmitter(Compiler compiler, Namer namer) { | 11 ConstantEmitter(Compiler compiler, Namer namer) { |
| 12 _literalEmitter = new ConstantLiteralEmitter(compiler, namer, this); | 12 _literalEmitter = new ConstantLiteralEmitter(compiler, namer, this); |
| 13 _referenceEmitter = new ConstantReferenceEmitter(compiler, namer, this); | 13 _referenceEmitter = new ConstantReferenceEmitter(compiler, namer, this); |
| 14 } | 14 } |
| 15 | 15 |
| 16 /** | 16 /** |
| 17 * Constructs an expression that is a reference to the constant. Uses a | 17 * Constructs an expression that is a reference to the constant. Uses a |
| 18 * canonical name unless the constant can be emitted multiple times (as for | 18 * canonical name unless the constant can be emitted multiple times (as for |
| 19 * numbers and strings). | 19 * numbers and strings). |
| 20 */ | 20 */ |
| 21 jsAst.Expression reference(Constant constant) { | 21 jsAst.Expression reference(ConstantValue constant) { |
| 22 return _referenceEmitter.generate(constant); | 22 return _referenceEmitter.generate(constant); |
| 23 } | 23 } |
| 24 | 24 |
| 25 /** | 25 /** |
| 26 * Constructs a literal expression that evaluates to the constant. Uses a | 26 * Constructs a literal expression that evaluates to the constant. Uses a |
| 27 * canonical name unless the constant can be emitted multiple times (as for | 27 * canonical name unless the constant can be emitted multiple times (as for |
| 28 * numbers and strings). | 28 * numbers and strings). |
| 29 */ | 29 */ |
| 30 jsAst.Expression literal(Constant constant) { | 30 jsAst.Expression literal(ConstantValue constant) { |
| 31 return _literalEmitter.generate(constant); | 31 return _literalEmitter.generate(constant); |
| 32 } | 32 } |
| 33 | 33 |
| 34 /** | 34 /** |
| 35 * Constructs an expression like [reference], but the expression is valid | 35 * Constructs an expression like [reference], but the expression is valid |
| 36 * during isolate initialization. | 36 * during isolate initialization. |
| 37 */ | 37 */ |
| 38 jsAst.Expression referenceInInitializationContext(Constant constant) { | 38 jsAst.Expression referenceInInitializationContext(ConstantValue constant) { |
| 39 return _referenceEmitter.generate(constant); | 39 return _referenceEmitter.generate(constant); |
| 40 } | 40 } |
| 41 | 41 |
| 42 /** | 42 /** |
| 43 * Constructs an expression used to initialize a canonicalized constant. | 43 * Constructs an expression used to initialize a canonicalized constant. |
| 44 */ | 44 */ |
| 45 jsAst.Expression initializationExpression(Constant constant) { | 45 jsAst.Expression initializationExpression(ConstantValue constant) { |
| 46 return _literalEmitter.generate(constant); | 46 return _literalEmitter.generate(constant); |
| 47 } | 47 } |
| 48 } | 48 } |
| 49 | 49 |
| 50 /** | 50 /** |
| 51 * Visitor for generating JavaScript expressions to refer to [Constant]s. | 51 * Visitor for generating JavaScript expressions to refer to [ConstantValue]s. |
| 52 * Do not use directly, use methods from [ConstantEmitter]. | 52 * Do not use directly, use methods from [ConstantEmitter]. |
| 53 */ | 53 */ |
| 54 class ConstantReferenceEmitter implements ConstantVisitor<jsAst.Expression> { | 54 class ConstantReferenceEmitter |
| 55 implements ConstantValueVisitor<jsAst.Expression> { |
| 55 final Compiler compiler; | 56 final Compiler compiler; |
| 56 final Namer namer; | 57 final Namer namer; |
| 57 | 58 |
| 58 final ConstantEmitter constantEmitter; | 59 final ConstantEmitter constantEmitter; |
| 59 | 60 |
| 60 ConstantReferenceEmitter(this.compiler, this.namer, this.constantEmitter); | 61 ConstantReferenceEmitter(this.compiler, this.namer, this.constantEmitter); |
| 61 | 62 |
| 62 jsAst.Expression generate(Constant constant) { | 63 jsAst.Expression generate(ConstantValue constant) { |
| 63 return _visit(constant); | 64 return _visit(constant); |
| 64 } | 65 } |
| 65 | 66 |
| 66 jsAst.Expression _visit(Constant constant) { | 67 jsAst.Expression _visit(ConstantValue constant) { |
| 67 return constant.accept(this); | 68 return constant.accept(this); |
| 68 } | 69 } |
| 69 | 70 |
| 70 jsAst.Expression emitCanonicalVersion(Constant constant) { | 71 jsAst.Expression emitCanonicalVersion(ConstantValue constant) { |
| 71 String name = namer.constantName(constant); | 72 String name = namer.constantName(constant); |
| 72 return new jsAst.PropertyAccess.field( | 73 return new jsAst.PropertyAccess.field( |
| 73 new jsAst.VariableUse(namer.globalObjectForConstant(constant)), name); | 74 new jsAst.VariableUse(namer.globalObjectForConstant(constant)), name); |
| 74 } | 75 } |
| 75 | 76 |
| 76 jsAst.Expression literal(Constant constant) { | 77 jsAst.Expression literal(ConstantValue constant) { |
| 77 return constantEmitter.literal(constant); | 78 return constantEmitter.literal(constant); |
| 78 } | 79 } |
| 79 | 80 |
| 80 jsAst.Expression visitFunction(FunctionConstant constant) { | 81 jsAst.Expression visitFunction(FunctionConstantValue constant) { |
| 81 return namer.isolateStaticClosureAccess(constant.element); | 82 return namer.isolateStaticClosureAccess(constant.element); |
| 82 } | 83 } |
| 83 | 84 |
| 84 jsAst.Expression visitNull(NullConstant constant) { | 85 jsAst.Expression visitNull(NullConstantValue constant) { |
| 85 return literal(constant); | 86 return literal(constant); |
| 86 } | 87 } |
| 87 | 88 |
| 88 jsAst.Expression visitInt(IntConstant constant) { | 89 jsAst.Expression visitInt(IntConstantValue constant) { |
| 89 return literal(constant); | 90 return literal(constant); |
| 90 } | 91 } |
| 91 | 92 |
| 92 jsAst.Expression visitDouble(DoubleConstant constant) { | 93 jsAst.Expression visitDouble(DoubleConstantValue constant) { |
| 93 return literal(constant); | 94 return literal(constant); |
| 94 } | 95 } |
| 95 | 96 |
| 96 jsAst.Expression visitTrue(TrueConstant constant) { | 97 jsAst.Expression visitTrue(TrueConstantValue constant) { |
| 97 return literal(constant); | 98 return literal(constant); |
| 98 } | 99 } |
| 99 | 100 |
| 100 jsAst.Expression visitFalse(FalseConstant constant) { | 101 jsAst.Expression visitFalse(FalseConstantValue constant) { |
| 101 return literal(constant); | 102 return literal(constant); |
| 102 } | 103 } |
| 103 | 104 |
| 104 /** | 105 /** |
| 105 * Write the contents of the quoted string to a [CodeBuffer] in | 106 * Write the contents of the quoted string to a [CodeBuffer] in |
| 106 * a form that is valid as JavaScript string literal content. | 107 * a form that is valid as JavaScript string literal content. |
| 107 * The string is assumed quoted by double quote characters. | 108 * The string is assumed quoted by double quote characters. |
| 108 */ | 109 */ |
| 109 jsAst.Expression visitString(StringConstant constant) { | 110 jsAst.Expression visitString(StringConstantValue constant) { |
| 110 // TODO(sra): If the string is long *and repeated* (and not on a hot path) | 111 // TODO(sra): If the string is long *and repeated* (and not on a hot path) |
| 111 // then it should be assigned to a name. We don't have reference counts (or | 112 // then it should be assigned to a name. We don't have reference counts (or |
| 112 // profile information) here, so this is the wrong place. | 113 // profile information) here, so this is the wrong place. |
| 113 return literal(constant); | 114 return literal(constant); |
| 114 } | 115 } |
| 115 | 116 |
| 116 jsAst.Expression visitList(ListConstant constant) { | 117 jsAst.Expression visitList(ListConstantValue constant) { |
| 117 return emitCanonicalVersion(constant); | 118 return emitCanonicalVersion(constant); |
| 118 } | 119 } |
| 119 | 120 |
| 120 jsAst.Expression visitMap(MapConstant constant) { | 121 jsAst.Expression visitMap(MapConstantValue constant) { |
| 121 return emitCanonicalVersion(constant); | 122 return emitCanonicalVersion(constant); |
| 122 } | 123 } |
| 123 | 124 |
| 124 jsAst.Expression visitType(TypeConstant constant) { | 125 jsAst.Expression visitType(TypeConstantValue constant) { |
| 125 return emitCanonicalVersion(constant); | 126 return emitCanonicalVersion(constant); |
| 126 } | 127 } |
| 127 | 128 |
| 128 jsAst.Expression visitConstructed(ConstructedConstant constant) { | 129 jsAst.Expression visitConstructed(ConstructedConstantValue constant) { |
| 129 return emitCanonicalVersion(constant); | 130 return emitCanonicalVersion(constant); |
| 130 } | 131 } |
| 131 | 132 |
| 132 jsAst.Expression visitInterceptor(InterceptorConstant constant) { | 133 jsAst.Expression visitInterceptor(InterceptorConstantValue constant) { |
| 133 return emitCanonicalVersion(constant); | 134 return emitCanonicalVersion(constant); |
| 134 } | 135 } |
| 135 | 136 |
| 136 jsAst.Expression visitDummy(DummyConstant constant) { | 137 jsAst.Expression visitDummy(DummyConstantValue constant) { |
| 137 return literal(constant); | 138 return literal(constant); |
| 138 } | 139 } |
| 139 | 140 |
| 140 jsAst.Expression visitDeferred(DeferredConstant constant) { | 141 jsAst.Expression visitDeferred(DeferredConstantValue constant) { |
| 141 return emitCanonicalVersion(constant); | 142 return emitCanonicalVersion(constant); |
| 142 } | 143 } |
| 143 } | 144 } |
| 144 | 145 |
| 145 /** | 146 /** |
| 146 * Visitor for generating JavaScript expressions that litterally represent | 147 * Visitor for generating JavaScript expressions that litterally represent |
| 147 * [Constant]s. These can be used for inlining constants or in initializers. | 148 * [ConstantValue]s. These can be used for inlining constants or in |
| 148 * Do not use directly, use methods from [ConstantEmitter]. | 149 * initializers. Do not use directly, use methods from [ConstantEmitter]. |
| 149 */ | 150 */ |
| 150 class ConstantLiteralEmitter implements ConstantVisitor<jsAst.Expression> { | 151 class ConstantLiteralEmitter implements ConstantValueVisitor<jsAst.Expression> { |
| 151 | 152 |
| 152 // Matches blank lines, comment lines and trailing comments that can't be part | 153 // Matches blank lines, comment lines and trailing comments that can't be part |
| 153 // of a string. | 154 // of a string. |
| 154 static final RegExp COMMENT_RE = | 155 static final RegExp COMMENT_RE = |
| 155 new RegExp(r'''^ *(//.*)?\n| *//[^''"\n]*$''' , multiLine: true); | 156 new RegExp(r'''^ *(//.*)?\n| *//[^''"\n]*$''' , multiLine: true); |
| 156 | 157 |
| 157 final Compiler compiler; | 158 final Compiler compiler; |
| 158 final Namer namer; | 159 final Namer namer; |
| 159 final ConstantEmitter constantEmitter; | 160 final ConstantEmitter constantEmitter; |
| 160 | 161 |
| 161 ConstantLiteralEmitter(this.compiler, this.namer, this.constantEmitter); | 162 ConstantLiteralEmitter(this.compiler, this.namer, this.constantEmitter); |
| 162 | 163 |
| 163 jsAst.Expression generate(Constant constant) { | 164 jsAst.Expression generate(ConstantValue constant) { |
| 164 return _visit(constant); | 165 return _visit(constant); |
| 165 } | 166 } |
| 166 | 167 |
| 167 jsAst.Expression _visit(Constant constant) { | 168 jsAst.Expression _visit(ConstantValue constant) { |
| 168 return constant.accept(this); | 169 return constant.accept(this); |
| 169 } | 170 } |
| 170 | 171 |
| 171 jsAst.Expression visitFunction(FunctionConstant constant) { | 172 jsAst.Expression visitFunction(FunctionConstantValue constant) { |
| 172 compiler.internalError(NO_LOCATION_SPANNABLE, | 173 compiler.internalError(NO_LOCATION_SPANNABLE, |
| 173 "The function constant does not need specific JS code."); | 174 "The function constant does not need specific JS code."); |
| 174 return null; | 175 return null; |
| 175 } | 176 } |
| 176 | 177 |
| 177 jsAst.Expression visitNull(NullConstant constant) { | 178 jsAst.Expression visitNull(NullConstantValue constant) { |
| 178 return new jsAst.LiteralNull(); | 179 return new jsAst.LiteralNull(); |
| 179 } | 180 } |
| 180 | 181 |
| 181 jsAst.Expression visitInt(IntConstant constant) { | 182 jsAst.Expression visitInt(IntConstantValue constant) { |
| 182 return new jsAst.LiteralNumber('${constant.value}'); | 183 return new jsAst.LiteralNumber('${constant.primitiveValue}'); |
| 183 } | 184 } |
| 184 | 185 |
| 185 jsAst.Expression visitDouble(DoubleConstant constant) { | 186 jsAst.Expression visitDouble(DoubleConstantValue constant) { |
| 186 double value = constant.value; | 187 double value = constant.primitiveValue; |
| 187 if (value.isNaN) { | 188 if (value.isNaN) { |
| 188 return js("0/0"); | 189 return js("0/0"); |
| 189 } else if (value == double.INFINITY) { | 190 } else if (value == double.INFINITY) { |
| 190 return js("1/0"); | 191 return js("1/0"); |
| 191 } else if (value == -double.INFINITY) { | 192 } else if (value == -double.INFINITY) { |
| 192 return js("-1/0"); | 193 return js("-1/0"); |
| 193 } else { | 194 } else { |
| 194 return new jsAst.LiteralNumber("$value"); | 195 return new jsAst.LiteralNumber("$value"); |
| 195 } | 196 } |
| 196 } | 197 } |
| 197 | 198 |
| 198 jsAst.Expression visitTrue(TrueConstant constant) { | 199 jsAst.Expression visitTrue(TrueConstantValue constant) { |
| 199 if (compiler.enableMinification) { | 200 if (compiler.enableMinification) { |
| 200 // Use !0 for true. | 201 // Use !0 for true. |
| 201 return js("!0"); | 202 return js("!0"); |
| 202 } else { | 203 } else { |
| 203 return js('true'); | 204 return js('true'); |
| 204 } | 205 } |
| 205 } | 206 } |
| 206 | 207 |
| 207 jsAst.Expression visitFalse(FalseConstant constant) { | 208 jsAst.Expression visitFalse(FalseConstantValue constant) { |
| 208 if (compiler.enableMinification) { | 209 if (compiler.enableMinification) { |
| 209 // Use !1 for false. | 210 // Use !1 for false. |
| 210 return js("!1"); | 211 return js("!1"); |
| 211 } else { | 212 } else { |
| 212 return js('false'); | 213 return js('false'); |
| 213 } | 214 } |
| 214 } | 215 } |
| 215 | 216 |
| 216 /** | 217 /** |
| 217 * Write the contents of the quoted string to a [CodeBuffer] in | 218 * Write the contents of the quoted string to a [CodeBuffer] in |
| 218 * a form that is valid as JavaScript string literal content. | 219 * a form that is valid as JavaScript string literal content. |
| 219 * The string is assumed quoted by double quote characters. | 220 * The string is assumed quoted by double quote characters. |
| 220 */ | 221 */ |
| 221 jsAst.Expression visitString(StringConstant constant) { | 222 jsAst.Expression visitString(StringConstantValue constant) { |
| 222 StringBuffer sb = new StringBuffer(); | 223 StringBuffer sb = new StringBuffer(); |
| 223 writeJsonEscapedCharsOn(constant.value.slowToString(), sb); | 224 writeJsonEscapedCharsOn(constant.primitiveValue.slowToString(), sb); |
| 224 return new jsAst.LiteralString('"$sb"'); | 225 return new jsAst.LiteralString('"$sb"'); |
| 225 } | 226 } |
| 226 | 227 |
| 227 jsAst.Expression visitList(ListConstant constant) { | 228 jsAst.Expression visitList(ListConstantValue constant) { |
| 228 jsAst.Expression value = new jsAst.Call( | 229 jsAst.Expression value = new jsAst.Call( |
| 229 new jsAst.PropertyAccess.field( | 230 new jsAst.PropertyAccess.field( |
| 230 new jsAst.VariableUse(namer.isolateName), | 231 new jsAst.VariableUse(namer.isolateName), |
| 231 namer.getMappedInstanceName('makeConstantList')), | 232 namer.getMappedInstanceName('makeConstantList')), |
| 232 [new jsAst.ArrayInitializer.from(_array(constant.entries))]); | 233 [new jsAst.ArrayInitializer.from(_array(constant.entries))]); |
| 233 return maybeAddTypeArguments(constant.type, value); | 234 return maybeAddTypeArguments(constant.type, value); |
| 234 } | 235 } |
| 235 | 236 |
| 236 jsAst.Expression getJsConstructor(ClassElement element) { | 237 jsAst.Expression getJsConstructor(ClassElement element) { |
| 237 return namer.elementAccess(element); | 238 return namer.elementAccess(element); |
| 238 } | 239 } |
| 239 | 240 |
| 240 jsAst.Expression visitMap(JavaScriptMapConstant constant) { | 241 jsAst.Expression visitMap(JavaScriptMapConstant constant) { |
| 241 jsAst.Expression jsMap() { | 242 jsAst.Expression jsMap() { |
| 242 List<jsAst.Property> properties = <jsAst.Property>[]; | 243 List<jsAst.Property> properties = <jsAst.Property>[]; |
| 243 for (int i = 0; i < constant.length; i++) { | 244 for (int i = 0; i < constant.length; i++) { |
| 244 StringConstant key = constant.keys[i]; | 245 StringConstantValue key = constant.keys[i]; |
| 245 if (key.value == JavaScriptMapConstant.PROTO_PROPERTY) continue; | 246 if (key.primitiveValue == JavaScriptMapConstant.PROTO_PROPERTY) { |
| 247 continue; |
| 248 } |
| 246 | 249 |
| 247 // Keys in literal maps must be emitted in place. | 250 // Keys in literal maps must be emitted in place. |
| 248 jsAst.Literal keyExpression = _visit(key); | 251 jsAst.Literal keyExpression = _visit(key); |
| 249 jsAst.Expression valueExpression = | 252 jsAst.Expression valueExpression = |
| 250 constantEmitter.reference(constant.values[i]); | 253 constantEmitter.reference(constant.values[i]); |
| 251 properties.add(new jsAst.Property(keyExpression, valueExpression)); | 254 properties.add(new jsAst.Property(keyExpression, valueExpression)); |
| 252 } | 255 } |
| 253 return new jsAst.ObjectInitializer(properties); | 256 return new jsAst.ObjectInitializer(properties); |
| 254 } | 257 } |
| 255 | 258 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 new jsAst.New(getJsConstructor(classElement), arguments); | 313 new jsAst.New(getJsConstructor(classElement), arguments); |
| 311 return maybeAddTypeArguments(constant.type, value); | 314 return maybeAddTypeArguments(constant.type, value); |
| 312 } | 315 } |
| 313 | 316 |
| 314 JavaScriptBackend get backend => compiler.backend; | 317 JavaScriptBackend get backend => compiler.backend; |
| 315 | 318 |
| 316 jsAst.PropertyAccess getHelperProperty(Element helper) { | 319 jsAst.PropertyAccess getHelperProperty(Element helper) { |
| 317 return backend.namer.elementAccess(helper); | 320 return backend.namer.elementAccess(helper); |
| 318 } | 321 } |
| 319 | 322 |
| 320 jsAst.Expression visitType(TypeConstant constant) { | 323 jsAst.Expression visitType(TypeConstantValue constant) { |
| 321 DartType type = constant.representedType; | 324 DartType type = constant.representedType; |
| 322 String name = namer.getRuntimeTypeName(type.element); | 325 String name = namer.getRuntimeTypeName(type.element); |
| 323 jsAst.Expression typeName = new jsAst.LiteralString("'$name'"); | 326 jsAst.Expression typeName = new jsAst.LiteralString("'$name'"); |
| 324 return new jsAst.Call(getHelperProperty(backend.getCreateRuntimeType()), | 327 return new jsAst.Call(getHelperProperty(backend.getCreateRuntimeType()), |
| 325 [typeName]); | 328 [typeName]); |
| 326 } | 329 } |
| 327 | 330 |
| 328 jsAst.Expression visitInterceptor(InterceptorConstant constant) { | 331 jsAst.Expression visitInterceptor(InterceptorConstantValue constant) { |
| 329 return new jsAst.PropertyAccess.field( | 332 return new jsAst.PropertyAccess.field( |
| 330 getJsConstructor(constant.dispatchedType.element), | 333 getJsConstructor(constant.dispatchedType.element), |
| 331 'prototype'); | 334 'prototype'); |
| 332 } | 335 } |
| 333 | 336 |
| 334 jsAst.Expression visitDummy(DummyConstant constant) { | 337 jsAst.Expression visitDummy(DummyConstantValue constant) { |
| 335 return new jsAst.LiteralNumber('0'); | 338 return new jsAst.LiteralNumber('0'); |
| 336 } | 339 } |
| 337 | 340 |
| 338 jsAst.Expression visitConstructed(ConstructedConstant constant) { | 341 jsAst.Expression visitConstructed(ConstructedConstantValue constant) { |
| 339 Element element = constant.type.element; | 342 Element element = constant.type.element; |
| 340 if (element.isForeign(backend) | 343 if (element.isForeign(backend) |
| 341 && element.name == 'JS_CONST') { | 344 && element.name == 'JS_CONST') { |
| 342 StringConstant str = constant.fields[0]; | 345 StringConstantValue str = constant.fields[0]; |
| 343 String value = str.value.slowToString(); | 346 String value = str.primitiveValue.slowToString(); |
| 344 return new jsAst.LiteralExpression(stripComments(value)); | 347 return new jsAst.LiteralExpression(stripComments(value)); |
| 345 } | 348 } |
| 346 jsAst.New instantiation = new jsAst.New( | 349 jsAst.New instantiation = new jsAst.New( |
| 347 getJsConstructor(constant.type.element), | 350 getJsConstructor(constant.type.element), |
| 348 _array(constant.fields)); | 351 _array(constant.fields)); |
| 349 return maybeAddTypeArguments(constant.type, instantiation); | 352 return maybeAddTypeArguments(constant.type, instantiation); |
| 350 } | 353 } |
| 351 | 354 |
| 352 String stripComments(String rawJavaScript) { | 355 String stripComments(String rawJavaScript) { |
| 353 return rawJavaScript.replaceAll(COMMENT_RE, ''); | 356 return rawJavaScript.replaceAll(COMMENT_RE, ''); |
| 354 } | 357 } |
| 355 | 358 |
| 356 List<jsAst.Expression> _array(List<Constant> values) { | 359 List<jsAst.Expression> _array(List<ConstantValue> values) { |
| 357 List<jsAst.Expression> valueList = <jsAst.Expression>[]; | 360 List<jsAst.Expression> valueList = <jsAst.Expression>[]; |
| 358 for (int i = 0; i < values.length; i++) { | 361 for (int i = 0; i < values.length; i++) { |
| 359 valueList.add(constantEmitter.reference(values[i])); | 362 valueList.add(constantEmitter.reference(values[i])); |
| 360 } | 363 } |
| 361 return valueList; | 364 return valueList; |
| 362 } | 365 } |
| 363 | 366 |
| 364 jsAst.Expression maybeAddTypeArguments(InterfaceType type, | 367 jsAst.Expression maybeAddTypeArguments(InterfaceType type, |
| 365 jsAst.Expression value) { | 368 jsAst.Expression value) { |
| 366 if (type is InterfaceType && | 369 if (type is InterfaceType && |
| 367 !type.treatAsRaw && | 370 !type.treatAsRaw && |
| 368 backend.classNeedsRti(type.element)) { | 371 backend.classNeedsRti(type.element)) { |
| 369 InterfaceType interface = type; | 372 InterfaceType interface = type; |
| 370 RuntimeTypes rti = backend.rti; | 373 RuntimeTypes rti = backend.rti; |
| 371 Iterable<String> arguments = interface.typeArguments | 374 Iterable<String> arguments = interface.typeArguments |
| 372 .map((DartType type) => | 375 .map((DartType type) => |
| 373 rti.getTypeRepresentationWithHashes(type, (_){})); | 376 rti.getTypeRepresentationWithHashes(type, (_){})); |
| 374 jsAst.Expression argumentList = | 377 jsAst.Expression argumentList = |
| 375 new jsAst.LiteralString('[${arguments.join(', ')}]'); | 378 new jsAst.LiteralString('[${arguments.join(', ')}]'); |
| 376 return new jsAst.Call(getHelperProperty(backend.getSetRuntimeTypeInfo()), | 379 return new jsAst.Call(getHelperProperty(backend.getSetRuntimeTypeInfo()), |
| 377 [value, argumentList]); | 380 [value, argumentList]); |
| 378 } | 381 } |
| 379 return value; | 382 return value; |
| 380 } | 383 } |
| 381 | 384 |
| 382 jsAst.Expression visitDeferred(DeferredConstant constant) { | 385 jsAst.Expression visitDeferred(DeferredConstantValue constant) { |
| 383 return constantEmitter.reference(constant.referenced); | 386 return constantEmitter.reference(constant.referenced); |
| 384 } | 387 } |
| 385 } | 388 } |
| OLD | NEW |