5 #include "src/extensions/externalize-string-extension.h" 7 #include "src/api-inl.h" 8 #include "src/handles.h" 9 #include "src/isolate.h" 10 #include "src/objects-inl.h" 15 template <
typename Char,
typename Base>
25 const Char* data()
const override {
return data_; }
27 size_t length()
const override {
return length_; }
40 const char*
const ExternalizeStringExtension::kSource =
41 "native function externalizeString();" 42 "native function isOneByteString();" 43 "function x() { return 1; }";
46 ExternalizeStringExtension::GetNativeFunctionTemplate(
50 ExternalizeStringExtension::Externalize);
55 ExternalizeStringExtension::IsOneByte);
60 void ExternalizeStringExtension::Externalize(
62 if (args.Length() < 1 || !args[0]->IsString()) {
63 args.GetIsolate()->ThrowException(
66 "First parameter to externalizeString() must be a string.",
70 bool force_two_byte =
false;
71 if (args.Length() >= 2) {
72 if (args[1]->IsBoolean()) {
73 force_two_byte = args[1]->BooleanValue(args.GetIsolate());
75 args.GetIsolate()->ThrowException(
78 "Second parameter to externalizeString() must be a boolean.",
84 Handle<String>
string = Utils::OpenHandle(*args[0].As<v8::String>());
85 if (!string->SupportsExternalization()) {
86 args.GetIsolate()->ThrowException(
88 "string does not support externalization.",
93 if (string->IsOneByteRepresentation() && !force_two_byte) {
94 uint8_t* data =
new uint8_t[
string->length()];
95 String::WriteToFlat(*
string, data, 0, string->length());
96 SimpleOneByteStringResource* resource =
new SimpleOneByteStringResource(
97 reinterpret_cast<char*>(data), string->length());
98 result = Utils::ToLocal(
string)->MakeExternal(resource);
99 if (!result)
delete resource;
101 uc16* data =
new uc16[
string->length()];
102 String::WriteToFlat(*
string, data, 0, string->length());
103 SimpleTwoByteStringResource* resource =
new SimpleTwoByteStringResource(
104 data, string->length());
105 result = Utils::ToLocal(
string)->MakeExternal(resource);
106 if (!result)
delete resource;
109 args.GetIsolate()->ThrowException(
111 "externalizeString() failed.",
118 void ExternalizeStringExtension::IsOneByte(
120 if (args.Length() != 1 || !args[0]->IsString()) {
121 args.GetIsolate()->ThrowException(
124 "isOneByteString() requires a single string argument.",
129 Utils::OpenHandle(*args[0].As<v8::String>())->IsOneByteRepresentation();
130 args.GetReturnValue().Set(is_one_byte);
static V8_WARN_UNUSED_RESULT MaybeLocal< String > NewFromUtf8(Isolate *isolate, const char *data, v8::NewStringType type, int length=-1)
static Local< FunctionTemplate > New(Isolate *isolate, FunctionCallback callback=nullptr, Local< Value > data=Local< Value >(), Local< Signature > signature=Local< Signature >(), int length=0, ConstructorBehavior behavior=ConstructorBehavior::kAllow, SideEffectType side_effect_type=SideEffectType::kHasSideEffect)