Index: src/interface.h |
diff --git a/src/interface.h b/src/interface.h |
index 3336021d8284206204f902a33b8abdf9f1d6c066..9c6e2c34d1e06947185d79397f8d40ea7d129f3a 100644 |
--- a/src/interface.h |
+++ b/src/interface.h |
@@ -5,132 +5,59 @@ |
#ifndef V8_INTERFACE_H_ |
#define V8_INTERFACE_H_ |
-#include "src/ast-value-factory.h" |
+#include "src/zone.h" |
namespace v8 { |
namespace internal { |
-// This class implements the following abstract grammar of interfaces |
-// (i.e. module types): |
-// interface ::= UNDETERMINED | VALUE | CONST | MODULE(exports) |
-// exports ::= {name : interface, ...} |
-// A frozen type is one that is fully determined. Unification does not |
-// allow to turn non-const values into const, or adding additional exports to |
-// frozen interfaces. Otherwise, unifying modules merges their exports. |
-// Undetermined types are unification variables that can be unified freely. |
-// There is a natural subsort lattice that reflects the increase of knowledge: |
-// |
-// undetermined |
-// // | \\ . |
-// value (frozen) module |
-// // \\ / \ // |
-// const fr.value fr.module |
-// \\ / |
-// fr.const |
-// |
-// where the bold lines are the only transitions allowed. |
+class AstRawString; |
+ |
+// This class represents the interface of a module: a set of exported names. |
+// |
+// TODO(adamk): Rename this to ModuleRecord, ModuleDescriptor, or similar. |
class Interface : public ZoneObject { |
public: |
// --------------------------------------------------------------------------- |
// Factory methods. |
- static Interface* NewUnknown(Zone* zone) { |
- return new(zone) Interface(NONE); |
- } |
- |
- static Interface* NewValue(); |
- |
- static Interface* NewConst(); |
- |
- static Interface* NewModule(Zone* zone) { |
- return new(zone) Interface(MODULE); |
- } |
+ static Interface* New(Zone* zone) { return new (zone) Interface(); } |
// --------------------------------------------------------------------------- |
// Mutators. |
- // Add a name to the list of exports. If it already exists, unify with |
- // interface, otherwise insert unless this is closed. |
- void Add(const AstRawString* name, Interface* interface, Zone* zone, |
- bool* ok) { |
- DoAdd(name, name->hash(), interface, zone, ok); |
- } |
- |
- // Unify with another interface. If successful, both interface objects will |
- // represent the same type, and changes to one are reflected in the other. |
- void Unify(Interface* that, Zone* zone, bool* ok); |
- |
- // Determine this interface to be a value interface. |
- void MakeValue(bool* ok) { |
- *ok = !IsModule(); |
- if (*ok) Chase()->flags_ |= VALUE; |
- } |
- |
- // Determine this interface to be an immutable interface. |
- void MakeConst(bool* ok) { |
- *ok = !IsModule() && (IsConst() || !IsFrozen()); |
- if (*ok) Chase()->flags_ |= VALUE + CONST; |
- } |
- |
- // Determine this interface to be a module interface. |
- void MakeModule(bool* ok) { |
- *ok = !IsValue(); |
- if (*ok) Chase()->flags_ |= MODULE; |
- } |
+ // Add a name to the list of exports. If it already exists, or this interface |
+ // is frozen, that's an error. |
+ void Add(const AstRawString* name, Zone* zone, bool* ok); |
// Do not allow any further refinements, directly or through unification. |
- void Freeze(bool* ok) { |
- *ok = IsValue() || IsModule(); |
- if (*ok) Chase()->flags_ |= FROZEN; |
- } |
+ void Freeze() { frozen_ = true; } |
// Assign an index. |
void Allocate(int index) { |
- DCHECK(IsModule() && IsFrozen() && Chase()->index_ == -1); |
- Chase()->index_ = index; |
+ DCHECK(IsFrozen() && index_ == -1); |
+ index_ = index; |
} |
// --------------------------------------------------------------------------- |
// Accessors. |
- // Check whether this is still a fully undetermined type. |
- bool IsUnknown() { return Chase()->flags_ == NONE; } |
- |
- // Check whether this is a value type. |
- bool IsValue() { return Chase()->flags_ & VALUE; } |
- |
- // Check whether this is a constant type. |
- bool IsConst() { return Chase()->flags_ & CONST; } |
- |
- // Check whether this is a module type. |
- bool IsModule() { return Chase()->flags_ & MODULE; } |
- |
// Check whether this is closed (i.e. fully determined). |
- bool IsFrozen() { return Chase()->flags_ & FROZEN; } |
- |
- bool IsUnified(Interface* that) { |
- return Chase() == that->Chase() |
- || (this->IsValue() == that->IsValue() && |
- this->IsConst() == that->IsConst()); |
- } |
+ bool IsFrozen() { return frozen_; } |
int Length() { |
- DCHECK(IsModule() && IsFrozen()); |
- ZoneHashMap* exports = Chase()->exports_; |
+ DCHECK(IsFrozen()); |
+ ZoneHashMap* exports = exports_; |
return exports ? exports->occupancy() : 0; |
} |
// The context slot in the hosting script context pointing to this module. |
int Index() { |
- DCHECK(IsModule() && IsFrozen()); |
- return Chase()->index_; |
+ DCHECK(IsFrozen()); |
+ return index_; |
} |
- // Look up an exported name. Returns NULL if not (yet) defined. |
- Interface* Lookup(Handle<String> name, Zone* zone); |
- |
// --------------------------------------------------------------------------- |
// Iterators. |
@@ -145,10 +72,6 @@ class Interface : public ZoneObject { |
DCHECK(!done()); |
return static_cast<const AstRawString*>(entry_->key); |
} |
- Interface* interface() const { |
- DCHECK(!done()); |
- return static_cast<Interface*>(entry_->value); |
- } |
void Advance() { entry_ = exports_->Next(entry_); } |
private: |
@@ -171,42 +94,16 @@ class Interface : public ZoneObject { |
// --------------------------------------------------------------------------- |
// Implementation. |
private: |
- struct Cache; |
- |
- enum Flags { // All flags are monotonic |
- NONE = 0, |
- VALUE = 1, // This type describes a value |
- CONST = 2, // This type describes a constant |
- MODULE = 4, // This type describes a module |
- FROZEN = 8 // This type is fully determined |
- }; |
- |
- int flags_; |
- Interface* forward_; // Unification link |
+ bool frozen_; |
ZoneHashMap* exports_; // Module exports and their types (allocated lazily) |
int index_; |
- explicit Interface(int flags) |
- : flags_(flags), |
- forward_(NULL), |
- exports_(NULL), |
- index_(-1) { |
+ Interface() : frozen_(false), exports_(NULL), index_(-1) { |
#ifdef DEBUG |
if (FLAG_print_interface_details) |
PrintF("# Creating %p\n", static_cast<void*>(this)); |
#endif |
} |
- |
- Interface* Chase() { |
- Interface* result = this; |
- while (result->forward_ != NULL) result = result->forward_; |
- if (result != this) forward_ = result; // On-the-fly path compression. |
- return result; |
- } |
- |
- void DoAdd(const void* name, uint32_t hash, Interface* interface, Zone* zone, |
- bool* ok); |
- void DoUnify(Interface* that, bool* ok, Zone* zone); |
}; |
} } // namespace v8::internal |