Index: include/v8.h |
diff --git a/include/v8.h b/include/v8.h |
index ddde388cd4f27c970c29e351333b06cd94b5c026..4b49978f2ac1620102e3da9aeffc28ebb22cf099 100644 |
--- a/include/v8.h |
+++ b/include/v8.h |
@@ -1018,6 +1018,11 @@ class Boolean : public Primitive { |
*/ |
class String : public Primitive { |
public: |
+ enum Encoding { |
+ UNKNOWN_ENCODING = 0x1, |
+ TWO_BYTE_ENCODING = 0x0, |
+ ASCII_ENCODING = 0x4 |
+ }; |
/** |
* Returns the number of characters in this string. |
*/ |
@@ -1181,6 +1186,14 @@ class String : public Primitive { |
}; |
/** |
+ * If the string is an external string, return the ExternalStringResourceBase |
+ * regardless of the encoding, otherwise return NULL. The encoding of the |
+ * string is returned in encoding_out. |
+ */ |
+ inline ExternalStringResourceBase* GetExternalStringResourceBase( |
+ Encoding* encoding_out) const; |
+ |
+ /** |
* Get the ExternalStringResource for an external string. Returns |
* NULL if IsExternal() doesn't return true. |
*/ |
@@ -1343,6 +1356,8 @@ class String : public Primitive { |
}; |
private: |
+ V8EXPORT void VerifyExternalStringResourceBase(ExternalStringResourceBase* v, |
+ Encoding encoding) const; |
V8EXPORT void VerifyExternalStringResource(ExternalStringResource* val) const; |
V8EXPORT static void CheckCast(v8::Value* obj); |
}; |
@@ -4033,7 +4048,9 @@ class Internals { |
static const int kForeignAddressOffset = kApiPointerSize; |
static const int kJSObjectHeaderSize = 3 * kApiPointerSize; |
static const int kFullStringRepresentationMask = 0x07; |
+ static const int kStringEncodingMask = 0x4; |
static const int kExternalTwoByteRepresentationTag = 0x02; |
+ static const int kExternalAsciiRepresentationTag = 0x06; |
static const int kIsolateStateOffset = 0; |
static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize; |
@@ -4388,6 +4405,26 @@ String::ExternalStringResource* String::GetExternalStringResource() const { |
} |
+String::ExternalStringResourceBase* String::GetExternalStringResourceBase( |
+ String::Encoding* encoding_out) const { |
+ typedef internal::Object O; |
+ typedef internal::Internals I; |
+ O* obj = *reinterpret_cast<O**>(const_cast<String*>(this)); |
+ int type = I::GetInstanceType(obj) & I::kFullStringRepresentationMask; |
+ *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask); |
+ ExternalStringResourceBase* resource = NULL; |
+ if (type == I::kExternalAsciiRepresentationTag || |
+ type == I::kExternalTwoByteRepresentationTag) { |
+ void* value = I::ReadField<void*>(obj, I::kStringResourceOffset); |
+ resource = static_cast<ExternalStringResourceBase*>(value); |
+ } |
+#ifdef V8_ENABLE_CHECKS |
+ VerifyExternalStringResourceBase(resource, *encoding_out); |
+#endif |
+ return resource; |
+} |
+ |
+ |
bool Value::IsUndefined() const { |
#ifdef V8_ENABLE_CHECKS |
return FullIsUndefined(); |