[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.19-706-ge5415e9
steveblock at google.com
steveblock at google.com
Thu Feb 4 21:21:55 UTC 2010
The following commit has been merged in the webkit-1.1 branch:
commit 561b78ebfbfc1277d6966b6d648dc5311015c57a
Author: steveblock at google.com <steveblock at google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Wed Jan 20 19:13:37 2010 +0000
Renames jni_runtime.[cpp|h] to JNIBridge.[cpp|h]
https://bugs.webkit.org/show_bug.cgi?id=33899
Reviewed by David Levin.
No new tests, refactoring only.
* Android.jscbindings.mk: Modified. Removes jni_runtime.cpp and adds JNIBridge.cpp
* GNUmakefile.am: Modified. Removes jni_runtime.h and adds JNIBridge.h
* WebCore.xcodeproj/project.pbxproj: Modified. Removes jni_runtime.[cpp|h] and adds JNIBridge.[cpp|h]
* bridge/jni/JNIBridge.cpp: Copied from WebCore/bridge/jni/jni_runtime.cpp.
* bridge/jni/JNIBridge.h: Copied from WebCore/bridge/jni/jni_runtime.h.
* bridge/jni/jni_jsobject.mm: Modified. Updated to include JNIBridge.h
* bridge/jni/jni_runtime.cpp: Removed.
* bridge/jni/jni_runtime.h: Removed.
* bridge/jni/jsc/JNIUtilityPrivate.cpp: Modified. Updated to include JNIBridge.h
* bridge/jni/jsc/JavaClassJSC.cpp: Modified. Removed superfluous include
* bridge/jni/jsc/JavaClassJSC.h: Modified. Updated to include JNIBridge.h
* bridge/jni/jsc/JavaInstanceJSC.cpp: Modified. Updated to include JNIBridge.h
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@53557 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/Android.jscbindings.mk b/WebCore/Android.jscbindings.mk
index b278828..1039a28 100644
--- a/WebCore/Android.jscbindings.mk
+++ b/WebCore/Android.jscbindings.mk
@@ -184,8 +184,8 @@ LOCAL_SRC_FILES += \
bridge/c/c_instance.cpp \
bridge/c/c_runtime.cpp \
bridge/c/c_utility.cpp \
+ bridge/jni/JNIBridge.cpp \
bridge/jni/JNIUtility.cpp \
- bridge/jni/jni_runtime.cpp \
bridge/jni/jsc/JNIUtilityPrivate.cpp \
bridge/jni/jsc/JavaClassJSC.cpp \
bridge/jni/jsc/JavaInstanceJSC.cpp \
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 21e1cf3..52089e0 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,25 @@
+2010-01-20 Steve Block <steveblock at google.com>
+
+ Reviewed by David Levin.
+
+ Renames jni_runtime.[cpp|h] to JNIBridge.[cpp|h]
+ https://bugs.webkit.org/show_bug.cgi?id=33899
+
+ No new tests, refactoring only.
+
+ * Android.jscbindings.mk: Modified. Removes jni_runtime.cpp and adds JNIBridge.cpp
+ * GNUmakefile.am: Modified. Removes jni_runtime.h and adds JNIBridge.h
+ * WebCore.xcodeproj/project.pbxproj: Modified. Removes jni_runtime.[cpp|h] and adds JNIBridge.[cpp|h]
+ * bridge/jni/JNIBridge.cpp: Copied from WebCore/bridge/jni/jni_runtime.cpp.
+ * bridge/jni/JNIBridge.h: Copied from WebCore/bridge/jni/jni_runtime.h.
+ * bridge/jni/jni_jsobject.mm: Modified. Updated to include JNIBridge.h
+ * bridge/jni/jni_runtime.cpp: Removed.
+ * bridge/jni/jni_runtime.h: Removed.
+ * bridge/jni/jsc/JNIUtilityPrivate.cpp: Modified. Updated to include JNIBridge.h
+ * bridge/jni/jsc/JavaClassJSC.cpp: Modified. Removed superfluous include
+ * bridge/jni/jsc/JavaClassJSC.h: Modified. Updated to include JNIBridge.h
+ * bridge/jni/jsc/JavaInstanceJSC.cpp: Modified. Updated to include JNIBridge.h
+
2010-01-20 Alexey Proskuryakov <ap at apple.com>
Reviewed by Simon Fraser.
diff --git a/WebCore/GNUmakefile.am b/WebCore/GNUmakefile.am
index 7651ca7..96efda4 100644
--- a/WebCore/GNUmakefile.am
+++ b/WebCore/GNUmakefile.am
@@ -512,9 +512,9 @@ webcore_sources += \
WebCore/bridge/c/c_runtime.h \
WebCore/bridge/c/c_utility.cpp \
WebCore/bridge/c/c_utility.h \
+ WebCore/bridge/jni/JNIBridge.h \
WebCore/bridge/jni/JNIUtility.h \
WebCore/bridge/jni/jni_jsobject.h \
- WebCore/bridge/jni/jni_runtime.h \
WebCore/bridge/jni/jsc/JavaClassJSC.h \
WebCore/bridge/jni/jsc/JavaInstanceJSC.h \
WebCore/bridge/npapi.h \
diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index 7ae59a1..970cdc3 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -310,8 +310,6 @@
1A569D030D7E2B82007C3983 /* jni_jsobject.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1A569CD30D7E2B82007C3983 /* jni_jsobject.mm */; };
1A569D040D7E2B82007C3983 /* jni_jsobject.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A569CD40D7E2B82007C3983 /* jni_jsobject.h */; settings = {ATTRIBUTES = (Private, ); }; };
1A569D050D7E2B82007C3983 /* jni_objc.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1A569CD50D7E2B82007C3983 /* jni_objc.mm */; };
- 1A569D060D7E2B82007C3983 /* jni_runtime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A569CD60D7E2B82007C3983 /* jni_runtime.cpp */; };
- 1A569D070D7E2B82007C3983 /* jni_runtime.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A569CD70D7E2B82007C3983 /* jni_runtime.h */; };
1A569D0A0D7E2B82007C3983 /* NP_jsobject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A569CDA0D7E2B82007C3983 /* NP_jsobject.cpp */; };
1A569D0B0D7E2B82007C3983 /* NP_jsobject.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A569CDB0D7E2B82007C3983 /* NP_jsobject.h */; };
1A569D0C0D7E2B82007C3983 /* npapi.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A569CDC0D7E2B82007C3983 /* npapi.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -1109,6 +1107,8 @@
54C50F7B0E801DF3009832A0 /* XMLTokenizerLibxml2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 54C50F7A0E801DF3009832A0 /* XMLTokenizerLibxml2.cpp */; };
550A0BC9085F6039007353D6 /* QualifiedName.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 550A0BC7085F6039007353D6 /* QualifiedName.cpp */; };
550A0BCA085F6039007353D6 /* QualifiedName.h in Headers */ = {isa = PBXBuildFile; fileRef = 550A0BC8085F6039007353D6 /* QualifiedName.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 5913953B110758450083EC55 /* JNIBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 5913953A110758450083EC55 /* JNIBridge.h */; };
+ 5913953D1107584E0083EC55 /* JNIBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5913953C1107584E0083EC55 /* JNIBridge.cpp */; };
599E759011055A1F00D904FA /* Bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 599E758F11055A1F00D904FA /* Bridge.h */; settings = {ATTRIBUTES = (Private, ); }; };
599E759211055A2A00D904FA /* Bridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 599E759111055A2A00D904FA /* Bridge.cpp */; };
59A9E7B01104758800DFB4C1 /* JavaInstanceJSC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 59A9E7AF1104758800DFB4C1 /* JavaInstanceJSC.cpp */; };
@@ -5568,8 +5568,6 @@
1A569CD30D7E2B82007C3983 /* jni_jsobject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = jni_jsobject.mm; sourceTree = "<group>"; };
1A569CD40D7E2B82007C3983 /* jni_jsobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jni_jsobject.h; sourceTree = "<group>"; };
1A569CD50D7E2B82007C3983 /* jni_objc.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = jni_objc.mm; sourceTree = "<group>"; };
- 1A569CD60D7E2B82007C3983 /* jni_runtime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = jni_runtime.cpp; sourceTree = "<group>"; };
- 1A569CD70D7E2B82007C3983 /* jni_runtime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jni_runtime.h; sourceTree = "<group>"; };
1A569CDA0D7E2B82007C3983 /* NP_jsobject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NP_jsobject.cpp; path = bridge/NP_jsobject.cpp; sourceTree = "<group>"; };
1A569CDB0D7E2B82007C3983 /* NP_jsobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NP_jsobject.h; path = bridge/NP_jsobject.h; sourceTree = "<group>"; };
1A569CDC0D7E2B82007C3983 /* npapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = npapi.h; path = bridge/npapi.h; sourceTree = "<group>"; };
@@ -6473,6 +6471,8 @@
54C50F7A0E801DF3009832A0 /* XMLTokenizerLibxml2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XMLTokenizerLibxml2.cpp; sourceTree = "<group>"; };
550A0BC7085F6039007353D6 /* QualifiedName.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QualifiedName.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
550A0BC8085F6039007353D6 /* QualifiedName.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = QualifiedName.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
+ 5913953A110758450083EC55 /* JNIBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JNIBridge.h; sourceTree = "<group>"; };
+ 5913953C1107584E0083EC55 /* JNIBridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JNIBridge.cpp; sourceTree = "<group>"; };
599E758F11055A1F00D904FA /* Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Bridge.h; path = bridge/Bridge.h; sourceTree = "<group>"; };
599E759111055A2A00D904FA /* Bridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Bridge.cpp; path = bridge/Bridge.cpp; sourceTree = "<group>"; };
59A9E7AF1104758800DFB4C1 /* JavaInstanceJSC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JavaInstanceJSC.cpp; path = jsc/JavaInstanceJSC.cpp; sourceTree = "<group>"; };
@@ -10367,14 +10367,14 @@
1A569CCE0D7E2B82007C3983 /* jni */ = {
isa = PBXGroup;
children = (
+ 5913953C1107584E0083EC55 /* JNIBridge.cpp */,
+ 5913953A110758450083EC55 /* JNIBridge.h */,
59EE12311106082900885116 /* JNIUtility.h */,
59EE122F1106081F00885116 /* JNIUtility.cpp */,
599D1E2F10C97D4C00E0EF12 /* jsc */,
1A569CD40D7E2B82007C3983 /* jni_jsobject.h */,
1A569CD30D7E2B82007C3983 /* jni_jsobject.mm */,
1A569CD50D7E2B82007C3983 /* jni_objc.mm */,
- 1A569CD60D7E2B82007C3983 /* jni_runtime.cpp */,
- 1A569CD70D7E2B82007C3983 /* jni_runtime.h */,
);
name = jni;
path = bridge/jni;
@@ -17183,7 +17183,6 @@
1C81BA010E9733CB00266E07 /* JavaScriptProfile.h in Headers */,
1C81B9FF0E9733CB00266E07 /* JavaScriptProfileNode.h in Headers */,
1A569D040D7E2B82007C3983 /* jni_jsobject.h in Headers */,
- 1A569D070D7E2B82007C3983 /* jni_runtime.h in Headers */,
93309DF4099E64920056E581 /* JoinTextNodesCommand.h in Headers */,
418F88050FF957AF0080F045 /* JSAbstractWorker.h in Headers */,
65DF31DB09D1C123000BE325 /* JSAttr.h in Headers */,
@@ -18397,6 +18396,7 @@
76CDD2F31103DA6600680521 /* AccessibilityMenuList.h in Headers */,
76CDD2F51103DA6600680521 /* AccessibilityMenuListPopup.h in Headers */,
76CDD2F71103DA6600680521 /* AccessibilityMenuListOption.h in Headers */,
+ 5913953B110758450083EC55 /* JNIBridge.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -19364,7 +19364,6 @@
1C81BA000E9733CB00266E07 /* JavaScriptProfileNode.cpp in Sources */,
1A569D030D7E2B82007C3983 /* jni_jsobject.mm in Sources */,
1A569D050D7E2B82007C3983 /* jni_objc.mm in Sources */,
- 1A569D060D7E2B82007C3983 /* jni_runtime.cpp in Sources */,
93309DF3099E64920056E581 /* JoinTextNodesCommand.cpp in Sources */,
418F88040FF957AE0080F045 /* JSAbstractWorker.cpp in Sources */,
415B7C570FF598E6006770F7 /* JSAbstractWorkerCustom.cpp in Sources */,
@@ -20567,6 +20566,7 @@
76CDD2F21103DA6600680521 /* AccessibilityMenuList.cpp in Sources */,
76CDD2F41103DA6600680521 /* AccessibilityMenuListPopup.cpp in Sources */,
76CDD2F61103DA6600680521 /* AccessibilityMenuListOption.cpp in Sources */,
+ 5913953D1107584E0083EC55 /* JNIBridge.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/WebCore/bridge/jni/JNIBridge.cpp b/WebCore/bridge/jni/JNIBridge.cpp
new file mode 100644
index 0000000..042e8dc
--- /dev/null
+++ b/WebCore/bridge/jni/JNIBridge.cpp
@@ -0,0 +1,553 @@
+/*
+ * Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * 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.
+ */
+
+#include "config.h"
+#include "JNIBridge.h"
+
+#if ENABLE(MAC_JAVA_BRIDGE)
+
+#include "CString.h"
+#include "JNIUtility.h"
+#include "JNIUtilityPrivate.h"
+#include "StringBuilder.h"
+#include "runtime_array.h"
+#include "runtime_object.h"
+#include "runtime_root.h"
+#include <runtime/Error.h>
+#include <runtime/JSLock.h>
+
+#ifdef NDEBUG
+#define JS_LOG(formatAndArgs...) ((void)0)
+#else
+#define JS_LOG(formatAndArgs...) { \
+ fprintf (stderr, "%s:%d -- %s: ", __FILE__, __LINE__, __FUNCTION__); \
+ fprintf(stderr, formatAndArgs); \
+}
+#endif
+
+using namespace JSC;
+using namespace JSC::Bindings;
+using namespace WebCore;
+
+
+JavaParameter::JavaParameter (JNIEnv *env, jstring type)
+{
+ _type = JavaString (env, type);
+ _JNIType = JNITypeFromClassName (_type.UTF8String());
+}
+
+JavaField::JavaField (JNIEnv *env, jobject aField)
+{
+ // Get field type
+ jobject fieldType = callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;");
+ jstring fieldTypeName = (jstring)callJNIMethod<jobject>(fieldType, "getName", "()Ljava/lang/String;");
+ _type = JavaString(env, fieldTypeName);
+ _JNIType = JNITypeFromClassName (_type.UTF8String());
+
+ // Get field name
+ jstring fieldName = (jstring)callJNIMethod<jobject>(aField, "getName", "()Ljava/lang/String;");
+ _name = JavaString(env, fieldName);
+
+ _field = new JObjectWrapper(aField);
+}
+
+JSValue JavaArray::convertJObjectToArray(ExecState* exec, jobject anObject, const char* type, PassRefPtr<RootObject> rootObject)
+{
+ if (type[0] != '[')
+ return jsUndefined();
+
+ return new (exec) RuntimeArray(exec, new JavaArray((jobject)anObject, type, rootObject));
+}
+
+jvalue JavaField::dispatchValueFromInstance(ExecState *exec, const JavaInstance *instance, const char *name, const char *sig, JNIType returnType) const
+{
+ jobject jinstance = instance->javaInstance();
+ jobject fieldJInstance = _field->m_instance;
+ JNIEnv *env = getJNIEnv();
+ jvalue result;
+
+ bzero (&result, sizeof(jvalue));
+ jclass cls = env->GetObjectClass(fieldJInstance);
+ if ( cls != NULL ) {
+ jmethodID mid = env->GetMethodID(cls, name, sig);
+ if ( mid != NULL )
+ {
+ RootObject* rootObject = instance->rootObject();
+ if (rootObject && rootObject->nativeHandle()) {
+ JSValue exceptionDescription;
+ jvalue args[1];
+
+ args[0].l = jinstance;
+ dispatchJNICall(exec, rootObject->nativeHandle(), fieldJInstance, false, returnType, mid, args, result, 0, exceptionDescription);
+ if (exceptionDescription)
+ throwError(exec, GeneralError, exceptionDescription.toString(exec));
+ }
+ }
+ }
+ return result;
+}
+
+JSValue JavaField::valueFromInstance(ExecState* exec, const Instance* i) const
+{
+ const JavaInstance *instance = static_cast<const JavaInstance *>(i);
+
+ JSValue jsresult = jsUndefined();
+
+ switch (_JNIType) {
+ case array_type:
+ case object_type: {
+ jvalue result = dispatchValueFromInstance (exec, instance, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", object_type);
+ jobject anObject = result.l;
+
+ const char *arrayType = type();
+ if (arrayType[0] == '[') {
+ jsresult = JavaArray::convertJObjectToArray(exec, anObject, arrayType, instance->rootObject());
+ }
+ else if (anObject != 0){
+ jsresult = JavaInstance::create(anObject, instance->rootObject())->createRuntimeObject(exec);
+ }
+ }
+ break;
+
+ case boolean_type:
+ jsresult = jsBoolean(dispatchValueFromInstance(exec, instance, "getBoolean", "(Ljava/lang/Object;)Z", boolean_type).z);
+ break;
+
+ case byte_type:
+ case char_type:
+ case short_type:
+
+ case int_type: {
+ jint value;
+ jvalue result = dispatchValueFromInstance (exec, instance, "getInt", "(Ljava/lang/Object;)I", int_type);
+ value = result.i;
+ jsresult = jsNumber(exec, (int)value);
+ }
+ break;
+
+ case long_type:
+ case float_type:
+ case double_type: {
+ jdouble value;
+ jvalue result = dispatchValueFromInstance (exec, instance, "getDouble", "(Ljava/lang/Object;)D", double_type);
+ value = result.i;
+ jsresult = jsNumber(exec, (double)value);
+ }
+ break;
+ default:
+ break;
+ }
+
+ JS_LOG ("getting %s = %s\n", UString(name()).UTF8String().c_str(), jsresult.toString(exec).ascii());
+
+ return jsresult;
+}
+
+void JavaField::dispatchSetValueToInstance(ExecState *exec, const JavaInstance *instance, jvalue javaValue, const char *name, const char *sig) const
+{
+ jobject jinstance = instance->javaInstance();
+ jobject fieldJInstance = _field->m_instance;
+ JNIEnv *env = getJNIEnv();
+
+ jclass cls = env->GetObjectClass(fieldJInstance);
+ if ( cls != NULL ) {
+ jmethodID mid = env->GetMethodID(cls, name, sig);
+ if ( mid != NULL )
+ {
+ RootObject* rootObject = instance->rootObject();
+ if (rootObject && rootObject->nativeHandle()) {
+ JSValue exceptionDescription;
+ jvalue args[2];
+ jvalue result;
+
+ args[0].l = jinstance;
+ args[1] = javaValue;
+ dispatchJNICall(exec, rootObject->nativeHandle(), fieldJInstance, false, void_type, mid, args, result, 0, exceptionDescription);
+ if (exceptionDescription)
+ throwError(exec, GeneralError, exceptionDescription.toString(exec));
+ }
+ }
+ }
+}
+
+void JavaField::setValueToInstance(ExecState* exec, const Instance* i, JSValue aValue) const
+{
+ const JavaInstance *instance = static_cast<const JavaInstance *>(i);
+ jvalue javaValue = convertValueToJValue (exec, aValue, _JNIType, type());
+
+ JS_LOG ("setting value %s to %s\n", UString(name()).UTF8String().c_str(), aValue.toString(exec).ascii());
+
+ switch (_JNIType) {
+ case array_type:
+ case object_type: {
+ dispatchSetValueToInstance (exec, instance, javaValue, "set", "(Ljava/lang/Object;Ljava/lang/Object;)V");
+ }
+ break;
+
+ case boolean_type: {
+ dispatchSetValueToInstance (exec, instance, javaValue, "setBoolean", "(Ljava/lang/Object;Z)V");
+ }
+ break;
+
+ case byte_type: {
+ dispatchSetValueToInstance (exec, instance, javaValue, "setByte", "(Ljava/lang/Object;B)V");
+ }
+ break;
+
+ case char_type: {
+ dispatchSetValueToInstance (exec, instance, javaValue, "setChar", "(Ljava/lang/Object;C)V");
+ }
+ break;
+
+ case short_type: {
+ dispatchSetValueToInstance (exec, instance, javaValue, "setShort", "(Ljava/lang/Object;S)V");
+ }
+ break;
+
+ case int_type: {
+ dispatchSetValueToInstance (exec, instance, javaValue, "setInt", "(Ljava/lang/Object;I)V");
+ }
+ break;
+
+ case long_type: {
+ dispatchSetValueToInstance (exec, instance, javaValue, "setLong", "(Ljava/lang/Object;J)V");
+ }
+ break;
+
+ case float_type: {
+ dispatchSetValueToInstance (exec, instance, javaValue, "setFloat", "(Ljava/lang/Object;F)V");
+ }
+ break;
+
+ case double_type: {
+ dispatchSetValueToInstance (exec, instance, javaValue, "setDouble", "(Ljava/lang/Object;D)V");
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+JavaMethod::JavaMethod (JNIEnv *env, jobject aMethod)
+{
+ // Get return type
+ jobject returnType = callJNIMethod<jobject>(aMethod, "getReturnType", "()Ljava/lang/Class;");
+ jstring returnTypeName = (jstring)callJNIMethod<jobject>(returnType, "getName", "()Ljava/lang/String;");
+ _returnType =JavaString (env, returnTypeName);
+ _JNIReturnType = JNITypeFromClassName (_returnType.UTF8String());
+ env->DeleteLocalRef (returnType);
+ env->DeleteLocalRef (returnTypeName);
+
+ // Get method name
+ jstring methodName = (jstring)callJNIMethod<jobject>(aMethod, "getName", "()Ljava/lang/String;");
+ _name = JavaString (env, methodName);
+ env->DeleteLocalRef (methodName);
+
+ // Get parameters
+ jarray jparameters = (jarray)callJNIMethod<jobject>(aMethod, "getParameterTypes", "()[Ljava/lang/Class;");
+ _numParameters = env->GetArrayLength (jparameters);
+ _parameters = new JavaParameter[_numParameters];
+
+ int i;
+ for (i = 0; i < _numParameters; i++) {
+ jobject aParameter = env->GetObjectArrayElement ((jobjectArray)jparameters, i);
+ jstring parameterName = (jstring)callJNIMethod<jobject>(aParameter, "getName", "()Ljava/lang/String;");
+ _parameters[i] = JavaParameter(env, parameterName);
+ env->DeleteLocalRef (aParameter);
+ env->DeleteLocalRef (parameterName);
+ }
+ env->DeleteLocalRef (jparameters);
+
+ // Created lazily.
+ _signature = 0;
+ _methodID = 0;
+
+ jclass modifierClass = env->FindClass("java/lang/reflect/Modifier");
+ int modifiers = callJNIMethod<jint>(aMethod, "getModifiers", "()I");
+ _isStatic = (bool)callJNIStaticMethod<jboolean>(modifierClass, "isStatic", "(I)Z", modifiers);
+ env->DeleteLocalRef(modifierClass);
+}
+
+JavaMethod::~JavaMethod()
+{
+ if (_signature)
+ free(_signature);
+ delete [] _parameters;
+};
+
+// JNI method signatures use '/' between components of a class name, but
+// we get '.' between components from the reflection API.
+static void appendClassName(StringBuilder& builder, const char* className)
+{
+ ASSERT(JSLock::lockCount() > 0);
+
+ char *result, *cp = strdup(className);
+
+ result = cp;
+ while (*cp) {
+ if (*cp == '.')
+ *cp = '/';
+ cp++;
+ }
+
+ builder.append(result);
+
+ free(result);
+}
+
+const char *JavaMethod::signature() const
+{
+ if (!_signature) {
+ JSLock lock(SilenceAssertionsOnly);
+
+ StringBuilder signatureBuilder;
+ signatureBuilder.append("(");
+ for (int i = 0; i < _numParameters; i++) {
+ JavaParameter* aParameter = parameterAt(i);
+ JNIType _JNIType = aParameter->getJNIType();
+ if (_JNIType == array_type)
+ appendClassName(signatureBuilder, aParameter->type());
+ else {
+ signatureBuilder.append(signatureFromPrimitiveType(_JNIType));
+ if (_JNIType == object_type) {
+ appendClassName(signatureBuilder, aParameter->type());
+ signatureBuilder.append(";");
+ }
+ }
+ }
+ signatureBuilder.append(")");
+
+ const char *returnType = _returnType.UTF8String();
+ if (_JNIReturnType == array_type) {
+ appendClassName(signatureBuilder, returnType);
+ } else {
+ signatureBuilder.append(signatureFromPrimitiveType(_JNIReturnType));
+ if (_JNIReturnType == object_type) {
+ appendClassName(signatureBuilder, returnType);
+ signatureBuilder.append(";");
+ }
+ }
+
+ String signatureString = signatureBuilder.toString();
+ _signature = strdup(signatureString.utf8().data());
+ }
+
+ return _signature;
+}
+
+JNIType JavaMethod::JNIReturnType() const
+{
+ return _JNIReturnType;
+}
+
+jmethodID JavaMethod::methodID (jobject obj) const
+{
+ if (_methodID == 0) {
+ _methodID = getMethodID (obj, _name.UTF8String(), signature());
+ }
+ return _methodID;
+}
+
+
+JavaArray::JavaArray(jobject array, const char* type, PassRefPtr<RootObject> rootObject)
+ : Array(rootObject)
+{
+ _array = new JObjectWrapper(array);
+ // Java array are fixed length, so we can cache length.
+ JNIEnv *env = getJNIEnv();
+ _length = env->GetArrayLength((jarray)_array->m_instance);
+ _type = strdup(type);
+ m_rootObject = rootObject;
+}
+
+JavaArray::~JavaArray ()
+{
+ free ((void *)_type);
+}
+
+RootObject* JavaArray::rootObject() const
+{
+ return m_rootObject && m_rootObject->isValid() ? m_rootObject.get() : 0;
+}
+
+void JavaArray::setValueAt(ExecState* exec, unsigned index, JSValue aValue) const
+{
+ JNIEnv *env = getJNIEnv();
+ char *javaClassName = 0;
+
+ JNIType arrayType = JNITypeFromPrimitiveType(_type[1]);
+ if (_type[1] == 'L'){
+ // The type of the array will be something like:
+ // "[Ljava.lang.string;". This is guaranteed, so no need
+ // for extra sanity checks.
+ javaClassName = strdup(&_type[2]);
+ javaClassName[strchr(javaClassName, ';')-javaClassName] = 0;
+ }
+ jvalue aJValue = convertValueToJValue (exec, aValue, arrayType, javaClassName);
+
+ switch (arrayType) {
+ case object_type: {
+ env->SetObjectArrayElement((jobjectArray)javaArray(), index, aJValue.l);
+ break;
+ }
+
+ case boolean_type: {
+ env->SetBooleanArrayRegion((jbooleanArray)javaArray(), index, 1, &aJValue.z);
+ break;
+ }
+
+ case byte_type: {
+ env->SetByteArrayRegion((jbyteArray)javaArray(), index, 1, &aJValue.b);
+ break;
+ }
+
+ case char_type: {
+ env->SetCharArrayRegion((jcharArray)javaArray(), index, 1, &aJValue.c);
+ break;
+ }
+
+ case short_type: {
+ env->SetShortArrayRegion((jshortArray)javaArray(), index, 1, &aJValue.s);
+ break;
+ }
+
+ case int_type: {
+ env->SetIntArrayRegion((jintArray)javaArray(), index, 1, &aJValue.i);
+ break;
+ }
+
+ case long_type: {
+ env->SetLongArrayRegion((jlongArray)javaArray(), index, 1, &aJValue.j);
+ }
+
+ case float_type: {
+ env->SetFloatArrayRegion((jfloatArray)javaArray(), index, 1, &aJValue.f);
+ break;
+ }
+
+ case double_type: {
+ env->SetDoubleArrayRegion((jdoubleArray)javaArray(), index, 1, &aJValue.d);
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (javaClassName)
+ free ((void *)javaClassName);
+}
+
+
+JSValue JavaArray::valueAt(ExecState* exec, unsigned index) const
+{
+ JNIEnv *env = getJNIEnv();
+ JNIType arrayType = JNITypeFromPrimitiveType(_type[1]);
+ switch (arrayType) {
+ case object_type: {
+ jobjectArray objectArray = (jobjectArray)javaArray();
+ jobject anObject;
+ anObject = env->GetObjectArrayElement(objectArray, index);
+
+ // No object?
+ if (!anObject) {
+ return jsNull();
+ }
+
+ // Nested array?
+ if (_type[1] == '[') {
+ return JavaArray::convertJObjectToArray(exec, anObject, _type+1, rootObject());
+ }
+ // or array of other object type?
+ return JavaInstance::create(anObject, rootObject())->createRuntimeObject(exec);
+ }
+
+ case boolean_type: {
+ jbooleanArray booleanArray = (jbooleanArray)javaArray();
+ jboolean aBoolean;
+ env->GetBooleanArrayRegion(booleanArray, index, 1, &aBoolean);
+ return jsBoolean(aBoolean);
+ }
+
+ case byte_type: {
+ jbyteArray byteArray = (jbyteArray)javaArray();
+ jbyte aByte;
+ env->GetByteArrayRegion(byteArray, index, 1, &aByte);
+ return jsNumber(exec, aByte);
+ }
+
+ case char_type: {
+ jcharArray charArray = (jcharArray)javaArray();
+ jchar aChar;
+ env->GetCharArrayRegion(charArray, index, 1, &aChar);
+ return jsNumber(exec, aChar);
+ break;
+ }
+
+ case short_type: {
+ jshortArray shortArray = (jshortArray)javaArray();
+ jshort aShort;
+ env->GetShortArrayRegion(shortArray, index, 1, &aShort);
+ return jsNumber(exec, aShort);
+ }
+
+ case int_type: {
+ jintArray intArray = (jintArray)javaArray();
+ jint anInt;
+ env->GetIntArrayRegion(intArray, index, 1, &anInt);
+ return jsNumber(exec, anInt);
+ }
+
+ case long_type: {
+ jlongArray longArray = (jlongArray)javaArray();
+ jlong aLong;
+ env->GetLongArrayRegion(longArray, index, 1, &aLong);
+ return jsNumber(exec, aLong);
+ }
+
+ case float_type: {
+ jfloatArray floatArray = (jfloatArray)javaArray();
+ jfloat aFloat;
+ env->GetFloatArrayRegion(floatArray, index, 1, &aFloat);
+ return jsNumber(exec, aFloat);
+ }
+
+ case double_type: {
+ jdoubleArray doubleArray = (jdoubleArray)javaArray();
+ jdouble aDouble;
+ env->GetDoubleArrayRegion(doubleArray, index, 1, &aDouble);
+ return jsNumber(exec, aDouble);
+ }
+ default:
+ break;
+ }
+ return jsUndefined();
+}
+
+unsigned int JavaArray::getLength() const
+{
+ return _length;
+}
+
+#endif // ENABLE(MAC_JAVA_BRIDGE)
diff --git a/WebCore/bridge/jni/JNIBridge.h b/WebCore/bridge/jni/JNIBridge.h
new file mode 100644
index 0000000..f3942c5
--- /dev/null
+++ b/WebCore/bridge/jni/JNIBridge.h
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * 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.
+ */
+
+#ifndef JNIBridge_h
+#define JNIBridge_h
+
+#if ENABLE(MAC_JAVA_BRIDGE)
+
+#include "JNIUtility.h"
+#include "JavaInstanceJSC.h"
+
+#if USE(JSC)
+#include "JavaStringJSC.h"
+#endif
+
+namespace JSC
+{
+
+namespace Bindings
+{
+
+typedef const char* RuntimeType;
+
+class JavaString
+{
+public:
+ JavaString()
+ {
+ m_impl.init();
+ }
+
+ JavaString(JNIEnv* e, jstring s)
+ {
+ m_impl.init(e, s);
+ }
+
+ JavaString(jstring s)
+ {
+ m_impl.init(getJNIEnv(), s);
+ }
+
+ const char* UTF8String() const { return m_impl.UTF8String(); }
+ const jchar* uchars() const { return m_impl.uchars(); }
+ int length() const { return m_impl.length(); }
+#if USE(JSC)
+ operator UString() const { return m_impl.uString(); }
+#endif
+
+private:
+ JavaStringImpl m_impl;
+};
+
+class JavaParameter
+{
+public:
+ JavaParameter () : _JNIType(invalid_type) {};
+ JavaParameter (JNIEnv *env, jstring type);
+ virtual ~JavaParameter() { }
+
+ RuntimeType type() const { return _type.UTF8String(); }
+ JNIType getJNIType() const { return _JNIType; }
+
+private:
+ JavaString _type;
+ JNIType _JNIType;
+};
+
+
+class JavaField : public Field
+{
+public:
+ JavaField (JNIEnv *env, jobject aField);
+
+ virtual JSValue valueFromInstance(ExecState *exec, const Instance *instance) const;
+ virtual void setValueToInstance(ExecState *exec, const Instance *instance, JSValue aValue) const;
+
+ const JavaString& name() const { return _name; }
+ virtual RuntimeType type() const { return _type.UTF8String(); }
+
+ JNIType getJNIType() const { return _JNIType; }
+
+private:
+ void dispatchSetValueToInstance(ExecState *exec, const JavaInstance *instance, jvalue javaValue, const char *name, const char *sig) const;
+ jvalue dispatchValueFromInstance(ExecState *exec, const JavaInstance *instance, const char *name, const char *sig, JNIType returnType) const;
+
+ JavaString _name;
+ JavaString _type;
+ JNIType _JNIType;
+ RefPtr<JObjectWrapper> _field;
+};
+
+
+class JavaMethod : public Method
+{
+public:
+ JavaMethod(JNIEnv* env, jobject aMethod);
+ ~JavaMethod();
+
+ const JavaString& name() const { return _name; }
+ RuntimeType returnType() const { return _returnType.UTF8String(); };
+ JavaParameter* parameterAt(int i) const { return &_parameters[i]; };
+ int numParameters() const { return _numParameters; };
+
+ const char *signature() const;
+ JNIType JNIReturnType() const;
+
+ jmethodID methodID (jobject obj) const;
+
+ bool isStatic() const { return _isStatic; }
+
+private:
+ JavaParameter* _parameters;
+ int _numParameters;
+ JavaString _name;
+ mutable char* _signature;
+ JavaString _returnType;
+ JNIType _JNIReturnType;
+ mutable jmethodID _methodID;
+ bool _isStatic;
+};
+
+class JavaArray : public Array
+{
+public:
+ JavaArray(jobject array, const char* type, PassRefPtr<RootObject>);
+ virtual ~JavaArray();
+
+ RootObject* rootObject() const;
+
+ virtual void setValueAt(ExecState *exec, unsigned int index, JSValue aValue) const;
+ virtual JSValue valueAt(ExecState *exec, unsigned int index) const;
+ virtual unsigned int getLength() const;
+
+ jobject javaArray() const { return _array->m_instance; }
+
+ static JSValue convertJObjectToArray (ExecState* exec, jobject anObject, const char* type, PassRefPtr<RootObject>);
+
+private:
+ RefPtr<JObjectWrapper> _array;
+ unsigned int _length;
+ const char *_type;
+};
+
+} // namespace Bindings
+
+} // namespace JSC
+
+#endif // ENABLE(MAC_JAVA_BRIDGE)
+
+#endif // JNIBridge_h
diff --git a/WebCore/bridge/jni/jni_jsobject.mm b/WebCore/bridge/jni/jni_jsobject.mm
index 2d288b4..de67711 100644
--- a/WebCore/bridge/jni/jni_jsobject.mm
+++ b/WebCore/bridge/jni/jni_jsobject.mm
@@ -29,13 +29,13 @@
#if ENABLE(MAC_JAVA_BRIDGE)
#include "Frame.h"
+#include "JNIBridge.h"
#include "JNIUtility.h"
#include "JNIUtilityPrivate.h"
#include "JSDOMBinding.h"
#include "ScriptController.h"
#include "StringSourceProvider.h"
#include "WebCoreFrameView.h"
-#include "jni_runtime.h"
#include "runtime_object.h"
#include "runtime_root.h"
#include <interpreter/CallFrame.h>
diff --git a/WebCore/bridge/jni/jni_runtime.cpp b/WebCore/bridge/jni/jni_runtime.cpp
deleted file mode 100644
index 2f5ba19..0000000
--- a/WebCore/bridge/jni/jni_runtime.cpp
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- * Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * 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.
- */
-
-#include "config.h"
-#include <jni_runtime.h>
-
-#if ENABLE(MAC_JAVA_BRIDGE)
-
-#include "CString.h"
-#include "JNIUtility.h"
-#include "JNIUtilityPrivate.h"
-#include "StringBuilder.h"
-#include "runtime_array.h"
-#include "runtime_object.h"
-#include "runtime_root.h"
-#include <runtime/Error.h>
-#include <runtime/JSLock.h>
-
-#ifdef NDEBUG
-#define JS_LOG(formatAndArgs...) ((void)0)
-#else
-#define JS_LOG(formatAndArgs...) { \
- fprintf (stderr, "%s:%d -- %s: ", __FILE__, __LINE__, __FUNCTION__); \
- fprintf(stderr, formatAndArgs); \
-}
-#endif
-
-using namespace JSC;
-using namespace JSC::Bindings;
-using namespace WebCore;
-
-
-JavaParameter::JavaParameter (JNIEnv *env, jstring type)
-{
- _type = JavaString (env, type);
- _JNIType = JNITypeFromClassName (_type.UTF8String());
-}
-
-JavaField::JavaField (JNIEnv *env, jobject aField)
-{
- // Get field type
- jobject fieldType = callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;");
- jstring fieldTypeName = (jstring)callJNIMethod<jobject>(fieldType, "getName", "()Ljava/lang/String;");
- _type = JavaString(env, fieldTypeName);
- _JNIType = JNITypeFromClassName (_type.UTF8String());
-
- // Get field name
- jstring fieldName = (jstring)callJNIMethod<jobject>(aField, "getName", "()Ljava/lang/String;");
- _name = JavaString(env, fieldName);
-
- _field = new JObjectWrapper(aField);
-}
-
-JSValue JavaArray::convertJObjectToArray(ExecState* exec, jobject anObject, const char* type, PassRefPtr<RootObject> rootObject)
-{
- if (type[0] != '[')
- return jsUndefined();
-
- return new (exec) RuntimeArray(exec, new JavaArray((jobject)anObject, type, rootObject));
-}
-
-jvalue JavaField::dispatchValueFromInstance(ExecState *exec, const JavaInstance *instance, const char *name, const char *sig, JNIType returnType) const
-{
- jobject jinstance = instance->javaInstance();
- jobject fieldJInstance = _field->m_instance;
- JNIEnv *env = getJNIEnv();
- jvalue result;
-
- bzero (&result, sizeof(jvalue));
- jclass cls = env->GetObjectClass(fieldJInstance);
- if ( cls != NULL ) {
- jmethodID mid = env->GetMethodID(cls, name, sig);
- if ( mid != NULL )
- {
- RootObject* rootObject = instance->rootObject();
- if (rootObject && rootObject->nativeHandle()) {
- JSValue exceptionDescription;
- jvalue args[1];
-
- args[0].l = jinstance;
- dispatchJNICall(exec, rootObject->nativeHandle(), fieldJInstance, false, returnType, mid, args, result, 0, exceptionDescription);
- if (exceptionDescription)
- throwError(exec, GeneralError, exceptionDescription.toString(exec));
- }
- }
- }
- return result;
-}
-
-JSValue JavaField::valueFromInstance(ExecState* exec, const Instance* i) const
-{
- const JavaInstance *instance = static_cast<const JavaInstance *>(i);
-
- JSValue jsresult = jsUndefined();
-
- switch (_JNIType) {
- case array_type:
- case object_type: {
- jvalue result = dispatchValueFromInstance (exec, instance, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", object_type);
- jobject anObject = result.l;
-
- const char *arrayType = type();
- if (arrayType[0] == '[') {
- jsresult = JavaArray::convertJObjectToArray(exec, anObject, arrayType, instance->rootObject());
- }
- else if (anObject != 0){
- jsresult = JavaInstance::create(anObject, instance->rootObject())->createRuntimeObject(exec);
- }
- }
- break;
-
- case boolean_type:
- jsresult = jsBoolean(dispatchValueFromInstance(exec, instance, "getBoolean", "(Ljava/lang/Object;)Z", boolean_type).z);
- break;
-
- case byte_type:
- case char_type:
- case short_type:
-
- case int_type: {
- jint value;
- jvalue result = dispatchValueFromInstance (exec, instance, "getInt", "(Ljava/lang/Object;)I", int_type);
- value = result.i;
- jsresult = jsNumber(exec, (int)value);
- }
- break;
-
- case long_type:
- case float_type:
- case double_type: {
- jdouble value;
- jvalue result = dispatchValueFromInstance (exec, instance, "getDouble", "(Ljava/lang/Object;)D", double_type);
- value = result.i;
- jsresult = jsNumber(exec, (double)value);
- }
- break;
- default:
- break;
- }
-
- JS_LOG ("getting %s = %s\n", UString(name()).UTF8String().c_str(), jsresult.toString(exec).ascii());
-
- return jsresult;
-}
-
-void JavaField::dispatchSetValueToInstance(ExecState *exec, const JavaInstance *instance, jvalue javaValue, const char *name, const char *sig) const
-{
- jobject jinstance = instance->javaInstance();
- jobject fieldJInstance = _field->m_instance;
- JNIEnv *env = getJNIEnv();
-
- jclass cls = env->GetObjectClass(fieldJInstance);
- if ( cls != NULL ) {
- jmethodID mid = env->GetMethodID(cls, name, sig);
- if ( mid != NULL )
- {
- RootObject* rootObject = instance->rootObject();
- if (rootObject && rootObject->nativeHandle()) {
- JSValue exceptionDescription;
- jvalue args[2];
- jvalue result;
-
- args[0].l = jinstance;
- args[1] = javaValue;
- dispatchJNICall(exec, rootObject->nativeHandle(), fieldJInstance, false, void_type, mid, args, result, 0, exceptionDescription);
- if (exceptionDescription)
- throwError(exec, GeneralError, exceptionDescription.toString(exec));
- }
- }
- }
-}
-
-void JavaField::setValueToInstance(ExecState* exec, const Instance* i, JSValue aValue) const
-{
- const JavaInstance *instance = static_cast<const JavaInstance *>(i);
- jvalue javaValue = convertValueToJValue (exec, aValue, _JNIType, type());
-
- JS_LOG ("setting value %s to %s\n", UString(name()).UTF8String().c_str(), aValue.toString(exec).ascii());
-
- switch (_JNIType) {
- case array_type:
- case object_type: {
- dispatchSetValueToInstance (exec, instance, javaValue, "set", "(Ljava/lang/Object;Ljava/lang/Object;)V");
- }
- break;
-
- case boolean_type: {
- dispatchSetValueToInstance (exec, instance, javaValue, "setBoolean", "(Ljava/lang/Object;Z)V");
- }
- break;
-
- case byte_type: {
- dispatchSetValueToInstance (exec, instance, javaValue, "setByte", "(Ljava/lang/Object;B)V");
- }
- break;
-
- case char_type: {
- dispatchSetValueToInstance (exec, instance, javaValue, "setChar", "(Ljava/lang/Object;C)V");
- }
- break;
-
- case short_type: {
- dispatchSetValueToInstance (exec, instance, javaValue, "setShort", "(Ljava/lang/Object;S)V");
- }
- break;
-
- case int_type: {
- dispatchSetValueToInstance (exec, instance, javaValue, "setInt", "(Ljava/lang/Object;I)V");
- }
- break;
-
- case long_type: {
- dispatchSetValueToInstance (exec, instance, javaValue, "setLong", "(Ljava/lang/Object;J)V");
- }
- break;
-
- case float_type: {
- dispatchSetValueToInstance (exec, instance, javaValue, "setFloat", "(Ljava/lang/Object;F)V");
- }
- break;
-
- case double_type: {
- dispatchSetValueToInstance (exec, instance, javaValue, "setDouble", "(Ljava/lang/Object;D)V");
- }
- break;
- default:
- break;
- }
-}
-
-JavaMethod::JavaMethod (JNIEnv *env, jobject aMethod)
-{
- // Get return type
- jobject returnType = callJNIMethod<jobject>(aMethod, "getReturnType", "()Ljava/lang/Class;");
- jstring returnTypeName = (jstring)callJNIMethod<jobject>(returnType, "getName", "()Ljava/lang/String;");
- _returnType =JavaString (env, returnTypeName);
- _JNIReturnType = JNITypeFromClassName (_returnType.UTF8String());
- env->DeleteLocalRef (returnType);
- env->DeleteLocalRef (returnTypeName);
-
- // Get method name
- jstring methodName = (jstring)callJNIMethod<jobject>(aMethod, "getName", "()Ljava/lang/String;");
- _name = JavaString (env, methodName);
- env->DeleteLocalRef (methodName);
-
- // Get parameters
- jarray jparameters = (jarray)callJNIMethod<jobject>(aMethod, "getParameterTypes", "()[Ljava/lang/Class;");
- _numParameters = env->GetArrayLength (jparameters);
- _parameters = new JavaParameter[_numParameters];
-
- int i;
- for (i = 0; i < _numParameters; i++) {
- jobject aParameter = env->GetObjectArrayElement ((jobjectArray)jparameters, i);
- jstring parameterName = (jstring)callJNIMethod<jobject>(aParameter, "getName", "()Ljava/lang/String;");
- _parameters[i] = JavaParameter(env, parameterName);
- env->DeleteLocalRef (aParameter);
- env->DeleteLocalRef (parameterName);
- }
- env->DeleteLocalRef (jparameters);
-
- // Created lazily.
- _signature = 0;
- _methodID = 0;
-
- jclass modifierClass = env->FindClass("java/lang/reflect/Modifier");
- int modifiers = callJNIMethod<jint>(aMethod, "getModifiers", "()I");
- _isStatic = (bool)callJNIStaticMethod<jboolean>(modifierClass, "isStatic", "(I)Z", modifiers);
- env->DeleteLocalRef(modifierClass);
-}
-
-JavaMethod::~JavaMethod()
-{
- if (_signature)
- free(_signature);
- delete [] _parameters;
-};
-
-// JNI method signatures use '/' between components of a class name, but
-// we get '.' between components from the reflection API.
-static void appendClassName(StringBuilder& builder, const char* className)
-{
- ASSERT(JSLock::lockCount() > 0);
-
- char *result, *cp = strdup(className);
-
- result = cp;
- while (*cp) {
- if (*cp == '.')
- *cp = '/';
- cp++;
- }
-
- builder.append(result);
-
- free(result);
-}
-
-const char *JavaMethod::signature() const
-{
- if (!_signature) {
- JSLock lock(SilenceAssertionsOnly);
-
- StringBuilder signatureBuilder;
- signatureBuilder.append("(");
- for (int i = 0; i < _numParameters; i++) {
- JavaParameter* aParameter = parameterAt(i);
- JNIType _JNIType = aParameter->getJNIType();
- if (_JNIType == array_type)
- appendClassName(signatureBuilder, aParameter->type());
- else {
- signatureBuilder.append(signatureFromPrimitiveType(_JNIType));
- if (_JNIType == object_type) {
- appendClassName(signatureBuilder, aParameter->type());
- signatureBuilder.append(";");
- }
- }
- }
- signatureBuilder.append(")");
-
- const char *returnType = _returnType.UTF8String();
- if (_JNIReturnType == array_type) {
- appendClassName(signatureBuilder, returnType);
- } else {
- signatureBuilder.append(signatureFromPrimitiveType(_JNIReturnType));
- if (_JNIReturnType == object_type) {
- appendClassName(signatureBuilder, returnType);
- signatureBuilder.append(";");
- }
- }
-
- String signatureString = signatureBuilder.toString();
- _signature = strdup(signatureString.utf8().data());
- }
-
- return _signature;
-}
-
-JNIType JavaMethod::JNIReturnType() const
-{
- return _JNIReturnType;
-}
-
-jmethodID JavaMethod::methodID (jobject obj) const
-{
- if (_methodID == 0) {
- _methodID = getMethodID (obj, _name.UTF8String(), signature());
- }
- return _methodID;
-}
-
-
-JavaArray::JavaArray(jobject array, const char* type, PassRefPtr<RootObject> rootObject)
- : Array(rootObject)
-{
- _array = new JObjectWrapper(array);
- // Java array are fixed length, so we can cache length.
- JNIEnv *env = getJNIEnv();
- _length = env->GetArrayLength((jarray)_array->m_instance);
- _type = strdup(type);
- m_rootObject = rootObject;
-}
-
-JavaArray::~JavaArray ()
-{
- free ((void *)_type);
-}
-
-RootObject* JavaArray::rootObject() const
-{
- return m_rootObject && m_rootObject->isValid() ? m_rootObject.get() : 0;
-}
-
-void JavaArray::setValueAt(ExecState* exec, unsigned index, JSValue aValue) const
-{
- JNIEnv *env = getJNIEnv();
- char *javaClassName = 0;
-
- JNIType arrayType = JNITypeFromPrimitiveType(_type[1]);
- if (_type[1] == 'L'){
- // The type of the array will be something like:
- // "[Ljava.lang.string;". This is guaranteed, so no need
- // for extra sanity checks.
- javaClassName = strdup(&_type[2]);
- javaClassName[strchr(javaClassName, ';')-javaClassName] = 0;
- }
- jvalue aJValue = convertValueToJValue (exec, aValue, arrayType, javaClassName);
-
- switch (arrayType) {
- case object_type: {
- env->SetObjectArrayElement((jobjectArray)javaArray(), index, aJValue.l);
- break;
- }
-
- case boolean_type: {
- env->SetBooleanArrayRegion((jbooleanArray)javaArray(), index, 1, &aJValue.z);
- break;
- }
-
- case byte_type: {
- env->SetByteArrayRegion((jbyteArray)javaArray(), index, 1, &aJValue.b);
- break;
- }
-
- case char_type: {
- env->SetCharArrayRegion((jcharArray)javaArray(), index, 1, &aJValue.c);
- break;
- }
-
- case short_type: {
- env->SetShortArrayRegion((jshortArray)javaArray(), index, 1, &aJValue.s);
- break;
- }
-
- case int_type: {
- env->SetIntArrayRegion((jintArray)javaArray(), index, 1, &aJValue.i);
- break;
- }
-
- case long_type: {
- env->SetLongArrayRegion((jlongArray)javaArray(), index, 1, &aJValue.j);
- }
-
- case float_type: {
- env->SetFloatArrayRegion((jfloatArray)javaArray(), index, 1, &aJValue.f);
- break;
- }
-
- case double_type: {
- env->SetDoubleArrayRegion((jdoubleArray)javaArray(), index, 1, &aJValue.d);
- break;
- }
- default:
- break;
- }
-
- if (javaClassName)
- free ((void *)javaClassName);
-}
-
-
-JSValue JavaArray::valueAt(ExecState* exec, unsigned index) const
-{
- JNIEnv *env = getJNIEnv();
- JNIType arrayType = JNITypeFromPrimitiveType(_type[1]);
- switch (arrayType) {
- case object_type: {
- jobjectArray objectArray = (jobjectArray)javaArray();
- jobject anObject;
- anObject = env->GetObjectArrayElement(objectArray, index);
-
- // No object?
- if (!anObject) {
- return jsNull();
- }
-
- // Nested array?
- if (_type[1] == '[') {
- return JavaArray::convertJObjectToArray(exec, anObject, _type+1, rootObject());
- }
- // or array of other object type?
- return JavaInstance::create(anObject, rootObject())->createRuntimeObject(exec);
- }
-
- case boolean_type: {
- jbooleanArray booleanArray = (jbooleanArray)javaArray();
- jboolean aBoolean;
- env->GetBooleanArrayRegion(booleanArray, index, 1, &aBoolean);
- return jsBoolean(aBoolean);
- }
-
- case byte_type: {
- jbyteArray byteArray = (jbyteArray)javaArray();
- jbyte aByte;
- env->GetByteArrayRegion(byteArray, index, 1, &aByte);
- return jsNumber(exec, aByte);
- }
-
- case char_type: {
- jcharArray charArray = (jcharArray)javaArray();
- jchar aChar;
- env->GetCharArrayRegion(charArray, index, 1, &aChar);
- return jsNumber(exec, aChar);
- break;
- }
-
- case short_type: {
- jshortArray shortArray = (jshortArray)javaArray();
- jshort aShort;
- env->GetShortArrayRegion(shortArray, index, 1, &aShort);
- return jsNumber(exec, aShort);
- }
-
- case int_type: {
- jintArray intArray = (jintArray)javaArray();
- jint anInt;
- env->GetIntArrayRegion(intArray, index, 1, &anInt);
- return jsNumber(exec, anInt);
- }
-
- case long_type: {
- jlongArray longArray = (jlongArray)javaArray();
- jlong aLong;
- env->GetLongArrayRegion(longArray, index, 1, &aLong);
- return jsNumber(exec, aLong);
- }
-
- case float_type: {
- jfloatArray floatArray = (jfloatArray)javaArray();
- jfloat aFloat;
- env->GetFloatArrayRegion(floatArray, index, 1, &aFloat);
- return jsNumber(exec, aFloat);
- }
-
- case double_type: {
- jdoubleArray doubleArray = (jdoubleArray)javaArray();
- jdouble aDouble;
- env->GetDoubleArrayRegion(doubleArray, index, 1, &aDouble);
- return jsNumber(exec, aDouble);
- }
- default:
- break;
- }
- return jsUndefined();
-}
-
-unsigned int JavaArray::getLength() const
-{
- return _length;
-}
-
-#endif // ENABLE(MAC_JAVA_BRIDGE)
diff --git a/WebCore/bridge/jni/jni_runtime.h b/WebCore/bridge/jni/jni_runtime.h
deleted file mode 100644
index d0a9753..0000000
--- a/WebCore/bridge/jni/jni_runtime.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * 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.
- */
-
-#ifndef _JNI_RUNTIME_H_
-#define _JNI_RUNTIME_H_
-
-#if ENABLE(MAC_JAVA_BRIDGE)
-
-#include "JNIUtility.h"
-#include "JavaInstanceJSC.h"
-
-#if USE(JSC)
-#include "JavaStringJSC.h"
-#endif
-
-namespace JSC
-{
-
-namespace Bindings
-{
-
-typedef const char* RuntimeType;
-
-class JavaString
-{
-public:
- JavaString()
- {
- m_impl.init();
- }
-
- JavaString(JNIEnv* e, jstring s)
- {
- m_impl.init(e, s);
- }
-
- JavaString(jstring s)
- {
- m_impl.init(getJNIEnv(), s);
- }
-
- const char* UTF8String() const { return m_impl.UTF8String(); }
- const jchar* uchars() const { return m_impl.uchars(); }
- int length() const { return m_impl.length(); }
-#if USE(JSC)
- operator UString() const { return m_impl.uString(); }
-#endif
-
-private:
- JavaStringImpl m_impl;
-};
-
-class JavaParameter
-{
-public:
- JavaParameter () : _JNIType(invalid_type) {};
- JavaParameter (JNIEnv *env, jstring type);
- virtual ~JavaParameter() { }
-
- RuntimeType type() const { return _type.UTF8String(); }
- JNIType getJNIType() const { return _JNIType; }
-
-private:
- JavaString _type;
- JNIType _JNIType;
-};
-
-
-class JavaField : public Field
-{
-public:
- JavaField (JNIEnv *env, jobject aField);
-
- virtual JSValue valueFromInstance(ExecState *exec, const Instance *instance) const;
- virtual void setValueToInstance(ExecState *exec, const Instance *instance, JSValue aValue) const;
-
- const JavaString& name() const { return _name; }
- virtual RuntimeType type() const { return _type.UTF8String(); }
-
- JNIType getJNIType() const { return _JNIType; }
-
-private:
- void dispatchSetValueToInstance(ExecState *exec, const JavaInstance *instance, jvalue javaValue, const char *name, const char *sig) const;
- jvalue dispatchValueFromInstance(ExecState *exec, const JavaInstance *instance, const char *name, const char *sig, JNIType returnType) const;
-
- JavaString _name;
- JavaString _type;
- JNIType _JNIType;
- RefPtr<JObjectWrapper> _field;
-};
-
-
-class JavaMethod : public Method
-{
-public:
- JavaMethod(JNIEnv* env, jobject aMethod);
- ~JavaMethod();
-
- const JavaString& name() const { return _name; }
- RuntimeType returnType() const { return _returnType.UTF8String(); };
- JavaParameter* parameterAt(int i) const { return &_parameters[i]; };
- int numParameters() const { return _numParameters; };
-
- const char *signature() const;
- JNIType JNIReturnType() const;
-
- jmethodID methodID (jobject obj) const;
-
- bool isStatic() const { return _isStatic; }
-
-private:
- JavaParameter* _parameters;
- int _numParameters;
- JavaString _name;
- mutable char* _signature;
- JavaString _returnType;
- JNIType _JNIReturnType;
- mutable jmethodID _methodID;
- bool _isStatic;
-};
-
-class JavaArray : public Array
-{
-public:
- JavaArray(jobject array, const char* type, PassRefPtr<RootObject>);
- virtual ~JavaArray();
-
- RootObject* rootObject() const;
-
- virtual void setValueAt(ExecState *exec, unsigned int index, JSValue aValue) const;
- virtual JSValue valueAt(ExecState *exec, unsigned int index) const;
- virtual unsigned int getLength() const;
-
- jobject javaArray() const { return _array->m_instance; }
-
- static JSValue convertJObjectToArray (ExecState* exec, jobject anObject, const char* type, PassRefPtr<RootObject>);
-
-private:
- RefPtr<JObjectWrapper> _array;
- unsigned int _length;
- const char *_type;
-};
-
-} // namespace Bindings
-
-} // namespace JSC
-
-#endif // ENABLE(MAC_JAVA_BRIDGE)
-
-#endif // _JNI_RUNTIME_H_
diff --git a/WebCore/bridge/jni/jsc/JNIUtilityPrivate.cpp b/WebCore/bridge/jni/jsc/JNIUtilityPrivate.cpp
index 424c9d2..e89d0e0 100644
--- a/WebCore/bridge/jni/jsc/JNIUtilityPrivate.cpp
+++ b/WebCore/bridge/jni/jsc/JNIUtilityPrivate.cpp
@@ -29,7 +29,7 @@
#if ENABLE(MAC_JAVA_BRIDGE)
-#include "jni_runtime.h"
+#include "JNIBridge.h"
#include "runtime_array.h"
#include "runtime_object.h"
#include <runtime/JSArray.h>
diff --git a/WebCore/bridge/jni/jsc/JavaClassJSC.cpp b/WebCore/bridge/jni/jsc/JavaClassJSC.cpp
index 2c88314..350c8ae 100644
--- a/WebCore/bridge/jni/jsc/JavaClassJSC.cpp
+++ b/WebCore/bridge/jni/jsc/JavaClassJSC.cpp
@@ -30,7 +30,6 @@
#include "JNIUtility.h"
#include "JSDOMWindow.h"
-#include "jni_runtime.h"
#include <runtime/Identifier.h>
#include <runtime/JSLock.h>
diff --git a/WebCore/bridge/jni/jsc/JavaClassJSC.h b/WebCore/bridge/jni/jsc/JavaClassJSC.h
index 0c5983c..b20781b 100644
--- a/WebCore/bridge/jni/jsc/JavaClassJSC.h
+++ b/WebCore/bridge/jni/jsc/JavaClassJSC.h
@@ -28,7 +28,7 @@
#if ENABLE(MAC_JAVA_BRIDGE)
-#include "jni_runtime.h"
+#include "JNIBridge.h"
#include <wtf/HashMap.h>
namespace JSC {
diff --git a/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp b/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
index 60db151..d9e0f60 100644
--- a/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
+++ b/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
@@ -28,10 +28,10 @@
#if ENABLE(MAC_JAVA_BRIDGE)
+#include "JNIBridge.h"
#include "JNIUtility.h"
#include "JNIUtilityPrivate.h"
#include "JavaClassJSC.h"
-#include "jni_runtime.h"
#include "runtime_object.h"
#include "runtime_root.h"
#include <runtime/ArgList.h>
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list