JavaMemberDescriptor * jsj_GetJavaStaticMemberDescriptor(JSContext *cx, JNIEnv *jEnv, JavaClassDescriptor *class_descriptor, jstring member_name_jstr) { JavaMemberDescriptor *member_descriptor; jsid id; if (!JavaStringToId(cx, jEnv, member_name_jstr, &id)) return NULL; member_descriptor = jsj_LookupJavaStaticMemberDescriptorById(cx, jEnv, class_descriptor, id); if (member_descriptor) return member_descriptor; member_descriptor = JS_malloc(cx, sizeof(JavaMemberDescriptor)); if (!member_descriptor) return NULL; memset(member_descriptor, 0, sizeof(JavaMemberDescriptor)); member_descriptor->name = jsj_DupJavaStringUTF(cx, jEnv, member_name_jstr); if (!member_descriptor->name) { JS_free(cx, member_descriptor); return NULL; } member_descriptor->id = id; member_descriptor->next = class_descriptor->static_members; class_descriptor->static_members = member_descriptor; return member_descriptor; }
static JSBool lookup_static_member_by_id(JSContext *cx, JNIEnv *jEnv, JSObject *obj, JavaClassDescriptor **class_descriptorp, jsid id, JavaMemberDescriptor **memberp) { jsval idval; JavaMemberDescriptor *member_descriptor; const char *member_name; JavaClassDescriptor *class_descriptor; class_descriptor = JS_GetPrivate(cx, obj); if (!class_descriptor) { *class_descriptorp = NULL; *memberp = NULL; return JS_TRUE; } if (class_descriptorp) *class_descriptorp = class_descriptor; member_descriptor = jsj_LookupJavaStaticMemberDescriptorById(cx, jEnv, class_descriptor, id); if (!member_descriptor) { JS_IdToValue(cx, id, &idval); if (!JSVAL_IS_STRING(idval)) { JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL, JSJMSG_BAD_JCLASS_EXPR); return JS_FALSE; } member_name = JS_GetStringBytes(JSVAL_TO_STRING(idval)); /* * See if the property looks like the explicit resolution of an * overloaded method, e.g. "max(double,double)". */ member_descriptor = jsj_ResolveExplicitMethod(cx, jEnv, class_descriptor, id, JS_TRUE); if (member_descriptor) goto done; /* Why do we have to do this ? */ if (!strcmp(member_name, "prototype")) { *memberp = NULL; return JS_TRUE; } JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL, JSJMSG_MISSING_NAME, class_descriptor->name, member_name); return JS_FALSE; } done: if (memberp) *memberp = member_descriptor; return JS_TRUE; }