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

Side by Side Diff: src/api.cc

Issue 993883002: convert Function and Promise to maybe (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 months 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 unified diff | Download patch
« no previous file with comments | « include/v8.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 UNREACHABLE(); \ 65 UNREACHABLE(); \
66 } 66 }
67 67
68 68
69 #define EXCEPTION_PREAMBLE(isolate) \ 69 #define EXCEPTION_PREAMBLE(isolate) \
70 (isolate)->handle_scope_implementer()->IncrementCallDepth(); \ 70 (isolate)->handle_scope_implementer()->IncrementCallDepth(); \
71 DCHECK(!(isolate)->external_caught_exception()); \ 71 DCHECK(!(isolate)->external_caught_exception()); \
72 bool has_pending_exception = false 72 bool has_pending_exception = false
73 73
74 74
75 #define EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, do_callback) \ 75 #define EXCEPTION_BAILOUT_CHECK(isolate, value) \
76 do { \ 76 do { \
77 i::HandleScopeImplementer* handle_scope_implementer = \ 77 i::HandleScopeImplementer* handle_scope_implementer = \
78 (isolate)->handle_scope_implementer(); \ 78 (isolate)->handle_scope_implementer(); \
79 handle_scope_implementer->DecrementCallDepth(); \ 79 handle_scope_implementer->DecrementCallDepth(); \
80 if (has_pending_exception) { \ 80 if (has_pending_exception) { \
81 bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \ 81 bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \
82 (isolate)->OptionalRescheduleException(call_depth_is_zero); \ 82 (isolate)->OptionalRescheduleException(call_depth_is_zero); \
83 do_callback \ 83 return value; \
84 return value; \ 84 } \
85 } \
86 do_callback \
87 } while (false) 85 } while (false)
88 86
89 87
90 #define EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, value) \
91 EXCEPTION_BAILOUT_CHECK_GENERIC( \
92 isolate, value, isolate->FireCallCompletedCallback();)
93
94
95 #define EXCEPTION_BAILOUT_CHECK(isolate, value) \
96 EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, ;)
97
98
99 #define PREPARE_FOR_EXECUTION_GENERIC(isolate, context, function_name, \ 88 #define PREPARE_FOR_EXECUTION_GENERIC(isolate, context, function_name, \
100 bailout_value, HandleScopeClass, \ 89 bailout_value, HandleScopeClass, \
101 do_callback) \ 90 do_callback) \
102 if (IsExecutionTerminatingCheck(isolate)) { \ 91 if (IsExecutionTerminatingCheck(isolate)) { \
103 return bailout_value; \ 92 return bailout_value; \
104 } \ 93 } \
105 HandleScopeClass handle_scope(isolate); \ 94 HandleScopeClass handle_scope(isolate); \
106 CallDepthScope call_depth_scope(isolate, context, do_callback); \ 95 CallDepthScope call_depth_scope(isolate, context, do_callback); \
107 LOG_API(isolate, function_name); \ 96 LOG_API(isolate, function_name); \
108 ENTER_V8(isolate); \ 97 ENTER_V8(isolate); \
(...skipping 4273 matching lines...) Expand 10 before | Expand all | Expand 10 after
4382 isolate, callback, data, Local<Signature>(), length, true)-> 4371 isolate, callback, data, Local<Signature>(), length, true)->
4383 GetFunction(); 4372 GetFunction();
4384 } 4373 }
4385 4374
4386 4375
4387 Local<v8::Object> Function::NewInstance() const { 4376 Local<v8::Object> Function::NewInstance() const {
4388 return NewInstance(0, NULL); 4377 return NewInstance(0, NULL);
4389 } 4378 }
4390 4379
4391 4380
4381 MaybeLocal<Object> Function::NewInstance(Local<Context> context, int argc,
4382 v8::Handle<v8::Value> argv[]) const {
4383 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Function::NewInstance()",
4384 Object);
4385 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
4386 auto self = Utils::OpenHandle(this);
4387 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
4388 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
4389 Local<Object> result;
4390 has_pending_exception =
4391 !ToLocal<Object>(i::Execution::New(self, argc, args), &result);
4392 RETURN_ON_FAILED_EXECUTION(Object);
4393 RETURN_ESCAPED(result);
4394 }
4395
4396
4392 Local<v8::Object> Function::NewInstance(int argc, 4397 Local<v8::Object> Function::NewInstance(int argc,
4393 v8::Handle<v8::Value> argv[]) const { 4398 v8::Handle<v8::Value> argv[]) const {
4394 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4399 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
4395 ON_BAILOUT(isolate, "v8::Function::NewInstance()", 4400 RETURN_TO_LOCAL_UNCHECKED(NewInstance(context, argc, argv), Object);
4396 return Local<v8::Object>()); 4401 }
4397 LOG_API(isolate, "Function::NewInstance"); 4402
4398 ENTER_V8(isolate); 4403
4404 MaybeLocal<v8::Value> Function::Call(Local<Context> context,
4405 v8::Handle<v8::Value> recv, int argc,
4406 v8::Handle<v8::Value> argv[]) {
4407 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Function::Call()", Value);
4399 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); 4408 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
4400 EscapableHandleScope scope(reinterpret_cast<Isolate*>(isolate)); 4409 auto self = Utils::OpenHandle(this);
4401 i::Handle<i::JSFunction> function = Utils::OpenHandle(this); 4410 i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv);
4402 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); 4411 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
4403 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); 4412 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
4404 EXCEPTION_PREAMBLE(isolate); 4413 Local<Value> result;
4405 i::Handle<i::Object> returned; 4414 has_pending_exception =
4406 has_pending_exception = !i::Execution::New( 4415 !ToLocal<Value>(
4407 function, argc, args).ToHandle(&returned); 4416 i::Execution::Call(isolate, self, recv_obj, argc, args, true),
4408 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>()); 4417 &result);
4409 return scope.Escape(Utils::ToLocal(i::Handle<i::JSObject>::cast(returned))); 4418 RETURN_ON_FAILED_EXECUTION(Value);
4419 RETURN_ESCAPED(result);
4410 } 4420 }
4411 4421
4412 4422
4413 Local<v8::Value> Function::Call(v8::Handle<v8::Value> recv, int argc, 4423 Local<v8::Value> Function::Call(v8::Handle<v8::Value> recv, int argc,
4414 v8::Handle<v8::Value> argv[]) { 4424 v8::Handle<v8::Value> argv[]) {
4415 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4425 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
4416 ON_BAILOUT(isolate, "v8::Function::Call()", return Local<v8::Value>()); 4426 RETURN_TO_LOCAL_UNCHECKED(Call(context, recv, argc, argv), Value);
4417 LOG_API(isolate, "Function::Call");
4418 ENTER_V8(isolate);
4419 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
4420 i::HandleScope scope(isolate);
4421 i::Handle<i::JSFunction> fun = Utils::OpenHandle(this);
4422 i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv);
4423 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
4424 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
4425 EXCEPTION_PREAMBLE(isolate);
4426 i::Handle<i::Object> returned;
4427 has_pending_exception = !i::Execution::Call(
4428 isolate, fun, recv_obj, argc, args, true).ToHandle(&returned);
4429 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Object>());
4430 return Utils::ToLocal(scope.CloseAndEscape(returned));
4431 } 4427 }
4432 4428
4433 4429
4434 void Function::SetName(v8::Handle<v8::String> name) { 4430 void Function::SetName(v8::Handle<v8::String> name) {
4435 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
4436 ENTER_V8(isolate);
4437 USE(isolate);
4438 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 4431 i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
4439 func->shared()->set_name(*Utils::OpenHandle(*name)); 4432 func->shared()->set_name(*Utils::OpenHandle(*name));
4440 } 4433 }
4441 4434
4442 4435
4443 Handle<Value> Function::GetName() const { 4436 Handle<Value> Function::GetName() const {
4444 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 4437 i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
4445 return Utils::ToLocal(i::Handle<i::Object>(func->shared()->name(), 4438 return Utils::ToLocal(i::Handle<i::Object>(func->shared()->name(),
4446 func->GetIsolate())); 4439 func->GetIsolate()));
4447 } 4440 }
4448 4441
4449 4442
4450 Handle<Value> Function::GetInferredName() const { 4443 Handle<Value> Function::GetInferredName() const {
4451 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 4444 i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
4452 return Utils::ToLocal(i::Handle<i::Object>(func->shared()->inferred_name(), 4445 return Utils::ToLocal(i::Handle<i::Object>(func->shared()->inferred_name(),
4453 func->GetIsolate())); 4446 func->GetIsolate()));
4454 } 4447 }
4455 4448
4456 4449
4457 Handle<Value> Function::GetDisplayName() const { 4450 Handle<Value> Function::GetDisplayName() const {
4458 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4451 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
4459 ON_BAILOUT(isolate, "v8::Function::GetDisplayName()",
4460 return ToApiHandle<Primitive>(
4461 isolate->factory()->undefined_value()));
4462 ENTER_V8(isolate); 4452 ENTER_V8(isolate);
4463 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 4453 i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
4464 i::Handle<i::String> property_name = 4454 i::Handle<i::String> property_name =
4465 isolate->factory()->InternalizeOneByteString( 4455 isolate->factory()->NewStringFromStaticChars("displayName");
4466 STATIC_CHAR_VECTOR("displayName"));
4467
4468 i::Handle<i::Object> value = 4456 i::Handle<i::Object> value =
4469 i::JSObject::GetDataProperty(func, property_name); 4457 i::JSObject::GetDataProperty(func, property_name);
4470 if (value->IsString()) { 4458 if (value->IsString()) {
4471 i::Handle<i::String> name = i::Handle<i::String>::cast(value); 4459 i::Handle<i::String> name = i::Handle<i::String>::cast(value);
4472 if (name->length() > 0) return Utils::ToLocal(name); 4460 if (name->length() > 0) return Utils::ToLocal(name);
4473 } 4461 }
4474
4475 return ToApiHandle<Primitive>(isolate->factory()->undefined_value()); 4462 return ToApiHandle<Primitive>(isolate->factory()->undefined_value());
4476 } 4463 }
4477 4464
4478 4465
4479 ScriptOrigin Function::GetScriptOrigin() const { 4466 ScriptOrigin Function::GetScriptOrigin() const {
4480 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 4467 i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
4481 if (func->shared()->script()->IsScript()) { 4468 if (func->shared()->script()->IsScript()) {
4482 i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); 4469 i::Handle<i::Script> script(i::Script::cast(func->shared()->script()));
4483 return GetScriptOriginForScript(func->GetIsolate(), script); 4470 return GetScriptOriginForScript(func->GetIsolate(), script);
4484 } 4471 }
(...skipping 1655 matching lines...) Expand 10 before | Expand all | Expand 10 after
6140 isolate, 6127 isolate,
6141 isolate->is_promise(), 6128 isolate->is_promise(),
6142 isolate->factory()->undefined_value(), 6129 isolate->factory()->undefined_value(),
6143 arraysize(argv), argv, 6130 arraysize(argv), argv,
6144 false).ToHandle(&b); 6131 false).ToHandle(&b);
6145 EXCEPTION_BAILOUT_CHECK(isolate, false); 6132 EXCEPTION_BAILOUT_CHECK(isolate, false);
6146 return b->BooleanValue(); 6133 return b->BooleanValue();
6147 } 6134 }
6148 6135
6149 6136
6150 Local<Promise::Resolver> Promise::Resolver::New(Isolate* v8_isolate) { 6137 MaybeLocal<Promise::Resolver> Promise::Resolver::New(Local<Context> context) {
6151 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 6138 PREPARE_FOR_EXECUTION(context, "Promise::Resolver::New", Resolver);
6152 LOG_API(isolate, "Promise::Resolver::New");
6153 ENTER_V8(isolate);
6154 EXCEPTION_PREAMBLE(isolate);
6155 i::Handle<i::Object> result; 6139 i::Handle<i::Object> result;
6156 has_pending_exception = !i::Execution::Call( 6140 has_pending_exception = !i::Execution::Call(
6157 isolate, 6141 isolate,
6158 isolate->promise_create(), 6142 isolate->promise_create(),
6159 isolate->factory()->undefined_value(), 6143 isolate->factory()->undefined_value(),
6160 0, NULL, 6144 0, NULL,
6161 false).ToHandle(&result); 6145 false).ToHandle(&result);
6162 EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise::Resolver>()); 6146 RETURN_ON_FAILED_EXECUTION(Promise::Resolver);
6163 return Local<Promise::Resolver>::Cast(Utils::ToLocal(result)); 6147 RETURN_ESCAPED(Local<Promise::Resolver>::Cast(Utils::ToLocal(result)));
6164 } 6148 }
6165 6149
6166 6150
6151 Local<Promise::Resolver> Promise::Resolver::New(Isolate* isolate) {
6152 RETURN_TO_LOCAL_UNCHECKED(New(isolate->GetCurrentContext()),
6153 Promise::Resolver);
6154 }
6155
6156
6167 Local<Promise> Promise::Resolver::GetPromise() { 6157 Local<Promise> Promise::Resolver::GetPromise() {
6168 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 6158 i::Handle<i::JSObject> promise = Utils::OpenHandle(this);
6169 return Local<Promise>::Cast(Utils::ToLocal(promise)); 6159 return Local<Promise>::Cast(Utils::ToLocal(promise));
6170 } 6160 }
6171 6161
6172 6162
6173 void Promise::Resolver::Resolve(Handle<Value> value) { 6163 Maybe<bool> Promise::Resolver::Resolve(Local<Context> context,
6174 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 6164 Handle<Value> value) {
6175 i::Isolate* isolate = promise->GetIsolate(); 6165 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "Promise::Resolver::Resolve", bool);
6176 LOG_API(isolate, "Promise::Resolver::Resolve"); 6166 auto self = Utils::OpenHandle(this);
6177 ENTER_V8(isolate); 6167 i::Handle<i::Object> argv[] = {self, Utils::OpenHandle(*value)};
6178 EXCEPTION_PREAMBLE(isolate);
6179 i::Handle<i::Object> argv[] = { promise, Utils::OpenHandle(*value) };
6180 has_pending_exception = i::Execution::Call( 6168 has_pending_exception = i::Execution::Call(
6181 isolate, 6169 isolate,
6182 isolate->promise_resolve(), 6170 isolate->promise_resolve(),
6183 isolate->factory()->undefined_value(), 6171 isolate->factory()->undefined_value(),
6184 arraysize(argv), argv, 6172 arraysize(argv), argv,
6185 false).is_null(); 6173 false).is_null();
6186 EXCEPTION_BAILOUT_CHECK(isolate, /* void */ ;); 6174 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
6175 return Just(true);
6187 } 6176 }
6188 6177
6189 6178
6190 void Promise::Resolver::Reject(Handle<Value> value) { 6179 void Promise::Resolver::Resolve(Handle<Value> value) {
6191 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 6180 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
6192 i::Isolate* isolate = promise->GetIsolate(); 6181 Resolve(context, value);
6193 LOG_API(isolate, "Promise::Resolver::Reject"); 6182 }
6194 ENTER_V8(isolate); 6183
6195 EXCEPTION_PREAMBLE(isolate); 6184
6196 i::Handle<i::Object> argv[] = { promise, Utils::OpenHandle(*value) }; 6185 Maybe<bool> Promise::Resolver::Reject(Local<Context> context,
6186 Handle<Value> value) {
6187 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "Promise::Resolver::Resolve", bool);
6188 auto self = Utils::OpenHandle(this);
6189 i::Handle<i::Object> argv[] = {self, Utils::OpenHandle(*value)};
6197 has_pending_exception = i::Execution::Call( 6190 has_pending_exception = i::Execution::Call(
6198 isolate, 6191 isolate,
6199 isolate->promise_reject(), 6192 isolate->promise_reject(),
6200 isolate->factory()->undefined_value(), 6193 isolate->factory()->undefined_value(),
6201 arraysize(argv), argv, 6194 arraysize(argv), argv,
6202 false).is_null(); 6195 false).is_null();
6203 EXCEPTION_BAILOUT_CHECK(isolate, /* void */ ;); 6196 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
6197 return Just(true);
6198 }
6199
6200
6201 void Promise::Resolver::Reject(Handle<Value> value) {
6202 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
6203 Reject(context, value);
6204 }
6205
6206
6207 MaybeLocal<Promise> Promise::Chain(Local<Context> context,
6208 Handle<Function> handler) {
6209 PREPARE_FOR_EXECUTION(context, "Promise::Chain", Promise);
6210 auto self = Utils::OpenHandle(this);
6211 i::Handle<i::Object> argv[] = {Utils::OpenHandle(*handler)};
6212 i::Handle<i::Object> result;
6213 has_pending_exception =
6214 !i::Execution::Call(isolate, isolate->promise_chain(), self,
6215 arraysize(argv), argv, false).ToHandle(&result);
6216 RETURN_ON_FAILED_EXECUTION(Promise);
6217 RETURN_ESCAPED(Local<Promise>::Cast(Utils::ToLocal(result)));
6204 } 6218 }
6205 6219
6206 6220
6207 Local<Promise> Promise::Chain(Handle<Function> handler) { 6221 Local<Promise> Promise::Chain(Handle<Function> handler) {
6208 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 6222 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
6209 i::Isolate* isolate = promise->GetIsolate(); 6223 RETURN_TO_LOCAL_UNCHECKED(Chain(context, handler), Promise);
6210 LOG_API(isolate, "Promise::Chain"); 6224 }
6211 ENTER_V8(isolate); 6225
6212 EXCEPTION_PREAMBLE(isolate); 6226
6227 MaybeLocal<Promise> Promise::Catch(Local<Context> context,
6228 Handle<Function> handler) {
6229 PREPARE_FOR_EXECUTION(context, "Promise::Catch", Promise);
6230 auto self = Utils::OpenHandle(this);
6213 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; 6231 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) };
6214 i::Handle<i::Object> result; 6232 i::Handle<i::Object> result;
6215 has_pending_exception = !i::Execution::Call( 6233 has_pending_exception =
6216 isolate, 6234 !i::Execution::Call(isolate, isolate->promise_catch(), self,
6217 isolate->promise_chain(), 6235 arraysize(argv), argv, false).ToHandle(&result);
6218 promise, 6236 RETURN_ON_FAILED_EXECUTION(Promise);
6219 arraysize(argv), argv, 6237 RETURN_ESCAPED(Local<Promise>::Cast(Utils::ToLocal(result)));
6220 false).ToHandle(&result);
6221 EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>());
6222 return Local<Promise>::Cast(Utils::ToLocal(result));
6223 } 6238 }
6224 6239
6225 6240
6226 Local<Promise> Promise::Catch(Handle<Function> handler) { 6241 Local<Promise> Promise::Catch(Handle<Function> handler) {
6227 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 6242 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
6228 i::Isolate* isolate = promise->GetIsolate(); 6243 RETURN_TO_LOCAL_UNCHECKED(Catch(context, handler), Promise);
6229 LOG_API(isolate, "Promise::Catch"); 6244 }
6230 ENTER_V8(isolate); 6245
6231 EXCEPTION_PREAMBLE(isolate); 6246
6247 MaybeLocal<Promise> Promise::Then(Local<Context> context,
6248 Handle<Function> handler) {
6249 PREPARE_FOR_EXECUTION(context, "Promise::Then", Promise);
6250 auto self = Utils::OpenHandle(this);
6232 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) }; 6251 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) };
6233 i::Handle<i::Object> result; 6252 i::Handle<i::Object> result;
6234 has_pending_exception = !i::Execution::Call( 6253 has_pending_exception =
6235 isolate, 6254 !i::Execution::Call(isolate, isolate->promise_then(), self,
6236 isolate->promise_catch(), 6255 arraysize(argv), argv, false).ToHandle(&result);
6237 promise, 6256 RETURN_ON_FAILED_EXECUTION(Promise);
6238 arraysize(argv), argv, 6257 RETURN_ESCAPED(Local<Promise>::Cast(Utils::ToLocal(result)));
6239 false).ToHandle(&result);
6240 EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>());
6241 return Local<Promise>::Cast(Utils::ToLocal(result));
6242 } 6258 }
6243 6259
6244 6260
6245 Local<Promise> Promise::Then(Handle<Function> handler) { 6261 Local<Promise> Promise::Then(Handle<Function> handler) {
6246 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 6262 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
6247 i::Isolate* isolate = promise->GetIsolate(); 6263 RETURN_TO_LOCAL_UNCHECKED(Then(context, handler), Promise);
6248 LOG_API(isolate, "Promise::Then");
6249 ENTER_V8(isolate);
6250 EXCEPTION_PREAMBLE(isolate);
6251 i::Handle<i::Object> argv[] = { Utils::OpenHandle(*handler) };
6252 i::Handle<i::Object> result;
6253 has_pending_exception = !i::Execution::Call(
6254 isolate,
6255 isolate->promise_then(),
6256 promise,
6257 arraysize(argv), argv,
6258 false).ToHandle(&result);
6259 EXCEPTION_BAILOUT_CHECK(isolate, Local<Promise>());
6260 return Local<Promise>::Cast(Utils::ToLocal(result));
6261 } 6264 }
6262 6265
6263 6266
6264 bool Promise::HasHandler() { 6267 bool Promise::HasHandler() {
6265 i::Handle<i::JSObject> promise = Utils::OpenHandle(this); 6268 i::Handle<i::JSObject> promise = Utils::OpenHandle(this);
6266 i::Isolate* isolate = promise->GetIsolate(); 6269 i::Isolate* isolate = promise->GetIsolate();
6267 LOG_API(isolate, "Promise::HasRejectHandler"); 6270 LOG_API(isolate, "Promise::HasRejectHandler");
6268 ENTER_V8(isolate); 6271 ENTER_V8(isolate);
6269 i::Handle<i::Symbol> key = isolate->factory()->promise_has_handler_symbol(); 6272 i::Handle<i::Symbol> key = isolate->factory()->promise_has_handler_symbol();
6270 return i::JSObject::GetDataProperty(promise, key)->IsTrue(); 6273 return i::JSObject::GetDataProperty(promise, key)->IsTrue();
(...skipping 1734 matching lines...) Expand 10 before | Expand all | Expand 10 after
8005 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 8008 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate());
8006 Address callback_address = 8009 Address callback_address =
8007 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 8010 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8008 VMState<EXTERNAL> state(isolate); 8011 VMState<EXTERNAL> state(isolate);
8009 ExternalCallbackScope call_scope(isolate, callback_address); 8012 ExternalCallbackScope call_scope(isolate, callback_address);
8010 callback(info); 8013 callback(info);
8011 } 8014 }
8012 8015
8013 8016
8014 } } // namespace v8::internal 8017 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « include/v8.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698