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

Unified Diff: pkg/compiler/lib/src/inferrer/inferrer_engine.dart

Issue 2965223002: Change inference element invariants (Closed)
Patch Set: Updated cf. comments Created 3 years, 5 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
« no previous file with comments | « pkg/compiler/lib/src/inferrer/closure_tracer.dart ('k') | pkg/compiler/lib/src/inferrer/list_tracer.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/inferrer/inferrer_engine.dart
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index cb7475b1a400e4e4d8ae713eaa0daaddcb545c1e..1f68137b3adeeb995e1843ce73d4928b46441b9b 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -312,8 +312,7 @@ class InferrerEngine {
}
// This also forces the creation of the [ElementTypeInformation] to ensure
// it is in the graph.
- types.withMember(
- resolvedAst.element.implementation, () => analyze(resolvedAst, null));
+ types.withMember(resolvedAst.element, () => analyze(resolvedAst, null));
});
reporter.log('Added $addedInGraph elements in inferencing graph.');
@@ -334,18 +333,22 @@ class InferrerEngine {
analyzeMapAndEnqueue(info);
});
- Set<MethodElement> bailedOutOn = new Set<MethodElement>();
+ Set<FunctionEntity> bailedOutOn = new Set<FunctionEntity>();
// Trace closures to potentially infer argument types.
types.allocatedClosures.forEach((dynamic info) {
void trace(
- Iterable<MethodElement> elements, ClosureTracerVisitor tracer) {
+ Iterable<FunctionEntity> elements, ClosureTracerVisitor tracer) {
tracer.run();
if (!tracer.continueAnalyzing) {
- elements.forEach((MethodElement e) {
- closedWorldRefiner.registerMightBePassedToApply(e);
- if (debug.VERBOSE) print("traced closure $e as ${true} (bail)");
- e.functionSignature.forEachParameter((parameter) {
+ elements.forEach((FunctionEntity _element) {
+ MethodElement element = _element;
+ MethodElement implementation = element.implementation;
+ closedWorldRefiner.registerMightBePassedToApply(element);
+ if (debug.VERBOSE) {
+ print("traced closure $element as ${true} (bail)");
+ }
+ implementation.functionSignature.forEachParameter((parameter) {
types
.getInferredTypeOfParameter(parameter)
.giveUp(this, clearAssignments: false);
@@ -356,19 +359,21 @@ class InferrerEngine {
}
elements
.where((e) => !bailedOutOn.contains(e))
- .forEach((MethodElement e) {
- e.functionSignature.forEachParameter((parameter) {
+ .forEach((FunctionEntity _element) {
+ MethodElement element = _element;
+ MethodElement implementation = element.implementation;
+ implementation.functionSignature.forEachParameter((parameter) {
var info = types.getInferredTypeOfParameter(parameter);
info.maybeResume();
workQueue.add(info);
});
if (tracer.tracedType.mightBePassedToFunctionApply) {
- closedWorldRefiner.registerMightBePassedToApply(e);
+ closedWorldRefiner.registerMightBePassedToApply(element);
}
if (debug.VERBOSE) {
- print("traced closure $e as "
+ print("traced closure $element as "
"${closedWorldRefiner
- .getCurrentlyKnownMightBePassedToApply(e)}");
+ .getCurrentlyKnownMightBePassedToApply(element)}");
}
});
}
@@ -382,22 +387,23 @@ class InferrerEngine {
info.selector.isCall) {
// This is a constructor call to a class with a call method. So we
// need to trace the call method here.
- assert(info.calledElement.isGenerativeConstructor);
- ClassElement cls = info.calledElement.enclosingClass;
+ MethodElement calledElement = info.calledElement;
+ assert(calledElement.isGenerativeConstructor);
+ ClassElement cls = calledElement.enclosingClass;
MethodElement callMethod = cls.lookupMember(Identifiers.call);
assert(callMethod != null, failedAt(cls));
- Iterable<MethodElement> elements = [callMethod];
+ Iterable<FunctionEntity> elements = [callMethod];
trace(elements, new ClosureTracerVisitor(elements, info, this));
} else {
// We only are interested in functions here, as other targets
// of this closure call are not a root to trace but an intermediate
// for some other function.
- Iterable<MethodElement> elements = new List<MethodElement>.from(
+ Iterable<FunctionEntity> elements = new List<FunctionEntity>.from(
info.callees.where((e) => e.isFunction));
trace(elements, new ClosureTracerVisitor(elements, info, this));
}
} else if (info is MemberTypeInformation) {
- trace([info.member],
+ trace(<FunctionEntity>[info.member],
new StaticTearOffClosureTracerVisitor(info.member, info, this));
} else if (info is ParameterTypeInformation) {
throw new SpannableAssertionFailure(
@@ -476,7 +482,7 @@ class InferrerEngine {
}
void analyze(ResolvedAst resolvedAst, ArgumentsTypes arguments) {
- MemberElement element = resolvedAst.element.implementation;
+ MemberElement element = resolvedAst.element;
if (analyzedElements.contains(element)) return;
analyzedElements.add(element);
@@ -564,7 +570,7 @@ class InferrerEngine {
types.allocatedCalls.forEach((dynamic info) {
if (!info.inLoop) return;
if (info is StaticCallSiteTypeInformation) {
- MemberElement member = info.calledElement.declaration;
+ MemberEntity member = info.calledElement;
closedWorldRefiner.addFunctionCalledInLoop(member);
} else if (info.mask != null && !info.mask.containsAll(closedWorld)) {
// For instance methods, we only register a selector called in a
@@ -621,7 +627,7 @@ class InferrerEngine {
* wheter assignments must be added or removed. If [init] is false,
* parameters are added to the work queue.
*/
- void updateParameterAssignments(TypeInformation caller, Element callee,
+ void updateParameterAssignments(TypeInformation caller, MemberEntity callee,
ArgumentsTypes arguments, Selector selector, TypeMask mask,
{bool remove, bool addToQueue: true}) {
if (callee.name == Identifiers.noSuchMethod_) return;
@@ -640,19 +646,20 @@ class InferrerEngine {
} else if (selector != null && selector.isGetter) {
// We are tearing a function off and thus create a closure.
assert(callee.isFunction);
- MemberTypeInformation info = types.getInferredTypeOfMember(callee);
+ MethodElement method = callee;
+ MemberTypeInformation info = types.getInferredTypeOfMember(method);
if (remove) {
info.closurizedCount--;
} else {
info.closurizedCount++;
- if (Elements.isStaticOrTopLevel(callee)) {
+ if (Elements.isStaticOrTopLevel(method)) {
types.allocatedClosures.add(info);
} else {
// We add the call-site type information here so that we
// can benefit from further refinement of the selector.
types.allocatedClosures.add(caller);
}
- FunctionElement function = callee.implementation;
+ FunctionElement function = method.implementation;
FunctionSignature signature = function.functionSignature;
signature.forEachParameter((Element parameter) {
ParameterTypeInformation info =
@@ -662,7 +669,8 @@ class InferrerEngine {
});
}
} else {
- FunctionElement function = callee.implementation;
+ MethodElement method = callee;
+ FunctionElement function = method.implementation;
FunctionSignature signature = function.functionSignature;
int parameterIndex = 0;
bool visitingRequiredParameter = true;
« no previous file with comments | « pkg/compiler/lib/src/inferrer/closure_tracer.dart ('k') | pkg/compiler/lib/src/inferrer/list_tracer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698