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

Unified Diff: src/interface.h

Issue 918373002: Strip Interface class of most of its logic, make it all about Module exports (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Properly freeze interface at the end of ParseModule Created 5 years, 10 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 | « src/ia32/full-codegen-ia32.cc ('k') | src/interface.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « src/ia32/full-codegen-ia32.cc ('k') | src/interface.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698