SpiderMonkey JS_CompileScript und JS_ExecuteScript?



  • Ich würde gern ein Script compilieren und dann mehrfach ausführen. Allerdings mit unterschiedlichen globalen Objekten (dem 2. Parameter von JS_ExecuteScript)? Ist das so möglich und wenn ja, warum wird das Ding dann JS_CompileScript als Parameter mitgegeben 😕



  • Ach, und ich hab ein bischen Bedenken mit dem RegExp Objekt, kann ich das wieder entfernen nachdem ich JS_InitStandardClasses aufgerufen hab 😕



  • bump



  • gefrog* schrieb:

    Ich würde gern ein Script compilieren und dann mehrfach ausführen. Allerdings mit unterschiedlichen globalen Objekten (dem 2. Parameter von JS_ExecuteScript)? Ist das so möglich und wenn ja, warum wird das Ding dann JS_CompileScript als Parameter mitgegeben 😕

    Ja ist möglich, nein du musst keine globalen Objekte übergeben (rtfm).



  • gary1195 schrieb:

    (rtfm)

    Aus der fehlerhaften Dokumentation konnte ich nichts rauslesen.

    gary1195 schrieb:

    Ja ist möglich, nein du musst keine globalen Objekte übergeben

    Aus deinem Satz übrigens auch nicht, wo kann ich es weglassen? Bei JS_CompileScript ohne zweiten Parameter bekomm ich immer ein Segfault 🙄





  • Huch, da war ich schon zu müde... Also kann ich es bei JS_CompileScript rauslassen.

    Meld mich wieder, wenn ich nicht weiter komm. 👍



  • Okay, ich bekomm es einfach nicht hin und mach schon fast einen Tag an diesem abgefuckten SpiderMonkey rum und werd langsam sauer. Kann mir bitte einer helfen 😞

    Wie aus dem Code ersichtlich, würde ich gern ein Script (char *str) mehrfach in einem unterschiedlichen Scope (scope_a und scope_b) ausführen. Dabei bekomme ich immer in Z. 77 ein Segfault (JS_GC). Nur mit dem ersten JS_ExecuteScript läufts 😕

    Ohne JS_GC läuft es auch, zumindest bis der Speicher aus ist. Es muss also mit dem GC zusammenhängen - aber ich hab einfach keine Ahnung 😞

    #include <mozjs/jsapi.h>
    #include <string.h>
    
    JSBool js_puts(JSContext *cx,uintN argc,jsval *vp){
    	JSString *str = JS_ValueToString(cx,JS_ARGV(cx, vp)[0]);
    	if(str){
    		char *tmp = JS_EncodeString(cx,str);
    		if(tmp){
    			puts(tmp);
    			JS_free(cx,tmp);
    		}
    	}
    
    	JS_SET_RVAL(cx, vp, JSVAL_VOID);
    
    	return JS_TRUE;
    }
    
    int main(){
    	JSClass global_class = {
    		 "global"
    		,JSCLASS_GLOBAL_FLAGS
    		,JS_PropertyStub
    		,JS_PropertyStub
    		,JS_PropertyStub
    		,JS_PropertyStub
    		,JS_EnumerateStub
    		,JS_ResolveStub
    		,JS_ConvertStub
    		,NULL
    		,JSCLASS_NO_OPTIONAL_MEMBERS
    	};
    	char *str = "if(this.x == null){this.x=1;}var l = 10;while(l--){puts(this.x++);}";
    	JSRuntime *runtime = JS_NewRuntime(8L * 1024L * 512L);
    	JSContext *context = JS_NewContext(runtime,4096);
    	JSObject  *global = JS_NewObject(context,&global_class,0,0);
    	JSObject  *scope_a = JS_NewObject(context,0,0,global);
    	JSObject  *scope_b = JS_NewObject(context,0,0,global);
    	JSScript  *script = JS_CompileScript(
    		 context
    		,0
    		,str
    		,strlen(str)
    		,"0"
    		,1
    	);
    	jsval     rval;
    
    	JS_DefineFunction(
    		 context
    		,global
    		,"puts"
    		,(JSNative)js_puts
    		,1
    		,JSFUN_FAST_NATIVE | JSFUN_STUB_GSOPS
    	);
    
    	while(1){
    		/*JS_ExecuteScript(
    			 context
    			,global
    			,script
    			,&rval
    		);*/
    		JS_ExecuteScript(
    			 context
    			,scope_a
    			,script
    			,&rval
    		);
    		JS_ExecuteScript(
    			 context
    			,scope_b
    			,script
    			,&rval
    		);
    		JS_GC(context);
    	}
    
    	return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ./compile.sh: Zeile 7: 20640 Speicherzugriffsfehler  ./test
    

    @edit: Ich kann schon Rückgabewerte überprüfen, daran sollte es nicht liegen. Ist nur gekürzt, weil ich euch nicht mit einem Schinken quälen wollte...



  • 😕



  • kennt sich echt keiner aus 😞



  • Macht ihr das mit Absicht, oder warum bekomm ich keine Antwort 😕 😡



  • Ich denke mal die wenigten werden sich damit auskennen. Und nur für eine Antwort sich in eine Sprache/Framework einzuarbeiten, ist doch ein bisschen viel verlangt oder?

    Ich glaube die wenigten hier haben was mit Webprogrammierung am Hut, jedenfalls nicht so gut, als dass sie bei deinem Problem "right of the bat" helfen könnte.



  • keinbloeder ist doch der eine wo nie arbeiten gehen will



  • keinbloeder schrieb:

    Ich denke mal die wenigten werden sich damit auskennen. Und nur für eine Antwort sich in eine Sprache/Framework einzuarbeiten, ist doch ein bisschen viel verlangt oder?

    Ich glaube die wenigten hier haben was mit Webprogrammierung am Hut, jedenfalls nicht so gut, als dass sie bei deinem Problem "right of the bat" helfen könnte.

    Rüdiger ist doch Autor der Flusspferd Library? Kann mich vllt. jmd. in das C-Subforum verschieben 😉



  • Oh, Rüdiger ist auch Moderator in 'Rund um die Programmierung'. So bringt das natürlich nichts 😞


Anmelden zum Antworten