Index: include/v8.h |
diff --git a/include/v8.h b/include/v8.h |
index 0f05230596e19496a7a98515dea6fa918b7a6a31..98af428616a8eef5fabe1d6a2d0d308381e7b5e6 100644 |
--- a/include/v8.h |
+++ b/include/v8.h |
@@ -863,13 +863,13 @@ class Value : public Data { |
* Returns true if this value is the undefined value. See ECMA-262 |
* 4.3.10. |
*/ |
- V8EXPORT bool IsUndefined() const; |
+ inline bool IsUndefined() const; |
/** |
* Returns true if this value is the null value. See ECMA-262 |
* 4.3.11. |
*/ |
- V8EXPORT bool IsNull() const; |
+ inline bool IsNull() const; |
/** |
* Returns true if this value is true. |
@@ -983,7 +983,11 @@ class Value : public Data { |
V8EXPORT bool StrictEquals(Handle<Value> that) const; |
private: |
+ inline bool QuickIsUndefined() const; |
+ inline bool QuickIsNull() const; |
inline bool QuickIsString() const; |
+ V8EXPORT bool FullIsUndefined() const; |
+ V8EXPORT bool FullIsNull() const; |
V8EXPORT bool FullIsString() const; |
}; |
@@ -3891,6 +3895,7 @@ class Internals { |
static const int kStringResourceOffset = |
InternalConstants<kApiPointerSize>::kStringResourceOffset; |
+ static const int kOddballKindOffset = 3 * kApiPointerSize; |
static const int kForeignAddressOffset = kApiPointerSize; |
static const int kJSObjectHeaderSize = 3 * kApiPointerSize; |
static const int kFullStringRepresentationMask = 0x07; |
@@ -3898,8 +3903,12 @@ class Internals { |
static const int kJSObjectType = 0xaa; |
static const int kFirstNonstringType = 0x80; |
+ static const int kOddballType = 0x82; |
static const int kForeignType = 0x85; |
+ static const int kUndefinedOddballKind = 5; |
+ static const int kNullOddballKind = 3; |
+ |
static inline bool HasHeapObjectTag(internal::Object* value) { |
return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) == |
kHeapObjectTag); |
@@ -3919,6 +3928,11 @@ class Internals { |
return ReadField<uint8_t>(map, kMapInstanceTypeOffset); |
} |
+ static inline int GetOddballKind(internal::Object* obj) { |
+ typedef internal::Object O; |
+ return SmiValue(ReadField<O*>(obj, kOddballKindOffset)); |
+ } |
+ |
static inline void* GetExternalPointerFromSmi(internal::Object* value) { |
const uintptr_t address = reinterpret_cast<uintptr_t>(value); |
return reinterpret_cast<void*>(address >> kPointerToSmiShift); |
@@ -4200,6 +4214,42 @@ String::ExternalStringResource* String::GetExternalStringResource() const { |
} |
+bool Value::IsUndefined() const { |
+#ifdef V8_ENABLE_CHECKS |
+ return FullIsUndefined(); |
+#else |
+ return QuickIsUndefined(); |
+#endif |
+} |
+ |
+bool Value::QuickIsUndefined() const { |
+ typedef internal::Object O; |
+ typedef internal::Internals I; |
+ O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this)); |
+ if (!I::HasHeapObjectTag(obj)) return false; |
+ if (I::GetInstanceType(obj) != I::kOddballType) return false; |
+ return (I::GetOddballKind(obj) == I::kUndefinedOddballKind); |
+} |
+ |
+ |
+bool Value::IsNull() const { |
+#ifdef V8_ENABLE_CHECKS |
+ return FullIsNull(); |
+#else |
+ return QuickIsNull(); |
+#endif |
+} |
+ |
+bool Value::QuickIsNull() const { |
+ typedef internal::Object O; |
+ typedef internal::Internals I; |
+ O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this)); |
+ if (!I::HasHeapObjectTag(obj)) return false; |
+ if (I::GetInstanceType(obj) != I::kOddballType) return false; |
+ return (I::GetOddballKind(obj) == I::kNullOddballKind); |
+} |
+ |
+ |
bool Value::IsString() const { |
#ifdef V8_ENABLE_CHECKS |
return FullIsString(); |