//--------------------------------------------------------------------- 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; }
/* * 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; }