StringType v8StringToWebCoreString(v8::Handle<v8::String> v8String, ExternalMode external) { WebCoreStringResource* stringResource = WebCoreStringResource::toStringResource(v8String); if (stringResource) return StringTraits<StringType>::fromStringResource(stringResource); int length = v8String->Length(); if (!length) return String(""); StringType result(StringTraits<StringType>::fromV8String(v8String, length)); if (external == Externalize && v8String->CanMakeExternal()) { stringResource = new WebCoreStringResource(result); if (!v8String->MakeExternal(stringResource)) { // In case of a failure delete the external resource as it was not used. delete stringResource; } } return result; }
StringType v8StringToWebCoreString(v8::Handle<v8::String> v8String, ExternalMode external) { WebCoreStringResource* stringResource = WebCoreStringResource::toStringResource(v8String); if (stringResource) return StringTraits<StringType>::fromStringResource(stringResource); int length = v8String->Length(); if (!length) { // Avoid trying to morph empty strings, as they do not have enough room to contain the external reference. return StringImpl::empty(); } StringType result(StringTraits<StringType>::fromV8String(v8String, length)); if (external == Externalize && v8String->CanMakeExternal()) { stringResource = new WebCoreStringResource(result); if (!v8String->MakeExternal(stringResource)) { // In case of a failure delete the external resource as it was not used. delete stringResource; } } return result; }
StringType v8StringToWebCoreString(v8::Handle<v8::String> v8String, ExternalMode external) { { // This portion of this function is very hot in certain Dromeao benchmarks. v8::String::Encoding encoding; v8::String::ExternalStringResourceBase* resource = v8String->GetExternalStringResourceBase(&encoding); if (LIKELY(!!resource)) { WebCoreStringResourceBase* base; if (encoding == v8::String::ONE_BYTE_ENCODING) base = static_cast<WebCoreStringResource8*>(resource); else base = static_cast<WebCoreStringResource16*>(resource); return StringTraits<StringType>::fromStringResource(base); } } int length = v8String->Length(); if (UNLIKELY(!length)) return StringType(""); bool oneByte = v8String->ContainsOnlyOneByte(); StringType result(oneByte ? StringTraits<StringType>::template fromV8String<V8StringOneByteTrait>(v8String, length) : StringTraits<StringType>::template fromV8String<V8StringTwoBytesTrait>(v8String, length)); if (external != Externalize || !v8String->CanMakeExternal()) return result; if (result.is8Bit()) { WebCoreStringResource8* stringResource = new WebCoreStringResource8(result); if (UNLIKELY(!v8String->MakeExternal(stringResource))) delete stringResource; } else { WebCoreStringResource16* stringResource = new WebCoreStringResource16(result); if (UNLIKELY(!v8String->MakeExternal(stringResource))) delete stringResource; } return result; }