bool ScriptInterface::LoadGlobalScriptFile(const VfsPath& path) { JSAutoRequest rq(m->m_cx); JS::RootedObject global(m->m_cx, m->m_glob); if (!VfsFileExists(path)) { LOGERROR("File '%s' does not exist", path.string8()); return false; } CVFSFile file; PSRETURN ret = file.Load(g_VFS, path); if (ret != PSRETURN_OK) { LOGERROR("Failed to load file '%s': %s", path.string8(), GetErrorString(ret)); return false; } std::wstring code = wstring_from_utf8(file.DecodeUTF8()); // assume it's UTF-8 utf16string codeUtf16(code.begin(), code.end()); uint lineNo = 1; JS::RootedValue rval(m->m_cx); return JS_EvaluateUCScript(m->m_cx, global, reinterpret_cast<const jschar*> (codeUtf16.c_str()), (uint)(codeUtf16.length()), utf8_from_wstring(path.string()).c_str(), lineNo, &rval); }
bool ScriptInterface::LoadGlobalScriptFile(const VfsPath& path) { if (!VfsFileExists(path)) { LOGERROR(L"File '%ls' does not exist", path.string().c_str()); return false; } CVFSFile file; PSRETURN ret = file.Load(g_VFS, path); if (ret != PSRETURN_OK) { LOGERROR(L"Failed to load file '%ls': %hs", path.string().c_str(), GetErrorString(ret)); return false; } std::wstring code = wstring_from_utf8(file.DecodeUTF8()); // assume it's UTF-8 // Compile the code in strict mode, to encourage better coding practices and // to possibly help SpiderMonkey with optimisations std::wstring codeStrict = L"\"use strict\";\n" + code; utf16string codeUtf16(codeStrict.begin(), codeStrict.end()); uintN lineNo = 0; // put the automatic 'use strict' on line 0, so the real code starts at line 1 jsval rval; JSBool ok = JS_EvaluateUCScript(m->m_cx, m->m_glob, reinterpret_cast<const jschar*> (codeUtf16.c_str()), (uintN)(codeUtf16.length()), utf8_from_wstring(path.string()).c_str(), lineNo, &rval); return ok ? true : false; }
PyObject* Context_execute(Context* self, PyObject* args, PyObject* kwargs) { PyObject* obj = NULL; PyObject* ret = NULL; JSContext* cx = NULL; JSObject* root = NULL; JSString* script = NULL; jschar* schars = NULL; JSBool started_counter = JS_FALSE; size_t slen; jsval rval; JS_BeginRequest(self->cx); if(!PyArg_ParseTuple(args, "O", &obj)) goto error; script = py2js_string_obj(self, obj); if(script == NULL) goto error; schars = JS_GetStringChars(script); slen = JS_GetStringLength(script); cx = self->cx; root = self->root; // Mark us for time consumption if(self->start_time == 0) { started_counter = JS_TRUE; self->start_time = time(NULL); } if(!JS_EvaluateUCScript(cx, root, schars, slen, "<JavaScript>", 1, &rval)) { if(!PyErr_Occurred()) { PyErr_SetString(PyExc_RuntimeError, "Failed to execute script."); } goto error; } if(PyErr_Occurred()) goto error; ret = js2py(self, rval); JS_EndRequest(self->cx); JS_MaybeGC(self->cx); goto success; error: JS_EndRequest(self->cx); success: if(started_counter) { self->start_time = 0; } return ret; }
bool ScriptInterface::Eval_(const wchar_t* code, jsval& rval) { utf16string codeUtf16(code, code+wcslen(code)); JSBool ok = JS_EvaluateUCScript(m->m_cx, m->m_glob, (const jschar*)codeUtf16.c_str(), (uintN)codeUtf16.length(), "(eval)", 1, &rval); return ok ? true : false; }
bool ScriptInterface::Eval_(const wchar_t* code, JS::MutableHandleValue rval) { JSAutoRequest rq(m->m_cx); JS::RootedObject global(m->m_cx, m->m_glob); utf16string codeUtf16(code, code+wcslen(code)); return JS_EvaluateUCScript(m->m_cx, global, (const jschar*)codeUtf16.c_str(), (uint)codeUtf16.length(), "(eval)", 1, rval); }
bool ScriptInterface::LoadGlobalScript(const VfsPath& filename, const std::wstring& code) { JSAutoRequest rq(m->m_cx); JS::RootedObject global(m->m_cx, m->m_glob); utf16string codeUtf16(code.begin(), code.end()); uint lineNo = 1; JS::RootedValue rval(m->m_cx); return JS_EvaluateUCScript(m->m_cx, global, reinterpret_cast<const jschar*> (codeUtf16.c_str()), (uint)(codeUtf16.length()), utf8_from_wstring(filename.string()).c_str(), lineNo, &rval); }
jsval ScriptingHost::ExecuteScript(const CStrW& script, const CStrW& calledFrom, JSObject* contextObject ) { jsval rval; JSBool ok = JS_EvaluateUCScript(m_Context, contextObject ? contextObject : m_GlobalObject, reinterpret_cast<const jschar*>(script.utf16().c_str()), (int)script.length(), calledFrom.ToUTF8().c_str(), 1, &rval); if (!ok) return JSVAL_NULL; return rval; }
static JSBool evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { JSString *str; JSObject *sandbox; JSContext *subcx; const jschar *src; size_t srclen; JSBool ret = JS_FALSE; char *name = NULL; sandbox = NULL; if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox)) { return JS_FALSE; } subcx = JS_NewContext(JS_GetRuntime(cx), 8L * 1024L); if(!subcx) { JS_ReportOutOfMemory(cx); return JS_FALSE; } SETUP_REQUEST(subcx); src = JS_GetStringChars(str); srclen = JS_GetStringLength(str); if(!sandbox) { sandbox = JS_NewObject(subcx, NULL, NULL, NULL); if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) { goto done; } } if(argc > 2) { name = enc_string(cx, argv[2], NULL); } if(srclen == 0) { *rval = OBJECT_TO_JSVAL(sandbox); } else { JS_EvaluateUCScript(subcx, sandbox, src, srclen, name, 1, rval); } ret = JS_TRUE; done: if(name) JS_free(cx, name); FINISH_REQUEST(subcx); JS_DestroyContext(subcx); return ret; }
static JSBool evalcx(JSContext *cx, uintN argc, jsval* vp) { jsval* argv = JS_ARGV(cx, vp); JSString *str; JSObject *sandbox; JSContext *subcx; const jschar *src; size_t srclen; jsval rval; JSBool ret = JS_FALSE; sandbox = NULL; if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox)) { return JS_FALSE; } subcx = JS_NewContext(JS_GetRuntime(cx), 8L * 1024L); if(!subcx) { JS_ReportOutOfMemory(cx); return JS_FALSE; } SETUP_REQUEST(subcx); src = JS_GetStringChars(str); srclen = JS_GetStringLength(str); if(!sandbox) { sandbox = JS_NewObject(subcx, NULL, NULL, NULL); if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) { goto done; } } if(srclen == 0) { JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(sandbox)); } else { JS_EvaluateUCScript(subcx, sandbox, src, srclen, NULL, 0, &rval); JS_SET_RVAL(cx, vp, rval); } ret = JS_TRUE; done: FINISH_REQUEST(subcx); JS_DestroyContext(subcx); return ret; }
bool ScriptInterface::LoadGlobalScript(const VfsPath& filename, const std::string& code) { // Compile the code in strict mode, to encourage better coding practices and // to possibly help SpiderMonkey with optimisations std::wstring codeStrict = L"\"use strict\";\n" + wstring_from_utf8(code); utf16string codeUtf16(codeStrict.begin(), codeStrict.end()); uintN lineNo = 0; // put the automatic 'use strict' on line 0, so the real code starts at line 1 jsval rval; JSBool ok = JS_EvaluateUCScript(m->m_cx, m->m_glob, reinterpret_cast<const jschar*> (codeUtf16.c_str()), (uintN)(codeUtf16.length()), utf8_from_wstring(filename.string()).c_str(), lineNo, &rval); return ok ? true : false; }
bool JetpackChild::RecvEvalScript(const nsString& code) { JSAutoRequest request(mCx); JSObject *global = JS_GetGlobalObject(mCx); JSAutoEnterCompartment ac; if (!ac.enter(mCx, global)) return false; jsval ignored; (void) JS_EvaluateUCScript(mCx, global, code.get(), code.Length(), "", 1, &ignored); return true; }
JSBool JetpackChild::EvalInSandbox(JSContext* cx, uintN argc, jsval* vp) { if (argc != 2) { JS_ReportError(cx, "evalInSandbox takes two arguments"); return JS_FALSE; } jsval* argv = JS_ARGV(cx, vp); JSObject* obj; if (!JSVAL_IS_OBJECT(argv[0]) || !(obj = JSVAL_TO_OBJECT(argv[0]))) { JS_ReportError(cx, "The first argument to evalInSandbox must be a global object created using createSandbox."); JS_ASSERT(JS_FALSE); return JS_FALSE; } // Unwrap, and switch compartments obj = js::UnwrapObject(obj); JSAutoEnterCompartment ac; if (!ac.enter(cx, obj)) return JS_FALSE; if (&sGlobalClass != JS_GetClass(cx, obj) || obj == JS_GetGlobalObject(cx)) { JS_ReportError(cx, "The first argument to evalInSandbox must be a global object created using createSandbox."); JS_ASSERT(JS_FALSE); return JS_FALSE; } if (!JS_WrapValue(cx, &argv[1])) return JS_FALSE; JSString* str = JS_ValueToString(cx, argv[1]); if (!str) return JS_FALSE; size_t length; const jschar* chars = JS_GetStringCharsAndLength(cx, str, &length); if (!chars) return JS_FALSE; js::AutoValueRooter ignored(cx); return JS_EvaluateUCScript(cx, obj, chars, length, "", 1, ignored.jsval_addr()); }
// globalObject defaults to 0 (in which case we use our m_GlobalObject). void ScriptingHost::RunScript(const VfsPath& pathname, JSObject* globalObject) { if(!globalObject) globalObject = m_GlobalObject; shared_ptr<u8> buf; size_t size; if(g_VFS->LoadFile(pathname, buf, size) != INFO::OK) // ERRTODO: translate/pass it on throw PSERROR_Scripting_LoadFile_OpenFailed(); std::wstring scriptw = wstring_from_utf8(std::string(buf.get(), buf.get() + size)); utf16string script(scriptw.begin(), scriptw.end()); jsval rval; JSBool ok = JS_EvaluateUCScript(m_Context, globalObject, reinterpret_cast<const jschar*>(script.c_str()), (uintN)script.size(), utf8_from_wstring(pathname.string()).c_str(), 1, &rval); if (ok == JS_FALSE) throw PSERROR_Scripting_LoadFile_EvalErrors(); }
PyObject* Context_execute(Context* self, PyObject* args, PyObject* kwargs) { PyObject* obj = NULL; PyObject* ret = NULL; JSContext* cx = NULL; JSObject* root = NULL; JSString* script = NULL; jschar* schars = NULL; JSBool started_counter = JS_FALSE; char *fname = "<anonymous JavaScript>"; unsigned int lineno = 1; size_t slen; jsval rval; char *keywords[] = {"code", "filename", "lineno", NULL}; if(!PyArg_ParseTupleAndKeywords(args, kwargs, "O|sI", keywords, &obj, &fname, &lineno)) goto error; JS_BeginRequest(self->cx); script = py2js_string_obj(self, obj); if(script == NULL) goto error; schars = JS_GetStringChars(script); slen = JS_GetStringLength(script); cx = self->cx; root = self->root; // Mark us for time consumption if(self->start_time == 0) { started_counter = JS_TRUE; self->start_time = time(NULL); } if(!JS_EvaluateUCScript(cx, root, schars, slen, fname, lineno, &rval)) { if(!PyErr_Occurred()) { PyErr_SetString(PyExc_RuntimeError, "Script execution failed and no exception was set"); } goto error; } if(PyErr_Occurred()) goto error; ret = js2py(self, rval); JS_EndRequest(self->cx); JS_MaybeGC(self->cx); goto success; error: JS_EndRequest(self->cx); success: if(started_counter) { self->start_time = 0; } return ret; }
gboolean gjs_context_eval(GjsContext *js_context, const char *script, gssize script_len, const char *filename, int *exit_status_p, GError **error) { int line_number; jsval retval; gboolean success; gunichar2 *u16_script; glong u16_script_len; g_object_ref(G_OBJECT(js_context)); if (exit_status_p) *exit_status_p = 1; /* "Failure" (like a shell script) */ /* whether we evaluated the script OK; not related to whether * script returned nonzero. We set GError if success = FALSE */ success = TRUE; /* handle scripts with UNIX shebangs */ line_number = 1; if (script != NULL && script[0] == '#' && script[1] == '!') { const char *s; s = (const char *) strstr (script, "\n"); if (s != NULL) { if (script_len > 0) script_len -= (s + 1 - script); script = s + 1; line_number = 2; } } if ((u16_script = g_utf8_to_utf16 (script, script_len, NULL, &u16_script_len, error)) == NULL) return FALSE; g_assert (u16_script_len < G_MAXUINT); /* log and clear exception if it's set (should not be, normally...) */ if (gjs_log_exception(js_context->context, NULL)) { gjs_debug(GJS_DEBUG_CONTEXT, "Exception was set prior to JS_EvaluateScript()"); } /* JS_EvaluateScript requires a request even though it sort of seems like * it means we're always in a request? */ gjs_runtime_push_context(js_context->runtime, js_context->context); JS_BeginRequest(js_context->context); retval = JSVAL_VOID; if (!JS_EvaluateUCScript(js_context->context, js_context->global, (const jschar*)u16_script, (guint) u16_script_len, filename, line_number, &retval)) { char *message; gjs_debug(GJS_DEBUG_CONTEXT, "Script evaluation failed"); /* if message is NULL then somehow exception wasn't set */ message = NULL; gjs_log_exception(js_context->context, &message); if (message) { g_set_error(error, GJS_ERROR, GJS_ERROR_FAILED, "%s", message); g_free(message); } else { gjs_debug(GJS_DEBUG_CONTEXT, "JS_EvaluateScript() failed but no exception message?"); g_set_error(error, GJS_ERROR, GJS_ERROR_FAILED, "JS_EvaluateScript() failed but no exception message?"); } success = FALSE; } g_free (u16_script); gjs_debug(GJS_DEBUG_CONTEXT, "Script evaluation succeeded"); if (gjs_log_exception(js_context->context, NULL)) { g_set_error(error, GJS_ERROR, GJS_ERROR_FAILED, "Exception was set even though JS_EvaluateScript() returned true - did you gjs_throw() but not return false somewhere perhaps?"); success = FALSE; } if (success && exit_status_p) { if (JSVAL_IS_INT(retval)) { int code; if (JS_ValueToInt32(js_context->context, retval, &code)) { gjs_debug(GJS_DEBUG_CONTEXT, "Script returned integer code %d", code); *exit_status_p = code; } } else { /* Assume success if no integer was returned */ *exit_status_p = 0; } } JS_EndRequest(js_context->context); gjs_runtime_pop_context(js_context->runtime); g_object_unref(G_OBJECT(js_context)); return success; }