// Add a tuple (|derivedPromise|, |onFulfilled|, |onRejected|) to // |internal|'s derived array. // |internal| must be a Promise internal object. // |derivedPromise| must be a Promise instance. // |onFulfilled| and |onRejected| can be an empty value respectively. void addToDerived(v8::Handle<v8::Object> internal, v8::Handle<v8::Object> derivedPromise, v8::Handle<v8::Function> onFulfilled, v8::Handle<v8::Function> onRejected, v8::Isolate* isolate) { v8::Local<v8::Array> fulfillCallbacks = internal->GetInternalField(V8PromiseCustom::InternalFulfillCallbackIndex).As<v8::Array>(); v8::Local<v8::Array> rejectCallbacks = internal->GetInternalField(V8PromiseCustom::InternalRejectCallbackIndex).As<v8::Array>(); v8::Local<v8::Array> derivedPromises = internal->GetInternalField(V8PromiseCustom::InternalDerivedPromiseIndex).As<v8::Array>(); if (onFulfilled.IsEmpty()) { fulfillCallbacks->Set(fulfillCallbacks->Length(), v8::Undefined(isolate)); } else { fulfillCallbacks->Set(fulfillCallbacks->Length(), onFulfilled); } if (onRejected.IsEmpty()) { rejectCallbacks->Set(rejectCallbacks->Length(), v8::Undefined(isolate)); } else { rejectCallbacks->Set(rejectCallbacks->Length(), onRejected); } ASSERT(!derivedPromise.IsEmpty()); derivedPromises->Set(derivedPromises->Length(), derivedPromise); // Since they are treated as a tuple, // we need to guaranteed that the length of these arrays are same. ASSERT(fulfillCallbacks->Length() == rejectCallbacks->Length() && rejectCallbacks->Length() == derivedPromises->Length()); }
void V8DOMWrapper::setHiddenReference(v8::Handle<v8::Object> parent, v8::Handle<v8::Value> child) { v8::Local<v8::Value> hiddenReferenceObject = parent->GetInternalField(v8DOMHiddenReferenceArrayIndex); if (hiddenReferenceObject->IsNull() || hiddenReferenceObject->IsUndefined()) { hiddenReferenceObject = v8::Array::New(); parent->SetInternalField(v8DOMHiddenReferenceArrayIndex, hiddenReferenceObject); } v8::Local<v8::Array> hiddenReferenceArray = v8::Local<v8::Array>::Cast(hiddenReferenceObject); hiddenReferenceArray->Set(v8::Integer::New(hiddenReferenceArray->Length()), child); }
// Use an array to hold dependents. It works like a ref-counted scheme. // A value can be added more than once to the DOM object. void createHiddenDependency(v8::Handle<v8::Object> object, v8::Local<v8::Value> value, int cacheIndex) { v8::Local<v8::Value> cache = object->GetInternalField(cacheIndex); if (cache->IsNull() || cache->IsUndefined()) { cache = v8::Array::New(); object->SetInternalField(cacheIndex, cache); } v8::Local<v8::Array> cacheArray = v8::Local<v8::Array>::Cast(cache); cacheArray->Set(v8::Integer::New(cacheArray->Length()), value); }
void addHiddenValueToArray(v8::Handle<v8::Object> object, v8::Local<v8::Value> value, int arrayIndex, v8::Isolate* isolate) { v8::Local<v8::Value> arrayValue = object->GetInternalField(arrayIndex); if (arrayValue->IsNull() || arrayValue->IsUndefined()) { arrayValue = v8::Array::New(isolate); object->SetInternalField(arrayIndex, arrayValue); } v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(arrayValue); array->Set(v8::Integer::New(isolate, array->Length()), value); }
void JNIV8Object::linkJSObject(v8::Handle<v8::Object> jsObject) { Isolate* isolate = _bgjsEngine->getIsolate(); // store reference to native object in JS object if(_v8ClassInfo->container->type != JNIV8ObjectType::kWrapper) { JNI_ASSERT(jsObject->GetInternalField(0)->IsUndefined(), "failed to link js object"); jsObject->SetInternalField(0, External::New(isolate, (void *) this)); } // store reference in persistent _jsObject.Reset(isolate, jsObject); }
void removeHiddenDependency(v8::Handle<v8::Object> object, v8::Local<v8::Value> value, int cacheIndex) { v8::Local<v8::Value> cache = object->GetInternalField(cacheIndex); if (!cache->IsArray()) return; v8::Local<v8::Array> cacheArray = v8::Local<v8::Array>::Cast(cache); for (int i = cacheArray->Length() - 1; i >= 0; --i) { v8::Local<v8::Value> cached = cacheArray->Get(v8::Integer::New(i)); if (cached->StrictEquals(value)) { cacheArray->Delete(i); return; } } }
void removeHiddenValueFromArray(v8::Handle<v8::Object> object, v8::Local<v8::Value> value, int arrayIndex, v8::Isolate* isolate) { v8::Local<v8::Value> arrayValue = object->GetInternalField(arrayIndex); if (!arrayValue->IsArray()) return; v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(arrayValue); for (int i = array->Length() - 1; i >= 0; --i) { v8::Local<v8::Value> item = array->Get(v8::Integer::New(isolate, i)); if (item->StrictEquals(value)) { array->Delete(i); return; } } }
V8ClassIndex::V8WrapperType V8DOMWrapper::domWrapperType(v8::Handle<v8::Object> object) { ASSERT(V8DOMWrapper::maybeDOMWrapper(object)); v8::Handle<v8::Value> type = object->GetInternalField(v8DOMWrapperTypeIndex); return V8ClassIndex::FromInt(type->Int32Value()); }