Re: How can I call variable in script like this global.var

muhammad sami <[email protected]> Mon, 1 Apr 2019 13:20:44 -0700 (PDT)
Newsgroups gmane.comp.mozilla.devel.jseng
Message-ID <[email protected]>
On Monday, April 1, 2019 at 10:19:14 PM UTC+2, muhammad sami wrote:
> document is the global object
> dialog is the child object
> // following code might be needed in some case
> // #define __STDC_LIMIT_MACROS
> // #include <stdint.h>
> #include <mozjs-45/js/TypeDecls.h>
> #include <mozjs-45/js/RootingAPI.h>
> #include <mozjs-45/js/Class.h>
> 
> #include "jsapi.h"
> #include "js/Initialization.h"
> #include "js/Conversions.h"
> 
> using namespace JS;
> 
> class JavaScriptEngine {
> public:
>     static JSClass document_class;
>     static JSClass dialog_class;
> 
>     JSRuntime *rt = NULL;
>     JSContext *cx = NULL;
>     RootedObject* document;
>     RootedObject* dialog;
>     RootedObject* anonymous;
> 
>     JavaScriptEngine() {
> 
>         JS_Init();
> 
>         // Create a JS runtime.
>         rt = JS_NewRuntime(8L * 1024L * 1024L);
> 
>         // Create a context.
>         cx = JS_NewContext(rt, 8192);
> 
>         // Enter a request before running anything in the context.
>         JSAutoRequest ar(cx);
> 
>         // Create the global object and a new compartment.
>         document = new RootedObject(cx, JS_NewGlobalObject(cx, &document_class, nullptr,
>                 JS::DontFireOnNewGlobalHook));
> 
>         JSAutoCompartment ac(cx, *document);
> 
>         JS_InitStandardClasses(cx, *document);
> 
>         JS_SetErrorReporter(rt, reportError);
> 
>     }
> 
>     ~JavaScriptEngine() {
> 
>         // Shut everything down.
>         JS_DestroyContext(cx);
>         JS_DestroyRuntime(rt);
>         JS_ShutDown();
> 
>         delete document;
>         delete dialog;
>         delete anonymous;
>     }
> 
>     static void reportError(JSContext *cx, const char *message, JSErrorReport * report) {
>         fprintf(stderr, "%s:%u:%s\n",
>                 report->filename ? report->filename : "[no filename]",
>                 (unsigned int) report->lineno,
>                 message);
>     }
> 
>     bool run(JSContext *cx, RootedObject *globaloObj, const char *script, const char *filename = "noname", int lineno = 1) {
>         JSAutoRequest ar(cx);
>         JSAutoCompartment ac(cx, *globaloObj);
> 
>         JS::RootedValue rval(cx);
> 
>         JS::CompileOptions opts(cx);
>         opts.setFileAndLine(filename, lineno);
> 
>         bool ok = JS::Evaluate(cx, opts, script, strlen(script), &rval);
> 
>         if (!ok)
>             return 1;
> 
>         JSString *str = rval.toString();
>         if (rval.isObject()) {
> 
>             char result[500];
>             strcpy(result, script);
>             bool ok = JS::Evaluate(cx, opts, strcat(result, " + ' '"), strlen(strcat(result, " + ' '")), &rval);
> 
>             if (!ok)
>                 return 1;
>             str = rval.toString();
> 
>             if (str != NULL)
>                 printf("output: %s\n", JS_EncodeString(cx, str));
> 
>         } else if (rval.isInt32()) {
> 
>             size_t i = rval.toInt32();
> 
>             printf("output: is number  %d\n", i);
> 
>         } else if (rval.isNull()) {
> 
>             printf("rval.isNull\n");
> 
>         } else if (rval.isUndefined()) {
> 
>             printf("rval.undefined()\n");
> 
>         } else if (str != NULL) {
>             printf("output: %s\n", JS_EncodeString(cx, str));
> 
>         } else {
>             printf("output: no match \n");
> 
>         }
> 
>         return true;
> 
>     }
> 
>     bool changeScope() {
> 
>         JSAutoRequest ar(cx);
>         JSAutoCompartment ac(cx, *document);
> 
>         JS::HandleObject parent = JS::HandleObject::fromMarkedLocation(&document->get());
>         JS::MutableHandleObject protop = JS::MutableHandleObject::fromMarkedLocation(&document->get());
>        
>         if (JS_GetPrototype(cx, parent, protop)) {
> 
>             JS::HandleObject parentprotop = JS::HandleObject::fromMarkedLocation(&protop.get());
>             dialog = new RootedObject(cx, JS_NewObjectWithGivenProto(cx, &dialog_class, parentprotop));
>         }
>        
>     }
> 
> };
> 
> JSClass JavaScriptEngine::document_class = {
>     "document",
>     JSCLASS_GLOBAL_FLAGS,
>     nullptr,
>     nullptr,
>     nullptr,
>     nullptr,
>     nullptr,
>     nullptr,
>     nullptr,
>     nullptr, nullptr, nullptr, nullptr,
>     JS_GlobalObjectTraceHook
> };
> 
> JSClass JavaScriptEngine::dialog_class = {
>     "dialog",
>     JSCLASS_GLOBAL_FLAGS,
>     nullptr,
>     nullptr,
>     nullptr,
>     nullptr,
>     nullptr,
>     nullptr,
>     nullptr,
>     nullptr, nullptr, nullptr, nullptr,
>     JS_GlobalObjectTraceHook
> };
> 
> int main(int argc, const char *argv[]) {
> 
>     JavaScriptEngine e;
>     e.run(e.cx, e.document, "var document = this; var x = 5;");
>     e.run(e.cx, e.document, "document.x");
>     e.changeScope();
>     e.run(e.cx, e.dialog, "x");
>     e.run(e.cx, e.dialog, "var dialog = this;");
>     e.run(e.cx, e.dialog, "x=10");
>     e.run(e.cx, e.dialog, "dialog.x");
>     e.run(e.cx, e.dialog, "document.x");
>    
> }

ouput:
rval.undefined()
output: is number  5
output: is number  5
rval.undefined()
output: is number  10
output: is number  10
output: is number  10