Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index faba6de0a10f797faefa059ecfcf9fe51c3e4ff2..a7008cd4f29da37a66c5326e1c18b19d503e0935 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -5170,78 +5170,131 @@ Local<String> v8::String::Empty() { |
} |
-Local<String> v8::String::New(const char* data, int length) { |
- i::Isolate* isolate = i::Isolate::Current(); |
- EnsureInitializedForIsolate(isolate, "v8::String::New()"); |
- LOG_API(isolate, "String::New(char)"); |
- if (length == 0) return Empty(); |
- ENTER_V8(isolate); |
- if (length == -1) length = i::StrLength(data); |
- i::Handle<i::String> result = |
- isolate->factory()->NewStringFromUtf8( |
- i::Vector<const char>(data, length)); |
- return Utils::ToLocal(result); |
-} |
- |
+// anonymous namespace for string creation helper functions |
+namespace { |
-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(); |
- EnsureInitializedForIsolate(isolate, "v8::String::New()"); |
- LOG_API(isolate, "String::New(char)"); |
- ENTER_V8(isolate); |
- i::Handle<i::String> right_string = Utils::OpenHandle(*right); |
- i::Handle<i::String> result = isolate->factory()->NewConsString(left_string, |
- right_string); |
- return Utils::ToLocal(result); |
+inline int StringLength(const char* string) { |
Yang
2013/03/22 12:46:05
use the INLINE macro if you *really* want to inlin
|
+ return i::StrLength(string); |
} |
-Local<String> v8::String::NewUndetectable(const char* data, int length) { |
- i::Isolate* isolate = i::Isolate::Current(); |
- EnsureInitializedForIsolate(isolate, "v8::String::NewUndetectable()"); |
- LOG_API(isolate, "String::NewUndetectable(char)"); |
- ENTER_V8(isolate); |
- if (length == -1) length = i::StrLength(data); |
- i::Handle<i::String> result = |
- isolate->factory()->NewStringFromUtf8( |
- i::Vector<const char>(data, length)); |
- result->MarkAsUndetectable(); |
- return Utils::ToLocal(result); |
+inline int StringLength(const uint8_t* string) { |
+ return i::StrLength(reinterpret_cast<const char*>(string)); |
} |
-static int TwoByteStringLength(const uint16_t* data) { |
+inline int StringLength(const uint16_t* string) { |
int length = 0; |
- while (data[length] != '\0') length++; |
+ while (string[length] != '\0') |
+ length++; |
Yang
2013/03/22 12:46:05
either brackets or no line break.
|
return length; |
} |
-Local<String> v8::String::New(const uint16_t* data, int length) { |
- i::Isolate* isolate = i::Isolate::Current(); |
- EnsureInitializedForIsolate(isolate, "v8::String::New()"); |
- LOG_API(isolate, "String::New(uint16_)"); |
- if (length == 0) return Empty(); |
+inline i::Handle<i::String> NewString(i::Factory* factory, |
+ String::NewStringType type, |
+ i::Vector<const char> string) { |
+ if (type ==String::kInternalizedString) { |
+ return factory->InternalizeUtf8String(string); |
+ } |
+ return factory->NewStringFromUtf8(string); |
+} |
+ |
+ |
+inline i::Handle<i::String> NewString(i::Factory* factory, |
+ String::NewStringType type, |
+ i::Vector<const uint8_t> string) { |
+ if (type == String::kInternalizedString) { |
+ return factory->InternalizeOneByteString(string); |
+ } |
+ return factory->NewStringFromOneByte(string); |
+} |
+ |
+ |
+inline i::Handle<i::String> NewString(i::Factory* factory, |
+ String::NewStringType type, |
+ i::Vector<const uint16_t> string) { |
+ if (type == String::kInternalizedString) { |
+ 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) { |
+ i::Isolate* isolate = reinterpret_cast<internal::Isolate*>(v8_isolate); |
+ EnsureInitializedForIsolate(isolate, location); |
+ LOG_API(isolate, env); |
+ if (length == 0 && type != String::kUndetectableString) { |
+ return String::Empty(); |
+ } |
ENTER_V8(isolate); |
- if (length == -1) length = TwoByteStringLength(data); |
- i::Handle<i::String> result = |
- isolate->factory()->NewStringFromTwoByte( |
- i::Vector<const uint16_t>(data, length)); |
+ if (length == -1) length = StringLength(data); |
Yang
2013/03/22 12:46:05
I don't have a strong opinion on this, but maybe w
|
+ i::Handle<i::String> result = NewString( |
+ isolate->factory(), type, i::Vector<const Char>(data, length)); |
+ if (type == String::kUndetectableString) { |
+ result->MarkAsUndetectable(); |
+ } |
return Utils::ToLocal(result); |
} |
+} // anonymous namespace |
-Local<String> v8::String::NewUndetectable(const uint16_t* data, int length) { |
- i::Isolate* isolate = i::Isolate::Current(); |
- EnsureInitializedForIsolate(isolate, "v8::String::NewUndetectable()"); |
- LOG_API(isolate, "String::NewUndetectable(uint16_)"); |
+ |
+Local<String> String::NewFromUtf8(Isolate* isolate, |
+ const char* data, |
+ NewStringType type, |
+ int length) { |
+ return NewString(isolate, |
+ "v8::String::NewFromUtf8()", |
+ "String::NewFromUtf8", |
+ data, |
+ type, |
+ length); |
+} |
+ |
+ |
+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); |
+} |
+ |
+ |
+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); |
+} |
+ |
+ |
+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(); |
+ EnsureInitializedForIsolate(isolate, "v8::String::New()"); |
+ LOG_API(isolate, "String::New(char)"); |
ENTER_V8(isolate); |
- if (length == -1) length = TwoByteStringLength(data); |
- i::Handle<i::String> result = |
- isolate->factory()->NewStringFromTwoByte( |
- i::Vector<const uint16_t>(data, length)); |
- result->MarkAsUndetectable(); |
+ i::Handle<i::String> right_string = Utils::OpenHandle(*right); |
+ i::Handle<i::String> result = isolate->factory()->NewConsString(left_string, |
+ right_string); |
return Utils::ToLocal(result); |
} |
@@ -5597,18 +5650,6 @@ Local<Object> Array::CloneElementAt(uint32_t index) { |
} |
-Local<String> v8::String::NewSymbol(const char* data, int length) { |
- i::Isolate* isolate = i::Isolate::Current(); |
- EnsureInitializedForIsolate(isolate, "v8::String::NewSymbol()"); |
- LOG_API(isolate, "String::NewSymbol(char)"); |
- ENTER_V8(isolate); |
- if (length == -1) length = i::StrLength(data); |
- i::Handle<i::String> result = isolate->factory()->InternalizeUtf8String( |
- i::Vector<const char>(data, length)); |
- return Utils::ToLocal(result); |
-} |
- |
- |
Local<Number> v8::Number::New(double value) { |
i::Isolate* isolate = i::Isolate::Current(); |
EnsureInitializedForIsolate(isolate, "v8::Number::New()"); |