| Index: src/execution.cc
|
| diff --git a/src/execution.cc b/src/execution.cc
|
| index 12dd8624526a51d930929d56dd72bea4a0f5b63d..7aa4f3341d68a4bfd3c569f4537df3db8593f3a4 100644
|
| --- a/src/execution.cc
|
| +++ b/src/execution.cc
|
| @@ -150,40 +150,43 @@ MaybeHandle<Object> Execution::New(Handle<JSFunction> func,
|
|
|
|
|
| MaybeHandle<Object> Execution::TryCall(Handle<JSFunction> func,
|
| - Handle<Object> receiver,
|
| - int argc,
|
| + Handle<Object> receiver, int argc,
|
| Handle<Object> args[],
|
| - Handle<Object>* exception_out) {
|
| + MaybeHandle<Object>* exception_out) {
|
| + bool is_termination = false;
|
| + Isolate* isolate = func->GetIsolate();
|
| + MaybeHandle<Object> maybe_result;
|
| + if (exception_out != NULL) *exception_out = MaybeHandle<Object>();
|
| // Enter a try-block while executing the JavaScript code. To avoid
|
| // duplicate error printing it must be non-verbose. Also, to avoid
|
| // creating message objects during stack overflow we shouldn't
|
| // capture messages.
|
| - v8::TryCatch catcher;
|
| - catcher.SetVerbose(false);
|
| - catcher.SetCaptureMessage(false);
|
| -
|
| - // Get isolate now, because handle might be persistent
|
| - // and get destroyed in the next call.
|
| - Isolate* isolate = func->GetIsolate();
|
| - MaybeHandle<Object> maybe_result = Invoke(false, func, receiver, argc, args);
|
| -
|
| - if (maybe_result.is_null()) {
|
| - DCHECK(catcher.HasCaught());
|
| - DCHECK(isolate->has_pending_exception());
|
| - DCHECK(isolate->external_caught_exception());
|
| - if (exception_out != NULL) {
|
| - if (isolate->pending_exception() ==
|
| - isolate->heap()->termination_exception()) {
|
| - *exception_out = isolate->factory()->termination_exception();
|
| - } else {
|
| - *exception_out = v8::Utils::OpenHandle(*catcher.Exception());
|
| + {
|
| + v8::TryCatch catcher;
|
| + catcher.SetVerbose(false);
|
| + catcher.SetCaptureMessage(false);
|
| +
|
| + maybe_result = Invoke(false, func, receiver, argc, args);
|
| +
|
| + if (maybe_result.is_null()) {
|
| + DCHECK(catcher.HasCaught());
|
| + DCHECK(isolate->has_pending_exception());
|
| + DCHECK(isolate->external_caught_exception());
|
| + if (exception_out != NULL) {
|
| + if (isolate->pending_exception() ==
|
| + isolate->heap()->termination_exception()) {
|
| + is_termination = true;
|
| + } else {
|
| + *exception_out = v8::Utils::OpenHandle(*catcher.Exception());
|
| + }
|
| }
|
| + isolate->OptionalRescheduleException(true);
|
| }
|
| - isolate->OptionalRescheduleException(true);
|
| - }
|
|
|
| - DCHECK(!isolate->has_pending_exception());
|
| - DCHECK(!isolate->external_caught_exception());
|
| + DCHECK(!isolate->has_pending_exception());
|
| + DCHECK(!isolate->external_caught_exception());
|
| + }
|
| + if (is_termination) isolate->TerminateExecution();
|
| return maybe_result;
|
| }
|
|
|
| @@ -236,10 +239,9 @@ MaybeHandle<Object> Execution::TryGetFunctionDelegate(Isolate* isolate,
|
|
|
| // If the Object doesn't have an instance-call handler we should
|
| // throw a non-callable exception.
|
| - i::Handle<i::Object> error_obj = isolate->factory()->NewTypeError(
|
| - "called_non_callable", i::HandleVector<i::Object>(&object, 1));
|
| -
|
| - return isolate->Throw<Object>(error_obj);
|
| + THROW_NEW_ERROR(isolate, NewTypeError("called_non_callable",
|
| + i::HandleVector<i::Object>(&object, 1)),
|
| + Object);
|
| }
|
|
|
|
|
| @@ -293,9 +295,9 @@ MaybeHandle<Object> Execution::TryGetConstructorDelegate(
|
|
|
| // If the Object doesn't have an instance-call handler we should
|
| // throw a non-callable exception.
|
| - i::Handle<i::Object> error_obj = isolate->factory()->NewTypeError(
|
| - "called_non_callable", i::HandleVector<i::Object>(&object, 1));
|
| - return isolate->Throw<Object>(error_obj);
|
| + THROW_NEW_ERROR(isolate, NewTypeError("called_non_callable",
|
| + i::HandleVector<i::Object>(&object, 1)),
|
| + Object);
|
| }
|
|
|
|
|
|
|