Esempio n. 1
0
        //---------------------------------------------------------------------
        Message::Methods MessageFactoryPeerFinder::toMethod(const char *inMethod) const
        {
          typedef zsLib::ULONG ULONG;
          String methodStr(inMethod ? inMethod : "");

          for (ULONG loop = (ULONG)(MessageFactoryPeerFinder::Method_Invalid+1); loop <= ((ULONG)MessageFactoryPeerFinder::Method_Last); ++loop)
          {
            if (methodStr == toString((Message::Methods)loop)) {
              return (Message::Methods)loop;
            }
          }
          return Message::Method_Invalid;
        }
Esempio n. 2
0
/*
 * Class:     com_google_gwt_dev_shell_moz_LowLevelMoz
 * Method:    _invoke
 * Signature: (ILjava/lang/String;I[I)I
 */
extern "C" JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_moz_LowLevelMoz__1invoke
(JNIEnv* env, jclass, jint scriptObjInt, jstring methodName, jint jsThisInt,
 jintArray jsArgsInt, jint jsRetValInt)
{
    Tracer tracer("LowLevelMoz._invoke");

    JStringWrap methodStr(env, methodName);
    if (!methodStr.str()) {
        tracer.setFail("null method name");
        return JNI_FALSE;
    }
    JsRootedValue* jsThisRV = reinterpret_cast<JsRootedValue*>(jsThisInt);
    jint jsArgc = env->GetArrayLength(jsArgsInt);
    tracer.log("method=%s, jsthis=%08x, #args=%d", methodStr.str(), jsThisInt,
               jsArgc);
    JSContext* cx = JsRootedValue::currentContext();
    nsIScriptGlobalObject* scriptObject =
        NS_REINTERPRET_CAST(nsIScriptGlobalObject*, scriptObjInt);
    JSObject* scriptWindow
        = reinterpret_cast<JSObject*>(scriptObject->GetGlobalJSObject());

    jsval fval;
    if (!JS_GetProperty(cx, scriptWindow, methodStr.str(), &fval)) {
        tracer.setFail("JS_GetProperty(method) failed");
        return JNI_FALSE;
    }
    JSFunction* jsFunction = JS_ValueToFunction(cx, fval);
    if (!jsFunction) {
        tracer.setFail("JS_ValueToFunction failed");
        return JNI_FALSE;
    }

    // extract arguments in jsval form
    nsAutoArrayPtr<jint> jsargvals(new jint[jsArgc]);
    if (!jsargvals) {
        tracer.setFail("failed to allocate arg array");
        return JNI_FALSE;
    }
    env->GetIntArrayRegion(jsArgsInt, 0, jsArgc, jsargvals);
    if (env->ExceptionCheck()) {
        tracer.setFail("copy from Java array failed");
        return JNI_FALSE;
    }
    nsAutoArrayPtr<jsval> jsargs(new jsval[jsArgc]);
    for (int i = 0; i < jsArgc; ++i) {
        JsRootedValue* arg = reinterpret_cast<JsRootedValue*>(jsargvals[i]);
        jsargs[i] = arg->getValue();
    }

    jsval jsrval;
    JSObject* jsThis;
    if (jsThisRV->isNull()) {
        jsThis = scriptWindow;
    } else {
        jsThis = jsThisRV->getObject();
    }

    PrintJSValue(cx, OBJECT_TO_JSVAL(jsThis), "jsThis=");
    for (int i = 0; i < jsArgc; ++i) {
        char buf[256];
        snprintf(buf, sizeof(buf), "arg[%d]=", i);
        PrintJSValue(cx, jsargs[i], buf);
    }
    //tracer.log("fval = %08x, args=%08x", fval, jsargs.get());
    if (!JS_CallFunctionValue(cx, jsThis, fval, jsArgc, jsargs.get(), &jsrval)) {
        tracer.setFail("JS_CallFunctionValue failed");
        return JNI_FALSE;
    }

    PrintJSValue(cx, jsrval, "return value=");
    JsRootedValue* returnVal = reinterpret_cast<JsRootedValue*>(jsRetValInt);
    returnVal->setValue(jsrval);
    return JNI_TRUE;
}