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

Unified Diff: sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart

Issue 662593003: Support dynamic get/invocation in analyzer2dart. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased and updated Created 6 years, 2 months 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 side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
index 12962f9d3b8e02c9afdc915a81186575a6b552dc..0dc3a0a5372ac7041128678bead24c040ff7fa12 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
@@ -345,8 +345,10 @@ class IrBuilder {
bool get isOpen => _root == null || _current != null;
/// Create a parameter for [parameterElement] and add it to the current
- /// environment. If [isClosureVariable] marks whether [parameterElement] is
- /// accessed from an inner function.
+ /// environment.
+ ///
+ /// [isClosureVariable] marks whether [parameterElement] is accessed from an
+ /// inner function.
void createParameter(LocalElement parameterElement,
{bool isClosureVariable: false}) {
ir.Parameter parameter = new ir.Parameter(parameterElement);
@@ -358,11 +360,18 @@ class IrBuilder {
}
}
+ /// Add the constant [variableElement] to the environment with [value] as its
+ /// constant value.
void declareLocalConstant(LocalVariableElement variableElement,
ConstantExpression value) {
state.localConstants.add(new ConstDeclaration(variableElement, value));
}
+ /// Add [variableElement] to the environment with [initialValue] as its
+ /// initial value.
+ ///
+ /// [isClosureVariable] marks whether [variableElement] is accessed from an
+ /// inner function.
void declareLocalVariable(LocalVariableElement variableElement,
{ir.Primitive initialValue,
bool isClosureVariable: false}) {
@@ -451,17 +460,28 @@ class IrBuilder {
}
/// Create a get access of [local].
- ir.Primitive buildGetLocal(Element local) {
+ ir.Primitive buildLocalGet(Element local) {
assert(isOpen);
return environment.lookup(local);
}
/// Create a get access of the static [element].
- ir.Primitive buildGetStatic(Element element, Selector selector) {
+ ir.Primitive buildStaticGet(Element element, Selector selector) {
+ assert(isOpen);
+ assert(selector.isGetter);
+ return continueWithExpression(
+ (k) => new ir.InvokeStatic(
+ element, selector, k, const <ir.Definition>[]));
+ }
+
+ /// Create a dynamic get access on [receiver] where the property is defined
+ /// by the getter [selector].
+ ir.Primitive buildDynamicGet(ir.Primitive receiver, Selector selector) {
assert(isOpen);
assert(selector.isGetter);
return continueWithExpression(
- (k) => new ir.InvokeStatic(element, selector, k, []));
+ (k) => new ir.InvokeMethod(
+ receiver, selector, k, const <ir.Definition>[]));
}
/**
@@ -500,6 +520,28 @@ class IrBuilder {
}
}
+
+ /// Create a super invocation with method name and arguments structure defined
+ /// by [selector] and argument values defined by [arguments].
+ ir.Primitive buildSuperInvocation(Selector selector,
+ List<ir.Definition> arguments) {
+ assert(isOpen);
+ return continueWithExpression(
+ (k) => new ir.InvokeSuperMethod(selector, k, arguments));
+
+ }
+
+ /// Create a dynamic invocation on [receiver] with method name and arguments
+ /// structure defined by [selector] and argument values defined by
+ /// [arguments].
+ ir.Primitive buildDynamicInvocation(ir.Definition receiver,
+ Selector selector,
+ List<ir.Definition> arguments) {
+ assert(isOpen);
+ return continueWithExpression(
+ (k) => new ir.InvokeMethod(receiver, selector, k, arguments));
+ }
+
/// Create a static invocation of [element] with arguments structure defined
/// by [selector] and argument values defined by [arguments].
ir.Primitive buildStaticInvocation(Element element,
@@ -1485,8 +1527,7 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
for (ast.Node n in node.arguments) {
arguments.add(visit(n));
}
- return irBuilder.continueWithExpression(
- (k) => createDynamicInvoke(node, selector, receiver, k, arguments));
+ return irBuilder.buildDynamicInvocation(receiver, selector, arguments);
}
_GetterElements translateGetter(ast.Send node, Selector selector) {
@@ -1504,7 +1545,7 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
irBuilder.add(new ir.LetPrim(result));
} else if (Elements.isLocal(element)) {
// Reference to local variable
- result = irBuilder.buildGetLocal(element);
+ result = irBuilder.buildLocalGet(element);
} else if (element == null ||
Elements.isInstanceField(element) ||
Elements.isInstanceMethod(element) ||
@@ -1535,7 +1576,7 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
// so the vm can fail at runtime.
assert(selector.kind == SelectorKind.GETTER ||
selector.kind == SelectorKind.SETTER);
- result = irBuilder.buildGetStatic(element, selector);
+ result = irBuilder.buildStaticGet(element, selector);
} else if (Elements.isStaticOrTopLevelFunction(element)) {
// Convert a top-level or static function to a function object.
result = translateConstant(node);
@@ -1728,7 +1769,10 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
if (node.isPropertyAccess) {
return visitGetterSend(node);
} else {
- return visitDynamicSend(node);
+ Selector selector = elements.getSelector(node);
+ List<ir.Primitive> arguments =
+ node.arguments.mapToList(visit, growable: false);
+ return irBuilder.buildSuperInvocation(selector, arguments);
}
}
« no previous file with comments | « pkg/analyzer2dart/test/end2end_test.dart ('k') | sdk/lib/_internal/compiler/implementation/use_unused_api.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698