| Index: src/api.cc | 
| diff --git a/src/api.cc b/src/api.cc | 
| index 020335a587adb9e44dd0325fec64705265a4865f..e7667ba006fd38a553f78265b0e40502fadaf4df 100644 | 
| --- a/src/api.cc | 
| +++ b/src/api.cc | 
| @@ -59,13 +59,6 @@ | 
|  | 
| namespace v8 { | 
|  | 
| -#define ON_BAILOUT(isolate, location, code)                        \ | 
| -  if (IsExecutionTerminatingCheck(isolate)) {                      \ | 
| -    code;                                                          \ | 
| -    UNREACHABLE();                                                 \ | 
| -  } | 
| - | 
| - | 
| #define EXCEPTION_PREAMBLE(isolate)                                         \ | 
| (isolate)->handle_scope_implementer()->IncrementCallDepth();              \ | 
| DCHECK(!(isolate)->external_caught_exception());                          \ | 
| @@ -5485,7 +5478,6 @@ Local<Context> v8::Context::New( | 
| v8::Handle<Value> global_object) { | 
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(external_isolate); | 
| LOG_API(isolate, "Context::New"); | 
| -  ON_BAILOUT(isolate, "v8::Context::New()", return Local<Context>()); | 
| i::HandleScope scope(isolate); | 
| ExtensionConfiguration no_extensions; | 
| if (extensions == NULL) extensions = &no_extensions; | 
| @@ -5569,44 +5561,45 @@ void Context::SetErrorMessageForCodeGenerationFromStrings( | 
| } | 
|  | 
|  | 
| +MaybeLocal<v8::Object> ObjectTemplate::NewInstance(Local<Context> context) { | 
| +  PREPARE_FOR_EXECUTION(context, "v8::ObjectTemplate::NewInstance()", Object); | 
| +  auto self = Utils::OpenHandle(this); | 
| +  Local<Object> result; | 
| +  has_pending_exception = | 
| +      !ToLocal<Object>(i::ApiNatives::InstantiateObject(self), &result); | 
| +  RETURN_ON_FAILED_EXECUTION(Object); | 
| +  RETURN_ESCAPED(result); | 
| +} | 
| + | 
| + | 
| Local<v8::Object> ObjectTemplate::NewInstance() { | 
| -  i::Handle<i::ObjectTemplateInfo> info = Utils::OpenHandle(this); | 
| -  i::Isolate* isolate = info->GetIsolate(); | 
| -  ON_BAILOUT(isolate, "v8::ObjectTemplate::NewInstance()", | 
| -             return Local<v8::Object>()); | 
| -  LOG_API(isolate, "ObjectTemplate::NewInstance"); | 
| -  ENTER_V8(isolate); | 
| -  EXCEPTION_PREAMBLE(isolate); | 
| -  i::Handle<i::Object> obj; | 
| +  auto context = ContextFromHeapObject(Utils::OpenHandle(this)); | 
| +  RETURN_TO_LOCAL_UNCHECKED(NewInstance(context), Object); | 
| +} | 
| + | 
| + | 
| +MaybeLocal<v8::Function> FunctionTemplate::GetFunction(Local<Context> context) { | 
| +  PREPARE_FOR_EXECUTION(context, "v8::FunctionTemplate::GetFunction()", | 
| +                        Function); | 
| +  auto self = Utils::OpenHandle(this); | 
| +  Local<Function> result; | 
| has_pending_exception = | 
| -      !i::ApiNatives::InstantiateObject(info).ToHandle(&obj); | 
| -  EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); | 
| -  return Utils::ToLocal(i::Handle<i::JSObject>::cast(obj)); | 
| +      !ToLocal<Function>(i::ApiNatives::InstantiateFunction(self), &result); | 
| +  RETURN_ON_FAILED_EXECUTION(Function); | 
| +  RETURN_ESCAPED(result); | 
| } | 
|  | 
|  | 
| Local<v8::Function> FunctionTemplate::GetFunction() { | 
| -  i::Handle<i::FunctionTemplateInfo> info = Utils::OpenHandle(this); | 
| -  i::Isolate* isolate = info->GetIsolate(); | 
| -  ON_BAILOUT(isolate, "v8::FunctionTemplate::GetFunction()", | 
| -             return Local<v8::Function>()); | 
| -  LOG_API(isolate, "FunctionTemplate::GetFunction"); | 
| -  ENTER_V8(isolate); | 
| -  EXCEPTION_PREAMBLE(isolate); | 
| -  i::Handle<i::Object> obj; | 
| -  has_pending_exception = | 
| -      !i::ApiNatives::InstantiateFunction(info).ToHandle(&obj); | 
| -  EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Function>()); | 
| -  return Utils::ToLocal(i::Handle<i::JSFunction>::cast(obj)); | 
| +  auto context = ContextFromHeapObject(Utils::OpenHandle(this)); | 
| +  RETURN_TO_LOCAL_UNCHECKED(GetFunction(context), Function); | 
| } | 
|  | 
|  | 
| bool FunctionTemplate::HasInstance(v8::Handle<v8::Value> value) { | 
| -  i::Handle<i::FunctionTemplateInfo> info = Utils::OpenHandle(this); | 
| -  i::Isolate* isolate = info->GetIsolate(); | 
| -  ON_BAILOUT(isolate, "v8::FunctionTemplate::HasInstanceOf()", return false); | 
| -  i::Object* obj = *Utils::OpenHandle(*value); | 
| -  return info->IsTemplateFor(obj); | 
| +  auto self = Utils::OpenHandle(this); | 
| +  auto obj = Utils::OpenHandle(*value); | 
| +  return self->IsTemplateFor(*obj); | 
| } | 
|  | 
|  | 
| @@ -5687,7 +5680,6 @@ inline Local<String> NewString(Isolate* v8_isolate, | 
| String::NewStringType type, | 
| int length) { | 
| i::Isolate* isolate = reinterpret_cast<internal::Isolate*>(v8_isolate); | 
| -  ON_BAILOUT(isolate, location, return Local<String>()); | 
| LOG_API(isolate, env); | 
| if (length == 0) { | 
| return String::Empty(v8_isolate); | 
| @@ -6000,13 +5992,9 @@ double v8::Date::ValueOf() const { | 
|  | 
| void v8::Date::DateTimeConfigurationChangeNotification(Isolate* isolate) { | 
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 
| -  ON_BAILOUT(i_isolate, "v8::Date::DateTimeConfigurationChangeNotification()", | 
| -             return); | 
| LOG_API(i_isolate, "Date::DateTimeConfigurationChangeNotification"); | 
| ENTER_V8(i_isolate); | 
| - | 
| i_isolate->date_cache()->ResetDateCache(); | 
| - | 
| if (!i_isolate->eternal_handles()->Exists( | 
| i::EternalHandles::DATE_CACHE_VERSION)) { | 
| return; | 
| @@ -6035,18 +6023,24 @@ static i::Handle<i::String> RegExpFlagsToString(RegExp::Flags flags) { | 
| } | 
|  | 
|  | 
| -Local<v8::RegExp> v8::RegExp::New(Handle<String> pattern, | 
| -                                  Flags flags) { | 
| -  i::Isolate* isolate = Utils::OpenHandle(*pattern)->GetIsolate(); | 
| -  LOG_API(isolate, "RegExp::New"); | 
| -  ENTER_V8(isolate); | 
| -  EXCEPTION_PREAMBLE(isolate); | 
| -  i::Handle<i::JSRegExp> obj; | 
| -  has_pending_exception = !i::Execution::NewJSRegExp( | 
| -      Utils::OpenHandle(*pattern), | 
| -      RegExpFlagsToString(flags)).ToHandle(&obj); | 
| -  EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::RegExp>()); | 
| -  return Utils::ToLocal(i::Handle<i::JSRegExp>::cast(obj)); | 
| +MaybeLocal<v8::RegExp> v8::RegExp::New(Local<Context> context, | 
| +                                       Handle<String> pattern, Flags flags) { | 
| +  PREPARE_FOR_EXECUTION(context, "RegExp::New", RegExp); | 
| +  Local<v8::RegExp> result; | 
| +  has_pending_exception = | 
| +      !ToLocal<RegExp>(i::Execution::NewJSRegExp(Utils::OpenHandle(*pattern), | 
| +                                                 RegExpFlagsToString(flags)), | 
| +                       &result); | 
| +  RETURN_ON_FAILED_EXECUTION(RegExp); | 
| +  RETURN_ESCAPED(result); | 
| +} | 
| + | 
| + | 
| +Local<v8::RegExp> v8::RegExp::New(Handle<String> pattern, Flags flags) { | 
| +  auto isolate = | 
| +      reinterpret_cast<Isolate*>(Utils::OpenHandle(*pattern)->GetIsolate()); | 
| +  auto context = isolate->GetCurrentContext(); | 
| +  RETURN_TO_LOCAL_UNCHECKED(New(context, pattern, flags), RegExp); | 
| } | 
|  | 
|  | 
| @@ -6096,26 +6090,26 @@ uint32_t v8::Array::Length() const { | 
| } | 
|  | 
|  | 
| -Local<Object> Array::CloneElementAt(uint32_t index) { | 
| -  i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 
| -  ON_BAILOUT(isolate, "v8::Array::CloneElementAt()", return Local<Object>()); | 
| -  i::Handle<i::JSObject> self = Utils::OpenHandle(this); | 
| -  if (!self->HasFastObjectElements()) { | 
| -    return Local<Object>(); | 
| -  } | 
| +MaybeLocal<Object> Array::CloneElementAt(Local<Context> context, | 
| +                                         uint32_t index) { | 
| +  PREPARE_FOR_EXECUTION(context, "v8::Array::CloneElementAt()", Object); | 
| +  auto self = Utils::OpenHandle(this); | 
| +  if (!self->HasFastObjectElements()) return Local<Object>(); | 
| i::FixedArray* elms = i::FixedArray::cast(self->elements()); | 
| i::Object* paragon = elms->get(index); | 
| -  if (!paragon->IsJSObject()) { | 
| -    return Local<Object>(); | 
| -  } | 
| +  if (!paragon->IsJSObject()) return Local<Object>(); | 
| i::Handle<i::JSObject> paragon_handle(i::JSObject::cast(paragon)); | 
| -  EXCEPTION_PREAMBLE(isolate); | 
| -  ENTER_V8(isolate); | 
| -  i::Handle<i::JSObject> result = | 
| -      isolate->factory()->CopyJSObject(paragon_handle); | 
| -  has_pending_exception = result.is_null(); | 
| -  EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); | 
| -  return Utils::ToLocal(result); | 
| +  Local<Object> result; | 
| +  has_pending_exception = ToLocal<Object>( | 
| +      isolate->factory()->CopyJSObject(paragon_handle), &result); | 
| +  RETURN_ON_FAILED_EXECUTION(Object); | 
| +  RETURN_ESCAPED(result); | 
| +} | 
| + | 
| + | 
| +Local<Object> Array::CloneElementAt(uint32_t index) { | 
| +  auto context = ContextFromHeapObject(Utils::OpenHandle(this)); | 
| +  RETURN_TO_LOCAL_UNCHECKED(CloneElementAt(context, index), Object); | 
| } | 
|  | 
|  | 
| @@ -7054,7 +7048,6 @@ bool Isolate::IsDead() { | 
|  | 
| bool Isolate::AddMessageListener(MessageCallback that, Handle<Value> data) { | 
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 
| -  ON_BAILOUT(isolate, "v8::V8::AddMessageListener()", return false); | 
| ENTER_V8(isolate); | 
| i::HandleScope scope(isolate); | 
| NeanderArray listeners(isolate->factory()->message_listeners()); | 
| @@ -7069,7 +7062,6 @@ bool Isolate::AddMessageListener(MessageCallback that, Handle<Value> data) { | 
|  | 
| void Isolate::RemoveMessageListeners(MessageCallback that) { | 
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 
| -  ON_BAILOUT(isolate, "v8::V8::RemoveMessageListeners()", return); | 
| ENTER_V8(isolate); | 
| i::HandleScope scope(isolate); | 
| NeanderArray listeners(isolate->factory()->message_listeners()); | 
| @@ -7187,7 +7179,6 @@ String::Value::~Value() { | 
| Local<Value> Exception::NAME(v8::Handle<v8::String> raw_message) {          \ | 
| i::Isolate* isolate = i::Isolate::Current();                              \ | 
| LOG_API(isolate, #NAME);                                                  \ | 
| -    ON_BAILOUT(isolate, "v8::Exception::" #NAME "()", return Local<Value>()); \ | 
| ENTER_V8(isolate);                                                        \ | 
| i::Object* error;                                                         \ | 
| {                                                                         \ | 
| @@ -7233,7 +7224,6 @@ Local<StackTrace> Exception::GetStackTrace(Handle<Value> exception) { | 
|  | 
| bool Debug::SetDebugEventListener(EventCallback that, Handle<Value> data) { | 
| i::Isolate* isolate = i::Isolate::Current(); | 
| -  ON_BAILOUT(isolate, "v8::Debug::SetDebugEventListener()", return false); | 
| ENTER_V8(isolate); | 
| i::HandleScope scope(isolate); | 
| i::Handle<i::Object> foreign = isolate->factory()->undefined_value(); | 
| @@ -7286,52 +7276,54 @@ void Debug::SendCommand(Isolate* isolate, | 
| } | 
|  | 
|  | 
| -Local<Value> Debug::Call(v8::Handle<v8::Function> fun, | 
| -                         v8::Handle<v8::Value> data) { | 
| -  i::Isolate* isolate = i::Isolate::Current(); | 
| -  ON_BAILOUT(isolate, "v8::Debug::Call()", return Local<Value>()); | 
| -  ENTER_V8(isolate); | 
| -  i::MaybeHandle<i::Object> maybe_result; | 
| -  EXCEPTION_PREAMBLE(isolate); | 
| +MaybeLocal<Value> Debug::Call(Local<Context> context, | 
| +                              v8::Handle<v8::Function> fun, | 
| +                              v8::Handle<v8::Value> data) { | 
| +  PREPARE_FOR_EXECUTION(context, "v8::Debug::Call()", Value); | 
| +  i::Handle<i::Object> data_obj; | 
| if (data.IsEmpty()) { | 
| -    maybe_result = isolate->debug()->Call( | 
| -        Utils::OpenHandle(*fun), isolate->factory()->undefined_value()); | 
| +    data_obj = isolate->factory()->undefined_value(); | 
| } else { | 
| -    maybe_result = isolate->debug()->Call( | 
| -        Utils::OpenHandle(*fun), Utils::OpenHandle(*data)); | 
| +    data_obj = Utils::OpenHandle(*data); | 
| } | 
| -  i::Handle<i::Object> result; | 
| -  has_pending_exception = !maybe_result.ToHandle(&result); | 
| -  EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); | 
| -  return Utils::ToLocal(result); | 
| +  Local<Value> result; | 
| +  has_pending_exception = | 
| +      !ToLocal<Value>(isolate->debug()->Call(Utils::OpenHandle(*fun), data_obj), | 
| +                      &result); | 
| +  RETURN_ON_FAILED_EXECUTION(Value); | 
| +  RETURN_ESCAPED(result); | 
| } | 
|  | 
|  | 
| -Local<Value> Debug::GetMirror(v8::Handle<v8::Value> obj) { | 
| -  i::Isolate* isolate = i::Isolate::Current(); | 
| -  ON_BAILOUT(isolate, "v8::Debug::GetMirror()", return Local<Value>()); | 
| -  ENTER_V8(isolate); | 
| -  v8::EscapableHandleScope scope(reinterpret_cast<Isolate*>(isolate)); | 
| +Local<Value> Debug::Call(v8::Handle<v8::Function> fun, | 
| +                         v8::Handle<v8::Value> data) { | 
| +  auto context = ContextFromHeapObject(Utils::OpenHandle(*fun)); | 
| +  RETURN_TO_LOCAL_UNCHECKED(Call(context, fun, data), Value); | 
| +} | 
| + | 
| + | 
| +MaybeLocal<Value> Debug::GetMirror(Local<Context> context, | 
| +                                   v8::Handle<v8::Value> obj) { | 
| +  PREPARE_FOR_EXECUTION(context, "v8::Debug::GetMirror()", Value); | 
| i::Debug* isolate_debug = isolate->debug(); | 
| -  EXCEPTION_PREAMBLE(isolate); | 
| has_pending_exception = !isolate_debug->Load(); | 
| -  v8::Local<v8::Value> result; | 
| -  if (!has_pending_exception) { | 
| -    i::Handle<i::JSObject> debug( | 
| -        isolate_debug->debug_context()->global_object()); | 
| -    i::Handle<i::String> name = isolate->factory()->InternalizeOneByteString( | 
| -        STATIC_CHAR_VECTOR("MakeMirror")); | 
| -    i::Handle<i::Object> fun_obj = | 
| -        i::Object::GetProperty(debug, name).ToHandleChecked(); | 
| -    i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(fun_obj); | 
| -    v8::Handle<v8::Function> v8_fun = Utils::ToLocal(fun); | 
| -    const int kArgc = 1; | 
| -    v8::Handle<v8::Value> argv[kArgc] = { obj }; | 
| -    result = v8_fun->Call(Utils::ToLocal(debug), kArgc, argv); | 
| -    has_pending_exception = result.IsEmpty(); | 
| -  } | 
| -  EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); | 
| -  return scope.Escape(result); | 
| +  RETURN_ON_FAILED_EXECUTION(Value); | 
| +  i::Handle<i::JSObject> debug(isolate_debug->debug_context()->global_object()); | 
| +  auto name = isolate->factory()->NewStringFromStaticChars("MakeMirror"); | 
| +  auto fun_obj = i::Object::GetProperty(debug, name).ToHandleChecked(); | 
| +  auto v8_fun = Utils::ToLocal(i::Handle<i::JSFunction>::cast(fun_obj)); | 
| +  const int kArgc = 1; | 
| +  v8::Handle<v8::Value> argv[kArgc] = {obj}; | 
| +  Local<Value> result; | 
| +  has_pending_exception = !v8_fun->Call(context, Utils::ToLocal(debug), kArgc, | 
| +                                        argv).ToLocal(&result); | 
| +  RETURN_ON_FAILED_EXECUTION(Value); | 
| +  RETURN_ESCAPED(result); | 
| +} | 
| + | 
| + | 
| +Local<Value> Debug::GetMirror(v8::Handle<v8::Value> obj) { | 
| +  RETURN_TO_LOCAL_UNCHECKED(GetMirror(Local<Context>(), obj), Value); | 
| } | 
|  | 
|  | 
|  |