Index: src/runtime.cc |
=================================================================== |
--- src/runtime.cc (revision 5039) |
+++ src/runtime.cc (working copy) |
@@ -1606,9 +1606,10 @@ |
if (!EnsureCompiled(shared, KEEP_EXCEPTION)) { |
return Failure::Exception(); |
} |
- // Set the code, formal parameter count, and the length of the target |
- // function. |
+ // Set the code, scope info, formal parameter count, |
+ // and the length of the target function. |
target->set_code(fun->code()); |
+ target->shared()->set_scope_info(shared->scope_info()); |
target->shared()->set_length(shared->length()); |
target->shared()->set_formal_parameter_count( |
shared->formal_parameter_count()); |
@@ -6868,7 +6869,8 @@ |
ASSERT(args.length() == 1); |
CONVERT_CHECKED(JSFunction, function, args[0]); |
- int length = ScopeInfo<>::NumberOfContextSlots(function->code()); |
+ int length = |
+ ScopeInfo<>::NumberOfContextSlots(function->shared()->scope_info()); |
Object* result = Heap::AllocateFunctionContext(length, function); |
if (result->IsFailure()) return result; |
@@ -8488,9 +8490,10 @@ |
// Check for constructor frame. |
bool constructor = it.frame()->IsConstructor(); |
- // Get code and read scope info from it for local variable information. |
- Handle<Code> code(it.frame()->code()); |
- ScopeInfo<> info(*code); |
+ // Get scope info and read from it for local variable information. |
+ Handle<JSFunction> function(JSFunction::cast(it.frame()->function())); |
+ Handle<Object> scope_info(function->shared()->scope_info()); |
+ ScopeInfo<> info(*scope_info); |
// Get the context. |
Handle<Context> context(Context::cast(it.frame()->context())); |
@@ -8518,7 +8521,8 @@ |
} |
ASSERT(context->is_function_context()); |
locals->set(i * 2 + 1, |
- context->get(ScopeInfo<>::ContextSlotIndex(*code, *name, |
+ context->get(ScopeInfo<>::ContextSlotIndex(*scope_info, |
+ *name, |
NULL))); |
} |
} |
@@ -8659,7 +8663,7 @@ |
// Copy all the context locals into an object used to materialize a scope. |
-static void CopyContextLocalsToScopeObject(Handle<Code> code, |
+static void CopyContextLocalsToScopeObject(Handle<SharedFunctionInfo> shared, |
ScopeInfo<>& scope_info, |
Handle<Context> context, |
Handle<JSObject> scope_object) { |
@@ -8668,7 +8672,7 @@ |
i < scope_info.number_of_context_slots(); |
i++) { |
int context_index = |
- ScopeInfo<>::ContextSlotIndex(*code, |
+ ScopeInfo<>::ContextSlotIndex(shared->scope_info(), |
*scope_info.context_slot_name(i), |
NULL); |
@@ -8686,8 +8690,8 @@ |
// frame. |
static Handle<JSObject> MaterializeLocalScope(JavaScriptFrame* frame) { |
Handle<JSFunction> function(JSFunction::cast(frame->function())); |
- Handle<Code> code(function->code()); |
- ScopeInfo<> scope_info(*code); |
+ Handle<SharedFunctionInfo> shared(function->shared()); |
+ ScopeInfo<> scope_info(shared->scope_info()); |
// Allocate and initialize a JSObject with all the arguments, stack locals |
// heap locals and extension properties of the debugged function. |
@@ -8710,7 +8714,7 @@ |
// Third fill all context locals. |
Handle<Context> frame_context(Context::cast(frame->context())); |
Handle<Context> function_context(frame_context->fcontext()); |
- CopyContextLocalsToScopeObject(code, scope_info, |
+ CopyContextLocalsToScopeObject(shared, scope_info, |
function_context, local_scope); |
// Finally copy any properties from the function context extension. This will |
@@ -8737,8 +8741,8 @@ |
static Handle<JSObject> MaterializeClosure(Handle<Context> context) { |
ASSERT(context->is_function_context()); |
- Handle<Code> code(context->closure()->code()); |
- ScopeInfo<> scope_info(*code); |
+ Handle<SharedFunctionInfo> shared(context->closure()->shared()); |
+ ScopeInfo<> scope_info(shared->scope_info()); |
// Allocate and initialize a JSObject with all the content of theis function |
// closure. |
@@ -8746,7 +8750,7 @@ |
// Check whether the arguments shadow object exists. |
int arguments_shadow_index = |
- ScopeInfo<>::ContextSlotIndex(*code, |
+ ScopeInfo<>::ContextSlotIndex(shared->scope_info(), |
Heap::arguments_shadow_symbol(), |
NULL); |
if (arguments_shadow_index >= 0) { |
@@ -8762,7 +8766,7 @@ |
} |
// Fill all context locals to the context extension. |
- CopyContextLocalsToScopeObject(code, scope_info, context, closure_scope); |
+ CopyContextLocalsToScopeObject(shared, scope_info, context, closure_scope); |
// Finally copy any properties from the function context extension. This will |
// be variables introduced by eval. |
@@ -8811,8 +8815,8 @@ |
// created for evaluating top level code and it is not a real local scope. |
// Checking for the existence of .result seems fragile, but the scope info |
// saved with the code object does not otherwise have that information. |
- Handle<Code> code(function_->code()); |
- int index = ScopeInfo<>::StackSlotIndex(*code, Heap::result_symbol()); |
+ int index = ScopeInfo<>::StackSlotIndex(function_->shared()->scope_info(), |
+ Heap::result_symbol()); |
at_local_ = index < 0; |
} else if (context_->is_function_context()) { |
at_local_ = true; |
@@ -8926,8 +8930,7 @@ |
case ScopeIterator::ScopeTypeLocal: { |
PrintF("Local:\n"); |
- Handle<Code> code(function_->code()); |
- ScopeInfo<> scope_info(*code); |
+ ScopeInfo<> scope_info(function_->shared()->scope_info()); |
scope_info.Print(); |
if (!CurrentContext().is_null()) { |
CurrentContext()->Print(); |
@@ -9451,7 +9454,7 @@ |
// Runtime_DebugEvaluate. |
static Handle<Object> GetArgumentsObject(JavaScriptFrame* frame, |
Handle<JSFunction> function, |
- Handle<Code> code, |
+ Handle<Object> scope_info, |
const ScopeInfo<>* sinfo, |
Handle<Context> function_context) { |
// Try to find the value of 'arguments' to pass as parameter. If it is not |
@@ -9459,14 +9462,14 @@ |
// does not support eval) then create an 'arguments' object. |
int index; |
if (sinfo->number_of_stack_slots() > 0) { |
- index = ScopeInfo<>::StackSlotIndex(*code, Heap::arguments_symbol()); |
+ index = ScopeInfo<>::StackSlotIndex(*scope_info, Heap::arguments_symbol()); |
if (index != -1) { |
return Handle<Object>(frame->GetExpression(index)); |
} |
} |
if (sinfo->number_of_context_slots() > Context::MIN_CONTEXT_SLOTS) { |
- index = ScopeInfo<>::ContextSlotIndex(*code, Heap::arguments_symbol(), |
+ index = ScopeInfo<>::ContextSlotIndex(*scope_info, Heap::arguments_symbol(), |
NULL); |
if (index != -1) { |
return Handle<Object>(function_context->get(index)); |
@@ -9518,8 +9521,8 @@ |
JavaScriptFrameIterator it(id); |
JavaScriptFrame* frame = it.frame(); |
Handle<JSFunction> function(JSFunction::cast(frame->function())); |
- Handle<Code> code(function->code()); |
- ScopeInfo<> sinfo(*code); |
+ Handle<Object> scope_info(function->shared()->scope_info()); |
+ ScopeInfo<> sinfo(*scope_info); |
// Traverse the saved contexts chain to find the active context for the |
// selected frame. |
@@ -9541,7 +9544,7 @@ |
Factory::NewFunction(Factory::empty_string(), Factory::undefined_value()); |
go_between->set_context(function->context()); |
#ifdef DEBUG |
- ScopeInfo<> go_between_sinfo(go_between->shared()->code()); |
+ ScopeInfo<> go_between_sinfo(go_between->shared()->scope_info()); |
ASSERT(go_between_sinfo.number_of_parameters() == 0); |
ASSERT(go_between_sinfo.number_of_context_slots() == 0); |
#endif |
@@ -9587,8 +9590,8 @@ |
&has_pending_exception); |
if (has_pending_exception) return Failure::Exception(); |
- Handle<Object> arguments = GetArgumentsObject(frame, function, code, &sinfo, |
- function_context); |
+ Handle<Object> arguments = GetArgumentsObject(frame, function, scope_info, |
+ &sinfo, function_context); |
// Invoke the evaluation function and return the result. |
const int argc = 2; |