📄 js.c
字号:
static char hex[] = "0123456789abcdef"; jschar u; unsigned char b, c; int i, j; if (!w) return ""; for (i = j = 0; i < sizeof enuf - 1; i++, j++) { u = w[j]; if (u == 0) break; b = (unsigned char)(u >> 8); c = (unsigned char)(u); if (b) { if (i >= sizeof enuf - 6) break; enuf[i++] = '\\'; enuf[i++] = 'u'; enuf[i++] = hex[b >> 4]; enuf[i++] = hex[b & 15]; enuf[i++] = hex[c >> 4]; enuf[i] = hex[c & 15]; } else if (!isprint(c)) { if (i >= sizeof enuf - 4) break; enuf[i++] = '\\'; enuf[i++] = 'x'; enuf[i++] = hex[c >> 4]; enuf[i] = hex[c & 15]; } else { enuf[i] = (char)c; } } enuf[i] = 0; return enuf;}#include <stdarg.h>static JSBoolZZ_formatter(JSContext *cx, const char *format, JSBool fromJS, jsval **vpp, va_list *app){ jsval *vp; va_list ap; jsdouble re, im; printf("entering ZZ_formatter"); vp = *vpp; ap = *app; if (fromJS) { if (!JS_ValueToNumber(cx, vp[0], &re)) return JS_FALSE; if (!JS_ValueToNumber(cx, vp[1], &im)) return JS_FALSE; *va_arg(ap, jsdouble *) = re; *va_arg(ap, jsdouble *) = im; } else { re = va_arg(ap, jsdouble); im = va_arg(ap, jsdouble); if (!JS_NewNumberValue(cx, re, &vp[0])) return JS_FALSE; if (!JS_NewNumberValue(cx, im, &vp[1])) return JS_FALSE; } *vpp = vp + 2; *app = ap; printf("leaving ZZ_formatter"); return JS_TRUE;}static JSBoolConvertArgs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSBool b = JS_FALSE; jschar c = 0; int32 i = 0, j = 0; uint32 u = 0; jsdouble d = 0, I = 0, re = 0, im = 0; char *s = NULL; JSString *str = NULL; jschar *w = NULL; JSObject *obj2 = NULL; JSFunction *fun = NULL; jsval v = JSVAL_VOID; JSBool ok; if (!JS_AddArgumentFormatter(cx, "ZZ", ZZ_formatter)) return JS_FALSE;; ok = JS_ConvertArguments(cx, argc, argv, "b/ciujdIsSWofvZZ*", &b, &c, &i, &u, &j, &d, &I, &s, &str, &w, &obj2, &fun, &v, &re, &im); JS_RemoveArgumentFormatter(cx, "ZZ"); if (!ok) return JS_FALSE; fprintf(gOutFile, "b %u, c %x (%c), i %ld, u %lu, j %ld\n", b, c, (char)c, i, u, j); fprintf(gOutFile, "d %g, I %g, s %s, S %s, W %s, obj %s, fun %s\n" "v %s, re %g, im %g\n", d, I, s, str ? JS_GetStringBytes(str) : "", EscapeWideString(w), JS_GetStringBytes(JS_ValueToString(cx, OBJECT_TO_JSVAL(obj2))), fun ? JS_GetStringBytes(JS_DecompileFunction(cx, fun, 4)) : "", JS_GetStringBytes(JS_ValueToString(cx, v)), re, im); return JS_TRUE;}#endifstatic JSBoolBuildDate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ char version[20] = "\n";#if JS_VERSION < 150 sprintf(version, " for version %d\n", JS_VERSION);#endif fprintf(gOutFile, "built on %s at %s%s", __DATE__, __TIME__, version); return JS_TRUE;}static JSBoolClear(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ if (argc != 0 && !JS_ValueToObject(cx, argv[0], &obj)) return JS_FALSE; JS_ClearScope(cx, obj); return JS_TRUE;}static JSBoolIntern(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString *str; str = JS_ValueToString(cx, argv[0]); if (!str) return JS_FALSE; if (!JS_InternUCStringN(cx, JS_GetStringChars(str), JS_GetStringLength(str))) { return JS_FALSE; } return JS_TRUE;}static JSBoolClone(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSFunction *fun; JSObject *funobj, *parent, *clone; fun = JS_ValueToFunction(cx, argv[0]); if (!fun) return JS_FALSE; funobj = JS_GetFunctionObject(fun); if (argc > 1) { if (!JS_ValueToObject(cx, argv[1], &parent)) return JS_FALSE; } else { parent = JS_GetParent(cx, funobj); } clone = JS_CloneFunctionObject(cx, funobj, parent); if (!clone) return JS_FALSE; *rval = OBJECT_TO_JSVAL(clone); return JS_TRUE;}static JSBoolSeal(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSObject *target; JSBool deep = JS_FALSE; if (!JS_ConvertArguments(cx, argc, argv, "o/b", &target, &deep)) return JS_FALSE; if (!target) return JS_TRUE; return JS_SealObject(cx, target, deep);}static JSBoolGetPDA(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSObject *vobj, *aobj, *pdobj; JSBool ok; JSPropertyDescArray pda; JSPropertyDesc *pd; uint32 i; jsval v; if (!JS_ValueToObject(cx, argv[0], &vobj)) return JS_FALSE; if (!vobj) return JS_TRUE; aobj = JS_NewArrayObject(cx, 0, NULL); if (!aobj) return JS_FALSE; *rval = OBJECT_TO_JSVAL(aobj); ok = JS_GetPropertyDescArray(cx, vobj, &pda); if (!ok) return JS_FALSE; pd = pda.array; for (i = 0; i < pda.length; i++) { pdobj = JS_NewObject(cx, NULL, NULL, NULL); if (!pdobj) { ok = JS_FALSE; break; } ok = JS_SetProperty(cx, pdobj, "id", &pd->id) && JS_SetProperty(cx, pdobj, "value", &pd->value) && (v = INT_TO_JSVAL(pd->flags), JS_SetProperty(cx, pdobj, "flags", &v)) && (v = INT_TO_JSVAL(pd->slot), JS_SetProperty(cx, pdobj, "slot", &v)) && JS_SetProperty(cx, pdobj, "alias", &pd->alias); if (!ok) break; v = OBJECT_TO_JSVAL(pdobj); ok = JS_SetElement(cx, aobj, i, &v); if (!ok) break; } JS_PutPropertyDescArray(cx, &pda); return ok;}static JSBoolGetSLX(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSScript *script; script = ValueToScript(cx, argv[0]); if (!script) return JS_FALSE; *rval = INT_TO_JSVAL(js_GetScriptLineExtent(script)); return JS_TRUE;}static JSBoolToInt32(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ int32 i; if (!JS_ValueToInt32(cx, argv[0], &i)) return JS_FALSE; return JS_NewNumberValue(cx, i, rval);}static JSBoolStringsAreUtf8(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ *rval = JS_CStringsAreUTF8() ? JSVAL_TRUE : JSVAL_FALSE; return JS_TRUE;}static const char* badUtf8 = "...\xC0...";static const char* bigUtf8 = "...\xFB\xBF\xBF\xBF\xBF...";static const jschar badSurrogate[] = { 'A', 'B', 'C', 0xDEEE, 'D', 'E', 0 };static JSBoolTestUtf8(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ intN mode = 1; jschar chars[20]; size_t charsLength = 5; char bytes[20]; size_t bytesLength = 20; if (argc && !JS_ValueToInt32(cx, *argv, &mode)) return JS_FALSE; /* The following throw errors if compiled with UTF-8. */ switch (mode) { /* mode 1: malformed UTF-8 string. */ case 1: JS_NewStringCopyZ(cx, badUtf8); break; /* mode 2: big UTF-8 character. */ case 2: JS_NewStringCopyZ(cx, bigUtf8); break; /* mode 3: bad surrogate character. */ case 3: JS_EncodeCharacters(cx, badSurrogate, 6, bytes, &bytesLength); break; /* mode 4: use a too small buffer. */ case 4: JS_DecodeBytes(cx, "1234567890", 10, chars, &charsLength); break; default: JS_ReportError(cx, "invalid mode parameter"); return JS_FALSE; } return !JS_IsExceptionPending (cx);}static JSBoolThrowError(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JS_ReportError(cx, "This is an error"); return JS_FALSE;}#define LAZY_STANDARD_CLASSES/* A class for easily testing the inner/outer object callbacks. */typedef struct ComplexObject { JSBool isInner; JSObject *inner; JSObject *outer;} ComplexObject;static JSObject *split_create_outer(JSContext *cx);static JSObject *split_create_inner(JSContext *cx, JSObject *outer);static ComplexObject *split_get_private(JSContext *cx, JSObject *obj);JS_STATIC_DLL_CALLBACK(JSBool)split_addProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ ComplexObject *cpx; jsid asId; cpx = split_get_private(cx, obj); if (!cpx) return JS_TRUE; if (!cpx->isInner && cpx->inner) { /* Make sure to define this property on the inner object. */ if (!JS_ValueToId(cx, *vp, &asId)) return JS_FALSE; return OBJ_DEFINE_PROPERTY(cx, cpx->inner, asId, *vp, NULL, NULL, JSPROP_ENUMERATE, NULL); } return JS_TRUE;}JS_STATIC_DLL_CALLBACK(JSBool)split_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ ComplexObject *cpx; cpx = split_get_private(cx, obj); if (!cpx) return JS_TRUE; if (!cpx->isInner && cpx->inner) { if (JSVAL_IS_STRING(id)) { JSString *str; str = JSVAL_TO_STRING(id); return JS_GetUCProperty(cx, cpx->inner, JS_GetStringChars(str), JS_GetStringLength(str), vp); } if (JSVAL_IS_INT(id)) return JS_GetElement(cx, cpx->inner, JSVAL_TO_INT(id), vp); return JS_TRUE; } return JS_TRUE;}JS_STATIC_DLL_CALLBACK(JSBool)split_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ ComplexObject *cpx; cpx = split_get_private(cx, obj); if (!cpx) return JS_TRUE; if (!cpx->isInner && cpx->inner) { if (JSVAL_IS_STRING(id)) { JSString *str; str = JSVAL_TO_STRING(id); return JS_SetUCProperty(cx, cpx->inner, JS_GetStringChars(str), JS_GetStringLength(str), vp); } if (JSVAL_IS_INT(id)) return JS_SetElement(cx, cpx->inner, JSVAL_TO_INT(id), vp); return JS_TRUE; } return JS_TRUE;}JS_STATIC_DLL_CALLBACK(JSBool)split_delProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ ComplexObject *cpx; jsid asId; cpx = split_get_private(cx, obj); if (!cpx) return JS_TRUE; if (!cpx->isInner && cpx->inner) { /* Make sure to define this property on the inner object. */ if (!JS_ValueToId(cx, *vp, &asId)) return JS_FALSE; return OBJ_DELETE_PROPERTY(cx, cpx->inner, asId, vp); } return JS_TRUE;}JS_STATIC_DLL_CALLBACK(JSBool)split_enumerate(JSContext *cx, JSObject *obj, JSIterateOp enum_op, jsval *statep, jsid *idp){ ComplexObject *cpx; JSObject *iterator; switch (enum_op) { case JSENUMERATE_INIT: cpx = JS_GetPrivate(cx, obj); if (!cpx->isInner && cpx->inner) obj = cpx->inner; iterator = JS_NewPropertyIterator(cx, obj); if (!iterator) return JS_FALSE; *statep = OBJECT_TO_JSVAL(iterator); if (idp) *idp = JSVAL_ZERO; break; case JSENUMERATE_NEXT: iterator = (JSObject*)JSVAL_TO_OBJECT(*statep); if (!JS_NextProperty(cx, iterator, idp)) return JS_FALSE; if (*idp != JSVAL_VOID) break; /* Fall through. */ case JSENUMERATE_DESTROY: /* Let GC at our iterator object. */ *statep = JSVAL_NULL; break; } return JS_TRUE;}JS_STATIC_DLL_CALLBACK(JSBool)split_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp){ ComplexObject *cpx; cpx = split_get_private(cx, obj); if (!cpx) return JS_TRUE; if (!cpx->isInner && cpx->inner) { jsid asId; JSProperty *prop; if (!JS_ValueToId(cx, id, &asId)) return JS_FALSE; if (!OBJ_LOOKUP_PROPERTY(cx, cpx->inner, asId, objp, &prop)) return JS_FALSE; if (prop)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -