Index: pkg/fletchc/lib/src/codegen_visitor.dart |
diff --git a/pkg/fletchc/lib/src/codegen_visitor.dart b/pkg/fletchc/lib/src/codegen_visitor.dart |
index 9a1b0c9055e2456a661f7d9998b6b161c60b9bf6..a21ea995ba990a1a426a23c151849b62af4cb522 100644 |
--- a/pkg/fletchc/lib/src/codegen_visitor.dart |
+++ b/pkg/fletchc/lib/src/codegen_visitor.dart |
@@ -20,18 +20,26 @@ import 'package:compiler/src/constants/expressions.dart' show |
ConstructedConstantExpression, |
TypeConstantExpression; |
-import 'package:compiler/src/dart2jslib.dart' show |
- MessageKind, |
- Registry; |
+import 'package:compiler/src/resolution/tree_elements.dart' show |
+ TreeElements; |
import 'package:compiler/src/util/util.dart' show |
Link; |
+import 'package:compiler/src/common/names.dart' show |
+ Names, |
+ Selectors; |
+ |
+import 'package:compiler/src/universe/use.dart' show DynamicUse, StaticUse; |
+ |
import 'package:compiler/src/elements/elements.dart'; |
-import 'package:compiler/src/resolution/resolution.dart'; |
import 'package:compiler/src/tree/tree.dart'; |
-import 'package:compiler/src/universe/universe.dart'; |
-import 'package:compiler/src/util/util.dart' show Spannable; |
+import 'package:compiler/src/universe/call_structure.dart' show |
+ CallStructure; |
+import 'package:compiler/src/universe/selector.dart' show |
+ Selector; |
+import 'package:compiler/src/diagnostics/spannable.dart' show |
+ Spannable; |
import 'package:compiler/src/dart_types.dart'; |
import 'fletch_context.dart'; |
@@ -39,7 +47,6 @@ import 'fletch_context.dart'; |
import 'fletch_backend.dart'; |
import 'fletch_constants.dart' show |
- FletchFunctionBuilderConstant, |
FletchClassConstant, |
FletchClassInstanceConstant; |
@@ -213,7 +220,8 @@ abstract class CodegenVisitor |
ConstructorBulkMixin, |
InitializerBulkMixin, |
BaseImplementationOfStaticsMixin, |
- BaseImplementationOfLocalsMixin |
+ BaseImplementationOfLocalsMixin, |
+ SetIfNullBulkMixin |
implements SemanticSendVisitor, SemanticDeclarationVisitor { |
// A literal int can have up to 31 bits of information (32 minus sign). |
static const int LITERAL_INT_MAX = 0x3FFFFFFF; |
@@ -226,8 +234,6 @@ abstract class CodegenVisitor |
final ExecutableElement element; |
- final MemberElement member; |
- |
final FletchFunctionBuilder functionBuilder; |
final Map<Element, LocalValue> scope = <Element, LocalValue>{}; |
@@ -370,13 +376,9 @@ abstract class CodegenVisitor |
scope.remove(local); |
} |
- void registerDynamicInvocation(Selector selector); |
- |
- void registerDynamicGetter(Selector selector); |
+ void registerDynamicUse(DynamicUse use); |
- void registerDynamicSetter(Selector selector); |
- |
- void registerStaticInvocation(FunctionElement function); |
+ void registerStaticUse(StaticUse use); |
void registerInstantiatedClass(ClassElement klass); |
@@ -392,7 +394,7 @@ abstract class CodegenVisitor |
int compileLazyFieldInitializer(FieldElement field); |
void invokeMethod(Node node, Selector selector) { |
- registerDynamicInvocation(selector); |
+ registerDynamicUse(new DynamicUse(selector, null)); |
String symbol = context.getSymbolFromSelector(selector); |
int id = context.getSymbolId(symbol); |
int arity = selector.argumentCount; |
@@ -400,17 +402,17 @@ abstract class CodegenVisitor |
assembler.invokeMethod(fletchSelector, arity, selector.name); |
} |
- void invokeGetter(Node node, Selector selector) { |
- registerDynamicGetter(selector); |
- String symbol = context.getSymbolFromSelector(selector); |
+ void invokeGetter(Node node, Name name) { |
+ registerDynamicUse(new DynamicUse(new Selector.getter(name), null)); |
+ String symbol = context.mangleName(name); |
int id = context.getSymbolId(symbol); |
int fletchSelector = FletchSelector.encodeGetter(id); |
assembler.invokeMethod(fletchSelector, 0); |
} |
- void invokeSetter(Node node, Selector selector) { |
- registerDynamicSetter(selector); |
- String symbol = context.getSymbolFromSelector(selector); |
+ void invokeSetter(Node node, Name name) { |
+ registerDynamicUse(new DynamicUse(new Selector.setter(name), null)); |
+ String symbol = context.mangleName(name); |
int id = context.getSymbolId(symbol); |
int fletchSelector = FletchSelector.encodeSetter(id); |
assembler.invokeMethod(fletchSelector, 1); |
@@ -452,7 +454,7 @@ abstract class CodegenVisitor |
} |
FletchFunctionBase requireFunction(FunctionElement element) { |
- registerStaticInvocation(element); |
+ registerStaticUse(new StaticUse.foreignUse(element)); |
Johnni Winther
2015/11/19 10:17:26
Add TODO for me to use a precise StaticUse in all
sigurdm
2015/11/19 14:33:46
Done.
|
return context.backend.getFunctionForElement(element); |
} |
@@ -460,7 +462,7 @@ abstract class CodegenVisitor |
ConstructorElement constructor) { |
assert(constructor.isGenerativeConstructor); |
registerInstantiatedClass(constructor.enclosingClass); |
- registerStaticInvocation(constructor); |
+ registerStaticUse(new StaticUse.foreignUse(constructor)); |
return context.backend.getConstructorInitializerFunction(constructor); |
} |
@@ -912,7 +914,7 @@ abstract class CodegenVisitor |
TypedefType typedefType = type; |
int arity = typedefType.element.functionSignature.parameterCount; |
int fletchSelector = context.toFletchIsSelector( |
- context.backend.compiler.functionClass, arity); |
+ context.backend.compiler.coreClasses.functionClass, arity); |
assembler.invokeTest(fletchSelector, 0); |
return; |
} |
@@ -1004,7 +1006,7 @@ abstract class CodegenVisitor |
void doMainCall(Send node, NodeList arguments) { |
FunctionElement function = context.compiler.mainFunction; |
- if (function.isErroneous) { |
+ if (function.isMalformed) { |
doCompileError(); |
return; |
} |
@@ -1078,7 +1080,7 @@ abstract class CodegenVisitor |
} |
void doSuperCall(Node node, FunctionElement function) { |
- registerStaticInvocation(function); |
+ registerStaticUse(new StaticUse.foreignUse(function)); |
int arity = function.functionSignature.parameterCount + 1; |
FletchFunctionBase base = requireFunction(function); |
int constId = functionBuilder.allocateConstantFromFunction(base.functionId); |
@@ -1300,9 +1302,8 @@ abstract class CodegenVisitor |
// TODO(ajohnsen): Remove hack - dart2js has a problem with generating |
Johnni Winther
2015/11/19 10:17:26
Is this still needed? If so, please update the TOD
sigurdm
2015/11/19 14:33:46
Every test fails without this, so I removed it.
a
|
// selectors in initializer bodies. |
selector = new Selector.call( |
- node.selector.asIdentifier().source, |
- element.library, |
- arguments.slowLength()); |
+ new Name(node.selector.asIdentifier().source, element.library), |
+ new CallStructure(arguments.slowLength())); |
} |
visitForValue(receiver); |
for (Node argument in arguments) { |
@@ -1312,6 +1313,23 @@ abstract class CodegenVisitor |
applyVisitState(); |
} |
+ void visitIfNull( |
+ Send node, |
+ Node left, |
+ Node right, |
+ _) { |
+ BytecodeLabel end = new BytecodeLabel(); |
+ visitForValue(left); |
+ assembler.dup(); |
+ assembler.loadLiteralNull(); |
+ assembler.identicalNonNumeric(); |
+ assembler.branchIfFalse(end); |
+ assembler.pop(); |
+ visitForValue(right); |
+ assembler.bind(end); |
+ applyVisitState(); |
+ } |
+ |
void doIfNotNull(Node receiver, void ifNotNull()) { |
BytecodeLabel end = new BytecodeLabel(); |
visitForValue(receiver); |
@@ -1342,13 +1360,14 @@ abstract class CodegenVisitor |
Send node, |
Expression receiver, |
NodeList arguments, |
- Selector selector, |
+ CallStructure callStructure, |
_) { |
visitForValue(receiver); |
for (Node argument in arguments) { |
visitForValue(argument); |
} |
- invokeMethod(node, selector); |
+ invokeMethod(node, |
+ new Selector.call(Names.call, callStructure)); |
applyVisitState(); |
} |
@@ -1365,7 +1384,7 @@ abstract class CodegenVisitor |
// statically known - that is not always the case. Implement VM support? |
Element target = elements[node]; |
if (target != null && target.isField) { |
- invokeGetter(node, new Selector.getter(target.name, element.library)); |
+ invokeGetter(node, new Name(target.name, element.library)); |
selector = new Selector.callClosureFrom(selector); |
} |
for (Node argument in arguments) { |
@@ -1400,16 +1419,15 @@ abstract class CodegenVisitor |
void visitDynamicPropertyGet( |
Send node, |
Node receiver, |
- Selector selector, |
+ Name name, |
_) { |
- if (selector == null) { |
+ if (name == null) { |
// TODO(ajohnsen): Remove hack - dart2js has a problem with generating |
// selectors in initializer bodies. |
Johnni Winther
2015/11/19 10:17:26
Update comment like mentioned above.
sigurdm
2015/11/19 14:33:46
Done.
|
- selector = new Selector.getter( |
- node.selector.asIdentifier().source, |
+ name = new Name(node.selector.asIdentifier().source, |
element.library); |
} |
- if (selector.name == "runtimeType") { |
+ if (name.text == "runtimeType") { |
// TODO(ahe): Implement runtimeType. |
generateUnimplementedError( |
node, |
@@ -1418,38 +1436,38 @@ abstract class CodegenVisitor |
return; |
} |
visitForValue(receiver); |
- invokeGetter(node, selector); |
+ invokeGetter(node, name); |
applyVisitState(); |
} |
void visitIfNotNullDynamicPropertyGet( |
Send node, |
Node receiver, |
- Selector selector, |
+ Name name, |
_) { |
doIfNotNull(receiver, () { |
- invokeGetter(node, selector); |
+ invokeGetter(node, name); |
}); |
applyVisitState(); |
} |
void visitThisPropertyGet( |
Send node, |
- Selector selector, |
+ Name name, |
_) { |
loadThis(); |
- invokeGetter(node, selector); |
+ invokeGetter(node, name); |
applyVisitState(); |
} |
void visitThisPropertySet( |
Send node, |
- Selector selector, |
+ Name name, |
Node rhs, |
_) { |
loadThis(); |
visitForValue(rhs); |
- invokeSetter(node, selector); |
+ invokeSetter(node, name); |
applyVisitState(); |
} |
@@ -1478,36 +1496,37 @@ abstract class CodegenVisitor |
applyVisitState(); |
} |
- void visitAssert(Send node, Node expression, _) { |
+ void visitAssert(Assert node) { |
// TODO(ajohnsen): Emit assert in checked mode. |
} |
void visitDynamicPropertySet( |
Send node, |
Node receiver, |
- Selector selector, |
+ Name name, |
Node rhs, |
_) { |
visitForValue(receiver); |
visitForValue(rhs); |
- invokeSetter(node, selector); |
+ invokeSetter(node, name); |
applyVisitState(); |
} |
void visitIfNotNullDynamicPropertySet( |
SendSet node, |
Node receiver, |
- Selector selector, |
+ Name name, |
Node rhs, |
_) { |
doIfNotNull(receiver, () { |
visitForValue(rhs); |
- invokeSetter(node, selector); |
+ invokeSetter(node, name); |
}); |
applyVisitState(); |
} |
- void doStaticFieldSet(FieldElement field) { |
+ void doStaticFieldSet( |
+ FieldElement field) { |
int index = context.getStaticFieldIndex(field, element); |
assembler.storeStatic(index); |
} |
@@ -1534,13 +1553,12 @@ abstract class CodegenVisitor |
} |
void visitStringInterpolation(StringInterpolation node) { |
- // TODO(ajohnsen): Cache these in context/backend. |
- Selector toString = new Selector.call('toString', null, 0); |
+ // TODO(ajohnsen): Cache this in context/backend. |
Selector concat = new Selector.binaryOperator('+'); |
visitForValueNoDebugInfo(node.string); |
for (StringInterpolationPart part in node.parts) { |
visitForValue(part.expression); |
- invokeMethod(part.expression, toString); |
+ invokeMethod(part.expression, Selectors.toString); |
LiteralString string = part.string; |
if (string.dartString.isNotEmpty) { |
visitForValueNoDebugInfo(string); |
@@ -1555,7 +1573,7 @@ abstract class CodegenVisitor |
if (visitState == VisitState.Value) { |
assembler.loadLiteralNull(); |
} else if (visitState == VisitState.Test) { |
- assembler.branch(falseLabel); |
+ if (falseLabel != null) assembler.branch(falseLabel); |
Anders Johnsen
2015/11/18 06:46:55
Did this work before?
sigurdm
2015/11/19 14:33:46
No - but no tests triggered it before.
|
} |
} |
@@ -1602,7 +1620,7 @@ abstract class CodegenVisitor |
assembler.loadLiteral(value); |
} |
} else if (visitState == VisitState.Test) { |
- assembler.branch(falseLabel); |
+ if (falseLabel != null) assembler.branch(falseLabel); |
} |
} |
@@ -1610,7 +1628,7 @@ abstract class CodegenVisitor |
if (visitState == VisitState.Value) { |
assembler.loadConst(allocateConstantFromNode(node)); |
} else if (visitState == VisitState.Test) { |
- assembler.branch(falseLabel); |
+ if (falseLabel != null) assembler.branch(falseLabel); |
} |
} |
@@ -1629,7 +1647,8 @@ abstract class CodegenVisitor |
// Call with empty arguments, as we call the default constructor. |
callConstructor( |
node, constructor, new NodeList.empty(), CallStructure.NO_ARGS); |
- Selector add = new Selector.call('add', null, 1); |
+ Selector add = new Selector.call(new Name('add', null), |
+ CallStructure.ONE_ARG); |
for (Node element in node.elements) { |
assembler.dup(); |
visitForValue(element); |
@@ -1646,8 +1665,9 @@ abstract class CodegenVisitor |
applyVisitState(); |
return; |
} |
- ClassElement literalClass = context.backend.mapImplementation; |
- ConstructorElement constructor = literalClass.lookupDefaultConstructor(); |
+ ClassElement literalClass = |
+ context.backend.mapImplementation.implementation; |
+ ConstructorElement constructor = literalClass.lookupConstructor(""); |
if (constructor == null) { |
internalError(literalClass, "Failed to lookup default map constructor"); |
return; |
@@ -1892,82 +1912,74 @@ abstract class CodegenVisitor |
void doDynamicPropertyCompound( |
Node node, |
+ Name name, |
AssignmentOperator operator, |
- Node rhs, |
- Selector getterSelector, |
- Selector setterSelector) { |
+ Node rhs) { |
// Dup receiver for setter. |
assembler.dup(); |
- invokeGetter(node, getterSelector); |
+ invokeGetter(node, name); |
visitForValue(rhs); |
invokeMethod(node, getAssignmentSelector(operator)); |
- invokeSetter(node, setterSelector); |
+ invokeSetter(node, name); |
} |
void visitDynamicPropertyCompound( |
Send node, |
Node receiver, |
+ Name name, |
AssignmentOperator operator, |
Node rhs, |
- Selector getterSelector, |
- Selector setterSelector, |
_) { |
visitForValue(receiver); |
doDynamicPropertyCompound( |
node, |
+ name, |
operator, |
- rhs, |
- getterSelector, |
- setterSelector); |
+ rhs); |
applyVisitState(); |
} |
void visitIfNotNullDynamicPropertyCompound( |
Send node, |
Node receiver, |
+ Name name, |
AssignmentOperator operator, |
Node rhs, |
- Selector getterSelector, |
- Selector setterSelector, |
_) { |
doIfNotNull(receiver, () { |
doDynamicPropertyCompound( |
node, |
+ name, |
operator, |
- rhs, |
- getterSelector, |
- setterSelector); |
+ rhs); |
}); |
applyVisitState(); |
} |
void visitThisPropertyCompound( |
Send node, |
+ Name name, |
AssignmentOperator operator, |
Node rhs, |
- Selector getterSelector, |
- Selector setterSelector, |
_) { |
loadThis(); |
doDynamicPropertyCompound( |
node, |
+ name, |
operator, |
- rhs, |
- getterSelector, |
- setterSelector); |
+ rhs); |
applyVisitState(); |
} |
void doDynamicPrefix( |
Node node, |
- IncDecOperator operator, |
- Selector getterSelector, |
- Selector setterSelector) { |
+ Name name, |
+ IncDecOperator operator) { |
assembler.dup(); |
- invokeGetter(node, getterSelector); |
+ invokeGetter(node, name); |
assembler.loadLiteral(1); |
invokeMethod(node, getIncDecSelector(operator)); |
- invokeSetter(node, setterSelector); |
+ invokeSetter(node, name); |
} |
void doIndexPrefix( |
@@ -2048,39 +2060,37 @@ abstract class CodegenVisitor |
void visitThisPropertyPrefix( |
Send node, |
+ Name name, |
IncDecOperator operator, |
- Selector getterSelector, |
- Selector setterSelector, |
_) { |
loadThis(); |
- doDynamicPrefix(node, operator, getterSelector, setterSelector); |
+ doDynamicPrefix(node, name, operator); |
applyVisitState(); |
} |
void visitThisPropertyPostfix( |
Send node, |
+ Name name, |
IncDecOperator operator, |
- Selector getterSelector, |
- Selector setterSelector, |
_) { |
// If visitState is for effect, we can ignore the return value, thus always |
// generate code for the simpler 'prefix' case. |
if (visitState == VisitState.Effect) { |
loadThis(); |
- doDynamicPrefix(node, operator, getterSelector, setterSelector); |
+ doDynamicPrefix(node, name, operator); |
applyVisitState(); |
return; |
} |
loadThis(); |
- invokeGetter(node, getterSelector); |
+ invokeGetter(node, name); |
// For postfix, keep local, unmodified version, to 'return' after store. |
assembler.dup(); |
assembler.loadLiteral(1); |
invokeMethod(node, getIncDecSelector(operator)); |
loadThis(); |
assembler.loadLocal(1); |
- invokeSetter(node, setterSelector); |
+ invokeSetter(node, name); |
assembler.popMany(2); |
applyVisitState(); |
} |
@@ -2088,24 +2098,22 @@ abstract class CodegenVisitor |
void visitDynamicPropertyPrefix( |
Send node, |
Node receiver, |
+ Name name, |
IncDecOperator operator, |
- Selector getterSelector, |
- Selector setterSelector, |
_) { |
visitForValue(receiver); |
- doDynamicPrefix(node, operator, getterSelector, setterSelector); |
+ doDynamicPrefix(node, name, operator); |
applyVisitState(); |
} |
void visitIfNotNullDynamicPropertyPrefix( |
Send node, |
Node receiver, |
+ Name name, |
IncDecOperator operator, |
- Selector getterSelector, |
- Selector setterSelector, |
_) { |
doIfNotNull(receiver, () { |
- doDynamicPrefix(node, operator, getterSelector, setterSelector); |
+ doDynamicPrefix(node, name, operator); |
}); |
applyVisitState(); |
} |
@@ -2113,19 +2121,18 @@ abstract class CodegenVisitor |
void doDynamicPostfix( |
Send node, |
Node receiver, |
- IncDecOperator operator, |
- Selector getterSelector, |
- Selector setterSelector) { |
+ Name name, |
+ IncDecOperator operator) { |
int receiverSlot = assembler.stackSize - 1; |
assembler.loadSlot(receiverSlot); |
- invokeGetter(node, getterSelector); |
+ invokeGetter(node, name); |
// For postfix, keep local, unmodified version, to 'return' after store. |
assembler.dup(); |
assembler.loadLiteral(1); |
invokeMethod(node, getIncDecSelector(operator)); |
assembler.loadSlot(receiverSlot); |
assembler.loadLocal(1); |
- invokeSetter(node, setterSelector); |
+ invokeSetter(node, name); |
assembler.popMany(2); |
assembler.storeLocal(1); |
// Pop receiver. |
@@ -2135,34 +2142,32 @@ abstract class CodegenVisitor |
void visitDynamicPropertyPostfix( |
Send node, |
Node receiver, |
+ Name name, |
IncDecOperator operator, |
- Selector getterSelector, |
- Selector setterSelector, |
_) { |
// If visitState is for effect, we can ignore the return value, thus always |
// generate code for the simpler 'prefix' case. |
if (visitState == VisitState.Effect) { |
visitForValue(receiver); |
- doDynamicPrefix(node, operator, getterSelector, setterSelector); |
+ doDynamicPrefix(node, name, operator); |
applyVisitState(); |
return; |
} |
visitForValue(receiver); |
- doDynamicPostfix(node, receiver, operator, getterSelector, setterSelector); |
+ doDynamicPostfix(node, receiver, name, operator); |
applyVisitState(); |
} |
void visitIfNotNullDynamicPropertyPostfix( |
Send node, |
Node receiver, |
+ Name name, |
IncDecOperator operator, |
- Selector getterSelector, |
- Selector setterSelector, |
_) { |
doIfNotNull(receiver, () { |
doDynamicPostfix( |
- node,receiver, operator, getterSelector, setterSelector); |
+ node, receiver, name, operator); |
}); |
applyVisitState(); |
} |
@@ -2759,14 +2764,15 @@ abstract class CodegenVisitor |
// Evalutate expression and iterator. |
visitForValue(node.expression); |
- invokeGetter(node.expression, new Selector.getter('iterator', null)); |
+ invokeGetter(node.expression, Names.iterator); |
jumpInfo[node] = new JumpInfo(assembler.stackSize, start, end); |
assembler.bind(start); |
assembler.dup(); |
- invokeMethod(node, new Selector.call('moveNext', null, 0)); |
+ invokeMethod(node, |
+ new Selector.call(Names.moveNext, CallStructure.NO_ARGS)); |
Johnni Winther
2015/11/19 10:17:26
This is Selectors.moveNext
sigurdm
2015/11/19 14:33:46
Done.
|
assembler.branchIfFalse(end); |
bool isVariableDeclaration = node.declaredIdentifier.asSend() == null; |
@@ -2775,24 +2781,24 @@ abstract class CodegenVisitor |
// Create local value and load the current element to it. |
LocalValue value = createLocalValueFor(element); |
assembler.dup(); |
- invokeGetter(node, new Selector.getter('current', null)); |
+ invokeGetter(node, Names.current); |
value.initialize(assembler); |
pushVariableDeclaration(value); |
} else { |
if (element == null || element.isInstanceMember) { |
loadThis(); |
assembler.loadLocal(1); |
- invokeGetter(node, new Selector.getter('current', null)); |
+ invokeGetter(node, Names.current); |
Selector selector = elements.getSelector(node.declaredIdentifier); |
- invokeSetter(node, selector); |
+ invokeSetter(node, selector.memberName); |
} else { |
assembler.dup(); |
- invokeGetter(node, new Selector.getter('current', null)); |
+ invokeGetter(node, Names.current); |
if (element.isLocal) { |
scope[element].store(assembler); |
} else if (element.isField) { |
doStaticFieldSet(element); |
- } else if (element.isErroneous) { |
+ } else if (element.isMalformed) { |
doUnresolved(element.name); |
assembler.pop(); |
} else { |
@@ -3104,7 +3110,7 @@ abstract class CodegenVisitor |
} |
void internalError(Spannable spannable, String reason) { |
- context.compiler.internalError(spannable, reason); |
+ context.compiler.reporter.internalError(spannable, reason); |
} |
void generateUnimplementedError(Spannable spannable, String reason) { |
@@ -3171,11 +3177,19 @@ abstract class CodegenVisitor |
MethodElement function, |
Node rhs, |
_) { |
+ new List(); |
ahe
2015/11/17 16:44:08
?
sigurdm
2015/11/19 14:33:46
Oops.
Removed
|
generateUnimplementedError( |
node, "[handleStaticFunctionSet] isn't implemented."); |
applyVisitState(); |
} |
+ @override |
+ void bulkHandleSetIfNull(Node node, _) { |
+ generateUnimplementedError( |
+ node, "[bulkHandleSetIfNull] isn't implemented."); |
+ applyVisitState(); |
+ } |
+ |
void previsitDeferredAccess(Send node, PrefixElement prefix, _) { |
// We don't support deferred access, so nothing to do for now. |
} |
@@ -3206,20 +3220,12 @@ abstract class FletchRegistryMixin { |
FletchRegistry get registry; |
FletchContext get context; |
- void registerDynamicInvocation(Selector selector) { |
- registry.registerDynamicInvocation(new UniverseSelector(selector, null)); |
- } |
- |
- void registerDynamicGetter(Selector selector) { |
- registry.registerDynamicGetter(new UniverseSelector(selector, null)); |
- } |
- |
- void registerDynamicSetter(Selector selector) { |
- registry.registerDynamicSetter(new UniverseSelector(selector, null)); |
+ void registerDynamicUse(DynamicUse use) { |
ahe
2015/11/17 16:44:08
This doesn't seem like the right API to me. We sho
sigurdm
2015/11/19 14:33:46
Done.
|
+ registry.registerDynamicUse(use); |
} |
- void registerStaticInvocation(FunctionElement function) { |
- registry.registerStaticInvocation(function); |
+ void registerStaticUse(StaticUse staticUse) { |
+ registry.registerStaticUse(staticUse); |
} |
void registerInstantiatedClass(ClassElement klass) { |
@@ -3236,11 +3242,11 @@ abstract class FletchRegistryMixin { |
void registerClosurization(FunctionElement element, ClosureKind kind) { |
if (kind == ClosureKind.localFunction) { |
- // TODO(ahe): Get rid of the call to [registerStaticInvocation]. It is |
+ // TODO(ahe): Get rid of the call to [registerStaticUse]. It is |
// currently needed to ensure that local function expression closures are |
// compiled correctly. For example, `[() {}].last()`, notice that `last` |
// is a getter. This happens for both named and unnamed. |
- registerStaticInvocation(element); |
+ registerStaticUse(new StaticUse.foreignUse(element)); |
} |
registry.registerClosurization(element, kind); |
} |