Index: pkg/compiler/lib/src/ssa/codegen.dart |
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart |
index 04a17c47c7a8277013c280a91e549906a316046b..4b9362436217b94c1d9d00a07c71bf0a091534ab 100644 |
--- a/pkg/compiler/lib/src/ssa/codegen.dart |
+++ b/pkg/compiler/lib/src/ssa/codegen.dart |
@@ -1579,7 +1579,9 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
List<js.Expression> arguments = visitArguments(node.inputs); |
push(js.propertyCall(object, methodName, arguments) |
.withSourceInformation(node.sourceInformation)); |
- registry.registerStaticUse(node.element); |
+ registry.registerStaticUse( |
+ new StaticUse.constructorBodyInvoke( |
+ node.element, new CallStructure.unnamed(arguments.length))); |
} |
void visitOneShotInterceptor(HOneShotInterceptor node) { |
@@ -1641,24 +1643,24 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
// may know something about the types of closures that need |
// the specific closure call method. |
Selector call = new Selector.callClosureFrom(selector); |
- registry.registerDynamicInvocation( |
+ registry.registerDynamicUse( |
new UniverseSelector(call, null)); |
} |
- registry.registerDynamicInvocation( |
+ registry.registerDynamicUse( |
new UniverseSelector(selector, mask)); |
} |
void registerSetter(HInvokeDynamic node) { |
Selector selector = node.selector; |
TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); |
- registry.registerDynamicSetter( |
+ registry.registerDynamicUse( |
new UniverseSelector(selector, mask)); |
} |
void registerGetter(HInvokeDynamic node) { |
Selector selector = node.selector; |
TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); |
- registry.registerDynamicGetter( |
+ registry.registerDynamicUse( |
new UniverseSelector(selector, mask)); |
} |
@@ -1685,7 +1687,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
backend.namer.invocationName(call), |
visitArguments(node.inputs)) |
.withSourceInformation(node.sourceInformation)); |
- registry.registerDynamicInvocation( |
+ registry.registerDynamicUse( |
new UniverseSelector(call, null)); |
} |
@@ -1695,7 +1697,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
if (instantiatedTypes != null && !instantiatedTypes.isEmpty) { |
instantiatedTypes.forEach((type) { |
- registry.registerInstantiatedType(type); |
+ registry.registerInstantiation(type); |
}); |
} |
@@ -1710,7 +1712,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
assert(arguments.length == 2); |
Element throwFunction = backend.helpers.throwConcurrentModificationError; |
- registry.registerStaticInvocation(throwFunction); |
+ registry.registerStaticUse( |
+ new StaticUse.staticInvoke(throwFunction, CallStructure.ONE_ARG)); |
// Calling using `(0, #)(#)` instead of `#(#)` separates the property load |
// of the static function access from the call. For some reason this |
@@ -1724,7 +1727,11 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
backend.emitter.staticFunctionAccess(throwFunction), |
arguments[1]])); |
} else { |
- registry.registerStaticInvocation(element); |
+ CallStructure callStructure = new CallStructure.unnamed(arguments.length); |
+ registry.registerStaticUse( |
+ element.isConstructor |
+ ? new StaticUse.constructorInvoke(element, callStructure) |
+ : new StaticUse.staticInvoke(element, callStructure)); |
push(backend.emitter.staticFunctionAccess(element)); |
push(new js.Call(pop(), arguments, |
sourceInformation: node.sourceInformation)); |
@@ -1733,27 +1740,28 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
} |
visitInvokeSuper(HInvokeSuper node) { |
- Element superMethod = node.element; |
- registry.registerSuperInvocation(superMethod); |
- ClassElement superClass = superMethod.enclosingClass; |
- if (superMethod.kind == ElementKind.FIELD) { |
+ Element superElement = node.element; |
+ ClassElement superClass = superElement.enclosingClass; |
+ if (superElement.isField) { |
js.Name fieldName = |
- backend.namer.instanceFieldPropertyName(superMethod); |
+ backend.namer.instanceFieldPropertyName(superElement); |
use(node.inputs[0]); |
js.PropertyAccess access = |
new js.PropertyAccess(pop(), fieldName) |
.withSourceInformation(node.sourceInformation); |
if (node.isSetter) { |
+ registry.registerStaticUse( |
+ new StaticUse.superSet(superElement)); |
use(node.value); |
push(new js.Assignment(access, pop()) |
.withSourceInformation(node.sourceInformation)); |
} else { |
+ registry.registerStaticUse(new StaticUse.superGet(superElement)); |
push(access); |
} |
} else { |
Selector selector = node.selector; |
- |
- if (!backend.maybeRegisterAliasedSuperMember(superMethod, selector)) { |
+ if (!backend.maybeRegisterAliasedSuperMember(superElement, selector)) { |
js.Name methodName; |
if (selector.isGetter) { |
// If the selector we need to register a typed getter to the |
@@ -1766,14 +1774,21 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
new TypeMask.nonNullExact(node.caller.superclass, compiler.world); |
// TODO(floitsch): we know the target. We shouldn't register a |
// dynamic getter. |
- registry.registerDynamicGetter( |
+ registry.registerDynamicUse( |
new UniverseSelector(selector, receiverType)); |
- registry.registerGetterForSuperMethod(node.element); |
+ if (superElement.isFunction) { |
+ registry.registerStaticUse( |
+ new StaticUse.superTearOff(superElement)); |
+ } |
methodName = backend.namer.invocationName(selector); |
} else { |
assert(invariant(node, compiler.hasIncrementalSupport)); |
- methodName = backend.namer.instanceMethodName(superMethod); |
+ methodName = backend.namer.instanceMethodName(superElement); |
} |
+ registry.registerStaticUse( |
+ new StaticUse.superInvoke( |
+ superElement, |
+ new CallStructure.unnamed(node.inputs.length))); |
push(js.js('#.#.call(#)', |
[backend.emitter.prototypeAccess(superClass, |
hasBeenInstantiated: true), |
@@ -1781,9 +1796,13 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
.withSourceInformation(node.sourceInformation)); |
} else { |
use(node.receiver); |
+ registry.registerStaticUse( |
+ new StaticUse.superInvoke( |
+ superElement, |
+ new CallStructure.unnamed(node.inputs.length - 1))); |
push( |
js.js('#.#(#)', [ |
- pop(), backend.namer.aliasedSuperMemberPropertyName(superMethod), |
+ pop(), backend.namer.aliasedSuperMemberPropertyName(superElement), |
visitArguments(node.inputs, start: 1)]) // Skip receiver argument. |
.withSourceInformation(node.sourceInformation)); |
} |
@@ -1809,13 +1828,13 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
js.Name name = backend.namer.instanceFieldPropertyName(element); |
push(new js.PropertyAccess(pop(), name) |
.withSourceInformation(node.sourceInformation)); |
- registry.registerFieldGetter(element); |
+ registry.registerStaticUse(new StaticUse.fieldGet(element)); |
} |
} |
visitFieldSet(HFieldSet node) { |
Element element = node.element; |
- registry.registerFieldSetter(element); |
+ registry.registerStaticUse(new StaticUse.fieldSet(element)); |
js.Name name = backend.namer.instanceFieldPropertyName(element); |
use(node.receiver); |
js.Expression receiver = pop(); |
@@ -1826,7 +1845,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
visitReadModifyWrite(HReadModifyWrite node) { |
Element element = node.element; |
- registry.registerFieldSetter(element); |
+ registry.registerStaticUse(new StaticUse.fieldGet(element)); |
+ registry.registerStaticUse(new StaticUse.fieldSet(element)); |
js.Name name = backend.namer.instanceFieldPropertyName(element); |
use(node.receiver); |
js.Expression fieldReference = new js.PropertyAccess(pop(), name); |
@@ -1901,7 +1921,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
return; |
} |
node.instantiatedTypes.forEach((type) { |
- registry.registerInstantiatedType(type); |
+ registry.registerInstantiation(type); |
}); |
} |
@@ -1921,7 +1941,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
SourceInformation sourceInformation) { |
if (constant.isFunction) { |
FunctionConstantValue function = constant; |
- registry.registerStaticUse(function.element); |
+ registry.registerStaticUse( |
+ new StaticUse.staticTearOff(function.element)); |
} |
if (constant.isType) { |
// If the type is a web component, we need to ensure the constructors are |
@@ -2157,7 +2178,6 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
void generateThrowWithHelper(Element helper, argument, |
{SourceInformation sourceInformation}) { |
- registry.registerStaticUse(helper); |
js.Expression jsHelper = backend.emitter.staticFunctionAccess(helper); |
List arguments = []; |
var location; |
@@ -2172,6 +2192,9 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
use(argument); |
arguments.add(pop()); |
} |
+ registry.registerStaticUse( |
+ new StaticUse.staticInvoke( |
+ helper, new CallStructure.unnamed(arguments.length))); |
js.Call value = new js.Call(jsHelper, arguments.toList(growable: false), |
sourceInformation: sourceInformation); |
// BUG(4906): Using throw/return here adds to the size of the generated code |
@@ -2200,7 +2223,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
use(argument); |
Element helper = helpers.throwExpressionHelper; |
- registry.registerStaticUse(helper); |
+ registry.registerStaticUse( |
+ new StaticUse.staticInvoke(helper, CallStructure.ONE_ARG)); |
js.Expression jsHelper = backend.emitter.staticFunctionAccess(helper); |
js.Call value = new js.Call(jsHelper, [pop()]) |
@@ -2218,17 +2242,20 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
if (element.isFunction) { |
push(backend.emitter.isolateStaticClosureAccess(element) |
.withSourceInformation(node.sourceInformation)); |
- registry.registerGetOfStaticFunction(element); |
+ registry.registerStaticUse( |
+ new StaticUse.staticTearOff(element)); |
} else { |
push(backend.emitter.staticFieldAccess(element) |
.withSourceInformation(node.sourceInformation)); |
+ registry.registerStaticUse( |
+ new StaticUse.staticGet(element)); |
} |
- registry.registerStaticUse(element); |
} |
void visitLazyStatic(HLazyStatic node) { |
Element element = node.element; |
- registry.registerStaticUse(element); |
+ registry.registerStaticUse( |
+ new StaticUse.staticInit(element)); |
js.Expression lazyGetter = |
backend.emitter.isolateLazyInitializerAccess(element); |
js.Call call = new js.Call(lazyGetter, <js.Expression>[], |
@@ -2237,7 +2264,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
} |
void visitStaticStore(HStaticStore node) { |
- registry.registerStaticUse(node.element); |
+ registry.registerStaticUse( |
+ new StaticUse.staticSet(node.element)); |
js.Node variable = backend.emitter.staticFieldAccess(node.element); |
use(node.inputs[0]); |
push(new js.Assignment(variable, pop()) |
@@ -2271,7 +2299,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
} |
} else { |
Element convertToString = backend.helpers.stringInterpolationHelper; |
- registry.registerStaticUse(convertToString); |
+ registry.registerStaticUse( |
+ new StaticUse.staticInvoke(convertToString, CallStructure.ONE_ARG)); |
js.Expression jsHelper = |
backend.emitter.staticFunctionAccess(convertToString); |
use(input); |
@@ -2506,7 +2535,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
push(new js.Prefix('!', pop()) |
.withSourceInformation(sourceInformation)); |
} |
- registry.registerInstantiatedType(type); |
+ registry.registerInstantiation(type); |
} |
void handleNumberOrStringSupertypeCheck(HInstruction input, |
@@ -2831,7 +2860,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
void visitReadTypeVariable(HReadTypeVariable node) { |
TypeVariableElement element = node.dartType.element; |
Element helperElement = helpers.convertRtiToRuntimeType; |
- registry.registerStaticUse(helperElement); |
+ registry.registerStaticUse( |
+ new StaticUse.staticInvoke(helperElement, CallStructure.ONE_ARG)); |
use(node.inputs[0]); |
if (node.hasReceiver) { |
@@ -2866,7 +2896,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
if (!typeArguments.isEmpty) { |
arguments.add(new js.ArrayInitializer(typeArguments)); |
} |
- push(js.js('#(#)', [accessHelper('buildInterfaceType'), arguments])); |
+ push(js.js('#(#)', |
+ [accessHelper('buildInterfaceType', arguments.length), arguments])); |
} |
void visitVoidType(HVoidType node) { |
@@ -2877,13 +2908,15 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
push(js.js('#()', accessHelper('getDynamicRuntimeType'))); |
} |
- js.PropertyAccess accessHelper(String name) { |
+ js.PropertyAccess accessHelper(String name, [int argumentCount = 0]) { |
Element helper = helpers.findHelper(name); |
if (helper == null) { |
// For mocked-up tests. |
return js.js('(void 0).$name'); |
} |
- registry.registerStaticUse(helper); |
+ registry.registerStaticUse( |
+ new StaticUse.staticInvoke(helper, |
+ new CallStructure.unnamed(argumentCount))); |
return backend.emitter.staticFunctionAccess(helper); |
} |