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

Side by Side Diff: src/interface.h

Issue 10698167: Incorporate constness into inferred interfaces (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ast.cc ('k') | src/interface.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 18 matching lines...) Expand all
29 #define V8_INTERFACE_H_ 29 #define V8_INTERFACE_H_
30 30
31 #include "zone-inl.h" // For operator new. 31 #include "zone-inl.h" // For operator new.
32 32
33 namespace v8 { 33 namespace v8 {
34 namespace internal { 34 namespace internal {
35 35
36 36
37 // This class implements the following abstract grammar of interfaces 37 // This class implements the following abstract grammar of interfaces
38 // (i.e. module types): 38 // (i.e. module types):
39 // interface ::= UNDETERMINED | VALUE | MODULE(exports) 39 // interface ::= UNDETERMINED | VALUE | CONST | MODULE(exports)
40 // exports ::= {name : interface, ...} 40 // exports ::= {name : interface, ...}
41 // A frozen module type is one that is fully determined. Unification does not 41 // A frozen type is one that is fully determined. Unification does not
42 // allow adding additional exports to frozen interfaces. 42 // allow to turn non-const values into const, or adding additional exports to
43 // Otherwise, unifying modules merges their exports. 43 // frozen interfaces. Otherwise, unifying modules merges their exports.
44 // Undetermined types are unification variables that can be unified freely. 44 // Undetermined types are unification variables that can be unified freely.
45 // There is a natural subsort lattice that reflects the increase of knowledge:
46 //
47 // undetermined
48 // // | \\ .
49 // value (frozen) module
50 // // \\ / \ //
51 // const fr.value fr.module
52 // \\ /
53 // fr.const
54 //
55 // where the bold lines are the only transitions allowed.
45 56
46 class Interface : public ZoneObject { 57 class Interface : public ZoneObject {
47 public: 58 public:
48 // --------------------------------------------------------------------------- 59 // ---------------------------------------------------------------------------
49 // Factory methods. 60 // Factory methods.
50 61
62 static Interface* NewUnknown(Zone* zone) {
63 return new(zone) Interface(NONE);
64 }
65
51 static Interface* NewValue() { 66 static Interface* NewValue() {
52 static Interface value_interface(VALUE + FROZEN); // Cached. 67 static Interface value_interface(VALUE + FROZEN); // Cached.
53 return &value_interface; 68 return &value_interface;
54 } 69 }
55 70
56 static Interface* NewUnknown(Zone* zone) { 71 static Interface* NewConst() {
57 return new(zone) Interface(NONE); 72 static Interface value_interface(VALUE + CONST + FROZEN); // Cached.
73 return &value_interface;
58 } 74 }
59 75
60 static Interface* NewModule(Zone* zone) { 76 static Interface* NewModule(Zone* zone) {
61 return new(zone) Interface(MODULE); 77 return new(zone) Interface(MODULE);
62 } 78 }
63 79
64 // --------------------------------------------------------------------------- 80 // ---------------------------------------------------------------------------
65 // Mutators. 81 // Mutators.
66 82
67 // Add a name to the list of exports. If it already exists, unify with 83 // Add a name to the list of exports. If it already exists, unify with
68 // interface, otherwise insert unless this is closed. 84 // interface, otherwise insert unless this is closed.
69 void Add(Handle<String> name, Interface* interface, Zone* zone, bool* ok) { 85 void Add(Handle<String> name, Interface* interface, Zone* zone, bool* ok) {
70 DoAdd(name.location(), name->Hash(), interface, zone, ok); 86 DoAdd(name.location(), name->Hash(), interface, zone, ok);
71 } 87 }
72 88
73 // Unify with another interface. If successful, both interface objects will 89 // Unify with another interface. If successful, both interface objects will
74 // represent the same type, and changes to one are reflected in the other. 90 // represent the same type, and changes to one are reflected in the other.
75 void Unify(Interface* that, Zone* zone, bool* ok); 91 void Unify(Interface* that, Zone* zone, bool* ok);
76 92
77 // Determine this interface to be a value interface. 93 // Determine this interface to be a value interface.
78 void MakeValue(bool* ok) { 94 void MakeValue(bool* ok) {
79 *ok = !IsModule(); 95 *ok = !IsModule();
80 if (*ok) Chase()->flags_ |= VALUE; 96 if (*ok) Chase()->flags_ |= VALUE;
81 } 97 }
82 98
99 // Determine this interface to be an immutable interface.
100 void MakeConst(bool* ok) {
101 *ok = !IsModule() && (IsConst() || !IsFrozen());
102 if (*ok) Chase()->flags_ |= VALUE + CONST;
103 }
104
83 // Determine this interface to be a module interface. 105 // Determine this interface to be a module interface.
84 void MakeModule(bool* ok) { 106 void MakeModule(bool* ok) {
85 *ok = !IsValue(); 107 *ok = !IsValue();
86 if (*ok) Chase()->flags_ |= MODULE; 108 if (*ok) Chase()->flags_ |= MODULE;
87 } 109 }
88 110
89 // Set associated instance object. 111 // Set associated instance object.
90 void MakeSingleton(Handle<JSModule> instance, bool* ok) { 112 void MakeSingleton(Handle<JSModule> instance, bool* ok) {
91 *ok = IsModule() && Chase()->instance_.is_null(); 113 *ok = IsModule() && Chase()->instance_.is_null();
92 if (*ok) Chase()->instance_ = instance; 114 if (*ok) Chase()->instance_ = instance;
93 } 115 }
94 116
95 // Do not allow any further refinements, directly or through unification. 117 // Do not allow any further refinements, directly or through unification.
96 void Freeze(bool* ok) { 118 void Freeze(bool* ok) {
97 *ok = IsValue() || IsModule(); 119 *ok = IsValue() || IsModule();
98 if (*ok) Chase()->flags_ |= FROZEN; 120 if (*ok) Chase()->flags_ |= FROZEN;
99 } 121 }
100 122
101 // --------------------------------------------------------------------------- 123 // ---------------------------------------------------------------------------
102 // Accessors. 124 // Accessors.
103 125
104 // Check whether this is still a fully undetermined type. 126 // Check whether this is still a fully undetermined type.
105 bool IsUnknown() { return Chase()->flags_ == NONE; } 127 bool IsUnknown() { return Chase()->flags_ == NONE; }
106 128
107 // Check whether this is a value type. 129 // Check whether this is a value type.
108 bool IsValue() { return Chase()->flags_ & VALUE; } 130 bool IsValue() { return Chase()->flags_ & VALUE; }
109 131
132 // Check whether this is a constant type.
133 bool IsConst() { return Chase()->flags_ & CONST; }
134
110 // Check whether this is a module type. 135 // Check whether this is a module type.
111 bool IsModule() { return Chase()->flags_ & MODULE; } 136 bool IsModule() { return Chase()->flags_ & MODULE; }
112 137
113 // Check whether this is closed (i.e. fully determined). 138 // Check whether this is closed (i.e. fully determined).
114 bool IsFrozen() { return Chase()->flags_ & FROZEN; } 139 bool IsFrozen() { return Chase()->flags_ & FROZEN; }
115 140
116 Handle<JSModule> Instance() { return Chase()->instance_; } 141 Handle<JSModule> Instance() { return Chase()->instance_; }
117 142
118 // Look up an exported name. Returns NULL if not (yet) defined. 143 // Look up an exported name. Returns NULL if not (yet) defined.
119 Interface* Lookup(Handle<String> name, Zone* zone); 144 Interface* Lookup(Handle<String> name, Zone* zone);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 #ifdef DEBUG 179 #ifdef DEBUG
155 void Print(int n = 0); // n = indentation; n < 0 => don't print recursively 180 void Print(int n = 0); // n = indentation; n < 0 => don't print recursively
156 #endif 181 #endif
157 182
158 // --------------------------------------------------------------------------- 183 // ---------------------------------------------------------------------------
159 // Implementation. 184 // Implementation.
160 private: 185 private:
161 enum Flags { // All flags are monotonic 186 enum Flags { // All flags are monotonic
162 NONE = 0, 187 NONE = 0,
163 VALUE = 1, // This type describes a value 188 VALUE = 1, // This type describes a value
164 MODULE = 2, // This type describes a module 189 CONST = 2, // This type describes a constant
165 FROZEN = 4 // This type is fully determined 190 MODULE = 4, // This type describes a module
191 FROZEN = 8 // This type is fully determined
166 }; 192 };
167 193
168 int flags_; 194 int flags_;
169 Interface* forward_; // Unification link 195 Interface* forward_; // Unification link
170 ZoneHashMap* exports_; // Module exports and their types (allocated lazily) 196 ZoneHashMap* exports_; // Module exports and their types (allocated lazily)
171 Handle<JSModule> instance_; 197 Handle<JSModule> instance_;
172 198
173 explicit Interface(int flags) 199 explicit Interface(int flags)
174 : flags_(flags), 200 : flags_(flags),
175 forward_(NULL), 201 forward_(NULL),
(...skipping 12 matching lines...) Expand all
188 } 214 }
189 215
190 void DoAdd(void* name, uint32_t hash, Interface* interface, Zone* zone, 216 void DoAdd(void* name, uint32_t hash, Interface* interface, Zone* zone,
191 bool* ok); 217 bool* ok);
192 void DoUnify(Interface* that, bool* ok, Zone* zone); 218 void DoUnify(Interface* that, bool* ok, Zone* zone);
193 }; 219 };
194 220
195 } } // namespace v8::internal 221 } } // namespace v8::internal
196 222
197 #endif // V8_INTERFACE_H_ 223 #endif // V8_INTERFACE_H_
OLDNEW
« no previous file with comments | « src/ast.cc ('k') | src/interface.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698