Reviewers: ulan,

Message:
This replaces v8::internal::BasicJsonStringifier::GetProperty with
v8::internal::GetProperty. The former does a LookupRealNamedProperty, which
fails for interceptor keys. It was formerly introduced as fast path replacing v8::internal::GetProperty, but since after a few changes it's only used in slow
paths and therefore became obsolete (aside from being incorrect).

Description:
Fix JSON.stringify for objects with interceptor handlers.

BUG=161028


Please review this at https://codereview.chromium.org/11348209/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/json-stringifier.h
  M test/cctest/test-accessors.cc


Index: src/json-stringifier.h
diff --git a/src/json-stringifier.h b/src/json-stringifier.h
index 3866343328e36429982a1f9e7616351cae091fa7..80ef39507812207ac5dbaa690b51855bfd522793 100644
--- a/src/json-stringifier.h
+++ b/src/json-stringifier.h
@@ -76,9 +76,6 @@ class BasicJsonStringifier BASE_EMBEDDED {
     }
   }

-  Handle<Object> GetProperty(Handle<JSObject> object,
-                             Handle<String> key);
-
   Handle<Object> ApplyToJsonFunction(Handle<Object> object,
                                      Handle<Object> key);

@@ -262,34 +259,6 @@ void BasicJsonStringifier::Append_(const Char* chars) {
 }


-Handle<Object> BasicJsonStringifier::GetProperty(Handle<JSObject> object,
-                                                 Handle<String> key) {
-  LookupResult lookup(isolate_);
-  object->LocalLookupRealNamedProperty(*key, &lookup);
-  if (!lookup.IsProperty()) return factory_->undefined_value();
-  switch (lookup.type()) {
-    case NORMAL: {
-      Object* value = lookup.holder()->GetNormalizedProperty(&lookup);
-      ASSERT(!value->IsTheHole());
-      return Handle<Object>(value, isolate_);
-    }
-    case FIELD: {
-      Object* value = lookup.holder()->FastPropertyAt(
-          lookup.GetFieldIndex().field_index());
-      ASSERT(!value->IsTheHole());
-      return Handle<Object>(value, isolate_);
-    }
-    case CONSTANT_FUNCTION:
-      return Handle<Object>(lookup.GetConstantFunction(), isolate_);
-    default: {
-      PropertyAttributes attr;
-      return Object::GetProperty(object, object, &lookup, key, &attr);
-    }
-  }
-  return Handle<Object>::null();
-}
-
-
 Handle<Object> BasicJsonStringifier::ApplyToJsonFunction(
     Handle<Object> object, Handle<Object> key) {
   LookupResult lookup(isolate_);
@@ -400,8 +369,8 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeGeneric(
     bool deferred_comma,
     bool deferred_key) {
   Handle<JSObject> builtins(isolate_->native_context()->builtins());
-  Handle<JSFunction> builtin = Handle<JSFunction>::cast(
-      v8::internal::GetProperty(builtins, "JSONSerializeAdapter"));
+  Handle<JSFunction> builtin =
+ Handle<JSFunction>::cast(GetProperty(builtins, "JSONSerializeAdapter"));

   Handle<Object> argv[] = { key, object };
   bool has_exception = false;
Index: test/cctest/test-accessors.cc
diff --git a/test/cctest/test-accessors.cc b/test/cctest/test-accessors.cc
index 0b342ff3d920fd5a4bf91504c082336d9dac8e4c..d44503534fb6b5b4479fd2b37e2d763bfde4f9c5 100644
--- a/test/cctest/test-accessors.cc
+++ b/test/cctest/test-accessors.cc
@@ -453,3 +453,29 @@ THREADED_TEST(HandleScopeSegment) {
       "result;"))->Run();
   CHECK_EQ(100, result->Int32Value());
 }
+
+
+v8::Handle<v8::Array> JSONStringifyEnumerator(const AccessorInfo& info) {
+  v8::Handle<v8::Array> array = v8::Array::New(1);
+  array->Set(0, v8_str("regress"));
+  return array;
+}
+
+
+v8::Handle<v8::Value> JSONStringifyGetter(Local<String> name,
+                                          const AccessorInfo& info) {
+  return v8_str("crbug-161028");
+}
+
+
+THREADED_TEST(JSONStringifyNamedInterceptorObject) {
+  v8::HandleScope scope;
+  LocalContext env;
+
+  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
+  obj->SetNamedPropertyHandler(
+      JSONStringifyGetter, NULL, NULL, NULL, JSONStringifyEnumerator);
+  env->Global()->Set(v8_str("obj"), obj->NewInstance());
+ v8::Handle<v8::String> expected = v8_str("{\"regress\":\"crbug-161028\"}");
+  CHECK(CompileRun("JSON.stringify(obj)")->Equals(expected));
+}


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to