[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677
rjw
rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 08:16:50 UTC 2009
The following commit has been merged in the debian/unstable branch:
commit 463e6e624ced86da66a828f127db07e4be085bb9
Author: rjw <rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue Dec 9 00:53:54 2003 +0000
JavaScriptCore:
LiveConnect: The last piece of the JavaScript side of the
LiveConnect implementation. This change adds support for
setting/getting values from Java arrays in JavaScript.
Reviewed by John.
* bindings/jni/jni_instance.h:
* bindings/jni/jni_runtime.cpp:
(JavaField::JavaField):
(convertJObjectToArray):
(JavaArray::JavaArray):
(JavaArray::~JavaArray):
(JavaArray::setValueAt):
(JavaArray::valueAt):
(JavaArray::getLength):
* bindings/jni/jni_runtime.h:
(Bindings::JavaArray::operator=):
(Bindings::JavaArray::javaArray):
* bindings/jni/jni_utility.cpp:
(JNITypeFromPrimitiveType):
(convertValueToJValue):
* bindings/jni/jni_utility.h:
* bindings/runtime.h:
* bindings/runtime_array.cpp:
(RuntimeArrayImp::RuntimeArrayImp):
(RuntimeArrayImp::~RuntimeArrayImp):
(RuntimeArrayImp::get):
(RuntimeArrayImp::put):
(RuntimeArrayImp::hasProperty):
* bindings/runtime_array.h:
(KJS::RuntimeArrayImp::getLength):
(KJS::RuntimeArrayImp::getConcreteArray):
* bindings/runtime_object.cpp:
(RuntimeObjectImp::get):
(RuntimeObjectImp::canPut):
(RuntimeObjectImp::hasProperty):
Tests:
LiveConnect: Added tests for JavaScript to Java
array access.
Reviewed by John.
* LiveConnect/Blink/Blink.java:
(Blink):
(Blink.init):
* LiveConnect/Blink/test.html:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@5720 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog
index 9c1d8ac..b0865f6 100644
--- a/JavaScriptCore/ChangeLog
+++ b/JavaScriptCore/ChangeLog
@@ -1,3 +1,42 @@
+2003-12-08 Richard Williamson <rjw at apple.com>
+
+ LiveConnect: The last piece of the JavaScript side of the
+ LiveConnect implementation. This change adds support for
+ setting/getting values from Java arrays in JavaScript.
+
+ Reviewed by John.
+
+ * bindings/jni/jni_instance.h:
+ * bindings/jni/jni_runtime.cpp:
+ (JavaField::JavaField):
+ (convertJObjectToArray):
+ (JavaArray::JavaArray):
+ (JavaArray::~JavaArray):
+ (JavaArray::setValueAt):
+ (JavaArray::valueAt):
+ (JavaArray::getLength):
+ * bindings/jni/jni_runtime.h:
+ (Bindings::JavaArray::operator=):
+ (Bindings::JavaArray::javaArray):
+ * bindings/jni/jni_utility.cpp:
+ (JNITypeFromPrimitiveType):
+ (convertValueToJValue):
+ * bindings/jni/jni_utility.h:
+ * bindings/runtime.h:
+ * bindings/runtime_array.cpp:
+ (RuntimeArrayImp::RuntimeArrayImp):
+ (RuntimeArrayImp::~RuntimeArrayImp):
+ (RuntimeArrayImp::get):
+ (RuntimeArrayImp::put):
+ (RuntimeArrayImp::hasProperty):
+ * bindings/runtime_array.h:
+ (KJS::RuntimeArrayImp::getLength):
+ (KJS::RuntimeArrayImp::getConcreteArray):
+ * bindings/runtime_object.cpp:
+ (RuntimeObjectImp::get):
+ (RuntimeObjectImp::canPut):
+ (RuntimeObjectImp::hasProperty):
+
2003-12-05 Richard Williamson <rjw at apple.com>
LiveConnect: Part 1 of supporting JS bindings to
diff --git a/JavaScriptCore/bindings/jni/jni_instance.h b/JavaScriptCore/bindings/jni/jni_instance.h
index 408c08e..bde364c 100644
--- a/JavaScriptCore/bindings/jni/jni_instance.h
+++ b/JavaScriptCore/bindings/jni/jni_instance.h
@@ -37,6 +37,7 @@ class JavaClass;
class JObjectWrapper
{
+friend class JavaArray;
friend class JavaInstance;
friend class JavaMethod;
diff --git a/JavaScriptCore/bindings/jni/jni_runtime.cpp b/JavaScriptCore/bindings/jni/jni_runtime.cpp
index 6a84560..74e27b1 100644
--- a/JavaScriptCore/bindings/jni/jni_runtime.cpp
+++ b/JavaScriptCore/bindings/jni/jni_runtime.cpp
@@ -29,6 +29,7 @@
#include <jni_utility.h>
#include <jni_runtime.h>
+#include <runtime_array.h>
#include <runtime_object.h>
using namespace KJS;
@@ -53,67 +54,15 @@ JavaField::JavaField (JNIEnv *env, jobject aField)
jstring fieldName = (jstring)callJNIObjectMethod (aField, "getName", "()Ljava/lang/String;");
_name = JavaString(env, fieldName);
- printf ("%s: %s (%d)\n", _name.characters(), _type.characters(), _JNIType);
-
_field = new JavaInstance(aField);
}
KJS::Value convertJObjectToArray (KJS::ExecState *exec, jobject anObject, const char *type)
{
-#if 0
if (type[0] != '[')
return Undefined();
-
- JNIType arrayType = JNITypeFromClassName(type+1);
- switch (arrayType) {
- case object_type: {
- jobjectArray objectArray = (jObjectArray)anObject;
- break;
- }
-
- case boolean_type: {
- jbooleanArray boolArray = (jbooleanArray)anObject;
- break;
- }
-
- case byte_type: {
- jbyteArray byteArray = (jbyteArray)anObject;
- break;
- }
-
- case char_type: {
- jcharArray charArray = (jcharArray)anObject;
- break;
- }
-
- case short_type: {
- jshortArray shortArray = (jshortArray)anObject;
- break;
- }
-
- case int_type: {
- jintArray intArray = (jintArray)anObject;
- break;
- }
-
- case long_type: {
- jlongArray longArray = (jlongArray)anObject;
- break;
- }
-
- case float_type: {
- jfloatArray floatArray = (jfloatArray)anObject;
- break;
- }
-
- case double_type: {
- jdoubleArray doubleArray = (jdoubleArray)anObject;
- break;
- }
- default:
- }
-#endif
- return Undefined();
+
+ return KJS::Object(new RuntimeArrayImp(new JavaArray ((jobject)anObject, type)));
}
KJS::Value JavaField::valueFromInstance(const Instance *i) const
@@ -315,3 +264,182 @@ JNIType JavaMethod::JNIReturnType() const
{
return _JNIReturnType;
}
+
+JavaArray::JavaArray (jobject a, const char *t)
+{
+ _array = new JObjectWrapper (a);
+ // Java array are fixed length, so we can cache length.
+ JNIEnv *env = getJNIEnv();
+ _length = env->GetArrayLength((jarray)_array->_instance);
+
+ _type = strdup(t);
+};
+
+JavaArray::~JavaArray ()
+{
+ _array->deref();
+ free ((void *)_type);
+}
+
+
+JavaArray::JavaArray (const JavaArray &other) : Array()
+{
+ _array = other._array;
+ _array->ref();
+ _type = strdup(other._type);
+};
+
+void JavaArray::setValueAt(KJS::ExecState *exec, unsigned int index, const KJS::Value &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);
+}
+
+
+KJS::Value JavaArray::valueAt(unsigned int 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);
+
+ // Nested array?
+ if (_type[1] == '[') {
+ return convertJObjectToArray (0, anObject, _type+1);
+ }
+ // or array of other object type?
+ return KJS::Object(new RuntimeObjectImp(new JavaInstance ((jobject)anObject)));
+ }
+
+ case boolean_type: {
+ jbooleanArray booleanArray = (jbooleanArray)javaArray();
+ jboolean aBoolean;
+ env->GetBooleanArrayRegion(booleanArray, index, 1, &aBoolean);
+ return KJS::Boolean (aBoolean);
+ }
+
+ case byte_type: {
+ jbyteArray byteArray = (jbyteArray)javaArray();
+ jbyte aByte;
+ env->GetByteArrayRegion(byteArray, index, 1, &aByte);
+ return Number (aByte);
+ }
+
+ case char_type: {
+ jcharArray charArray = (jcharArray)javaArray();
+ jchar aChar;
+ env->GetCharArrayRegion(charArray, index, 1, &aChar);
+ return Number (aChar);
+ break;
+ }
+
+ case short_type: {
+ jshortArray shortArray = (jshortArray)javaArray();
+ jshort aShort;
+ env->GetShortArrayRegion(shortArray, index, 1, &aShort);
+ return Number (aShort);
+ }
+
+ case int_type: {
+ jintArray intArray = (jintArray)javaArray();
+ jint anInt;
+ env->GetIntArrayRegion(intArray, index, 1, &anInt);
+ return Number (anInt);
+ }
+
+ case long_type: {
+ jlongArray longArray = (jlongArray)javaArray();
+ jlong aLong;
+ env->GetLongArrayRegion(longArray, index, 1, &aLong);
+ return Number ((long int)aLong);
+ }
+
+ case float_type: {
+ jfloatArray floatArray = (jfloatArray)javaArray();
+ jfloat aFloat;
+ env->GetFloatArrayRegion(floatArray, index, 1, &aFloat);
+ return Number (aFloat);
+ }
+
+ case double_type: {
+ jdoubleArray doubleArray = (jdoubleArray)javaArray();
+ jdouble aDouble;
+ env->GetDoubleArrayRegion(doubleArray, index, 1, &aDouble);
+ return Number (aDouble);
+ }
+ default:
+ break;
+ }
+ return Undefined();
+}
+
+unsigned int JavaArray::getLength() const
+{
+ return _length;
+}
+
+
diff --git a/JavaScriptCore/bindings/jni/jni_runtime.h b/JavaScriptCore/bindings/jni/jni_runtime.h
index ce746d3..248ca21 100644
--- a/JavaScriptCore/bindings/jni/jni_runtime.h
+++ b/JavaScriptCore/bindings/jni/jni_runtime.h
@@ -263,6 +263,42 @@ private:
JNIType _JNIReturnType;
};
+class JavaArray : public Array
+{
+public:
+ JavaArray (jobject a, const char *type);
+
+ JavaArray (const JavaArray &other);
+
+ JavaArray &operator=(const JavaArray &other){
+ if (this == &other)
+ return *this;
+
+ free ((void *)_type);
+ _type = strdup(other._type);
+
+ JObjectWrapper *_oldArray = _array;
+ _array = other._array;
+ _array->ref();
+ _oldArray->deref();
+
+ return *this;
+ };
+
+ virtual void setValueAt(KJS::ExecState *exec, unsigned int index, const KJS::Value &aValue) const;
+ virtual KJS::Value valueAt(unsigned int index) const;
+ virtual unsigned int getLength() const;
+
+ virtual ~JavaArray();
+
+ jobject javaArray() const { return _array->_instance; }
+
+private:
+ JObjectWrapper *_array;
+ unsigned int _length;
+ const char *_type;
+};
+
}
#endif
diff --git a/JavaScriptCore/bindings/jni/jni_utility.cpp b/JavaScriptCore/bindings/jni/jni_utility.cpp
index adc875e..dbc0b49 100644
--- a/JavaScriptCore/bindings/jni/jni_utility.cpp
+++ b/JavaScriptCore/bindings/jni/jni_utility.cpp
@@ -26,6 +26,7 @@
#include "jni_runtime.h"
#include "jni_utility.h"
+#include "runtime_array.h"
#include "runtime_object.h"
static JavaVM *jvm;
@@ -412,6 +413,46 @@ const char *signatureFromPrimitiveType(JNIType type)
return "";
}
+JNIType JNITypeFromPrimitiveType(char type)
+{
+ switch (type){
+ case 'V':
+ return void_type;
+
+ case 'L':
+ case '[':
+ return object_type;
+
+ case 'Z':
+ return boolean_type;
+
+ case 'B':
+ return byte_type;
+
+ case 'C':
+ return char_type;
+
+ case 'S':
+ return short_type;
+
+ case 'I':
+ return int_type;
+
+ case 'J':
+ return long_type;
+
+ case 'F':
+ return float_type;
+
+ case 'D':
+ return double_type;
+
+ default:
+ break;
+ }
+ return invalid_type;
+}
+
jvalue getJNIField( jobject obj, JNIType type, const char *name, const char *signature)
{
JavaVM *jvm = getJavaVM();
@@ -490,6 +531,11 @@ jvalue convertValueToJValue (KJS::ExecState *exec, KJS::Value value, JNIType _JN
Bindings::JavaInstance *instance = static_cast<Bindings::JavaInstance*>(imp->getInternalInstance());
result.l = instance->javaInstance();
}
+ else if (strcmp(objectImp->classInfo()->className, "RuntimeArray") == 0) {
+ KJS::RuntimeArrayImp *imp = static_cast<KJS::RuntimeArrayImp *>(value.imp());
+ Bindings::JavaArray *array = static_cast<Bindings::JavaArray*>(imp->getConcreteArray());
+ result.l = array->javaArray();
+ }
}
// Now convert value to a string if the target type is a java.lang.string.
diff --git a/JavaScriptCore/bindings/jni/jni_utility.h b/JavaScriptCore/bindings/jni/jni_utility.h
index 619aa33..bceeaff 100644
--- a/JavaScriptCore/bindings/jni/jni_utility.h
+++ b/JavaScriptCore/bindings/jni/jni_utility.h
@@ -55,6 +55,7 @@ const char *getCharactersFromJStringInEnv (JNIEnv *env, jstring aJString);
void releaseCharactersForJStringInEnv (JNIEnv *env, jstring aJString, const char *s);
JNIType JNITypeFromClassName(const char *name);
+JNIType JNITypeFromPrimitiveType(char type);
const char *signatureFromPrimitiveType(JNIType type);
jvalue convertValueToJValue (KJS::ExecState *exec, KJS::Value value, JNIType _JNIType, const char *javaClassName);
diff --git a/JavaScriptCore/bindings/runtime.h b/JavaScriptCore/bindings/runtime.h
index 4d55471..4d0d4c5 100644
--- a/JavaScriptCore/bindings/runtime.h
+++ b/JavaScriptCore/bindings/runtime.h
@@ -121,9 +121,9 @@ public:
class Array
{
public:
- virtual void setValueAt(unsigned int index, const KJS::Value &aValue) const = 0;
+ virtual void setValueAt(KJS::ExecState *exec, unsigned int index, const KJS::Value &aValue) const = 0;
virtual KJS::Value valueAt(unsigned int index) const = 0;
-
+ virtual unsigned int getLength() const = 0;
virtual ~Array() {};
};
diff --git a/JavaScriptCore/bindings/runtime_array.cpp b/JavaScriptCore/bindings/runtime_array.cpp
index 97ec607..f06795a 100644
--- a/JavaScriptCore/bindings/runtime_array.cpp
+++ b/JavaScriptCore/bindings/runtime_array.cpp
@@ -34,24 +34,24 @@ const ClassInfo RuntimeArrayImp::info = {"RuntimeArray", 0, 0, 0};
RuntimeArrayImp::RuntimeArrayImp(Bindings::Array *a)
{
// Always takes ownership of concrete array.
- array = a;
+ _array = a;
}
RuntimeArrayImp::~RuntimeArrayImp()
{
- delete array;
+ delete _array;
}
Value RuntimeArrayImp::get(ExecState *exec, const Identifier &propertyName) const
{
if (propertyName == lengthPropertyName)
- return Number(length);
+ return Number(getLength());
bool ok;
unsigned index = propertyName.toArrayIndex(&ok);
if (ok) {
- if (index >= length)
+ if (index >= getLength())
return Undefined();
return getConcreteArray()->valueAt(index);
}
@@ -61,7 +61,7 @@ Value RuntimeArrayImp::get(ExecState *exec, const Identifier &propertyName) cons
Value RuntimeArrayImp::get(ExecState *exec, unsigned index) const
{
- if (index >= length)
+ if (index >= getLength())
return Undefined();
return getConcreteArray()->valueAt(index);
}
@@ -77,7 +77,7 @@ void RuntimeArrayImp::put(ExecState *exec, const Identifier &propertyName, const
bool ok;
unsigned index = propertyName.toArrayIndex(&ok);
if (ok) {
- getConcreteArray()->setValueAt(index, value);
+ getConcreteArray()->setValueAt(exec, index, value);
return;
}
@@ -86,13 +86,13 @@ void RuntimeArrayImp::put(ExecState *exec, const Identifier &propertyName, const
void RuntimeArrayImp::put(ExecState *exec, unsigned index, const Value &value, int attr)
{
- if (index >= length) {
+ if (index >= getLength()) {
Object err = Error::create(exec,RangeError);
exec->setException(err);
return;
}
- getConcreteArray()->setValueAt(index, value);
+ getConcreteArray()->setValueAt(exec, index, value);
}
@@ -104,7 +104,7 @@ bool RuntimeArrayImp::hasProperty(ExecState *exec, const Identifier &propertyNam
bool ok;
unsigned index = propertyName.toArrayIndex(&ok);
if (ok) {
- if (index >= length)
+ if (index >= getLength())
return false;
return true;
}
@@ -114,7 +114,7 @@ bool RuntimeArrayImp::hasProperty(ExecState *exec, const Identifier &propertyNam
bool RuntimeArrayImp::hasProperty(ExecState *exec, unsigned index) const
{
- if (index >= length)
+ if (index >= getLength())
return false;
return true;
}
diff --git a/JavaScriptCore/bindings/runtime_array.h b/JavaScriptCore/bindings/runtime_array.h
index a1f1969..edd08f2 100644
--- a/JavaScriptCore/bindings/runtime_array.h
+++ b/JavaScriptCore/bindings/runtime_array.h
@@ -47,15 +47,13 @@ public:
virtual const ClassInfo *classInfo() const { return &info; }
- unsigned getLength() const { return length; }
+ unsigned getLength() const { return getConcreteArray()->getLength(); }
- Bindings::Array *getConcreteArray() const { return array; }
+ Bindings::Array *getConcreteArray() const { return _array; }
private:
static const ClassInfo info;
- Bindings::Array *array;
-
- unsigned length;
+ Bindings::Array *_array;
};
}; // namespace KJS
diff --git a/JavaScriptCore/bindings/runtime_object.cpp b/JavaScriptCore/bindings/runtime_object.cpp
index 708f0ee..1513626 100644
--- a/JavaScriptCore/bindings/runtime_object.cpp
+++ b/JavaScriptCore/bindings/runtime_object.cpp
@@ -75,8 +75,6 @@ Value RuntimeObjectImp::get(ExecState *exec, const Identifier &propertyName) con
return Object (new RuntimeMethodImp(exec, propertyName, aMethod));
}
- printf ("%s: %p: unable to find propertyName %s\n", __PRETTY_FUNCTION__, instance, propertyName.ascii());
-
return Undefined();
}
@@ -92,17 +90,21 @@ void RuntimeObjectImp::put(ExecState *exec, const Identifier &propertyName,
bool RuntimeObjectImp::canPut(ExecState *exec, const Identifier &propertyName) const
{
- printf ("%s: NOT YET IMPLEMENTED %p: propertyName %s\n", __PRETTY_FUNCTION__, instance, propertyName.ascii());
- // Returns true if the propertyName is a public ivar of the object.
- return false;
+ Field *aField = instance->getClass()->fieldNamed(propertyName.ascii());
+ return aField ? true : false;
}
bool RuntimeObjectImp::hasProperty(ExecState *exec,
const Identifier &propertyName) const
{
- printf ("%s: NOT YET IMPLEMENTED %p: propertyName %s\n", __PRETTY_FUNCTION__, instance, propertyName.ascii());
- // Returns true if the propertyName is a function or ivar of the instance
- // represented by this RuntimeObject.
+ Field *aField = instance->getClass()->fieldNamed(propertyName.ascii());
+ if (aField)
+ return true;
+
+ Method *aMethod = instance->getClass()->methodNamed(propertyName.ascii());
+ if (aMethod)
+ return true;
+
return false;
}
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list