| Index: include/v8.h
|
| ===================================================================
|
| --- include/v8.h (revision 3056)
|
| +++ include/v8.h (working copy)
|
| @@ -1278,6 +1278,7 @@
|
| Object();
|
| static void CheckCast(Value* obj);
|
| Local<Value> CheckedGetInternalField(int index);
|
| + void* SlowGetPointerFromInternalField(int index);
|
|
|
| /**
|
| * If quick access to the internal field is possible this method
|
| @@ -2753,7 +2754,6 @@
|
| static const int kJSObjectHeaderSize = 3 * sizeof(void*);
|
| static const int kFullStringRepresentationMask = 0x07;
|
| static const int kExternalTwoByteRepresentationTag = 0x03;
|
| - static const int kAlignedPointerShift = 2;
|
|
|
| // These constants are compiler dependent so their values must be
|
| // defined within the implementation.
|
| @@ -2782,6 +2782,22 @@
|
| #endif
|
| }
|
|
|
| + static inline int GetInstanceType(internal::Object* obj) {
|
| + typedef internal::Object O;
|
| + O* map = ReadField<O*>(obj, kHeapObjectMapOffset);
|
| + return ReadField<uint8_t>(map, kMapInstanceTypeOffset);
|
| + }
|
| +
|
| + static inline void* GetExternalPointer(internal::Object* obj) {
|
| + if (HasSmiTag(obj)) {
|
| + return obj;
|
| + } else if (GetInstanceType(obj) == kProxyType) {
|
| + return ReadField<void*>(obj, kProxyProxyOffset);
|
| + } else {
|
| + return NULL;
|
| + }
|
| + }
|
| +
|
| static inline bool IsExternalTwoByteString(int instance_type) {
|
| int representation = (instance_type & kFullStringRepresentationMask);
|
| return representation == kExternalTwoByteRepresentationTag;
|
| @@ -2939,9 +2955,7 @@
|
| typedef internal::Object O;
|
| typedef internal::Internals I;
|
| O* obj = *reinterpret_cast<O**>(this);
|
| - O* map = I::ReadField<O*>(obj, I::kHeapObjectMapOffset);
|
| - int instance_type = I::ReadField<uint8_t>(map, I::kMapInstanceTypeOffset);
|
| - if (instance_type == I::kJSObjectType) {
|
| + if (I::GetInstanceType(obj) == I::kJSObjectType) {
|
| // If the object is a plain JSObject, which is the common case,
|
| // we know where to find the internal fields and can return the
|
| // value directly.
|
| @@ -2966,25 +2980,27 @@
|
|
|
| void* External::QuickUnwrap(Handle<v8::Value> wrapper) {
|
| typedef internal::Object O;
|
| - typedef internal::Internals I;
|
| O* obj = *reinterpret_cast<O**>(const_cast<v8::Value*>(*wrapper));
|
| - if (I::HasSmiTag(obj)) {
|
| - int value = I::SmiValue(obj) << I::kAlignedPointerShift;
|
| - return reinterpret_cast<void*>(value);
|
| - } else {
|
| - O* map = I::ReadField<O*>(obj, I::kHeapObjectMapOffset);
|
| - int instance_type = I::ReadField<uint8_t>(map, I::kMapInstanceTypeOffset);
|
| - if (instance_type == I::kProxyType) {
|
| - return I::ReadField<void*>(obj, I::kProxyProxyOffset);
|
| - } else {
|
| - return NULL;
|
| - }
|
| - }
|
| + return internal::Internals::GetExternalPointer(obj);
|
| }
|
|
|
|
|
| void* Object::GetPointerFromInternalField(int index) {
|
| - return External::Unwrap(GetInternalField(index));
|
| + typedef internal::Object O;
|
| + typedef internal::Internals I;
|
| +
|
| + O* obj = *reinterpret_cast<O**>(this);
|
| +
|
| + if (I::GetInstanceType(obj) == I::kJSObjectType) {
|
| + // If the object is a plain JSObject, which is the common case,
|
| + // we know where to find the internal fields and can return the
|
| + // value directly.
|
| + int offset = I::kJSObjectHeaderSize + (sizeof(void*) * index);
|
| + O* value = I::ReadField<O*>(obj, offset);
|
| + return I::GetExternalPointer(value);
|
| + }
|
| +
|
| + return SlowGetPointerFromInternalField(index);
|
| }
|
|
|
|
|
| @@ -3000,10 +3016,8 @@
|
| typedef internal::Object O;
|
| typedef internal::Internals I;
|
| O* obj = *reinterpret_cast<O**>(const_cast<String*>(this));
|
| - O* map = I::ReadField<O*>(obj, I::kHeapObjectMapOffset);
|
| - int instance_type = I::ReadField<uint8_t>(map, I::kMapInstanceTypeOffset);
|
| String::ExternalStringResource* result;
|
| - if (I::IsExternalTwoByteString(instance_type)) {
|
| + if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
|
| void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
|
| result = reinterpret_cast<String::ExternalStringResource*>(value);
|
| } else {
|
| @@ -3029,9 +3043,7 @@
|
| typedef internal::Internals I;
|
| O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this));
|
| if (!I::HasHeapObjectTag(obj)) return false;
|
| - O* map = I::ReadField<O*>(obj, I::kHeapObjectMapOffset);
|
| - int instance_type = I::ReadField<uint8_t>(map, I::kMapInstanceTypeOffset);
|
| - return (instance_type < I::kFirstNonstringType);
|
| + return (I::GetInstanceType(obj) < I::kFirstNonstringType);
|
| }
|
|
|
|
|
|
|