jsj_javapackage.c
来自「一个基于alice开发的机器人」· C语言 代码 · 共 549 行 · 第 1/2 页
C
549 行
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 */
};
JavaPackageDef
standard_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 JSBool
pre_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.)
*/
JSBool
jsj_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 + =
减小字号Ctrl + -
显示快捷键?