| 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
|
|
|