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 ssa; | 5 part of ssa; |
6 | 6 |
7 /// A synthetic local variable only used with the SSA graph. | 7 /// A synthetic local variable only used with the SSA graph. |
8 /// | 8 /// |
9 /// For instance used for holding return value of function or the exception of a | 9 /// For instance used for holding return value of function or the exception of a |
10 /// try-catch statement. | 10 /// try-catch statement. |
(...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
999 | 999 |
1000 CodegenRegistry get registry => work.registry; | 1000 CodegenRegistry get registry => work.registry; |
1001 | 1001 |
1002 /// Returns the current source element. | 1002 /// Returns the current source element. |
1003 /// | 1003 /// |
1004 /// The returned element is a declaration element. | 1004 /// The returned element is a declaration element. |
1005 // TODO(johnniwinther): Check that all usages of sourceElement agree on | 1005 // TODO(johnniwinther): Check that all usages of sourceElement agree on |
1006 // implementation/declaration distinction. | 1006 // implementation/declaration distinction. |
1007 Element get sourceElement => sourceElementStack.last; | 1007 Element get sourceElement => sourceElementStack.last; |
1008 | 1008 |
| 1009 bool get _checkOrTrustTypes => |
| 1010 compiler.enableTypeAssertions || compiler.trustTypeAnnotations; |
| 1011 |
1009 HBasicBlock addNewBlock() { | 1012 HBasicBlock addNewBlock() { |
1010 HBasicBlock block = graph.addNewBlock(); | 1013 HBasicBlock block = graph.addNewBlock(); |
1011 // If adding a new block during building of an expression, it is due to | 1014 // If adding a new block during building of an expression, it is due to |
1012 // conditional expressions or short-circuit logical operators. | 1015 // conditional expressions or short-circuit logical operators. |
1013 return block; | 1016 return block; |
1014 } | 1017 } |
1015 | 1018 |
1016 void open(HBasicBlock block) { | 1019 void open(HBasicBlock block) { |
1017 block.open(); | 1020 block.open(); |
1018 current = block; | 1021 current = block; |
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1476 HGraph buildCheckedSetter(VariableElement field) { | 1479 HGraph buildCheckedSetter(VariableElement field) { |
1477 openFunction(field, field.node); | 1480 openFunction(field, field.node); |
1478 HInstruction thisInstruction = localsHandler.readThis(); | 1481 HInstruction thisInstruction = localsHandler.readThis(); |
1479 // Use dynamic type because the type computed by the inferrer is | 1482 // Use dynamic type because the type computed by the inferrer is |
1480 // narrowed to the type annotation. | 1483 // narrowed to the type annotation. |
1481 HInstruction parameter = new HParameterValue(field, backend.dynamicType); | 1484 HInstruction parameter = new HParameterValue(field, backend.dynamicType); |
1482 // Add the parameter as the last instruction of the entry block. | 1485 // Add the parameter as the last instruction of the entry block. |
1483 // If the method is intercepted, we want the actual receiver | 1486 // If the method is intercepted, we want the actual receiver |
1484 // to be the first parameter. | 1487 // to be the first parameter. |
1485 graph.entry.addBefore(graph.entry.last, parameter); | 1488 graph.entry.addBefore(graph.entry.last, parameter); |
1486 HInstruction value = | 1489 HInstruction value = potentiallyCheckOrTrustType(parameter, field.type); |
1487 potentiallyCheckType(parameter, field.type); | |
1488 add(new HFieldSet(field, thisInstruction, value)); | 1490 add(new HFieldSet(field, thisInstruction, value)); |
1489 return closeFunction(); | 1491 return closeFunction(); |
1490 } | 1492 } |
1491 | 1493 |
1492 HGraph buildLazyInitializer(VariableElement variable) { | 1494 HGraph buildLazyInitializer(VariableElement variable) { |
1493 ast.Node node = variable.node; | 1495 ast.Node node = variable.node; |
1494 openFunction(variable, node); | 1496 openFunction(variable, node); |
1495 assert(variable.initializer != null); | 1497 assert(variable.initializer != null); |
1496 visit(variable.initializer); | 1498 visit(variable.initializer); |
1497 HInstruction value = pop(); | 1499 HInstruction value = pop(); |
1498 value = potentiallyCheckType(value, variable.type); | 1500 value = potentiallyCheckOrTrustType(value, variable.type); |
1499 closeAndGotoExit(new HReturn(value)); | 1501 closeAndGotoExit(new HReturn(value)); |
1500 return closeFunction(); | 1502 return closeFunction(); |
1501 } | 1503 } |
1502 | 1504 |
1503 /** | 1505 /** |
1504 * Returns the constructor body associated with the given constructor or | 1506 * Returns the constructor body associated with the given constructor or |
1505 * creates a new constructor body, if none can be found. | 1507 * creates a new constructor body, if none can be found. |
1506 * | 1508 * |
1507 * Returns [:null:] if the constructor does not have a body. | 1509 * Returns [:null:] if the constructor does not have a body. |
1508 */ | 1510 */ |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1651 * [visitForIn]. | 1653 * [visitForIn]. |
1652 */ | 1654 */ |
1653 return currentNode.asForIn() != null; | 1655 return currentNode.asForIn() != null; |
1654 } | 1656 } |
1655 | 1657 |
1656 /** | 1658 /** |
1657 * In checked mode, generate type tests for the parameters of the inlined | 1659 * In checked mode, generate type tests for the parameters of the inlined |
1658 * function. | 1660 * function. |
1659 */ | 1661 */ |
1660 void potentiallyCheckInlinedParameterTypes(FunctionElement function) { | 1662 void potentiallyCheckInlinedParameterTypes(FunctionElement function) { |
1661 if (!compiler.enableTypeAssertions) return; | 1663 if (!_checkOrTrustTypes) return; |
1662 | 1664 |
1663 FunctionSignature signature = function.functionSignature; | 1665 FunctionSignature signature = function.functionSignature; |
1664 signature.orderedForEachParameter((ParameterElement parameter) { | 1666 signature.orderedForEachParameter((ParameterElement parameter) { |
1665 HInstruction argument = localsHandler.readLocal(parameter); | 1667 HInstruction argument = localsHandler.readLocal(parameter); |
1666 potentiallyCheckType(argument, parameter.type); | 1668 potentiallyCheckOrTrustType(argument, parameter.type); |
1667 }); | 1669 }); |
1668 } | 1670 } |
1669 | 1671 |
1670 /** | 1672 /** |
1671 * Documentation wanted -- johnniwinther | 1673 * Documentation wanted -- johnniwinther |
1672 * | 1674 * |
1673 * Invariant: [constructors] must contain only implementation elements. | 1675 * Invariant: [constructors] must contain only implementation elements. |
1674 */ | 1676 */ |
1675 void inlineSuperOrRedirect(FunctionElement callee, | 1677 void inlineSuperOrRedirect(FunctionElement callee, |
1676 List<HInstruction> compiledArguments, | 1678 List<HInstruction> compiledArguments, |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1967 classElement.forEachInstanceField( | 1969 classElement.forEachInstanceField( |
1968 (ClassElement enclosingClass, VariableElement member) { | 1970 (ClassElement enclosingClass, VariableElement member) { |
1969 HInstruction value = fieldValues[member]; | 1971 HInstruction value = fieldValues[member]; |
1970 if (value == null) { | 1972 if (value == null) { |
1971 // Uninitialized native fields are pre-initialized by the native | 1973 // Uninitialized native fields are pre-initialized by the native |
1972 // implementation. | 1974 // implementation. |
1973 assert(isNativeUpgradeFactory); | 1975 assert(isNativeUpgradeFactory); |
1974 } else { | 1976 } else { |
1975 fields.add(member); | 1977 fields.add(member); |
1976 DartType type = localsHandler.substInContext(member.type); | 1978 DartType type = localsHandler.substInContext(member.type); |
1977 constructorArguments.add(potentiallyCheckType(value, type)); | 1979 constructorArguments.add(potentiallyCheckOrTrustType(value, type)); |
1978 } | 1980 } |
1979 }, | 1981 }, |
1980 includeSuperAndInjectedMembers: true); | 1982 includeSuperAndInjectedMembers: true); |
1981 | 1983 |
1982 InterfaceType type = classElement.thisType; | 1984 InterfaceType type = classElement.thisType; |
1983 TypeMask ssaType = | 1985 TypeMask ssaType = |
1984 new TypeMask.nonNullExact(classElement.declaration, compiler.world); | 1986 new TypeMask.nonNullExact(classElement.declaration, compiler.world); |
1985 List<DartType> instantiatedTypes; | 1987 List<DartType> instantiatedTypes; |
1986 addInlinedInstantiation(type); | 1988 addInlinedInstantiation(type); |
1987 if (!currentInlinedInstantiations.isEmpty) { | 1989 if (!currentInlinedInstantiations.isEmpty) { |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2212 // class A { | 2214 // class A { |
2213 // A(String foo) = A.b; | 2215 // A(String foo) = A.b; |
2214 // A(int foo) { print(foo); } | 2216 // A(int foo) { print(foo); } |
2215 // } | 2217 // } |
2216 // main() { | 2218 // main() { |
2217 // new A(499); // valid even in checked mode. | 2219 // new A(499); // valid even in checked mode. |
2218 // new A("foo"); // invalid in checked mode. | 2220 // new A("foo"); // invalid in checked mode. |
2219 // | 2221 // |
2220 // Only the final target is allowed to check for the argument types. | 2222 // Only the final target is allowed to check for the argument types. |
2221 newParameter = | 2223 newParameter = |
2222 potentiallyCheckType(newParameter, parameterElement.type); | 2224 potentiallyCheckOrTrustType(newParameter, parameterElement.type); |
2223 } | 2225 } |
2224 localsHandler.directLocals[parameterElement] = newParameter; | 2226 localsHandler.directLocals[parameterElement] = newParameter; |
2225 }); | 2227 }); |
2226 | 2228 |
2227 returnType = signature.type.returnType; | 2229 returnType = signature.type.returnType; |
2228 } else { | 2230 } else { |
2229 // Otherwise it is a lazy initializer which does not have parameters. | 2231 // Otherwise it is a lazy initializer which does not have parameters. |
2230 assert(element is VariableElement); | 2232 assert(element is VariableElement); |
2231 } | 2233 } |
2232 | 2234 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2289 null, | 2291 null, |
2290 new Selector.call(name, backend.jsHelperLibrary, 1), | 2292 new Selector.call(name, backend.jsHelperLibrary, 1), |
2291 arguments); | 2293 arguments); |
2292 | 2294 |
2293 return new HTypeConversion(type, kind, original.instructionType, pop()); | 2295 return new HTypeConversion(type, kind, original.instructionType, pop()); |
2294 } else { | 2296 } else { |
2295 return original.convertType(compiler, type, kind); | 2297 return original.convertType(compiler, type, kind); |
2296 } | 2298 } |
2297 } | 2299 } |
2298 | 2300 |
2299 HInstruction potentiallyBuildTypeHint(HInstruction original, DartType type) { | 2301 HInstruction _trustType(HInstruction original, DartType type) { |
2300 if (!compiler.trustTypeAnnotations || type == null) return original; | 2302 assert(compiler.trustTypeAnnotations); |
| 2303 assert(type != null); |
2301 type = localsHandler.substInContext(type); | 2304 type = localsHandler.substInContext(type); |
| 2305 type = type.unalias(compiler); |
| 2306 if (type.isDynamic) return original; |
2302 if (!type.isInterfaceType) return original; | 2307 if (!type.isInterfaceType) return original; |
2303 TypeMask mask = new TypeMask.subtype(type.element, compiler.world); | 2308 // The type element is either a class or the void element. |
2304 var result = new HTypeKnown.pinned(mask, original); | 2309 Element element = type.element; |
2305 return result; | 2310 if (element == compiler.objectClass) return original; |
| 2311 TypeMask mask = new TypeMask.subtype(element, compiler.world); |
| 2312 return new HTypeKnown.pinned(mask, original); |
2306 } | 2313 } |
2307 | 2314 |
2308 HInstruction potentiallyCheckType(HInstruction original, DartType type, | 2315 HInstruction _checkType(HInstruction original, DartType type, int kind) { |
2309 { int kind: HTypeConversion.CHECKED_MODE_CHECK }) { | 2316 assert(compiler.enableTypeAssertions); |
2310 if (!compiler.enableTypeAssertions) return original; | 2317 assert(type != null); |
2311 type = localsHandler.substInContext(type); | 2318 type = localsHandler.substInContext(type); |
2312 HInstruction other = buildTypeConversion(original, type, kind); | 2319 HInstruction other = buildTypeConversion(original, type, kind); |
2313 if (other != original) add(other); | |
2314 registry.registerIsCheck(type); | 2320 registry.registerIsCheck(type); |
2315 return other; | 2321 return other; |
2316 } | 2322 } |
2317 | 2323 |
| 2324 HInstruction potentiallyCheckOrTrustType(HInstruction original, DartType type, |
| 2325 { int kind: HTypeConversion.CHECKED_MODE_CHECK }) { |
| 2326 if (type == null) return original; |
| 2327 HInstruction checkedOrTrusted = original; |
| 2328 if (compiler.trustTypeAnnotations) { |
| 2329 checkedOrTrusted = _trustType(original, type); |
| 2330 } else if (compiler.enableTypeAssertions) { |
| 2331 checkedOrTrusted = _checkType(original, type, kind); |
| 2332 } |
| 2333 if (checkedOrTrusted == original) return original; |
| 2334 add(checkedOrTrusted); |
| 2335 return checkedOrTrusted; |
| 2336 } |
| 2337 |
2318 void assertIsSubtype(ast.Node node, DartType subtype, DartType supertype, | 2338 void assertIsSubtype(ast.Node node, DartType subtype, DartType supertype, |
2319 String message) { | 2339 String message) { |
2320 HInstruction subtypeInstruction = | 2340 HInstruction subtypeInstruction = |
2321 analyzeTypeArgument(localsHandler.substInContext(subtype)); | 2341 analyzeTypeArgument(localsHandler.substInContext(subtype)); |
2322 HInstruction supertypeInstruction = | 2342 HInstruction supertypeInstruction = |
2323 analyzeTypeArgument(localsHandler.substInContext(supertype)); | 2343 analyzeTypeArgument(localsHandler.substInContext(supertype)); |
2324 HInstruction messageInstruction = | 2344 HInstruction messageInstruction = |
2325 graph.addConstantString(new ast.DartString.literal(message), compiler); | 2345 graph.addConstantString(new ast.DartString.literal(message), compiler); |
2326 Element element = backend.getAssertIsSubtype(); | 2346 Element element = backend.getAssertIsSubtype(); |
2327 var inputs = <HInstruction>[subtypeInstruction, supertypeInstruction, | 2347 var inputs = <HInstruction>[subtypeInstruction, supertypeInstruction, |
(...skipping 23 matching lines...) Expand all Loading... |
2351 HInstruction pop() { | 2371 HInstruction pop() { |
2352 return stack.removeLast(); | 2372 return stack.removeLast(); |
2353 } | 2373 } |
2354 | 2374 |
2355 void dup() { | 2375 void dup() { |
2356 stack.add(stack.last); | 2376 stack.add(stack.last); |
2357 } | 2377 } |
2358 | 2378 |
2359 HInstruction popBoolified() { | 2379 HInstruction popBoolified() { |
2360 HInstruction value = pop(); | 2380 HInstruction value = pop(); |
2361 if (compiler.enableTypeAssertions) { | 2381 if (_checkOrTrustTypes) { |
2362 return potentiallyCheckType( | 2382 return potentiallyCheckOrTrustType( |
2363 value, | 2383 value, |
2364 compiler.boolClass.rawType, | 2384 compiler.boolClass.rawType, |
2365 kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK); | 2385 kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK); |
2366 } | 2386 } |
2367 HInstruction result = new HBoolify(value, backend.boolType); | 2387 HInstruction result = new HBoolify(value, backend.boolType); |
2368 add(result); | 2388 add(result); |
2369 return result; | 2389 return result; |
2370 } | 2390 } |
2371 | 2391 |
2372 HInstruction attachPosition(HInstruction target, ast.Node node) { | 2392 HInstruction attachPosition(HInstruction target, ast.Node node) { |
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3179 if (location == null) { | 3199 if (location == null) { |
3180 assert(send != null); | 3200 assert(send != null); |
3181 location = send; | 3201 location = send; |
3182 } | 3202 } |
3183 if (Elements.isStaticOrTopLevelField(element)) { | 3203 if (Elements.isStaticOrTopLevelField(element)) { |
3184 if (element.isSetter) { | 3204 if (element.isSetter) { |
3185 pushInvokeStatic(location, element, <HInstruction>[value]); | 3205 pushInvokeStatic(location, element, <HInstruction>[value]); |
3186 pop(); | 3206 pop(); |
3187 } else { | 3207 } else { |
3188 VariableElement field = element; | 3208 VariableElement field = element; |
3189 value = | 3209 value = potentiallyCheckOrTrustType(value, field.type); |
3190 potentiallyCheckType(value, field.type); | |
3191 addWithPosition(new HStaticStore(element, value), location); | 3210 addWithPosition(new HStaticStore(element, value), location); |
3192 } | 3211 } |
3193 stack.add(value); | 3212 stack.add(value); |
3194 } else if (Elements.isErroneousElement(element)) { | 3213 } else if (Elements.isErroneousElement(element)) { |
3195 List<HInstruction> arguments = | 3214 List<HInstruction> arguments = |
3196 send == null ? const <HInstruction>[] : <HInstruction>[value]; | 3215 send == null ? const <HInstruction>[] : <HInstruction>[value]; |
3197 // An erroneous element indicates an unresolved static setter. | 3216 // An erroneous element indicates an unresolved static setter. |
3198 generateThrowNoSuchMethod(location, | 3217 generateThrowNoSuchMethod(location, |
3199 noSuchMethodTargetSymbolString(element, 'set'), | 3218 noSuchMethodTargetSymbolString(element, 'set'), |
3200 argumentValues: arguments); | 3219 argumentValues: arguments); |
3201 } else { | 3220 } else { |
3202 stack.add(value); | 3221 stack.add(value); |
3203 LocalElement local = element; | 3222 LocalElement local = element; |
3204 // If the value does not already have a name, give it here. | 3223 // If the value does not already have a name, give it here. |
3205 if (value.sourceElement == null) { | 3224 if (value.sourceElement == null) { |
3206 value.sourceElement = local; | 3225 value.sourceElement = local; |
3207 } | 3226 } |
3208 HInstruction checked = | 3227 HInstruction checkedOrTrusted = |
3209 potentiallyCheckType(value, local.type); | 3228 potentiallyCheckOrTrustType(value, local.type); |
3210 if (!identical(checked, value)) { | 3229 if (!identical(checkedOrTrusted, value)) { |
3211 pop(); | 3230 pop(); |
3212 stack.add(checked); | 3231 stack.add(checkedOrTrusted); |
3213 } | |
3214 HInstruction trusted = | |
3215 potentiallyBuildTypeHint(checked, local.type); | |
3216 if (!identical(trusted, checked)) { | |
3217 pop(); | |
3218 push(trusted); | |
3219 } | 3232 } |
3220 | 3233 |
3221 localsHandler.updateLocal(local, trusted); | 3234 localsHandler.updateLocal(local, checkedOrTrusted); |
3222 } | 3235 } |
3223 } | 3236 } |
3224 | 3237 |
3225 HInstruction invokeInterceptor(HInstruction receiver) { | 3238 HInstruction invokeInterceptor(HInstruction receiver) { |
3226 HInterceptor interceptor = new HInterceptor(receiver, backend.nonNullType); | 3239 HInterceptor interceptor = new HInterceptor(receiver, backend.nonNullType); |
3227 add(interceptor); | 3240 add(interceptor); |
3228 return interceptor; | 3241 return interceptor; |
3229 } | 3242 } |
3230 | 3243 |
3231 HForeign createForeign(js.Template code, | 3244 HForeign createForeign(js.Template code, |
(...skipping 1065 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4297 // the 'new' is done. | 4310 // the 'new' is done. |
4298 if (backend.classNeedsRti(compiler.listClass) && | 4311 if (backend.classNeedsRti(compiler.listClass) && |
4299 (isFixedListConstructorCall || isGrowableListConstructorCall || | 4312 (isFixedListConstructorCall || isGrowableListConstructorCall || |
4300 isJSArrayTypedConstructor)) { | 4313 isJSArrayTypedConstructor)) { |
4301 newInstance = handleListConstructor(type, send, pop()); | 4314 newInstance = handleListConstructor(type, send, pop()); |
4302 stack.add(newInstance); | 4315 stack.add(newInstance); |
4303 } | 4316 } |
4304 | 4317 |
4305 // Finally, if we called a redirecting factory constructor, check the type. | 4318 // Finally, if we called a redirecting factory constructor, check the type. |
4306 if (isRedirected) { | 4319 if (isRedirected) { |
4307 HInstruction checked = potentiallyCheckType(newInstance, type); | 4320 HInstruction checked = potentiallyCheckOrTrustType(newInstance, type); |
4308 if (checked != newInstance) { | 4321 if (checked != newInstance) { |
4309 pop(); | 4322 pop(); |
4310 stack.add(checked); | 4323 stack.add(checked); |
4311 } | 4324 } |
4312 } | 4325 } |
4313 } | 4326 } |
4314 | 4327 |
4315 void potentiallyAddTypeArguments(List<HInstruction> inputs, ClassElement cls, | 4328 void potentiallyAddTypeArguments(List<HInstruction> inputs, ClassElement cls, |
4316 InterfaceType expectedType) { | 4329 InterfaceType expectedType) { |
4317 if (!backend.classNeedsRti(cls)) return; | 4330 if (!backend.classNeedsRti(cls)) return; |
(...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5035 if (identical(node.beginToken.stringValue, 'native')) { | 5048 if (identical(node.beginToken.stringValue, 'native')) { |
5036 native.handleSsaNative(this, node.expression); | 5049 native.handleSsaNative(this, node.expression); |
5037 return; | 5050 return; |
5038 } | 5051 } |
5039 HInstruction value; | 5052 HInstruction value; |
5040 if (node.expression == null) { | 5053 if (node.expression == null) { |
5041 value = graph.addConstantNull(compiler); | 5054 value = graph.addConstantNull(compiler); |
5042 } else { | 5055 } else { |
5043 visit(node.expression); | 5056 visit(node.expression); |
5044 value = pop(); | 5057 value = pop(); |
5045 value = potentiallyCheckType(value, returnType); | 5058 value = potentiallyCheckOrTrustType(value, returnType); |
5046 } | 5059 } |
5047 | 5060 |
5048 handleInTryStatement(); | 5061 handleInTryStatement(); |
5049 emitReturn(value, node); | 5062 emitReturn(value, node); |
5050 } | 5063 } |
5051 | 5064 |
5052 visitThrow(ast.Throw node) { | 5065 visitThrow(ast.Throw node) { |
5053 visitThrowExpression(node.expression); | 5066 visitThrowExpression(node.expression); |
5054 if (isReachable) { | 5067 if (isReachable) { |
5055 handleInTryStatement(); | 5068 handleInTryStatement(); |
(...skipping 1513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6569 if (unaliased is TypedefType) throw 'unable to unalias $type'; | 6582 if (unaliased is TypedefType) throw 'unable to unalias $type'; |
6570 unaliased.accept(this, builder); | 6583 unaliased.accept(this, builder); |
6571 } | 6584 } |
6572 | 6585 |
6573 void visitDynamicType(DynamicType type, SsaBuilder builder) { | 6586 void visitDynamicType(DynamicType type, SsaBuilder builder) { |
6574 JavaScriptBackend backend = builder.compiler.backend; | 6587 JavaScriptBackend backend = builder.compiler.backend; |
6575 ClassElement cls = backend.findHelper('DynamicRuntimeType'); | 6588 ClassElement cls = backend.findHelper('DynamicRuntimeType'); |
6576 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); | 6589 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); |
6577 } | 6590 } |
6578 } | 6591 } |
OLD | NEW |