📄 jsj_javapackage.c
字号:
switch (type) { /* Pretty-printing of JavaPackage */ case JSTYPE_VOID: /* Default value */ case JSTYPE_NUMBER: case JSTYPE_STRING: /* Convert '/' to '.' so that it looks like Java language syntax. */ if (!package->path) break; name = JS_smprintf("[JavaPackage %s]", package->path); if (!name) { JS_ReportOutOfMemory(cx); return JS_FALSE; } for (cp = name; *cp != '\0'; cp++) if (*cp == '/') *cp = '.'; str = JS_NewString(cx, name, strlen(name)); if (!str) { free(name); /* It's not necessary to call JS_ReportOutOfMemory(), as JS_NewString() will do so on failure. */ return JS_FALSE; } *vp = STRING_TO_JSVAL(str); break; case JSTYPE_OBJECT: *vp = OBJECT_TO_JSVAL(obj); break; default: break; } return JS_TRUE;}/* * Free the private native data associated with the JavaPackage object. */JS_STATIC_DLL_CALLBACK(void)JavaPackage_finalize(JSContext *cx, JSObject *obj){ JavaPackage_Private *package = JS_GetPrivate(cx, obj); if (!package) return; if (package->path) JS_free(cx, (char *)package->path); JS_free(cx, package);}/* * The definition of the JavaPackage class */JSClass JavaPackage_class = { "JavaPackage", JSCLASS_HAS_PRIVATE, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JavaPackage_setProperty, JS_EnumerateStub, JavaPackage_resolve, JavaPackage_convert, JavaPackage_finalize, /* Optionally non-null members start here. */ NULL, /* getObjectOps */ NULL, /* checkAccess */ NULL, /* call */ NULL, /* construct */ NULL, /* xdrObject */ NULL, /* hasInstance */ NULL, /* mark */ 0, /* spare */};JavaPackageDefstandard_java_packages[] = { {"java", NULL, PKG_USER, 0}, {"java.applet", NULL, PKG_USER, JSPROP_READONLY}, {"java.awt", NULL, PKG_USER, JSPROP_READONLY}, {"java.awt.datatransfer", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"java.awt.event", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"java.awt.image", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"java.awt.peer", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"java.beans", NULL, PKG_USER, JSPROP_READONLY}, {"java.io", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"java.lang", NULL, PKG_USER, JSPROP_READONLY}, {"java.lang.reflect", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"java.math", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"java.net", NULL, PKG_USER, JSPROP_READONLY}, {"java.rmi", NULL, PKG_USER, JSPROP_READONLY}, {"java.rmi.dgc", NULL, PKG_USER, JSPROP_READONLY}, {"java.rmi.user", NULL, PKG_USER, JSPROP_READONLY}, {"java.rmi.registry", NULL, PKG_USER, JSPROP_READONLY}, {"java.rmi.server", NULL, PKG_USER, JSPROP_READONLY}, {"java.security", NULL, PKG_USER, JSPROP_READONLY}, {"java.security.acl", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"java.security.interfaces", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"java.sql", NULL, PKG_USER, JSPROP_READONLY}, {"java.text", NULL, PKG_USER, JSPROP_READONLY}, {"java.text.resources", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"java.util", NULL, PKG_USER, JSPROP_READONLY}, {"java.util.zip", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape", NULL, PKG_USER, 0}, {"netscape.applet", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.application",NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.debug", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.javascript", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.ldap", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.misc", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.net", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.plugin", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.util", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.secfile", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.security", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"netscape.WAI", NULL, PKG_SYSTEM, JSPROP_READONLY}, {"sun", NULL, PKG_USER, 0}, {"Packages", "", PKG_USER, JSPROP_READONLY}, {NULL, NULL, 0, 0}};/* * On systems which provide strtok_r we'll use that function to avoid * problems with non-thread-safety. */#if HAVE_STRTOK_R# define STRTOK_1ST(str, seps, res) strtok_r (str, seps, &res)# define STRTOK_OTHER(seps, res) strtok_r (res, seps, &res)#else# define STRTOK_1ST(str, seps, res) strtok (str, seps)# define STRTOK_OTHER(seps, res) strtok (NULL, seps)#endif/* * Pre-define a hierarchy of JavaPackage objects. * Pre-defining a Java package at initialization time is not necessary, but * it will make package lookup faster and, more importantly, will avoid * unnecessary network accesses if classes are being loaded over the network. */static JSBoolpre_define_java_packages(JSContext *cx, JSObject *global_obj, JavaPackageDef *predefined_packages){ JSBool package_exists; JSObject *parent_obj; JavaPackageDef *package_def; char *simple_name, *cp, *package_name, *path; int flags; if (!predefined_packages) return JS_TRUE; /* Iterate over all pre-defined Java packages */ for (package_def = predefined_packages; package_def->name; package_def++) {#if HAVE_STRTOK_R char *nextstr;#endif package_name = path = NULL; parent_obj = global_obj; package_name = strdup(package_def->name); if (!package_name) goto out_of_memory; /* Walk the chain of JavaPackage objects to get to the parent of the rightmost sub-package in the fully-qualified package name. */ for (simple_name = STRTOK_1ST(package_name, ".", nextstr); simple_name /*1*/; simple_name = STRTOK_OTHER(".", nextstr)) { jsval v; if (!simple_name) { JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL, JSJMSG_DOUBLE_SHIPPING, package_name); goto error; } /* Check to see if the sub-package already exists */ quiet_resolve_failure = JS_TRUE; package_exists = JS_LookupProperty(cx, parent_obj, simple_name, &v) && JSVAL_IS_OBJECT(v); quiet_resolve_failure = JS_FALSE; if (package_exists) { parent_obj = JSVAL_TO_OBJECT(v); continue; } /* New package objects should only be created at the terminal sub-package in a fully-qualified package-name */ if (STRTOK_OTHER(".", nextstr)) { JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL, JSJMSG_BAD_PACKAGE_PREDEF, package_def->name); goto error; } if (package_def->path) { path = strdup(package_def->path); if (!path) goto out_of_memory; } else { /* * The default path is specified, so create it from the * fully-qualified package name. */ path = strdup(package_def->name); if (!path) goto out_of_memory; /* Transform package name, e.g. "java.lang" ==> "java/lang" */ for (cp = path; *cp != '\0'; cp++) { if (*cp == '.') *cp = '/'; } } flags = package_def->flags; parent_obj = define_JavaPackage(cx, parent_obj, simple_name, path, flags, package_def->access); if (!parent_obj) goto error; free(path); break; } free(package_name); } return JS_TRUE;out_of_memory: JS_ReportOutOfMemory(cx);error: JS_FREE_IF(cx, package_name); JS_FREE_IF(cx, path); return JS_FALSE;}JS_STATIC_DLL_CALLBACK(JSBool)JavaPackage_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ if (!JS_InstanceOf(cx, obj, &JavaPackage_class, argv)) return JS_FALSE; return JavaPackage_convert(cx, obj, JSTYPE_STRING, rval);}static JSFunctionSpec JavaPackage_methods[] = { {"toString", JavaPackage_toString, 0, 0, 0}, {0, 0, 0, 0, 0},};/* * One-time initialization for the JavaPackage class. (This is not * run once per thread, rather it's run once for a given JSContext.) */JSBooljsj_init_JavaPackage(JSContext *cx, JSObject *global_obj, JavaPackageDef *additional_predefined_packages) { /* Define JavaPackage class */ if (!JS_InitClass(cx, global_obj, 0, &JavaPackage_class, 0, 0, 0, JavaPackage_methods, 0, 0)) return JS_FALSE; /* Add top-level packages, e.g. : java, netscape, sun */ if (!pre_define_java_packages(cx, global_obj, standard_java_packages)) return JS_FALSE; if (!pre_define_java_packages(cx, global_obj, additional_predefined_packages)) return JS_FALSE; return JS_TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -