1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | #ifndef NAN_JSON_H_
|
10 | #define NAN_JSON_H_
|
11 |
|
12 | #if NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION
|
13 | #define NAN_JSON_H_NEED_PARSE 1
|
14 | #else
|
15 | #define NAN_JSON_H_NEED_PARSE 0
|
16 | #endif
|
17 |
|
18 | #if NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION
|
19 | #define NAN_JSON_H_NEED_STRINGIFY 0
|
20 | #else
|
21 | #define NAN_JSON_H_NEED_STRINGIFY 1
|
22 | #endif
|
23 |
|
24 | class JSON {
|
25 | public:
|
26 | JSON() {
|
27 | #if NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY
|
28 | Nan::HandleScope scope;
|
29 |
|
30 | Nan::MaybeLocal<v8::Value> maybe_global_json = Nan::Get(
|
31 | Nan::GetCurrentContext()->Global(),
|
32 | Nan::New("JSON").ToLocalChecked()
|
33 | );
|
34 |
|
35 | assert(!maybe_global_json.IsEmpty() && "global JSON is empty");
|
36 | v8::Local<v8::Value> val_global_json = maybe_global_json.ToLocalChecked();
|
37 |
|
38 | assert(val_global_json->IsObject() && "global JSON is not an object");
|
39 | Nan::MaybeLocal<v8::Object> maybe_obj_global_json =
|
40 | Nan::To<v8::Object>(val_global_json);
|
41 |
|
42 | assert(!maybe_obj_global_json.IsEmpty() && "global JSON object is empty");
|
43 | v8::Local<v8::Object> global_json = maybe_obj_global_json.ToLocalChecked();
|
44 |
|
45 | #if NAN_JSON_H_NEED_PARSE
|
46 | Nan::MaybeLocal<v8::Value> maybe_parse_method = Nan::Get(
|
47 | global_json, Nan::New("parse").ToLocalChecked()
|
48 | );
|
49 |
|
50 | assert(!maybe_parse_method.IsEmpty() && "JSON.parse is empty");
|
51 | v8::Local<v8::Value> parse_method = maybe_parse_method.ToLocalChecked();
|
52 |
|
53 | assert(parse_method->IsFunction() && "JSON.parse is not a function");
|
54 | parse_cb_.Reset(parse_method.As<v8::Function>());
|
55 | #endif
|
56 |
|
57 | #if NAN_JSON_H_NEED_STRINGIFY
|
58 | Nan::MaybeLocal<v8::Value> maybe_stringify_method = Nan::Get(
|
59 | global_json, Nan::New("stringify").ToLocalChecked()
|
60 | );
|
61 |
|
62 | assert(!maybe_stringify_method.IsEmpty() && "JSON.stringify is empty");
|
63 | v8::Local<v8::Value> stringify_method =
|
64 | maybe_stringify_method.ToLocalChecked();
|
65 |
|
66 | assert(
|
67 | stringify_method->IsFunction() && "JSON.stringify is not a function"
|
68 | );
|
69 | stringify_cb_.Reset(stringify_method.As<v8::Function>());
|
70 | #endif
|
71 | #endif
|
72 | }
|
73 |
|
74 | inline
|
75 | Nan::MaybeLocal<v8::Value> Parse(v8::Local<v8::String> json_string) {
|
76 | Nan::EscapableHandleScope scope;
|
77 | #if NAN_JSON_H_NEED_PARSE
|
78 | return scope.Escape(parse(json_string));
|
79 | #else
|
80 | #if NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION
|
81 | Nan::MaybeLocal<v8::Value> result =
|
82 | v8::JSON::Parse(Nan::GetCurrentContext(), json_string);
|
83 |
|
84 | if (result.IsEmpty()) return v8::Local<v8::Value>();
|
85 | return scope.Escape(result.ToLocalChecked());
|
86 | #else
|
87 | return scope.Escape(v8::JSON::Parse(json_string));
|
88 | #endif
|
89 | #endif
|
90 | }
|
91 |
|
92 | inline
|
93 | Nan::MaybeLocal<v8::String> Stringify(v8::Local<v8::Object> json_object) {
|
94 | Nan::EscapableHandleScope scope;
|
95 | Nan::MaybeLocal<v8::String> result =
|
96 | #if NAN_JSON_H_NEED_STRINGIFY
|
97 | Nan::To<v8::String>(stringify(json_object));
|
98 | #else
|
99 | v8::JSON::Stringify(Nan::GetCurrentContext(), json_object);
|
100 | #endif
|
101 | if (result.IsEmpty()) return v8::Local<v8::String>();
|
102 | return scope.Escape(result.ToLocalChecked());
|
103 | }
|
104 |
|
105 | inline
|
106 | Nan::MaybeLocal<v8::String> Stringify(v8::Local<v8::Object> json_object,
|
107 | v8::Local<v8::String> gap) {
|
108 | Nan::EscapableHandleScope scope;
|
109 | Nan::MaybeLocal<v8::String> result =
|
110 | #if NAN_JSON_H_NEED_STRINGIFY
|
111 | Nan::To<v8::String>(stringify(json_object, gap));
|
112 | #else
|
113 | v8::JSON::Stringify(Nan::GetCurrentContext(), json_object, gap);
|
114 | #endif
|
115 | if (result.IsEmpty()) return v8::Local<v8::String>();
|
116 | return scope.Escape(result.ToLocalChecked());
|
117 | }
|
118 |
|
119 | private:
|
120 | NAN_DISALLOW_ASSIGN_COPY_MOVE(JSON)
|
121 | #if NAN_JSON_H_NEED_PARSE
|
122 | Nan::Callback parse_cb_;
|
123 | #endif
|
124 | #if NAN_JSON_H_NEED_STRINGIFY
|
125 | Nan::Callback stringify_cb_;
|
126 | #endif
|
127 |
|
128 | #if NAN_JSON_H_NEED_PARSE
|
129 | inline v8::Local<v8::Value> parse(v8::Local<v8::Value> arg) {
|
130 | assert(!parse_cb_.IsEmpty() && "parse_cb_ is empty");
|
131 | return parse_cb_.Call(1, &arg);
|
132 | }
|
133 | #endif
|
134 |
|
135 | #if NAN_JSON_H_NEED_STRINGIFY
|
136 | inline v8::Local<v8::Value> stringify(v8::Local<v8::Value> arg) {
|
137 | assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty");
|
138 | return stringify_cb_.Call(1, &arg);
|
139 | }
|
140 |
|
141 | inline v8::Local<v8::Value> stringify(v8::Local<v8::Value> arg,
|
142 | v8::Local<v8::String> gap) {
|
143 | assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty");
|
144 |
|
145 | v8::Local<v8::Value> argv[] = {
|
146 | arg,
|
147 | Nan::Null(),
|
148 | gap
|
149 | };
|
150 | return stringify_cb_.Call(3, argv);
|
151 | }
|
152 | #endif
|
153 | };
|
154 |
|
155 | #endif
|