Revision: 13041
Author: [email protected]
Date: Fri Nov 23 04:32:24 2012
Log: Fix JSON.stringify for objects with interceptor handlers.
BUG=161028
Review URL: https://chromiumcodereview.appspot.com/11348209
http://code.google.com/p/v8/source/detail?r=13041
Modified:
/branches/bleeding_edge/src/json-stringifier.h
/branches/bleeding_edge/test/cctest/test-accessors.cc
=======================================
--- /branches/bleeding_edge/src/json-stringifier.h Thu Nov 15 05:31:27 2012
+++ /branches/bleeding_edge/src/json-stringifier.h Fri Nov 23 04:32:24 2012
@@ -75,9 +75,6 @@
Append_<false>(chars);
}
}
-
- Handle<Object> GetProperty(Handle<JSObject> object,
- Handle<String> key);
Handle<Object> ApplyToJsonFunction(Handle<Object> object,
Handle<Object> key);
@@ -260,34 +257,6 @@
void BasicJsonStringifier::Append_(const Char* chars) {
for ( ; *chars != '\0'; chars++) Append_<is_ascii, 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(
@@ -400,8 +369,8 @@
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;
=======================================
--- /branches/bleeding_edge/test/cctest/test-accessors.cc Fri Apr 13
02:38:00 2012
+++ /branches/bleeding_edge/test/cctest/test-accessors.cc Fri Nov 23
04:32:24 2012
@@ -453,3 +453,29 @@
"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