⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsapi.c

📁 Swfdec still is development software, but has also followed a rigid no-crashes-allowed policy. I b
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -