Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Side by Side Diff: pkg/compiler/lib/src/ssa/codegen.dart

Issue 768553002: Add support for (unintercepted) method calls to the cps js emitter. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: move jsPropertyCall to js builder. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of ssa; 5 part of ssa;
6 6
7 class SsaCodeGeneratorTask extends CompilerTask { 7 class SsaCodeGeneratorTask extends CompilerTask {
8 8
9 final JavaScriptBackend backend; 9 final JavaScriptBackend backend;
10 10
(...skipping 1472 matching lines...) Expand 10 before | Expand all | Expand 10 after
1483 // Visit all the dominated blocks that are not part of the then or else 1483 // Visit all the dominated blocks that are not part of the then or else
1484 // branches, and is not the join block. 1484 // branches, and is not the join block.
1485 // Depending on how the then/else branches terminate 1485 // Depending on how the then/else branches terminate
1486 // (e.g., return/throw/break) there can be any number of these. 1486 // (e.g., return/throw/break) there can be any number of these.
1487 List<HBasicBlock> dominated = node.block.dominatedBlocks; 1487 List<HBasicBlock> dominated = node.block.dominatedBlocks;
1488 for (int i = 2; i < dominated.length; i++) { 1488 for (int i = 2; i < dominated.length; i++) {
1489 visitBasicBlock(dominated[i]); 1489 visitBasicBlock(dominated[i]);
1490 } 1490 }
1491 } 1491 }
1492 1492
1493 js.Call jsPropertyCall(js.Expression receiver,
1494 String fieldName,
1495 List<js.Expression> arguments) {
1496 return new js.Call(new js.PropertyAccess.field(receiver, fieldName),
1497 arguments);
1498 }
1499
1500 void visitInterceptor(HInterceptor node) { 1493 void visitInterceptor(HInterceptor node) {
1501 registry.registerSpecializedGetInterceptor(node.interceptedClasses); 1494 registry.registerSpecializedGetInterceptor(node.interceptedClasses);
1502 String name = backend.namer.getInterceptorName( 1495 String name = backend.namer.getInterceptorName(
1503 backend.getInterceptorMethod, node.interceptedClasses); 1496 backend.getInterceptorMethod, node.interceptedClasses);
1504 var isolate = new js.VariableUse( 1497 var isolate = new js.VariableUse(
1505 backend.namer.globalObjectFor(backend.interceptorsLibrary)); 1498 backend.namer.globalObjectFor(backend.interceptorsLibrary));
1506 use(node.receiver); 1499 use(node.receiver);
1507 List<js.Expression> arguments = <js.Expression>[pop()]; 1500 List<js.Expression> arguments = <js.Expression>[pop()];
1508 push(jsPropertyCall(isolate, name, arguments), node); 1501 push(js.propertyCall(isolate, name, arguments), node);
1509 registry.registerUseInterceptor(); 1502 registry.registerUseInterceptor();
1510 } 1503 }
1511 1504
1512 visitInvokeDynamicMethod(HInvokeDynamicMethod node) { 1505 visitInvokeDynamicMethod(HInvokeDynamicMethod node) {
1513 use(node.receiver); 1506 use(node.receiver);
1514 js.Expression object = pop(); 1507 js.Expression object = pop();
1515 String name = node.selector.name; 1508 String name = node.selector.name;
1516 String methodName; 1509 String methodName;
1517 List<js.Expression> arguments = visitArguments(node.inputs); 1510 List<js.Expression> arguments = visitArguments(node.inputs);
1518 Element target = node.element; 1511 Element target = node.element;
(...skipping 14 matching lines...) Expand all
1533 // optimization. The optimization ensures any type checks or 1526 // optimization. The optimization ensures any type checks or
1534 // conversions have been satisified. 1527 // conversions have been satisified.
1535 methodName = target.fixedBackendName; 1528 methodName = target.fixedBackendName;
1536 } 1529 }
1537 } 1530 }
1538 1531
1539 if (methodName == null) { 1532 if (methodName == null) {
1540 methodName = backend.namer.invocationName(node.selector); 1533 methodName = backend.namer.invocationName(node.selector);
1541 registerMethodInvoke(node); 1534 registerMethodInvoke(node);
1542 } 1535 }
1543 push(jsPropertyCall(object, methodName, arguments), node); 1536 push(js.propertyCall(object, methodName, arguments), node);
1544 } 1537 }
1545 1538
1546 void visitInvokeConstructorBody(HInvokeConstructorBody node) { 1539 void visitInvokeConstructorBody(HInvokeConstructorBody node) {
1547 use(node.inputs[0]); 1540 use(node.inputs[0]);
1548 js.Expression object = pop(); 1541 js.Expression object = pop();
1549 String methodName = backend.namer.getNameOfInstanceMember(node.element); 1542 String methodName = backend.namer.getNameOfInstanceMember(node.element);
1550 List<js.Expression> arguments = visitArguments(node.inputs); 1543 List<js.Expression> arguments = visitArguments(node.inputs);
1551 push(jsPropertyCall(object, methodName, arguments), node); 1544 push(js.propertyCall(object, methodName, arguments), node);
1552 registry.registerStaticUse(node.element); 1545 registry.registerStaticUse(node.element);
1553 } 1546 }
1554 1547
1555 void visitOneShotInterceptor(HOneShotInterceptor node) { 1548 void visitOneShotInterceptor(HOneShotInterceptor node) {
1556 List<js.Expression> arguments = visitArguments(node.inputs); 1549 List<js.Expression> arguments = visitArguments(node.inputs);
1557 var isolate = new js.VariableUse( 1550 var isolate = new js.VariableUse(
1558 backend.namer.globalObjectFor(backend.interceptorsLibrary)); 1551 backend.namer.globalObjectFor(backend.interceptorsLibrary));
1559 Selector selector = getOptimizedSelectorFor(node, node.selector); 1552 Selector selector = getOptimizedSelectorFor(node, node.selector);
1560 String methodName = backend.registerOneShotInterceptor(selector); 1553 String methodName = backend.registerOneShotInterceptor(selector);
1561 push(jsPropertyCall(isolate, methodName, arguments), node); 1554 push(js.propertyCall(isolate, methodName, arguments), node);
1562 if (selector.isGetter) { 1555 if (selector.isGetter) {
1563 registerGetter(node); 1556 registerGetter(node);
1564 } else if (selector.isSetter) { 1557 } else if (selector.isSetter) {
1565 registerSetter(node); 1558 registerSetter(node);
1566 } else { 1559 } else {
1567 registerMethodInvoke(node); 1560 registerMethodInvoke(node);
1568 } 1561 }
1569 registry.registerUseInterceptor(); 1562 registry.registerUseInterceptor();
1570 } 1563 }
1571 1564
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1608 } 1601 }
1609 1602
1610 void registerGetter(HInvokeDynamic node) { 1603 void registerGetter(HInvokeDynamic node) {
1611 Selector selector = getOptimizedSelectorFor(node, node.selector); 1604 Selector selector = getOptimizedSelectorFor(node, node.selector);
1612 registry.registerDynamicGetter(selector); 1605 registry.registerDynamicGetter(selector);
1613 } 1606 }
1614 1607
1615 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { 1608 visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
1616 use(node.receiver); 1609 use(node.receiver);
1617 String name = backend.namer.invocationName(node.selector); 1610 String name = backend.namer.invocationName(node.selector);
1618 push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node); 1611 push(js.propertyCall(pop(), name, visitArguments(node.inputs)), node);
1619 registerSetter(node); 1612 registerSetter(node);
1620 } 1613 }
1621 1614
1622 visitInvokeDynamicGetter(HInvokeDynamicGetter node) { 1615 visitInvokeDynamicGetter(HInvokeDynamicGetter node) {
1623 use(node.receiver); 1616 use(node.receiver);
1624 String name = backend.namer.invocationName(node.selector); 1617 String name = backend.namer.invocationName(node.selector);
1625 push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node); 1618 push(js.propertyCall(pop(), name, visitArguments(node.inputs)), node);
1626 registerGetter(node); 1619 registerGetter(node);
1627 } 1620 }
1628 1621
1629 visitInvokeClosure(HInvokeClosure node) { 1622 visitInvokeClosure(HInvokeClosure node) {
1630 Selector call = new Selector.callClosureFrom(node.selector); 1623 Selector call = new Selector.callClosureFrom(node.selector);
1631 use(node.receiver); 1624 use(node.receiver);
1632 push(jsPropertyCall(pop(), 1625 push(js.propertyCall(pop(),
1633 backend.namer.invocationName(call), 1626 backend.namer.invocationName(call),
1634 visitArguments(node.inputs)), 1627 visitArguments(node.inputs)),
1635 node); 1628 node);
1636 registry.registerDynamicInvocation(call); 1629 registry.registerDynamicInvocation(call);
1637 } 1630 }
1638 1631
1639 visitInvokeStatic(HInvokeStatic node) { 1632 visitInvokeStatic(HInvokeStatic node) {
1640 Element element = node.element; 1633 Element element = node.element;
1641 List<DartType> instantiatedTypes = node.instantiatedTypes; 1634 List<DartType> instantiatedTypes = node.instantiatedTypes;
1642 1635
1643 registry.registerStaticInvocation(element); 1636 registry.registerStaticInvocation(element);
1644 1637
(...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after
2579 js.Expression test = generateTest(node.checkedInput, node.checkedType); 2572 js.Expression test = generateTest(node.checkedInput, node.checkedType);
2580 js.Block oldContainer = currentContainer; 2573 js.Block oldContainer = currentContainer;
2581 js.Statement body = new js.Block.empty(); 2574 js.Statement body = new js.Block.empty();
2582 currentContainer = body; 2575 currentContainer = body;
2583 if (node.isArgumentTypeCheck) { 2576 if (node.isArgumentTypeCheck) {
2584 generateThrowWithHelper('iae', node.checkedInput); 2577 generateThrowWithHelper('iae', node.checkedInput);
2585 } else if (node.isReceiverTypeCheck) { 2578 } else if (node.isReceiverTypeCheck) {
2586 use(node.checkedInput); 2579 use(node.checkedInput);
2587 String methodName = 2580 String methodName =
2588 backend.namer.invocationName(node.receiverTypeCheckSelector); 2581 backend.namer.invocationName(node.receiverTypeCheckSelector);
2589 js.Expression call = jsPropertyCall(pop(), methodName, []); 2582 js.Expression call = js.propertyCall(pop(), methodName, []);
2590 pushStatement(new js.Return(call)); 2583 pushStatement(new js.Return(call));
2591 } 2584 }
2592 currentContainer = oldContainer; 2585 currentContainer = oldContainer;
2593 body = unwrapStatement(body); 2586 body = unwrapStatement(body);
2594 pushStatement(new js.If.noElse(test, body), node); 2587 pushStatement(new js.If.noElse(test, body), node);
2595 return; 2588 return;
2596 } 2589 }
2597 2590
2598 assert(node.isCheckedModeCheck || node.isCastTypeCheck); 2591 assert(node.isCheckedModeCheck || node.isCastTypeCheck);
2599 DartType type = node.typeExpression; 2592 DartType type = node.typeExpression;
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
2723 js.PropertyAccess accessHelper(String name) { 2716 js.PropertyAccess accessHelper(String name) {
2724 Element helper = backend.findHelper(name); 2717 Element helper = backend.findHelper(name);
2725 if (helper == null) { 2718 if (helper == null) {
2726 // For mocked-up tests. 2719 // For mocked-up tests.
2727 return js.js('(void 0).$name'); 2720 return js.js('(void 0).$name');
2728 } 2721 }
2729 registry.registerStaticUse(helper); 2722 registry.registerStaticUse(helper);
2730 return backend.namer.elementAccess(helper); 2723 return backend.namer.elementAccess(helper);
2731 } 2724 }
2732 } 2725 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_backend/codegen/glue.dart ('k') | tests/compiler/dart2js/js_backend_cps_ir_basic.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698