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

Unified Diff: dart/lib/compiler/implementation/elements/elements.dart

Issue 10855125: Ensure supertypes are loaded safely. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 4 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: dart/lib/compiler/implementation/elements/elements.dart
diff --git a/dart/lib/compiler/implementation/elements/elements.dart b/dart/lib/compiler/implementation/elements/elements.dart
index 2344018ca6a1811693d957a920efa8c961bbed8d..c356eb5757af170fb060df486e4619c3f4ac2672 100644
--- a/dart/lib/compiler/implementation/elements/elements.dart
+++ b/dart/lib/compiler/implementation/elements/elements.dart
@@ -448,8 +448,9 @@ class TypedefElement extends Element implements TypeDeclarationElement {
Type computeType(Compiler compiler) {
if (cachedType !== null) return cachedType;
- cachedType = compiler.computeFunctionType(
- this, compiler.resolveTypedef(this));
+ cachedType = new FunctionType(null, null, this);
+ cachedType.initializeFrom(
Lasse Reichstein Nielsen 2012/08/13 13:34:48 Make initialize a copy constructor instead.
ahe 2012/08/13 15:14:01 I don't think I can do that. I got to keep the sam
+ compiler.computeFunctionType(this, compiler.resolveTypedef(this)));
return cachedType;
}
@@ -881,6 +882,10 @@ abstract class TypeDeclarationElement implements Element {
class ClassElement extends ContainerElement
implements TypeDeclarationElement {
+ static final int STATE_NOT_STARTED = 0;
+ static final int STATE_STARTED = 1;
+ static final int STATE_DONE = 2;
+
final int id;
InterfaceType type;
Type supertype;
@@ -888,9 +893,22 @@ class ClassElement extends ContainerElement
Link<Element> members = const EmptyLink<Element>();
Map<SourceString, Element> localMembers;
Map<SourceString, Element> constructors;
- Link<Type> interfaces = const EmptyLink<Type>();
- bool isResolved = false;
- bool isBeingResolved = false;
+ Link<Type> interfaces;
+
+ int _supertypeLoadState = STATE_NOT_STARTED;
+ int get supertypeLoadState() => _supertypeLoadState;
+ void set supertypeLoadState(int state) {
+ assert(state == _supertypeLoadState + 1);
Lasse Reichstein Nielsen 2012/08/13 13:34:48 Also assert that it's not larger than STATE_DONE.
ahe 2012/08/13 15:14:01 Done.
+ _supertypeLoadState = state;
+ }
+
+ int _resolutionState = STATE_NOT_STARTED;
+ int get resolutionState() => _resolutionState;
+ void set resolutionState(int state) {
+ assert(state == _resolutionState + 1);
+ _resolutionState = state;
+ }
+
// backendMembers are members that have been added by the backend to simplify
// compilation. They don't have any user-side counter-part.
Link<Element> backendMembers = const EmptyLink<Element>();
@@ -929,7 +947,9 @@ class ClassElement extends ContainerElement
Link<Type> get typeVariables() => type.arguments;
ClassElement ensureResolved(Compiler compiler) {
- compiler.resolveClass(this);
+ if (resolutionState == STATE_NOT_STARTED) {
+ compiler.resolver.resolveClass(this);
+ }
return this;
}
@@ -1016,7 +1036,7 @@ class ClassElement extends ContainerElement
* The returned element may not be resolved yet.
*/
ClassElement get superclass() {
- assert(isResolved);
+ assert(supertypeLoadState == STATE_DONE);
return supertype === null ? null : supertype.element;
}

Powered by Google App Engine
This is Rietveld 408576698