@@ -12,10 +12,7 @@ var createProperty = require('../internals/create-property');
12
12
var parseJSONString = require ( '../internals/parse-json-string' ) ;
13
13
var getReplacerFunction = require ( '../internals/get-json-replacer-function' ) ;
14
14
var uid = require ( '../internals/uid' ) ;
15
- var InternalStateModule = require ( '../internals/internal-state' ) ;
16
-
17
- var getInternalState = InternalStateModule . get ;
18
- var setInternalState = InternalStateModule . set ;
15
+ var setInternalState = require ( '../internals/internal-state' ) . set ;
19
16
20
17
var $String = String ;
21
18
var $SyntaxError = SyntaxError ;
@@ -26,6 +23,7 @@ var freeze = getBuiltIn('Object', 'freeze');
26
23
var at = uncurryThis ( '' . charAt ) ;
27
24
var slice = uncurryThis ( '' . slice ) ;
28
25
var exec = uncurryThis ( / ./ . exec ) ;
26
+ var push = uncurryThis ( [ ] . push ) ;
29
27
30
28
var MARK = uid ( ) ;
31
29
var MARK_LENGTH = MARK . length ;
@@ -42,14 +40,9 @@ $({ target: 'JSON', stat: true, forced: !NATIVE_RAW_JSON }, {
42
40
throw $SyntaxError ( ERROR_MESSAGE ) ;
43
41
}
44
42
var parsed = parse ( jsonString ) ;
45
- var dataType = typeof parsed ;
46
- if ( dataType == 'object' && parsed !== null ) throw $SyntaxError ( ERROR_MESSAGE ) ;
43
+ if ( typeof parsed == 'object' && parsed !== null ) throw $SyntaxError ( ERROR_MESSAGE ) ;
47
44
var obj = create ( null ) ;
48
- setInternalState ( obj , {
49
- type : 'RawJSON' ,
50
- dataType : dataType ,
51
- data : dataType == 'string' ? parsed : jsonString
52
- } ) ;
45
+ setInternalState ( obj , { type : 'RawJSON' } ) ;
53
46
createProperty ( obj , 'rawJSON' , jsonString ) ;
54
47
return FREEZING ? freeze ( obj ) : obj ;
55
48
}
@@ -61,13 +54,12 @@ $({ target: 'JSON', stat: true, forced: !NATIVE_RAW_JSON }, {
61
54
if ( $stringify ) $ ( { target : 'JSON' , stat : true , arity : 3 , forced : ! NATIVE_RAW_JSON } , {
62
55
stringify : function stringify ( text , replacer , space ) {
63
56
var replacerFunction = getReplacerFunction ( replacer ) ;
57
+ var rawStrings = [ ] ;
64
58
65
59
var json = $stringify ( text , function ( key , value ) {
66
60
// some old implementations (like WebKit) could pass numbers as keys
67
- if ( isCallable ( replacerFunction ) ) value = call ( replacerFunction , this , $String ( key ) , value ) ;
68
- if ( ! isRawJSON ( value ) ) return value ;
69
- var state = getInternalState ( value ) ;
70
- return state . dataType == 'string' ? state . data : MARK + state . data ;
61
+ var v = isCallable ( replacerFunction ) ? call ( replacerFunction , this , $String ( key ) , value ) : value ;
62
+ return isRawJSON ( v ) ? MARK + ( push ( rawStrings , v . rawJSON ) - 1 ) : v ;
71
63
} , space ) ;
72
64
73
65
if ( typeof json != 'string' ) return json ;
@@ -77,15 +69,16 @@ if ($stringify) $({ target: 'JSON', stat: true, arity: 3, forced: !NATIVE_RAW_JS
77
69
78
70
for ( var i = 0 ; i < length ; i ++ ) {
79
71
var chr = at ( json , i ) ;
80
- if ( chr === '"' ) {
72
+ if ( chr == '"' ) {
81
73
var end = parseJSONString ( json , ++ i ) . end - 1 ;
82
74
var string = slice ( json , i , end ) ;
83
75
result += slice ( string , 0 , MARK_LENGTH ) == MARK
84
- ? slice ( string , MARK_LENGTH )
76
+ ? rawStrings [ slice ( string , MARK_LENGTH ) ]
85
77
: '"' + string + '"' ;
86
78
i = end ;
87
79
} else result += chr ;
88
80
}
81
+
89
82
return result ;
90
83
}
91
84
} ) ;
0 commit comments