Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index 7eeb57d75699ecfaae6bfa82a3ebd73a62593d1e..1b02d7ea5d85a858abcf9ce0a7143734b91a2205 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -5666,9 +5666,9 @@ inline int StringLength(const uint16_t* string) { |
MUST_USE_RESULT |
inline i::MaybeHandle<i::String> NewString(i::Factory* factory, |
- String::NewStringType type, |
+ v8::NewStringType type, |
i::Vector<const char> string) { |
- if (type == String::kInternalizedString) { |
+ if (type == v8::NewStringType::kInternalized) { |
return factory->InternalizeUtf8String(string); |
} |
return factory->NewStringFromUtf8(string); |
@@ -5677,9 +5677,9 @@ inline i::MaybeHandle<i::String> NewString(i::Factory* factory, |
MUST_USE_RESULT |
inline i::MaybeHandle<i::String> NewString(i::Factory* factory, |
- String::NewStringType type, |
+ v8::NewStringType type, |
i::Vector<const uint8_t> string) { |
- if (type == String::kInternalizedString) { |
+ if (type == v8::NewStringType::kInternalized) { |
return factory->InternalizeOneByteString(string); |
} |
return factory->NewStringFromOneByte(string); |
@@ -5688,35 +5688,32 @@ inline i::MaybeHandle<i::String> NewString(i::Factory* factory, |
MUST_USE_RESULT |
inline i::MaybeHandle<i::String> NewString(i::Factory* factory, |
- String::NewStringType type, |
+ v8::NewStringType type, |
i::Vector<const uint16_t> string) { |
- if (type == String::kInternalizedString) { |
+ if (type == v8::NewStringType::kInternalized) { |
return factory->InternalizeTwoByteString(string); |
} |
return factory->NewStringFromTwoByte(string); |
} |
-template<typename Char> |
-inline Local<String> NewString(Isolate* v8_isolate, |
- const char* location, |
- const char* env, |
- const Char* data, |
- String::NewStringType type, |
- int length) { |
+STATIC_ASSERT(v8::String::kMaxLength == i::String::kMaxLength); |
+ |
+ |
+template <typename Char> |
+inline MaybeLocal<String> NewString(Isolate* v8_isolate, const char* location, |
+ const char* env, const Char* data, |
+ v8::NewStringType type, int length) { |
i::Isolate* isolate = reinterpret_cast<internal::Isolate*>(v8_isolate); |
- LOG_API(isolate, env); |
- if (length == 0) { |
- return String::Empty(v8_isolate); |
- } |
+ if (length == 0) return String::Empty(v8_isolate); |
+ // TODO(dcarney): throw a context free exception. |
+ if (length > i::String::kMaxLength) return MaybeLocal<String>(); |
ENTER_V8(isolate); |
- if (length == -1) length = StringLength(data); |
- EXCEPTION_PREAMBLE(isolate); |
- i::Handle<i::String> result; |
- has_pending_exception = |
- !NewString(isolate->factory(), type, i::Vector<const Char>(data, length)) |
- .ToHandle(&result); |
- EXCEPTION_BAILOUT_CHECK(isolate, Local<String>()); |
+ LOG_API(isolate, env); |
+ if (length < 0) length = StringLength(data); |
+ i::Handle<i::String> result = |
+ NewString(isolate->factory(), type, i::Vector<const Char>(data, length)) |
+ .ToHandleChecked(); |
return Utils::ToLocal(result); |
} |
@@ -5727,12 +5724,17 @@ Local<String> String::NewFromUtf8(Isolate* isolate, |
const char* data, |
NewStringType type, |
int length) { |
- return NewString(isolate, |
- "v8::String::NewFromUtf8()", |
- "String::NewFromUtf8", |
- data, |
- type, |
- length); |
+ RETURN_TO_LOCAL_UNCHECKED( |
+ NewString(isolate, "v8::String::NewFromUtf8()", "String::NewFromUtf8", |
+ data, static_cast<v8::NewStringType>(type), length), |
+ String); |
+} |
+ |
+ |
+MaybeLocal<String> String::NewFromUtf8(Isolate* isolate, const char* data, |
+ v8::NewStringType type, int length) { |
+ return NewString(isolate, "v8::String::NewFromUtf8()", "String::NewFromUtf8", |
+ data, type, length); |
} |
@@ -5740,12 +5742,18 @@ Local<String> String::NewFromOneByte(Isolate* isolate, |
const uint8_t* data, |
NewStringType type, |
int length) { |
- return NewString(isolate, |
- "v8::String::NewFromOneByte()", |
- "String::NewFromOneByte", |
- data, |
- type, |
- length); |
+ RETURN_TO_LOCAL_UNCHECKED( |
+ NewString(isolate, "v8::String::NewFromOneByte()", |
+ "String::NewFromOneByte", data, |
+ static_cast<v8::NewStringType>(type), length), |
+ String); |
+} |
+ |
+ |
+MaybeLocal<String> String::NewFromOneByte(Isolate* isolate, const uint8_t* data, |
+ v8::NewStringType type, int length) { |
+ return NewString(isolate, "v8::String::NewFromOneByte()", |
+ "String::NewFromOneByte", data, type, length); |
} |
@@ -5753,20 +5761,27 @@ Local<String> String::NewFromTwoByte(Isolate* isolate, |
const uint16_t* data, |
NewStringType type, |
int length) { |
- return NewString(isolate, |
- "v8::String::NewFromTwoByte()", |
- "String::NewFromTwoByte", |
- data, |
- type, |
- length); |
+ RETURN_TO_LOCAL_UNCHECKED( |
+ NewString(isolate, "v8::String::NewFromTwoByte()", |
+ "String::NewFromTwoByte", data, |
+ static_cast<v8::NewStringType>(type), length), |
+ String); |
+} |
+ |
+ |
+MaybeLocal<String> String::NewFromTwoByte(Isolate* isolate, |
+ const uint16_t* data, |
+ v8::NewStringType type, int length) { |
+ return NewString(isolate, "v8::String::NewFromTwoByte()", |
+ "String::NewFromTwoByte", data, type, length); |
} |
Local<String> v8::String::Concat(Handle<String> left, Handle<String> right) { |
i::Handle<i::String> left_string = Utils::OpenHandle(*left); |
i::Isolate* isolate = left_string->GetIsolate(); |
- LOG_API(isolate, "String::New(char)"); |
ENTER_V8(isolate); |
+ LOG_API(isolate, "v8::String::Concat"); |
i::Handle<i::String> right_string = Utils::OpenHandle(*right); |
// If we are steering towards a range error, do not wait for the error to be |
// thrown, and return the null handle instead. |
@@ -5779,35 +5794,54 @@ Local<String> v8::String::Concat(Handle<String> left, Handle<String> right) { |
} |
-static i::MaybeHandle<i::String> NewExternalStringHandle( |
- i::Isolate* isolate, v8::String::ExternalStringResource* resource) { |
- return isolate->factory()->NewExternalStringFromTwoByte(resource); |
+MaybeLocal<String> v8::String::NewExternalTwoByte( |
+ Isolate* isolate, v8::String::ExternalStringResource* resource) { |
+ CHECK(resource && resource->data()); |
+ // TODO(dcarney): throw a context free exception. |
+ if (resource->length() > static_cast<size_t>(i::String::kMaxLength)) { |
+ return MaybeLocal<String>(); |
+ } |
+ i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
+ ENTER_V8(i_isolate); |
+ LOG_API(i_isolate, "String::NewExternalTwoByte"); |
+ i::Handle<i::String> string = i_isolate->factory() |
+ ->NewExternalStringFromTwoByte(resource) |
+ .ToHandleChecked(); |
+ i_isolate->heap()->external_string_table()->AddString(*string); |
+ return Utils::ToLocal(string); |
} |
-static i::MaybeHandle<i::String> NewExternalOneByteStringHandle( |
- i::Isolate* isolate, v8::String::ExternalOneByteStringResource* resource) { |
- return isolate->factory()->NewExternalStringFromOneByte(resource); |
+Local<String> v8::String::NewExternal( |
+ Isolate* isolate, v8::String::ExternalStringResource* resource) { |
+ RETURN_TO_LOCAL_UNCHECKED(NewExternalTwoByte(isolate, resource), String); |
} |
-Local<String> v8::String::NewExternal( |
- Isolate* isolate, |
- v8::String::ExternalStringResource* resource) { |
+MaybeLocal<String> v8::String::NewExternalOneByte( |
+ Isolate* isolate, v8::String::ExternalOneByteStringResource* resource) { |
+ CHECK(resource && resource->data()); |
+ // TODO(dcarney): throw a context free exception. |
+ if (resource->length() > static_cast<size_t>(i::String::kMaxLength)) { |
+ return MaybeLocal<String>(); |
+ } |
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
- LOG_API(i_isolate, "String::NewExternal"); |
ENTER_V8(i_isolate); |
- CHECK(resource && resource->data()); |
- EXCEPTION_PREAMBLE(i_isolate); |
- i::Handle<i::String> string; |
- has_pending_exception = |
- !NewExternalStringHandle(i_isolate, resource).ToHandle(&string); |
- EXCEPTION_BAILOUT_CHECK(i_isolate, Local<String>()); |
+ LOG_API(i_isolate, "String::NewExternalOneByte"); |
+ i::Handle<i::String> string = i_isolate->factory() |
+ ->NewExternalStringFromOneByte(resource) |
+ .ToHandleChecked(); |
i_isolate->heap()->external_string_table()->AddString(*string); |
return Utils::ToLocal(string); |
} |
+Local<String> v8::String::NewExternal( |
+ Isolate* isolate, v8::String::ExternalOneByteStringResource* resource) { |
+ RETURN_TO_LOCAL_UNCHECKED(NewExternalOneByte(isolate, resource), String); |
+} |
+ |
+ |
bool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { |
i::Handle<i::String> obj = Utils::OpenHandle(this); |
i::Isolate* isolate = obj->GetIsolate(); |
@@ -5834,22 +5868,6 @@ bool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { |
} |
-Local<String> v8::String::NewExternal( |
- Isolate* isolate, v8::String::ExternalOneByteStringResource* resource) { |
- i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
- LOG_API(i_isolate, "String::NewExternal"); |
- ENTER_V8(i_isolate); |
- CHECK(resource && resource->data()); |
- EXCEPTION_PREAMBLE(i_isolate); |
- i::Handle<i::String> string; |
- has_pending_exception = |
- !NewExternalOneByteStringHandle(i_isolate, resource).ToHandle(&string); |
- EXCEPTION_BAILOUT_CHECK(i_isolate, Local<String>()); |
- i_isolate->heap()->external_string_table()->AddString(*string); |
- return Utils::ToLocal(string); |
-} |
- |
- |
bool v8::String::MakeExternal( |
v8::String::ExternalOneByteStringResource* resource) { |
i::Handle<i::String> obj = Utils::OpenHandle(this); |