package = JS_GetPrivate(cx, obj); if (package->flags & PKG_SYSTEM) {
current_package = JS_GetPrivate(cx, obj); if (current_package->flags & PKG_SYSTEM) {
JavaPackage_resolve(JSContext *cx, JSObject *obj, jsval id){    JavaPackage_Private *package;    JSBool ok = JS_TRUE;    jclass jclazz;    char *subPath, *newPath;    const char *path;    JNIEnv *jEnv;    JSJavaThreadState *jsj_env;    /* Painful hack for pre_define_java_packages() */    if (quiet_resolve_failure)        return JS_FALSE;                    package = (JavaPackage_Private *)JS_GetPrivate(cx, obj);    if (!package)        return JS_TRUE;    if (!JSVAL_IS_STRING(id))        return JS_TRUE;    subPath = JS_GetStringBytes(JSVAL_TO_STRING(id));    /*     * There will be an attempt to invoke the toString() method when producing     * the string representation of a JavaPackage.  When this occurs, avoid     * creating a bogus toString package.  (This means that no one can ever     * create a package with the simple name "toString", but we'll live with     * that limitation.)     */    if (!strcmp(subPath, "toString"))        return JS_FALSE;    path = package->path;    newPath = JS_smprintf("%s%s%s", path, (path[0] ? "/" : ""), subPath);    if (!newPath) {        JS_ReportOutOfMemory(cx);        return JS_FALSE;    }    jsj_env = jsj_EnterJava(cx, &jEnv);    if (!jEnv)        return JS_FALSE;    /*        Unfortunately, Java provides no way to find out whether a particular        name is a package or not.  The only way to tell is to try to load the        name as a class file and, if that fails, assume it's a package.  This        makes things work as expected for the most part, but it has three        noticeable problems that keep coming up:        - You can refer to a package like java.lang.i.buried.paul without          generating a complaint.  Of course, you'll never be able to refer to          any classes through it.        - An annoying consequence of the above is that misspelling a class name          results in a cryptic error about packages.        - In a browser context, i.e. where applets are involved, figuring out          whether something is a class may require looking for it over the net          using the current classloader.  This means that the first time you          refer to java.lang.System in a js context, there will be an attempt          to search for [[DOCBASE]]/java.class on the server.            A solution is to explicitly tell jsjava the names of all the (local)        packages on the CLASSPATH.  (Not implemented yet.)    */    jclazz = (*jEnv)->FindClass(jEnv, newPath);    if (jclazz) {        JSObject *newClass;        newClass = jsj_define_JavaClass(cx, jEnv, obj, subPath, jclazz);        (*jEnv)->DeleteLocalRef(jEnv, jclazz);        if (!newClass) {            ok = JS_FALSE;            goto out;        }    } else {        /* We assume that any failed attempt to load a class is because it           doesn't exist.  If we wanted to do a better job, we would check           the exception type and make sure that it's NoClassDefFoundError */        (*jEnv)->ExceptionClear(jEnv);        /*         * If there's no class of the given name, then we must be referring to         * a package.  However, don't allow bogus sub-packages of pre-defined         * system packages to be created.         */        if (JS_InstanceOf(cx, obj, &JavaPackage_class, NULL)) {            JavaPackage_Private *package;            package = JS_GetPrivate(cx, obj);            if (package->flags & PKG_SYSTEM) {                char *msg, *cp;                msg = JS_strdup(cx, newPath);                /* Check for OOM */                if (msg) {                    /* Convert package of form "java/lang" to "java.lang" */                    for (cp = msg; *cp != '\0'; cp++)                        if (*cp == '/')                            *cp = '.';                    JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,                                                 JSJMSG_MISSING_PACKAGE, msg);                    free((char*)msg);                }                                               ok = JS_FALSE;                goto out;            }        }        if (!define_JavaPackage(cx, obj, subPath, newPath, 0)) {            ok = JS_FALSE;            goto out;        }        #ifdef DEBUG        /* printf("JavaPackage \'%s\' created\n", newPath); */#endif    }    out:    free(newPath);    jsj_ExitJava(jsj_env);    return ok;}