Index: src/scopeinfo.cc |
=================================================================== |
--- src/scopeinfo.cc (revision 9808) |
+++ src/scopeinfo.cc (working copy) |
@@ -51,6 +51,7 @@ |
: function_name_(FACTORY->empty_symbol()), |
calls_eval_(scope->calls_eval()), |
is_strict_mode_(scope->is_strict_mode()), |
+ type_(scope->type()), |
parameters_(scope->num_parameters()), |
stack_slots_(scope->num_stack_slots()), |
context_slots_(scope->num_heap_slots()), |
@@ -138,7 +139,7 @@ |
ASSERT(proxy->var()->index() - Context::MIN_CONTEXT_SLOTS == |
context_modes_.length()); |
context_slots_.Add(FACTORY->empty_symbol()); |
- context_modes_.Add(INTERNAL); |
+ context_modes_.Add(proxy->var()->mode()); |
} |
} |
} |
@@ -150,6 +151,10 @@ |
// |
// - calls eval boolean flag |
// |
+// - is strict mode scope |
+// |
+// - scope type |
+// |
// - number of variables in the context object (smi) (= function context |
// slot index + 1) |
// - list of pairs (name, Var mode) of context-allocated variables (starting |
@@ -181,8 +186,9 @@ |
// present) |
-static inline Object** ReadInt(Object** p, int* x) { |
- *x = (reinterpret_cast<Smi*>(*p++))->value(); |
+template <class T> |
+static inline Object** ReadInt(Object** p, T* x) { |
+ *x = static_cast<T>((reinterpret_cast<Smi*>(*p++))->value()); |
return p; |
} |
@@ -193,20 +199,21 @@ |
} |
-static inline Object** ReadSymbol(Object** p, Handle<String>* s) { |
- *s = Handle<String>(reinterpret_cast<String*>(*p++)); |
+template <class T> |
+static inline Object** ReadObject(Object** p, Handle<T>* s) { |
+ *s = Handle<T>::cast(Handle<Object>(*p++)); |
return p; |
} |
-template <class Allocator> |
-static Object** ReadList(Object** p, List<Handle<String>, Allocator >* list) { |
+template <class Allocator, class T> |
+static Object** ReadList(Object** p, List<Handle<T>, Allocator >* list) { |
ASSERT(list->is_empty()); |
int n; |
p = ReadInt(p, &n); |
while (n-- > 0) { |
- Handle<String> s; |
- p = ReadSymbol(p, &s); |
+ Handle<T> s; |
+ p = ReadObject(p, &s); |
list->Add(s); |
} |
return p; |
@@ -223,7 +230,7 @@ |
while (n-- > 0) { |
Handle<String> s; |
int m; |
- p = ReadSymbol(p, &s); |
+ p = ReadObject(p, &s); |
p = ReadInt(p, &m); |
list->Add(s); |
modes->Add(static_cast<VariableMode>(m)); |
@@ -242,9 +249,10 @@ |
if (data->length() > 0) { |
Object** p0 = data->data_start(); |
Object** p = p0; |
- p = ReadSymbol(p, &function_name_); |
+ p = ReadObject(p, &function_name_); |
p = ReadBool(p, &calls_eval_); |
p = ReadBool(p, &is_strict_mode_); |
+ p = ReadInt(p, &type_); |
p = ReadList<Allocator>(p, &context_slots_, &context_modes_); |
p = ReadList<Allocator>(p, ¶meters_); |
p = ReadList<Allocator>(p, &stack_slots_); |
@@ -265,18 +273,19 @@ |
} |
-static inline Object** WriteSymbol(Object** p, Handle<String> s) { |
+template <class T> |
+static inline Object** WriteObject(Object** p, Handle<T> s) { |
*p++ = *s; |
return p; |
} |
-template <class Allocator> |
-static Object** WriteList(Object** p, List<Handle<String>, Allocator >* list) { |
+template <class Allocator, class T> |
+static Object** WriteList(Object** p, List<Handle<T>, Allocator >* list) { |
const int n = list->length(); |
p = WriteInt(p, n); |
for (int i = 0; i < n; i++) { |
- p = WriteSymbol(p, list->at(i)); |
+ p = WriteObject(p, list->at(i)); |
} |
return p; |
} |
@@ -289,7 +298,7 @@ |
const int n = list->length(); |
p = WriteInt(p, n); |
for (int i = 0; i < n; i++) { |
- p = WriteSymbol(p, list->at(i)); |
+ p = WriteObject(p, list->at(i)); |
p = WriteInt(p, modes->at(i)); |
} |
return p; |
@@ -298,8 +307,9 @@ |
template<class Allocator> |
Handle<SerializedScopeInfo> ScopeInfo<Allocator>::Serialize() { |
- // function name, calls eval, is_strict_mode, length for 3 tables: |
- const int extra_slots = 1 + 1 + 1 + 3; |
+ // function name, calls eval, is_strict_mode, scope type, |
+ // length for 3 tables: |
+ const int extra_slots = 1 + 1 + 1 + 1 + 3; |
int length = extra_slots + |
context_slots_.length() * 2 + |
parameters_.length() + |
@@ -311,9 +321,10 @@ |
Object** p0 = data->data_start(); |
Object** p = p0; |
- p = WriteSymbol(p, function_name_); |
+ p = WriteObject(p, function_name_); |
p = WriteBool(p, calls_eval_); |
p = WriteBool(p, is_strict_mode_); |
+ p = WriteInt(p, type_); |
p = WriteList(p, &context_slots_, &context_modes_); |
p = WriteList(p, ¶meters_); |
p = WriteList(p, &stack_slots_); |
@@ -361,8 +372,8 @@ |
Object** SerializedScopeInfo::ContextEntriesAddr() { |
ASSERT(length() > 0); |
- // +3 for function name, calls eval, strict mode. |
- return data_start() + 3; |
+ // +4 for function name, calls eval, strict mode, scope type. |
+ return data_start() + 4; |
} |
@@ -406,6 +417,16 @@ |
} |
+ScopeType SerializedScopeInfo::Type() { |
+ ASSERT(length() > 0); |
+ // +3 for function name, calls eval, strict mode. |
+ Object** p = data_start() + 3; |
+ ScopeType type; |
+ p = ReadInt(p, &type); |
+ return type; |
+} |
+ |
+ |
int SerializedScopeInfo::NumberOfStackSlots() { |
if (length() > 0) { |
Object** p = StackSlotEntriesAddr(); |
@@ -439,6 +460,12 @@ |
} |
+bool SerializedScopeInfo::HasContext() { |
+ return HasHeapAllocatedLocals() || |
+ Type() == WITH_SCOPE; |
+} |
+ |
+ |
int SerializedScopeInfo::StackSlotIndex(String* name) { |
ASSERT(name->IsSymbol()); |
if (length() > 0) { |
@@ -513,16 +540,24 @@ |
} |
-int SerializedScopeInfo::FunctionContextSlotIndex(String* name) { |
+int SerializedScopeInfo::FunctionContextSlotIndex(String* name, |
+ VariableMode* mode) { |
ASSERT(name->IsSymbol()); |
if (length() > 0) { |
Object** p = data_start(); |
if (*p == name) { |
p = ContextEntriesAddr(); |
int number_of_context_slots; |
- ReadInt(p, &number_of_context_slots); |
+ p = ReadInt(p, &number_of_context_slots); |
ASSERT(number_of_context_slots != 0); |
// The function context slot is the last entry. |
+ if (mode != NULL) { |
+ // Seek to context slot entry. |
+ p += (number_of_context_slots - 1) * 2; |
+ // Seek to mode. |
+ ++p; |
+ ReadInt(p, mode); |
+ } |
return number_of_context_slots + Context::MIN_CONTEXT_SLOTS - 1; |
} |
} |