OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library dart2js.ir_builder; | 5 library dart2js.ir_builder; |
6 | 6 |
7 import '../compile_time_constants.dart' show BackendConstantEnvironment; | 7 import '../compile_time_constants.dart' show BackendConstantEnvironment; |
8 import '../constants/constant_system.dart'; | 8 import '../constants/constant_system.dart'; |
9 import '../constants/expressions.dart'; | 9 import '../constants/expressions.dart'; |
10 import '../constants/values.dart' show ConstantValue, PrimitiveConstantValue; | 10 import '../constants/values.dart' show ConstantValue, PrimitiveConstantValue; |
11 import '../dart_types.dart'; | 11 import '../dart_types.dart'; |
12 import '../dart2jslib.dart'; | 12 import '../dart2jslib.dart'; |
13 import '../elements/elements.dart'; | 13 import '../elements/elements.dart'; |
14 import '../io/source_information.dart'; | 14 import '../io/source_information.dart'; |
15 import '../tree/tree.dart' as ast; | 15 import '../tree/tree.dart' as ast; |
16 import '../types/types.dart' show TypeMask; | |
17 import '../closure.dart' hide ClosureScope; | 16 import '../closure.dart' hide ClosureScope; |
18 import '../universe/universe.dart' show SelectorKind; | 17 import '../universe/universe.dart' show SelectorKind; |
19 import 'cps_ir_nodes.dart' as ir; | 18 import 'cps_ir_nodes.dart' as ir; |
20 import 'cps_ir_builder_task.dart' show DartCapturedVariables, | 19 import 'cps_ir_builder_task.dart' show DartCapturedVariables, |
21 GlobalProgramInformation; | 20 GlobalProgramInformation; |
22 | 21 |
23 /// A mapping from variable elements to their compile-time values. | 22 /// A mapping from variable elements to their compile-time values. |
24 /// | 23 /// |
25 /// Map elements denoted by parameters and local variables to the | 24 /// Map elements denoted by parameters and local variables to the |
26 /// [ir.Primitive] that is their value. Parameters and locals are | 25 /// [ir.Primitive] that is their value. Parameters and locals are |
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 List<ir.Primitive> arguments) { | 646 List<ir.Primitive> arguments) { |
648 assert(target.isInstanceMember); | 647 assert(target.isInstanceMember); |
649 assert(isOpen); | 648 assert(isOpen); |
650 return _continueWithExpression( | 649 return _continueWithExpression( |
651 (k) => new ir.InvokeMethodDirectly( | 650 (k) => new ir.InvokeMethodDirectly( |
652 buildThis(), target, selector, arguments, k)); | 651 buildThis(), target, selector, arguments, k)); |
653 } | 652 } |
654 | 653 |
655 ir.Primitive _buildInvokeDynamic(ir.Primitive receiver, | 654 ir.Primitive _buildInvokeDynamic(ir.Primitive receiver, |
656 Selector selector, | 655 Selector selector, |
657 TypeMask mask, | |
658 List<ir.Primitive> arguments, | 656 List<ir.Primitive> arguments, |
659 {SourceInformation sourceInformation}) { | 657 {SourceInformation sourceInformation}) { |
660 assert(isOpen); | 658 assert(isOpen); |
661 return _continueWithExpression( | 659 return _continueWithExpression( |
662 (k) => new ir.InvokeMethod(receiver, selector, mask, arguments, k, | 660 (k) => new ir.InvokeMethod(receiver, selector, arguments, k, |
663 sourceInformation: sourceInformation)); | 661 sourceInformation: sourceInformation)); |
664 } | 662 } |
665 | 663 |
666 ir.Primitive _buildInvokeCall(ir.Primitive target, | 664 ir.Primitive _buildInvokeCall(ir.Primitive target, |
667 CallStructure callStructure, | 665 CallStructure callStructure, |
668 TypeMask mask, | |
669 List<ir.Definition> arguments, | 666 List<ir.Definition> arguments, |
670 {SourceInformation sourceInformation}) { | 667 {SourceInformation sourceInformation}) { |
671 Selector selector = callStructure.callSelector; | 668 Selector selector = callStructure.callSelector; |
672 return _buildInvokeDynamic(target, selector, mask, arguments, | 669 return _buildInvokeDynamic(target, selector, arguments, |
673 sourceInformation: sourceInformation); | 670 sourceInformation: sourceInformation); |
674 } | 671 } |
675 | 672 |
676 | 673 |
677 /// Create a [ir.Constant] from [constant] and add it to the CPS term. | 674 /// Create a [ir.Constant] from [constant] and add it to the CPS term. |
678 // TODO(johnniwinther): Remove [value] when [ConstantValue] can be computed | 675 // TODO(johnniwinther): Remove [value] when [ConstantValue] can be computed |
679 // directly from [constant]. | 676 // directly from [constant]. |
680 ir.Constant buildConstant(ConstantExpression constant, ConstantValue value) { | 677 ir.Constant buildConstant(ConstantExpression constant, ConstantValue value) { |
681 assert(isOpen); | 678 assert(isOpen); |
682 return addPrimitive(new ir.Constant(constant, value)); | 679 return addPrimitive(new ir.Constant(constant, value)); |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
917 _buildInvokeSuper(method, new Selector.indexSet(), | 914 _buildInvokeSuper(method, new Selector.indexSet(), |
918 <ir.Primitive>[index, value]); | 915 <ir.Primitive>[index, value]); |
919 return value; | 916 return value; |
920 } | 917 } |
921 | 918 |
922 /// Create a dynamic invocation on [receiver] where the method name and | 919 /// Create a dynamic invocation on [receiver] where the method name and |
923 /// argument structure are defined by [selector] and the argument values are | 920 /// argument structure are defined by [selector] and the argument values are |
924 /// defined by [arguments]. | 921 /// defined by [arguments]. |
925 ir.Primitive buildDynamicInvocation(ir.Primitive receiver, | 922 ir.Primitive buildDynamicInvocation(ir.Primitive receiver, |
926 Selector selector, | 923 Selector selector, |
927 TypeMask mask, | |
928 List<ir.Primitive> arguments) { | 924 List<ir.Primitive> arguments) { |
929 return _buildInvokeDynamic(receiver, selector, mask, arguments); | 925 return _buildInvokeDynamic(receiver, selector, arguments); |
930 } | 926 } |
931 | 927 |
932 /// Create an if-null expression. This is equivalent to a conditional | 928 /// Create an if-null expression. This is equivalent to a conditional |
933 /// expression whose result is either [value] if [value] is not null, or | 929 /// expression whose result is either [value] if [value] is not null, or |
934 /// `right` if [value] is null. Only when [value] is null, [buildRight] is | 930 /// `right` if [value] is null. Only when [value] is null, [buildRight] is |
935 /// evaluated to produce the `right` value. | 931 /// evaluated to produce the `right` value. |
936 ir.Primitive buildIfNull(ir.Primitive value, | 932 ir.Primitive buildIfNull(ir.Primitive value, |
937 ir.Primitive buildRight(IrBuilder builder)); | 933 ir.Primitive buildRight(IrBuilder builder)); |
938 | 934 |
939 /// Create a conditional send. This is equivalent to a conditional expression | 935 /// Create a conditional send. This is equivalent to a conditional expression |
940 /// that checks if [receiver] is null, if so, it returns null, otherwise it | 936 /// that checks if [receiver] is null, if so, it returns null, otherwise it |
941 /// evaluates the [buildSend] expression. | 937 /// evaluates the [buildSend] expression. |
942 ir.Primitive buildIfNotNullSend(ir.Primitive receiver, | 938 ir.Primitive buildIfNotNullSend(ir.Primitive receiver, |
943 ir.Primitive buildSend(IrBuilder builder)); | 939 ir.Primitive buildSend(IrBuilder builder)); |
944 | 940 |
945 /// Create a dynamic getter invocation on [receiver] where the getter name is | 941 /// Create a dynamic getter invocation on [receiver] where the getter name is |
946 /// defined by [selector]. | 942 /// defined by [selector]. |
947 ir.Primitive buildDynamicGet(ir.Primitive receiver, | 943 ir.Primitive buildDynamicGet(ir.Primitive receiver, Selector selector) { |
948 Selector selector, | |
949 TypeMask mask) { | |
950 assert(selector.isGetter); | 944 assert(selector.isGetter); |
951 return _buildInvokeDynamic( | 945 return _buildInvokeDynamic(receiver, selector, const <ir.Primitive>[]); |
952 receiver, selector, mask, const <ir.Primitive>[]); | |
953 } | 946 } |
954 | 947 |
955 /// Create a dynamic setter invocation on [receiver] where the setter name and | 948 /// Create a dynamic setter invocation on [receiver] where the setter name and |
956 /// argument are defined by [selector] and [value], respectively. | 949 /// argument are defined by [selector] and [value], respectively. |
957 ir.Primitive buildDynamicSet(ir.Primitive receiver, | 950 ir.Primitive buildDynamicSet(ir.Primitive receiver, |
958 Selector selector, | 951 Selector selector, |
959 TypeMask mask, | |
960 ir.Primitive value) { | 952 ir.Primitive value) { |
961 assert(selector.isSetter); | 953 assert(selector.isSetter); |
962 _buildInvokeDynamic(receiver, selector, mask, <ir.Primitive>[value]); | 954 _buildInvokeDynamic(receiver, selector, <ir.Primitive>[value]); |
963 return value; | 955 return value; |
964 } | 956 } |
965 | 957 |
966 /// Create a dynamic index set invocation on [receiver] with the provided | 958 /// Create a dynamic index set invocation on [receiver] with the provided |
967 /// [index] and [value]. | 959 /// [index] and [value]. |
968 ir.Primitive buildDynamicIndexSet(ir.Primitive receiver, | 960 ir.Primitive buildDynamicIndexSet(ir.Primitive receiver, |
969 TypeMask mask, | |
970 ir.Primitive index, | 961 ir.Primitive index, |
971 ir.Primitive value) { | 962 ir.Primitive value) { |
972 _buildInvokeDynamic( | 963 _buildInvokeDynamic( |
973 receiver, new Selector.indexSet(), mask, <ir.Primitive>[index, value]); | 964 receiver, new Selector.indexSet(), <ir.Primitive>[index, value]); |
974 return value; | 965 return value; |
975 } | 966 } |
976 | 967 |
977 ir.Primitive _buildLocalGet(LocalElement element); | 968 ir.Primitive _buildLocalGet(LocalElement element); |
978 | 969 |
979 /// Create a read access of the [local] variable or parameter. | 970 /// Create a read access of the [local] variable or parameter. |
980 ir.Primitive buildLocalVariableGet(LocalElement local) { | 971 ir.Primitive buildLocalVariableGet(LocalElement local) { |
981 // TODO(johnniwinther): Separate function access from variable access. | 972 // TODO(johnniwinther): Separate function access from variable access. |
982 return _buildLocalGet(local); | 973 return _buildLocalGet(local); |
983 } | 974 } |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1097 | 1088 |
1098 /// Create a string concatenation of the [arguments]. | 1089 /// Create a string concatenation of the [arguments]. |
1099 ir.Primitive buildStringConcatenation(List<ir.Primitive> arguments) { | 1090 ir.Primitive buildStringConcatenation(List<ir.Primitive> arguments) { |
1100 assert(isOpen); | 1091 assert(isOpen); |
1101 return _continueWithExpression( | 1092 return _continueWithExpression( |
1102 (k) => new ir.ConcatenateStrings(arguments, k)); | 1093 (k) => new ir.ConcatenateStrings(arguments, k)); |
1103 } | 1094 } |
1104 | 1095 |
1105 /// Create an invocation of the `call` method of [functionExpression], where | 1096 /// Create an invocation of the `call` method of [functionExpression], where |
1106 /// the structure of arguments are given by [callStructure]. | 1097 /// the structure of arguments are given by [callStructure]. |
1107 // TODO(johnniwinther): This should take a [TypeMask]. | |
1108 ir.Primitive buildCallInvocation( | 1098 ir.Primitive buildCallInvocation( |
1109 ir.Primitive functionExpression, | 1099 ir.Primitive functionExpression, |
1110 CallStructure callStructure, | 1100 CallStructure callStructure, |
1111 List<ir.Definition> arguments, | 1101 List<ir.Definition> arguments, |
1112 {SourceInformation sourceInformation}) { | 1102 {SourceInformation sourceInformation}) { |
1113 return _buildInvokeCall(functionExpression, callStructure, null, arguments, | 1103 return _buildInvokeCall(functionExpression, callStructure, arguments, |
1114 sourceInformation: sourceInformation); | 1104 sourceInformation: sourceInformation); |
1115 } | 1105 } |
1116 | 1106 |
1117 /// Creates an if-then-else statement with the provided [condition] where the | 1107 /// Creates an if-then-else statement with the provided [condition] where the |
1118 /// then and else branches are created through the [buildThenPart] and | 1108 /// then and else branches are created through the [buildThenPart] and |
1119 /// [buildElsePart] functions, respectively. | 1109 /// [buildElsePart] functions, respectively. |
1120 /// | 1110 /// |
1121 /// An if-then statement is created if [buildElsePart] is a no-op. | 1111 /// An if-then statement is created if [buildElsePart] is a no-op. |
1122 // TODO(johnniwinther): Unify implementation with [buildConditional] and | 1112 // TODO(johnniwinther): Unify implementation with [buildConditional] and |
1123 // [_buildLogicalOperator]. | 1113 // [_buildLogicalOperator]. |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1354 /// variable element, and [variableSelector] defines its write access, | 1344 /// variable element, and [variableSelector] defines its write access, |
1355 /// 3) `v` is an instance variable in which case [variableSelector] | 1345 /// 3) `v` is an instance variable in which case [variableSelector] |
1356 /// defines its write access. | 1346 /// defines its write access. |
1357 /// [buildBody] creates the body, `b`, of the loop. The jump [target] is used | 1347 /// [buildBody] creates the body, `b`, of the loop. The jump [target] is used |
1358 /// to identify which `break` and `continue` statements that have this for-in | 1348 /// to identify which `break` and `continue` statements that have this for-in |
1359 /// statement as their target. | 1349 /// statement as their target. |
1360 void buildForIn({SubbuildFunction buildExpression, | 1350 void buildForIn({SubbuildFunction buildExpression, |
1361 SubbuildFunction buildVariableDeclaration, | 1351 SubbuildFunction buildVariableDeclaration, |
1362 Element variableElement, | 1352 Element variableElement, |
1363 Selector variableSelector, | 1353 Selector variableSelector, |
1364 TypeMask variableMask, | |
1365 TypeMask currentMask, | |
1366 TypeMask iteratorMask, | |
1367 TypeMask moveNextMask, | |
1368 SubbuildFunction buildBody, | 1354 SubbuildFunction buildBody, |
1369 JumpTarget target, | 1355 JumpTarget target, |
1370 ClosureScope closureScope}) { | 1356 ClosureScope closureScope}) { |
1371 // The for-in loop | 1357 // The for-in loop |
1372 // | 1358 // |
1373 // for (a in e) s; | 1359 // for (a in e) s; |
1374 // | 1360 // |
1375 // Is compiled analogously to: | 1361 // Is compiled analogously to: |
1376 // | 1362 // |
1377 // it = e.iterator; | 1363 // it = e.iterator; |
1378 // while (it.moveNext()) { | 1364 // while (it.moveNext()) { |
1379 // var a = it.current; | 1365 // var a = it.current; |
1380 // s; | 1366 // s; |
1381 // } | 1367 // } |
1382 | 1368 |
1383 // Fill the current hole with: | 1369 // Fill the current hole with: |
1384 // let prim expressionReceiver = [[e]] in | 1370 // let prim expressionReceiver = [[e]] in |
1385 // let cont iteratorInvoked(iterator) = | 1371 // let cont iteratorInvoked(iterator) = |
1386 // [ ] | 1372 // [ ] |
1387 // in expressionReceiver.iterator () iteratorInvoked | 1373 // in expressionReceiver.iterator () iteratorInvoked |
1388 ir.Primitive expressionReceiver = buildExpression(this); | 1374 ir.Primitive expressionReceiver = buildExpression(this); |
1389 List<ir.Primitive> emptyArguments = <ir.Primitive>[]; | 1375 List<ir.Primitive> emptyArguments = <ir.Primitive>[]; |
1390 ir.Parameter iterator = new ir.Parameter(null); | 1376 ir.Parameter iterator = new ir.Parameter(null); |
1391 ir.Continuation iteratorInvoked = new ir.Continuation([iterator]); | 1377 ir.Continuation iteratorInvoked = new ir.Continuation([iterator]); |
1392 add(new ir.LetCont(iteratorInvoked, | 1378 add(new ir.LetCont(iteratorInvoked, |
1393 new ir.InvokeMethod(expressionReceiver, | 1379 new ir.InvokeMethod(expressionReceiver, |
1394 new Selector.getter("iterator", null), | 1380 new Selector.getter("iterator", null), |
1395 iteratorMask, | |
1396 emptyArguments, | 1381 emptyArguments, |
1397 iteratorInvoked))); | 1382 iteratorInvoked))); |
1398 | 1383 |
1399 // Fill with: | 1384 // Fill with: |
1400 // let cont loop(x, ...) = | 1385 // let cont loop(x, ...) = |
1401 // let cont moveNextInvoked(condition) = | 1386 // let cont moveNextInvoked(condition) = |
1402 // [ ] | 1387 // [ ] |
1403 // in iterator.moveNext () moveNextInvoked | 1388 // in iterator.moveNext () moveNextInvoked |
1404 // in loop(v, ...) | 1389 // in loop(v, ...) |
1405 JumpCollector loop = new BackwardJumpCollector(environment, target: target); | 1390 JumpCollector loop = new BackwardJumpCollector(environment, target: target); |
1406 addRecursiveContinuation(loop); | 1391 addRecursiveContinuation(loop); |
1407 ir.Parameter condition = new ir.Parameter(null); | 1392 ir.Parameter condition = new ir.Parameter(null); |
1408 ir.Continuation moveNextInvoked = new ir.Continuation([condition]); | 1393 ir.Continuation moveNextInvoked = new ir.Continuation([condition]); |
1409 add(new ir.LetCont(moveNextInvoked, | 1394 add(new ir.LetCont(moveNextInvoked, |
1410 new ir.InvokeMethod(iterator, | 1395 new ir.InvokeMethod(iterator, |
1411 new Selector.call("moveNext", null, 0), | 1396 new Selector.call("moveNext", null, 0), |
1412 moveNextMask, | |
1413 emptyArguments, | 1397 emptyArguments, |
1414 moveNextInvoked))); | 1398 moveNextInvoked))); |
1415 | 1399 |
1416 // As a delimited term, build: | 1400 // As a delimited term, build: |
1417 // <<BODY>> = | 1401 // <<BODY>> = |
1418 // _enterScope(); | 1402 // _enterScope(); |
1419 // [[variableDeclaration]] | 1403 // [[variableDeclaration]] |
1420 // let cont currentInvoked(currentValue) = | 1404 // let cont currentInvoked(currentValue) = |
1421 // [[a = currentValue]]; | 1405 // [[a = currentValue]]; |
1422 // [ ] | 1406 // [ ] |
1423 // in iterator.current () currentInvoked | 1407 // in iterator.current () currentInvoked |
1424 IrBuilder bodyBuilder = makeDelimitedBuilder(); | 1408 IrBuilder bodyBuilder = makeDelimitedBuilder(); |
1425 bodyBuilder._enterScope(closureScope); | 1409 bodyBuilder._enterScope(closureScope); |
1426 if (buildVariableDeclaration != null) { | 1410 if (buildVariableDeclaration != null) { |
1427 buildVariableDeclaration(bodyBuilder); | 1411 buildVariableDeclaration(bodyBuilder); |
1428 } | 1412 } |
1429 ir.Parameter currentValue = new ir.Parameter(null); | 1413 ir.Parameter currentValue = new ir.Parameter(null); |
1430 ir.Continuation currentInvoked = new ir.Continuation([currentValue]); | 1414 ir.Continuation currentInvoked = new ir.Continuation([currentValue]); |
1431 bodyBuilder.add(new ir.LetCont(currentInvoked, | 1415 bodyBuilder.add(new ir.LetCont(currentInvoked, |
1432 new ir.InvokeMethod( | 1416 new ir.InvokeMethod(iterator, new Selector.getter("current", null), |
1433 iterator, | |
1434 new Selector.getter("current", null), | |
1435 currentMask, | |
1436 emptyArguments, currentInvoked))); | 1417 emptyArguments, currentInvoked))); |
1437 // TODO(sra): Does this cover all cases? The general setter case include | 1418 // TODO(sra): Does this cover all cases? The general setter case include |
1438 // super. | 1419 // super. |
1439 // TODO(johnniwinther): Extract this as a provided strategy. | 1420 // TODO(johnniwinther): Extract this as a provided strategy. |
1440 if (Elements.isLocal(variableElement)) { | 1421 if (Elements.isLocal(variableElement)) { |
1441 bodyBuilder.buildLocalVariableSet(variableElement, currentValue); | 1422 bodyBuilder.buildLocalVariableSet(variableElement, currentValue); |
1442 } else if (Elements.isErroneous(variableElement)) { | 1423 } else if (Elements.isErroneous(variableElement)) { |
1443 bodyBuilder.buildErroneousInvocation(variableElement, | 1424 bodyBuilder.buildErroneousInvocation(variableElement, |
1444 new Selector.setter(variableElement.name, variableElement.library), | 1425 new Selector.setter(variableElement.name, variableElement.library), |
1445 <ir.Primitive>[currentValue]); | 1426 <ir.Primitive>[currentValue]); |
1446 } else if (Elements.isStaticOrTopLevel(variableElement)) { | 1427 } else if (Elements.isStaticOrTopLevel(variableElement)) { |
1447 if (variableElement.isField) { | 1428 if (variableElement.isField) { |
1448 bodyBuilder.buildStaticFieldSet(variableElement, currentValue); | 1429 bodyBuilder.buildStaticFieldSet(variableElement, currentValue); |
1449 } else { | 1430 } else { |
1450 bodyBuilder.buildStaticSetterSet(variableElement, currentValue); | 1431 bodyBuilder.buildStaticSetterSet(variableElement, currentValue); |
1451 } | 1432 } |
1452 } else { | 1433 } else { |
1453 ir.Primitive receiver = bodyBuilder.buildThis(); | 1434 ir.Primitive receiver = bodyBuilder.buildThis(); |
1454 assert(receiver != null); | 1435 assert(receiver != null); |
1455 bodyBuilder.buildDynamicSet( | 1436 bodyBuilder.buildDynamicSet(receiver, variableSelector, currentValue); |
1456 receiver, variableSelector, variableMask, currentValue); | |
1457 } | 1437 } |
1458 | 1438 |
1459 // Translate the body in the hole in the delimited term above, and add | 1439 // Translate the body in the hole in the delimited term above, and add |
1460 // a jump to the loop if control flow is live after the body. | 1440 // a jump to the loop if control flow is live after the body. |
1461 JumpCollector breakCollector = | 1441 JumpCollector breakCollector = |
1462 new ForwardJumpCollector(environment, target: target); | 1442 new ForwardJumpCollector(environment, target: target); |
1463 state.breakCollectors.add(breakCollector); | 1443 state.breakCollectors.add(breakCollector); |
1464 state.continueCollectors.add(loop); | 1444 state.continueCollectors.add(loop); |
1465 buildBody(bodyBuilder); | 1445 buildBody(bodyBuilder); |
1466 assert(state.breakCollectors.last == breakCollector); | 1446 assert(state.breakCollectors.last == breakCollector); |
(...skipping 1077 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2544 final DartType type; | 2524 final DartType type; |
2545 final LocalVariableElement exceptionVariable; | 2525 final LocalVariableElement exceptionVariable; |
2546 final LocalVariableElement stackTraceVariable; | 2526 final LocalVariableElement stackTraceVariable; |
2547 final SubbuildFunction buildCatchBlock; | 2527 final SubbuildFunction buildCatchBlock; |
2548 | 2528 |
2549 CatchClauseInfo({this.type, | 2529 CatchClauseInfo({this.type, |
2550 this.exceptionVariable, | 2530 this.exceptionVariable, |
2551 this.stackTraceVariable, | 2531 this.stackTraceVariable, |
2552 this.buildCatchBlock}); | 2532 this.buildCatchBlock}); |
2553 } | 2533 } |
OLD | NEW |