Changeset 19559 in webkit
- Timestamp:
- Feb 10, 2007 6:17:16 PM (17 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r19534 r19559 1 2007-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 1 28 2007-02-08 Anders Carlsson <acarlsson@apple.com> 2 29 -
trunk/JavaScriptCore/bindings/jni/jni_runtime.cpp
r19183 r19559 112 112 113 113 switch (_JNIType) { 114 case array_type: 114 115 case object_type: { 115 116 jvalue result = dispatchValueFromInstance (exec, instance, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", object_type); … … 195 196 196 197 switch (_JNIType) { 198 case array_type: 197 199 case object_type: { 198 200 dispatchSetValueToInstance (exec, instance, javaValue, "set", "(Ljava/lang/Object;Ljava/lang/Object;)V"); … … 327 329 JavaParameter *aParameter = static_cast<JavaParameter *>(parameterAt(i)); 328 330 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 } 333 339 } 334 340 } … … 336 342 337 343 const char *returnType = _returnType.UTF8String(); 338 if ( returnType[0] == '[') {344 if (_JNIReturnType == array_type) { 339 345 appendClassName (_signature, returnType); 340 346 } -
trunk/JavaScriptCore/bindings/jni/jni_utility.cpp
r18657 r19559 116 116 env->functions->CallVoidMethodV(env, obj, mid, args); 117 117 break; 118 case array_type: 118 119 case object_type: 119 120 result.l = env->functions->CallObjectMethodV(env, obj, mid, args); … … 180 181 env->functions->CallStaticVoidMethodV(env, cls, mid, args); 181 182 break; 183 case array_type: 182 184 case object_type: 183 185 result.l = env->functions->CallStaticObjectMethodV(env, cls, mid, args); … … 235 237 env->functions->CallVoidMethodA(env, obj, mid, args); 236 238 break; 239 case array_type: 237 240 case object_type: 238 241 result.l = env->functions->CallObjectMethodA(env, obj, mid, args); … … 589 592 else if (strcmp("void",name) == 0) 590 593 type = void_type; 594 else if ('[' == name[0]) 595 type = array_type; 591 596 else 592 597 type = object_type; … … 600 605 case void_type: 601 606 return "V"; 607 608 case array_type: 609 return "["; 602 610 603 611 case object_type: … … 642 650 643 651 case 'L': 652 return object_type; 653 644 654 case '[': 645 return object_type;655 return array_type; 646 656 647 657 case 'Z': … … 688 698 if ( field != NULL ) { 689 699 switch (type) { 700 case array_type: 690 701 case object_type: 691 702 result.l = env->functions->GetObjectField(env, obj, field); … … 737 748 } 738 749 750 jobject 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 739 872 jvalue convertValueToJValue (ExecState *exec, JSValue *value, JNIType _JNIType, const char *javaClassName) 740 873 { … … 742 875 743 876 switch (_JNIType){ 877 case array_type: 744 878 case object_type: { 745 879 result.l = (jobject)0; … … 754 888 } 755 889 else if (objectImp->classInfo() == &RuntimeArray::info) { 890 // Input is a JavaScript Array that was originally created from a Java Array 756 891 RuntimeArray *imp = static_cast<RuntimeArray *>(value); 757 892 JavaArray *array = static_cast<JavaArray*>(imp->getConcreteArray()); 758 893 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); 759 898 } 760 899 } … … 780 919 result.l = javaString; 781 920 } 782 } 921 } else if (result.l == 0) 922 bzero (&result, sizeof(jvalue)); // Handle it the same as a void case 783 923 } 784 924 break; … … 836 976 } 837 977 838 } 839 840 } 978 } // end of namespace Bindings 979 980 } // end of namespace KJS -
trunk/JavaScriptCore/bindings/jni/jni_utility.h
r18657 r19559 34 34 void_type, 35 35 object_type, 36 array_type, 36 37 boolean_type, 37 38 byte_type, -
trunk/WebCore/ChangeLog
r19558 r19559 1 2007-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 1 13 2007-02-10 Alexey Proskuryakov <ap@webkit.org> 2 14
Note: See TracChangeset
for help on using the changeset viewer.