Allow users of the V8 API to distinguish between unset and undefined HiddenValues
BUG=v8:2746 R=svenpanne@chromium.org Review URL: https://codereview.chromium.org/17781002 Patch from Adam Klein <adamk@chromium.org>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15329 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
081134ecd1
commit
a92d237948
@ -3935,7 +3935,7 @@ v8::Local<v8::Value> v8::Object::GetHiddenValue(v8::Handle<v8::String> key) {
|
||||
i::Handle<i::String> key_string =
|
||||
isolate->factory()->InternalizeString(key_obj);
|
||||
i::Handle<i::Object> result(self->GetHiddenProperty(*key_string), isolate);
|
||||
if (result->IsUndefined()) return v8::Local<v8::Value>();
|
||||
if (result->IsTheHole()) return v8::Local<v8::Value>();
|
||||
return Utils::ToLocal(result);
|
||||
}
|
||||
|
||||
|
@ -4734,7 +4734,7 @@ Object* JSObject::GetHiddenProperty(Name* key) {
|
||||
// For a proxy, use the prototype as target object.
|
||||
Object* proxy_parent = GetPrototype();
|
||||
// If the proxy is detached, return undefined.
|
||||
if (proxy_parent->IsNull()) return GetHeap()->undefined_value();
|
||||
if (proxy_parent->IsNull()) return GetHeap()->the_hole_value();
|
||||
ASSERT(proxy_parent->IsJSGlobalObject());
|
||||
return JSObject::cast(proxy_parent)->GetHiddenProperty(key);
|
||||
}
|
||||
@ -4748,15 +4748,14 @@ Object* JSObject::GetHiddenProperty(Name* key) {
|
||||
if (key == GetHeap()->identity_hash_string()) {
|
||||
return inline_value;
|
||||
} else {
|
||||
return GetHeap()->undefined_value();
|
||||
return GetHeap()->the_hole_value();
|
||||
}
|
||||
}
|
||||
|
||||
if (inline_value->IsUndefined()) return GetHeap()->undefined_value();
|
||||
if (inline_value->IsUndefined()) return GetHeap()->the_hole_value();
|
||||
|
||||
ObjectHashTable* hashtable = ObjectHashTable::cast(inline_value);
|
||||
Object* entry = hashtable->Lookup(key);
|
||||
if (entry->IsTheHole()) return GetHeap()->undefined_value();
|
||||
return entry;
|
||||
}
|
||||
|
||||
|
@ -1996,7 +1996,7 @@ class JSObject: public JSReceiver {
|
||||
Handle<Object> value);
|
||||
// Returns a failure if a GC is required.
|
||||
MUST_USE_RESULT MaybeObject* SetHiddenProperty(Name* key, Object* value);
|
||||
// Gets the value of a hidden property with the given key. Returns undefined
|
||||
// Gets the value of a hidden property with the given key. Returns the hole
|
||||
// if the property doesn't exist (or if called on a detached proxy),
|
||||
// otherwise returns the value set for the key.
|
||||
Object* GetHiddenProperty(Name* key);
|
||||
|
@ -13380,6 +13380,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOverflowedStackTrace) {
|
||||
CONVERT_ARG_CHECKED(JSObject, error_object, 0);
|
||||
String* key = isolate->heap()->hidden_stack_trace_string();
|
||||
Object* result = error_object->GetHiddenProperty(key);
|
||||
if (result->IsTheHole()) result = isolate->heap()->undefined_value();
|
||||
RUNTIME_ASSERT(result->IsJSArray() ||
|
||||
result->IsString() ||
|
||||
result->IsUndefined());
|
||||
|
@ -19280,6 +19280,18 @@ THREADED_TEST(Regress2535) {
|
||||
}
|
||||
|
||||
|
||||
THREADED_TEST(Regress2746) {
|
||||
LocalContext context;
|
||||
v8::HandleScope scope(context->GetIsolate());
|
||||
Local<Object> obj = Object::New();
|
||||
Local<String> key = String::New("key");
|
||||
obj->SetHiddenValue(key, v8::Undefined());
|
||||
Local<Value> value = obj->GetHiddenValue(key);
|
||||
CHECK(!value.IsEmpty());
|
||||
CHECK(value->IsUndefined());
|
||||
}
|
||||
|
||||
|
||||
#ifndef WIN32
|
||||
class ThreadInterruptTest {
|
||||
public:
|
||||
|
Loading…
Reference in New Issue
Block a user