JS_AddRoot(cx, &handle->js_obj);
JS_AddNamedRoot(cx, &handle->js_obj, "&handle->js_obj");
jsj_WrapJSObject(JSContext *cx, JNIEnv *jEnv, JSObject *js_obj){    jobject java_wrapper_obj;    JSObjectHandle *handle;    /* Create a tiny stub object to act as the GC root that points to the       JSObject from its netscape.javascript.JSObject counterpart. */    handle = (JSObjectHandle*)JS_malloc(cx, sizeof(JSObjectHandle));    if (!handle)        return NULL;    handle->js_obj = js_obj;    handle->rt = JS_GetRuntime(cx);    /* Create a new Java object that wraps the JavaScript object by storing its       address in a private integer field. */#ifndef OJI#if JS_BYTES_PER_LONG == 8    java_wrapper_obj =        (*jEnv)->NewObject(jEnv, njJSObject, njJSObject_JSObject, (jlong)handle);#else    java_wrapper_obj =        (*jEnv)->NewObject(jEnv, njJSObject, njJSObject_JSObject, (jint)handle);#endif#else    if (JSJ_callbacks && JSJ_callbacks->get_java_wrapper != NULL) {        java_wrapper_obj = JSJ_callbacks->get_java_wrapper(jEnv, (jint)handle);    }#endif /*! OJI */    if (!java_wrapper_obj) {        jsj_UnexpectedJavaError(cx, jEnv, "Couldn't create new instance of "                                          "netscape.javascript.JSObject");        goto done;    }     JS_AddRoot(cx, &handle->js_obj);done:            return java_wrapper_obj;}