summaryrefslogtreecommitdiffstats
path: root/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp')
-rw-r--r--WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp266
1 files changed, 136 insertions, 130 deletions
diff --git a/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp b/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
index 3f88002..37f413e 100644
--- a/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
+++ b/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2003, 2008, 2010 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -20,7 +20,7 @@
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
@@ -46,83 +46,83 @@
#define JS_LOG(formatAndArgs...) ((void)0)
#else
#define JS_LOG(formatAndArgs...) { \
- fprintf (stderr, "%s:%d -- %s: ", __FILE__, __LINE__, __FUNCTION__); \
+ fprintf(stderr, "%s:%d -- %s: ", __FILE__, __LINE__, __FUNCTION__); \
fprintf(stderr, formatAndArgs); \
}
#endif
-
+
using namespace JSC::Bindings;
using namespace JSC;
-JavaInstance::JavaInstance (jobject instance, PassRefPtr<RootObject> rootObject)
+JavaInstance::JavaInstance(jobject instance, PassRefPtr<RootObject> rootObject)
: Instance(rootObject)
{
- _instance = new JObjectWrapper (instance);
- _class = 0;
+ m_instance = new JObjectWrapper(instance);
+ m_class = 0;
}
-JavaInstance::~JavaInstance ()
+JavaInstance::~JavaInstance()
{
- delete _class;
+ delete m_class;
}
#define NUM_LOCAL_REFS 64
void JavaInstance::virtualBegin()
{
- getJNIEnv()->PushLocalFrame (NUM_LOCAL_REFS);
+ getJNIEnv()->PushLocalFrame(NUM_LOCAL_REFS);
}
void JavaInstance::virtualEnd()
{
- getJNIEnv()->PopLocalFrame (NULL);
+ getJNIEnv()->PopLocalFrame(0);
}
-Class *JavaInstance::getClass() const
+Class* JavaInstance::getClass() const
{
- if (_class == 0)
- _class = new JavaClass (_instance->_instance);
- return _class;
+ if (!m_class)
+ m_class = new JavaClass (m_instance->m_instance);
+ return m_class;
}
JSValue JavaInstance::stringValue(ExecState* exec) const
{
JSLock lock(SilenceAssertionsOnly);
-
- jstring stringValue = (jstring)callJNIMethod<jobject>(_instance->_instance, "toString", "()Ljava/lang/String;");
- JNIEnv *env = getJNIEnv();
- const jchar *c = getUCharactersFromJStringInEnv(env, stringValue);
- UString u((const UChar *)c, (int)env->GetStringLength(stringValue));
+
+ jstring stringValue = (jstring)callJNIMethod<jobject>(m_instance->m_instance, "toString", "()Ljava/lang/String;");
+ JNIEnv* env = getJNIEnv();
+ const jchar* c = getUCharactersFromJStringInEnv(env, stringValue);
+ UString u((const UChar*)c, (int)env->GetStringLength(stringValue));
releaseUCharactersForJStringInEnv(env, stringValue, c);
return jsString(exec, u);
}
JSValue JavaInstance::numberValue(ExecState* exec) const
{
- jdouble doubleValue = callJNIMethod<jdouble>(_instance->_instance, "doubleValue", "()D");
+ jdouble doubleValue = callJNIMethod<jdouble>(m_instance->m_instance, "doubleValue", "()D");
return jsNumber(exec, doubleValue);
}
JSValue JavaInstance::booleanValue() const
{
- jboolean booleanValue = callJNIMethod<jboolean>(_instance->_instance, "booleanValue", "()Z");
+ jboolean booleanValue = callJNIMethod<jboolean>(m_instance->m_instance, "booleanValue", "()Z");
return jsBoolean(booleanValue);
}
-JSValue JavaInstance::invokeMethod (ExecState *exec, const MethodList &methodList, const ArgList &args)
+JSValue JavaInstance::invokeMethod(ExecState* exec, const MethodList& methodList, const ArgList &args)
{
int i, count = args.size();
- jvalue *jArgs;
+ jvalue* jArgs;
JSValue resultValue;
- Method *method = 0;
+ Method* method = 0;
size_t numMethods = methodList.size();
-
- // Try to find a good match for the overloaded method. The
+
+ // Try to find a good match for the overloaded method. The
// fundamental problem is that JavaScript doesn have the
- // notion of method overloading and Java does. We could
+ // notion of method overloading and Java does. We could
// get a bit more sophisticated and attempt to does some
// type checking as we as checking the number of parameters.
- Method *aMethod;
+ Method* aMethod;
for (size_t methodIndex = 0; methodIndex < numMethods; methodIndex++) {
aMethod = methodList[methodIndex];
if (aMethod->numParameters() == count) {
@@ -130,26 +130,25 @@ JSValue JavaInstance::invokeMethod (ExecState *exec, const MethodList &methodLis
break;
}
}
- if (method == 0) {
- JS_LOG ("unable to find an appropiate method\n");
+ if (!method) {
+ JS_LOG("unable to find an appropiate method\n");
return jsUndefined();
}
-
- const JavaMethod *jMethod = static_cast<const JavaMethod*>(method);
- JS_LOG ("call %s %s on %p\n", UString(jMethod->name()).UTF8String().c_str(), jMethod->signature(), _instance->_instance);
-
- if (count > 0) {
- jArgs = (jvalue *)malloc (count * sizeof(jvalue));
- }
+
+ const JavaMethod* jMethod = static_cast<const JavaMethod*>(method);
+ JS_LOG("call %s %s on %p\n", UString(jMethod->name()).UTF8String().c_str(), jMethod->signature(), m_instance->m_instance);
+
+ if (count > 0)
+ jArgs = (jvalue*)malloc(count * sizeof(jvalue));
else
jArgs = 0;
-
+
for (i = 0; i < count; i++) {
JavaParameter* aParameter = jMethod->parameterAt(i);
jArgs[i] = convertValueToJValue(exec, args.at(i), aParameter->getJNIType(), aParameter->type());
JS_LOG("arg[%d] = %s\n", i, args.at(i).toString(exec).ascii());
}
-
+
jvalue result;
// Try to use the JNI abstraction first, otherwise fall back to
@@ -161,129 +160,136 @@ JSValue JavaInstance::invokeMethod (ExecState *exec, const MethodList &methodLis
bool handled = false;
if (rootObject->nativeHandle()) {
- jobject obj = _instance->_instance;
+ jobject obj = m_instance->m_instance;
JSValue exceptionDescription;
- const char *callingURL = 0; // FIXME, need to propagate calling URL to Java
+ const char *callingURL = 0; // FIXME, need to propagate calling URL to Java
handled = dispatchJNICall(exec, rootObject->nativeHandle(), obj, jMethod->isStatic(), jMethod->JNIReturnType(), jMethod->methodID(obj), jArgs, result, callingURL, exceptionDescription);
if (exceptionDescription) {
throwError(exec, GeneralError, exceptionDescription.toString(exec));
- free (jArgs);
+ free(jArgs);
return jsUndefined();
}
}
-
+
// The following code can be conditionally removed once we have a Tiger update that
// contains the new Java plugin. It is needed for builds prior to Tiger.
- if (!handled) {
- jobject obj = _instance->_instance;
- switch (jMethod->JNIReturnType()){
- case void_type:
- callJNIMethodIDA<void>(obj, jMethod->methodID(obj), jArgs);
- break;
- case object_type:
- result.l = callJNIMethodIDA<jobject>(obj, jMethod->methodID(obj), jArgs);
- break;
- case boolean_type:
- result.z = callJNIMethodIDA<jboolean>(obj, jMethod->methodID(obj), jArgs);
- break;
- case byte_type:
- result.b = callJNIMethodIDA<jbyte>(obj, jMethod->methodID(obj), jArgs);
- break;
- case char_type:
- result.c = callJNIMethodIDA<jchar>(obj, jMethod->methodID(obj), jArgs);
- break;
- case short_type:
- result.s = callJNIMethodIDA<jshort>(obj, jMethod->methodID(obj), jArgs);
- break;
- case int_type:
- result.i = callJNIMethodIDA<jint>(obj, jMethod->methodID(obj), jArgs);
- break;
-
- case long_type:
- result.j = callJNIMethodIDA<jlong>(obj, jMethod->methodID(obj), jArgs);
- break;
- case float_type:
- result.f = callJNIMethodIDA<jfloat>(obj, jMethod->methodID(obj), jArgs);
- break;
- case double_type:
- result.d = callJNIMethodIDA<jdouble>(obj, jMethod->methodID(obj), jArgs);
- break;
- case invalid_type:
- default:
- break;
+ if (!handled) {
+ jobject obj = m_instance->m_instance;
+ switch (jMethod->JNIReturnType()) {
+ case void_type:
+ callJNIMethodIDA<void>(obj, jMethod->methodID(obj), jArgs);
+ break;
+ case object_type:
+ result.l = callJNIMethodIDA<jobject>(obj, jMethod->methodID(obj), jArgs);
+ break;
+ case boolean_type:
+ result.z = callJNIMethodIDA<jboolean>(obj, jMethod->methodID(obj), jArgs);
+ break;
+ case byte_type:
+ result.b = callJNIMethodIDA<jbyte>(obj, jMethod->methodID(obj), jArgs);
+ break;
+ case char_type:
+ result.c = callJNIMethodIDA<jchar>(obj, jMethod->methodID(obj), jArgs);
+ break;
+ case short_type:
+ result.s = callJNIMethodIDA<jshort>(obj, jMethod->methodID(obj), jArgs);
+ break;
+ case int_type:
+ result.i = callJNIMethodIDA<jint>(obj, jMethod->methodID(obj), jArgs);
+ break;
+
+ case long_type:
+ result.j = callJNIMethodIDA<jlong>(obj, jMethod->methodID(obj), jArgs);
+ break;
+ case float_type:
+ result.f = callJNIMethodIDA<jfloat>(obj, jMethod->methodID(obj), jArgs);
+ break;
+ case double_type:
+ result.d = callJNIMethodIDA<jdouble>(obj, jMethod->methodID(obj), jArgs);
+ break;
+ case invalid_type:
+ default:
+ break;
}
}
-
- switch (jMethod->JNIReturnType()){
- case void_type: {
+
+ switch (jMethod->JNIReturnType()) {
+ case void_type:
+ {
resultValue = jsUndefined();
}
break;
-
- case object_type: {
- if (result.l != 0) {
- const char *arrayType = jMethod->returnType();
- if (arrayType[0] == '[') {
+
+ case object_type:
+ {
+ if (result.l) {
+ const char* arrayType = jMethod->returnType();
+ if (arrayType[0] == '[')
resultValue = JavaArray::convertJObjectToArray(exec, result.l, arrayType, rootObject);
- }
- else {
+ else
resultValue = JavaInstance::create(result.l, rootObject)->createRuntimeObject(exec);
- }
- }
- else {
+ } else
resultValue = jsUndefined();
- }
}
break;
-
- case boolean_type: {
+
+ case boolean_type:
+ {
resultValue = jsBoolean(result.z);
}
break;
-
- case byte_type: {
+
+ case byte_type:
+ {
resultValue = jsNumber(exec, result.b);
}
break;
-
- case char_type: {
+
+ case char_type:
+ {
resultValue = jsNumber(exec, result.c);
}
break;
-
- case short_type: {
+
+ case short_type:
+ {
resultValue = jsNumber(exec, result.s);
}
break;
-
- case int_type: {
+
+ case int_type:
+ {
resultValue = jsNumber(exec, result.i);
}
break;
-
- case long_type: {
+
+ case long_type:
+ {
resultValue = jsNumber(exec, result.j);
}
break;
-
- case float_type: {
+
+ case float_type:
+ {
resultValue = jsNumber(exec, result.f);
}
break;
-
- case double_type: {
+
+ case double_type:
+ {
resultValue = jsNumber(exec, result.d);
}
break;
- case invalid_type:
- default: {
+ case invalid_type:
+ default:
+ {
resultValue = jsUndefined();
}
break;
}
- free (jArgs);
+ free(jArgs);
return resultValue;
}
@@ -294,7 +300,7 @@ JSValue JavaInstance::defaultValue(ExecState* exec, PreferredPrimitiveType hint)
return stringValue(exec);
if (hint == PreferNumber)
return numberValue(exec);
- JavaClass *aClass = static_cast<JavaClass*>(getClass());
+ JavaClass* aClass = static_cast<JavaClass*>(getClass());
if (aClass->isStringClass())
return stringValue(exec);
if (aClass->isNumberClass())
@@ -304,32 +310,32 @@ JSValue JavaInstance::defaultValue(ExecState* exec, PreferredPrimitiveType hint)
return valueOf(exec);
}
-JSValue JavaInstance::valueOf(ExecState* exec) const
+JSValue JavaInstance::valueOf(ExecState* exec) const
{
return stringValue(exec);
}
JObjectWrapper::JObjectWrapper(jobject instance)
-: _refCount(0)
+ : m_refCount(0)
{
- assert (instance != 0);
+ assert(instance);
// Cache the JNIEnv used to get the global ref for this java instanace.
// It'll be used to delete the reference.
- _env = getJNIEnv();
-
- _instance = _env->NewGlobalRef (instance);
-
- JS_LOG ("new global ref %p for %p\n", _instance, instance);
-
- if (_instance == NULL) {
- fprintf (stderr, "%s: could not get GlobalRef for %p\n", __PRETTY_FUNCTION__, instance);
- }
+ m_env = getJNIEnv();
+
+ m_instance = m_env->NewGlobalRef(instance);
+
+ JS_LOG("new global ref %p for %p\n", m_instance, instance);
+
+ if (!m_instance)
+ fprintf(stderr, "%s: could not get GlobalRef for %p\n", __PRETTY_FUNCTION__, instance);
}
-JObjectWrapper::~JObjectWrapper() {
- JS_LOG ("deleting global ref %p\n", _instance);
- _env->DeleteGlobalRef (_instance);
+JObjectWrapper::~JObjectWrapper()
+{
+ JS_LOG("deleting global ref %p\n", m_instance);
+ m_env->DeleteGlobalRef(m_instance);
}
#endif // ENABLE(MAC_JAVA_BRIDGE)