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

Unified Diff: src/objects.h

Issue 8352039: Cleanup ScopeInfo and SerializedScopeInfo. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased to include removal of stack height tracking and strict mode flag changes. Created 9 years, 1 month 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
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index 3187467b380a9cde1d4355ea007238fb1075e317..021ad4cc76fcad76c3e847d6804120fdd3c5068f 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -78,7 +78,7 @@
// - MapCache
// - Context
// - JSFunctionResultCache
-// - SerializedScopeInfo
+// - ScopeInfo
// - FixedDoubleArray
// - ExternalArray
// - ExternalPixelArray
@@ -814,7 +814,7 @@ class MaybeObject BASE_EMBEDDED {
V(FixedDoubleArray) \
V(Context) \
V(GlobalContext) \
- V(SerializedScopeInfo) \
+ V(ScopeInfo) \
V(JSFunction) \
V(Code) \
V(Oddball) \
@@ -3098,13 +3098,19 @@ class JSFunctionResultCache: public FixedArray {
};
+// ScopeInfo represents information about different scopes of a source
+// program and the allocation of the scope's variables. Scope information
+// is stored in a compressed form in ScopeInfo objects and is used
+// at runtime (stack dumps, deoptimization, etc.).
+
// This object provides quick access to scope info details for runtime
-// routines w/o the need to explicitly create a ScopeInfo object.
-class SerializedScopeInfo : public FixedArray {
+// routines.
+class ScopeInfo : public FixedArray {
public :
- static SerializedScopeInfo* cast(Object* object) {
- ASSERT(object->IsSerializedScopeInfo());
- return reinterpret_cast<SerializedScopeInfo*>(object);
+
Kevin Millikin (Chromium) 2011/11/02 16:31:19 Presubmit check is not going to like this extra bl
Steven 2011/11/02 18:52:59 tools/presubmit.py didn't complain. Maybe it shoul
Kevin Millikin (Chromium) 2011/11/03 09:18:37 I'm pretty sure the one from Chromium's depot_tool
+ static ScopeInfo* cast(Object* object) {
Kevin Millikin (Chromium) 2011/11/02 16:31:19 We normally do this this way: in objects.h: stat
Steven 2011/11/02 18:52:59 Done.
+ ASSERT(object->IsScopeInfo());
+ return reinterpret_cast<ScopeInfo*>(object);
}
// Return the type of this scope.
@@ -3116,18 +3122,57 @@ class SerializedScopeInfo : public FixedArray {
// Is this scope a strict mode scope?
bool IsStrictMode();
- // Return the number of stack slots for code.
+ // Does this scope make a non-strict eval call?
+ bool CallsNonStrictEval() {
+ return CallsEval() && !IsStrictMode();
+ }
+
+ // Return the total number of locals allocated on the stack and in the
+ // context. This includes the parameters that are allocated in the context.
+ int NumberOfLocals();
+
+ // Return the number of stack slots for code. This number consists of two
+ // parts:
+ // 1. One stack slot per stack allocated local.
+ // 2. One stack slot for the function name if it is stack allocated.
int NumberOfStackSlots();
- // Return the number of context slots for code.
+ // Return the number of context slots for code if a context is allocated. This
+ // number consists of three parts:
+ // 1. Size of fixed header for every context: Context::MIN_CONTEXT_SLOTS
+ // 2. One context slot per context allocated local.
+ // 3. One context slot for the function name if it is context allocated.
+ // Parameters allocated in the context count as context allocated locals. If
+ // no contexts are allocated for this scope NumberOfContextSlots returns 0.
int NumberOfContextSlots();
Kevin Millikin (Chromium) 2011/11/02 16:31:19 I've always found it a bit confusing to count the
Steven 2011/11/02 18:52:59 Renamed it to ContextLength. On 2011/11/02 16:31:1
- // Return if this has context slots besides MIN_CONTEXT_SLOTS;
+ // Is this scope the scope of a named function expression?
+ bool HasFunctionName();
+
+ // Return if this has context allocated locals.
bool HasHeapAllocatedLocals();
// Return if contexts are allocated for this scope.
bool HasContext();
+ // Return the function_name if present.
+ Handle<String> function_name();
Kevin Millikin (Chromium) 2011/11/02 16:31:19 There's a strange mix of hacker_style and CamelCas
Steven 2011/11/02 18:52:59 Done.
+
+ // Return the name of the given parameter.
+ Handle<String> parameter_name(int var);
+
+ // Return the name of the given local.
+ Handle<String> local_name(int var);
+
+ // Return the name of the given stack local.
+ Handle<String> stack_local_name(int var);
+
+ // Return the name of the given context local.
+ Handle<String> context_local_name(int var);
+
+ // Return the mode of the given context local.
+ VariableMode context_local_mode(int var);
+
// Lookup support for serialized scope info. Returns the
// the stack slot index for a given slot name if the slot is
// present; otherwise returns a value < 0. The name must be a symbol
@@ -3139,7 +3184,7 @@ class SerializedScopeInfo : public FixedArray {
// returns a value < 0. The name must be a symbol (canonicalized).
// If the slot is present and mode != NULL, sets *mode to the corresponding
// mode for that variable.
- int ContextSlotIndex(String* name, VariableMode* mode);
+ int ContextSlotIndex(String* name, VariableMode* mode = NULL);
Kevin Millikin (Chromium) 2011/11/02 16:31:19 I'm not thrilled with the default parameter. It d
Steven 2011/11/02 18:52:59 Done.
// Lookup support for serialized scope info. Returns the
// parameter index for a given parameter name if the parameter is present;
@@ -3152,17 +3197,95 @@ class SerializedScopeInfo : public FixedArray {
// must be a symbol (canonicalized).
int FunctionContextSlotIndex(String* name, VariableMode* mode);
- static Handle<SerializedScopeInfo> Create(Scope* scope);
+ static Handle<ScopeInfo> Create(Scope* scope);
// Serializes empty scope info.
- static SerializedScopeInfo* Empty();
+ static ScopeInfo* Empty();
- private:
- Object** ContextEntriesAddr();
+#ifdef DEBUG
+ void Print();
+#endif
+
+#define SCOPE_INFO_NUMERIC_FIELDS(V) \
Kevin Millikin (Chromium) 2011/11/02 16:31:19 OK to use a macro to generate these, but there's n
Steven 2011/11/02 18:52:59 Kept the higher order macro but now it generates t
+ V(FLAGS_INDEX, flags, 0) \
+ V(NUM_PARAMETERS_INDEX, num_parameters, 0) \
+ V(NUM_STACK_LOCALS_INDEX, num_stack_locals, 0) \
+ V(NUM_CONTEXT_LOCALS_INDEX, num_context_locals, 0)
+
+#define SCOPE_INFO_NUMERIC_FIELD_ACCESSORS(index, name, default) \
+ void set_##name(int value) { \
+ set(index, Smi::FromInt(value)); \
+ } \
+ int name() { \
+ if (length() > 0) { \
+ return Smi::cast(get(index))->value(); \
+ } else { \
+ return default; \
+ } \
+ }
+ SCOPE_INFO_NUMERIC_FIELDS(SCOPE_INFO_NUMERIC_FIELD_ACCESSORS)
+#undef SCOPE_INFO_NUMERIC_FIELD_ACCESSORS
- Object** ParameterEntriesAddr();
+ // Layout description of the fixed part of a ScopeInfo.
+ enum {
Kevin Millikin (Chromium) 2011/11/02 16:31:19 Or, you could keep the higher-order macro, and use
Steven 2011/11/02 18:52:59 Done.
+ FLAGS_INDEX,
+ // The number of parameters for the function.
+ NUM_PARAMETERS_INDEX,
+ // The number of non-parameter variables allocated on the stack.
+ NUM_STACK_LOCALS_INDEX,
+ // The number of non-parameter and parameter variables
+ // allocated in the context.
+ NUM_CONTEXT_LOCALS_INDEX,
+ // Beginning of variable sized part of ScopeInfo.
+ VARIABLE_PART_INDEX
+ };
+
+ // The layout of the variable part of a ScopeInfo is as follows:
+ // 1. ParameterEntries:
+ // This part stores the names of the parameters for function scopes. One
+ // slot is used per parameter, so in total this part occupies
+ // num_parameters() slots in the array. For other scopes than function
+ // scopes num_parameters() is 0.
+ // 2. StackLocalEntries:
+ // Contains the names of local variables that are allocated on the stack,
+ // in increasing order of the stack slot index. One slot is used per
+ // stack local, so in total this part occupies num_stack_locals() slots
+ // in the array.
+ // 3. ContextLocalNameEntries:
+ // Contains the names of local variables and parameters that are allocated
+ // in the context. They are stored in increasing order of the context slot
+ // index starting with Context::MIN_CONTEXT_SLOTS. One slot is used per
+ // context local, so in total this part occupies num_context_locals()
+ // slots in the array.
+ // 4. ContextLocalModeEntries:
+ // Contains the variable modes corresponding to the context locals in
+ // ContextLocalNameEntries. One slot is used per context local, so in total
+ // this part occupies num_context_locals() slots in the array.
+ // 5. FunctionNameEntryIndex:
+ // If the scope belongs to a named function expression this part contains
+ // information about the function variable. It always occupies two array
+ // slots: a. The name of the function variable.
+ // b. The context or stack slot index for the variable.
+ int ParameterEntriesIndex();
+ int StackLocalEntriesIndex();
+ int ContextLocalNameEntriesIndex();
+ int ContextLocalModeEntriesIndex();
+ int FunctionNameEntryIndex();
+
+ // Location of the function variable for named function expressions.
+ enum FunctionVariableInfo {
+ NONE, // No function name present.
+ STACK, // Function
+ CONTEXT,
+ UNUSED
+ };
- Object** StackSlotEntriesAddr();
+ // Properties of scopes.
+ class TypeField: public BitField<ScopeType, 0, 3> {};
+ class CallsEvalField: public BitField<bool, 3, 1> {};
+ class StrictModeField: public BitField<bool, 4, 1> {};
+ class FunctionVariableField: public BitField<FunctionVariableInfo, 5, 2> {};
+ class FunctionVariableMode: public BitField<VariableMode, 7, 3> {};
};
@@ -4685,7 +4808,7 @@ class SharedFunctionInfo: public HeapObject {
DECL_ACCESSORS(code, Code)
// [scope_info]: Scope info.
- DECL_ACCESSORS(scope_info, SerializedScopeInfo)
+ DECL_ACCESSORS(scope_info, ScopeInfo)
// [construct stub]: Code stub for constructing instances of this function.
DECL_ACCESSORS(construct_stub, Code)

Powered by Google App Engine
This is Rietveld 408576698