Exemple #1
0
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 ;
}
Exemple #2
0
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;
}
Exemple #6
0
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;
}
Exemple #7
0
jsUsblpPoll_t::jsUsblpPoll_t( JSObject *devObj )
    : usblpPoll_t( pollHandlers_,
                   DEFAULT_USBLB_DEV,
                   2<<20,      // 2 MB
                   4096 )
    , obj_( devObj )
{
    JS_AddRoot( execContext_, &obj_ );
}
Exemple #8
0
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;

}
Exemple #10
0
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");
  }
}
Exemple #11
0
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;
    }


}
Exemple #12
0
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 ;
}
Exemple #13
0
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 ;
}
Exemple #14
0
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 ;
}
Exemple #15
0
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 );
}
Exemple #16
0
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 ;
}
Exemple #17
0
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;
}
Exemple #18
0
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;
}
Exemple #19
0
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;
}
Exemple #20
0
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;
}
Exemple #21
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;
}
Exemple #22
0
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
}
Exemple #23
0
/**
 * 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;
}
Exemple #24
0
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;
}
Exemple #25
0
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, &param );
               JSBool worked = jsReadDir( cx, obj, 1, &param, &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, &param );
               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 ;

}
Exemple #26
0
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();
}
Exemple #27
0
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;
}
Exemple #28
0
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;
}