| 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 import 'dart:collection'; | 5 import 'dart:collection'; |
| 6 | 6 |
| 7 import 'package:js_runtime/shared/embedded_names.dart'; | 7 import 'package:js_runtime/shared/embedded_names.dart'; |
| 8 | 8 |
| 9 import '../closure.dart'; | 9 import '../closure.dart'; |
| 10 import '../common.dart'; | 10 import '../common.dart'; |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 closedWorld, | 140 closedWorld, |
| 141 emitter.nativeEmitter, | 141 emitter.nativeEmitter, |
| 142 sourceInformationFactory); | 142 sourceInformationFactory); |
| 143 HGraph graph = builder.build(); | 143 HGraph graph = builder.build(); |
| 144 | 144 |
| 145 // Default arguments are handled elsewhere, but we must ensure | 145 // Default arguments are handled elsewhere, but we must ensure |
| 146 // that the default values are computed during codegen. | 146 // that the default values are computed during codegen. |
| 147 if (!identical(element.kind, ElementKind.FIELD)) { | 147 if (!identical(element.kind, ElementKind.FIELD)) { |
| 148 MethodElement function = element; | 148 MethodElement function = element; |
| 149 FunctionSignature signature = function.functionSignature; | 149 FunctionSignature signature = function.functionSignature; |
| 150 signature.forEachOptionalParameter((ParameterElement parameter) { | 150 signature.forEachOptionalParameter((_parameter) { |
| 151 ParameterElement parameter = _parameter; |
| 151 // This ensures the default value will be computed. | 152 // This ensures the default value will be computed. |
| 152 ConstantValue constant = | 153 ConstantValue constant = |
| 153 backend.constants.getConstantValue(parameter.constant); | 154 backend.constants.getConstantValue(parameter.constant); |
| 154 work.registry.registerConstantUse(new ConstantUse.init(constant)); | 155 work.registry.registerConstantUse(new ConstantUse.init(constant)); |
| 155 }); | 156 }); |
| 156 } | 157 } |
| 157 if (backend.tracer.isEnabled) { | 158 if (backend.tracer.isEnabled) { |
| 158 String name; | 159 String name; |
| 159 if (element.isClassMember) { | 160 if (element.isClassMember) { |
| 160 String className = element.enclosingClass.name; | 161 String className = element.enclosingClass.name; |
| (...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 875 | 876 |
| 876 inTryStatement = false; // TODO(lry): why? Document. | 877 inTryStatement = false; // TODO(lry): why? Document. |
| 877 | 878 |
| 878 int argumentIndex = 0; | 879 int argumentIndex = 0; |
| 879 if (function.isInstanceMember) { | 880 if (function.isInstanceMember) { |
| 880 localsHandler.updateLocal(localsHandler.closureData.thisLocal, | 881 localsHandler.updateLocal(localsHandler.closureData.thisLocal, |
| 881 compiledArguments[argumentIndex++]); | 882 compiledArguments[argumentIndex++]); |
| 882 } | 883 } |
| 883 | 884 |
| 884 FunctionSignature signature = function.functionSignature; | 885 FunctionSignature signature = function.functionSignature; |
| 885 signature.orderedForEachParameter((ParameterElement parameter) { | 886 signature.orderedForEachParameter((_parameter) { |
| 887 ParameterElement parameter = _parameter; |
| 886 HInstruction argument = compiledArguments[argumentIndex++]; | 888 HInstruction argument = compiledArguments[argumentIndex++]; |
| 887 localsHandler.updateLocal(parameter, argument); | 889 localsHandler.updateLocal(parameter, argument); |
| 888 }); | 890 }); |
| 889 | 891 |
| 890 ClassElement enclosing = function.enclosingClass; | 892 ClassElement enclosing = function.enclosingClass; |
| 891 if ((function.isConstructor || function.isGenerativeConstructorBody) && | 893 if ((function.isConstructor || function.isGenerativeConstructorBody) && |
| 892 rtiNeed.classNeedsRti(enclosing)) { | 894 rtiNeed.classNeedsRti(enclosing)) { |
| 893 enclosing.typeVariables | 895 enclosing.typeVariables.forEach((_typeVariable) { |
| 894 .forEach((ResolutionTypeVariableType typeVariable) { | 896 ResolutionTypeVariableType typeVariable = _typeVariable; |
| 895 HInstruction argument = compiledArguments[argumentIndex++]; | 897 HInstruction argument = compiledArguments[argumentIndex++]; |
| 896 localsHandler.updateLocal( | 898 localsHandler.updateLocal( |
| 897 localsHandler.getTypeVariableAsLocal(typeVariable), argument); | 899 localsHandler.getTypeVariableAsLocal(typeVariable), argument); |
| 898 }); | 900 }); |
| 899 } | 901 } |
| 900 assert(argumentIndex == compiledArguments.length); | 902 assert(argumentIndex == compiledArguments.length); |
| 901 | 903 |
| 902 returnType = signature.type.returnType; | 904 returnType = signature.type.returnType; |
| 903 stack = <HInstruction>[]; | 905 stack = <HInstruction>[]; |
| 904 | 906 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1007 // by the effective target. | 1009 // by the effective target. |
| 1008 if (!callee.isRedirectingGenerative) { | 1010 if (!callee.isRedirectingGenerative) { |
| 1009 inlinedFrom(constructorResolvedAst, () { | 1011 inlinedFrom(constructorResolvedAst, () { |
| 1010 buildFieldInitializers( | 1012 buildFieldInitializers( |
| 1011 callee.enclosingClass.implementation, fieldValues); | 1013 callee.enclosingClass.implementation, fieldValues); |
| 1012 }); | 1014 }); |
| 1013 } | 1015 } |
| 1014 | 1016 |
| 1015 int index = 0; | 1017 int index = 0; |
| 1016 FunctionSignature params = callee.functionSignature; | 1018 FunctionSignature params = callee.functionSignature; |
| 1017 params.orderedForEachParameter((ParameterElement parameter) { | 1019 params.orderedForEachParameter((_parameter) { |
| 1020 ParameterElement parameter = _parameter; |
| 1018 HInstruction argument = compiledArguments[index++]; | 1021 HInstruction argument = compiledArguments[index++]; |
| 1019 // Because we are inlining the initializer, we must update | 1022 // Because we are inlining the initializer, we must update |
| 1020 // what was given as parameter. This will be used in case | 1023 // what was given as parameter. This will be used in case |
| 1021 // there is a parameter check expression in the initializer. | 1024 // there is a parameter check expression in the initializer. |
| 1022 parameters[parameter] = argument; | 1025 parameters[parameter] = argument; |
| 1023 localsHandler.updateLocal(parameter, argument); | 1026 localsHandler.updateLocal(parameter, argument); |
| 1024 // Don't forget to update the field, if the parameter is of the | 1027 // Don't forget to update the field, if the parameter is of the |
| 1025 // form [:this.x:]. | 1028 // form [:this.x:]. |
| 1026 if (parameter.isInitializingFormal) { | 1029 if (parameter.isInitializingFormal) { |
| 1027 InitializingFormalElement fieldParameterElement = parameter; | 1030 InitializingFormalElement fieldParameterElement = parameter; |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1260 | 1263 |
| 1261 // Compile the possible initialization code for local fields and | 1264 // Compile the possible initialization code for local fields and |
| 1262 // super fields, unless this is a redirecting constructor, in which case | 1265 // super fields, unless this is a redirecting constructor, in which case |
| 1263 // the effective target will initialize these. | 1266 // the effective target will initialize these. |
| 1264 if (!functionElement.isRedirectingGenerative) { | 1267 if (!functionElement.isRedirectingGenerative) { |
| 1265 buildFieldInitializers(classElement, fieldValues); | 1268 buildFieldInitializers(classElement, fieldValues); |
| 1266 } | 1269 } |
| 1267 | 1270 |
| 1268 // Compile field-parameters such as [:this.x:]. | 1271 // Compile field-parameters such as [:this.x:]. |
| 1269 FunctionSignature params = functionElement.functionSignature; | 1272 FunctionSignature params = functionElement.functionSignature; |
| 1270 params.orderedForEachParameter((ParameterElement parameter) { | 1273 params.orderedForEachParameter((_parameter) { |
| 1274 ParameterElement parameter = _parameter; |
| 1271 if (parameter.isInitializingFormal) { | 1275 if (parameter.isInitializingFormal) { |
| 1272 // If the [element] is a field-parameter then | 1276 // If the [element] is a field-parameter then |
| 1273 // initialize the field element with its value. | 1277 // initialize the field element with its value. |
| 1274 InitializingFormalElement fieldParameter = parameter; | 1278 InitializingFormalElement fieldParameter = parameter; |
| 1275 HInstruction parameterValue = localsHandler.readLocal(fieldParameter); | 1279 HInstruction parameterValue = localsHandler.readLocal(fieldParameter); |
| 1276 fieldValues[fieldParameter.fieldElement] = parameterValue; | 1280 fieldValues[fieldParameter.fieldElement] = parameterValue; |
| 1277 } | 1281 } |
| 1278 }); | 1282 }); |
| 1279 | 1283 |
| 1280 // Analyze the constructor and all referenced constructors and collect | 1284 // Analyze the constructor and all referenced constructors and collect |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1314 | 1318 |
| 1315 HInstruction newObject; | 1319 HInstruction newObject; |
| 1316 if (!isNativeUpgradeFactory) { | 1320 if (!isNativeUpgradeFactory) { |
| 1317 // Create the runtime type information, if needed. | 1321 // Create the runtime type information, if needed. |
| 1318 bool hasRtiInput = false; | 1322 bool hasRtiInput = false; |
| 1319 if (rtiNeed.classNeedsRtiField(classElement.declaration)) { | 1323 if (rtiNeed.classNeedsRtiField(classElement.declaration)) { |
| 1320 // Read the values of the type arguments and create a | 1324 // Read the values of the type arguments and create a |
| 1321 // HTypeInfoExpression to set on the newly create object. | 1325 // HTypeInfoExpression to set on the newly create object. |
| 1322 hasRtiInput = true; | 1326 hasRtiInput = true; |
| 1323 List<HInstruction> typeArguments = <HInstruction>[]; | 1327 List<HInstruction> typeArguments = <HInstruction>[]; |
| 1324 classElement.typeVariables | 1328 classElement.typeVariables.forEach((_typeVariable) { |
| 1325 .forEach((ResolutionTypeVariableType typeVariable) { | 1329 ResolutionTypeVariableType typeVariable = _typeVariable; |
| 1326 HInstruction argument = localsHandler | 1330 HInstruction argument = localsHandler |
| 1327 .readLocal(localsHandler.getTypeVariableAsLocal(typeVariable)); | 1331 .readLocal(localsHandler.getTypeVariableAsLocal(typeVariable)); |
| 1328 typeArguments.add(argument); | 1332 typeArguments.add(argument); |
| 1329 }); | 1333 }); |
| 1330 | 1334 |
| 1331 HInstruction typeInfo = new HTypeInfoExpression( | 1335 HInstruction typeInfo = new HTypeInfoExpression( |
| 1332 TypeInfoExpressionKind.INSTANCE, | 1336 TypeInfoExpressionKind.INSTANCE, |
| 1333 classElement.thisType, | 1337 classElement.thisType, |
| 1334 typeArguments, | 1338 typeArguments, |
| 1335 commonMasks.dynamicType); | 1339 commonMasks.dynamicType); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1376 ConstantValue constant = new InterceptorConstantValue(classElement); | 1380 ConstantValue constant = new InterceptorConstantValue(classElement); |
| 1377 interceptor = graph.addConstant(constant, closedWorld); | 1381 interceptor = graph.addConstant(constant, closedWorld); |
| 1378 } | 1382 } |
| 1379 bodyCallInputs.add(interceptor); | 1383 bodyCallInputs.add(interceptor); |
| 1380 } | 1384 } |
| 1381 bodyCallInputs.add(newObject); | 1385 bodyCallInputs.add(newObject); |
| 1382 ast.Node node = constructorResolvedAst.node; | 1386 ast.Node node = constructorResolvedAst.node; |
| 1383 | 1387 |
| 1384 FunctionSignature functionSignature = body.functionSignature; | 1388 FunctionSignature functionSignature = body.functionSignature; |
| 1385 // Provide the parameters to the generative constructor body. | 1389 // Provide the parameters to the generative constructor body. |
| 1386 functionSignature.orderedForEachParameter((ParameterElement parameter) { | 1390 functionSignature.orderedForEachParameter((_parameter) { |
| 1391 ParameterElement parameter = _parameter; |
| 1387 // If [parameter] is boxed, it will be a field in the box passed as the | 1392 // If [parameter] is boxed, it will be a field in the box passed as the |
| 1388 // last parameter. So no need to directly pass it. | 1393 // last parameter. So no need to directly pass it. |
| 1389 if (!localsHandler.isBoxed(parameter)) { | 1394 if (!localsHandler.isBoxed(parameter)) { |
| 1390 bodyCallInputs.add(localsHandler.readLocal(parameter)); | 1395 bodyCallInputs.add(localsHandler.readLocal(parameter)); |
| 1391 } | 1396 } |
| 1392 }); | 1397 }); |
| 1393 | 1398 |
| 1394 // If there are locals that escape (ie mutated in closures), we | 1399 // If there are locals that escape (ie mutated in closures), we |
| 1395 // pass the box to the constructor. | 1400 // pass the box to the constructor. |
| 1396 // The box must be passed before any type variable. | 1401 // The box must be passed before any type variable. |
| 1397 ClosureAnalysisInfo scopeData = | 1402 ClosureAnalysisInfo scopeData = |
| 1398 closureDataLookup.getClosureAnalysisInfo(node); | 1403 closureDataLookup.getClosureAnalysisInfo(node); |
| 1399 if (scopeData.requiresContextBox) { | 1404 if (scopeData.requiresContextBox) { |
| 1400 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); | 1405 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); |
| 1401 } | 1406 } |
| 1402 | 1407 |
| 1403 // Type variables arguments must come after the box (if there is one). | 1408 // Type variables arguments must come after the box (if there is one). |
| 1404 ClassElement currentClass = constructor.enclosingClass; | 1409 ClassElement currentClass = constructor.enclosingClass; |
| 1405 if (rtiNeed.classNeedsRti(currentClass)) { | 1410 if (rtiNeed.classNeedsRti(currentClass)) { |
| 1406 // If [currentClass] needs RTI, we add the type variables as | 1411 // If [currentClass] needs RTI, we add the type variables as |
| 1407 // parameters of the generative constructor body. | 1412 // parameters of the generative constructor body. |
| 1408 currentClass.typeVariables | 1413 currentClass.typeVariables.forEach((_argument) { |
| 1409 .forEach((ResolutionTypeVariableType argument) { | 1414 ResolutionTypeVariableType argument = _argument; |
| 1410 // TODO(johnniwinther): Substitute [argument] with | 1415 // TODO(johnniwinther): Substitute [argument] with |
| 1411 // `localsHandler.substInContext(argument)`. | 1416 // `localsHandler.substInContext(argument)`. |
| 1412 bodyCallInputs.add(localsHandler | 1417 bodyCallInputs.add(localsHandler |
| 1413 .readLocal(localsHandler.getTypeVariableAsLocal(argument))); | 1418 .readLocal(localsHandler.getTypeVariableAsLocal(argument))); |
| 1414 }); | 1419 }); |
| 1415 } | 1420 } |
| 1416 | 1421 |
| 1417 if (!isNativeUpgradeFactory && // TODO(13836): Fix inlining. | 1422 if (!isNativeUpgradeFactory && // TODO(13836): Fix inlining. |
| 1418 tryInlineMethod(body, null, null, bodyCallInputs, function)) { | 1423 tryInlineMethod(body, null, null, bodyCallInputs, function)) { |
| 1419 pop(); | 1424 pop(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1439 * | 1444 * |
| 1440 * Invariant: [functionElement] must be the implementation element. | 1445 * Invariant: [functionElement] must be the implementation element. |
| 1441 */ | 1446 */ |
| 1442 void openFunction(MemberElement element, ast.Node node) { | 1447 void openFunction(MemberElement element, ast.Node node) { |
| 1443 assert(element.isImplementation, failedAt(element)); | 1448 assert(element.isImplementation, failedAt(element)); |
| 1444 HBasicBlock block = graph.addNewBlock(); | 1449 HBasicBlock block = graph.addNewBlock(); |
| 1445 open(graph.entry); | 1450 open(graph.entry); |
| 1446 | 1451 |
| 1447 Map<Local, TypeMask> parameters = <Local, TypeMask>{}; | 1452 Map<Local, TypeMask> parameters = <Local, TypeMask>{}; |
| 1448 if (element is MethodElement) { | 1453 if (element is MethodElement) { |
| 1449 element.functionSignature | 1454 element.functionSignature.orderedForEachParameter((_parameter) { |
| 1450 .orderedForEachParameter((ParameterElement parameter) { | 1455 ParameterElement parameter = _parameter; |
| 1451 parameters[parameter] = TypeMaskFactory.inferredTypeForParameter( | 1456 parameters[parameter] = TypeMaskFactory.inferredTypeForParameter( |
| 1452 parameter, globalInferenceResults); | 1457 parameter, globalInferenceResults); |
| 1453 }); | 1458 }); |
| 1454 } | 1459 } |
| 1455 | 1460 |
| 1456 ClosureRepresentationInfo closureData = | 1461 ClosureRepresentationInfo closureData = |
| 1457 closureDataLookup.getClosureRepresentationInfo(element); | 1462 closureDataLookup.getClosureRepresentationInfo(element); |
| 1458 localsHandler.startFunction(element, closureData, | 1463 localsHandler.startFunction(element, closureData, |
| 1459 closureDataLookup.getClosureAnalysisInfo(node), parameters, | 1464 closureDataLookup.getClosureAnalysisInfo(node), parameters, |
| 1460 isGenerativeConstructorBody: element.isGenerativeConstructorBody); | 1465 isGenerativeConstructorBody: element.isGenerativeConstructorBody); |
| 1461 close(new HGoto()).addSuccessor(block); | 1466 close(new HGoto()).addSuccessor(block); |
| 1462 | 1467 |
| 1463 open(block); | 1468 open(block); |
| 1464 | 1469 |
| 1465 // Add the type parameters of the class as parameters of this method. This | 1470 // Add the type parameters of the class as parameters of this method. This |
| 1466 // must be done before adding the normal parameters, because their types | 1471 // must be done before adding the normal parameters, because their types |
| 1467 // may contain references to type variables. | 1472 // may contain references to type variables. |
| 1468 ClassElement cls = element.enclosingClass; | 1473 ClassElement cls = element.enclosingClass; |
| 1469 if ((element.isConstructor || element.isGenerativeConstructorBody) && | 1474 if ((element.isConstructor || element.isGenerativeConstructorBody) && |
| 1470 rtiNeed.classNeedsRti(cls)) { | 1475 rtiNeed.classNeedsRti(cls)) { |
| 1471 cls.typeVariables.forEach((ResolutionTypeVariableType typeVariable) { | 1476 cls.typeVariables.forEach((_typeVariable) { |
| 1477 ResolutionTypeVariableType typeVariable = _typeVariable; |
| 1472 HParameterValue param = | 1478 HParameterValue param = |
| 1473 addParameter(typeVariable.element, commonMasks.nonNullType); | 1479 addParameter(typeVariable.element, commonMasks.nonNullType); |
| 1474 localsHandler.directLocals[ | 1480 localsHandler.directLocals[ |
| 1475 localsHandler.getTypeVariableAsLocal(typeVariable)] = param; | 1481 localsHandler.getTypeVariableAsLocal(typeVariable)] = param; |
| 1476 }); | 1482 }); |
| 1477 } | 1483 } |
| 1478 | 1484 |
| 1479 if (element is MethodElement) { | 1485 if (element is MethodElement) { |
| 1480 MethodElement functionElement = element; | 1486 MethodElement functionElement = element; |
| 1481 FunctionSignature signature = functionElement.functionSignature; | 1487 FunctionSignature signature = functionElement.functionSignature; |
| 1482 | 1488 |
| 1483 // Put the type checks in the first successor of the entry, | 1489 // Put the type checks in the first successor of the entry, |
| 1484 // because that is where the type guards will also be inserted. | 1490 // because that is where the type guards will also be inserted. |
| 1485 // This way we ensure that a type guard will dominate the type | 1491 // This way we ensure that a type guard will dominate the type |
| 1486 // check. | 1492 // check. |
| 1487 signature.orderedForEachParameter((ParameterElement parameterElement) { | 1493 signature.orderedForEachParameter((_parameterElement) { |
| 1494 ParameterElement parameterElement = _parameterElement; |
| 1488 if (element.isGenerativeConstructorBody) { | 1495 if (element.isGenerativeConstructorBody) { |
| 1489 if (closureDataLookup | 1496 if (closureDataLookup |
| 1490 .getClosureAnalysisInfo(node) | 1497 .getClosureAnalysisInfo(node) |
| 1491 .isCaptured(parameterElement)) { | 1498 .isCaptured(parameterElement)) { |
| 1492 // The parameter will be a field in the box passed as the | 1499 // The parameter will be a field in the box passed as the |
| 1493 // last parameter. So no need to have it. | 1500 // last parameter. So no need to have it. |
| 1494 return; | 1501 return; |
| 1495 } | 1502 } |
| 1496 } | 1503 } |
| 1497 HInstruction newParameter = | 1504 HInstruction newParameter = |
| (...skipping 2005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3503 js.Template code = js.js.parseForeignJS('new Array(#)'); | 3510 js.Template code = js.js.parseForeignJS('new Array(#)'); |
| 3504 var behavior = new native.NativeBehavior(); | 3511 var behavior = new native.NativeBehavior(); |
| 3505 behavior.typesInstantiated.add(expectedType); | 3512 behavior.typesInstantiated.add(expectedType); |
| 3506 behavior.typesReturned.add(expectedType); | 3513 behavior.typesReturned.add(expectedType); |
| 3507 // The allocation can throw only if the given length is a double or | 3514 // The allocation can throw only if the given length is a double or |
| 3508 // outside the unsigned 32 bit range. | 3515 // outside the unsigned 32 bit range. |
| 3509 // TODO(sra): Array allocation should be an instruction so that canThrow | 3516 // TODO(sra): Array allocation should be an instruction so that canThrow |
| 3510 // can depend on a length type discovered in optimization. | 3517 // can depend on a length type discovered in optimization. |
| 3511 bool canThrow = true; | 3518 bool canThrow = true; |
| 3512 if (inputs[0].isInteger(closedWorld) && inputs[0] is HConstant) { | 3519 if (inputs[0].isInteger(closedWorld) && inputs[0] is HConstant) { |
| 3513 var constant = inputs[0]; | 3520 dynamic constant = inputs[0]; |
| 3514 int value = constant.constant.primitiveValue; | 3521 int value = constant.constant.primitiveValue; |
| 3515 if (0 <= value && value < 0x100000000) canThrow = false; | 3522 if (0 <= value && value < 0x100000000) canThrow = false; |
| 3516 } | 3523 } |
| 3517 HForeignCode foreign = new HForeignCode(code, elementType, inputs, | 3524 HForeignCode foreign = new HForeignCode(code, elementType, inputs, |
| 3518 nativeBehavior: behavior, | 3525 nativeBehavior: behavior, |
| 3519 throwBehavior: canThrow | 3526 throwBehavior: canThrow |
| 3520 ? native.NativeThrowBehavior.MAY | 3527 ? native.NativeThrowBehavior.MAY |
| 3521 : native.NativeThrowBehavior.NEVER); | 3528 : native.NativeThrowBehavior.NEVER); |
| 3522 push(foreign); | 3529 push(foreign); |
| 3523 if (globalInferenceResults.isFixedArrayCheckedForGrowable(send)) { | 3530 if (globalInferenceResults.isFixedArrayCheckedForGrowable(send)) { |
| (...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4098 if (element.isFactoryConstructor && | 4105 if (element.isFactoryConstructor && |
| 4099 nativeData.isAnonymousJsInteropClass(element.contextClass)) { | 4106 nativeData.isAnonymousJsInteropClass(element.contextClass)) { |
| 4100 // Factory constructor that is syntactic sugar for creating a JavaScript | 4107 // Factory constructor that is syntactic sugar for creating a JavaScript |
| 4101 // object literal. | 4108 // object literal. |
| 4102 ConstructorElement constructor = element; | 4109 ConstructorElement constructor = element; |
| 4103 FunctionSignature params = constructor.functionSignature; | 4110 FunctionSignature params = constructor.functionSignature; |
| 4104 int i = 0; | 4111 int i = 0; |
| 4105 int positions = 0; | 4112 int positions = 0; |
| 4106 var filteredArguments = <HInstruction>[]; | 4113 var filteredArguments = <HInstruction>[]; |
| 4107 var parameterNameMap = new Map<String, js.Expression>(); | 4114 var parameterNameMap = new Map<String, js.Expression>(); |
| 4108 params.orderedForEachParameter((ParameterElement parameter) { | 4115 params.orderedForEachParameter((_parameter) { |
| 4116 ParameterElement parameter = _parameter; |
| 4109 // TODO(jacobr): consider throwing if parameter names do not match | 4117 // TODO(jacobr): consider throwing if parameter names do not match |
| 4110 // names of properties in the class. | 4118 // names of properties in the class. |
| 4111 assert(parameter.isNamed); | 4119 assert(parameter.isNamed); |
| 4112 HInstruction argument = arguments[i]; | 4120 HInstruction argument = arguments[i]; |
| 4113 if (argument != null) { | 4121 if (argument != null) { |
| 4114 filteredArguments.add(argument); | 4122 filteredArguments.add(argument); |
| 4115 var jsName = nativeData.computeUnescapedJSInteropName(parameter.name); | 4123 var jsName = nativeData.computeUnescapedJSInteropName(parameter.name); |
| 4116 parameterNameMap[jsName] = new js.InterpolatedExpression(positions++); | 4124 parameterNameMap[jsName] = new js.InterpolatedExpression(positions++); |
| 4117 } | 4125 } |
| 4118 i++; | 4126 i++; |
| (...skipping 1803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5922 // ... | 5930 // ... |
| 5923 // case n: s_n; target = j; continue l; | 5931 // case n: s_n; target = j; continue l; |
| 5924 // } | 5932 // } |
| 5925 // } | 5933 // } |
| 5926 | 5934 |
| 5927 JumpTarget switchTarget = elements.getTargetDefinition(node); | 5935 JumpTarget switchTarget = elements.getTargetDefinition(node); |
| 5928 HInstruction initialValue = graph.addConstantNull(closedWorld); | 5936 HInstruction initialValue = graph.addConstantNull(closedWorld); |
| 5929 localsHandler.updateLocal(switchTarget, initialValue); | 5937 localsHandler.updateLocal(switchTarget, initialValue); |
| 5930 | 5938 |
| 5931 JumpHandler jumpHandler = createJumpHandler(node, isLoopJump: false); | 5939 JumpHandler jumpHandler = createJumpHandler(node, isLoopJump: false); |
| 5932 var switchCases = node.cases; | 5940 dynamic switchCases = node.cases; |
| 5933 if (!hasDefault) { | 5941 if (!hasDefault) { |
| 5934 // Use [:null:] as the marker for a synthetic default clause. | 5942 // Use [:null:] as the marker for a synthetic default clause. |
| 5935 // The synthetic default is added because otherwise, there would be no | 5943 // The synthetic default is added because otherwise, there would be no |
| 5936 // good place to give a default value to the local. | 5944 // good place to give a default value to the local. |
| 5937 switchCases = node.cases.nodes.toList()..add(null); | 5945 switchCases = node.cases.nodes.toList()..add(null); |
| 5938 } | 5946 } |
| 5939 HInstruction buildExpression() { | 5947 HInstruction buildExpression() { |
| 5940 visit(node.expression); | 5948 visit(node.expression); |
| 5941 return pop(); | 5949 return pop(); |
| 5942 } | 5950 } |
| (...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6867 this.oldReturnLocal, | 6875 this.oldReturnLocal, |
| 6868 this.oldReturnType, | 6876 this.oldReturnType, |
| 6869 this.oldResolvedAst, | 6877 this.oldResolvedAst, |
| 6870 this.oldStack, | 6878 this.oldStack, |
| 6871 this.oldLocalsHandler, | 6879 this.oldLocalsHandler, |
| 6872 this.inTryStatement, | 6880 this.inTryStatement, |
| 6873 this.allFunctionsCalledOnce, | 6881 this.allFunctionsCalledOnce, |
| 6874 this.oldElementInferenceResults) | 6882 this.oldElementInferenceResults) |
| 6875 : super(function); | 6883 : super(function); |
| 6876 } | 6884 } |
| OLD | NEW |