| 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 |