| 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_task; | 5 library dart2js.ir_builder_task; |
| 6 | 6 |
| 7 import '../closure.dart' as closurelib; | 7 import '../closure.dart' as closurelib; |
| 8 import '../closure.dart' hide ClosureScope; | 8 import '../closure.dart' hide ClosureScope; |
| 9 import '../constants/expressions.dart'; | 9 import '../constants/expressions.dart'; |
| 10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 */ | 136 */ |
| 137 // TODO(johnniwinther): Implement [SemanticDeclVisitor]. | 137 // TODO(johnniwinther): Implement [SemanticDeclVisitor]. |
| 138 abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> | 138 abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
| 139 with IrBuilderMixin<ast.Node>, | 139 with IrBuilderMixin<ast.Node>, |
| 140 SemanticSendResolvedMixin<ir.Primitive, dynamic>, | 140 SemanticSendResolvedMixin<ir.Primitive, dynamic>, |
| 141 SendResolverMixin, | 141 SendResolverMixin, |
| 142 BaseImplementationOfStaticsMixin<ir.Primitive, dynamic>, | 142 BaseImplementationOfStaticsMixin<ir.Primitive, dynamic>, |
| 143 BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>, | 143 BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>, |
| 144 BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>, | 144 BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>, |
| 145 BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>, | 145 BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>, |
| 146 BaseImplementationOfSuperIncDecsMixin<ir.Primitive, dynamic>, | 146 BaseImplementationOfNewMixin<ir.Primitive, dynamic>, |
| 147 BaseImplementationOfNewMixin<ir.Primitive, dynamic> | 147 BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>, |
| 148 BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic> |
| 148 implements SemanticSendVisitor<ir.Primitive, dynamic> { | 149 implements SemanticSendVisitor<ir.Primitive, dynamic> { |
| 149 final TreeElements elements; | 150 final TreeElements elements; |
| 150 final Compiler compiler; | 151 final Compiler compiler; |
| 151 final SourceInformationBuilder sourceInformationBuilder; | 152 final SourceInformationBuilder sourceInformationBuilder; |
| 152 | 153 |
| 153 /// A map from try statements in the source to analysis information about | 154 /// A map from try statements in the source to analysis information about |
| 154 /// them. | 155 /// them. |
| 155 /// | 156 /// |
| 156 /// The analysis information includes the set of variables that must be | 157 /// The analysis information includes the set of variables that must be |
| 157 /// copied into [ir.MutableVariable]s on entry to the try and copied out on | 158 /// copied into [ir.MutableVariable]s on entry to the try and copied out on |
| (...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1239 @override | 1240 @override |
| 1240 ir.Primitive visitSuperIndexSet( | 1241 ir.Primitive visitSuperIndexSet( |
| 1241 ast.SendSet node, | 1242 ast.SendSet node, |
| 1242 FunctionElement function, | 1243 FunctionElement function, |
| 1243 ast.Node index, | 1244 ast.Node index, |
| 1244 ast.Node rhs, | 1245 ast.Node rhs, |
| 1245 _) { | 1246 _) { |
| 1246 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); | 1247 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); |
| 1247 } | 1248 } |
| 1248 | 1249 |
| 1249 @override | 1250 ir.Primitive translateCompounds( |
| 1250 ir.Primitive visitCompoundIndexSet( | |
| 1251 ast.SendSet node, | |
| 1252 ast.Node receiver, | |
| 1253 ast.Node index, | |
| 1254 op.AssignmentOperator operator, | |
| 1255 ast.Node rhs, | |
| 1256 _) { | |
| 1257 ir.Primitive target = visit(receiver); | |
| 1258 ir.Primitive indexValue = visit(index); | |
| 1259 return translateCompound( | |
| 1260 getValue: () { | |
| 1261 Selector selector = new Selector.index(); | |
| 1262 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; | |
| 1263 arguments = | |
| 1264 normalizeDynamicArguments(selector.callStructure, arguments); | |
| 1265 return irBuilder.buildDynamicInvocation(target, selector, arguments); | |
| 1266 }, | |
| 1267 operator: operator, | |
| 1268 rhs: rhs, | |
| 1269 setValue: (ir.Primitive result) { | |
| 1270 irBuilder.buildDynamicIndexSet(target, indexValue, result); | |
| 1271 }); | |
| 1272 } | |
| 1273 | |
| 1274 @override | |
| 1275 ir.Primitive visitSuperCompoundIndexSet( | |
| 1276 ast.SendSet node, | |
| 1277 FunctionElement getter, | |
| 1278 FunctionElement setter, | |
| 1279 ast.Node index, | |
| 1280 op.AssignmentOperator operator, | |
| 1281 ast.Node rhs, | |
| 1282 _) { | |
| 1283 ir.Primitive indexValue = visit(index); | |
| 1284 return translateCompound( | |
| 1285 getValue: () { | |
| 1286 return irBuilder.buildSuperIndex(getter, indexValue); | |
| 1287 }, | |
| 1288 operator: operator, | |
| 1289 rhs: rhs, | |
| 1290 setValue: (ir.Primitive result) { | |
| 1291 irBuilder.buildSuperIndexSet(setter, indexValue, result); | |
| 1292 }); | |
| 1293 } | |
| 1294 | |
| 1295 ir.Primitive translatePrefixPostfix( | |
| 1296 {ir.Primitive getValue(), | 1251 {ir.Primitive getValue(), |
| 1297 op.IncDecOperator operator, | 1252 CompoundRhs rhs, |
| 1298 void setValue(ir.Primitive value), | 1253 void setValue(ir.Primitive value)}) { |
| 1299 bool isPrefix}) { | |
| 1300 ir.Primitive value = getValue(); | 1254 ir.Primitive value = getValue(); |
| 1301 Selector operatorSelector = | 1255 Selector operatorSelector = |
| 1302 new Selector.binaryOperator(operator.selectorName); | 1256 new Selector.binaryOperator(rhs.operator.selectorName); |
| 1303 List<ir.Primitive> arguments = | 1257 ir.Primitive rhsValue; |
| 1304 <ir.Primitive>[irBuilder.buildIntegerConstant(1)]; | 1258 if (rhs.kind == CompoundKind.ASSIGNMENT) { |
| 1259 rhsValue = visit(rhs.rhs); |
| 1260 } else { |
| 1261 rhsValue = irBuilder.buildIntegerConstant(1); |
| 1262 } |
| 1263 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; |
| 1305 arguments = normalizeDynamicArguments( | 1264 arguments = normalizeDynamicArguments( |
| 1306 operatorSelector.callStructure, arguments); | 1265 operatorSelector.callStructure, arguments); |
| 1307 ir.Primitive result = | 1266 ir.Primitive result = |
| 1308 irBuilder.buildDynamicInvocation(value, operatorSelector, arguments); | 1267 irBuilder.buildDynamicInvocation(value, operatorSelector, arguments); |
| 1309 setValue(result); | 1268 setValue(result); |
| 1310 return isPrefix ? result : value; | 1269 return rhs.kind == CompoundKind.POSTFIX ? value : result; |
| 1311 } | |
| 1312 | |
| 1313 ir.Primitive translateCompound( | |
| 1314 {ir.Primitive getValue(), | |
| 1315 op.AssignmentOperator operator, | |
| 1316 ast.Node rhs, | |
| 1317 void setValue(ir.Primitive value)}) { | |
| 1318 ir.Primitive value = getValue(); | |
| 1319 Selector operatorSelector = | |
| 1320 new Selector.binaryOperator(operator.selectorName); | |
| 1321 List<ir.Primitive> arguments = <ir.Primitive>[visit(rhs)]; | |
| 1322 arguments = normalizeDynamicArguments( | |
| 1323 operatorSelector.callStructure, arguments); | |
| 1324 ir.Primitive result = | |
| 1325 irBuilder.buildDynamicInvocation(value, operatorSelector, arguments); | |
| 1326 setValue(result); | |
| 1327 return result; | |
| 1328 } | 1270 } |
| 1329 | 1271 |
| 1330 @override | 1272 @override |
| 1331 ir.Primitive handleDynamicCompound( | |
| 1332 ast.Send node, | |
| 1333 ast.Node receiver, | |
| 1334 op.AssignmentOperator operator, | |
| 1335 ast.Node rhs, | |
| 1336 Selector getterSelector, | |
| 1337 Selector setterSelector, | |
| 1338 _) { | |
| 1339 ir.Primitive target = translateReceiver(receiver); | |
| 1340 return translateCompound( | |
| 1341 getValue: () => irBuilder.buildDynamicGet(target, getterSelector), | |
| 1342 operator: operator, | |
| 1343 rhs: rhs, | |
| 1344 setValue: (ir.Primitive result) { | |
| 1345 irBuilder.buildDynamicSet(target, setterSelector, result); | |
| 1346 }); | |
| 1347 } | |
| 1348 | |
| 1349 @override | |
| 1350 ir.Primitive handleDynamicPostfixPrefix( | |
| 1351 ast.Send node, | |
| 1352 ast.Node receiver, | |
| 1353 op.IncDecOperator operator, | |
| 1354 Selector getterSelector, | |
| 1355 Selector setterSelector, | |
| 1356 arg, | |
| 1357 {bool isPrefix}) { | |
| 1358 ir.Primitive target = translateReceiver(receiver); | |
| 1359 return translatePrefixPostfix( | |
| 1360 getValue: () => irBuilder.buildDynamicGet(target, getterSelector), | |
| 1361 operator: operator, | |
| 1362 setValue: (ir.Primitive result) { | |
| 1363 irBuilder.buildDynamicSet(target, setterSelector, result); | |
| 1364 }, | |
| 1365 isPrefix: isPrefix); | |
| 1366 } | |
| 1367 | |
| 1368 @override | |
| 1369 ir.Primitive handleDynamicSet( | 1273 ir.Primitive handleDynamicSet( |
| 1370 ast.SendSet node, | 1274 ast.SendSet node, |
| 1371 ast.Node receiver, | 1275 ast.Node receiver, |
| 1372 Selector selector, | 1276 Selector selector, |
| 1373 ast.Node rhs, | 1277 ast.Node rhs, |
| 1374 _) { | 1278 _) { |
| 1375 return irBuilder.buildDynamicSet( | 1279 return irBuilder.buildDynamicSet( |
| 1376 translateReceiver(receiver), | 1280 translateReceiver(receiver), |
| 1377 selector, | 1281 selector, |
| 1378 visit(rhs)); | 1282 visit(rhs)); |
| 1379 } | 1283 } |
| 1380 | 1284 |
| 1381 @override | 1285 @override |
| 1382 ir.Primitive handleLocalCompound( | |
| 1383 ast.Send node, | |
| 1384 LocalElement element, | |
| 1385 op.AssignmentOperator operator, | |
| 1386 ast.Node rhs, | |
| 1387 _) { | |
| 1388 return translateCompound( | |
| 1389 getValue: () => irBuilder.buildLocalVariableGet(element), | |
| 1390 operator: operator, | |
| 1391 rhs: rhs, | |
| 1392 setValue: (ir.Primitive result) { | |
| 1393 irBuilder.buildLocalVariableSet(element, result); | |
| 1394 }); | |
| 1395 } | |
| 1396 | |
| 1397 @override | |
| 1398 ir.Primitive handleLocalPostfixPrefix( | |
| 1399 ast.Send node, | |
| 1400 LocalElement element, | |
| 1401 op.IncDecOperator operator, | |
| 1402 arg, | |
| 1403 {bool isPrefix}) { | |
| 1404 return translatePrefixPostfix( | |
| 1405 getValue: () => irBuilder.buildLocalVariableGet(element), | |
| 1406 operator: operator, | |
| 1407 setValue: (ir.Primitive result) { | |
| 1408 irBuilder.buildLocalVariableSet(element, result); | |
| 1409 }, | |
| 1410 isPrefix: isPrefix); | |
| 1411 } | |
| 1412 | |
| 1413 @override | |
| 1414 ir.Primitive handleLocalSet( | 1286 ir.Primitive handleLocalSet( |
| 1415 ast.SendSet node, | 1287 ast.SendSet node, |
| 1416 LocalElement element, | 1288 LocalElement element, |
| 1417 ast.Node rhs, | 1289 ast.Node rhs, |
| 1418 _) { | 1290 _) { |
| 1419 return irBuilder.buildLocalVariableSet(element, visit(rhs)); | 1291 return irBuilder.buildLocalVariableSet(element, visit(rhs)); |
| 1420 } | 1292 } |
| 1421 | 1293 |
| 1422 @override | 1294 @override |
| 1423 ir.Primitive handleStaticFieldCompound( | |
| 1424 ast.Send node, | |
| 1425 FieldElement field, | |
| 1426 op.AssignmentOperator operator, | |
| 1427 ast.Node rhs, | |
| 1428 _) { | |
| 1429 SourceInformation src = sourceInformationBuilder.buildGet(node); | |
| 1430 return translateCompound( | |
| 1431 getValue: () => buildStaticFieldGet(field, src), | |
| 1432 operator: operator, | |
| 1433 rhs: rhs, | |
| 1434 setValue: (ir.Primitive result) { | |
| 1435 irBuilder.buildStaticFieldSet(field, result); | |
| 1436 }); | |
| 1437 } | |
| 1438 | |
| 1439 @override | |
| 1440 ir.Primitive handleStaticFieldPostfixPrefix( | |
| 1441 ast.Send node, | |
| 1442 FieldElement field, | |
| 1443 op.IncDecOperator operator, | |
| 1444 arg, | |
| 1445 {bool isPrefix}) { | |
| 1446 SourceInformation src = sourceInformationBuilder.buildGet(node); | |
| 1447 return translatePrefixPostfix( | |
| 1448 getValue: () => buildStaticFieldGet(field, src), | |
| 1449 operator: operator, | |
| 1450 setValue: (ir.Primitive result) { | |
| 1451 irBuilder.buildStaticFieldSet(field, result); | |
| 1452 }, | |
| 1453 isPrefix: isPrefix); | |
| 1454 } | |
| 1455 | |
| 1456 @override | |
| 1457 ir.Primitive handleStaticFieldSet( | 1295 ir.Primitive handleStaticFieldSet( |
| 1458 ast.SendSet node, | 1296 ast.SendSet node, |
| 1459 FieldElement field, | 1297 FieldElement field, |
| 1460 ast.Node rhs, | 1298 ast.Node rhs, |
| 1461 _) { | 1299 _) { |
| 1462 return irBuilder.buildStaticFieldSet(field, visit(rhs)); | 1300 return irBuilder.buildStaticFieldSet(field, visit(rhs)); |
| 1463 } | 1301 } |
| 1464 | 1302 |
| 1465 @override | 1303 @override |
| 1466 ir.Primitive visitSuperFieldSet( | 1304 ir.Primitive visitSuperFieldSet( |
| 1467 ast.SendSet node, | 1305 ast.SendSet node, |
| 1468 FieldElement field, | 1306 FieldElement field, |
| 1469 ast.Node rhs, | 1307 ast.Node rhs, |
| 1470 _) { | 1308 _) { |
| 1471 return irBuilder.buildSuperFieldSet(field, visit(rhs)); | 1309 return irBuilder.buildSuperFieldSet(field, visit(rhs)); |
| 1472 } | 1310 } |
| 1473 | 1311 |
| 1474 @override | 1312 @override |
| 1475 ir.Primitive visitSuperSetterSet( | 1313 ir.Primitive visitSuperSetterSet( |
| 1476 ast.SendSet node, | 1314 ast.SendSet node, |
| 1477 FunctionElement setter, | 1315 FunctionElement setter, |
| 1478 ast.Node rhs, | 1316 ast.Node rhs, |
| 1479 _) { | 1317 _) { |
| 1480 return irBuilder.buildSuperSetterSet(setter, visit(rhs)); | 1318 return irBuilder.buildSuperSetterSet(setter, visit(rhs)); |
| 1481 } | 1319 } |
| 1482 | 1320 |
| 1483 @override | 1321 @override |
| 1484 ir.Primitive handleStaticGetterSetterCompound( | 1322 ir.Primitive visitUnresolvedSuperIndexSet( |
| 1485 ast.Send node, | 1323 ast.Send node, |
| 1486 FunctionElement getter, | 1324 Element element, |
| 1325 ast.Node index, |
| 1326 ast.Node rhs, |
| 1327 arg) { |
| 1328 return giveup(node, 'visitUnresolvedSuperIndexSet'); |
| 1329 } |
| 1330 |
| 1331 @override |
| 1332 ir.Primitive handleStaticSetterSet( |
| 1333 ast.SendSet node, |
| 1487 FunctionElement setter, | 1334 FunctionElement setter, |
| 1488 op.AssignmentOperator operator, | |
| 1489 ast.Node rhs, | 1335 ast.Node rhs, |
| 1490 _) { | 1336 _) { |
| 1491 return translateCompound( | 1337 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); |
| 1492 getValue: () => irBuilder.buildStaticGetterGet(getter), | 1338 } |
| 1493 operator: operator, | 1339 |
| 1494 rhs: rhs, | 1340 @override |
| 1495 setValue: (ir.Primitive result) { | 1341 ir.Primitive handleTypeLiteralConstantCompounds( |
| 1496 irBuilder.buildStaticSetterSet(setter, result); | 1342 ast.SendSet node, |
| 1497 }); | 1343 ConstantExpression constant, |
| 1498 } | 1344 CompoundRhs rhs, |
| 1499 | 1345 arg) { |
| 1500 @override | 1346 return translateCompounds( |
| 1501 ir.Primitive handleSuperFieldFieldPostfixPrefix( | 1347 getValue: () => irBuilder.buildConstant(constant), |
| 1502 ast.Send node, | 1348 rhs: rhs, |
| 1503 FieldElement readField, | 1349 setValue: (value) {}); // The binary operator will throw before this. |
| 1504 FieldElement writtenField, | 1350 } |
| 1505 op.IncDecOperator operator, | 1351 |
| 1506 arg, | 1352 @override |
| 1507 {bool isPrefix}) { | 1353 ir.Primitive handleDynamicCompounds( |
| 1508 return translatePrefixPostfix( | |
| 1509 getValue: () => irBuilder.buildSuperFieldGet(readField), | |
| 1510 operator: operator, | |
| 1511 setValue: (ir.Primitive result) { | |
| 1512 irBuilder.buildSuperFieldSet(writtenField, result); | |
| 1513 }, | |
| 1514 isPrefix: isPrefix); | |
| 1515 } | |
| 1516 | |
| 1517 @override | |
| 1518 ir.Primitive handleSuperFieldSetterPostfixPrefix( | |
| 1519 ast.Send node, | |
| 1520 FieldElement field, | |
| 1521 FunctionElement setter, | |
| 1522 op.IncDecOperator operator, | |
| 1523 arg, | |
| 1524 {bool isPrefix}) { | |
| 1525 return translatePrefixPostfix( | |
| 1526 getValue: () => irBuilder.buildSuperFieldGet(field), | |
| 1527 operator: operator, | |
| 1528 setValue: (ir.Primitive result) { | |
| 1529 irBuilder.buildSuperSetterSet(setter, result); | |
| 1530 }, | |
| 1531 isPrefix: isPrefix); | |
| 1532 } | |
| 1533 | |
| 1534 @override | |
| 1535 ir.Primitive handleSuperGetterFieldPostfixPrefix( | |
| 1536 ast.Send node, | |
| 1537 FunctionElement getter, | |
| 1538 FieldElement field, | |
| 1539 op.IncDecOperator operator, | |
| 1540 arg, | |
| 1541 {bool isPrefix}) { | |
| 1542 return translatePrefixPostfix( | |
| 1543 getValue: () => irBuilder.buildSuperGetterGet(getter), | |
| 1544 operator: operator, | |
| 1545 setValue: (ir.Primitive result) { | |
| 1546 irBuilder.buildSuperFieldSet(field, result); | |
| 1547 }, | |
| 1548 isPrefix: isPrefix); | |
| 1549 } | |
| 1550 | |
| 1551 @override | |
| 1552 ir.Primitive handleSuperGetterSetterPostfixPrefix( | |
| 1553 ast.Send node, | |
| 1554 FunctionElement getter, | |
| 1555 FunctionElement setter, | |
| 1556 op.IncDecOperator operator, | |
| 1557 arg, | |
| 1558 {bool isPrefix}) { | |
| 1559 return translatePrefixPostfix( | |
| 1560 getValue: () => irBuilder.buildSuperGetterGet(getter), | |
| 1561 operator: operator, | |
| 1562 setValue: (ir.Primitive result) { | |
| 1563 irBuilder.buildSuperSetterSet(setter, result); | |
| 1564 }, | |
| 1565 isPrefix: isPrefix); | |
| 1566 } | |
| 1567 | |
| 1568 @override | |
| 1569 ir.Primitive handleSuperMethodSetterPostfixPrefix( | |
| 1570 ast.Send node, | |
| 1571 FunctionElement method, | |
| 1572 FunctionElement setter, | |
| 1573 op.IncDecOperator operator, | |
| 1574 arg, | |
| 1575 {bool isPrefix}) { | |
| 1576 return translatePrefixPostfix( | |
| 1577 getValue: () => irBuilder.buildSuperMethodGet(method), | |
| 1578 operator: operator, | |
| 1579 setValue: (ir.Primitive result) { | |
| 1580 irBuilder.buildSuperSetterSet(setter, result); | |
| 1581 }, | |
| 1582 isPrefix: isPrefix); | |
| 1583 } | |
| 1584 | |
| 1585 @override | |
| 1586 ir.Primitive handleStaticGetterSetterPostfixPrefix( | |
| 1587 ast.Send node, | |
| 1588 FunctionElement getter, | |
| 1589 FunctionElement setter, | |
| 1590 op.IncDecOperator operator, | |
| 1591 arg, | |
| 1592 {bool isPrefix}) { | |
| 1593 return translatePrefixPostfix( | |
| 1594 getValue: () => irBuilder.buildStaticGetterGet(getter), | |
| 1595 operator: operator, | |
| 1596 setValue: (ir.Primitive result) { | |
| 1597 irBuilder.buildStaticSetterSet(setter, result); | |
| 1598 }, | |
| 1599 isPrefix: isPrefix); | |
| 1600 } | |
| 1601 | |
| 1602 @override | |
| 1603 ir.Primitive handleStaticMethodSetterCompound( | |
| 1604 ast.Send node, | |
| 1605 FunctionElement method, | |
| 1606 FunctionElement setter, | |
| 1607 op.AssignmentOperator operator, | |
| 1608 ast.Node rhs, | |
| 1609 _) { | |
| 1610 return translateCompound( | |
| 1611 getValue: () => irBuilder.buildStaticFunctionGet(method), | |
| 1612 operator: operator, | |
| 1613 rhs: rhs, | |
| 1614 setValue: (ir.Primitive result) { | |
| 1615 irBuilder.buildStaticSetterSet(setter, result); | |
| 1616 }); | |
| 1617 } | |
| 1618 | |
| 1619 @override | |
| 1620 ir.Primitive handleStaticMethodSetterPostfixPrefix( | |
| 1621 ast.Send node, | |
| 1622 FunctionElement getter, | |
| 1623 FunctionElement setter, | |
| 1624 op.IncDecOperator operator, | |
| 1625 arg, | |
| 1626 {bool isPrefix}) { | |
| 1627 return translatePrefixPostfix( | |
| 1628 getValue: () => irBuilder.buildStaticFunctionGet(getter), | |
| 1629 operator: operator, | |
| 1630 setValue: (ir.Primitive result) { | |
| 1631 irBuilder.buildStaticSetterSet(setter, result); | |
| 1632 }, | |
| 1633 isPrefix: isPrefix); | |
| 1634 } | |
| 1635 | |
| 1636 @override | |
| 1637 ir.Primitive handleDynamicIndexPostfixPrefix( | |
| 1638 ast.Send node, | 1354 ast.Send node, |
| 1639 ast.Node receiver, | 1355 ast.Node receiver, |
| 1356 CompoundRhs rhs, |
| 1357 Selector getterSelector, |
| 1358 Selector setterSelector, |
| 1359 arg) { |
| 1360 ir.Primitive target = translateReceiver(receiver); |
| 1361 return translateCompounds( |
| 1362 getValue: () => irBuilder.buildDynamicGet(target, getterSelector), |
| 1363 rhs: rhs, |
| 1364 setValue: (ir.Primitive result) { |
| 1365 irBuilder.buildDynamicSet(target, setterSelector, result); |
| 1366 }); |
| 1367 } |
| 1368 |
| 1369 ir.Primitive buildLocalNoSuchSetter(Local local, ir.Primitive value) { |
| 1370 Selector selector = new Selector.setter(local.name, null); |
| 1371 return buildStaticNoSuchMethod(selector, [value]); |
| 1372 } |
| 1373 |
| 1374 @override |
| 1375 ir.Primitive handleLocalCompounds( |
| 1376 ast.SendSet node, |
| 1377 LocalElement local, |
| 1378 CompoundRhs rhs, |
| 1379 arg, |
| 1380 {bool isSetterValid}) { |
| 1381 return translateCompounds( |
| 1382 getValue: () { |
| 1383 if (local.isFunction) { |
| 1384 return irBuilder.buildLocalFunctionGet(local); |
| 1385 } else { |
| 1386 return irBuilder.buildLocalVariableGet(local); |
| 1387 } |
| 1388 }, |
| 1389 rhs: rhs, |
| 1390 setValue: (ir.Primitive result) { |
| 1391 if (isSetterValid) { |
| 1392 irBuilder.buildLocalVariableSet(local, result); |
| 1393 } else { |
| 1394 return buildLocalNoSuchSetter(local, result); |
| 1395 } |
| 1396 }); |
| 1397 } |
| 1398 |
| 1399 ir.Primitive buildStaticNoSuchGetter(Element element) { |
| 1400 return buildStaticNoSuchMethod( |
| 1401 new Selector.getter(element.name, element.library), |
| 1402 const <ir.Primitive>[]); |
| 1403 } |
| 1404 |
| 1405 ir.Primitive buildStaticNoSuchSetter(Element element, ir.Primitive value) { |
| 1406 return buildStaticNoSuchMethod( |
| 1407 new Selector.setter(element.name, element.library), |
| 1408 <ir.Primitive>[value]); |
| 1409 } |
| 1410 |
| 1411 @override |
| 1412 ir.Primitive handleStaticCompounds( |
| 1413 ast.SendSet node, |
| 1414 Element getter, |
| 1415 CompoundGetter getterKind, |
| 1416 Element setter, |
| 1417 CompoundSetter setterKind, |
| 1418 CompoundRhs rhs, |
| 1419 arg) { |
| 1420 return translateCompounds( |
| 1421 getValue: () { |
| 1422 switch (getterKind) { |
| 1423 case CompoundGetter.FIELD: |
| 1424 SourceInformation src = sourceInformationBuilder.buildGet(node); |
| 1425 return irBuilder.buildStaticFieldGet(getter, src); |
| 1426 case CompoundGetter.GETTER: |
| 1427 return irBuilder.buildStaticGetterGet(getter); |
| 1428 case CompoundGetter.METHOD: |
| 1429 return irBuilder.buildStaticFunctionGet(getter); |
| 1430 case CompoundGetter.UNRESOLVED: |
| 1431 return buildStaticNoSuchGetter(getter); |
| 1432 } |
| 1433 }, |
| 1434 rhs: rhs, |
| 1435 setValue: (ir.Primitive result) { |
| 1436 switch (setterKind) { |
| 1437 case CompoundSetter.FIELD: |
| 1438 return irBuilder.buildStaticFieldSet(setter, result); |
| 1439 case CompoundSetter.SETTER: |
| 1440 return irBuilder.buildStaticSetterSet(setter, result); |
| 1441 case CompoundSetter.INVALID: |
| 1442 // TODO(johnniwinther): Ensure [setter] is non null. |
| 1443 return buildStaticNoSuchSetter( |
| 1444 setter != null ? setter : getter, result); |
| 1445 } |
| 1446 }); |
| 1447 } |
| 1448 |
| 1449 ir.Primitive buildSuperNoSuchGetter(Element element) { |
| 1450 return buildInstanceNoSuchMethod( |
| 1451 new Selector.getter(element.name, element.library), |
| 1452 const <ir.Primitive>[]); |
| 1453 } |
| 1454 |
| 1455 ir.Primitive buildSuperNoSuchSetter(Element element, ir.Primitive value) { |
| 1456 return buildInstanceNoSuchMethod( |
| 1457 new Selector.setter(element.name, element.library), |
| 1458 <ir.Primitive>[value]); |
| 1459 } |
| 1460 |
| 1461 @override |
| 1462 ir.Primitive handleSuperCompounds( |
| 1463 ast.SendSet node, |
| 1464 Element getter, |
| 1465 CompoundGetter getterKind, |
| 1466 Element setter, |
| 1467 CompoundSetter setterKind, |
| 1468 CompoundRhs rhs, |
| 1469 arg) { |
| 1470 return translateCompounds( |
| 1471 getValue: () { |
| 1472 switch (getterKind) { |
| 1473 case CompoundGetter.FIELD: |
| 1474 return irBuilder.buildSuperFieldGet(getter); |
| 1475 case CompoundGetter.GETTER: |
| 1476 return irBuilder.buildSuperGetterGet(getter); |
| 1477 case CompoundGetter.METHOD: |
| 1478 return irBuilder.buildSuperMethodGet(getter); |
| 1479 case CompoundGetter.UNRESOLVED: |
| 1480 // TODO(johnniwinther): Ensure [getter] is not null. |
| 1481 return buildSuperNoSuchGetter(getter != null ? getter : setter); |
| 1482 } |
| 1483 }, |
| 1484 rhs: rhs, |
| 1485 setValue: (ir.Primitive result) { |
| 1486 switch (setterKind) { |
| 1487 case CompoundSetter.FIELD: |
| 1488 return irBuilder.buildSuperFieldSet(setter, result); |
| 1489 case CompoundSetter.SETTER: |
| 1490 return irBuilder.buildSuperSetterSet(setter, result); |
| 1491 case CompoundSetter.INVALID: |
| 1492 return buildSuperNoSuchSetter(setter, result); |
| 1493 } |
| 1494 }); |
| 1495 } |
| 1496 |
| 1497 @override |
| 1498 ir.Primitive handleTypeVariableTypeLiteralCompounds( |
| 1499 ast.SendSet node, |
| 1500 TypeVariableElement typeVariable, |
| 1501 CompoundRhs rhs, |
| 1502 arg) { |
| 1503 return translateCompounds( |
| 1504 getValue: () => irBuilder.buildReifyTypeVariable(typeVariable.type), |
| 1505 rhs: rhs, |
| 1506 setValue: (value) {}); // The binary operator will throw before this. |
| 1507 } |
| 1508 |
| 1509 @override |
| 1510 ir.Primitive handleIndexCompounds( |
| 1511 ast.SendSet node, |
| 1512 ast.Node receiver, |
| 1640 ast.Node index, | 1513 ast.Node index, |
| 1641 op.IncDecOperator operator, | 1514 CompoundRhs rhs, |
| 1642 arg, | 1515 arg) { |
| 1643 {bool isPrefix}) { | |
| 1644 ir.Primitive target = visit(receiver); | 1516 ir.Primitive target = visit(receiver); |
| 1645 ir.Primitive indexValue = visit(index); | 1517 ir.Primitive indexValue = visit(index); |
| 1646 return translatePrefixPostfix( | 1518 return translateCompounds( |
| 1647 getValue: () { | 1519 getValue: () { |
| 1648 Selector selector = new Selector.index(); | 1520 Selector selector = new Selector.index(); |
| 1649 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; | 1521 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; |
| 1650 arguments = | 1522 arguments = |
| 1651 normalizeDynamicArguments(selector.callStructure, arguments); | 1523 normalizeDynamicArguments(selector.callStructure, arguments); |
| 1652 return irBuilder.buildDynamicInvocation(target, selector, arguments); | 1524 return irBuilder.buildDynamicInvocation(target, selector, arguments); |
| 1653 }, | 1525 }, |
| 1654 operator: operator, | 1526 rhs: rhs, |
| 1655 setValue: (ir.Primitive result) { | 1527 setValue: (ir.Primitive result) { |
| 1656 Selector selector = new Selector.indexSet(); | 1528 irBuilder.buildDynamicIndexSet(target, indexValue, result); |
| 1657 List<ir.Primitive> arguments = <ir.Primitive>[indexValue, result]; | 1529 }); |
| 1658 arguments = | 1530 } |
| 1659 normalizeDynamicArguments(selector.callStructure, arguments); | 1531 |
| 1660 irBuilder.buildDynamicInvocation(target, selector, arguments); | 1532 @override |
| 1661 }, | 1533 ir.Primitive handleSuperIndexCompounds( |
| 1662 isPrefix: isPrefix); | 1534 ast.SendSet node, |
| 1663 } | 1535 Element indexFunction, |
| 1664 | 1536 Element indexSetFunction, |
| 1665 @override | |
| 1666 ir.Primitive handleSuperIndexPostfixPrefix( | |
| 1667 ast.Send node, | |
| 1668 FunctionElement indexFunction, | |
| 1669 FunctionElement indexSetFunction, | |
| 1670 ast.Node index, | 1537 ast.Node index, |
| 1671 op.IncDecOperator operator, | 1538 CompoundRhs rhs, |
| 1672 arg, | 1539 arg, |
| 1673 {bool isPrefix}) { | 1540 {bool isGetterValid, |
| 1541 bool isSetterValid}) { |
| 1674 ir.Primitive indexValue = visit(index); | 1542 ir.Primitive indexValue = visit(index); |
| 1675 return translatePrefixPostfix( | 1543 return translateCompounds( |
| 1676 getValue: () { | 1544 getValue: () { |
| 1677 return irBuilder.buildSuperIndex(indexFunction, indexValue); | 1545 if (isGetterValid) { |
| 1678 }, | 1546 return irBuilder.buildSuperIndex(indexFunction, indexValue); |
| 1679 operator: operator, | 1547 } else { |
| 1680 setValue: (ir.Primitive result) { | 1548 return buildInstanceNoSuchMethod( |
| 1681 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); | 1549 new Selector.index(), <ir.Primitive>[indexValue]); |
| 1682 }, | 1550 } |
| 1683 isPrefix: isPrefix); | 1551 }, |
| 1684 } | 1552 rhs: rhs, |
| 1685 | 1553 setValue: (ir.Primitive result) { |
| 1686 @override | 1554 if (isSetterValid) { |
| 1687 ir.Primitive handleUnresolvedSuperGetterIndexPostfixPrefix( | 1555 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); |
| 1688 ast.Send node, | 1556 } else { |
| 1689 Element element, | 1557 buildInstanceNoSuchMethod( |
| 1690 ast.Node index, | 1558 new Selector.indexSet(), <ir.Primitive>[indexValue, result]); |
| 1691 op.IncDecOperator operator, | 1559 } |
| 1692 arg, | 1560 }); |
| 1693 {bool isPrefix}) { | 1561 } |
| 1694 return giveup(node, 'handleSuperUnresolvedGetterIndexPostfixPrefix'); | 1562 |
| 1695 } | |
| 1696 | |
| 1697 @override | |
| 1698 ir.Primitive handleUnresolvedSuperSetterIndexPostfixPrefix( | |
| 1699 ast.Send node, | |
| 1700 FunctionElement indexFunction, | |
| 1701 Element element, | |
| 1702 ast.Node index, | |
| 1703 op.IncDecOperator operator, | |
| 1704 arg, | |
| 1705 {bool isPrefix}) { | |
| 1706 return giveup(node, 'handleSuperUnresolvedGetterIndexPostfixPrefix'); | |
| 1707 } | |
| 1708 | |
| 1709 @override | |
| 1710 ir.Primitive visitUnresolvedSuperGetterCompoundIndexSet( | |
| 1711 ast.Send node, | |
| 1712 Element element, | |
| 1713 ast.Node index, | |
| 1714 op.AssignmentOperator operator, | |
| 1715 ast.Node rhs, | |
| 1716 arg) { | |
| 1717 return giveup(node, 'visitUnresolvedSuperGetterCompoundIndexSet'); | |
| 1718 } | |
| 1719 | |
| 1720 @override | |
| 1721 ir.Primitive visitUnresolvedSuperIndexSet( | |
| 1722 ast.Send node, | |
| 1723 Element element, | |
| 1724 ast.Node index, | |
| 1725 ast.Node rhs, | |
| 1726 arg) { | |
| 1727 return giveup(node, 'visitUnresolvedSuperIndexSet'); | |
| 1728 } | |
| 1729 | |
| 1730 @override | |
| 1731 ir.Primitive visitUnresolvedSuperSetterCompoundIndexSet( | |
| 1732 ast.Send node, | |
| 1733 MethodElement getter, | |
| 1734 Element element, | |
| 1735 ast.Node index, | |
| 1736 op.AssignmentOperator operator, | |
| 1737 ast.Node rhs, | |
| 1738 arg) { | |
| 1739 return giveup(node, 'visitUnresolvedSuperSetterCompoundIndexSet'); | |
| 1740 } | |
| 1741 | |
| 1742 @override | |
| 1743 ir.Primitive handleStaticSetterSet( | |
| 1744 ast.SendSet node, | |
| 1745 FunctionElement setter, | |
| 1746 ast.Node rhs, | |
| 1747 _) { | |
| 1748 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); | |
| 1749 } | |
| 1750 | |
| 1751 @override | |
| 1752 ir.Primitive visitSuperFieldCompound( | |
| 1753 ast.Send node, | |
| 1754 FieldElement field, | |
| 1755 op.AssignmentOperator operator, | |
| 1756 ast.Node rhs, | |
| 1757 _) { | |
| 1758 return translateCompound( | |
| 1759 getValue: () => irBuilder.buildSuperFieldGet(field), | |
| 1760 operator: operator, | |
| 1761 rhs: rhs, | |
| 1762 setValue: (ir.Primitive result) { | |
| 1763 irBuilder.buildSuperFieldSet(field, result); | |
| 1764 }); | |
| 1765 } | |
| 1766 | |
| 1767 @override | |
| 1768 ir.Primitive visitSuperFieldFieldPostfix( | |
| 1769 ast.Send node, | |
| 1770 FieldElement readField, | |
| 1771 FieldElement writtenField, | |
| 1772 op.IncDecOperator operator, | |
| 1773 _) { | |
| 1774 return translatePrefixPostfix( | |
| 1775 getValue: () => irBuilder.buildSuperFieldGet(readField), | |
| 1776 operator: operator, | |
| 1777 setValue: (ir.Primitive result) { | |
| 1778 irBuilder.buildSuperFieldSet(writtenField, result); | |
| 1779 }, | |
| 1780 isPrefix: false); | |
| 1781 } | |
| 1782 | |
| 1783 @override | |
| 1784 ir.Primitive visitSuperFieldFieldPrefix( | |
| 1785 ast.Send node, | |
| 1786 FieldElement readField, | |
| 1787 FieldElement writtenField, | |
| 1788 op.IncDecOperator operator, | |
| 1789 _) { | |
| 1790 return translatePrefixPostfix( | |
| 1791 getValue: () => irBuilder.buildSuperFieldGet(readField), | |
| 1792 operator: operator, | |
| 1793 setValue: (ir.Primitive result) { | |
| 1794 irBuilder.buildSuperFieldSet(writtenField, result); | |
| 1795 }, | |
| 1796 isPrefix: true); | |
| 1797 } | |
| 1798 | |
| 1799 @override | |
| 1800 ir.Primitive visitSuperFieldSetterCompound( | |
| 1801 ast.Send node, | |
| 1802 FieldElement field, | |
| 1803 FunctionElement setter, | |
| 1804 op.AssignmentOperator operator, | |
| 1805 ast.Node rhs, | |
| 1806 _) { | |
| 1807 return translateCompound( | |
| 1808 getValue: () => irBuilder.buildSuperFieldGet(field), | |
| 1809 operator: operator, | |
| 1810 rhs: rhs, | |
| 1811 setValue: (ir.Primitive result) { | |
| 1812 irBuilder.buildSuperSetterSet(setter, result); | |
| 1813 }); | |
| 1814 } | |
| 1815 | |
| 1816 @override | |
| 1817 ir.Primitive visitSuperGetterFieldCompound( | |
| 1818 ast.Send node, | |
| 1819 FunctionElement getter, | |
| 1820 FieldElement field, | |
| 1821 op.AssignmentOperator operator, | |
| 1822 ast.Node rhs, | |
| 1823 _) { | |
| 1824 return translateCompound( | |
| 1825 getValue: () => irBuilder.buildSuperGetterGet(getter), | |
| 1826 operator: operator, | |
| 1827 rhs: rhs, | |
| 1828 setValue: (ir.Primitive result) { | |
| 1829 irBuilder.buildSuperFieldSet(field, result); | |
| 1830 }); | |
| 1831 } | |
| 1832 | |
| 1833 @override | |
| 1834 ir.Primitive visitSuperGetterSetterCompound( | |
| 1835 ast.Send node, | |
| 1836 FunctionElement getter, | |
| 1837 FunctionElement setter, | |
| 1838 op.AssignmentOperator operator, | |
| 1839 ast.Node rhs, | |
| 1840 _) { | |
| 1841 return translateCompound( | |
| 1842 getValue: () => irBuilder.buildSuperGetterGet(getter), | |
| 1843 operator: operator, | |
| 1844 rhs: rhs, | |
| 1845 setValue: (ir.Primitive result) { | |
| 1846 irBuilder.buildSuperSetterSet(setter, result); | |
| 1847 }); | |
| 1848 } | |
| 1849 | |
| 1850 @override | |
| 1851 ir.Primitive visitSuperMethodSetterCompound( | |
| 1852 ast.Send node, | |
| 1853 FunctionElement method, | |
| 1854 FunctionElement setter, | |
| 1855 op.AssignmentOperator operator, | |
| 1856 ast.Node rhs, | |
| 1857 _) { | |
| 1858 return translateCompound( | |
| 1859 getValue: () => irBuilder.buildSuperMethodGet(method), | |
| 1860 operator: operator, | |
| 1861 rhs: rhs, | |
| 1862 setValue: (ir.Primitive result) { | |
| 1863 irBuilder.buildSuperSetterSet(setter, result); | |
| 1864 }); | |
| 1865 } | |
| 1866 | |
| 1867 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) { | 1563 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) { |
| 1868 assert(irBuilder.isOpen); | 1564 assert(irBuilder.isOpen); |
| 1869 ir.Primitive first = visit(node.first); | 1565 ir.Primitive first = visit(node.first); |
| 1870 ir.Primitive second = visit(node.second); | 1566 ir.Primitive second = visit(node.second); |
| 1871 return irBuilder.buildStringConcatenation([first, second]); | 1567 return irBuilder.buildStringConcatenation([first, second]); |
| 1872 } | 1568 } |
| 1873 | 1569 |
| 1874 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) { | 1570 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) { |
| 1875 assert(irBuilder.isOpen); | 1571 assert(irBuilder.isOpen); |
| 1876 List<ir.Primitive> arguments = []; | 1572 List<ir.Primitive> arguments = []; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1913 ast.Send node, | 1609 ast.Send node, |
| 1914 ast.NodeList arguments, _) { | 1610 ast.NodeList arguments, _) { |
| 1915 if (compiler.enableUserAssertions) { | 1611 if (compiler.enableUserAssertions) { |
| 1916 return giveup(node, 'Assert'); | 1612 return giveup(node, 'Assert'); |
| 1917 } else { | 1613 } else { |
| 1918 return irBuilder.buildNullConstant(); | 1614 return irBuilder.buildNullConstant(); |
| 1919 } | 1615 } |
| 1920 } | 1616 } |
| 1921 | 1617 |
| 1922 @override | 1618 @override |
| 1923 ir.Primitive errorUnresolvedCompound( | 1619 ir.Primitive visitUnresolvedCompound( |
| 1924 ast.Send node, | 1620 ast.Send node, |
| 1925 Element element, | 1621 Element element, |
| 1926 op.AssignmentOperator operator, | 1622 op.AssignmentOperator operator, |
| 1927 ast.Node rhs, _) { | 1623 ast.Node rhs, _) { |
| 1928 // TODO(asgerf): What is unresolved? The getter and/or the setter? | 1624 // TODO(asgerf): What is unresolved? The getter and/or the setter? |
| 1929 // If it was the setter, we must evaluate the right-hand side. | 1625 // If it was the setter, we must evaluate the right-hand side. |
| 1930 return buildStaticNoSuchMethod(elements.getSelector(node), []); | 1626 return buildStaticNoSuchMethod(elements.getSelector(node), []); |
| 1931 } | 1627 } |
| 1932 | 1628 |
| 1933 @override | 1629 @override |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1975 ir.Primitive visitUnresolvedInvoke( | 1671 ir.Primitive visitUnresolvedInvoke( |
| 1976 ast.Send node, | 1672 ast.Send node, |
| 1977 Element element, | 1673 Element element, |
| 1978 ast.NodeList arguments, | 1674 ast.NodeList arguments, |
| 1979 Selector selector, _) { | 1675 Selector selector, _) { |
| 1980 return buildStaticNoSuchMethod(elements.getSelector(node), | 1676 return buildStaticNoSuchMethod(elements.getSelector(node), |
| 1981 arguments.nodes.mapToList(visit)); | 1677 arguments.nodes.mapToList(visit)); |
| 1982 } | 1678 } |
| 1983 | 1679 |
| 1984 @override | 1680 @override |
| 1985 ir.Primitive errorUnresolvedPostfix( | |
| 1986 ast.Send node, | |
| 1987 Element element, | |
| 1988 op.IncDecOperator operator, _) { | |
| 1989 // TODO(asgerf): Which ones are missing? The getter and/or the setter? | |
| 1990 return buildStaticNoSuchMethod(elements.getSelector(node), []); | |
| 1991 } | |
| 1992 | |
| 1993 @override | |
| 1994 ir.Primitive errorUnresolvedPrefix( | |
| 1995 ast.Send node, | |
| 1996 Element element, | |
| 1997 op.IncDecOperator operator, _) { | |
| 1998 // TODO(asgerf): Which ones are missing? The getter and/or the setter? | |
| 1999 return buildStaticNoSuchMethod(elements.getSelector(node), []); | |
| 2000 } | |
| 2001 | |
| 2002 @override | |
| 2003 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( | 1681 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( |
| 2004 ast.NewExpression node, | 1682 ast.NewExpression node, |
| 2005 ConstructorElement constructor, | 1683 ConstructorElement constructor, |
| 2006 InterfaceType type, | 1684 InterfaceType type, |
| 2007 ast.NodeList arguments, | 1685 ast.NodeList arguments, |
| 2008 CallStructure callStructure, _) { | 1686 CallStructure callStructure, _) { |
| 2009 String nameString = Elements.reconstructConstructorName(constructor); | 1687 String nameString = Elements.reconstructConstructorName(constructor); |
| 2010 Name name = new Name(nameString, constructor.library); | 1688 Name name = new Name(nameString, constructor.library); |
| 2011 return buildStaticNoSuchMethod( | 1689 return buildStaticNoSuchMethod( |
| 2012 new Selector(SelectorKind.CALL, name, callStructure), | 1690 new Selector(SelectorKind.CALL, name, callStructure), |
| 2013 translateDynamicArguments(arguments, callStructure)); | 1691 translateDynamicArguments(arguments, callStructure)); |
| 2014 } | 1692 } |
| 2015 | 1693 |
| 2016 @override | 1694 @override |
| 2017 ir.Primitive errorUnresolvedSet( | 1695 ir.Primitive errorUnresolvedSet( |
| 2018 ast.Send node, | 1696 ast.Send node, |
| 2019 Element element, | 1697 Element element, |
| 2020 ast.Node rhs, _) { | 1698 ast.Node rhs, _) { |
| 2021 return buildStaticNoSuchMethod(elements.getSelector(node), [visit(rhs)]); | 1699 return buildStaticNoSuchMethod(elements.getSelector(node), [visit(rhs)]); |
| 2022 } | 1700 } |
| 2023 | 1701 |
| 2024 @override | 1702 @override |
| 2025 ir.Primitive errorUnresolvedSuperCompoundIndexSet( | |
| 2026 ast.SendSet node, | |
| 2027 Element element, | |
| 2028 ast.Node index, | |
| 2029 op.AssignmentOperator operator, | |
| 2030 ast.Node rhs, _) { | |
| 2031 // Assume the index getter is missing. | |
| 2032 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); | |
| 2033 return buildInstanceNoSuchMethod(selector, [visit(index)]); | |
| 2034 } | |
| 2035 | |
| 2036 @override | |
| 2037 ir.Primitive visitUnresolvedSuperIndex( | 1703 ir.Primitive visitUnresolvedSuperIndex( |
| 2038 ast.Send node, | 1704 ast.Send node, |
| 2039 Element function, | 1705 Element function, |
| 2040 ast.Node index, _) { | 1706 ast.Node index, _) { |
| 2041 // Assume the index getter is missing. | 1707 // Assume the index getter is missing. |
| 2042 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); | 1708 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); |
| 2043 return buildInstanceNoSuchMethod(selector, [visit(index)]); | 1709 return buildInstanceNoSuchMethod(selector, [visit(index)]); |
| 2044 } | 1710 } |
| 2045 | 1711 |
| 2046 @override | 1712 @override |
| 2047 ir.Primitive errorUnresolvedSuperIndexPostfix( | |
| 2048 ast.Send node, | |
| 2049 Element function, | |
| 2050 ast.Node index, | |
| 2051 op.IncDecOperator operator, _) { | |
| 2052 // Assume the index getter is missing. | |
| 2053 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); | |
| 2054 return buildInstanceNoSuchMethod(selector, [visit(index)]); | |
| 2055 } | |
| 2056 | |
| 2057 @override | |
| 2058 ir.Primitive errorUnresolvedSuperIndexPrefix( | |
| 2059 ast.Send node, | |
| 2060 Element function, | |
| 2061 ast.Node index, | |
| 2062 op.IncDecOperator operator, _) { | |
| 2063 // Assume the index getter is missing. | |
| 2064 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); | |
| 2065 return buildInstanceNoSuchMethod(selector, [visit(index)]); | |
| 2066 } | |
| 2067 | |
| 2068 @override | |
| 2069 ir.Primitive errorUnresolvedSuperIndexSet( | |
| 2070 ast.SendSet node, | |
| 2071 Element element, | |
| 2072 ast.Node index, | |
| 2073 ast.Node rhs, _) { | |
| 2074 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); | |
| 2075 return buildInstanceNoSuchMethod( | |
| 2076 selector, | |
| 2077 [visit(index), visit(rhs)]); | |
| 2078 } | |
| 2079 | |
| 2080 @override | |
| 2081 ir.Primitive visitUnresolvedSuperBinary( | 1713 ir.Primitive visitUnresolvedSuperBinary( |
| 2082 ast.Send node, | 1714 ast.Send node, |
| 2083 Element element, | 1715 Element element, |
| 2084 op.BinaryOperator operator, | 1716 op.BinaryOperator operator, |
| 2085 ast.Node argument, _) { | 1717 ast.Node argument, _) { |
| 2086 return buildInstanceNoSuchMethod( | 1718 return buildInstanceNoSuchMethod( |
| 2087 elements.getSelector(node), | 1719 elements.getSelector(node), |
| 2088 [visit(argument)]); | 1720 [visit(argument)]); |
| 2089 } | 1721 } |
| 2090 | 1722 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2197 ir.Primitive visitAbstractClassConstructorInvoke( | 1829 ir.Primitive visitAbstractClassConstructorInvoke( |
| 2198 ast.NewExpression node, | 1830 ast.NewExpression node, |
| 2199 ConstructorElement element, | 1831 ConstructorElement element, |
| 2200 InterfaceType type, | 1832 InterfaceType type, |
| 2201 ast.NodeList arguments, | 1833 ast.NodeList arguments, |
| 2202 CallStructure callStructure, _) { | 1834 CallStructure callStructure, _) { |
| 2203 return buildAbstractClassInstantiationError(element.enclosingClass); | 1835 return buildAbstractClassInstantiationError(element.enclosingClass); |
| 2204 } | 1836 } |
| 2205 | 1837 |
| 2206 @override | 1838 @override |
| 2207 ir.Primitive errorClassTypeLiteralCompound( | |
| 2208 ast.Send node, | |
| 2209 ConstantExpression constant, | |
| 2210 op.AssignmentOperator operator, | |
| 2211 ast.Node rhs, _) { | |
| 2212 return translateCompound( | |
| 2213 getValue: () => irBuilder.buildConstant(constant), | |
| 2214 operator: operator, | |
| 2215 rhs: rhs, | |
| 2216 setValue: (value) {}); // The binary operator will throw before this. | |
| 2217 } | |
| 2218 | |
| 2219 @override | |
| 2220 ir.Primitive errorClassTypeLiteralPostfix( | |
| 2221 ast.Send node, | |
| 2222 ConstantExpression constant, | |
| 2223 op.IncDecOperator operator, _) { | |
| 2224 return translatePrefixPostfix( | |
| 2225 getValue: () => irBuilder.buildConstant(constant), | |
| 2226 operator: operator, | |
| 2227 setValue: (value) {}, // The binary operator will throw before this. | |
| 2228 isPrefix: false); | |
| 2229 } | |
| 2230 | |
| 2231 @override | |
| 2232 ir.Primitive errorClassTypeLiteralPrefix( | |
| 2233 ast.Send node, | |
| 2234 ConstantExpression constant, | |
| 2235 op.IncDecOperator operator, _) { | |
| 2236 return translatePrefixPostfix( | |
| 2237 getValue: () => irBuilder.buildConstant(constant), | |
| 2238 operator: operator, | |
| 2239 setValue: (value) {}, // The binary operator will throw before this. | |
| 2240 isPrefix: true); | |
| 2241 } | |
| 2242 | |
| 2243 @override | |
| 2244 ir.Primitive errorDynamicTypeLiteralCompound( | |
| 2245 ast.Send node, | |
| 2246 ConstantExpression constant, | |
| 2247 op.AssignmentOperator operator, | |
| 2248 ast.Node rhs, _) { | |
| 2249 return translateCompound( | |
| 2250 getValue: () => irBuilder.buildConstant(constant), | |
| 2251 operator: operator, | |
| 2252 rhs: rhs, | |
| 2253 setValue: (value) {}); // The binary operator will throw before this. | |
| 2254 } | |
| 2255 | |
| 2256 @override | |
| 2257 ir.Primitive errorDynamicTypeLiteralPostfix( | |
| 2258 ast.Send node, | |
| 2259 ConstantExpression constant, | |
| 2260 op.IncDecOperator operator, _) { | |
| 2261 return translatePrefixPostfix( | |
| 2262 getValue: () => irBuilder.buildConstant(constant), | |
| 2263 operator: operator, | |
| 2264 setValue: (value) {}, // The binary operator will throw before this. | |
| 2265 isPrefix: false); | |
| 2266 } | |
| 2267 | |
| 2268 @override | |
| 2269 ir.Primitive errorDynamicTypeLiteralPrefix( | |
| 2270 ast.Send node, | |
| 2271 ConstantExpression constant, | |
| 2272 op.IncDecOperator operator, _) { | |
| 2273 return translatePrefixPostfix( | |
| 2274 getValue: () => irBuilder.buildConstant(constant), | |
| 2275 operator: operator, | |
| 2276 setValue: (value) {}, // The binary operator will throw before this. | |
| 2277 isPrefix: true); | |
| 2278 } | |
| 2279 | |
| 2280 @override | |
| 2281 ir.Primitive errorFinalLocalVariableCompound( | |
| 2282 ast.Send node, | |
| 2283 LocalVariableElement variable, | |
| 2284 op.AssignmentOperator operator, | |
| 2285 ast.Node rhs, _) { | |
| 2286 Selector selector = new Selector.setter(variable.name, null); | |
| 2287 return translateCompound( | |
| 2288 getValue: () => irBuilder.buildLocalVariableGet(variable), | |
| 2289 operator: operator, | |
| 2290 rhs: rhs, | |
| 2291 setValue: (value) => buildStaticNoSuchMethod(selector, [value])); | |
| 2292 } | |
| 2293 | |
| 2294 @override | |
| 2295 ir.Primitive errorFinalLocalVariableSet( | 1839 ir.Primitive errorFinalLocalVariableSet( |
| 2296 ast.SendSet node, | 1840 ast.SendSet node, |
| 2297 LocalVariableElement variable, | 1841 LocalVariableElement variable, |
| 2298 ast.Node rhs, _) { | 1842 ast.Node rhs, _) { |
| 2299 Selector selector = new Selector.setter(variable.name, null); | 1843 Selector selector = new Selector.setter(variable.name, null); |
| 2300 return buildStaticNoSuchMethod(selector, [visit(rhs)]); | 1844 return buildStaticNoSuchMethod(selector, [visit(rhs)]); |
| 2301 } | 1845 } |
| 2302 | 1846 |
| 2303 @override | 1847 @override |
| 2304 ir.Primitive errorFinalParameterCompound( | |
| 2305 ast.Send node, | |
| 2306 ParameterElement parameter, | |
| 2307 op.AssignmentOperator operator, | |
| 2308 ast.Node rhs, _) { | |
| 2309 Selector selector = new Selector.setter(parameter.name, null); | |
| 2310 return translateCompound( | |
| 2311 getValue: () => irBuilder.buildLocalVariableGet(parameter), | |
| 2312 operator: operator, | |
| 2313 rhs: rhs, | |
| 2314 setValue: (value) => buildStaticNoSuchMethod(selector, [value])); | |
| 2315 } | |
| 2316 | |
| 2317 @override | |
| 2318 ir.Primitive errorFinalParameterSet( | 1848 ir.Primitive errorFinalParameterSet( |
| 2319 ast.SendSet node, | 1849 ast.SendSet node, |
| 2320 ParameterElement parameter, | 1850 ParameterElement parameter, |
| 2321 ast.Node rhs, _) { | 1851 ast.Node rhs, _) { |
| 2322 Selector selector = new Selector.setter(parameter.name, null); | 1852 Selector selector = new Selector.setter(parameter.name, null); |
| 2323 return buildStaticNoSuchMethod(selector, [visit(rhs)]); | 1853 return buildStaticNoSuchMethod(selector, [visit(rhs)]); |
| 2324 } | 1854 } |
| 2325 | 1855 |
| 2326 @override | 1856 @override |
| 2327 ir.Primitive errorFinalStaticFieldCompound( | |
| 2328 ast.Send node, | |
| 2329 FieldElement field, | |
| 2330 op.AssignmentOperator operator, | |
| 2331 ast.Node rhs, _) { | |
| 2332 SourceInformation src = sourceInformationBuilder.buildGet(node); | |
| 2333 return translateCompound( | |
| 2334 getValue: () => buildStaticFieldGet(field, src), | |
| 2335 operator: operator, | |
| 2336 rhs: rhs, | |
| 2337 setValue: (value) => buildStaticNoSuchMethod( | |
| 2338 new Selector.setter(field.name, field.library), [value])); | |
| 2339 } | |
| 2340 | |
| 2341 @override | |
| 2342 ir.Primitive errorFinalStaticFieldSet( | 1857 ir.Primitive errorFinalStaticFieldSet( |
| 2343 ast.SendSet node, | 1858 ast.SendSet node, |
| 2344 FieldElement field, | 1859 FieldElement field, |
| 2345 ast.Node rhs, _) { | 1860 ast.Node rhs, _) { |
| 2346 // TODO(asgerf): Include class name somehow? | 1861 // TODO(asgerf): Include class name somehow? |
| 2347 return buildStaticNoSuchMethod( | 1862 return buildStaticNoSuchMethod( |
| 2348 new Selector.setter(field.name, field.library), | 1863 new Selector.setter(field.name, field.library), |
| 2349 [visit(rhs)]); | 1864 [visit(rhs)]); |
| 2350 } | 1865 } |
| 2351 | 1866 |
| 2352 @override | 1867 @override |
| 2353 ir.Primitive errorFinalSuperFieldCompound( | |
| 2354 ast.Send node, | |
| 2355 FieldElement field, | |
| 2356 op.AssignmentOperator operator, | |
| 2357 ast.Node rhs, _) { | |
| 2358 Selector selector = useSelectorTypeOfNode( | |
| 2359 new Selector.setter(field.name, field.library), | |
| 2360 node); | |
| 2361 return translateCompound( | |
| 2362 getValue: () => irBuilder.buildSuperFieldGet(field), | |
| 2363 operator: operator, | |
| 2364 rhs: rhs, | |
| 2365 setValue: (value) => buildInstanceNoSuchMethod(selector, [value])); | |
| 2366 } | |
| 2367 | |
| 2368 @override | |
| 2369 ir.Primitive errorFinalSuperFieldSet( | 1868 ir.Primitive errorFinalSuperFieldSet( |
| 2370 ast.SendSet node, | 1869 ast.SendSet node, |
| 2371 FieldElement field, | 1870 FieldElement field, |
| 2372 ast.Node rhs, _) { | 1871 ast.Node rhs, _) { |
| 2373 Selector selector = useSelectorTypeOfNode( | 1872 Selector selector = useSelectorTypeOfNode( |
| 2374 new Selector.setter(field.name, field.library), | 1873 new Selector.setter(field.name, field.library), |
| 2375 node); | 1874 node); |
| 2376 return buildInstanceNoSuchMethod(selector, [visit(rhs)]); | 1875 return buildInstanceNoSuchMethod(selector, [visit(rhs)]); |
| 2377 } | 1876 } |
| 2378 | 1877 |
| 2379 @override | 1878 @override |
| 2380 ir.Primitive errorFinalTopLevelFieldCompound( | |
| 2381 ast.Send node, | |
| 2382 FieldElement field, | |
| 2383 op.AssignmentOperator operator, | |
| 2384 ast.Node rhs, _) { | |
| 2385 SourceInformation src = sourceInformationBuilder.buildGet(node); | |
| 2386 return translateCompound( | |
| 2387 getValue: () => buildStaticFieldGet(field, src), | |
| 2388 operator: operator, | |
| 2389 rhs: rhs, | |
| 2390 setValue: (value) => buildStaticNoSuchMethod( | |
| 2391 new Selector.setter(field.name, field.library), [value])); | |
| 2392 } | |
| 2393 | |
| 2394 @override | |
| 2395 ir.Primitive errorFinalTopLevelFieldSet( | 1879 ir.Primitive errorFinalTopLevelFieldSet( |
| 2396 ast.SendSet node, | 1880 ast.SendSet node, |
| 2397 FieldElement field, | 1881 FieldElement field, |
| 2398 ast.Node rhs, _) { | 1882 ast.Node rhs, _) { |
| 2399 return buildStaticNoSuchMethod( | 1883 return buildStaticNoSuchMethod( |
| 2400 new Selector.setter(field.name, field.library), | 1884 new Selector.setter(field.name, field.library), |
| 2401 [visit(rhs)]); | 1885 [visit(rhs)]); |
| 2402 } | 1886 } |
| 2403 | 1887 |
| 2404 @override | 1888 @override |
| 2405 ir.Primitive errorLocalFunctionCompound( | |
| 2406 ast.Send node, | |
| 2407 LocalFunctionElement function, | |
| 2408 op.AssignmentOperator operator, | |
| 2409 ast.Node rhs, _) { | |
| 2410 return translateCompound( | |
| 2411 getValue: () => irBuilder.buildLocalFunctionGet(function), | |
| 2412 operator: operator, | |
| 2413 rhs: rhs, | |
| 2414 setValue: (value) {}); // Binary operator will throw before this. | |
| 2415 } | |
| 2416 | |
| 2417 @override | |
| 2418 ir.Primitive errorLocalFunctionPostfix( | |
| 2419 ast.Send node, | |
| 2420 LocalFunctionElement function, | |
| 2421 op.IncDecOperator operator, | |
| 2422 _) { | |
| 2423 return translatePrefixPostfix( | |
| 2424 getValue: () => irBuilder.buildLocalFunctionGet(function), | |
| 2425 operator: operator, | |
| 2426 setValue: (value) {}, // Binary operator will throw before this. | |
| 2427 isPrefix: false); | |
| 2428 } | |
| 2429 | |
| 2430 @override | |
| 2431 ir.Primitive errorLocalFunctionPrefix( | |
| 2432 ast.Send node, | |
| 2433 LocalFunctionElement function, | |
| 2434 op.IncDecOperator operator, | |
| 2435 _) { | |
| 2436 return translatePrefixPostfix( | |
| 2437 getValue: () => irBuilder.buildLocalFunctionGet(function), | |
| 2438 operator: operator, | |
| 2439 setValue: (value) {}, // Binary operator will throw before this. | |
| 2440 isPrefix: true); | |
| 2441 } | |
| 2442 | |
| 2443 @override | |
| 2444 ir.Primitive errorLocalFunctionSet( | 1889 ir.Primitive errorLocalFunctionSet( |
| 2445 ast.SendSet node, | 1890 ast.SendSet node, |
| 2446 LocalFunctionElement function, | 1891 LocalFunctionElement function, |
| 2447 ast.Node rhs, _) { | 1892 ast.Node rhs, _) { |
| 2448 return buildStaticNoSuchMethod( | 1893 return buildStaticNoSuchMethod( |
| 2449 new Selector.setter(function.name, null), | 1894 new Selector.setter(function.name, null), |
| 2450 [visit(rhs)]); | 1895 [visit(rhs)]); |
| 2451 } | 1896 } |
| 2452 | 1897 |
| 2453 @override | 1898 @override |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2538 CallStructure callStructure, _) { | 1983 CallStructure callStructure, _) { |
| 2539 List<ir.Primitive> args = | 1984 List<ir.Primitive> args = |
| 2540 translateDynamicArguments(arguments, callStructure); | 1985 translateDynamicArguments(arguments, callStructure); |
| 2541 Name name = new Name(setter.name, setter.library); | 1986 Name name = new Name(setter.name, setter.library); |
| 2542 Selector selector = useSelectorTypeOfNode( | 1987 Selector selector = useSelectorTypeOfNode( |
| 2543 new Selector(SelectorKind.CALL, name, callStructure), | 1988 new Selector(SelectorKind.CALL, name, callStructure), |
| 2544 node); | 1989 node); |
| 2545 return buildInstanceNoSuchMethod(selector, args); | 1990 return buildInstanceNoSuchMethod(selector, args); |
| 2546 } | 1991 } |
| 2547 | 1992 |
| 2548 @override | |
| 2549 ir.Primitive errorTypeVariableTypeLiteralCompound( | |
| 2550 ast.Send node, | |
| 2551 TypeVariableElement element, | |
| 2552 op.AssignmentOperator operator, | |
| 2553 ast.Node rhs, _) { | |
| 2554 return translateCompound( | |
| 2555 getValue: () => irBuilder.buildReifyTypeVariable(element.type), | |
| 2556 operator: operator, | |
| 2557 rhs: rhs, | |
| 2558 setValue: (value) {}); // The binary operator will throw before this. | |
| 2559 } | |
| 2560 | |
| 2561 @override | |
| 2562 ir.Primitive errorTypeVariableTypeLiteralPostfix( | |
| 2563 ast.Send node, | |
| 2564 TypeVariableElement element, | |
| 2565 op.IncDecOperator operator, _) { | |
| 2566 return translatePrefixPostfix( | |
| 2567 getValue: () => irBuilder.buildReifyTypeVariable(element.type), | |
| 2568 operator: operator, | |
| 2569 setValue: (value) {}, // The binary operator will throw before this. | |
| 2570 isPrefix: false); | |
| 2571 } | |
| 2572 | |
| 2573 @override | |
| 2574 ir.Primitive errorTypeVariableTypeLiteralPrefix( | |
| 2575 ast.Send node, | |
| 2576 TypeVariableElement element, | |
| 2577 op.IncDecOperator operator, _) { | |
| 2578 return translatePrefixPostfix( | |
| 2579 getValue: () => irBuilder.buildReifyTypeVariable(element.type), | |
| 2580 operator: operator, | |
| 2581 setValue: (value) {}, // The binary operator will throw before this. | |
| 2582 isPrefix: true); | |
| 2583 } | |
| 2584 | |
| 2585 @override | |
| 2586 ir.Primitive errorTypedefTypeLiteralCompound( | |
| 2587 ast.Send node, | |
| 2588 ConstantExpression constant, | |
| 2589 op.AssignmentOperator operator, | |
| 2590 ast.Node rhs, _) { | |
| 2591 return translateCompound( | |
| 2592 getValue: () => irBuilder.buildConstant(constant), | |
| 2593 operator: operator, | |
| 2594 rhs: rhs, | |
| 2595 setValue: (value) {}); // The binary operator will throw before this. | |
| 2596 } | |
| 2597 | |
| 2598 @override | |
| 2599 ir.Primitive errorTypedefTypeLiteralPostfix( | |
| 2600 ast.Send node, | |
| 2601 ConstantExpression constant, | |
| 2602 op.IncDecOperator operator, _) { | |
| 2603 return translatePrefixPostfix( | |
| 2604 getValue: () => irBuilder.buildConstant(constant), | |
| 2605 operator: operator, | |
| 2606 setValue: (value) {}, // The binary operator will throw before this. | |
| 2607 isPrefix: false); | |
| 2608 } | |
| 2609 | |
| 2610 @override | |
| 2611 ir.Primitive errorTypedefTypeLiteralPrefix( | |
| 2612 ast.Send node, | |
| 2613 TypeConstantExpression constant, | |
| 2614 op.IncDecOperator operator, _) { | |
| 2615 return translatePrefixPostfix( | |
| 2616 getValue: () => irBuilder.buildConstant(constant), | |
| 2617 operator: operator, | |
| 2618 setValue: (value) {}, // The binary operator will throw before this. | |
| 2619 isPrefix: true); | |
| 2620 } | |
| 2621 | |
| 2622 ir.RootNode nullIfGiveup(ir.RootNode action()) { | 1993 ir.RootNode nullIfGiveup(ir.RootNode action()) { |
| 2623 try { | 1994 try { |
| 2624 return action(); | 1995 return action(); |
| 2625 } catch(e) { | 1996 } catch(e) { |
| 2626 if (e == ABORT_IRNODE_BUILDER) { | 1997 if (e == ABORT_IRNODE_BUILDER) { |
| 2627 return null; | 1998 return null; |
| 2628 } | 1999 } |
| 2629 rethrow; | 2000 rethrow; |
| 2630 } | 2001 } |
| 2631 } | 2002 } |
| (...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3767 node.body = replacementFor(node.body); | 3138 node.body = replacementFor(node.body); |
| 3768 } | 3139 } |
| 3769 } | 3140 } |
| 3770 | 3141 |
| 3771 /// Visit a just-deleted subterm and unlink all [Reference]s in it. | 3142 /// Visit a just-deleted subterm and unlink all [Reference]s in it. |
| 3772 class RemovalVisitor extends ir.RecursiveVisitor { | 3143 class RemovalVisitor extends ir.RecursiveVisitor { |
| 3773 processReference(ir.Reference reference) { | 3144 processReference(ir.Reference reference) { |
| 3774 reference.unlink(); | 3145 reference.unlink(); |
| 3775 } | 3146 } |
| 3776 } | 3147 } |
| OLD | NEW |