📄 jsapi.c
字号:
{js_InitObjectClass, EAGER_ATOM(count), NULL},#if JS_HAS_TOSOURCE {js_InitObjectClass, EAGER_ATOM(toSource), NULL},#endif {js_InitObjectClass, EAGER_ATOM(toString), NULL}, {js_InitObjectClass, EAGER_ATOM(toLocaleString), NULL}, {js_InitObjectClass, EAGER_ATOM(valueOf), NULL},#if JS_HAS_OBJ_WATCHPOINT {js_InitObjectClass, LAZY_ATOM(watch), NULL}, {js_InitObjectClass, LAZY_ATOM(unwatch), NULL},#endif {js_InitObjectClass, LAZY_ATOM(hasOwnProperty), NULL}, {js_InitObjectClass, LAZY_ATOM(isPrototypeOf), NULL}, {js_InitObjectClass, LAZY_ATOM(propertyIsEnumerable), NULL},#if JS_HAS_GETTER_SETTER {js_InitObjectClass, LAZY_ATOM(defineGetter), NULL}, {js_InitObjectClass, LAZY_ATOM(defineSetter), NULL}, {js_InitObjectClass, LAZY_ATOM(lookupGetter), NULL}, {js_InitObjectClass, LAZY_ATOM(lookupSetter), NULL},#endif {NULL, 0, NULL, NULL}};JS_PUBLIC_API(JSBool)JS_ResolveStandardClass(JSContext *cx, JSObject *obj, jsval id, JSBool *resolved){ JSString *idstr; JSRuntime *rt; JSAtom *atom; JSStdName *stdnm; uintN i; CHECK_REQUEST(cx); *resolved = JS_FALSE; if (!JSVAL_IS_STRING(id)) return JS_TRUE; idstr = JSVAL_TO_STRING(id); rt = cx->runtime; /* Check whether we're resolving 'undefined', and define it if so. */ atom = rt->atomState.typeAtoms[JSTYPE_VOID]; if (idstr == ATOM_TO_STRING(atom)) { *resolved = JS_TRUE; return OBJ_DEFINE_PROPERTY(cx, obj, ATOM_TO_JSID(atom), JSVAL_VOID, NULL, NULL, JSPROP_PERMANENT, NULL); } /* Try for class constructors/prototypes named by well-known atoms. */ stdnm = NULL; for (i = 0; standard_class_atoms[i].init; i++) { atom = OFFSET_TO_ATOM(rt, standard_class_atoms[i].atomOffset); if (idstr == ATOM_TO_STRING(atom)) { stdnm = &standard_class_atoms[i]; break; } } if (!stdnm) { /* Try less frequently used top-level functions and constants. */ for (i = 0; standard_class_names[i].init; i++) { atom = StdNameToAtom(cx, &standard_class_names[i]); if (!atom) return JS_FALSE; if (idstr == ATOM_TO_STRING(atom)) { stdnm = &standard_class_names[i]; break; } } if (!stdnm && !OBJ_GET_PROTO(cx, obj)) { /* * Try even less frequently used names delegated from the global * object to Object.prototype, but only if the Object class hasn't * yet been initialized. */ for (i = 0; object_prototype_names[i].init; i++) { atom = StdNameToAtom(cx, &object_prototype_names[i]); if (!atom) return JS_FALSE; if (idstr == ATOM_TO_STRING(atom)) { stdnm = &standard_class_names[i]; break; } } } } if (stdnm) { /* * If this standard class is anonymous and obj advertises itself as a * global object (in order to reserve slots for standard class object * pointers), then we don't want to resolve by name. * * If inversely, either id does not name a class, or id does not name * an anonymous class, or the global does not reserve slots for class * objects, then we must call the init hook here. */ if (stdnm->clasp && (stdnm->clasp->flags & JSCLASS_IS_ANONYMOUS) && (OBJ_GET_CLASS(cx, obj)->flags & JSCLASS_IS_GLOBAL)) { return JS_TRUE; } if (!stdnm->init(cx, obj)) return JS_FALSE; *resolved = JS_TRUE; } return JS_TRUE;}static JSBoolAlreadyHasOwnProperty(JSContext *cx, JSObject *obj, JSAtom *atom){ JSScopeProperty *sprop; JSScope *scope; JS_ASSERT(OBJ_IS_NATIVE(obj)); JS_LOCK_OBJ(cx, obj); scope = OBJ_SCOPE(obj); sprop = SCOPE_GET_PROPERTY(scope, ATOM_TO_JSID(atom)); JS_UNLOCK_SCOPE(cx, scope); return sprop != NULL;}JS_PUBLIC_API(JSBool)JS_EnumerateStandardClasses(JSContext *cx, JSObject *obj){ JSRuntime *rt; JSAtom *atom; uintN i; CHECK_REQUEST(cx); rt = cx->runtime; /* Check whether we need to bind 'undefined' and define it if so. */ atom = rt->atomState.typeAtoms[JSTYPE_VOID]; if (!AlreadyHasOwnProperty(cx, obj, atom) && !OBJ_DEFINE_PROPERTY(cx, obj, ATOM_TO_JSID(atom), JSVAL_VOID, NULL, NULL, JSPROP_PERMANENT, NULL)) { return JS_FALSE; } /* Initialize any classes that have not been resolved yet. */ for (i = 0; standard_class_atoms[i].init; i++) { atom = OFFSET_TO_ATOM(rt, standard_class_atoms[i].atomOffset); if (!AlreadyHasOwnProperty(cx, obj, atom) && !standard_class_atoms[i].init(cx, obj)) { return JS_FALSE; } } return JS_TRUE;}static JSIdArray *AddAtomToArray(JSContext *cx, JSAtom *atom, JSIdArray *ida, jsint *ip){ jsint i, length; i = *ip; length = ida->length; if (i >= length) { ida = js_SetIdArrayLength(cx, ida, JS_MAX(length * 2, 8)); if (!ida) return NULL; JS_ASSERT(i < ida->length); } ida->vector[i] = ATOM_TO_JSID(atom); *ip = i + 1; return ida;}static JSIdArray *EnumerateIfResolved(JSContext *cx, JSObject *obj, JSAtom *atom, JSIdArray *ida, jsint *ip, JSBool *foundp){ *foundp = AlreadyHasOwnProperty(cx, obj, atom); if (*foundp) ida = AddAtomToArray(cx, atom, ida, ip); return ida;}JS_PUBLIC_API(JSIdArray *)JS_EnumerateResolvedStandardClasses(JSContext *cx, JSObject *obj, JSIdArray *ida){ JSRuntime *rt; jsint i, j, k; JSAtom *atom; JSBool found; JSObjectOp init; CHECK_REQUEST(cx); rt = cx->runtime; if (ida) { i = ida->length; } else { ida = js_NewIdArray(cx, 8); if (!ida) return NULL; i = 0; } /* Check whether 'undefined' has been resolved and enumerate it if so. */ atom = rt->atomState.typeAtoms[JSTYPE_VOID]; ida = EnumerateIfResolved(cx, obj, atom, ida, &i, &found); if (!ida) return NULL; /* Enumerate only classes that *have* been resolved. */ for (j = 0; standard_class_atoms[j].init; j++) { atom = OFFSET_TO_ATOM(rt, standard_class_atoms[j].atomOffset); ida = EnumerateIfResolved(cx, obj, atom, ida, &i, &found); if (!ida) return NULL; if (found) { init = standard_class_atoms[j].init; for (k = 0; standard_class_names[k].init; k++) { if (standard_class_names[k].init == init) { atom = StdNameToAtom(cx, &standard_class_names[k]); ida = AddAtomToArray(cx, atom, ida, &i); if (!ida) return NULL; } } if (init == js_InitObjectClass) { for (k = 0; object_prototype_names[k].init; k++) { atom = StdNameToAtom(cx, &object_prototype_names[k]); ida = AddAtomToArray(cx, atom, ida, &i); if (!ida) return NULL; } } } } /* Trim to exact length via js_SetIdArrayLength. */ return js_SetIdArrayLength(cx, ida, i);}#undef ATOM_OFFSET#undef CLASS_ATOM_OFFSET#undef OFFSET_TO_ATOM#undef CLASP#undef EAGER_ATOM#undef EAGER_CLASS_ATOM#undef EAGER_ATOM_CLASP#undef LAZY_ATOMJS_PUBLIC_API(JSBool)JS_GetClassObject(JSContext *cx, JSObject *obj, JSProtoKey key, JSObject **objp){ CHECK_REQUEST(cx); return js_GetClassObject(cx, obj, key, objp);}JS_PUBLIC_API(JSObject *)JS_GetScopeChain(JSContext *cx){ JSStackFrame *fp; fp = cx->fp; if (!fp) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_INACTIVE); return NULL; } return js_GetScopeChain(cx, fp);}JS_PUBLIC_API(void *)JS_malloc(JSContext *cx, size_t nbytes){ void *p; JS_ASSERT(nbytes != 0); if (nbytes == 0) nbytes = 1; p = malloc(nbytes); if (!p) { JS_ReportOutOfMemory(cx); return NULL; } js_UpdateMallocCounter(cx, nbytes); return p;}JS_PUBLIC_API(void *)JS_realloc(JSContext *cx, void *p, size_t nbytes){ p = realloc(p, nbytes); if (!p) JS_ReportOutOfMemory(cx); return p;}JS_PUBLIC_API(void)JS_free(JSContext *cx, void *p){ if (p) free(p);}JS_PUBLIC_API(char *)JS_strdup(JSContext *cx, const char *s){ size_t n; void *p; n = strlen(s) + 1; p = JS_malloc(cx, n); if (!p) return NULL; return (char *)memcpy(p, s, n);}JS_PUBLIC_API(jsdouble *)JS_NewDouble(JSContext *cx, jsdouble d){ CHECK_REQUEST(cx); return js_NewDouble(cx, d, 0);}JS_PUBLIC_API(JSBool)JS_NewDoubleValue(JSContext *cx, jsdouble d, jsval *rval){ CHECK_REQUEST(cx); return js_NewDoubleValue(cx, d, rval);}JS_PUBLIC_API(JSBool)JS_NewNumberValue(JSContext *cx, jsdouble d, jsval *rval){ CHECK_REQUEST(cx); return js_NewNumberValue(cx, d, rval);}#undef JS_AddRootJS_PUBLIC_API(JSBool)JS_AddRoot(JSContext *cx, void *rp){ CHECK_REQUEST(cx); return js_AddRoot(cx, rp, NULL);}JS_PUBLIC_API(JSBool)JS_AddNamedRootRT(JSRuntime *rt, void *rp, const char *name){ return js_AddRootRT(rt, rp, name);}JS_PUBLIC_API(JSBool)JS_RemoveRoot(JSContext *cx, void *rp){ CHECK_REQUEST(cx); return js_RemoveRoot(cx->runtime, rp);}JS_PUBLIC_API(JSBool)JS_RemoveRootRT(JSRuntime *rt, void *rp){ return js_RemoveRoot(rt, rp);}JS_PUBLIC_API(JSBool)JS_AddNamedRoot(JSContext *cx, void *rp, const char *name){ CHECK_REQUEST(cx); return js_AddRoot(cx, rp, name);}JS_PUBLIC_API(void)JS_ClearNewbornRoots(JSContext *cx){ JS_CLEAR_WEAK_ROOTS(&cx->weakRoots);}JS_PUBLIC_API(JSBool)JS_EnterLocalRootScope(JSContext *cx){ CHECK_REQUEST(cx); return js_EnterLocalRootScope(cx);}JS_PUBLIC_API(void)JS_LeaveLocalRootScope(JSContext *cx){ CHECK_REQUEST(cx); js_LeaveLocalRootScope(cx);}JS_PUBLIC_API(void)JS_LeaveLocalRootScopeWithResult(JSContext *cx, jsval rval){ CHECK_REQUEST(cx); js_LeaveLocalRootScopeWithResult(cx, rval);}JS_PUBLIC_API(void)JS_ForgetLocalRoot(JSContext *cx, void *thing){ CHECK_REQUEST(cx); js_ForgetLocalRoot(cx, (jsval) thing);}#ifdef DEBUGJS_PUBLIC_API(void)JS_DumpNamedRoots(JSRuntime *rt, void (*dump)(const char *name, void *rp, void *data), void *data){ js_DumpNamedRoots(rt, dump, data);}#endif /* DEBUG */JS_PUBLIC_API(uint32)JS_MapGCRoots(JSRuntime *rt, JSGCRootMapFun map, void *data){ return js_MapGCRoots(rt, map, data);}JS_PUBLIC_API(JSBool)JS_LockGCThing(JSContext *cx, void *thing){ JSBool ok; CHECK_REQUEST(cx); ok = js_LockGCThing(cx, thing); if (!ok) JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CANT_LOCK); return ok;}JS_PUBLIC_API(JSBool)JS_LockGCThingRT(JSRuntime *rt, void *thing){ return js_LockGCThingRT(rt, thing);}JS_PUBLIC_API(JSBool)JS_UnlockGCThing(JSContext *cx, void *thing){ JSBool ok; CHECK_REQUEST(cx); ok = js_UnlockGCThingRT(cx->runtime, thing); if (!ok) JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CANT_UNLOCK); return ok;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -