Skip to content
This repository was archived by the owner on Jan 19, 2019. It is now read-only.

Commit 1c373d5

Browse files
committed
Another take at pre-compilation, which doesn't use eval.
1 parent 7373c09 commit 1c373d5

File tree

1 file changed

+30
-38
lines changed

1 file changed

+30
-38
lines changed

jsonpointer.js

Lines changed: 30 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,12 @@
11
var console = require("console");
22

33
var 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

7264
var get = function(obj, pointer) {

0 commit comments

Comments
 (0)