| Index: src/execution.cc
|
| diff --git a/src/execution.cc b/src/execution.cc
|
| index ecfa1db1ed83067c1c824777ca3c1a3fae6883ab..c59a737c32b63158f18b4f1fd41be7525c1f7f05 100644
|
| --- a/src/execution.cc
|
| +++ b/src/execution.cc
|
| @@ -148,7 +148,8 @@ static Handle<Object> Invoke(bool is_construct,
|
| }
|
|
|
|
|
| -Handle<Object> Execution::Call(Handle<Object> callable,
|
| +Handle<Object> Execution::Call(Isolate* isolate,
|
| + Handle<Object> callable,
|
| Handle<Object> receiver,
|
| int argc,
|
| Handle<Object> argv[],
|
| @@ -157,7 +158,7 @@ Handle<Object> Execution::Call(Handle<Object> callable,
|
| *pending_exception = false;
|
|
|
| if (!callable->IsJSFunction()) {
|
| - callable = TryGetFunctionDelegate(callable, pending_exception);
|
| + callable = TryGetFunctionDelegate(isolate, callable, pending_exception);
|
| if (*pending_exception) return callable;
|
| }
|
| Handle<JSFunction> func = Handle<JSFunction>::cast(callable);
|
| @@ -174,7 +175,7 @@ Handle<Object> Execution::Call(Handle<Object> callable,
|
| receiver = Handle<Object>(global, func->GetIsolate());
|
| }
|
| } else {
|
| - receiver = ToObject(receiver, pending_exception);
|
| + receiver = ToObject(isolate, receiver, pending_exception);
|
| }
|
| if (*pending_exception) return callable;
|
| }
|
| @@ -234,9 +235,9 @@ Handle<Object> Execution::TryCall(Handle<JSFunction> func,
|
| }
|
|
|
|
|
| -Handle<Object> Execution::GetFunctionDelegate(Handle<Object> object) {
|
| +Handle<Object> Execution::GetFunctionDelegate(Isolate* isolate,
|
| + Handle<Object> object) {
|
| ASSERT(!object->IsJSFunction());
|
| - Isolate* isolate = Isolate::Current();
|
| Factory* factory = isolate->factory();
|
|
|
| // If you return a function from here, it will be called when an
|
| @@ -261,10 +262,10 @@ Handle<Object> Execution::GetFunctionDelegate(Handle<Object> object) {
|
| }
|
|
|
|
|
| -Handle<Object> Execution::TryGetFunctionDelegate(Handle<Object> object,
|
| +Handle<Object> Execution::TryGetFunctionDelegate(Isolate* isolate,
|
| + Handle<Object> object,
|
| bool* has_pending_exception) {
|
| ASSERT(!object->IsJSFunction());
|
| - Isolate* isolate = Isolate::Current();
|
|
|
| // If object is a function proxy, get its handler. Iterate if necessary.
|
| Object* fun = *object;
|
| @@ -292,9 +293,9 @@ Handle<Object> Execution::TryGetFunctionDelegate(Handle<Object> object,
|
| }
|
|
|
|
|
| -Handle<Object> Execution::GetConstructorDelegate(Handle<Object> object) {
|
| +Handle<Object> Execution::GetConstructorDelegate(Isolate* isolate,
|
| + Handle<Object> object) {
|
| ASSERT(!object->IsJSFunction());
|
| - Isolate* isolate = Isolate::Current();
|
|
|
| // If you return a function from here, it will be called when an
|
| // attempt is made to call the given object as a constructor.
|
| @@ -319,10 +320,10 @@ Handle<Object> Execution::GetConstructorDelegate(Handle<Object> object) {
|
|
|
|
|
| Handle<Object> Execution::TryGetConstructorDelegate(
|
| + Isolate* isolate,
|
| Handle<Object> object,
|
| bool* has_pending_exception) {
|
| ASSERT(!object->IsJSFunction());
|
| - Isolate* isolate = Isolate::Current();
|
|
|
| // If you return a function from here, it will be called when an
|
| // attempt is made to call the given object as a constructor.
|
| @@ -596,54 +597,60 @@ void StackGuard::InitThread(const ExecutionAccess& lock) {
|
|
|
| #define RETURN_NATIVE_CALL(name, args, has_pending_exception) \
|
| do { \
|
| - Isolate* isolate = Isolate::Current(); \
|
| Handle<Object> argv[] = args; \
|
| ASSERT(has_pending_exception != NULL); \
|
| - return Call(isolate->name##_fun(), \
|
| + return Call(isolate, \
|
| + isolate->name##_fun(), \
|
| isolate->js_builtins_object(), \
|
| ARRAY_SIZE(argv), argv, \
|
| has_pending_exception); \
|
| } while (false)
|
|
|
|
|
| -Handle<Object> Execution::ToNumber(Handle<Object> obj, bool* exc) {
|
| +Handle<Object> Execution::ToNumber(
|
| + Isolate* isolate, Handle<Object> obj, bool* exc) {
|
| RETURN_NATIVE_CALL(to_number, { obj }, exc);
|
| }
|
|
|
|
|
| -Handle<Object> Execution::ToString(Handle<Object> obj, bool* exc) {
|
| +Handle<Object> Execution::ToString(
|
| + Isolate* isolate, Handle<Object> obj, bool* exc) {
|
| RETURN_NATIVE_CALL(to_string, { obj }, exc);
|
| }
|
|
|
|
|
| -Handle<Object> Execution::ToDetailString(Handle<Object> obj, bool* exc) {
|
| +Handle<Object> Execution::ToDetailString(
|
| + Isolate* isolate, Handle<Object> obj, bool* exc) {
|
| RETURN_NATIVE_CALL(to_detail_string, { obj }, exc);
|
| }
|
|
|
|
|
| -Handle<Object> Execution::ToObject(Handle<Object> obj, bool* exc) {
|
| +Handle<Object> Execution::ToObject(
|
| + Isolate* isolate, Handle<Object> obj, bool* exc) {
|
| if (obj->IsSpecObject()) return obj;
|
| RETURN_NATIVE_CALL(to_object, { obj }, exc);
|
| }
|
|
|
|
|
| -Handle<Object> Execution::ToInteger(Handle<Object> obj, bool* exc) {
|
| +Handle<Object> Execution::ToInteger(
|
| + Isolate* isolate, Handle<Object> obj, bool* exc) {
|
| RETURN_NATIVE_CALL(to_integer, { obj }, exc);
|
| }
|
|
|
|
|
| -Handle<Object> Execution::ToUint32(Handle<Object> obj, bool* exc) {
|
| +Handle<Object> Execution::ToUint32(
|
| + Isolate* isolate, Handle<Object> obj, bool* exc) {
|
| RETURN_NATIVE_CALL(to_uint32, { obj }, exc);
|
| }
|
|
|
|
|
| -Handle<Object> Execution::ToInt32(Handle<Object> obj, bool* exc) {
|
| +Handle<Object> Execution::ToInt32(
|
| + Isolate* isolate, Handle<Object> obj, bool* exc) {
|
| RETURN_NATIVE_CALL(to_int32, { obj }, exc);
|
| }
|
|
|
|
|
| -Handle<Object> Execution::NewDate(double time, bool* exc) {
|
| - Isolate* isolate = Isolate::Current();
|
| +Handle<Object> Execution::NewDate(Isolate* isolate, double time, bool* exc) {
|
| Handle<Object> time_obj = isolate->factory()->NewNumber(time);
|
| RETURN_NATIVE_CALL(create_date, { time_obj }, exc);
|
| }
|
| @@ -698,15 +705,18 @@ Handle<JSFunction> Execution::InstantiateFunction(
|
| Handle<FunctionTemplateInfo> data,
|
| bool* exc) {
|
| Isolate* isolate = data->GetIsolate();
|
| - // Fast case: see if the function has already been instantiated
|
| - int serial_number = Smi::cast(data->serial_number())->value();
|
| - Object* elm =
|
| - isolate->native_context()->function_cache()->
|
| - GetElementNoExceptionThrown(serial_number);
|
| - if (elm->IsJSFunction()) return Handle<JSFunction>(JSFunction::cast(elm));
|
| + if (!data->do_not_cache()) {
|
| + // Fast case: see if the function has already been instantiated
|
| + int serial_number = Smi::cast(data->serial_number())->value();
|
| + Object* elm =
|
| + isolate->native_context()->function_cache()->
|
| + GetElementNoExceptionThrown(isolate, serial_number);
|
| + if (elm->IsJSFunction()) return Handle<JSFunction>(JSFunction::cast(elm));
|
| + }
|
| // The function has not yet been instantiated in this context; do it.
|
| Handle<Object> args[] = { data };
|
| - Handle<Object> result = Call(isolate->instantiate_fun(),
|
| + Handle<Object> result = Call(isolate,
|
| + isolate->instantiate_fun(),
|
| isolate->js_builtins_object(),
|
| ARRAY_SIZE(args),
|
| args,
|
| @@ -738,7 +748,8 @@ Handle<JSObject> Execution::InstantiateObject(Handle<ObjectTemplateInfo> data,
|
| return Handle<JSObject>(JSObject::cast(result));
|
| } else {
|
| Handle<Object> args[] = { data };
|
| - Handle<Object> result = Call(isolate->instantiate_fun(),
|
| + Handle<Object> result = Call(isolate,
|
| + isolate->instantiate_fun(),
|
| isolate->js_builtins_object(),
|
| ARRAY_SIZE(args),
|
| args,
|
| @@ -749,12 +760,13 @@ Handle<JSObject> Execution::InstantiateObject(Handle<ObjectTemplateInfo> data,
|
| }
|
|
|
|
|
| -void Execution::ConfigureInstance(Handle<Object> instance,
|
| +void Execution::ConfigureInstance(Isolate* isolate,
|
| + Handle<Object> instance,
|
| Handle<Object> instance_template,
|
| bool* exc) {
|
| - Isolate* isolate = Isolate::Current();
|
| Handle<Object> args[] = { instance, instance_template };
|
| - Execution::Call(isolate->configure_instance_fun(),
|
| + Execution::Call(isolate,
|
| + isolate->configure_instance_fun(),
|
| isolate->js_builtins_object(),
|
| ARRAY_SIZE(args),
|
| args,
|
| @@ -782,9 +794,7 @@ Handle<String> Execution::GetStackTraceLine(Handle<Object> recv,
|
| }
|
|
|
|
|
| -static Object* RuntimePreempt() {
|
| - Isolate* isolate = Isolate::Current();
|
| -
|
| +static Object* RuntimePreempt(Isolate* isolate) {
|
| // Clear the preempt request flag.
|
| isolate->stack_guard()->Continue(PREEMPT);
|
|
|
| @@ -813,9 +823,7 @@ static Object* RuntimePreempt() {
|
|
|
|
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| -Object* Execution::DebugBreakHelper() {
|
| - Isolate* isolate = Isolate::Current();
|
| -
|
| +Object* Execution::DebugBreakHelper(Isolate* isolate) {
|
| // Just continue if breaks are disabled.
|
| if (isolate->debug()->disable_break()) {
|
| return isolate->heap()->undefined_value();
|
| @@ -861,15 +869,15 @@ Object* Execution::DebugBreakHelper() {
|
| // Clear the debug break request flag.
|
| isolate->stack_guard()->Continue(DEBUGBREAK);
|
|
|
| - ProcessDebugMessages(debug_command_only);
|
| + ProcessDebugMessages(isolate, debug_command_only);
|
|
|
| // Return to continue execution.
|
| return isolate->heap()->undefined_value();
|
| }
|
|
|
|
|
| -void Execution::ProcessDebugMessages(bool debug_command_only) {
|
| - Isolate* isolate = Isolate::Current();
|
| +void Execution::ProcessDebugMessages(Isolate* isolate,
|
| + bool debug_command_only) {
|
| // Clear the debug command request flag.
|
| isolate->stack_guard()->Continue(DEBUGCOMMAND);
|
|
|
| @@ -880,7 +888,7 @@ void Execution::ProcessDebugMessages(bool debug_command_only) {
|
|
|
| HandleScope scope(isolate);
|
| // Enter the debugger. Just continue if we fail to enter the debugger.
|
| - EnterDebugger debugger;
|
| + EnterDebugger debugger(isolate);
|
| if (debugger.FailedToEnter()) {
|
| return;
|
| }
|
| @@ -911,10 +919,10 @@ MaybeObject* Execution::HandleStackGuardInterrupt(Isolate* isolate) {
|
| isolate->runtime_profiler()->OptimizeNow();
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| if (stack_guard->IsDebugBreak() || stack_guard->IsDebugCommand()) {
|
| - DebugBreakHelper();
|
| + DebugBreakHelper(isolate);
|
| }
|
| #endif
|
| - if (stack_guard->IsPreempted()) RuntimePreempt();
|
| + if (stack_guard->IsPreempted()) RuntimePreempt(isolate);
|
| if (stack_guard->IsTerminateExecution()) {
|
| stack_guard->Continue(TERMINATE);
|
| return isolate->TerminateExecution();
|
|
|