[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