📄 jsapi.c
字号:
return JS_TRUE;}#undef ATOM_OFFSET#undef OFFSET_TO_ATOMJS_PUBLIC_API(JSObject *)JS_GetScopeChain(JSContext *cx){ return cx->fp ? cx->fp->scopeChain : NULL;}JS_PUBLIC_API(void *)JS_malloc(JSContext *cx, size_t nbytes){ void *p; JS_ASSERT(nbytes != 0); if (nbytes == 0) nbytes = 1; cx->runtime->gcMallocBytes += nbytes; p = malloc(nbytes); if (!p) JS_ReportOutOfMemory(cx); 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);}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){ uintN i; for (i = 0; i < GCX_NTYPES; i++) cx->newborn[i] = NULL; cx->lastAtom = NULL;}#include "jshash.h" /* Added by JSIFY */#ifdef DEBUGtypedef struct NamedRootDumpArgs { void (*dump)(const char *name, void *rp, void *data); void *data;} NamedRootDumpArgs;JS_STATIC_DLL_CALLBACK(JSDHashOperator)js_named_root_dumper(JSDHashTable *table, JSDHashEntryHdr *hdr, uint32 number, void *arg){ NamedRootDumpArgs *args = (NamedRootDumpArgs *) arg; JSGCRootHashEntry *rhe = (JSGCRootHashEntry *)hdr; if (rhe->name) args->dump(rhe->name, rhe->root, args->data); return JS_DHASH_NEXT;}JS_PUBLIC_API(void)JS_DumpNamedRoots(JSRuntime *rt, void (*dump)(const char *name, void *rp, void *data), void *data){ NamedRootDumpArgs args; args.dump = dump; args.data = data; JS_DHashTableEnumerate(&rt->gcRootsHash, js_named_root_dumper, &args);}#endif /* DEBUG */typedef struct GCRootMapArgs { JSGCRootMapFun map; void *data;} GCRootMapArgs;JS_STATIC_DLL_CALLBACK(JSDHashOperator)js_gcroot_mapper(JSDHashTable *table, JSDHashEntryHdr *hdr, uint32 number, void *arg){ GCRootMapArgs *args = (GCRootMapArgs *) arg; JSGCRootHashEntry *rhe = (JSGCRootHashEntry *)hdr; intN mapflags; JSDHashOperator op; mapflags = args->map(rhe->root, rhe->name, args->data);#if JS_MAP_GCROOT_NEXT == JS_DHASH_NEXT && \ JS_MAP_GCROOT_STOP == JS_DHASH_STOP && \ JS_MAP_GCROOT_REMOVE == JS_DHASH_REMOVE op = (JSDHashOperator)mapflags;#else op = JS_DHASH_NEXT; if (mapflags & JS_MAP_GCROOT_STOP) op |= JS_DHASH_STOP; if (mapflags & JS_MAP_GCROOT_REMOVE) op |= JS_DHASH_REMOVE;#endif return op;}JS_PUBLIC_API(uint32)JS_MapGCRoots(JSRuntime *rt, JSGCRootMapFun map, void *data){ GCRootMapArgs args; uint32 rv; args.map = map; args.data = data; JS_LOCK_GC(rt); rv = JS_DHashTableEnumerate(&rt->gcRootsHash, js_gcroot_mapper, &args); JS_UNLOCK_GC(rt); return rv;}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;}JS_PUBLIC_API(JSBool)JS_UnlockGCThingRT(JSRuntime *rt, void *thing){ return js_UnlockGCThingRT(rt, thing);}JS_PUBLIC_API(void)JS_MarkGCThing(JSContext *cx, void *thing, const char *name, void *arg){ JS_ASSERT(cx->runtime->gcLevel > 0);#ifdef JS_THREADSAFE JS_ASSERT(cx->runtime->gcThread == js_CurrentThreadId());#endif GC_MARK(cx, thing, name, arg);}JS_PUBLIC_API(void)JS_GC(JSContext *cx){ /* Don't nuke active arenas if executing or compiling. */ if (cx->stackPool.current == &cx->stackPool.first) JS_FinishArenaPool(&cx->stackPool); if (cx->tempPool.current == &cx->tempPool.first) JS_FinishArenaPool(&cx->tempPool); js_ForceGC(cx, 0);}JS_PUBLIC_API(void)JS_MaybeGC(JSContext *cx){ JSRuntime *rt; uint32 bytes, lastBytes; rt = cx->runtime; bytes = rt->gcBytes; lastBytes = rt->gcLastBytes; if ((bytes > 8192 && bytes > lastBytes + lastBytes / 2) || rt->gcMallocBytes > rt->gcMaxBytes) { /* * Run the GC if we have half again as many bytes of GC-things as * the last time we GC'd, or if we have malloc'd more bytes through * JS_malloc than we were told to allocate by JS_NewRuntime. */ JS_GC(cx); }}JS_PUBLIC_API(JSGCCallback)JS_SetGCCallback(JSContext *cx, JSGCCallback cb){ return JS_SetGCCallbackRT(cx->runtime, cb);}JS_PUBLIC_API(JSGCCallback)JS_SetGCCallbackRT(JSRuntime *rt, JSGCCallback cb){ JSGCCallback oldcb; oldcb = rt->gcCallback; rt->gcCallback = cb; return oldcb;}JS_PUBLIC_API(JSBool)JS_IsAboutToBeFinalized(JSContext *cx, void *thing){ JS_ASSERT(thing); return js_IsAboutToBeFinalized(cx, thing);}JS_PUBLIC_API(intN)JS_AddExternalStringFinalizer(JSStringFinalizeOp finalizer){ return js_ChangeExternalStringFinalizer(NULL, finalizer);}JS_PUBLIC_API(intN)JS_RemoveExternalStringFinalizer(JSStringFinalizeOp finalizer){ return js_ChangeExternalStringFinalizer(finalizer, NULL);}JS_PUBLIC_API(JSString *)JS_NewExternalString(JSContext *cx, jschar *chars, size_t length, intN type){ JSString *str; CHECK_REQUEST(cx); JS_ASSERT(GCX_EXTERNAL_STRING <= type && type < (intN) GCX_NTYPES); str = (JSString *) js_AllocGCThing(cx, (uintN) type); if (!str) return NULL; str->length = length; str->chars = chars; return str;}JS_PUBLIC_API(intN)JS_GetExternalStringGCType(JSRuntime *rt, JSString *str){ uint8 type = (uint8) (*js_GetGCThingFlags(str) & GCF_TYPEMASK); if (type >= GCX_EXTERNAL_STRING) return (intN)type; JS_ASSERT(type == GCX_STRING || type == GCX_MUTABLE_STRING); return -1;}#ifdef DEBUGstatic voidCheckStackGrowthDirection(int *dummy1addr, jsuword limitAddr){ int dummy2;#if JS_STACK_GROWTH_DIRECTION > 0 JS_ASSERT(dummy1addr < &dummy2); JS_ASSERT((jsuword)&dummy2 < limitAddr);#else /* Stack grows downward, the common case on modern architectures. */ JS_ASSERT(&dummy2 < dummy1addr); JS_ASSERT(limitAddr < (jsuword)&dummy2);#endif}#endifJS_PUBLIC_API(void)JS_SetThreadStackLimit(JSContext *cx, jsuword limitAddr){#ifdef DEBUG int dummy1; CheckStackGrowthDirection(&dummy1, limitAddr);#endif#if JS_STACK_GROWTH_DIRECTION > 0 if (limitAddr == 0) limitAddr = (jsuword)-1;#endif cx->stackLimit = limitAddr;}/************************************************************************/JS_PUBLIC_API(void)JS_DestroyIdArray(JSContext *cx, JSIdArray *ida){ JS_free(cx, ida);}JS_PUBLIC_API(JSBool)JS_ValueToId(JSContext *cx, jsval v, jsid *idp){ JSAtom *atom; CHECK_REQUEST(cx); if (JSVAL_IS_INT(v)) { *idp = v; } else { atom = js_ValueToStringAtom(cx, v); if (!atom) return JS_FALSE; *idp = (jsid)atom; } return JS_TRUE;}JS_PUBLIC_API(JSBool)JS_IdToValue(JSContext *cx, jsid id, jsval *vp){ CHECK_REQUEST(cx); *vp = ID_TO_VALUE(id); return JS_TRUE;}JS_PUBLIC_API(JSBool)JS_PropertyStub(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ return JS_TRUE;}JS_PUBLIC_API(JSBool)JS_EnumerateStub(JSContext *cx, JSObject *obj){ return JS_TRUE;}JS_PUBLIC_API(JSBool)JS_ResolveStub(JSContext *cx, JSObject *obj, jsval id){ return JS_TRUE;}JS_PUBLIC_API(JSBool)JS_ConvertStub(JSContext *cx, JSObject *obj, JSType type, jsval *vp){#if JS_BUG_EAGER_TOSTRING if (type == JSTYPE_STRING) return JS_TRUE;#endif return js_TryValueOf(cx, obj, type, vp);}JS_PUBLIC_API(void)JS_FinalizeStub(JSContext *cx, JSObject *obj){}JS_PUBLIC_API(JSObject *)JS_InitClass(JSContext *cx, JSObject *obj, JSObject *parent_proto, const JSClass *clasp, JSNative constructor, uintN nargs, JSPropertySpec *ps, JSFunctionSpec *fs, JSPropertySpec *static_ps, JSFunctionSpec *static_fs){ JSAtom *atom; JSObject *proto, *ctor; JSBool named; JSFunction *fun; jsval junk; CHECK_REQUEST(cx); atom = js_Atomize(cx, clasp->name, strlen(clasp->name), 0); if (!atom) return NULL; /* Create a prototype object for this class. */ proto = js_NewObject(cx, clasp, parent_proto, obj); if (!proto) return NULL; if (!constructor) { /* Lacking a constructor, name the prototype (e.g., Math). */ named = OBJ_DEFINE_PROPERTY(cx, obj, (jsid)atom, OBJECT_TO_JSVAL(proto), NULL, NULL, 0, NULL); if (!named) goto bad; ctor = proto; } else { /* Define the constructor function in obj's scope. */ fun = js_DefineFunction(cx, obj, atom, constructor, nargs, 0); named = (fun != NULL); if (!fun) goto bad; /* * Remember the class this function is a constructor for so that * we know to create an object of this class when we call the * constructor. */ fun->clasp = clasp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -