161 {
162 jarray = (jobjectArray)env->NewDoubleArray(length);
163 for (unsigned i = 0; i < length; i++) {
164 JSValue item = jsArray->get(exec, i);
165 jdouble value = (jdouble)item.toNumber(exec);
166 env->SetDoubleArrayRegion((jdoubleArray)jarray, (jsize)i, (jsize)1, &value);
167 }
168 break;
169 }
170
171 case JavaTypeArray: // don't handle embedded arrays
172 case JavaTypeVoid: // Don't expect arrays of void objects
173 case JavaTypeInvalid: // Array of unknown objects
174 break;
175 }
176
177 // if it was not one of the cases handled, then null is returned
178 return jarray;
179 }
180
181
182 jobject convertUndefinedToJObject() {
183 static JGObject jgoUndefined;
184 if (!jgoUndefined) {
185 JNIEnv* env = getJNIEnv();
186 jclass clazz = env->FindClass(JSOBJECT_CLASSNAME);
187 jgoUndefined = JLObject(env->GetStaticObjectField(
188 clazz,
189 env->GetStaticFieldID(clazz, "UNDEFINED", "Ljava/lang/String;")));
190 }
191 return jgoUndefined;
192 }
193
194
195 jvalue convertValueToJValue(ExecState* exec, RootObject* rootObject, JSValue value, JavaType javaType, const char* javaClassName)
196 {
197 JSLockHolder lock(exec);
198
199 jvalue result;
200 memset(&result, 0, sizeof(jvalue));
201
202 switch (javaType) {
203 case JavaTypeArray:
204 case JavaTypeObject:
205 {
206 // FIXME: JavaJSObject::convertValueToJObject functionality is almost exactly the same,
207 // these functions should use common code.
208
209 if (value.isObject()) {
210 JSObject* object = asObject(value);
211 if (object->inherits(JavaRuntimeObject::info())) {
212 // Unwrap a Java instance.
213 JavaRuntimeObject* runtimeObject = static_cast<JavaRuntimeObject*>(object);
214 JavaInstance* instance = runtimeObject->getInternalJavaInstance();
252 static JGClass jsObjectClass = env->FindClass(JSOBJECT_CLASSNAME);
253 static jmethodID constructorID = env->GetMethodID(jsObjectClass, "<init>", "(JI)V");
254 if (constructorID) {
255 rootObject->gcProtect(object);
256 jlong nativeHandle = ptr_to_jlong(object);
257 result.l = env->NewObject(jsObjectClass, constructorID,
258 nativeHandle,
259 com_sun_webkit_dom_JSObject_JS_CONTEXT_OBJECT);
260 }
261 }
262 }
263 }
264
265 // Create an appropriate Java object if target type is java.lang.Object or other wrapper Objects {Integer, Double, Boolean}.
266 if (!result.l) {
267 if (value.isString() && !strcmp(javaClassName, "java.lang.Object")) {
268 String stringValue = asString(value)->value(exec);
269 JNIEnv* env = getJNIEnv();
270 jobject javaString = env->functions->NewString(env, (const jchar*)stringValue.deprecatedCharacters(), stringValue.length());
271 result.l = javaString;
272 } else if (value.isNumber()) {
273 JNIEnv* env = getJNIEnv();
274 if (value.isInt32() && (!strcmp(javaClassName, "java.lang.Number") || !strcmp(javaClassName, "java.lang.Integer") || !strcmp(javaClassName, "java.lang.Object"))) {
275 static JGClass clazz(env->FindClass("java/lang/Integer"));
276 jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(I)Ljava/lang/Integer;");
277 result.l = env->CallStaticObjectMethod(clazz, meth, (jint) value.asInt32());
278 } else if (!strcmp(javaClassName, "java.lang.Number") || !strcmp(javaClassName, "java.lang.Double") || !strcmp(javaClassName, "java.lang.Object")) {
279 jdouble doubleValue = (jdouble) value.asNumber();
280 static JGClass clazz = env->FindClass("java/lang/Double");
281 jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(D)Ljava/lang/Double;");
282 jobject javaDouble = env->CallStaticObjectMethod(clazz, meth, doubleValue);
283 result.l = javaDouble;
284 }
285 } else if (value.isBoolean() && (!strcmp(javaClassName, "java.lang.Boolean") || !strcmp(javaClassName, "java.lang.Object"))) {
286 bool boolValue = value.asBoolean();
287 JNIEnv* env = getJNIEnv();
288 static JGClass clazz(env->FindClass("java/lang/Boolean"));
289 jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(Z)Ljava/lang/Boolean;");
290 jobject javaBoolean = env->CallStaticObjectMethod(clazz, meth, boolValue);
291 result.l = javaBoolean;
304 result.l = javaString;
305 }
306 }
307 }
308 break;
309
310 case JavaTypeBoolean:
311 {
312 result.z = (jboolean)value.toNumber(exec);
313 }
314 break;
315
316 case JavaTypeByte:
317 {
318 result.b = (jbyte)value.toNumber(exec);
319 }
320 break;
321
322 case JavaTypeChar:
323 {
324 result.c = (jchar)value.toNumber(exec);
325 }
326 break;
327
328 case JavaTypeShort:
329 {
330 result.s = (jshort)value.toNumber(exec);
331 }
332 break;
333
334 case JavaTypeInt:
335 {
336 result.i = (jint)value.toNumber(exec);
337 }
338 break;
339
340 case JavaTypeLong:
341 {
342 result.j = (jlong)value.toNumber(exec);
343 }
344 break;
|
161 {
162 jarray = (jobjectArray)env->NewDoubleArray(length);
163 for (unsigned i = 0; i < length; i++) {
164 JSValue item = jsArray->get(exec, i);
165 jdouble value = (jdouble)item.toNumber(exec);
166 env->SetDoubleArrayRegion((jdoubleArray)jarray, (jsize)i, (jsize)1, &value);
167 }
168 break;
169 }
170
171 case JavaTypeArray: // don't handle embedded arrays
172 case JavaTypeVoid: // Don't expect arrays of void objects
173 case JavaTypeInvalid: // Array of unknown objects
174 break;
175 }
176
177 // if it was not one of the cases handled, then null is returned
178 return jarray;
179 }
180
181 static jchar toJCharValue(const JSValue& value, ExecState* exec)
182 {
183 // If JS type is string and target Java type is char, then
184 // return the first unicode character.
185 if (value.isString()) {
186 String stringValue = value.toString(exec)->value(exec);
187 return (jchar)stringValue[0];
188 }
189 return (jchar)value.toNumber(exec);
190 }
191
192 jobject convertUndefinedToJObject()
193 {
194 static JGObject jgoUndefined;
195 if (!jgoUndefined) {
196 JNIEnv* env = getJNIEnv();
197 jclass clazz = env->FindClass(JSOBJECT_CLASSNAME);
198 jgoUndefined = JLObject(env->GetStaticObjectField(
199 clazz,
200 env->GetStaticFieldID(clazz, "UNDEFINED", "Ljava/lang/String;")));
201 }
202 return jgoUndefined;
203 }
204
205 jvalue convertValueToJValue(ExecState* exec, RootObject* rootObject, JSValue value, JavaType javaType, const char* javaClassName)
206 {
207 JSLockHolder lock(exec);
208
209 jvalue result;
210 memset(&result, 0, sizeof(jvalue));
211
212 switch (javaType) {
213 case JavaTypeArray:
214 case JavaTypeObject:
215 {
216 // FIXME: JavaJSObject::convertValueToJObject functionality is almost exactly the same,
217 // these functions should use common code.
218
219 if (value.isObject()) {
220 JSObject* object = asObject(value);
221 if (object->inherits(JavaRuntimeObject::info())) {
222 // Unwrap a Java instance.
223 JavaRuntimeObject* runtimeObject = static_cast<JavaRuntimeObject*>(object);
224 JavaInstance* instance = runtimeObject->getInternalJavaInstance();
262 static JGClass jsObjectClass = env->FindClass(JSOBJECT_CLASSNAME);
263 static jmethodID constructorID = env->GetMethodID(jsObjectClass, "<init>", "(JI)V");
264 if (constructorID) {
265 rootObject->gcProtect(object);
266 jlong nativeHandle = ptr_to_jlong(object);
267 result.l = env->NewObject(jsObjectClass, constructorID,
268 nativeHandle,
269 com_sun_webkit_dom_JSObject_JS_CONTEXT_OBJECT);
270 }
271 }
272 }
273 }
274
275 // Create an appropriate Java object if target type is java.lang.Object or other wrapper Objects {Integer, Double, Boolean}.
276 if (!result.l) {
277 if (value.isString() && !strcmp(javaClassName, "java.lang.Object")) {
278 String stringValue = asString(value)->value(exec);
279 JNIEnv* env = getJNIEnv();
280 jobject javaString = env->functions->NewString(env, (const jchar*)stringValue.deprecatedCharacters(), stringValue.length());
281 result.l = javaString;
282 } else if (value.isString() && !strcmp(javaClassName, "java.lang.Character")) {
283 JNIEnv* env = getJNIEnv();
284 static JGClass clazz(env->FindClass("java/lang/Character"));
285 jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(C)Ljava/lang/Character;");
286 jchar charValue = toJCharValue(value, exec);
287 jobject javaChar = env->CallStaticObjectMethod(clazz, meth, charValue);
288 result.l = javaChar;
289 } else if (value.isNumber()) {
290 JNIEnv* env = getJNIEnv();
291 if (value.isInt32() && (!strcmp(javaClassName, "java.lang.Number") || !strcmp(javaClassName, "java.lang.Integer") || !strcmp(javaClassName, "java.lang.Object"))) {
292 static JGClass clazz(env->FindClass("java/lang/Integer"));
293 jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(I)Ljava/lang/Integer;");
294 result.l = env->CallStaticObjectMethod(clazz, meth, (jint) value.asInt32());
295 } else if (!strcmp(javaClassName, "java.lang.Number") || !strcmp(javaClassName, "java.lang.Double") || !strcmp(javaClassName, "java.lang.Object")) {
296 jdouble doubleValue = (jdouble) value.asNumber();
297 static JGClass clazz = env->FindClass("java/lang/Double");
298 jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(D)Ljava/lang/Double;");
299 jobject javaDouble = env->CallStaticObjectMethod(clazz, meth, doubleValue);
300 result.l = javaDouble;
301 }
302 } else if (value.isBoolean() && (!strcmp(javaClassName, "java.lang.Boolean") || !strcmp(javaClassName, "java.lang.Object"))) {
303 bool boolValue = value.asBoolean();
304 JNIEnv* env = getJNIEnv();
305 static JGClass clazz(env->FindClass("java/lang/Boolean"));
306 jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(Z)Ljava/lang/Boolean;");
307 jobject javaBoolean = env->CallStaticObjectMethod(clazz, meth, boolValue);
308 result.l = javaBoolean;
321 result.l = javaString;
322 }
323 }
324 }
325 break;
326
327 case JavaTypeBoolean:
328 {
329 result.z = (jboolean)value.toNumber(exec);
330 }
331 break;
332
333 case JavaTypeByte:
334 {
335 result.b = (jbyte)value.toNumber(exec);
336 }
337 break;
338
339 case JavaTypeChar:
340 {
341 result.c = toJCharValue(value, exec);
342 }
343 break;
344
345 case JavaTypeShort:
346 {
347 result.s = (jshort)value.toNumber(exec);
348 }
349 break;
350
351 case JavaTypeInt:
352 {
353 result.i = (jint)value.toNumber(exec);
354 }
355 break;
356
357 case JavaTypeLong:
358 {
359 result.j = (jlong)value.toNumber(exec);
360 }
361 break;
|