Changeset 82194 in webkit
- Timestamp:
- Mar 28, 2011 10:41:07 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 1 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r82193 r82194 1 2011-03-28 Steve Block <steveblock@google.com> 2 3 Reviewed by Jeremy Orlow. 4 5 Add a new JavaValue to type to represent a Java value in the Java bridge 6 https://bugs.webkit.org/show_bug.cgi?id=57022 7 8 This change introduces a new JavaValue type and uses it in place of jvalue 9 in the conversions to and from JavaNPObject used in the V8 Java bridge. 10 11 Refactoring only, no new tests. 12 13 * WebCore.gypi: 14 * bridge/jni/JNIUtility.cpp: 15 (JSC::Bindings::javaTypeFromClassName): 16 (JSC::Bindings::signatureFromJavaType): 17 (JSC::Bindings::getJNIField): 18 (JSC::Bindings::callJNIMethod): 19 * bridge/jni/JavaType.h: 20 * bridge/jni/v8/JNIUtilityPrivate.cpp: 21 (JSC::Bindings::convertNPVariantToJavaValue): 22 (JSC::Bindings::convertJavaValueToNPVariant): 23 (JSC::Bindings::jvalueToJavaValue): 24 (JSC::Bindings::javaValueToJvalue): 25 * bridge/jni/v8/JNIUtilityPrivate.h: 26 * bridge/jni/v8/JavaNPObjectV8.cpp: 27 (JSC::Bindings::JavaNPObjectInvoke): 28 (JSC::Bindings::JavaNPObjectGetProperty): 29 * bridge/jni/v8/JavaValueV8.h: Added. 30 (JSC::Bindings::JavaValue::JavaValue): 31 1 32 2011-03-28 Patrick Gansterer <paroga@webkit.org> 2 33 -
trunk/Source/WebCore/WebCore.gypi
r82127 r82194 2196 2196 'bridge/jni/v8/JavaNPObjectV8.h', 2197 2197 'bridge/jni/v8/JavaStringV8.h', 2198 'bridge/jni/v8/JavaValueV8.h', 2198 2199 'bridge/jsc/BridgeJSC.cpp', 2199 2200 'bridge/npruntime.cpp', -
trunk/Source/WebCore/bridge/jni/JNIUtility.cpp
r81860 r82194 191 191 else if ('[' == name[0]) 192 192 type = JavaTypeArray; 193 #if USE(V8) 194 else if (!strcmp("java.lang.String", name)) 195 type = JavaTypeString; 196 #endif 193 197 else 194 198 type = JavaTypeObject; … … 207 211 208 212 case JavaTypeObject: 213 #if USE(V8) 214 case JavaTypeString: 215 #endif 209 216 return "L"; 210 217 … … 297 304 case JavaTypeArray: 298 305 case JavaTypeObject: 306 #if USE(V8) 307 case JavaTypeString: 308 #endif 299 309 result.l = env->functions->GetObjectField(env, obj, field); 300 310 break; … … 350 360 break; 351 361 case JavaTypeObject: 362 #if USE(V8) 363 case JavaTypeString: 364 #endif 352 365 result.l = callJNIMethodIDA<jobject>(object, methodId, args); 353 366 break; -
trunk/Source/WebCore/bridge/jni/JavaType.h
r81860 r82194 53 53 JavaTypeFloat, 54 54 JavaTypeDouble, 55 JavaTypeArray 55 JavaTypeArray, 56 #if USE(V8) 57 // JavaTypeString is distinct from JavaTypeObject because strings receive 58 // special handling when we convert to and from JavaScript. When calling 59 // Java methods, we must create Java String objects for string arguments. 60 // However, at conversion time we cannot assume that the mechanism used to 61 // interact with Java is JNI. Instead we use a special JavaTypeString. 62 // Implementations of JavaInstance which use JNI will create a Java String 63 // object when converting the JavaValue to a jvalue. 64 // 65 // Note that this type is independent of the JavaScript engine, but is 66 // currently used only with V8. 67 // See https://bugs.webkit.org/show_bug.cgi?id=57023. 68 JavaTypeString, 69 #endif 56 70 }; 57 71 -
trunk/Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.cpp
r81860 r82194 31 31 #include "JavaInstanceV8.h" 32 32 #include "JavaNPObjectV8.h" 33 #include "JavaValueV8.h" 33 34 #include <wtf/text/CString.h> 34 35 … … 37 38 namespace Bindings { 38 39 39 jvalue convertNPVariantToJValue(NPVariant value, const WTF::String& javaClass)40 JavaValue convertNPVariantToJavaValue(NPVariant value, const String& javaClass) 40 41 { 41 42 CString javaClassName = javaClass.utf8(); 42 43 JavaType javaType = javaTypeFromClassName(javaClassName.data()); 43 jvalue result; 44 JavaValue result; 45 result.m_type = javaType; 44 46 NPVariantType type = value.type; 45 47 … … 48 50 case JavaTypeObject: 49 51 { 50 result.l = static_cast<jobject>(0); 51 52 // First see if we have a Java instance. 52 // See if we have a Java instance. 53 53 if (type == NPVariantType_Object) { 54 54 NPObject* objectImp = NPVARIANT_TO_OBJECT(value); 55 if (JavaInstance* instance = ExtractJavaInstance(objectImp)) 56 result.l = instance->javaInstance(); 55 result.m_objectValue = ExtractJavaInstance(objectImp); 57 56 } 58 59 // Now convert value to a string if the target type is a java.lang.string, and we're not 60 // converting from a Null. 61 if (!result.l && !strcmp(javaClassName.data(), "java.lang.String")) { 57 } 58 break; 59 60 case JavaTypeString: 61 { 62 62 #ifdef CONVERT_NULL_TO_EMPTY_STRING 63 if (type == NPVariantType_Null) { 64 JNIEnv* env = getJNIEnv(); 65 jchar buf[2]; 66 jobject javaString = env->functions->NewString(env, buf, 0); 67 result.l = javaString; 68 } else 63 if (type == NPVariantType_Null) { 64 result.m_type = JavaTypeString; 65 result.m_stringValue = String::fromUTF8(""); 66 } else 69 67 #else 70 68 if (type == NPVariantType_String) 71 69 #endif 72 { 73 NPString src = NPVARIANT_TO_STRING(value); 74 JNIEnv* env = getJNIEnv(); 75 jobject javaString = env->NewStringUTF(src.UTF8Characters); 76 result.l = javaString; 77 } 78 } else if (!result.l) 79 memset(&result, 0, sizeof(jvalue)); // Handle it the same as a void case 70 { 71 NPString src = NPVARIANT_TO_STRING(value); 72 result.m_type = JavaTypeString; 73 result.m_stringValue = String::fromUTF8(src.UTF8Characters); 74 } 80 75 } 81 76 break; … … 84 79 { 85 80 if (type == NPVariantType_Bool) 86 result.z = NPVARIANT_TO_BOOLEAN(value); 87 else 88 memset(&result, 0, sizeof(jvalue)); // as void case 81 result.m_booleanValue = NPVARIANT_TO_BOOLEAN(value); 89 82 } 90 83 break; … … 93 86 { 94 87 if (type == NPVariantType_Int32) 95 result.b = static_cast<jbyte>(NPVARIANT_TO_INT32(value)); 96 else if (type == NPVariantType_Double) 97 result.b = static_cast<jbyte>(NPVARIANT_TO_DOUBLE(value)); 98 else 99 memset(&result, 0, sizeof(jvalue)); 88 result.m_byteValue = static_cast<signed char>(NPVARIANT_TO_INT32(value)); 89 else if (type == NPVariantType_Double) 90 result.m_byteValue = static_cast<signed char>(NPVARIANT_TO_DOUBLE(value)); 100 91 } 101 92 break; … … 104 95 { 105 96 if (type == NPVariantType_Int32) 106 result.c = static_cast<char>(NPVARIANT_TO_INT32(value)); 107 else 108 memset(&result, 0, sizeof(jvalue)); 97 result.m_charValue = static_cast<unsigned short>(NPVARIANT_TO_INT32(value)); 109 98 } 110 99 break; … … 113 102 { 114 103 if (type == NPVariantType_Int32) 115 result.s = static_cast<jshort>(NPVARIANT_TO_INT32(value)); 116 else if (type == NPVariantType_Double) 117 result.s = static_cast<jshort>(NPVARIANT_TO_DOUBLE(value)); 118 else 119 memset(&result, 0, sizeof(jvalue)); 104 result.m_shortValue = static_cast<short>(NPVARIANT_TO_INT32(value)); 105 else if (type == NPVariantType_Double) 106 result.m_shortValue = static_cast<short>(NPVARIANT_TO_DOUBLE(value)); 120 107 } 121 108 break; … … 124 111 { 125 112 if (type == NPVariantType_Int32) 126 result.i = static_cast<jint>(NPVARIANT_TO_INT32(value)); 127 else if (type == NPVariantType_Double) 128 result.i = static_cast<jint>(NPVARIANT_TO_DOUBLE(value)); 129 else 130 memset(&result, 0, sizeof(jvalue)); 113 result.m_intValue = static_cast<int>(NPVARIANT_TO_INT32(value)); 114 else if (type == NPVariantType_Double) 115 result.m_intValue = static_cast<int>(NPVARIANT_TO_DOUBLE(value)); 131 116 } 132 117 break; … … 135 120 { 136 121 if (type == NPVariantType_Int32) 137 result.j = static_cast<jlong>(NPVARIANT_TO_INT32(value)); 138 else if (type == NPVariantType_Double) 139 result.j = static_cast<jlong>(NPVARIANT_TO_DOUBLE(value)); 140 else 141 memset(&result, 0, sizeof(jvalue)); 122 result.m_longValue = static_cast<long long>(NPVARIANT_TO_INT32(value)); 123 else if (type == NPVariantType_Double) 124 result.m_longValue = static_cast<long long>(NPVARIANT_TO_DOUBLE(value)); 142 125 } 143 126 break; … … 146 129 { 147 130 if (type == NPVariantType_Int32) 148 result.f = static_cast<jfloat>(NPVARIANT_TO_INT32(value)); 149 else if (type == NPVariantType_Double) 150 result.f = static_cast<jfloat>(NPVARIANT_TO_DOUBLE(value)); 151 else 152 memset(&result, 0, sizeof(jvalue)); 131 result.m_floatValue = static_cast<float>(NPVARIANT_TO_INT32(value)); 132 else if (type == NPVariantType_Double) 133 result.m_floatValue = static_cast<float>(NPVARIANT_TO_DOUBLE(value)); 153 134 } 154 135 break; … … 157 138 { 158 139 if (type == NPVariantType_Int32) 159 result.d = static_cast<jdouble>(NPVARIANT_TO_INT32(value)); 160 else if (type == NPVariantType_Double) 161 result.d = static_cast<jdouble>(NPVARIANT_TO_DOUBLE(value)); 162 else 163 memset(&result, 0, sizeof(jvalue)); 164 } 165 break; 166 167 break; 168 169 case JavaTypeInvalid: 140 result.m_doubleValue = static_cast<double>(NPVARIANT_TO_INT32(value)); 141 else if (type == NPVariantType_Double) 142 result.m_doubleValue = static_cast<double>(NPVARIANT_TO_DOUBLE(value)); 143 } 144 break; 170 145 default: 171 case JavaTypeVoid:172 {173 memset(&result, 0, sizeof(jvalue));174 }175 146 break; 176 147 } … … 179 150 180 151 181 void convertJ ValueToNPVariant(jvalue value, JavaType javaType, const char* javaTypeName, NPVariant* result)152 void convertJavaValueToNPVariant(JavaValue value, NPVariant* result) 182 153 { 183 switch ( javaType) {154 switch (value.m_type) { 184 155 case JavaTypeVoid: 185 156 { … … 190 161 case JavaTypeObject: 191 162 { 192 if (value.l) { 193 if (!strcmp(javaTypeName, "java.lang.String")) { 194 const char* v = getCharactersFromJString(static_cast<jstring>(value.l)); 195 // s is freed in NPN_ReleaseVariantValue (see npruntime.cpp) 196 const char* s = strdup(v); 197 releaseCharactersForJString(static_cast<jstring>(value.l), v); 198 STRINGZ_TO_NPVARIANT(s, *result); 199 } else 200 OBJECT_TO_NPVARIANT(JavaInstanceToNPObject(new JavaInstance(value.l)), *result); 201 } else 163 // If the JavaValue is a String object, it should have type JavaTypeString. 164 if (value.m_objectValue) 165 OBJECT_TO_NPVARIANT(JavaInstanceToNPObject(value.m_objectValue.get()), *result); 166 else 202 167 VOID_TO_NPVARIANT(*result); 203 168 } 204 169 break; 205 170 171 case JavaTypeString: 172 { 173 const char* utf8String = strdup(value.m_stringValue.utf8().data()); 174 // The copied string is freed in NPN_ReleaseVariantValue (see npruntime.cpp) 175 STRINGZ_TO_NPVARIANT(utf8String, *result); 176 } 177 break; 178 206 179 case JavaTypeBoolean: 207 180 { 208 BOOLEAN_TO_NPVARIANT(value. z, *result);181 BOOLEAN_TO_NPVARIANT(value.m_booleanValue, *result); 209 182 } 210 183 break; … … 212 185 case JavaTypeByte: 213 186 { 214 INT32_TO_NPVARIANT(value. b, *result);187 INT32_TO_NPVARIANT(value.m_byteValue, *result); 215 188 } 216 189 break; … … 218 191 case JavaTypeChar: 219 192 { 220 INT32_TO_NPVARIANT(value. c, *result);193 INT32_TO_NPVARIANT(value.m_charValue, *result); 221 194 } 222 195 break; … … 224 197 case JavaTypeShort: 225 198 { 226 INT32_TO_NPVARIANT(value. s, *result);199 INT32_TO_NPVARIANT(value.m_shortValue, *result); 227 200 } 228 201 break; … … 230 203 case JavaTypeInt: 231 204 { 232 INT32_TO_NPVARIANT(value. i, *result);205 INT32_TO_NPVARIANT(value.m_intValue, *result); 233 206 } 234 207 break; … … 237 210 case JavaTypeLong: 238 211 { 239 DOUBLE_TO_NPVARIANT(value. j, *result);212 DOUBLE_TO_NPVARIANT(value.m_longValue, *result); 240 213 } 241 214 break; … … 243 216 case JavaTypeFloat: 244 217 { 245 DOUBLE_TO_NPVARIANT(value. f, *result);218 DOUBLE_TO_NPVARIANT(value.m_floatValue, *result); 246 219 } 247 220 break; … … 249 222 case JavaTypeDouble: 250 223 { 251 DOUBLE_TO_NPVARIANT(value. d, *result);224 DOUBLE_TO_NPVARIANT(value.m_doubleValue, *result); 252 225 } 253 226 break; … … 262 235 } 263 236 237 JavaValue jvalueToJavaValue(const jvalue& value, const JavaType& type) 238 { 239 JavaValue result; 240 result.m_type = type; 241 switch (result.m_type) { 242 case JavaTypeVoid: 243 break; 244 case JavaTypeObject: 245 result.m_objectValue = new JavaInstance(value.l); 246 break; 247 case JavaTypeString: 248 { 249 jstring javaString = static_cast<jstring>(value.l); 250 const UChar* a = getUCharactersFromJStringInEnv(getJNIEnv(), javaString); 251 // We take a copy to allow the Java String to be released. 252 result.m_stringValue = String(a).threadsafeCopy(); 253 releaseUCharactersForJStringInEnv(getJNIEnv(), javaString, a); 254 } 255 break; 256 case JavaTypeBoolean: 257 result.m_booleanValue = value.z == JNI_FALSE ? false : true; 258 break; 259 case JavaTypeByte: 260 result.m_byteValue = value.b; 261 break; 262 case JavaTypeChar: 263 result.m_charValue = value.c; 264 break; 265 case JavaTypeShort: 266 result.m_shortValue = value.s; 267 break; 268 case JavaTypeInt: 269 result.m_intValue = value.i; 270 break; 271 case JavaTypeLong: 272 result.m_longValue = value.j; 273 break; 274 case JavaTypeFloat: 275 result.m_floatValue = value.f; 276 break; 277 case JavaTypeDouble: 278 result.m_doubleValue = value.d; 279 break; 280 default: 281 ASSERT(false); 282 } 283 return result; 284 } 285 286 jvalue javaValueToJvalue(const JavaValue& value) 287 { 288 jvalue result; 289 memset(&result, 0, sizeof(jvalue)); 290 switch (value.m_type) { 291 case JavaTypeVoid: 292 break; 293 case JavaTypeObject: 294 if (value.m_objectValue) 295 result.l = value.m_objectValue->javaInstance(); 296 break; 297 case JavaTypeString: 298 // This creates a local reference to a new String object, which will 299 // be released when the call stack returns to Java. Note that this 300 // may cause leaks if invoked from a native message loop, as is the 301 // case in workers. 302 result.l = getJNIEnv()->NewString(value.m_stringValue.characters(), value.m_stringValue.length()); 303 break; 304 case JavaTypeBoolean: 305 result.z = value.m_booleanValue ? JNI_TRUE : JNI_FALSE; 306 break; 307 case JavaTypeByte: 308 result.b = value.m_byteValue; 309 break; 310 case JavaTypeChar: 311 result.c = value.m_charValue; 312 break; 313 case JavaTypeShort: 314 result.s = value.m_shortValue; 315 break; 316 case JavaTypeInt: 317 result.i = value.m_intValue; 318 break; 319 case JavaTypeLong: 320 result.j = value.m_longValue; 321 break; 322 case JavaTypeFloat: 323 result.f = value.m_floatValue; 324 break; 325 case JavaTypeDouble: 326 result.d = value.m_doubleValue; 327 break; 328 default: 329 ASSERT(false); 330 } 331 return result; 332 } 333 264 334 } // namespace Bindings 265 335 -
trunk/Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.h
r81860 r82194 37 37 namespace Bindings { 38 38 39 jvalue convertNPVariantToJValue(NPVariant, const WTF::String& javaClass); 40 void convertJValueToNPVariant(jvalue, JavaType, const char* javaClassName, NPVariant*); 39 class JavaValue; 40 41 JavaValue convertNPVariantToJavaValue(NPVariant, const String& javaClass); 42 void convertJavaValueToNPVariant(JavaValue, NPVariant*); 43 44 JavaValue jvalueToJavaValue(const jvalue&, const JavaType&); 45 jvalue javaValueToJvalue(const JavaValue&); 41 46 42 47 } // namespace Bindings -
trunk/Source/WebCore/bridge/jni/v8/JavaNPObjectV8.cpp
r81860 r82194 35 35 #include "JavaInstanceV8.h" 36 36 #include "JavaMethod.h" 37 #include "JavaValueV8.h" 37 38 #include "npruntime_impl.h" 38 39 … … 145 146 146 147 for (unsigned int i = 0; i < argCount; i++) 147 jArgs[i] = convertNPVariantToJValue(args[i], jMethod->parameterAt(i));148 jArgs[i] = javaValueToJvalue(convertNPVariantToJavaValue(args[i], jMethod->parameterAt(i))); 148 149 149 150 jvalue jResult = instance->invokeMethod(jMethod, jArgs); … … 152 153 153 154 VOID_TO_NPVARIANT(*result); 154 convertJ ValueToNPVariant(jResult, jMethod->returnType(), jMethod->returnTypeClassName(), result);155 convertJavaValueToNPVariant(jvalueToJavaValue(jResult, jMethod->returnType()), result); 155 156 return true; 156 157 } … … 190 191 instance->end(); 191 192 192 convertJ ValueToNPVariant(value, field->type(), field->typeClassName(), result);193 convertJavaValueToNPVariant(jvalueToJavaValue(value, field->type()), result); 193 194 194 195 return true;
Note: See TracChangeset
for help on using the changeset viewer.