OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 v8::Local<v8::Array> results = environment->GetInternalField(V8PromiseCustom
::PromiseEveryEnvironmentResultsIndex).As<v8::Array>(); | 240 v8::Local<v8::Array> results = environment->GetInternalField(V8PromiseCustom
::PromiseEveryEnvironmentResultsIndex).As<v8::Array>(); |
241 | 241 |
242 results->Set(index->Value(), result); | 242 results->Set(index->Value(), result); |
243 | 243 |
244 v8::Local<v8::Integer> countdown = countdownWrapper->GetInternalField(V8Prom
iseCustom::PrimitiveWrapperPrimitiveIndex).As<v8::Integer>(); | 244 v8::Local<v8::Integer> countdown = countdownWrapper->GetInternalField(V8Prom
iseCustom::PrimitiveWrapperPrimitiveIndex).As<v8::Integer>(); |
245 ASSERT(countdown->Value() >= 1); | 245 ASSERT(countdown->Value() >= 1); |
246 if (countdown->Value() == 1) { | 246 if (countdown->Value() == 1) { |
247 V8PromiseCustom::resolveResolver(resolver, results, V8PromiseCustom::Syn
chronous, isolate); | 247 V8PromiseCustom::resolveResolver(resolver, results, V8PromiseCustom::Syn
chronous, isolate); |
248 return; | 248 return; |
249 } | 249 } |
250 countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiv
eIndex, v8::Integer::New(countdown->Value() - 1)); | 250 countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiv
eIndex, v8::Integer::New(countdown->Value() - 1, isolate)); |
251 } | 251 } |
252 | 252 |
253 void promiseSomeRejectCallback(const v8::FunctionCallbackInfo<v8::Value>& args) | 253 void promiseSomeRejectCallback(const v8::FunctionCallbackInfo<v8::Value>& args) |
254 { | 254 { |
255 v8::Isolate* isolate = args.GetIsolate(); | 255 v8::Isolate* isolate = args.GetIsolate(); |
256 ASSERT(!args.Data().IsEmpty()); | 256 ASSERT(!args.Data().IsEmpty()); |
257 v8::Local<v8::Object> environment = args.Data().As<v8::Object>(); | 257 v8::Local<v8::Object> environment = args.Data().As<v8::Object>(); |
258 v8::Local<v8::Value> result = v8::Undefined(isolate); | 258 v8::Local<v8::Value> result = v8::Undefined(isolate); |
259 if (args.Length() > 0) | 259 if (args.Length() > 0) |
260 result = args[0]; | 260 result = args[0]; |
261 | 261 |
262 v8::Local<v8::Object> resolver = environment->GetInternalField(V8PromiseCust
om::PromiseEveryEnvironmentPromiseResolverIndex).As<v8::Object>(); | 262 v8::Local<v8::Object> resolver = environment->GetInternalField(V8PromiseCust
om::PromiseEveryEnvironmentPromiseResolverIndex).As<v8::Object>(); |
263 v8::Local<v8::Object> countdownWrapper = environment->GetInternalField(V8Pro
miseCustom::PromiseEveryEnvironmentCountdownIndex).As<v8::Object>(); | 263 v8::Local<v8::Object> countdownWrapper = environment->GetInternalField(V8Pro
miseCustom::PromiseEveryEnvironmentCountdownIndex).As<v8::Object>(); |
264 v8::Local<v8::Integer> index = environment->GetInternalField(V8PromiseCustom
::PromiseEveryEnvironmentIndexIndex).As<v8::Integer>(); | 264 v8::Local<v8::Integer> index = environment->GetInternalField(V8PromiseCustom
::PromiseEveryEnvironmentIndexIndex).As<v8::Integer>(); |
265 v8::Local<v8::Array> results = environment->GetInternalField(V8PromiseCustom
::PromiseEveryEnvironmentResultsIndex).As<v8::Array>(); | 265 v8::Local<v8::Array> results = environment->GetInternalField(V8PromiseCustom
::PromiseEveryEnvironmentResultsIndex).As<v8::Array>(); |
266 | 266 |
267 results->Set(index->Value(), result); | 267 results->Set(index->Value(), result); |
268 | 268 |
269 v8::Local<v8::Integer> countdown = countdownWrapper->GetInternalField(V8Prom
iseCustom::PrimitiveWrapperPrimitiveIndex).As<v8::Integer>(); | 269 v8::Local<v8::Integer> countdown = countdownWrapper->GetInternalField(V8Prom
iseCustom::PrimitiveWrapperPrimitiveIndex).As<v8::Integer>(); |
270 ASSERT(countdown->Value() >= 1); | 270 ASSERT(countdown->Value() >= 1); |
271 if (countdown->Value() == 1) { | 271 if (countdown->Value() == 1) { |
272 V8PromiseCustom::rejectResolver(resolver, results, V8PromiseCustom::Sync
hronous, isolate); | 272 V8PromiseCustom::rejectResolver(resolver, results, V8PromiseCustom::Sync
hronous, isolate); |
273 return; | 273 return; |
274 } | 274 } |
275 countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiv
eIndex, v8::Integer::New(countdown->Value() - 1)); | 275 countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiv
eIndex, v8::Integer::New(countdown->Value() - 1, isolate)); |
276 } | 276 } |
277 | 277 |
278 v8::Local<v8::Object> promiseEveryEnvironment(v8::Handle<v8::Object> resolver, v
8::Handle<v8::Object> countdownWrapper, int index, v8::Handle<v8::Array> results
, v8::Isolate* isolate) | 278 v8::Local<v8::Object> promiseEveryEnvironment(v8::Handle<v8::Object> resolver, v
8::Handle<v8::Object> countdownWrapper, int index, v8::Handle<v8::Array> results
, v8::Isolate* isolate) |
279 { | 279 { |
280 v8::Local<v8::ObjectTemplate> objectTemplate = promiseEveryEnvironmentObject
Template(isolate); | 280 v8::Local<v8::ObjectTemplate> objectTemplate = promiseEveryEnvironmentObject
Template(isolate); |
281 v8::Local<v8::Object> environment = objectTemplate->NewInstance(); | 281 v8::Local<v8::Object> environment = objectTemplate->NewInstance(); |
282 | 282 |
283 environment->SetInternalField(V8PromiseCustom::PromiseEveryEnvironmentPromis
eResolverIndex, resolver); | 283 environment->SetInternalField(V8PromiseCustom::PromiseEveryEnvironmentPromis
eResolverIndex, resolver); |
284 environment->SetInternalField(V8PromiseCustom::PromiseEveryEnvironmentCountd
ownIndex, countdownWrapper); | 284 environment->SetInternalField(V8PromiseCustom::PromiseEveryEnvironmentCountd
ownIndex, countdownWrapper); |
285 environment->SetInternalField(V8PromiseCustom::PromiseEveryEnvironmentIndexI
ndex, v8::Integer::New(index)); | 285 environment->SetInternalField(V8PromiseCustom::PromiseEveryEnvironmentIndexI
ndex, v8::Integer::New(index, isolate)); |
286 environment->SetInternalField(V8PromiseCustom::PromiseEveryEnvironmentResult
sIndex, results); | 286 environment->SetInternalField(V8PromiseCustom::PromiseEveryEnvironmentResult
sIndex, results); |
287 return environment; | 287 return environment; |
288 } | 288 } |
289 | 289 |
290 } // namespace | 290 } // namespace |
291 | 291 |
292 void V8Promise::constructorCustom(const v8::FunctionCallbackInfo<v8::Value>& arg
s) | 292 void V8Promise::constructorCustom(const v8::FunctionCallbackInfo<v8::Value>& arg
s) |
293 { | 293 { |
294 v8SetReturnValue(args, v8::Local<v8::Value>()); | 294 v8SetReturnValue(args, v8::Local<v8::Value>()); |
295 v8::Isolate* isolate = args.GetIsolate(); | 295 v8::Isolate* isolate = args.GetIsolate(); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 V8PromiseCustom::createPromise(args.Holder(), &promise, &resolver, isolate); | 432 V8PromiseCustom::createPromise(args.Holder(), &promise, &resolver, isolate); |
433 | 433 |
434 if (!args.Length()) { | 434 if (!args.Length()) { |
435 V8PromiseCustom::resolveResolver(resolver, v8::Undefined(isolate), V8Pro
miseCustom::Asynchronous, isolate); | 435 V8PromiseCustom::resolveResolver(resolver, v8::Undefined(isolate), V8Pro
miseCustom::Asynchronous, isolate); |
436 v8SetReturnValue(args, promise); | 436 v8SetReturnValue(args, promise); |
437 return; | 437 return; |
438 } | 438 } |
439 | 439 |
440 v8::Local<v8::ObjectTemplate> objectTemplate = primitiveWrapperObjectTemplat
e(isolate); | 440 v8::Local<v8::ObjectTemplate> objectTemplate = primitiveWrapperObjectTemplat
e(isolate); |
441 v8::Local<v8::Object> countdownWrapper = objectTemplate->NewInstance(); | 441 v8::Local<v8::Object> countdownWrapper = objectTemplate->NewInstance(); |
442 countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiv
eIndex, v8::Integer::New(args.Length())); | 442 countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiv
eIndex, v8::Integer::New(args.Length(), isolate)); |
443 v8::Local<v8::Array> results = v8::Array::New(); | 443 v8::Local<v8::Array> results = v8::Array::New(); |
444 | 444 |
445 v8::Local<v8::Function> rejectCallback = createClosure(promiseRejectCallback
, resolver); | 445 v8::Local<v8::Function> rejectCallback = createClosure(promiseRejectCallback
, resolver); |
446 for (int i = 0; i < args.Length(); ++i) { | 446 for (int i = 0; i < args.Length(); ++i) { |
447 v8::Local<v8::Object> environment = promiseEveryEnvironment(resolver, co
untdownWrapper, i, results, isolate); | 447 v8::Local<v8::Object> environment = promiseEveryEnvironment(resolver, co
untdownWrapper, i, results, isolate); |
448 v8::Local<v8::Function> fulfillCallback = v8::FunctionTemplate::New(prom
iseEveryFulfillCallback, environment)->GetFunction(); | 448 v8::Local<v8::Function> fulfillCallback = v8::FunctionTemplate::New(prom
iseEveryFulfillCallback, environment)->GetFunction(); |
449 v8::Local<v8::Object> eachPromise, eachResolver; | 449 v8::Local<v8::Object> eachPromise, eachResolver; |
450 V8PromiseCustom::createPromise(args.Holder(), &eachPromise, &eachResolve
r, isolate); | 450 V8PromiseCustom::createPromise(args.Holder(), &eachPromise, &eachResolve
r, isolate); |
451 V8PromiseCustom::resolveResolver(eachResolver, args[i], V8PromiseCustom:
:Asynchronous, isolate); | 451 V8PromiseCustom::resolveResolver(eachResolver, args[i], V8PromiseCustom:
:Asynchronous, isolate); |
452 V8PromiseCustom::append(eachPromise, fulfillCallback, rejectCallback, is
olate); | 452 V8PromiseCustom::append(eachPromise, fulfillCallback, rejectCallback, is
olate); |
453 } | 453 } |
454 v8SetReturnValue(args, promise); | 454 v8SetReturnValue(args, promise); |
455 } | 455 } |
456 | 456 |
457 void V8Promise::someMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args
) | 457 void V8Promise::someMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args
) |
458 { | 458 { |
459 v8::Isolate* isolate = args.GetIsolate(); | 459 v8::Isolate* isolate = args.GetIsolate(); |
460 v8::Local<v8::Object> promise, resolver; | 460 v8::Local<v8::Object> promise, resolver; |
461 V8PromiseCustom::createPromise(args.Holder(), &promise, &resolver, isolate); | 461 V8PromiseCustom::createPromise(args.Holder(), &promise, &resolver, isolate); |
462 | 462 |
463 if (!args.Length()) { | 463 if (!args.Length()) { |
464 V8PromiseCustom::resolveResolver(resolver, v8::Undefined(isolate), V8Pro
miseCustom::Asynchronous, isolate); | 464 V8PromiseCustom::resolveResolver(resolver, v8::Undefined(isolate), V8Pro
miseCustom::Asynchronous, isolate); |
465 v8SetReturnValue(args, promise); | 465 v8SetReturnValue(args, promise); |
466 return; | 466 return; |
467 } | 467 } |
468 | 468 |
469 // Promise.some also uses PromiseEveryEnvironment. | 469 // Promise.some also uses PromiseEveryEnvironment. |
470 v8::Local<v8::ObjectTemplate> objectTemplate = primitiveWrapperObjectTemplat
e(isolate); | 470 v8::Local<v8::ObjectTemplate> objectTemplate = primitiveWrapperObjectTemplat
e(isolate); |
471 v8::Local<v8::Object> countdownWrapper = objectTemplate->NewInstance(); | 471 v8::Local<v8::Object> countdownWrapper = objectTemplate->NewInstance(); |
472 countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiv
eIndex, v8::Integer::New(args.Length())); | 472 countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiv
eIndex, v8::Integer::New(args.Length(), isolate)); |
473 v8::Local<v8::Array> results = v8::Array::New(); | 473 v8::Local<v8::Array> results = v8::Array::New(); |
474 | 474 |
475 v8::Local<v8::Function> fulfillCallback = createClosure(promiseResolveCallba
ck, resolver); | 475 v8::Local<v8::Function> fulfillCallback = createClosure(promiseResolveCallba
ck, resolver); |
476 for (int i = 0; i < args.Length(); ++i) { | 476 for (int i = 0; i < args.Length(); ++i) { |
477 v8::Local<v8::Object> environment = promiseEveryEnvironment(resolver, co
untdownWrapper, i, results, isolate); | 477 v8::Local<v8::Object> environment = promiseEveryEnvironment(resolver, co
untdownWrapper, i, results, isolate); |
478 v8::Local<v8::Object> eachPromise, eachResolver; | 478 v8::Local<v8::Object> eachPromise, eachResolver; |
479 v8::Local<v8::Function> rejectCallback = v8::FunctionTemplate::New(promi
seSomeRejectCallback, environment)->GetFunction(); | 479 v8::Local<v8::Function> rejectCallback = v8::FunctionTemplate::New(promi
seSomeRejectCallback, environment)->GetFunction(); |
480 V8PromiseCustom::createPromise(args.Holder(), &eachPromise, &eachResolve
r, isolate); | 480 V8PromiseCustom::createPromise(args.Holder(), &eachPromise, &eachResolve
r, isolate); |
481 V8PromiseCustom::resolveResolver(eachResolver, args[i], V8PromiseCustom:
:Asynchronous, isolate); | 481 V8PromiseCustom::resolveResolver(eachResolver, args[i], V8PromiseCustom:
:Asynchronous, isolate); |
482 V8PromiseCustom::append(eachPromise, fulfillCallback, rejectCallback, is
olate); | 482 V8PromiseCustom::append(eachPromise, fulfillCallback, rejectCallback, is
olate); |
483 } | 483 } |
484 v8SetReturnValue(args, promise); | 484 v8SetReturnValue(args, promise); |
485 } | 485 } |
486 | 486 |
487 // | 487 // |
488 // -- V8PromiseCustom -- | 488 // -- V8PromiseCustom -- |
489 void V8PromiseCustom::createPromise(v8::Handle<v8::Object> creationContext, v8::
Local<v8::Object>* promise, v8::Local<v8::Object>* resolver, v8::Isolate* isolat
e) | 489 void V8PromiseCustom::createPromise(v8::Handle<v8::Object> creationContext, v8::
Local<v8::Object>* promise, v8::Local<v8::Object>* resolver, v8::Isolate* isolat
e) |
490 { | 490 { |
491 v8::Local<v8::ObjectTemplate> internalTemplate = internalObjectTemplate(isol
ate); | 491 v8::Local<v8::ObjectTemplate> internalTemplate = internalObjectTemplate(isol
ate); |
492 v8::Local<v8::Object> internal = internalTemplate->NewInstance(); | 492 v8::Local<v8::Object> internal = internalTemplate->NewInstance(); |
493 *promise = V8DOMWrapper::createWrapper(creationContext, &V8Promise::info, 0,
isolate); | 493 *promise = V8DOMWrapper::createWrapper(creationContext, &V8Promise::info, 0,
isolate); |
494 *resolver = V8DOMWrapper::createWrapper(creationContext, &V8PromiseResolver:
:info, 0, isolate); | 494 *resolver = V8DOMWrapper::createWrapper(creationContext, &V8PromiseResolver:
:info, 0, isolate); |
495 | 495 |
496 clearInternal(internal, V8PromiseCustom::Pending, v8::Undefined(isolate)); | 496 clearInternal(internal, V8PromiseCustom::Pending, v8::Undefined(isolate), is
olate); |
497 | 497 |
498 (*promise)->SetInternalField(v8DOMWrapperObjectIndex, internal); | 498 (*promise)->SetInternalField(v8DOMWrapperObjectIndex, internal); |
499 (*resolver)->SetInternalField(v8DOMWrapperObjectIndex, internal); | 499 (*resolver)->SetInternalField(v8DOMWrapperObjectIndex, internal); |
500 } | 500 } |
501 | 501 |
502 void V8PromiseCustom::fulfillResolver(v8::Handle<v8::Object> resolver, v8::Handl
e<v8::Value> result, SynchronousMode mode, v8::Isolate* isolate) | 502 void V8PromiseCustom::fulfillResolver(v8::Handle<v8::Object> resolver, v8::Handl
e<v8::Value> result, SynchronousMode mode, v8::Isolate* isolate) |
503 { | 503 { |
504 if (isInternalDetached(resolver)) | 504 if (isInternalDetached(resolver)) |
505 return; | 505 return; |
506 v8::Local<v8::Object> internal = getInternal(resolver); | 506 v8::Local<v8::Object> internal = getInternal(resolver); |
507 ASSERT(getState(internal) == Pending || getState(internal) == PendingWithRes
olvedFlagSet); | 507 ASSERT(getState(internal) == Pending || getState(internal) == PendingWithRes
olvedFlagSet); |
508 v8::Local<v8::Array> callbacks = internal->GetInternalField(V8PromiseCustom:
:InternalFulfillCallbackIndex).As<v8::Array>(); | 508 v8::Local<v8::Array> callbacks = internal->GetInternalField(V8PromiseCustom:
:InternalFulfillCallbackIndex).As<v8::Array>(); |
509 clearInternal(internal, Fulfilled, result); | 509 clearInternal(internal, Fulfilled, result, isolate); |
510 detachInternal(resolver, isolate); | 510 detachInternal(resolver, isolate); |
511 | 511 |
512 callCallbacks(callbacks, result, mode, isolate); | 512 callCallbacks(callbacks, result, mode, isolate); |
513 } | 513 } |
514 | 514 |
515 void V8PromiseCustom::resolveResolver(v8::Handle<v8::Object> resolver, v8::Handl
e<v8::Value> result, SynchronousMode mode, v8::Isolate* isolate) | 515 void V8PromiseCustom::resolveResolver(v8::Handle<v8::Object> resolver, v8::Handl
e<v8::Value> result, SynchronousMode mode, v8::Isolate* isolate) |
516 { | 516 { |
517 ASSERT(!result.IsEmpty()); | 517 ASSERT(!result.IsEmpty()); |
518 v8::Local<v8::Value> then; | 518 v8::Local<v8::Value> then; |
519 if (result->IsObject()) { | 519 if (result->IsObject()) { |
(...skipping 21 matching lines...) Expand all Loading... |
541 fulfillResolver(resolver, result, mode, isolate); | 541 fulfillResolver(resolver, result, mode, isolate); |
542 } | 542 } |
543 | 543 |
544 void V8PromiseCustom::rejectResolver(v8::Handle<v8::Object> resolver, v8::Handle
<v8::Value> result, SynchronousMode mode, v8::Isolate* isolate) | 544 void V8PromiseCustom::rejectResolver(v8::Handle<v8::Object> resolver, v8::Handle
<v8::Value> result, SynchronousMode mode, v8::Isolate* isolate) |
545 { | 545 { |
546 if (isInternalDetached(resolver)) | 546 if (isInternalDetached(resolver)) |
547 return; | 547 return; |
548 v8::Local<v8::Object> internal = getInternal(resolver); | 548 v8::Local<v8::Object> internal = getInternal(resolver); |
549 ASSERT(getState(internal) == Pending || getState(internal) == PendingWithRes
olvedFlagSet); | 549 ASSERT(getState(internal) == Pending || getState(internal) == PendingWithRes
olvedFlagSet); |
550 v8::Local<v8::Array> callbacks = internal->GetInternalField(V8PromiseCustom:
:InternalRejectCallbackIndex).As<v8::Array>(); | 550 v8::Local<v8::Array> callbacks = internal->GetInternalField(V8PromiseCustom:
:InternalRejectCallbackIndex).As<v8::Array>(); |
551 clearInternal(internal, Rejected, result); | 551 clearInternal(internal, Rejected, result, isolate); |
552 detachInternal(resolver, isolate); | 552 detachInternal(resolver, isolate); |
553 | 553 |
554 callCallbacks(callbacks, result, mode, isolate); | 554 callCallbacks(callbacks, result, mode, isolate); |
555 } | 555 } |
556 | 556 |
557 void V8PromiseCustom::append(v8::Handle<v8::Object> promise, v8::Handle<v8::Func
tion> fulfillCallback, v8::Handle<v8::Function> rejectCallback, v8::Isolate* iso
late) | 557 void V8PromiseCustom::append(v8::Handle<v8::Object> promise, v8::Handle<v8::Func
tion> fulfillCallback, v8::Handle<v8::Function> rejectCallback, v8::Isolate* iso
late) |
558 { | 558 { |
559 // fulfillCallback and rejectCallback can be empty. | 559 // fulfillCallback and rejectCallback can be empty. |
560 v8::Local<v8::Object> internal = getInternal(promise); | 560 v8::Local<v8::Object> internal = getInternal(promise); |
561 | 561 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 v8::Local<v8::Value> value = resolver->GetInternalField(v8DOMWrapperObjectIn
dex); | 600 v8::Local<v8::Value> value = resolver->GetInternalField(v8DOMWrapperObjectIn
dex); |
601 ASSERT(!value.IsEmpty()); | 601 ASSERT(!value.IsEmpty()); |
602 return value->IsUndefined(); | 602 return value->IsUndefined(); |
603 } | 603 } |
604 | 604 |
605 void V8PromiseCustom::detachInternal(v8::Handle<v8::Object> resolver, v8::Isolat
e* isolate) | 605 void V8PromiseCustom::detachInternal(v8::Handle<v8::Object> resolver, v8::Isolat
e* isolate) |
606 { | 606 { |
607 resolver->SetInternalField(v8DOMWrapperObjectIndex, v8::Undefined(isolate)); | 607 resolver->SetInternalField(v8DOMWrapperObjectIndex, v8::Undefined(isolate)); |
608 } | 608 } |
609 | 609 |
610 void V8PromiseCustom::clearInternal(v8::Handle<v8::Object> internal, PromiseStat
e state, v8::Handle<v8::Value> value) | 610 void V8PromiseCustom::clearInternal(v8::Handle<v8::Object> internal, PromiseStat
e state, v8::Handle<v8::Value> value, v8::Isolate* isolate) |
611 { | 611 { |
612 setState(internal, state); | 612 setState(internal, state, isolate); |
613 internal->SetInternalField(V8PromiseCustom::InternalResultIndex, value); | 613 internal->SetInternalField(V8PromiseCustom::InternalResultIndex, value); |
614 internal->SetInternalField(V8PromiseCustom::InternalFulfillCallbackIndex, v8
::Array::New()); | 614 internal->SetInternalField(V8PromiseCustom::InternalFulfillCallbackIndex, v8
::Array::New()); |
615 internal->SetInternalField(V8PromiseCustom::InternalRejectCallbackIndex, v8:
:Array::New()); | 615 internal->SetInternalField(V8PromiseCustom::InternalRejectCallbackIndex, v8:
:Array::New()); |
616 } | 616 } |
617 | 617 |
618 V8PromiseCustom::PromiseState V8PromiseCustom::getState(v8::Handle<v8::Object> i
nternal) | 618 V8PromiseCustom::PromiseState V8PromiseCustom::getState(v8::Handle<v8::Object> i
nternal) |
619 { | 619 { |
620 v8::Handle<v8::Value> value = internal->GetInternalField(V8PromiseCustom::In
ternalStateIndex); | 620 v8::Handle<v8::Value> value = internal->GetInternalField(V8PromiseCustom::In
ternalStateIndex); |
621 bool ok = false; | 621 bool ok = false; |
622 uint32_t number = toInt32(value, ok); | 622 uint32_t number = toInt32(value, ok); |
623 ASSERT(ok && (number == Pending || number == Fulfilled || number == Rejected
|| number == PendingWithResolvedFlagSet)); | 623 ASSERT(ok && (number == Pending || number == Fulfilled || number == Rejected
|| number == PendingWithResolvedFlagSet)); |
624 return static_cast<PromiseState>(number); | 624 return static_cast<PromiseState>(number); |
625 } | 625 } |
626 | 626 |
627 void V8PromiseCustom::setState(v8::Handle<v8::Object> internal, PromiseState sta
te) | 627 void V8PromiseCustom::setState(v8::Handle<v8::Object> internal, PromiseState sta
te, v8::Isolate* isolate) |
628 { | 628 { |
629 ASSERT(state == Pending || state == Fulfilled || state == Rejected || state
== PendingWithResolvedFlagSet); | 629 ASSERT(state == Pending || state == Fulfilled || state == Rejected || state
== PendingWithResolvedFlagSet); |
630 internal->SetInternalField(V8PromiseCustom::InternalStateIndex, v8::Integer:
:New(state)); | 630 internal->SetInternalField(V8PromiseCustom::InternalStateIndex, v8::Integer:
:New(state, isolate)); |
631 } | 631 } |
632 | 632 |
633 void V8PromiseCustom::call(v8::Handle<v8::Function> function, v8::Handle<v8::Obj
ect> receiver, v8::Handle<v8::Value> result, SynchronousMode mode, v8::Isolate*
isolate) | 633 void V8PromiseCustom::call(v8::Handle<v8::Function> function, v8::Handle<v8::Obj
ect> receiver, v8::Handle<v8::Value> result, SynchronousMode mode, v8::Isolate*
isolate) |
634 { | 634 { |
635 if (mode == Synchronous) { | 635 if (mode == Synchronous) { |
636 v8::Context::Scope scope(isolate->GetCurrentContext()); | 636 v8::Context::Scope scope(isolate->GetCurrentContext()); |
637 // If an exception is thrown, catch it and do nothing. | 637 // If an exception is thrown, catch it and do nothing. |
638 v8::TryCatch trycatch; | 638 v8::TryCatch trycatch; |
639 v8::Handle<v8::Value> args[] = { result }; | 639 v8::Handle<v8::Value> args[] = { result }; |
640 V8ScriptRunner::callFunction(function, getScriptExecutionContext(), rece
iver, WTF_ARRAY_LENGTH(args), args, isolate); | 640 V8ScriptRunner::callFunction(function, getScriptExecutionContext(), rece
iver, WTF_ARRAY_LENGTH(args), args, isolate); |
641 } else { | 641 } else { |
642 ASSERT(mode == Asynchronous); | 642 ASSERT(mode == Asynchronous); |
643 postTask(function, receiver, result, isolate); | 643 postTask(function, receiver, result, isolate); |
644 } | 644 } |
645 } | 645 } |
646 | 646 |
647 } // namespace WebCore | 647 } // namespace WebCore |
OLD | NEW |