bool initJSTTY( JSContext *cx, JSObject *glob ) { ttyProto = JS_InitClass( cx, glob, NULL, &jsTTYClass_, jsTTY, 1, ttyProperties_, methods_, 0, 0 ); if( ttyProto ) { JS_AddRoot( cx, &ttyProto ); if( JS_DefineFunctions( cx, glob, functions_ ) ) { JSObject *console = JS_NewObject( cx, &jsTTYClass_, ttyProto, glob ); if( console ) { JS_DefineProperty( cx, glob, "tty", OBJECT_TO_JSVAL( console ), 0, 0, JSPROP_ENUMERATE |JSPROP_PERMANENT |JSPROP_READONLY ); JS_AddRoot( cx, &onLineInCode_ ); JS_AddRoot( cx, &onLineInScope_ ); tty_ = new jsTTY_t ; } } } return false ; }
jsInputPoll_t::jsInputPoll_t( char const *fileName ) : inputPoll_t( pollHandlers_, fileName ) , handlerObj_( JSVAL_NULL ) , handlerCode_( JSVAL_NULL ) { JS_AddRoot( execContext_, &handlerObj_ ); JS_AddRoot( execContext_, &handlerCode_ ); }
/* * - Routine used to handle all important initialization. * - If 'false' is returned, the interface must not be used. */ bool ScriptInterface::Init(JSContext* context, JSObject* object) { if (!context || !object) return false; m_Context = context; if (!JS_AddRoot(m_Context, &m_OnUpdateFunc)) { m_Context = NULL; return false; } if (!JS_AddRoot(m_Context, &m_OnRenderFunc)) { m_Context = NULL; JS_RemoveRoot(m_Context, &m_OnUpdateFunc); return false; } if (!JS_AddRoot(m_Context, &m_OnBirthFunc)) { m_Context = NULL; JS_RemoveRoot(m_Context, &m_OnUpdateFunc); JS_RemoveRoot(m_Context, &m_OnRenderFunc); return false; } if (!JS_AddRoot(m_Context, &m_OnDeathFunc)) { m_Context = NULL; JS_RemoveRoot(m_Context, &m_OnUpdateFunc); JS_RemoveRoot(m_Context, &m_OnRenderFunc); JS_RemoveRoot(m_Context, &m_OnBirthFunc); return false; } if (!JS_AddRoot(m_Context, &m_TextureObject)) { m_Context = NULL; JS_RemoveRoot(m_Context, &m_OnUpdateFunc); JS_RemoveRoot(m_Context, &m_OnRenderFunc); JS_RemoveRoot(m_Context, &m_OnBirthFunc); JS_RemoveRoot(m_Context, &m_OnDeathFunc); return false; } m_Object = object; return true; }
/* C function bound to a Javascript function of the same name. Called when a prompt dialogue is dissmissed */ static JSBool PromptDismiss(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { WebcJSDocumentContext *jsmgr = (WebcJSDocumentContext *) jhutil_GetPrivate(cx, obj); if (argc > 0) { JSString *user_input; user_input = JS_ValueToString(cx, *argv); JS_AddRoot(cx, &user_input); WEBC_CHAR *user_string = WEBC_JS_STRING_TO_WEBC_STRING(user_input); WebString *user_WebString; int user_len = webc_strlen(user_string); WEBC_NEW_VERBOSE(user_WebString, WebString(user_len+1),"JsPrompDismissDialog"); if (user_WebString) user_WebString->copy(user_string, user_len+1); JS_RemoveRoot(cx, &user_input); HTMLDocument *pDoc = (jsmgr)? jsmgr->GetDocument() : 0; HDOC_HANDLE doc = (HDOC_HANDLE) pDoc; if (doc) { HBROWSER_HANDLE hbrowser = webc_DocGetBrowser(doc); if (hbrowser) { void* privateData = webc_BrowserGetPrivateData(hbrowser); privateData = (void *) user_WebString; webc_BrowserSetPrivateData(hbrowser, privateData); } } } return (JS_TRUE); }
PyObject* js2py_function(Context* cx, jsval val, jsval parent) { Function* ret = NULL; if(parent == JSVAL_VOID || !JSVAL_IS_OBJECT(parent)) { PyErr_BadInternalCall(); goto error; } ret = (Function*) make_object(FunctionType, cx, val); if(ret == NULL) goto error; ret->parent = parent; if(!JS_AddRoot(cx->cx, &(ret->parent))) { PyErr_SetString(PyExc_RuntimeError, "Failed to add GC root."); goto error; } goto success; error: Py_XDECREF((PyObject*)ret); ret = NULL; // In case of AddRoot error. success: return (PyObject*) ret; }
static JSBool SetContextObj(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { nsJSSh* shell; if (!GetJSShGlobal(cx, obj, &shell)) return JS_FALSE; JSAutoRequest ar(cx); if (argc!=1) return JS_FALSE; JSObject *arg_obj; if (!JS_ValueToObject(cx, argv[0], &arg_obj)) { return JS_FALSE; } if (shell->mContextObj != shell->mGlobal) JS_RemoveRoot(cx, &(shell->mContextObj)); shell->mContextObj = arg_obj; if (shell->mContextObj != shell->mGlobal) JS_AddRoot(cx, &(shell->mContextObj)); return JS_TRUE; }
jsUsblpPoll_t::jsUsblpPoll_t( JSObject *devObj ) : usblpPoll_t( pollHandlers_, DEFAULT_USBLB_DEV, 2<<20, // 2 MB 4096 ) , obj_( devObj ) { JS_AddRoot( execContext_, &obj_ ); }
static JSBool enumerate(JSContext *cx, JSObject *obj, JSIterateOp enum_op, jsval *statep, jsid *idp) { JSObject *iterator; switch (enum_op) { case JSENUMERATE_INIT: if (resolverHasMethod(cx, obj, "enumerate")) { if (!delegateToResolver(cx, obj, "enumerate", 0, NULL, statep)) return JS_FALSE; if (!JSVAL_IS_OBJECT(*statep)) { JS_ReportError(cx, "Expected enumerate() to return an iterator."); return JS_FALSE; } *idp = JSVAL_ZERO; JS_AddRoot(cx, statep); return JS_TRUE; } // TODO: Default behavior? JS_ReportError(cx, "Enumeration is not implemented on this object."); return JS_FALSE; case JSENUMERATE_NEXT: jsval rval; iterator = JSVAL_TO_OBJECT(*statep); if (!JS_CallFunctionName(cx, iterator, "next", 0, NULL, &rval)) { if (JS_IsExceptionPending(cx)) { jsval exception; if (!JS_GetPendingException(cx, &exception)) return JS_FALSE; if (!JSVAL_IS_OBJECT(exception)) return JS_FALSE; JSClass *clasp = JS_GET_CLASS(cx, JSVAL_TO_OBJECT(exception)); if (clasp && JSCLASS_CACHED_PROTO_KEY(clasp) == JSProto_StopIteration) { JS_ClearPendingException(cx); *statep = JSVAL_NULL; JS_RemoveRoot(cx, statep); return JS_TRUE; } } return JS_FALSE; } if (!JS_ValueToId(cx, rval, idp)) return JS_FALSE; return JS_TRUE; case JSENUMERATE_DESTROY: JS_RemoveRoot(cx, statep); return JS_TRUE; default: JS_ReportError(cx, "Unknown enum_op"); return JS_FALSE; } }
bool ScriptInterface::StartProtection() { bool succeeded = JS_AddRoot(m_Context, &m_Object) == JS_TRUE; if (succeeded) m_Protected = true; return succeeded; }
root<T>::root(T const &o) : T(o) { JSBool status; status = JS_AddRoot( Impl::current_context(), T::get_gcptr()); if (status == JS_FALSE) { throw exception("Cannot root Javascript value"); } }
static void gulong gom_signal_connect_script (JSContext *cx, JSObject *obj, const char *signal, const char *script, gsize scriptlen, GError **error) { SignalData *data = NULL; GObject *gobj; guint signal_id; GCallback c_handler; gobj = gom_js_object_get_g_object (cx, obj); if (!gobj) { g_printerr ("Could not find GObject for JSObject %p\n", obj); return 0; } signal_id = g_signal_lookup (signal, G_TYPE_FROM_INSTANCE (gobj)); if (!signal_id) { g_printerr ("Could not find signal %s for %s %p\n", signal, g_type_name (G_TYPE_FROM_INSTANCE (gobj)), gobj); return; } data = g_new0 (SignalData, 1); data->node = g_hash_table_lookup (signals, GINT_TO_POINTER (signal_id)); if (!data->node) { g_printerr ("Could not find signal node for signal %s on %s %p\n", signal, g_type_name (G_TYPE_FROM_INSTANCE (gobj)), gobj); goto script_fail; } data->script = JS_CompileScript (cx, obj, script, scriptlen, "<script">, 0); if (!data->script) { g_perinterr ("Error compiling script '%.*s'\n", script, scriptlen); goto script_fail; } data->scriptobj = JS_NewScriptObject (cx, data->script); if (!data->scriptobj || !JS_AddRoot (cx, &data->scriptobj)) { goto script_fail; } }
bool initJSSerial( JSContext *cx, JSObject *glob ) { spProto = JS_InitClass( cx, glob, NULL, &jsSerialPortClass_, jsSerialPort, 1, spProperties_, serialPort_methods, 0, 0 ); if( spProto ) { JS_AddRoot( cx, &spProto ); return true ; } else JS_ReportError( cx, "initializing scanner class" ); return false ; }
bool initJSUsbLp( JSContext *cx, JSObject *glob ) { lpProto = JS_InitClass( cx, glob, NULL, &jsUsblpClass_, jsUsblp, 1, lpProperties_, usblp_methods, 0, 0 ); if( lpProto ) { JS_AddRoot( cx, &lpProto ); return true ; } else JS_ReportError( cx, "initializing scanner class" ); return false ; }
static JSBool jsOnWheel( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { *rval = JSVAL_FALSE ; if( (1 == argc) && (JSTYPE_FUNCTION == JS_TypeOfValue(cx, argv[0]))){ if( JSVAL_VOID != onWheelCode_ ){ JS_RemoveRoot( cx, &onWheelCode_ ); } onWheelCode_ = argv[0]; JS_AddRoot( cx, &onWheelCode_ ); *rval = JSVAL_TRUE ; } else JS_ReportError(cx,"Usage: onWheel(function);\n" ); return JS_TRUE ; }
jsPort_t :: jsPort_t ( pollHandlerSet_t &set, char const *devName, int baud, int databits, char parity, int outDelay, // inter-character delay on output char terminator, // end-of-line char unsigned inputTimeout, jsval object, JSObject *scope ) : serialPoll_t( set, devName, baud, databits, parity, outDelay, terminator, inputTimeout ) , object_( object ) , scope_( scope ) { JS_AddRoot( execContext_, &object_ ); JS_SetPrivate( execContext_, scope_, this ); }
bool initJSTouch( JSContext *cx, JSObject *glob ) { JSObject *rval = JS_InitClass( cx, glob, NULL, &jsTouchClass_, touch, 1, touchProperties_, touchMethods_, 0, 0 ); if( rval ) { if( JS_DefineFunctions( cx, glob, touch_functions ) ) { JSObject *obj = JS_NewObject( cx, &jsTouchClass_, NULL, NULL ); if( obj ) { // // root // JS_DefineProperty( cx, glob, "touchScreen", OBJECT_TO_JSVAL( obj ), 0, 0, JSPROP_ENUMERATE |JSPROP_PERMANENT |JSPROP_READONLY ); inputDevs_t devs ; for( unsigned i = 0 ; i < devs.count(); i++ ){ inputDevs_t::type_e type ; unsigned evIdx ; devs.getInfo(i,type,evIdx); if( inputDevs_t::TOUCHSCREEN == type ){ char devName[512]; snprintf( devName, sizeof(devName),"/dev/input/event%u", evIdx ); touchPoll_ = new jsTouchPoll_t( devName ); JS_AddRoot( cx, &touchPoll_->onTouchCode_ ); JS_AddRoot( cx, &touchPoll_->onMoveCode_ ); JS_AddRoot( cx, &touchPoll_->onReleaseCode_ ); JS_AddRoot( cx, &touchPoll_->onTouchObject_ ); JS_AddRoot( cx, &touchPoll_->onReleaseObject_ ); JS_AddRoot( cx, &touchPoll_->onMoveObject_ ); return true ; } } } else JS_ReportError( cx, "defining touch screen" ); } } return false ; }
static void sajsj_InitLocked() { JRIEnv *env; /* if jsj has already been initialized, we don't do this * standalone jsj setup, and none of the stuff in this * file gets used */ if (!JSJ_Init(&sajsjCallbacks)) return; jsjiTask = JS_Init(8L * 1024L * 1024L); jsmon = PR_NewMonitor(); globalContext = JS_NewContext(jsjiTask, 8192); PR_ASSERT(globalContext); globalObject = NULL; JS_AddRoot(globalContext, &globalObject); globalObject = JS_NewObject(globalContext, &sajsj_global_class, NULL, NULL); if (!globalObject) { PR_ASSERT(globalObject); goto trash_cx; } if (!JS_InitStandardClasses(globalContext, globalObject)) goto trash_cx; if (!JSJ_InitContext(globalContext, globalObject)) goto trash_cx; env = JRI_GetCurrentEnv(); PR_ASSERT(env); return; trash_cx: JS_DestroyContext(globalContext); globalContext = NULL; /* FIXME error codes? */ return; }
static gboolean closure_source_func(void *data) { jsval retval; GClosure *closure; JSBool bool_val; JSContext *context; closure = data; context = gjs_closure_get_context(closure); if (context == NULL) { /* closure is invalid now */ return FALSE; } JS_BeginRequest(context); retval = JSVAL_VOID; JS_AddRoot(context, &retval); gjs_closure_invoke(closure, 0, NULL, &retval); /* ValueToBoolean pretty much always succeeds, just as * JavaScript always makes some sense of any value in * an "if (value) {}" context. */ if (!JS_ValueToBoolean(context, retval, &bool_val)) bool_val = FALSE; JS_RemoveRoot(context, &retval); JS_EndRequest(context); return bool_val; }
JSONParser * js_BeginJSONParse(JSContext *cx, jsval *rootVal) { if (!cx) return NULL; JSObject *arr = JS_NewArrayObject(cx, 0, NULL); if (!arr) return NULL; JSONParser *jp = (JSONParser*) JS_malloc(cx, sizeof(JSONParser)); if (!jp) return NULL; jp->buffer = NULL; jp->objectStack = arr; if (!JS_AddRoot(cx, jp->objectStack)) goto bad; jp->hexChar = 0; jp->numHex = 0; jp->statep = jp->stateStack; *jp->statep = JSON_PARSE_STATE_INIT; jp->rootVal = rootVal; jp->objectKey = NULL; jp->buffer = (JSStringBuffer*) JS_malloc(cx, sizeof(JSStringBuffer)); if (!jp->buffer) goto bad; js_InitStringBuffer(jp->buffer); return jp; bad: JS_free(cx, jp->buffer); JS_free(cx, jp); return NULL; }
int main(int argc, const char* argv[]) { JSRuntime* rt = NULL; JSContext* cx = NULL; JSObject* global = NULL; JSObject* klass = NULL; JSScript* script; JSString* scriptsrc; jschar* schars; size_t slen; jsval sroot; jsval result; couch_args* args = couch_parse_args(argc, argv); rt = JS_NewRuntime(64L * 1024L * 1024L); if(rt == NULL) return 1; cx = JS_NewContext(rt, args->stack_size); if(cx == NULL) return 1; JS_SetErrorReporter(cx, couch_error); JS_ToggleOptions(cx, JSOPTION_XML); SETUP_REQUEST(cx); global = JS_NewObject(cx, &global_class, NULL, NULL); if(global == NULL) return 1; JS_SetGlobalObject(cx, global); if(!JS_InitStandardClasses(cx, global)) return 1; if(couch_load_funcs(cx, global, global_functions) != JS_TRUE) return 1; if(args->use_http) { http_check_enabled(); klass = JS_InitClass( cx, global, NULL, &CouchHTTPClass, req_ctor, 0, CouchHTTPProperties, CouchHTTPFunctions, NULL, NULL ); if(!klass) { fprintf(stderr, "Failed to initialize CouchHTTP class.\n"); exit(2); } } // Convert script source to jschars. scriptsrc = dec_string(cx, args->script, strlen(args->script)); if(!scriptsrc) return 1; schars = JS_GetStringChars(scriptsrc); slen = JS_GetStringLength(scriptsrc); // Root it so GC doesn't collect it. sroot = STRING_TO_JSVAL(scriptsrc); if(JS_AddRoot(cx, &sroot) != JS_TRUE) { fprintf(stderr, "Internal root error.\n"); return 1; } // Compile and run script = JS_CompileUCScript(cx, global, schars, slen, args->script_name, 1); if(!script) { fprintf(stderr, "Failed to compile script.\n"); return 1; } JS_ExecuteScript(cx, global, script, &result); // Warning message if we don't remove it. JS_RemoveRoot(cx, &sroot); FINISH_REQUEST(cx); JS_DestroyContext(cx); JS_DestroyRuntime(rt); JS_ShutDown(); return 0; }
/* --- helpers */ static JSObject * rpmhdrLoadTag(JSContext *cx, JSObject *obj, Header h, rpmTag tag, jsval *vp) { HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he)); JSObject * arr; jsval v; JSObject * retobj = NULL; JSBool ok; const char * name = tagName(tag); int i; if (_debug) fprintf(stderr, "==> %s(%p,%p,%p,%s)\n", __FUNCTION__, cx, obj, h, name); he->tag = tag; if (headerGet(h, he, 0)) { if (_debug < 0) fprintf(stderr, "\t%s(%u) %u %p[%u]\n", name, (unsigned)he->tag, (unsigned)he->t, he->p.ptr, (unsigned)he->c); switch (he->t) { default: goto exit; /*@notreached@*/ break; case RPM_BIN_TYPE: /* XXX return as array of octets for now. */ case RPM_UINT8_TYPE: arr = JS_NewArrayObject(cx, 0, NULL); ok = JS_AddRoot(cx, &arr); for (i = 0; i < (int)he->c; i++) { v = INT_TO_JSVAL(he->p.ui8p[i]); ok = JS_SetElement(cx, arr, i, &v); } ok = JS_DefineProperty(cx, obj, name, (v=OBJECT_TO_JSVAL(arr)), NULL, NULL, JSPROP_ENUMERATE); (void) JS_RemoveRoot(cx, &arr); if (!ok) goto exit; retobj = obj; if (vp) *vp = v; break; case RPM_UINT16_TYPE: arr = JS_NewArrayObject(cx, 0, NULL); ok = JS_AddRoot(cx, &arr); for (i = 0; i < (int)he->c; i++) { v = INT_TO_JSVAL(he->p.ui16p[i]); ok = JS_SetElement(cx, arr, i, &v); } ok = JS_DefineProperty(cx, obj, name, (v=OBJECT_TO_JSVAL(arr)), NULL, NULL, JSPROP_ENUMERATE); (void) JS_RemoveRoot(cx, &arr); if (!ok) goto exit; retobj = obj; if (vp) *vp = v; break; case RPM_UINT32_TYPE: arr = JS_NewArrayObject(cx, 0, NULL); ok = JS_AddRoot(cx, &arr); for (i = 0; i < (int)he->c; i++) { if (!JS_NewNumberValue(cx, he->p.ui32p[i], &v)) v = JSVAL_VOID; ok = JS_SetElement(cx, arr, i, &v); } ok = JS_DefineProperty(cx, obj, name, (v=OBJECT_TO_JSVAL(arr)), NULL, NULL, JSPROP_ENUMERATE); (void) JS_RemoveRoot(cx, &arr); if (!ok) goto exit; retobj = obj; if (vp) *vp = v; break; case RPM_UINT64_TYPE: arr = JS_NewArrayObject(cx, 0, NULL); ok = JS_AddRoot(cx, &arr); for (i = 0; i < (int)he->c; i++) { if (!JS_NewNumberValue(cx, he->p.ui64p[i], &v)) v = JSVAL_VOID; ok = JS_SetElement(cx, arr, i, &v); } ok = JS_DefineProperty(cx, obj, name, (v=OBJECT_TO_JSVAL(arr)), NULL, NULL, JSPROP_ENUMERATE); (void) JS_RemoveRoot(cx, &arr); if (!ok) goto exit; retobj = obj; if (vp) *vp = v; break; case RPM_STRING_ARRAY_TYPE: arr = JS_NewArrayObject(cx, 0, NULL); ok = JS_AddRoot(cx, &arr); for (i = 0; i < (int)he->c; i++) { v = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, he->p.argv[i])); ok = JS_SetElement(cx, arr, i, &v); } ok = JS_DefineProperty(cx, obj, name, (v=OBJECT_TO_JSVAL(arr)), NULL, NULL, JSPROP_ENUMERATE); (void) JS_RemoveRoot(cx, &arr); if (!ok) goto exit; retobj = obj; if (vp) *vp = v; break; case RPM_I18NSTRING_TYPE: /* XXX FIXME: is this ever seen? */ fprintf(stderr, "==> FIXME: %s(%d) t %d %p[%u]\n", tagName(he->tag), he->tag, he->t, he->p.ptr, he->c); /*@fallthrough@*/ case RPM_STRING_TYPE: ok = JS_DefineProperty(cx, obj, name, (v=STRING_TO_JSVAL(JS_NewStringCopyZ(cx, he->p.str))), NULL, NULL, JSPROP_ENUMERATE); if (!ok) goto exit; retobj = obj; if (vp) *vp = v; break; } } exit: if (_debug < 0) fprintf(stderr, "\tretobj %p vp %p *vp 0x%lx(%u)\n", retobj, vp, (unsigned long)(vp ? *vp : 0), (unsigned)(vp ? JSVAL_TAG(*vp) : 0)); return retobj; }
native_netscape_javascript_JSObject_call( JRIEnv* env, struct netscape_javascript_JSObject* self, struct java_lang_String *method, jobjectArray args) { #ifndef JAVA return NULL; #else JSContext *cx; JSObject *jso; JSSavedState saved; const char *cstr; struct java_lang_Object *ret; int total_argc, argc, i; jsval *argv; jsval rval; int cost = 0; if (!enterJS(env, self, &cx, &jso, &saved)) return NULL; if (! method || ! (cstr = JRI_GetStringPlatformChars(env, method, (const jbyte *) cx->charSetName, (jint) cx->charSetNameLength))) { /* FIXME this should be an error of some sort */ js_throwJSException(env, "illegal member name"); ret = NULL; goto do_exit; } if (args) { total_argc = JRI_GetObjectArrayLength(env, args); argv = sysMalloc(total_argc * sizeof(jsval)); } else { total_argc = 0; argv = 0; } for (argc = 0; argc < total_argc; argc++) { jref arg = JRI_GetObjectArrayElement(env, args, argc); if (!js_convertJObjectToJSValue(cx, argv+argc, (HObject*)arg)) goto cleanup_argv; JS_AddRoot(cx, argv+argc); } if (! JS_CallFunctionName(cx, jso, cstr, argc, argv, &rval) || ! js_convertJSValueToJObject((HObject **) &ret, cx, rval, 0, 0, JS_FALSE, &cost)) { ret = NULL; } cleanup_argv: for (i = 0; i < argc; i++) JS_RemoveRoot(cx, argv+i); sysFree(argv); do_exit: if (!exitJS(env, self, cx, jso, &saved)) return NULL; return ret; #endif }
/** * call a method of Native JSObject. * * @param jEnv - JNIEnv on which the call is being made. * @param obj - A Native JS Object. * @param name - Name of a method. * @param jobjArr - Array of jobjects representing parameters of method being caled. * @param pjobj - return value. */ NS_METHOD nsCLiveconnect::Call(JNIEnv *jEnv, lcjsobject obj, const jchar *name, jsize length, jobjectArray java_args, void* principalsArray[], int numPrincipals, nsISupports *securitySupports, jobject *pjobj) { if(jEnv == NULL || obj == 0) { return NS_ERROR_FAILURE; } int i = 0; int argc = 0; int arg_num = 0; jsval *argv = 0; JSJavaThreadState *jsj_env = NULL; JSObjectHandle *handle = (JSObjectHandle*)obj; JSObject *js_obj = handle->js_obj; JSContext *cx = NULL; jsval js_val; jsval function_val = 0; int dummy_cost = 0; JSBool dummy_bool = PR_FALSE; JSErrorReporter saved_state = NULL; jobject result = NULL; jsj_env = jsj_enter_js(jEnv, mJavaClient, NULL, &cx, NULL, &saved_state, principalsArray, numPrincipals, securitySupports); if (!jsj_env) return NS_ERROR_FAILURE; result = NULL; AutoPushJSContext autopush(securitySupports, cx); if (NS_FAILED(autopush.ResultOfPush())) goto done; if (!name) { JS_ReportError(cx, "illegal null JavaScript function name"); goto done; } /* Allocate space for JS arguments */ argc = java_args ? jEnv->GetArrayLength(java_args) : 0; if (argc) { argv = (jsval*)JS_malloc(cx, argc * sizeof(jsval)); if (!argv) goto done; } else { argv = 0; } /* Convert arguments from Java to JS values */ for (arg_num = 0; arg_num < argc; arg_num++) { jobject arg = jEnv->GetObjectArrayElement(java_args, arg_num); JSBool ret = jsj_ConvertJavaObjectToJSValue(cx, jEnv, arg, &argv[arg_num]); jEnv->DeleteLocalRef(arg); if (!ret) goto cleanup_argv; JS_AddRoot(cx, &argv[arg_num]); } if (!JS_GetUCProperty(cx, js_obj, name, length, &function_val)) goto cleanup_argv; if (!JS_CallFunctionValue(cx, js_obj, function_val, argc, argv, &js_val)) goto cleanup_argv; jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), &dummy_cost, &result, &dummy_bool); cleanup_argv: if (argv) { for (i = 0; i < arg_num; i++) JS_RemoveRoot(cx, &argv[i]); JS_free(cx, argv); } done: if (!jsj_exit_js(cx, jsj_env, saved_state)) return NS_ERROR_FAILURE; *pjobj = result; return NS_OK; }
static JSBool log_and_maybe_keep_exception(JSContext *context, char **message_p, gboolean keep) { jsval exc = JSVAL_VOID; JSString *s; char *message; JSBool retval = JS_FALSE; JS_BeginRequest(context); if (message_p) *message_p = NULL; JS_AddRoot(context, &exc); if (!JS_GetPendingException(context, &exc)) goto out; JS_ClearPendingException(context); s = JS_ValueToString(context, exc); if (s == NULL) { gjs_debug(GJS_DEBUG_ERROR, "Failed to convert exception to string"); goto out; /* Exception should be thrown already */ } if (!gjs_string_to_utf8(context, STRING_TO_JSVAL(s), &message)) { gjs_debug(GJS_DEBUG_ERROR, "Failed to convert exception string to UTF-8"); goto out; /* Error already set */ } gjs_debug(GJS_DEBUG_ERROR, "Exception was: %s", message); if (message_p) { *message_p = message; } else { g_free(message); } gjs_log_exception_props(context, exc); /* We clear above and then set it back so any exceptions * from the logging process don't overwrite the original */ if (keep) JS_SetPendingException(context, exc); retval = JS_TRUE; out: JS_RemoveRoot(context, &exc); JS_EndRequest(context); return retval; }
static JSBool jsReadDir( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { *rval = JSVAL_FALSE ; if( ( 1 == argc ) && JSVAL_IS_STRING( argv[0] ) ) { JSString *sDirName = JSVAL_TO_STRING( argv[0] ); char const *dirName = JS_GetStringBytes( sDirName ); DIR *dir = opendir( dirName ); if( dir ) { JSObject *returnObj = JS_NewObject( cx, &jsDirClass_, NULL, NULL ); if( returnObj ) { *rval = OBJECT_TO_JSVAL( returnObj ); // root stringVector_t subDirs ; struct dirent *de ; while( 0 != ( de = readdir( dir ) ) ) { if( ( 0 != strcmp( ".", de->d_name ) ) && ( 0 != strcmp( "..", de->d_name ) ) ) { char fullPath[PATH_MAX]; sprintf( fullPath, "%s/%s", dirName, de->d_name ); struct stat st ; int stResult = stat( fullPath, &st ); if( 0 == stResult ) { if( !S_ISLNK( st.st_mode ) ) { if( !S_ISDIR( st.st_mode ) ) { JSObject *fileObj = JS_NewObject( cx, &jsDirClass_, NULL, NULL ); if( fileObj ) { if( !JS_DefineProperty( cx, returnObj, de->d_name, OBJECT_TO_JSVAL( fileObj ), 0, 0, JSPROP_ENUMERATE ) ) JS_ReportError( cx, "Attaching %s to %s", de->d_name, dirName ); if( !JS_DefineProperty( cx, fileObj, "mode", INT_TO_JSVAL( st.st_mode ), 0, 0, JSPROP_ENUMERATE ) ) JS_ReportError( cx, "Defining mode for %s/%s", dirName, de->d_name ); if( !JS_DefineProperty( cx, fileObj, "size", INT_TO_JSVAL( st.st_size ), 0, 0, JSPROP_ENUMERATE ) ) JS_ReportError( cx, "Defining size for %s/%s", dirName, de->d_name ); if( !JS_DefineProperty( cx, fileObj, "time", INT_TO_JSVAL( st.st_mtime ), 0, 0, JSPROP_ENUMERATE ) ) JS_ReportError( cx, "Defining time for %s/%s", dirName, de->d_name ); } else JS_ReportError( cx, "allocating fileObj" ); } // file else { subDirs.push_back( de->d_name ); } // directory } // skip symlinks else { printf( "--> ignoring symlink %s/%s: mode 0x%X\n", dirName, de->d_name, st.st_mode ); } } else perror( fullPath ); } } // for each entry in this directory closedir( dir ); // free this dir handle for( unsigned i = 0 ; i < subDirs.size(); i++ ) { // // can't attach until we have one. // jsval sSubdir = JSVAL_FALSE ; JS_AddRoot( cx, &sSubdir ); char fullPath[PATH_MAX]; int const len = sprintf( fullPath, "%s/%s", dirName, subDirs[i].c_str() ); JSString * const sPath = JS_NewStringCopyN( cx, fullPath, len ); jsval param = STRING_TO_JSVAL( sPath ); JS_AddRoot( cx, ¶m ); JSBool worked = jsReadDir( cx, obj, 1, ¶m, &sSubdir ); if( worked ) { if( !JS_DefineProperty( cx, returnObj, subDirs[i].c_str(), sSubdir, 0, 0, JSPROP_ENUMERATE ) ) JS_ReportError( cx, "Attaching %s to %s", subDirs[i].c_str(), dirName ); } JS_RemoveRoot( cx, ¶m ); JS_RemoveRoot( cx, &sSubdir ); } } else { JS_ReportError( cx, "allocating dirObject" ); closedir( dir ); } } else JS_ReportError( cx, "%m reading dir <%s>\n", dirName ); } else JS_ReportError( cx, "Usage: stat( fileName )" ); return JS_TRUE ; }
void gjstest_test_func_gjs_jsapi_util_error_throw(void) { JSRuntime *runtime; JSContext *context; JSObject *global; jsval exc, value, previous; const char *s; /* create a runtime just to avoid tangling this test with all the * code surrounding how we create one normally in context.c */ runtime = JS_NewRuntime(1024*1024 /* max bytes */); context = JS_NewContext(runtime, 8192); JS_BeginRequest(context); global = JS_NewObject(context, NULL, NULL, NULL); JS_SetGlobalObject(context, global); JS_InitStandardClasses(context, global); JS_SetErrorReporter(context, test_error_reporter); /* Test that we can throw */ gjs_throw(context, "This is an exception %d", 42); g_assert(JS_IsExceptionPending(context)); exc = JSVAL_VOID; JS_GetPendingException(context, &exc); g_assert(exc != JSVAL_VOID); value = JSVAL_VOID; JS_GetProperty(context, JSVAL_TO_OBJECT(exc), "message", &value); g_assert(JSVAL_IS_STRING(value)); /* JS_GetStringBytes() is broken for non-ASCII but that's OK here */ s = JS_GetStringBytes(JSVAL_TO_STRING(value)); g_assert(s != NULL); if (strcmp(s, "This is an exception 42") != 0) { g_error("Exception has wrong message '%s'", s); } /* keep this around before we clear it */ previous = exc; JS_AddRoot(context, &previous); JS_ClearPendingException(context); g_assert(!JS_IsExceptionPending(context)); /* Check that we don't overwrite a pending exception */ JS_SetPendingException(context, previous); g_assert(JS_IsExceptionPending(context)); gjs_throw(context, "Second different exception %s", "foo"); g_assert(JS_IsExceptionPending(context)); exc = JSVAL_VOID; JS_GetPendingException(context, &exc); g_assert(exc != JSVAL_VOID); g_assert(exc == previous); JS_RemoveRoot(context, &previous); JS_EndRequest(context); JS_DestroyContext(context); JS_DestroyRuntime(runtime); JS_ShutDown(); }
static JSBool rpmxar_enumerate(JSContext *cx, JSObject *obj, JSIterateOp op, jsval *statep, jsid *idp) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmxarClass, NULL); rpmxar xar = ptr; int ix = 0; _ENUMERATE_DEBUG_ENTRY(_debug < 0); switch (op) { case JSENUMERATE_INIT: if (idp) *idp = JSVAL_ZERO; *statep = INT_TO_JSVAL(ix); if (_debug) fprintf(stderr, "\tINIT xar %p\n", xar); break; case JSENUMERATE_NEXT: ix = JSVAL_TO_INT(*statep); if (!rpmxarNext(xar)) { const char * path = rpmxarPath(xar); struct stat * st = xmalloc(sizeof(*st)); JSObject * arr = JS_NewArrayObject(cx, 0, NULL); JSBool ok = JS_AddRoot(cx, &arr); JSObject * o; jsval v; v = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, path)); ok = JS_SetElement(cx, arr, 0, &v); if (!rpmxarStat(xar, st) && (o = JS_NewObject(cx, &rpmstClass, NULL, NULL)) != NULL && JS_SetPrivate(cx, o, (void *)st)) v = OBJECT_TO_JSVAL(o); else { st = _free(st); v = JSVAL_NULL; } ok = JS_SetElement(cx, arr, 1, &v); v = OBJECT_TO_JSVAL(arr); ok = JS_DefineElement(cx, obj, ix, v, NULL, NULL, JSPROP_ENUMERATE); (void) JS_RemoveRoot(cx, &arr); if (_debug) fprintf(stderr, "\tNEXT xar %p[%u] \"%s\"\n", xar, ix, path); path = _free(path); JS_ValueToId(cx, *statep, idp); *statep = INT_TO_JSVAL(ix+1); } else *idp = JSVAL_VOID; if (*idp != JSVAL_VOID) break; /*@fallthrough@*/ case JSENUMERATE_DESTROY: ix = JSVAL_TO_INT(*statep); (void) JS_DefineProperty(cx, obj, "length", INT_TO_JSVAL(ix), NULL, NULL, JSPROP_ENUMERATE); if (_debug) fprintf(stderr, "\tFINI xar %p[%u]\n", xar, ix); *statep = JSVAL_NULL; break; } return JS_TRUE; }
static JSBool edjsdb_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { JSBool ok = JS_TRUE; JSObject *proto_obj = NULL; JSObject *ret_obj = NULL; edjsdb_private *p = NULL; JSString *type = NULL; char *mod_name = NULL; char *mod_path = NULL; struct stat *file_stat = NULL; JSBool (*db_driver_init)(JSContext *, JSObject *) = NULL; edjs_private *edjs_p = NULL; jsval path_val = JSVAL_VOID; JSObject *path_obj = NULL; JSFunctionSpec my_methods[] = { {"connect", edjsdb_connect, 1, JSPROP_ENUMERATE, 0}, {"close", edjsdb_close, 0, 0, 0}, {"query", edjsdb_query, 1, 0, 0}, {"exec", edjsdb_exec, 1, 0, 0}, {"createSequence", edjsdb_create_sequence, 1, 0, 0}, {"dropSequence", edjsdb_drop_sequence, 1, 0, 0}, {"listSequences", edjsdb_list_sequences, 0, 0, 0}, {"nextID", edjsdb_next_id, 1, 0, 0}, {"currentID", edjsdb_current_id, 1, 0, 0}, {"quote", edjsdb_quote, 1, 0, 0}, {0, 0, 0, 0, 0} }; if (argc != 1) { //report error goto error; } JS_AddRoot(cx, &type); proto_obj = JS_NewObject(cx, NULL, NULL, NULL); if (NULL == proto_obj) { //throw error goto error; } *rval = OBJECT_TO_JSVAL(proto_obj); //root proto_obj if (JS_FALSE == JS_DefineFunctions(cx, proto_obj, my_methods)) { //report error goto error; } ret_obj = JS_NewObject(cx, &edjsdb_class, proto_obj, NULL);//JS_ConstructObjectWithArguments(cx, &edjsdb_class, NULL, NULL, argc, argv); if (NULL == ret_obj) { //throw error goto error; } *rval = OBJECT_TO_JSVAL(ret_obj); //root ret_obj p = (edjsdb_private *)EDJS_malloc(cx, sizeof(edjsdb_private)); if (NULL == p) { goto error; } p->db_connection = NULL; p->lib_handle = NULL; p->finalize_func = edjsdb_finalize_stub; p->connect_func = edjsdb_connect_stub; p->close_func = edjsdb_close_stub; p->query_func = edjsdb_func_stub; p->exec_func = edjsdb_func_stub; p->create_sequence_func = edjsdb_func_stub; p->drop_sequence_func = edjsdb_func_stub; p->list_sequences_func = edjsdb_func_stub; p->next_id_func = edjsdb_func_stub; p->current_id_func = edjsdb_func_stub; p->quote_func = edjsdb_func_stub; if (JS_FALSE == JS_SetPrivate(cx, ret_obj, p)) { //report error goto error; } if (JS_FALSE == JS_DefineProperty(cx, ret_obj, "type", argv[0], NULL, NULL, JSPROP_ENUMERATE | JSPROP_READONLY)) { //report error goto error; } type = JS_ValueToString(cx, *argv); if (NULL == type) { //report error goto error; } mod_name = (char *)EDJS_malloc(cx, (7 + strlen(JS_GetStringBytes(type))) * sizeof(char)); //7 for db_.so\0 strcpy(mod_name, "db_"); strcat(mod_name, JS_GetStringBytes(type)); strcat(mod_name, ".so"); edjs_p = (edjs_private *)JS_GetContextPrivate(cx); if (JS_FALSE == JS_GetProperty(cx, edjs_p->settings_obj, "include_path", &path_val)) { //EDJS_ERR(cx, EDJSERR_GET_PROPERTY, "EDJS", "include_path"); goto error; } path_obj = JSVAL_TO_OBJECT(path_val); if (JS_FALSE == EDJS_ResolveFile(cx, path_obj, NULL, mod_name, &mod_path, &file_stat)) { goto error; } if (NULL == mod_path) { //EDJS_ERR(cx, EDJSERR_FILENAME_RESOLVE, JS_GetStringBytes(include_str)); goto error; } p->lib_handle = dlopen(mod_path, RTLD_NOW); char *dl_error = NULL; //if (NULL == p->lib_handle) { if ((dl_error = dlerror()) != NULL) { p->lib_handle = NULL; JS_ReportError(cx, dl_error); goto error; } db_driver_init = dlsym(p->lib_handle, "edjsdb_driver_instance_init"); // if (NULL == db_driver_init) { if ((dl_error = dlerror()) != NULL) { JS_ReportError(cx, dl_error); //JS_ReportError(cx, "failed to load edjsdb_driver_instance_init"); goto error; } ok = db_driver_init(cx, ret_obj); if (JS_FALSE == ok) { JS_ReportError(cx, "driver failed its init method"); goto error; } goto finish; error: ok = JS_FALSE; *rval = JSVAL_VOID; finish: JS_RemoveRoot(cx, &type); return ok; }