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

Side by Side Diff: src/json.js

Issue 1200373003: JSON.stringify should handle the replacer before the space (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 5 years, 6 months 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
« no previous file with comments | « no previous file | test/mjsunit/json-replacer-order.js » ('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 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 var $jsonSerializeAdapter; 5 var $jsonSerializeAdapter;
6 6
7 (function(global, utils) { 7 (function(global, utils) {
8 8
9 "use strict"; 9 "use strict";
10 10
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 } 176 }
177 // Undefined or a callable object. 177 // Undefined or a callable object.
178 return UNDEFINED; 178 return UNDEFINED;
179 } 179 }
180 180
181 181
182 function JSONStringify(value, replacer, space) { 182 function JSONStringify(value, replacer, space) {
183 if (%_ArgumentsLength() == 1) { 183 if (%_ArgumentsLength() == 1) {
184 return %BasicJSONStringify(value); 184 return %BasicJSONStringify(value);
185 } 185 }
186 if (IS_OBJECT(space)) {
187 // Unwrap 'space' if it is wrapped
188 if (IS_NUMBER_WRAPPER(space)) {
189 space = $toNumber(space);
190 } else if (IS_STRING_WRAPPER(space)) {
191 space = $toString(space);
192 }
193 }
194 var gap;
195 if (IS_NUMBER(space)) {
196 space = MathMax(0, MathMin($toInteger(space), 10));
197 gap = %_SubString(" ", 0, space);
198 } else if (IS_STRING(space)) {
199 if (space.length > 10) {
200 gap = %_SubString(space, 0, 10);
201 } else {
202 gap = space;
203 }
204 } else {
205 gap = "";
206 }
207 if (IS_ARRAY(replacer)) { 186 if (IS_ARRAY(replacer)) {
208 // Deduplicate replacer array items. 187 // Deduplicate replacer array items.
209 var property_list = new InternalArray(); 188 var property_list = new InternalArray();
210 var seen_properties = { __proto__: null }; 189 var seen_properties = { __proto__: null };
211 var length = replacer.length; 190 var length = replacer.length;
212 for (var i = 0; i < length; i++) { 191 for (var i = 0; i < length; i++) {
213 var v = replacer[i]; 192 var v = replacer[i];
214 var item; 193 var item;
215 if (IS_STRING(v)) { 194 if (IS_STRING(v)) {
216 item = v; 195 item = v;
217 } else if (IS_NUMBER(v)) { 196 } else if (IS_NUMBER(v)) {
218 item = %_NumberToString(v); 197 item = %_NumberToString(v);
219 } else if (IS_STRING_WRAPPER(v) || IS_NUMBER_WRAPPER(v)) { 198 } else if (IS_STRING_WRAPPER(v) || IS_NUMBER_WRAPPER(v)) {
220 item = $toString(v); 199 item = $toString(v);
221 } else { 200 } else {
222 continue; 201 continue;
223 } 202 }
224 if (!seen_properties[item]) { 203 if (!seen_properties[item]) {
225 property_list.push(item); 204 property_list.push(item);
226 seen_properties[item] = true; 205 seen_properties[item] = true;
227 } 206 }
228 } 207 }
229 replacer = property_list; 208 replacer = property_list;
230 } 209 }
210 if (IS_OBJECT(space)) {
211 // Unwrap 'space' if it is wrapped
212 if (IS_NUMBER_WRAPPER(space)) {
213 space = $toNumber(space);
214 } else if (IS_STRING_WRAPPER(space)) {
215 space = $toString(space);
216 }
217 }
218 var gap;
219 if (IS_NUMBER(space)) {
220 space = MathMax(0, MathMin($toInteger(space), 10));
221 gap = %_SubString(" ", 0, space);
222 } else if (IS_STRING(space)) {
223 if (space.length > 10) {
224 gap = %_SubString(space, 0, 10);
225 } else {
226 gap = space;
227 }
228 } else {
229 gap = "";
230 }
231 return JSONSerialize('', {'': value}, replacer, new InternalArray(), "", gap); 231 return JSONSerialize('', {'': value}, replacer, new InternalArray(), "", gap);
232 } 232 }
233 233
234 // ------------------------------------------------------------------- 234 // -------------------------------------------------------------------
235 235
236 %AddNamedProperty(GlobalJSON, symbolToStringTag, "JSON", READ_ONLY | DONT_ENUM); 236 %AddNamedProperty(GlobalJSON, symbolToStringTag, "JSON", READ_ONLY | DONT_ENUM);
237 237
238 // Set up non-enumerable properties of the JSON object. 238 // Set up non-enumerable properties of the JSON object.
239 utils.InstallFunctions(GlobalJSON, DONT_ENUM, [ 239 utils.InstallFunctions(GlobalJSON, DONT_ENUM, [
240 "parse", JSONParse, 240 "parse", JSONParse,
241 "stringify", JSONStringify 241 "stringify", JSONStringify
242 ]); 242 ]);
243 243
244 // ------------------------------------------------------------------- 244 // -------------------------------------------------------------------
245 // JSON Builtins 245 // JSON Builtins
246 246
247 $jsonSerializeAdapter = function(key, object) { 247 $jsonSerializeAdapter = function(key, object) {
248 var holder = {}; 248 var holder = {};
249 holder[key] = object; 249 holder[key] = object;
250 // No need to pass the actual holder since there is no replacer function. 250 // No need to pass the actual holder since there is no replacer function.
251 return JSONSerialize(key, holder, UNDEFINED, new InternalArray(), "", ""); 251 return JSONSerialize(key, holder, UNDEFINED, new InternalArray(), "", "");
252 } 252 }
253 253
254 }) 254 })
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/json-replacer-order.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698