Added the getClass() method for backward-compatibility with old LiveConnect.

git-svn-id: svn://10.0.0.236/trunk@4210 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
fur
1998-06-21 06:51:27 +00:00
parent cf01601caa
commit 084c69d9c7
6 changed files with 112 additions and 59 deletions

View File

@@ -207,7 +207,7 @@ JavaArray_deleteProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
static JSBool
JavaArray_defaultValue(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
{
printf("In JavaArray_defaultValue()\n");
/* printf("In JavaArray_defaultValue()\n"); */
return JavaObject_convert(cx, obj, JSTYPE_STRING, vp);
}

View File

@@ -95,9 +95,11 @@ lookup_static_member_by_id(JSContext *cx, JNIEnv *jEnv, JSObject *obj,
class_descriptor = JS_GetPrivate(cx, obj);
if (!class_descriptor) {
JS_ReportError(cx, "illegal operation on JavaClass prototype object");
return JS_FALSE;
*class_descriptorp = NULL;
*memberp = NULL;
return JS_TRUE;
}
if (class_descriptorp)
*class_descriptorp = class_descriptor;
@@ -185,7 +187,7 @@ JavaClass_setPropertyById(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
jsval idval;
JNIEnv *jEnv;
printf("In JavaClass_setProperty\n");
/* printf("In JavaClass_setProperty\n"); */
/* Get the Java per-thread environment pointer for this JSContext */
jsj_MapJSContextToJSJThread(cx, &jEnv);
@@ -247,7 +249,7 @@ JavaClass_lookupProperty(JSContext *cx, JSObject *obj, jsid id,
{
JNIEnv *jEnv;
printf("In JavaClass_lookupProperty()\n");
/* printf("In JavaClass_lookupProperty()\n"); */
/* Get the Java per-thread environment pointer for this JSContext */
jsj_MapJSContextToJSJThread(cx, &jEnv);
@@ -303,7 +305,7 @@ JavaClass_deleteProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
static JSBool
JavaClass_defaultValue(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
{
printf("In JavaClass_defaultValue()\n");
/* printf("In JavaClass_defaultValue()\n"); */
return JavaClass_convert(cx, obj, JSTYPE_STRING, vp);
}
@@ -455,7 +457,6 @@ JavaClass_getObjectOps(JSContext *cx, JSClass *clazz)
return &JavaClass_ops;
}
JSClass JavaClass_class = {
"JavaClass", JSCLASS_HAS_PRIVATE,
NULL, NULL, NULL, NULL,
@@ -463,6 +464,93 @@ JSClass JavaClass_class = {
JavaClass_getObjectOps,
};
JSObject *
jsj_new_JavaClass(JSContext *cx, JNIEnv *jEnv, JSObject* parent_obj,
JavaClassDescriptor *class_descriptor)
{
JSObject *JavaClass_obj;
JavaClass_obj = JS_NewObject(cx, &JavaClass_class, 0, parent_obj);
if (!JavaClass_obj)
return NULL;
JS_SetPrivate(cx, JavaClass_obj, (void *)class_descriptor);
#ifdef DEBUG
/* printf("JavaClass \'%s\' created\n", class_descriptor->name); */
#endif
return JavaClass_obj;
}
JSObject *
jsj_define_JavaClass(JSContext *cx, JNIEnv *jEnv, JSObject* parent_obj,
const char *simple_class_name,
jclass java_class)
{
JavaClassDescriptor *class_descriptor;
JSObject *JavaClass_obj;
class_descriptor = jsj_GetJavaClassDescriptor(cx, jEnv, java_class);
if (!class_descriptor)
return NULL;
JavaClass_obj = jsj_new_JavaClass(cx, jEnv, parent_obj, class_descriptor);
if (!JavaClass_obj)
return NULL;
if (!JS_DefineProperty(cx, parent_obj, simple_class_name,
OBJECT_TO_JSVAL(JavaClass_obj), 0, 0,
JSPROP_PERMANENT|JSPROP_READONLY|JSPROP_ENUMERATE))
return NULL;
return JavaClass_obj;
}
/*
* The getClass() native JS method is defined as a property of the global
* object. Given a JavaObject it returns the corresponding JavaClass. This
* is useful for accessing static methods and fields.
*
* js> getClass(new java.lang.String("foo"))
* [JavaClass java.lang.String]
*/
static JSBool
getClass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
JSObject *obj_arg, *JavaClass_obj;
JavaObjectWrapper *java_wrapper;
JavaClassDescriptor *class_descriptor;
JNIEnv *jEnv;
jsj_MapJSContextToJSJThread(cx, &jEnv);
if (!jEnv)
return JS_FALSE;
if (argc != 1 ||
!JSVAL_IS_OBJECT(argv[0]) ||
!(obj_arg = JSVAL_TO_OBJECT(argv[0])) ||
(!JS_InstanceOf(cx, obj_arg, &JavaObject_class, 0) &&
!JS_InstanceOf(cx, obj_arg, &JavaArray_class, 0))) {
JS_ReportError(cx, "getClass expects a Java object argument");
return JS_FALSE;
}
java_wrapper = JS_GetPrivate(cx, obj_arg);
if (!java_wrapper) {
JS_ReportError(cx, "getClass called on prototype object");
return JS_FALSE;
}
class_descriptor = java_wrapper->class_descriptor;
JavaClass_obj = jsj_new_JavaClass(cx, jEnv, NULL, class_descriptor);
if (!JavaClass_obj)
return JS_FALSE;
*rval = OBJECT_TO_JSVAL(JavaClass_obj);
return JS_TRUE;
}
extern PR_IMPORT_DATA(JSObjectOps) js_ObjectOps;
JSBool
@@ -475,44 +563,10 @@ jsj_init_JavaClass(JSContext *cx, JSObject *global_obj)
if (!JS_InitClass(cx, global_obj, 0, &JavaClass_class, 0, 0, 0, 0, 0, 0))
return JS_FALSE;
if (!JS_DefineFunction(cx, global_obj, "getClass", getClass, 0,
JSPROP_READONLY))
return JS_FALSE;
return jsj_InitJavaClassReflectionsTable();
}
JSObject *
jsj_define_JavaClass(JSContext *cx, JNIEnv *jEnv, JSObject* parent_obj,
const char *simple_class_name,
const char *fully_qualified_class_name,
jclass java_class)
{
JSObject *JavaClass_obj;
JavaClassDescriptor *class_descriptor;
JavaClass_obj = JS_DefineObject(cx, parent_obj, simple_class_name,
&JavaClass_class, 0,
JSPROP_PERMANENT | JSPROP_READONLY);
if (!JavaClass_obj)
return NULL;
/* Set the prototype so that objects constructed with
"new" have the right JSClass
if (!JS_DefineProperty(cx, JavaClass_obj, "prototype",
JSVAL_NULL, 0, 0, JSPROP_PERMANENT | JSPROP_READONLY))
goto error; */
/* Attach private, native data to the JS object */
class_descriptor = jsj_GetJavaClassDescriptor(cx, jEnv, java_class);
if (!class_descriptor)
goto error;
JS_SetPrivate(cx, JavaClass_obj, (void *)class_descriptor);
#ifdef DEBUG
/* printf("JavaClass \'%s\' created\n", class_descriptor->name); */
#endif
return JavaClass_obj;
error:
JS_DeleteProperty(cx, parent_obj, simple_class_name);
return NULL;
}

View File

@@ -507,7 +507,7 @@ JavaObject_lookupProperty(JSContext *cx, JSObject *obj, jsid id,
{
JNIEnv *jEnv;
printf("In JavaObject_lookupProperty()\n");
/* printf("In JavaObject_lookupProperty()\n"); */
/* Get the Java per-thread environment pointer for this JSContext */
jsj_MapJSContextToJSJThread(cx, &jEnv);
@@ -690,6 +690,6 @@ jsj_init_JavaObject(JSContext *cx, JSObject *global_obj)
0, 0,
0, 0))
return JS_FALSE;
return init_java_obj_reflections_table();
}

View File

@@ -168,7 +168,7 @@ JavaPackage_resolve(JSContext *cx, JSObject *obj, jsval id)
if (jclazz) {
JSObject *newClass;
newClass = jsj_define_JavaClass(cx, jEnv, obj, subPath, newPath, jclazz);
newClass = jsj_define_JavaClass(cx, jEnv, obj, subPath, jclazz);
if (!newClass) {
ok = JS_FALSE;
goto out;

View File

@@ -101,16 +101,7 @@ jsj_ConvertJSValueToJavaObject(JSContext *cx, JNIEnv *jEnv, jsval v, JavaSignatu
return JS_TRUE;
}
/* JS functions can be wrapped as a netscape.javascript.JSObject */
if (JS_TypeOfValue(cx, v) == JSTYPE_FUNCTION) {
if (convert_js_obj_to_JSObject_wrapper(cx, jEnv, js_obj, signature, cost, java_value))
return JS_TRUE;
/* That didn't work, so fall through, to attempt conversion to
a java.lang.String ... */
/* Check for a Java object wrapped inside a JS object */
} else if (JS_InstanceOf(cx, js_obj, &JavaObject_class, 0) ||
if (JS_InstanceOf(cx, js_obj, &JavaObject_class, 0) ||
JS_InstanceOf(cx, js_obj, &JavaArray_class, 0)) {
/* The source value is a Java object wrapped inside a JavaScript
@@ -150,6 +141,15 @@ jsj_ConvertJSValueToJavaObject(JSContext *cx, JNIEnv *jEnv, jsval v, JavaSignatu
/* Fall through, to attempt conversion to a Java string */
} else if (JS_TypeOfValue(cx, v) == JSTYPE_FUNCTION) {
/* JS functions can be wrapped as a netscape.javascript.JSObject */
if (convert_js_obj_to_JSObject_wrapper(cx, jEnv, js_obj, signature, cost, java_value))
return JS_TRUE;
/* That didn't work, so fall through, to attempt conversion to
a java.lang.String ... */
/* Check for a Java object wrapped inside a JS object */
} else {
/* Otherwise, see if the target type is the netscape.javascript.JSObject
wrapper class or one of its subclasses, in which case a

View File

@@ -313,7 +313,6 @@ jsj_ReleaseJavaClassDescriptor(JSContext *cx, JNIEnv *jEnv, JavaClassDescriptor
extern JSObject *
jsj_define_JavaClass(JSContext *cx, JNIEnv *jEnv, JSObject *obj,
const char *unqualified_class_name,
const char *fully_qualified_class_name,
jclass jclazz);
extern JavaMemberDescriptor *