rpmRC rpmjsRun(rpmjs js, const char * str, const char ** resultp) { rpmRC rc = RPMRC_FAIL; if (!(str && *str)) goto exit; if (js == NULL) js = rpmjsI(); #if defined(WITH_GPSEE) { gpsee_interpreter_t * I = js->I; jsval v = JSVAL_VOID; JSBool ok = JS_EvaluateScript(I->cx, I->realm->globalObject, str, strlen(str), __FILE__, __LINE__, &v); if (!ok) goto exit; rc = RPMRC_OK; if (resultp && JSVAL_IS_STRING(v)) { JSString * rstr = JSVAL_TO_STRING(v); size_t ns = JS_GetStringEncodingLength(I->cx, rstr); char * s = xmalloc(ns+1); ns = JS_EncodeStringToBuffer(rstr, s, ns); s[ns] = '\0'; *resultp = s; } } #endif /* WITH_GPSEE */ exit: RPMJSDBG(0, (stderr, "<== %s(%p,%p[%u]) rc %d\n", __FUNCTION__, js, str, (unsigned)(str ? strlen(str) : 0), rc)); return rc; }
rpmRC rpmjsRun(rpmjs js, const char * str, const char ** resultp) { rpmRC rc = RPMRC_FAIL; if (js == NULL) js = rpmjsI(); if (str != NULL) { #if defined(WITH_GPSEE) gpsee_interpreter_t * I = js->I; jsval v = JSVAL_VOID; JSBool ok; ok = JS_EvaluateScript(I->cx, I->realm->globalObject, str, strlen(str), __FILE__, __LINE__, &v); if (ok) { rc = RPMRC_OK; if (resultp) { JSString *rstr = JS_ValueToString(I->cx, v); *resultp = JS_GetStringBytes(rstr); } } v = JSVAL_NULL; #endif /* WITH_GPSEE */ } if (_rpmjs_debug) fprintf(stderr, "<== %s(%p,%p[%u]) rc %d\n", __FUNCTION__, js, str, (unsigned)(str ? strlen(str) : 0), rc); return rc; }
/* XXX FIXME: Iargv/Ienviron are now associated with running. */ rpmjs rpmjsNew(char ** av, uint32_t flags) { rpmjs js = #ifdef NOTYET (flags & 0x80000000) ? rpmjsI() : #endif rpmjsGetPool(_rpmjsPool); JSI_t I = NULL; #if defined(WITH_GPSEE) #if defined(XXX_GPSEE_DEBUGGER) /* XXX js->jsdc? */ JSDContext *jsdc; #endif if (flags == 0) flags = _rpmjs_options; if (F_ISSET(flags, NOUTF8) || getenv("GPSEE_NO_UTF8_C_STRINGS")) { JS_DestroyRuntime(JS_NewRuntime(1024)); putenv((char *) "GPSEE_NO_UTF8_C_STRINGS=1"); } /* XXX FIXME: js->Iargv/js->Ienviron for use by rpmjsRunFile() */ I = gpsee_createInterpreter(); #if defined(XXX_GPSEE_DEBUGGER) js->jsdc = gpsee_initDebugger(I->cx, I->realm, DEBUGGER_JS); #endif #ifdef NOTYET /* FIXME: dig out where NOCACHE has moved. */ if (F_ISSET(flags, NOCACHE)) I->useCompilerCache = 0; #endif if (F_ISSET(flags, NOWARN)) { gpsee_runtime_t * grt = JS_GetRuntimePrivate(JS_GetRuntime(I->cx)); grt->errorReport |= er_noWarnings; } JS_SetOptions(I->cx, (flags & 0xffff)); #if defined(JS_GC_ZEAL) JS_SetGCZeal(I->cx, _rpmjs_zeal); #endif #endif /* WITH_GPSEE */ js->flags = flags; js->I = I; return rpmjsLink(js); }
rpmRC rpmjsRunFile(rpmjs js, const char * fn, char *const * Iargv, const char ** resultp) { rpmRC rc = RPMRC_FAIL; if (js == NULL) js = rpmjsI(); if (fn != NULL) { #if defined(WITH_GPSEE) gpsee_interpreter_t * I = js->I; FILE * fp = rpmjsOpenFile(js, fn, resultp); if (fp == NULL) { I->grt->exitType = et_execFailure; /* XXX FIXME: strerror in *resultp */ goto exit; } #ifdef NOTYET /* XXX FIXME */ processInlineFlags(js, fp, &verbosity); gpsee_setVerbosity(verbosity); #endif /* Just compile and exit? */ if (F_ISSET(js->flags, NOEXEC)) { JSScript *script = NULL; JSObject *scrobj = NULL; if (!gpsee_compileScript(I->cx, fn, fp, NULL, &script, I->realm->globalObject, &scrobj)) { I->grt->exitType = et_exception; /* XXX FIXME: isatty(3) */ gpsee_reportUncaughtException(I->cx, JSVAL_NULL, (gpsee_verbosity(0) >= GSR_FORCE_STACK_DUMP_VERBOSITY) || ((gpsee_verbosity(0) >= GPSEE_ERROR_OUTPUT_VERBOSITY) && isatty(STDERR_FILENO))); } else { I->grt->exitType = et_finished; rc = RPMRC_OK; } } else { char *const * Ienviron = NULL; if (F_ISSET(js->flags, ALLOW)) { #if defined(__APPLE__) Ienviron = (char *const *) _NSGetEnviron(); #else Ienviron = environ; #endif } I->grt->exitType = et_execFailure; if (gpsee_runProgramModule(I->cx, fn, NULL, fp, Iargv, Ienviron) == JS_FALSE) { int code = gpsee_getExceptionExitCode(I->cx); if (code >= 0) { I->grt->exitType = et_requested; I->grt->exitCode = code; /* XXX FIXME: format and return code in *resultp. */ /* XXX hack tp get code into rc -> ec by negating */ rc = -code; } else if (JS_IsExceptionPending(I->cx)) { /* XXX FIXME: isatty(3) */ gpsee_reportUncaughtException(I->cx, JSVAL_NULL, (gpsee_verbosity(0) >= GSR_FORCE_STACK_DUMP_VERBOSITY) || ((gpsee_verbosity(0) >= GPSEE_ERROR_OUTPUT_VERBOSITY) && isatty(STDERR_FILENO))); } } else { I->grt->exitType = et_finished; rc = RPMRC_OK; } } fclose(fp); fp = NULL; #endif /* WITH_GPSEE */ } #if defined(WITH_GPSEE) exit: #endif /* WITH_GPSEE */ RPMJSDBG(0, (stderr, "<== %s(%p,%s) rc %d |%s|\n", __FUNCTION__, js, fn, rc, (resultp ? *resultp :""))); return rc; }