in ClearScriptV8/V8ContextImpl.cpp [2697:2885]
v8::Local<v8::Value> V8ContextImpl::ImportValue(const V8Value& value)
{
FROM_MAYBE_TRY
if (value.IsNonexistent())
{
return v8::Local<v8::Value>();
}
if (value.IsUndefined())
{
return GetUndefined();
}
if (value.IsNull())
{
return GetNull();
}
{
bool result;
if (value.AsBoolean(result))
{
return result ? GetTrue() : GetFalse();
}
}
{
double result;
if (value.AsNumber(result))
{
return CreateNumber(result);
}
}
{
int32_t result;
if (value.AsInt32(result))
{
return CreateInteger(result);
}
}
{
uint32_t result;
if (value.AsUInt32(result))
{
return CreateInteger(result);
}
}
{
const StdString* pString;
if (value.AsString(pString))
{
return FROM_MAYBE(CreateString(*pString));
}
}
{
HostObjectHolder* pHolder;
if (value.AsHostObject(pHolder))
{
auto pvV8Object = HostObjectUtil::GetInstance().GetCachedV8Object(m_pvV8ObjectCache, pHolder->GetObject());
if (pvV8Object != nullptr)
{
return CreateLocal(::HandleFromPtr<v8::Object>(pvV8Object));
}
v8::Local<v8::Object> hObject;
auto invocability = HostObjectUtil::GetInstance().GetInvocability(pHolder->GetObject());
if (invocability == IHostObjectUtil::Invocability::None)
{
BEGIN_PULSE_VALUE_SCOPE(&m_AllowHostObjectConstructorCall, true)
hObject = FROM_MAYBE(m_hHostObjectTemplate->InstanceTemplate()->NewInstance(m_hContext));
END_PULSE_VALUE_SCOPE
}
else if (invocability == IHostObjectUtil::Invocability::Delegate)
{
BEGIN_PULSE_VALUE_SCOPE(&m_AllowHostObjectConstructorCall, true)
hObject = FROM_MAYBE(m_hHostDelegateTemplate->InstanceTemplate()->NewInstance(m_hContext));
END_PULSE_VALUE_SCOPE
}
else
{
BEGIN_PULSE_VALUE_SCOPE(&m_AllowHostObjectConstructorCall, true)
hObject = FROM_MAYBE(m_hHostInvocableTemplate->InstanceTemplate()->NewInstance(m_hContext));
END_PULSE_VALUE_SCOPE
}
ASSERT_EVAL(SetHostObjectHolder(hObject, pHolder = pHolder->Clone()));
ASSERT_EVAL(FROM_MAYBE(hObject->SetPrivate(m_hContext, m_hAccessTokenKey, m_hAccessToken)));
pvV8Object = ::PtrFromHandle(MakeWeak(CreatePersistent(hObject), pHolder, m_pvV8ObjectCache, DisposeWeakHandle));
HostObjectUtil::GetInstance().CacheV8Object(m_pvV8ObjectCache, pHolder->GetObject(), pvV8Object);
return hObject;
}
}
{
V8ObjectHolder* pHolder;
V8Value::Subtype subtype;
V8Value::Flags flags;
if (value.AsV8Object(pHolder, subtype, flags))
{
if (pHolder->IsSameIsolate(m_spIsolateImpl))
{
return CreateLocal(::HandleFromPtr<v8::Object>(pHolder->GetObject()));
}
if (HasFlag(flags, V8Value::Flags::Shared))
{
const auto& spSharedObjectInfo = pHolder->GetSharedObjectInfo();
if (!spSharedObjectInfo.IsEmpty())
{
switch (subtype)
{
case V8Value::Subtype::ArrayBuffer:
return CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore());
case V8Value::Subtype::DataView:
return v8::DataView::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetSize());
case V8Value::Subtype::Uint8Array:
return v8::Uint8Array::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
case V8Value::Subtype::Uint8ClampedArray:
return v8::Uint8ClampedArray::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
case V8Value::Subtype::Int8Array:
return v8::Int8Array::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
case V8Value::Subtype::Uint16Array:
return v8::Uint16Array::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
case V8Value::Subtype::Int16Array:
return v8::Int16Array::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
case V8Value::Subtype::Uint32Array:
return v8::Uint32Array::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
case V8Value::Subtype::Int32Array:
return v8::Int32Array::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
case V8Value::Subtype::BigUint64Array:
return v8::BigUint64Array::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
case V8Value::Subtype::BigInt64Array:
return v8::BigInt64Array::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
case V8Value::Subtype::Float32Array:
return v8::Float32Array::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
case V8Value::Subtype::Float64Array:
return v8::Float64Array::New(CreateSharedArrayBuffer(spSharedObjectInfo->GetBackingStore()), spSharedObjectInfo->GetOffset(), spSharedObjectInfo->GetLength());
default:
break;
}
}
}
return GetUndefined();
}
}
{
double result;
if (value.AsDateTime(result))
{
return FROM_MAYBE(v8::Date::New(m_hContext, result));
}
}
{
const V8BigInt* pBigInt;
if (value.AsBigInt(pBigInt))
{
const auto& words = pBigInt->GetWords();
const auto wordCount = static_cast<int>(std::min(words.size(), static_cast<size_t>(INT_MAX)));
return FROM_MAYBE(v8::BigInt::NewFromWords(m_hContext, pBigInt->GetSignBit(), wordCount, words.data()));
}
}
FROM_MAYBE_CATCH_CONSUME
return GetUndefined();
}