@@ -273,6 +273,16 @@ TemplatePtr NewFunctionTemplate(IsolatePtr iso_ptr, int callback_ref) {
273273
274274/* ********* Context **********/
275275
276+ #define LOCAL_CONTEXT (ctx_ptr ) \
277+ m_ctx* ctx = static_cast <m_ctx*>(ctx_ptr); \
278+ Isolate* iso = ctx->iso; \
279+ Locker locker (iso); \
280+ Isolate::Scope isolate_scope (iso); \
281+ HandleScope handle_scope (iso); \
282+ TryCatch try_catch (iso); \
283+ Local<Context> local_ctx = ctx->ptr.Get(iso); \
284+ Context::Scope context_scope (local_ctx);
285+
276286ContextPtr NewContext (IsolatePtr iso_ptr,
277287 TemplatePtr global_template_ptr,
278288 int ref) {
@@ -316,15 +326,7 @@ void ContextFree(ContextPtr ptr) {
316326}
317327
318328RtnValue RunScript (ContextPtr ctx_ptr, const char * source, const char * origin) {
319- m_ctx* ctx = static_cast <m_ctx*>(ctx_ptr);
320- Isolate* iso = ctx->iso ;
321- Locker locker (iso);
322- Isolate::Scope isolate_scope (iso);
323- HandleScope handle_scope (iso);
324- TryCatch try_catch (iso);
325-
326- Local<Context> local_ctx = ctx->ptr .Get (iso);
327- Context::Scope context_scope (local_ctx);
329+ LOCAL_CONTEXT (ctx_ptr);
328330
329331 Local<String> src =
330332 String::NewFromUtf8 (iso, source, NewStringType::kNormal ).ToLocalChecked ();
@@ -339,7 +341,27 @@ RtnValue RunScript(ContextPtr ctx_ptr, const char* source, const char* origin) {
339341 rtn.error = ExceptionError (try_catch, iso, local_ctx);
340342 return rtn;
341343 }
342- MaybeLocal<v8::Value> result = script.ToLocalChecked ()->Run (local_ctx);
344+ MaybeLocal<Value> result = script.ToLocalChecked ()->Run (local_ctx);
345+ if (result.IsEmpty ()) {
346+ rtn.error = ExceptionError (try_catch, iso, local_ctx);
347+ return rtn;
348+ }
349+ m_value* val = new m_value;
350+ val->iso = iso;
351+ val->ctx .Reset (iso, local_ctx);
352+ val->ptr .Reset (iso, Persistent<Value>(iso, result.ToLocalChecked ()));
353+
354+ rtn.value = static_cast <ValuePtr>(val);
355+ return rtn;
356+ }
357+
358+ RtnValue JSONParse (ContextPtr ctx_ptr, const char * str) {
359+ LOCAL_CONTEXT (ctx_ptr);
360+ RtnValue rtn = {nullptr , nullptr };
361+
362+ MaybeLocal<Value> result = JSON::Parse (
363+ local_ctx,
364+ String::NewFromUtf8 (iso, str, NewStringType::kNormal ).ToLocalChecked ());
343365 if (result.IsEmpty ()) {
344366 rtn.error = ExceptionError (try_catch, iso, local_ctx);
345367 return rtn;
@@ -353,6 +375,43 @@ RtnValue RunScript(ContextPtr ctx_ptr, const char* source, const char* origin) {
353375 return rtn;
354376}
355377
378+ const char * JSONStringify (ContextPtr ctx_ptr, ValuePtr val_ptr) {
379+ Isolate* iso;
380+ Local<Context> local_ctx;
381+
382+ m_value* val = static_cast <m_value*>(val_ptr);
383+ m_ctx* ctx = static_cast <m_ctx*>(ctx_ptr);
384+
385+ if (ctx != nullptr ) {
386+ iso = ctx->iso ;
387+ } else {
388+ iso = val->iso ;
389+ }
390+
391+ Locker locker (iso);
392+ Isolate::Scope isolate_scope (iso);
393+ HandleScope handle_scope (iso);
394+
395+ if (ctx != nullptr ) {
396+ local_ctx = ctx->ptr .Get (iso);
397+ } else {
398+ local_ctx = val->ctx .Get (iso);
399+ if (local_ctx.IsEmpty ()) {
400+ m_ctx* ctx = static_cast <m_ctx*>(iso->GetData (0 ));
401+ local_ctx = ctx->ptr .Get (iso);
402+ }
403+ }
404+
405+ Context::Scope context_scope (local_ctx);
406+
407+ MaybeLocal<String> str = JSON::Stringify (local_ctx, val->ptr .Get (iso));
408+ if (str.IsEmpty ()) {
409+ return nullptr ;
410+ }
411+ String::Utf8Value json (iso, str.ToLocalChecked ());
412+ return CopyString (json);
413+ }
414+
356415/* ********* Value **********/
357416
358417#define LOCAL_VALUE (ptr ) \
0 commit comments