UNPKG

5.11 kBtext/x-cView Raw
1/*********************************************************************
2 * NAN - Native Abstractions for Node.js
3 *
4 * Copyright (c) 2017 NAN contributors
5 *
6 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
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 // NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION
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 // NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION
23
24class 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 // NAN_JSON_H_NEED_PARSE
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 // NAN_JSON_H_NEED_STRINGIFY
71#endif // NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY
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 // NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION
89#endif // NAN_JSON_H_NEED_PARSE
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 // NAN_JSON_H_NEED_STRINGIFY
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 // NAN_JSON_H_NEED_STRINGIFY
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 // NAN_JSON_H_NEED_PARSE
124#if NAN_JSON_H_NEED_STRINGIFY
125 Nan::Callback stringify_cb_;
126#endif // NAN_JSON_H_NEED_STRINGIFY
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 // NAN_JSON_H_NEED_PARSE
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 // NAN_JSON_H_NEED_STRINGIFY
153};
154
155#endif // NAN_JSON_H_