Changeset 19559 in webkit


Ignore:
Timestamp:
Feb 10, 2007 6:17:16 PM (17 years ago)
Author:
ddkilzer
Message:

JavaScriptCore:

Reviewed by Maciej.

  • bindings/jni/jni_utility.h: added new type for array, array_type
  • bindings/jni/jni_runtime.cpp: add support for new array type (JavaField::valueFromInstance): (JavaField::setValueToInstance): (JavaMethod::JavaMethod): (JavaMethod::signature):
  • bindings/jni/jni_utility.cpp: add support for new array type (KJS::Bindings::callJNIMethod): (KJS::Bindings::callJNIStaticMethod): (KJS::Bindings::callJNIMethodIDA): (KJS::Bindings::JNITypeFromClassName): (KJS::Bindings::signatureFromPrimitiveType): (KJS::Bindings::JNITypeFromPrimitiveType): (KJS::Bindings::getJNIField): (KJS::Bindings::convertArrayInstanceToJavaArray): new method converts the Javascript array to the requested Java array. (KJS::Bindings::convertValueToJValue):

WebCore:

Reviewed by Maciej.

Manual tests for http://bugs.webkit.org/show_bug.cgi?id=12636
Call different Java methods that take a variety of Array parameters
from Javascript, passing a Javascript array.

  • manual-tests/liveconnect-applet-array-parameters.html: Added.
  • manual-tests/resources/ArrayParameterTestApplet.class: Added.
  • manual-tests/resources/ArrayParameterTestApplet.java: Added.
Location:
trunk
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r19534 r19559  
     12007-02-10  David Carson  <dacarson@gmail.com>
     2
     3        Reviewed by Maciej.
     4
     5        - fix for http://bugs.webkit.org/show_bug.cgi?id=12636
     6        Corrected the generation of method signatures when the parameter
     7        is an Array.
     8        Added support for converting a Javascript array to a Java array.
     9
     10        * bindings/jni/jni_utility.h: added new type for array, array_type
     11        * bindings/jni/jni_runtime.cpp: add support for new array type
     12        (JavaField::valueFromInstance):
     13        (JavaField::setValueToInstance):
     14        (JavaMethod::JavaMethod):
     15        (JavaMethod::signature):
     16        * bindings/jni/jni_utility.cpp: add support for new array type
     17        (KJS::Bindings::callJNIMethod):
     18        (KJS::Bindings::callJNIStaticMethod):
     19        (KJS::Bindings::callJNIMethodIDA):
     20        (KJS::Bindings::JNITypeFromClassName):
     21        (KJS::Bindings::signatureFromPrimitiveType):
     22        (KJS::Bindings::JNITypeFromPrimitiveType):
     23        (KJS::Bindings::getJNIField):
     24        (KJS::Bindings::convertArrayInstanceToJavaArray): new method
     25        converts the Javascript array to the requested Java array.
     26        (KJS::Bindings::convertValueToJValue):
     27
    1282007-02-08  Anders Carlsson  <acarlsson@apple.com>
    229
  • trunk/JavaScriptCore/bindings/jni/jni_runtime.cpp

    r19183 r19559  
    112112   
    113113    switch (_JNIType) {
     114        case array_type:
    114115        case object_type: {
    115116            jvalue result = dispatchValueFromInstance (exec, instance, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", object_type);
     
    195196
    196197    switch (_JNIType) {
     198        case array_type:
    197199        case object_type: {
    198200            dispatchSetValueToInstance (exec, instance, javaValue, "set", "(Ljava/lang/Object;Ljava/lang/Object;)V");
     
    327329            JavaParameter *aParameter = static_cast<JavaParameter *>(parameterAt(i));
    328330            JNIType _JNIType = aParameter->getJNIType();
    329             _signature->append(signatureFromPrimitiveType (_JNIType));
    330             if (_JNIType == object_type) {
    331                 appendClassName (_signature, aParameter->type());
    332                 _signature->append(";");
     331            if (_JNIType == array_type)
     332                appendClassName(_signature, aParameter->type());
     333            else {
     334                _signature->append(signatureFromPrimitiveType (_JNIType));
     335                if (_JNIType == object_type) {
     336                    appendClassName (_signature, aParameter->type());
     337                    _signature->append(";");
     338                }
    333339            }
    334340        }
     
    336342       
    337343        const char *returnType = _returnType.UTF8String();
    338         if (returnType[0] == '[') {
     344        if (_JNIReturnType == array_type) {
    339345            appendClassName (_signature, returnType);
    340346        }
  • trunk/JavaScriptCore/bindings/jni/jni_utility.cpp

    r18657 r19559  
    116116                    env->functions->CallVoidMethodV(env, obj, mid, args);
    117117                    break;
     118                case array_type:
    118119                case object_type:
    119120                    result.l = env->functions->CallObjectMethodV(env, obj, mid, args);
     
    180181                env->functions->CallStaticVoidMethodV(env, cls, mid, args);
    181182                break;
     183            case array_type:
    182184            case object_type:
    183185                result.l = env->functions->CallStaticObjectMethodV(env, cls, mid, args);
     
    235237            env->functions->CallVoidMethodA(env, obj, mid, args);
    236238            break;
     239        case array_type:
    237240        case object_type:
    238241            result.l = env->functions->CallObjectMethodA(env, obj, mid, args);
     
    589592    else if (strcmp("void",name) == 0)
    590593        type = void_type;
     594    else if ('[' == name[0])
     595        type = array_type;
    591596    else
    592597        type = object_type;
     
    600605        case void_type:
    601606            return "V";
     607       
     608        case array_type:
     609            return "[";
    602610       
    603611        case object_type:
     
    642650       
    643651        case 'L':
     652            return object_type;
     653           
    644654        case '[':
    645             return object_type;
     655            return array_type;
    646656       
    647657        case 'Z':
     
    688698            if ( field != NULL ) {
    689699                switch (type) {
     700                case array_type:
    690701                case object_type:
    691702                    result.l = env->functions->GetObjectField(env, obj, field);
     
    737748}
    738749
     750jobject convertArrayInstanceToJavaArray(ExecState *exec, JSValue *value, const char *javaClassName) {
     751
     752    JNIEnv *env = getJNIEnv();
     753    // As JS Arrays can contain a mixture of objects, assume we can convert to
     754    // the requested Java Array type requested, unless the array type is some object array
     755    // other than a string.
     756    ArrayInstance *jsArray = static_cast<ArrayInstance *>(value);
     757    unsigned length = jsArray->getLength();
     758    jobjectArray jarray = 0;
     759   
     760    // Build the correct array type
     761    switch (JNITypeFromPrimitiveType(javaClassName[1])) {
     762        case object_type: {
     763        // Only support string object types
     764        if (0 == strcmp("[Ljava.lang.String;", javaClassName)) {
     765            jarray = (jobjectArray)env->NewObjectArray(length,
     766                env->FindClass("java/lang/String"),
     767                env->NewStringUTF(""));
     768            for(unsigned i = 0; i < length; i++) {
     769                JSValue* item = jsArray->getItem(i);
     770                UString stringValue = item->toString(exec);
     771                env->SetObjectArrayElement(jarray,i,
     772                    env->functions->NewString(env, (const jchar *)stringValue.data(), stringValue.size()));
     773                }
     774            }
     775            break;
     776        }
     777       
     778        case boolean_type: {
     779            jarray = (jobjectArray)env->NewBooleanArray(length);
     780            for(unsigned i = 0; i < length; i++) {
     781                JSValue* item = jsArray->getItem(i);
     782                jboolean value = (jboolean)item->toNumber(exec);
     783                env->SetBooleanArrayRegion((jbooleanArray)jarray, (jsize)i, (jsize)1, &value);
     784            }
     785            break;
     786        }
     787       
     788        case byte_type: {
     789            jarray = (jobjectArray)env->NewByteArray(length);
     790            for(unsigned i = 0; i < length; i++) {
     791                JSValue* item = jsArray->getItem(i);
     792                jbyte value = (jbyte)item->toNumber(exec);
     793                env->SetByteArrayRegion((jbyteArray)jarray, (jsize)i, (jsize)1, &value);
     794            }
     795            break;
     796        }
     797
     798        case char_type: {
     799            jarray = (jobjectArray)env->NewCharArray(length);
     800            for(unsigned i = 0; i < length; i++) {
     801                JSValue* item = jsArray->getItem(i);
     802                UString stringValue = item->toString(exec);
     803                jchar value = 0;
     804                if (stringValue.size() > 0)
     805                    value = ((const jchar*)stringValue.data())[0];
     806                env->SetCharArrayRegion((jcharArray)jarray, (jsize)i, (jsize)1, &value);
     807            }
     808            break;
     809        }
     810
     811        case short_type: {
     812            jarray = (jobjectArray)env->NewShortArray(length);
     813            for(unsigned i = 0; i < length; i++) {
     814                JSValue* item = jsArray->getItem(i);
     815                jshort value = (jshort)item->toNumber(exec);
     816                env->SetShortArrayRegion((jshortArray)jarray, (jsize)i, (jsize)1, &value);
     817            }
     818            break;
     819        }
     820
     821        case int_type: {
     822            jarray = (jobjectArray)env->NewIntArray(length);
     823            for(unsigned i = 0; i < length; i++) {
     824                JSValue* item = jsArray->getItem(i);
     825                jint value = (jint)item->toNumber(exec);
     826                env->SetIntArrayRegion((jintArray)jarray, (jsize)i, (jsize)1, &value);
     827            }
     828            break;
     829        }
     830
     831        case long_type: {
     832            jarray = (jobjectArray)env->NewLongArray(length);
     833            for(unsigned i = 0; i < length; i++) {
     834                JSValue* item = jsArray->getItem(i);
     835                jlong value = (jlong)item->toNumber(exec);
     836                env->SetLongArrayRegion((jlongArray)jarray, (jsize)i, (jsize)1, &value);
     837            }
     838            break;
     839        }
     840
     841        case float_type: {
     842            jarray = (jobjectArray)env->NewFloatArray(length);
     843            for(unsigned i = 0; i < length; i++) {
     844                JSValue* item = jsArray->getItem(i);
     845                jfloat value = (jfloat)item->toNumber(exec);
     846                env->SetFloatArrayRegion((jfloatArray)jarray, (jsize)i, (jsize)1, &value);
     847            }
     848            break;
     849        }
     850   
     851        case double_type: {
     852            jarray = (jobjectArray)env->NewDoubleArray(length);
     853            for(unsigned i = 0; i < length; i++) {
     854                JSValue* item = jsArray->getItem(i);
     855                jdouble value = (jdouble)item->toNumber(exec);
     856                env->SetDoubleArrayRegion((jdoubleArray)jarray, (jsize)i, (jsize)1, &value);
     857            }
     858            break;
     859        }
     860       
     861        case array_type: // don't handle embedded arrays
     862        case void_type: // Don't expect arrays of void objects
     863        case invalid_type: // Array of unknown objects
     864            break;
     865    }
     866   
     867    // if it was not one of the cases handled, then null is returned
     868    return jarray;
     869}
     870
     871
    739872jvalue convertValueToJValue (ExecState *exec, JSValue *value, JNIType _JNIType, const char *javaClassName)
    740873{
     
    742875   
    743876    switch (_JNIType){
     877        case array_type:
    744878        case object_type: {
    745879            result.l = (jobject)0;
     
    754888                }
    755889                else if (objectImp->classInfo() == &RuntimeArray::info) {
     890                // Input is a JavaScript Array that was originally created from a Java Array
    756891                    RuntimeArray *imp = static_cast<RuntimeArray *>(value);
    757892                    JavaArray *array = static_cast<JavaArray*>(imp->getConcreteArray());
    758893                    result.l = array->javaArray();
     894                }
     895                else if (objectImp->classInfo() == &ArrayInstance::info) {
     896                    // Input is a Javascript Array. We need to create it to a Java Array.
     897                    result.l = convertArrayInstanceToJavaArray(exec, value, javaClassName);
    759898                }
    760899            }
     
    780919                    result.l = javaString;
    781920                }
    782             }
     921            } else if (result.l == 0)
     922                bzero (&result, sizeof(jvalue)); // Handle it the same as a void case
    783923        }
    784924        break;
     
    836976}
    837977
    838 }
    839 
    840 }
     978}  // end of namespace Bindings
     979
     980} // end of namespace KJS
  • trunk/JavaScriptCore/bindings/jni/jni_utility.h

    r18657 r19559  
    3434    void_type,
    3535    object_type,
     36    array_type,
    3637    boolean_type,
    3738    byte_type,
  • trunk/WebCore/ChangeLog

    r19558 r19559  
     12007-02-10  David Carson  <dacarson@gmail.com>`
     2
     3        Reviewed by Maciej.
     4
     5        Manual tests for http://bugs.webkit.org/show_bug.cgi?id=12636
     6        Call different Java methods that take a variety of Array parameters
     7        from Javascript, passing a Javascript array.
     8
     9        * manual-tests/liveconnect-applet-array-parameters.html: Added.
     10        * manual-tests/resources/ArrayParameterTestApplet.class: Added.
     11        * manual-tests/resources/ArrayParameterTestApplet.java: Added.
     12
    1132007-02-10  Alexey Proskuryakov  <ap@webkit.org>
    214
Note: See TracChangeset for help on using the changeset viewer.