| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | /********************************************************************* * NAN - Native Abstractions for Node.js * * Copyright (c) 2018 NAN contributors * * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md> ********************************************************************/#ifndef NAN_JSON_H_#define NAN_JSON_H_#if NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION#define NAN_JSON_H_NEED_PARSE 1#else#define NAN_JSON_H_NEED_PARSE 0#endif  // NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION#if NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION#define NAN_JSON_H_NEED_STRINGIFY 0#else#define NAN_JSON_H_NEED_STRINGIFY 1#endif  // NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSIONclass JSON { public:  JSON() {#if NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY    Nan::HandleScope scope;    Nan::MaybeLocal<v8::Value> maybe_global_json = Nan::Get(      Nan::GetCurrentContext()->Global(),      Nan::New("JSON").ToLocalChecked()    );    assert(!maybe_global_json.IsEmpty() && "global JSON is empty");    v8::Local<v8::Value> val_global_json = maybe_global_json.ToLocalChecked();    assert(val_global_json->IsObject() && "global JSON is not an object");    Nan::MaybeLocal<v8::Object> maybe_obj_global_json =      Nan::To<v8::Object>(val_global_json);    assert(!maybe_obj_global_json.IsEmpty() && "global JSON object is empty");    v8::Local<v8::Object> global_json = maybe_obj_global_json.ToLocalChecked();#if NAN_JSON_H_NEED_PARSE    Nan::MaybeLocal<v8::Value> maybe_parse_method = Nan::Get(      global_json, Nan::New("parse").ToLocalChecked()    );    assert(!maybe_parse_method.IsEmpty() && "JSON.parse is empty");    v8::Local<v8::Value> parse_method = maybe_parse_method.ToLocalChecked();    assert(parse_method->IsFunction() && "JSON.parse is not a function");    parse_cb_.Reset(parse_method.As<v8::Function>());#endif  // NAN_JSON_H_NEED_PARSE#if NAN_JSON_H_NEED_STRINGIFY    Nan::MaybeLocal<v8::Value> maybe_stringify_method = Nan::Get(      global_json, Nan::New("stringify").ToLocalChecked()    );    assert(!maybe_stringify_method.IsEmpty() && "JSON.stringify is empty");    v8::Local<v8::Value> stringify_method =      maybe_stringify_method.ToLocalChecked();    assert(      stringify_method->IsFunction() && "JSON.stringify is not a function"    );    stringify_cb_.Reset(stringify_method.As<v8::Function>());#endif  // NAN_JSON_H_NEED_STRINGIFY#endif  // NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY  }  inline  Nan::MaybeLocal<v8::Value> Parse(v8::Local<v8::String> json_string) {    Nan::EscapableHandleScope scope;#if NAN_JSON_H_NEED_PARSE    return scope.Escape(parse(json_string));#else    Nan::MaybeLocal<v8::Value> result;#if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION && \    NODE_MODULE_VERSION <= IOJS_2_0_MODULE_VERSION    result = v8::JSON::Parse(json_string);#else#if NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION    v8::Local<v8::Context> context_or_isolate = Nan::GetCurrentContext();#else    v8::Isolate* context_or_isolate = v8::Isolate::GetCurrent();#endif  // NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION    result = v8::JSON::Parse(context_or_isolate, json_string);#endif  // NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION &&        // NODE_MODULE_VERSION <= IOJS_2_0_MODULE_VERSION    if (result.IsEmpty()) return v8::Local<v8::Value>();    return scope.Escape(result.ToLocalChecked());#endif  // NAN_JSON_H_NEED_PARSE  }  inline  Nan::MaybeLocal<v8::String> Stringify(v8::Local<v8::Object> json_object) {    Nan::EscapableHandleScope scope;    Nan::MaybeLocal<v8::String> result =#if NAN_JSON_H_NEED_STRINGIFY      Nan::To<v8::String>(stringify(json_object));#else      v8::JSON::Stringify(Nan::GetCurrentContext(), json_object);#endif  // NAN_JSON_H_NEED_STRINGIFY    if (result.IsEmpty()) return v8::Local<v8::String>();    return scope.Escape(result.ToLocalChecked());  }  inline  Nan::MaybeLocal<v8::String> Stringify(v8::Local<v8::Object> json_object,    v8::Local<v8::String> gap) {    Nan::EscapableHandleScope scope;    Nan::MaybeLocal<v8::String> result =#if NAN_JSON_H_NEED_STRINGIFY      Nan::To<v8::String>(stringify(json_object, gap));#else      v8::JSON::Stringify(Nan::GetCurrentContext(), json_object, gap);#endif  // NAN_JSON_H_NEED_STRINGIFY    if (result.IsEmpty()) return v8::Local<v8::String>();    return scope.Escape(result.ToLocalChecked());  } private:  NAN_DISALLOW_ASSIGN_COPY_MOVE(JSON)#if NAN_JSON_H_NEED_PARSE  Nan::Callback parse_cb_;#endif  // NAN_JSON_H_NEED_PARSE#if NAN_JSON_H_NEED_STRINGIFY  Nan::Callback stringify_cb_;#endif  // NAN_JSON_H_NEED_STRINGIFY#if NAN_JSON_H_NEED_PARSE  inline v8::Local<v8::Value> parse(v8::Local<v8::Value> arg) {    assert(!parse_cb_.IsEmpty() && "parse_cb_ is empty");    AsyncResource resource("nan:JSON.parse");    return parse_cb_.Call(1, &arg, &resource).FromMaybe(v8::Local<v8::Value>());  }#endif  // NAN_JSON_H_NEED_PARSE#if NAN_JSON_H_NEED_STRINGIFY  inline v8::Local<v8::Value> stringify(v8::Local<v8::Value> arg) {    assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty");    AsyncResource resource("nan:JSON.stringify");    return stringify_cb_.Call(1, &arg, &resource)        .FromMaybe(v8::Local<v8::Value>());  }  inline v8::Local<v8::Value> stringify(v8::Local<v8::Value> arg,    v8::Local<v8::String> gap) {    assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty");    v8::Local<v8::Value> argv[] = {      arg,      Nan::Null(),      gap    };    AsyncResource resource("nan:JSON.stringify");    return stringify_cb_.Call(3, argv, &resource)        .FromMaybe(v8::Local<v8::Value>());  }#endif  // NAN_JSON_H_NEED_STRINGIFY};#endif  // NAN_JSON_H_
 |