blob: 800033c0e37f43beb9d33124e1ce755d37a9414f [file] [log] [blame]
/*
* Copyright 2007 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#include "gwt-ll.h"
#include "DispWrapper.h"
#include "FuncWrapper.h"
JNIEnv* gEnv;
jclass gClass;
jclass gDispObjCls;
jclass gDispMethCls;
jmethodID gGetFieldMeth;
jmethodID gSetFieldMeth;
jmethodID gInvokeMeth;
jmethodID gToStringMeth;
using namespace KJS;
/*
* Print a JSValue in human-readable form.
*
* val JSValue* to print
* prefix a string to print before the value
*/
void PrintJSValue(JSValue* val, char* prefix) {
static const char* typeStrings[]={
"unspecified",
"number",
"boolean",
"undefined",
"null",
"string",
"object",
"getter/setter",
};
char buf[256];
snprintf(buf, sizeof(buf), "%s{%08x}:", prefix, unsigned(val));
TRACE(buf);
JSType type = val->type();
const char* typeString=typeStrings[type];
char* p = buf;
p += snprintf(p, sizeof(buf)-(p-buf), " %s: ", typeString);
//p += snprintf(p, sizeof(buf)-(p-buf), "%s{%08x} %s: ", prefix,
// unsigned(val), typeString);
if (val->isNumber()) {
p += snprintf(p, sizeof(buf)-(p-buf), "%lf", val->getNumber());
} else if(val->isString()) {
CString str(val->getString().UTF8String());
p += snprintf(p, sizeof(buf)-(p-buf), "%.*s", (int)str.size(),
str.c_str());
} else if(val->isObject()) {
const JSObject* obj = val->getObject();
const ClassInfo* cinfo = obj->classInfo();
const char* cname = cinfo ? cinfo->className : "js object";
p += snprintf(p, sizeof(buf)-(p-buf), "%s @ %08x", cname, unsigned(obj));
} else if(val->isBoolean()) {
p += snprintf(p, sizeof(buf)-(p-buf), "%s", val->getBoolean() ? "true" : "false");
}
TRACE(buf);
}
/*
* Called for each gcProtect, only if TRACING is enabled.
*
* val JSValue* to be protected
*/
void gcProtectHook(JSValue* val) {
PrintJSValue(val, "gcProtect: val=");
}
/*
* Called for each gcUnprotect, only if TRACING is enabled.
*
* val JSValue* to be protected
* trace string containing trace information for the creation site, or null
* if not available
*/
void gcUnprotectHook(JSValue* val, const char* trace) {
if (trace) {
TRACE("gcUnprotect - value created at:");
TRACE(trace);
}
PrintJSValue(val, "gcUnprotect: val=");
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: isNull
* Signature: (I)Z
*/
JNIEXPORT jboolean JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf_isNull
(JNIEnv *env, jclass, jint jsval)
{
TRACE("ENTER LowLevelSaf__isNull");
JSValue* val = (JSValue*)jsval;
if (!val) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__isNull");
return val->isNull();
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: isUndefined
* Signature: (I)Z
*/
extern "C" JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf_isUndefined
(JNIEnv *env, jclass, jint jsval)
{
TRACE("ENTER LowLevelSaf__isUndefined");
JSValue* val = (JSValue*)jsval;
if (!val) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__isUndefined");
return val->isUndefined();
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: jsNull
* Signature: ()I
*/
extern "C" JNIEXPORT jint JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf_jsNull
(JNIEnv *, jclass)
{
return reinterpret_cast<jint>(jsNull());
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: getTypeString
* Signature: (I)Ljava/lang/String;
*/
extern "C" JNIEXPORT jstring JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf_getTypeString
(JNIEnv *env, jclass, jint jsval)
{
static const char* typeStrings[]={
"unspecified",
"number",
"boolean",
"undefined",
"null",
"string",
"object",
"getter/setter",
};
JSValue* val = (JSValue*)jsval;
if (!val) {
return 0;
}
JSType type = val->type();
const char* typeString=typeStrings[type];
if (type == ObjectType) {
if (val->isObject(&DispWrapper::info)) {
typeString = "Java object";
} else {
typeString = "JS object";
}
}
return env->NewStringUTF(typeString);
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: jsUndefined
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf_jsUndefined
(JNIEnv *env, jclass)
{
return reinterpret_cast<jint>(jsUndefined());
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _coerceToBoolean
* Signature: (II[Z)Z
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1coerceToBoolean
(JNIEnv * env, jclass, jint execState, jint jsval, jbooleanArray rval)
{
TRACE("ENTER LowLevelSaf__1coerceToBoolean");
if (!execState || !jsval) {
return JNI_FALSE;
}
jboolean result = ((JSValue*)jsval)->toBoolean((ExecState*)execState);
env->SetBooleanArrayRegion(rval, 0, 1, &result);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1coerceToBoolean");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _coerceToDouble
* Signature: (II[D)Z
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1coerceToDouble
(JNIEnv *env, jclass, jint execState, jint jsval, jdoubleArray rval)
{
TRACE("ENTER LowLevelSaf__1coerceToDouble");
if (!execState || !jsval) {
return JNI_FALSE;
}
jdouble result = ((JSValue*)jsval)->toNumber((ExecState*)execState);
env->SetDoubleArrayRegion(rval, 0, 1, &result);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1coerceToDouble");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _coerceToString
* Signature: (II[Ljava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1coerceToString
(JNIEnv *env, jclass, jint execState, jint jsval, jobjectArray rval)
{
TRACE("ENTER LowLevelSaf__1coerceToString");
JSValue *val = (JSValue*)jsval;
if (!execState || !val) {
return JNI_FALSE;
}
/*
* Convert all objects to their string representation, EXCEPT
* null and undefined which will be returned as a true NULL.
*/
jstring result = NULL;
if (!val->isNull() && !val->isUndefined()) {
UString str = val->toString((ExecState*)execState);
result = env->NewString((const jchar*)str.data(), str.size());
if (env->ExceptionCheck())
return JNI_FALSE;
}
env->SetObjectArrayElement(rval,0,result);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1coerceToString");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _convertBoolean
* Signature: (IZ[I)Z
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1convertBoolean
(JNIEnv *env, jclass, jboolean jval, jintArray rval)
{
TRACE("ENTER LowLevelSaf__1convertBoolean");
#ifdef ENABLE_TRACING
char buf[256];
snprintf(buf, sizeof(buf), " val=%s", jval ? "true" : "false");
TRACE(buf);
#endif
JSValue *jsval = (jval == JNI_FALSE) ? jsBoolean(false) : jsBoolean(true);
/*
* Since we know this is a boolean primitive, the protect is a no-op, but
* it is useful to have it for the trace log.
*/
gwtGCProtect(jsval);
if (!jsval) {
return JNI_FALSE;
}
env->SetIntArrayRegion(rval,0,1,(const jint*)&jsval);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1convertBoolean");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _convertDouble
* Signature: (ID[I)Z
*/
JNIEXPORT jboolean JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1convertDouble
(JNIEnv *env, jclass, jdouble jval, jintArray rval)
{
TRACE("ENTER LowLevelSaf__1convertDouble");
#ifdef ENABLE_TRACING
char buf[256];
snprintf(buf, sizeof(buf), " val=%lf", jval);
TRACE(buf);
#endif
JSValue *jsval = jsNumber(jval);
gwtGCProtect(jsval);
if (!jsval) {
return JNI_FALSE;
}
env->SetIntArrayRegion(rval,0,1,(const jint*)&jsval);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1convertDouble");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _convertString
* Signature: (ILjava/lang/String;[I)Z
*/
JNIEXPORT jboolean JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1convertString
(JNIEnv *env, jclass, jstring jval, jintArray rval)
{
TRACE("ENTER LowLevelSaf__1convertString");
JStringWrap jstr(env, jval);
if (!jstr.jstr()) {
return JNI_FALSE;
}
#ifdef ENABLE_TRACING
char buf[256];
snprintf(buf, sizeof(buf), " val=%s", jstr.str());
TRACE(buf);
#endif
JSValue *jsval = jsString(UString((const UChar*)jstr.jstr(), jstr.length()));
gwtGCProtect(jsval);
if (!jsval) {
return JNI_FALSE;
}
env->SetIntArrayRegion(rval,0,1,(const jint*)&jsval);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1convertString");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _executeScript
* Signature: (ILjava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1executeScript
(JNIEnv* env, jclass, jint execState, jstring code)
{
TRACE("ENTER LowLevelSaf__1executeScript");
if (!execState || !code) {
return JNI_FALSE;
}
JStringWrap jcode(env, code);
if (!jcode.jstr()) {
return JNI_FALSE;
}
#ifdef ENABLE_TRACING
char buf[1024];
snprintf(buf, sizeof(buf), " code=%s", jcode.str());
TRACE(buf);
#endif
Interpreter* interp = ((ExecState*)execState)->dynamicInterpreter();
if (!interp) {
return JNI_FALSE;
}
interp->evaluate(UString(), 0, (const UChar*)jcode.jstr(), jcode.length());
TRACE("SUCCESS LowLevelSaf__1executeScript");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _executeScriptWithInfo
* Signature: (ILjava/lang/String;Ljava/lang/String;I)Z
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1executeScriptWithInfo
(JNIEnv* env, jclass, jint execState, jstring code, jstring file, jint line)
{
TRACE("ENTER LowLevelSaf__1executeScriptWithInfo");
if (!execState || !code || !file) {
return JNI_FALSE;
}
JStringWrap jcode(env, code);
if (!jcode.jstr()) {
return JNI_FALSE;
}
JStringWrap jfile(env, file);
if (!jcode.jstr()) {
return JNI_FALSE;
}
#ifdef ENABLE_TRACING
char buf[1024];
snprintf(buf, sizeof(buf), " code=%s, file=%s, line=%d", jcode.str(),
jfile.str(), static_cast<int>(line));
TRACE(buf);
#endif
Interpreter* interp = ((ExecState*)execState)->dynamicInterpreter();
if (!interp) {
return JNI_FALSE;
}
interp->evaluate(UString((const UChar*)jfile.jstr(), jfile.length()), line,
(const UChar*)jcode.jstr(), jcode.length());
TRACE("SUCCESS LowLevelSaf__1executeScriptWithInfo");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _gcLock
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1gcLock
(JNIEnv *, jclass, jint jsval)
{
gwtGCProtect(reinterpret_cast<JSValue*>(jsval));
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _gcUnlock
* Signature: (ILjava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1gcUnlock
(JNIEnv* jniEnv, jclass, jint jsval, jstring creationDesc)
{
JStringWrap creationStr(jniEnv, creationDesc);
gwtGCUnprotect(reinterpret_cast<JSValue*>(jsval),
creationDesc ? creationStr.str() : 0);
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _getGlobalExecState
* Signature: (I[I)Z
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1getGlobalExecState
(JNIEnv *env, jclass, jint scriptObject, jintArray rval)
{
TRACE("ENTER LowLevelSaf__1getGlobalExecState");
if (!scriptObject || !((JSValue*)scriptObject)->isObject()) {
return JNI_FALSE;
}
Interpreter* interp
= Interpreter::interpreterWithGlobalObject((JSObject*)scriptObject);
if (!interp) {
return JNI_FALSE;
}
ExecState* execState = interp->globalExec();
env->SetIntArrayRegion(rval, 0, 1, (jint*)&execState);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1getGlobalExecState");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _initNative
* Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1initNative
(JNIEnv* env, jclass llClass, jclass dispObjCls, jclass dispMethCls)
{
Interpreter::setShouldPrintExceptions(true);
gEnv = env;
gClass = static_cast<jclass>(env->NewGlobalRef(llClass));
gDispObjCls = static_cast<jclass>(env->NewGlobalRef(dispObjCls));
gDispMethCls = static_cast<jclass>(env->NewGlobalRef(dispMethCls));
if (!gClass || !gDispObjCls || !gDispMethCls || env->ExceptionCheck()) {
return false;
}
gGetFieldMeth
= env->GetMethodID(gDispObjCls, "getField", "(Ljava/lang/String;)I");
gSetFieldMeth
= env->GetMethodID(gDispObjCls, "setField", "(Ljava/lang/String;I)V");
gInvokeMeth = env->GetMethodID(gDispMethCls, "invoke", "(II[I)I");
gToStringMeth
= env->GetMethodID(gDispObjCls, "toString", "()Ljava/lang/String;");
if (!gGetFieldMeth || !gSetFieldMeth || !gInvokeMeth || !gToStringMeth
|| env->ExceptionCheck())
{
return false;
}
#ifdef FILETRACE
gout = fopen("/tmp/gwt-ll.log", "w");
filetrace("LOG STARTED");
#endif // FILETRACE
#ifdef JAVATRACE
gTraceMethod = env->GetStaticMethodID(gClass, "trace", "(Ljava/lang/String;)V");
if (!gTraceMethod || env->ExceptionCheck()) {
return false;
}
#endif // JAVATRACE
return true;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _invoke
* Signature: (IILjava/lang/String;II[I[I)Z
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1invoke
(JNIEnv* env, jclass, jint jsexecState, jint jsScriptObject, jstring method,
jint jsthis, jint argc, jintArray argv, jintArray rval)
{
TRACE("ENTER LowLevelSaf__1invoke");
if (!jsexecState || !jsScriptObject || !method || !rval) {
return JNI_FALSE;
}
JStringWrap jmethod(env, method);
#ifdef ENABLE_TRACING
char buf[256];
snprintf(buf, sizeof(buf), "scriptObject=%08x, method=%s, argc=%d",
static_cast<unsigned>(jsScriptObject), jmethod.str(),
static_cast<unsigned>(argc));
TRACE(buf);
PrintJSValue((JSValue*)jsthis, " jsthis=");
#endif
ExecState* execState = (ExecState*)jsexecState;
JSObject* scriptObj = (JSObject*)jsScriptObject;
if (!scriptObj->isObject()) {
return JNI_FALSE;
}
if (!jmethod.jstr()) {
return JNI_FALSE;
}
JSObject* thisObj = (JSObject*)jsthis;
if (!thisObj || thisObj->isNull() || thisObj->isUndefined()) {
thisObj = scriptObj;
}
if (!thisObj->isObject()) {
return JNI_FALSE;
}
JSValue* maybeFunc = scriptObj->get(execState,
Identifier((const UChar*)jmethod.jstr(), jmethod.length()));
if (!maybeFunc || !maybeFunc->isObject()) {
return JNI_FALSE;
}
JSObject* func = (JSObject*)maybeFunc;
if (!func->implementsCall()) {
return JNI_FALSE;
}
List args;
for (int i = 0; i < argc; ++i) {
jint argi;
env->GetIntArrayRegion(argv, i, 1, &argi);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
#ifdef ENABLE_TRACING
snprintf(buf, sizeof(buf), " arg[%d]=", i);
TRACE(buf);
PrintJSValue((JSValue*)argi, buf);
#endif
if (argi) {
args.append((JSValue*)argi);
} else {
args.append(jsNull());
}
}
JSValue* result = func->call(execState, thisObj, args);
gwtGCProtect(result);
env->SetIntArrayRegion(rval, 0, 1, (jint*)&result);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1invoke");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: isBoolean
* Signature: (I)Z
*/
extern "C" JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf_isBoolean
(JNIEnv *, jclass, jint jsval)
{
if (!jsval) {
return JNI_FALSE;
}
return reinterpret_cast<JSValue*>(jsval)->isBoolean() ? JNI_TRUE : JNI_FALSE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: isNumber
* Signature: (I)Z
*/
extern "C" JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf_isNumber
(JNIEnv *, jclass, jint jsval)
{
if (!jsval) {
return JNI_FALSE;
}
return reinterpret_cast<JSValue*>(jsval)->isNumber() ? JNI_TRUE : JNI_FALSE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _isString
* Signature: (I)Z
*
* Must return true for JavaScript String objects as well as string primitives.
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1isString
(JNIEnv *, jclass, jint jsval)
{
if (!jsval) {
return JNI_FALSE;
}
JSValue* jsValue = reinterpret_cast<JSValue*>(jsval);
if(jsValue->isString()) return JNI_TRUE;
// check for JavaScript String objects
if(jsValue->isObject()) {
const JSObject* obj = jsValue->getObject();
const ClassInfo* cinfo = obj->classInfo();
if (cinfo && !strcmp(cinfo->className, "String")) {
return JNI_TRUE;
}
}
return JNI_FALSE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _isObject
* Signature: (I)Z
*/
JNIEXPORT jboolean JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1isObject
(JNIEnv *, jclass, jint jsval)
{
if (!jsval) {
return JNI_FALSE;
}
return reinterpret_cast<JSValue*>(jsval)->isObject() ? JNI_TRUE : JNI_FALSE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _isWrappedDispatch
* Signature: (I[Z)Z
*/
JNIEXPORT jboolean JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1isWrappedDispatch
(JNIEnv* env, jclass, jint jsval, jbooleanArray rval)
{
TRACE("ENTER LowLevelSaf__1isWrappedDispatch");
if (!jsval) {
return JNI_FALSE;
}
JSValue* val = (JSValue*)jsval;
jboolean result = val->isObject(&DispWrapper::info) ? JNI_TRUE : JNI_FALSE;
env->SetBooleanArrayRegion(rval, 0, 1, &result);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1isWrappedDispatch");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _jsLock
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1jsLock
(JNIEnv *, jclass)
{
JSLock::lock();
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _jsUnlock
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1jsUnlock
(JNIEnv *, jclass)
{
JSLock::unlock();
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _raiseJavaScriptException
* Signature: (II)Z
*/
JNIEXPORT jboolean JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1raiseJavaScriptException
(JNIEnv *env, jclass, jint execState, jint jsval)
{
TRACE("ENTER LowLevelSaf__1raiseJavaScriptException");
if (!execState || !jsval) {
return JNI_FALSE;
}
reinterpret_cast<ExecState*>(execState)->setException(
reinterpret_cast<JSValue*>(jsval));
TRACE("SUCCESS LowLevelSaf__1raiseJavaScriptException");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _unwrapDispatch
* Signature: (I[Lcom/google/gwt/dev/shell/mac/LowLevelSaf/DispatchObject;)Z
*/
JNIEXPORT jboolean JNICALL Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1unwrapDispatch
(JNIEnv* env, jclass, jint jsval, jobjectArray rval)
{
TRACE("ENTER LowLevelSaf__1unwrapDispatch");
if (!jsval) {
return JNI_FALSE;
}
JSValue* val = reinterpret_cast<JSValue*>(jsval);
if (!val->isObject(&DispWrapper::info)) {
return JNI_FALSE;
}
DispWrapper* wrapper = static_cast<DispWrapper*>(val);
env->SetObjectArrayElement(rval, 0, wrapper->getDispObj());
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1unwrapDispatch");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _wrapDispatch
* Signature: (Lcom/google/gwt/dev/shell/mac/LowLevelSaf/DispatchObject;[I)Z
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1wrapDispatch
(JNIEnv* env, jclass, jobject dispObj, jintArray rval)
{
TRACE("ENTER LowLevelSaf__1wrapDispatch");
jobject dispObjRef = env->NewGlobalRef(dispObj);
if (!dispObjRef || env->ExceptionCheck()) {
return JNI_FALSE;
}
DispWrapper* wrapper = new DispWrapper(dispObjRef);
gwtGCProtect(wrapper);
env->SetIntArrayRegion(rval, 0, 1, (jint*)&wrapper);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1wrapDispatch");
return JNI_TRUE;
}
/*
* Class: com_google_gwt_dev_shell_mac_LowLevelSaf
* Method: _wrapFunction
* Signature: (Ljava/lang/String;Lcom/google/gwt/dev/shell/mac/LowLevelSaf/DispatchMethod;[I)Z
*/
JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_mac_LowLevelSaf__1wrapFunction
(JNIEnv* env, jclass, jstring name, jobject dispMeth, jintArray rval)
{
TRACE("ENTER LowLevelSaf__1wrapFunction");
jobject dispMethRef = env->NewGlobalRef(dispMeth);
if (!dispMethRef || env->ExceptionCheck()) {
return JNI_FALSE;
}
JStringWrap jname(env, name);
if (!jname.jstr()) {
return JNI_FALSE;
}
FuncWrapper* wrapper = new FuncWrapper(UString((const UChar*)jname.jstr(),
jname.length()), dispMethRef);
gwtGCProtect(wrapper);
env->SetIntArrayRegion(rval, 0, 1, (jint*)&wrapper);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
TRACE("SUCCESS LowLevelSaf__1wrapFunction");
return JNI_TRUE;
}
#ifdef FILETRACE
FILE* gout = 0;
void filetrace(const char* s) {
fprintf(gout, s);
fprintf(gout, "\n");
fflush(gout);
}
#endif // FILETRACE
#ifdef JAVATRACE
jmethodID gTraceMethod = 0;
void javatrace(const char* s) {
if (!gEnv->ExceptionCheck()) {
jstring out = gEnv->NewStringUTF(s);
if (!gEnv->ExceptionCheck()) {
gEnv->CallStaticVoidMethod(gClass, gTraceMethod, out);
} else {
gEnv->ExceptionClear();
}
}
}
#endif // JAVATRACE