11var console = require ( "console" ) ;
22
33var untilde = function ( str ) {
4- return str . replace ( / ( ~ . ) | [ \b \f \n \r \t \v \\ ' ] / g, function ( m ) {
4+ return str . replace ( / ~ . / g, function ( m ) {
55 switch ( m ) {
66 case "~0" :
77 return "~" ;
88 case "~1" :
99 return "/" ;
10- case "'" :
11- return "\\'" ;
12- case "\b" :
13- return "\\b" ;
14- case "\f" :
15- return "\\f" ;
16- case "\n" :
17- return "\\n" ;
18- case "\r" :
19- return "\\r" ;
20- case "\t" :
21- return "\\t" ;
22- case "\v" :
23- return "\\v" ;
24- case "\\" :
25- return "\\\\" ;
2610 }
2711 throw ( "Invalid tilde escape: " + m ) ;
2812 } ) ;
@@ -43,30 +27,38 @@ var compile = function(pointer) {
4327 }
4428 }
4529
46- var fn = "" ;
47- var part ;
48- var len = pointer . length - 1 ;
49- if ( len < 0 ) {
50- fn += "if (typeof value !== 'undefined') { throw(new Error('Invalid JSON pointer for set.')); }\n" ;
51- } else {
52- for ( var i = 0 ; i < len ; i ++ ) {
53- part = untilde ( pointer [ i ] ) ;
54- fn += "if (!obj) { return null; }\n" ;
55- fn += "obj = obj['" + part + "'];\n"
30+ var len = pointer . length ;
31+ if ( len === 0 ) {
32+ return function ( obj , value ) {
33+ if ( typeof value !== 'undefined' ) {
34+ throw ( new Error ( 'Invalid JSON pointer for set.' ) ) ;
35+ }
36+ return obj ;
5637 }
57- part = untilde ( pointer [ len ] ) ;
58- fn += "if (!obj) { return null; }\n" ;
59- fn += "if (typeof value !== 'undefined') {\n" +
60- " var old_value = obj['" + part + "'];\n" +
61- " obj['" + part + "'] = value;\n" +
62- " obj = old_value;\n" +
63- "} else {\n" +
64- " obj = obj['" + part + "'];\n" +
65- "}\n" ;
6638 }
6739
68- fn += "return obj;\n"
69- return new Function ( "obj" , "value" , fn ) ;
40+ pointer = pointer . map ( untilde ) ;
41+
42+ return function ( obj , value ) {
43+ var parent = null ;
44+ var part = null ;
45+ for ( var i = 0 ; i < len ; i ++ ) {
46+ if ( ! obj ) {
47+ if ( typeof value !== 'undefined' ) {
48+ throw new Error ( "Path not found for set" ) ;
49+ }
50+ return null ;
51+ }
52+ parent = obj ;
53+ part = pointer [ i ] ;
54+ obj = obj [ part ] ;
55+ }
56+
57+ if ( typeof value !== 'undefined' ) {
58+ parent [ part ] = value ;
59+ }
60+ return obj ;
61+ }
7062}
7163
7264var get = function ( obj , pointer ) {
0 commit comments