Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(333)

Side by Side Diff: src/json-stringifier.h

Issue 11348209: Fix JSON.stringify for objects with interceptor handlers. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | test/cctest/test-accessors.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 } 69 }
70 70
71 INLINE(void Append(const char* chars)) { 71 INLINE(void Append(const char* chars)) {
72 if (is_ascii_) { 72 if (is_ascii_) {
73 Append_<true>(chars); 73 Append_<true>(chars);
74 } else { 74 } else {
75 Append_<false>(chars); 75 Append_<false>(chars);
76 } 76 }
77 } 77 }
78 78
79 Handle<Object> GetProperty(Handle<JSObject> object,
80 Handle<String> key);
81
82 Handle<Object> ApplyToJsonFunction(Handle<Object> object, 79 Handle<Object> ApplyToJsonFunction(Handle<Object> object,
83 Handle<Object> key); 80 Handle<Object> key);
84 81
85 Result SerializeGeneric(Handle<Object> object, 82 Result SerializeGeneric(Handle<Object> object,
86 Handle<Object> key, 83 Handle<Object> key,
87 bool deferred_comma, 84 bool deferred_comma,
88 bool deferred_key); 85 bool deferred_key);
89 86
90 // Entry point to serialize the object. 87 // Entry point to serialize the object.
91 INLINE(Result SerializeObject(Handle<Object> obj)) { 88 INLINE(Result SerializeObject(Handle<Object> obj)) {
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 if (current_index_ == part_length_) Extend(); 252 if (current_index_ == part_length_) Extend();
256 } 253 }
257 254
258 255
259 template <bool is_ascii, typename Char> 256 template <bool is_ascii, typename Char>
260 void BasicJsonStringifier::Append_(const Char* chars) { 257 void BasicJsonStringifier::Append_(const Char* chars) {
261 for ( ; *chars != '\0'; chars++) Append_<is_ascii, Char>(*chars); 258 for ( ; *chars != '\0'; chars++) Append_<is_ascii, Char>(*chars);
262 } 259 }
263 260
264 261
265 Handle<Object> BasicJsonStringifier::GetProperty(Handle<JSObject> object,
266 Handle<String> key) {
267 LookupResult lookup(isolate_);
268 object->LocalLookupRealNamedProperty(*key, &lookup);
269 if (!lookup.IsProperty()) return factory_->undefined_value();
270 switch (lookup.type()) {
271 case NORMAL: {
272 Object* value = lookup.holder()->GetNormalizedProperty(&lookup);
273 ASSERT(!value->IsTheHole());
274 return Handle<Object>(value, isolate_);
275 }
276 case FIELD: {
277 Object* value = lookup.holder()->FastPropertyAt(
278 lookup.GetFieldIndex().field_index());
279 ASSERT(!value->IsTheHole());
280 return Handle<Object>(value, isolate_);
281 }
282 case CONSTANT_FUNCTION:
283 return Handle<Object>(lookup.GetConstantFunction(), isolate_);
284 default: {
285 PropertyAttributes attr;
286 return Object::GetProperty(object, object, &lookup, key, &attr);
287 }
288 }
289 return Handle<Object>::null();
290 }
291
292
293 Handle<Object> BasicJsonStringifier::ApplyToJsonFunction( 262 Handle<Object> BasicJsonStringifier::ApplyToJsonFunction(
294 Handle<Object> object, Handle<Object> key) { 263 Handle<Object> object, Handle<Object> key) {
295 LookupResult lookup(isolate_); 264 LookupResult lookup(isolate_);
296 JSObject::cast(*object)->LookupRealNamedProperty(*tojson_symbol_, &lookup); 265 JSObject::cast(*object)->LookupRealNamedProperty(*tojson_symbol_, &lookup);
297 if (!lookup.IsProperty()) return object; 266 if (!lookup.IsProperty()) return object;
298 PropertyAttributes attr; 267 PropertyAttributes attr;
299 Handle<Object> fun = 268 Handle<Object> fun =
300 Object::GetProperty(object, object, &lookup, tojson_symbol_, &attr); 269 Object::GetProperty(object, object, &lookup, tojson_symbol_, &attr);
301 if (!fun->IsJSFunction()) return object; 270 if (!fun->IsJSFunction()) return object;
302 271
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 } 362 }
394 } 363 }
395 364
396 365
397 BasicJsonStringifier::Result BasicJsonStringifier::SerializeGeneric( 366 BasicJsonStringifier::Result BasicJsonStringifier::SerializeGeneric(
398 Handle<Object> object, 367 Handle<Object> object,
399 Handle<Object> key, 368 Handle<Object> key,
400 bool deferred_comma, 369 bool deferred_comma,
401 bool deferred_key) { 370 bool deferred_key) {
402 Handle<JSObject> builtins(isolate_->native_context()->builtins()); 371 Handle<JSObject> builtins(isolate_->native_context()->builtins());
403 Handle<JSFunction> builtin = Handle<JSFunction>::cast( 372 Handle<JSFunction> builtin =
404 v8::internal::GetProperty(builtins, "JSONSerializeAdapter")); 373 Handle<JSFunction>::cast(GetProperty(builtins, "JSONSerializeAdapter"));
405 374
406 Handle<Object> argv[] = { key, object }; 375 Handle<Object> argv[] = { key, object };
407 bool has_exception = false; 376 bool has_exception = false;
408 Handle<Object> result = 377 Handle<Object> result =
409 Execution::Call(builtin, object, 2, argv, &has_exception); 378 Execution::Call(builtin, object, 2, argv, &has_exception);
410 if (has_exception) return EXCEPTION; 379 if (has_exception) return EXCEPTION;
411 if (result->IsUndefined()) return UNCHANGED; 380 if (result->IsUndefined()) return UNCHANGED;
412 if (deferred_key) { 381 if (deferred_key) {
413 if (key->IsSmi()) key = factory_->NumberToString(key); 382 if (key->IsSmi()) key = factory_->NumberToString(key);
414 SerializeDeferredKey(deferred_comma, key); 383 SerializeDeferredKey(deferred_comma, key);
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
792 SerializeString_<false, char>(flat.ToAsciiVector(), object); 761 SerializeString_<false, char>(flat.ToAsciiVector(), object);
793 } else { 762 } else {
794 SerializeString_<false, uc16>(flat.ToUC16Vector(), object); 763 SerializeString_<false, uc16>(flat.ToUC16Vector(), object);
795 } 764 }
796 } 765 }
797 } 766 }
798 767
799 } } // namespace v8::internal 768 } } // namespace v8::internal
800 769
801 #endif // V8_JSON_STRINGIFIER_H_ 770 #endif // V8_JSON_STRINGIFIER_H_
OLDNEW
« no previous file with comments | « no previous file | test/cctest/test-accessors.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698