Annotation of sbbs/include/mozilla/js/jscntxt.h, revision 1.1.1.1

1.1       root        1: /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
                      2:  *
                      3:  * ***** BEGIN LICENSE BLOCK *****
                      4:  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
                      5:  *
                      6:  * The contents of this file are subject to the Mozilla Public License Version
                      7:  * 1.1 (the "License"); you may not use this file except in compliance with
                      8:  * the License. You may obtain a copy of the License at
                      9:  * http://www.mozilla.org/MPL/
                     10:  *
                     11:  * Software distributed under the License is distributed on an "AS IS" basis,
                     12:  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
                     13:  * for the specific language governing rights and limitations under the
                     14:  * License.
                     15:  *
                     16:  * The Original Code is Mozilla Communicator client code, released
                     17:  * March 31, 1998.
                     18:  *
                     19:  * The Initial Developer of the Original Code is
                     20:  * Netscape Communications Corporation.
                     21:  * Portions created by the Initial Developer are Copyright (C) 1998
                     22:  * the Initial Developer. All Rights Reserved.
                     23:  *
                     24:  * Contributor(s):
                     25:  *
                     26:  * Alternatively, the contents of this file may be used under the terms of
                     27:  * either of the GNU General Public License Version 2 or later (the "GPL"),
                     28:  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
                     29:  * in which case the provisions of the GPL or the LGPL are applicable instead
                     30:  * of those above. If you wish to allow use of your version of this file only
                     31:  * under the terms of either the GPL or the LGPL, and not to allow others to
                     32:  * use your version of this file under the terms of the MPL, indicate your
                     33:  * decision by deleting the provisions above and replace them with the notice
                     34:  * and other provisions required by the GPL or the LGPL. If you do not delete
                     35:  * the provisions above, a recipient may use your version of this file under
                     36:  * the terms of any one of the MPL, the GPL or the LGPL.
                     37:  *
                     38:  * ***** END LICENSE BLOCK ***** */
                     39: 
                     40: #ifndef jscntxt_h___
                     41: #define jscntxt_h___
                     42: /*
                     43:  * JS execution context.
                     44:  */
                     45: #include "jsarena.h" /* Added by JSIFY */
                     46: #include "jsclist.h"
                     47: #include "jslong.h"
                     48: #include "jsatom.h"
                     49: #include "jsconfig.h"
                     50: #include "jsdhash.h"
                     51: #include "jsgc.h"
                     52: #include "jsinterp.h"
                     53: #include "jsobj.h"
                     54: #include "jsprvtd.h"
                     55: #include "jspubtd.h"
                     56: #include "jsregexp.h"
                     57: 
                     58: JS_BEGIN_EXTERN_C
                     59: 
                     60: typedef enum JSGCMode { JS_NO_GC, JS_MAYBE_GC, JS_FORCE_GC } JSGCMode;
                     61: 
                     62: typedef enum JSRuntimeState {
                     63:     JSRTS_DOWN,
                     64:     JSRTS_LAUNCHING,
                     65:     JSRTS_UP,
                     66:     JSRTS_LANDING
                     67: } JSRuntimeState;
                     68: 
                     69: typedef struct JSPropertyTreeEntry {
                     70:     JSDHashEntryHdr     hdr;
                     71:     JSScopeProperty     *child;
                     72: } JSPropertyTreeEntry;
                     73: 
                     74: struct JSRuntime {
                     75:     /* Runtime state, synchronized by the stateChange/gcLock condvar/lock. */
                     76:     JSRuntimeState      state;
                     77: 
                     78:     /* Garbage collector state, used by jsgc.c. */
                     79:     JSArenaPool         gcArenaPool;
                     80:     JSDHashTable        gcRootsHash;
                     81:     JSDHashTable        *gcLocksHash;
                     82:     JSGCThing           *gcFreeList;
                     83:     jsrefcount          gcKeepAtoms;
                     84:     uint32              gcBytes;
                     85:     uint32              gcLastBytes;
                     86:     uint32              gcMaxBytes;
                     87:     uint32              gcLevel;
                     88:     uint32              gcNumber;
                     89:     JSPackedBool        gcPoke;
                     90:     JSPackedBool        gcRunning;
                     91:     JSGCCallback        gcCallback;
                     92:     uint32              gcMallocBytes;
                     93: #ifdef JS_GCMETER
                     94:     JSGCStats           gcStats;
                     95: #endif
                     96: 
                     97:     /* Literal table maintained by jsatom.c functions. */
                     98:     JSAtomState         atomState;
                     99: 
                    100:     /* Random number generator state, used by jsmath.c. */
                    101:     JSBool              rngInitialized;
                    102:     int64               rngMultiplier;
                    103:     int64               rngAddend;
                    104:     int64               rngMask;
                    105:     int64               rngSeed;
                    106:     jsdouble            rngDscale;
                    107: 
                    108:     /* Well-known numbers held for use by this runtime's contexts. */
                    109:     jsdouble            *jsNaN;
                    110:     jsdouble            *jsNegativeInfinity;
                    111:     jsdouble            *jsPositiveInfinity;
                    112: 
                    113:     /* Empty string held for use by this runtime's contexts. */
                    114:     JSString            *emptyString;
                    115: 
                    116:     /* List of active contexts sharing this runtime; protected by gcLock. */
                    117:     JSCList             contextList;
                    118: 
                    119:     /* These are used for debugging -- see jsprvtd.h and jsdbgapi.h. */
                    120:     JSTrapHandler       interruptHandler;
                    121:     void                *interruptHandlerData;
                    122:     JSNewScriptHook     newScriptHook;
                    123:     void                *newScriptHookData;
                    124:     JSDestroyScriptHook destroyScriptHook;
                    125:     void                *destroyScriptHookData;
                    126:     JSTrapHandler       debuggerHandler;
                    127:     void                *debuggerHandlerData;
                    128:     JSSourceHandler     sourceHandler;
                    129:     void                *sourceHandlerData;
                    130:     JSInterpreterHook   executeHook;
                    131:     void                *executeHookData;
                    132:     JSInterpreterHook   callHook;
                    133:     void                *callHookData;
                    134:     JSObjectHook        objectHook;
                    135:     void                *objectHookData;
                    136:     JSTrapHandler       throwHook;
                    137:     void                *throwHookData;
                    138:     JSDebugErrorHook    debugErrorHook;
                    139:     void                *debugErrorHookData;
                    140: 
                    141:     /* More debugging state, see jsdbgapi.c. */
                    142:     JSCList             trapList;
                    143:     JSCList             watchPointList;
                    144: 
                    145:     /* Weak links to properties, indexed by quickened get/set opcodes. */
                    146:     /* XXX must come after JSCLists or MSVC alignment bug bites empty lists */
                    147:     JSPropertyCache     propertyCache;
                    148: 
                    149:     /* Client opaque pointer */
                    150:     void                *data;
                    151: 
                    152: #ifdef JS_THREADSAFE
                    153:     /* These combine to interlock the GC and new requests. */
                    154:     PRLock              *gcLock;
                    155:     PRCondVar           *gcDone;
                    156:     PRCondVar           *requestDone;
                    157:     uint32              requestCount;
                    158:     jsword              gcThread;
                    159: 
                    160:     /* Lock and owning thread pointer for JS_LOCK_RUNTIME. */
                    161:     PRLock              *rtLock;
                    162: #ifdef DEBUG
                    163:     jsword              rtLockOwner;
                    164: #endif
                    165: 
                    166:     /* Used to synchronize down/up state change; protected by gcLock. */
                    167:     PRCondVar           *stateChange;
                    168: 
                    169:     /* Used to serialize cycle checks when setting __proto__ or __parent__. */
                    170:     PRLock              *setSlotLock;
                    171:     PRCondVar           *setSlotDone;
                    172:     JSBool              setSlotBusy;
                    173:     JSScope             *setSlotScope;  /* deadlock avoidance, see jslock.c */
                    174: 
                    175:     /*
                    176:      * State for sharing single-threaded scopes, once a second thread tries to
                    177:      * lock a scope.  The scopeSharingDone condvar is protected by rt->gcLock,
                    178:      * to minimize number of locks taken in JS_EndRequest.
                    179:      *
                    180:      * The scopeSharingTodo linked list is likewise "global" per runtime, not
                    181:      * one-list-per-context, to conserve space over all contexts, optimizing
                    182:      * for the likely case that scopes become shared rarely, and among a very
                    183:      * small set of threads (contexts).
                    184:      */
                    185:     PRCondVar           *scopeSharingDone;
                    186:     JSScope             *scopeSharingTodo;
                    187: 
                    188: /*
                    189:  * Magic terminator for the rt->scopeSharingTodo linked list, threaded through
                    190:  * scope->u.link.  This hack allows us to test whether a scope is on the list
                    191:  * by asking whether scope->u.link is non-null.  We use a large, likely bogus
                    192:  * pointer here to distinguish this value from any valid u.count (small int)
                    193:  * value.
                    194:  */
                    195: #define NO_SCOPE_SHARING_TODO   ((JSScope *) 0xfeedbeef)
                    196: #endif /* JS_THREADSAFE */
                    197: 
                    198:     /*
                    199:      * Check property accessibility for objects of arbitrary class.  Used at
                    200:      * present to check f.caller accessibility for any function object f.
                    201:      */
                    202:     JSCheckAccessOp     checkObjectAccess;
                    203: 
                    204:     /* Security principals serialization support. */
                    205:     JSPrincipalsTranscoder principalsTranscoder;
                    206: 
                    207:     /* Shared scope property tree, and allocator for its nodes. */
                    208:     JSDHashTable        propertyTreeHash;
                    209:     JSScopeProperty     *propertyFreeList;
                    210:     JSArenaPool         propertyArenaPool;
                    211: 
                    212:     /* Script filename table. */
                    213:     struct JSHashTable  *scriptFilenameTable;
                    214: #ifdef JS_THREADSAFE
                    215:     PRLock              *scriptFilenameTableLock;
                    216: #endif
                    217: 
                    218:     /* Number localization, used by jsnum.c */
                    219:     const char          *thousandsSeparator;
                    220:     const char          *decimalSeparator;
                    221:     const char          *numGrouping;
                    222: 
                    223: #ifdef DEBUG
                    224:     /* Function invocation metering. */
                    225:     jsrefcount          inlineCalls;
                    226:     jsrefcount          nativeCalls;
                    227:     jsrefcount          nonInlineCalls;
                    228:     jsrefcount          constructs;
                    229: 
                    230:     /* Scope lock and property metering. */
                    231:     jsrefcount          claimAttempts;
                    232:     jsrefcount          claimedScopes;
                    233:     jsrefcount          deadContexts;
                    234:     jsrefcount          deadlocksAvoided;
                    235:     jsrefcount          liveScopes;
                    236:     jsrefcount          sharedScopes;
                    237:     jsrefcount          totalScopes;
                    238:     jsrefcount          badUndependStrings;
                    239:     jsrefcount          liveScopeProps;
                    240:     jsrefcount          totalScopeProps;
                    241:     jsrefcount          livePropTreeNodes;
                    242:     jsrefcount          duplicatePropTreeNodes;
                    243:     jsrefcount          totalPropTreeNodes;
                    244:     jsrefcount          propTreeKidsChunks;
                    245:     jsrefcount          middleDeleteFixups;
                    246: 
                    247:     /* String instrumentation. */
                    248:     jsrefcount          liveStrings;
                    249:     jsrefcount          totalStrings;
                    250:     jsrefcount          liveDependentStrings;
                    251:     jsrefcount          totalDependentStrings;
                    252:     double              lengthSum;
                    253:     double              lengthSquaredSum;
                    254:     double              strdepLengthSum;
                    255:     double              strdepLengthSquaredSum;
                    256: #endif
                    257: };
                    258: 
                    259: #ifdef DEBUG
                    260: # define JS_RUNTIME_METER(rt, which)    JS_ATOMIC_INCREMENT(&(rt)->which)
                    261: # define JS_RUNTIME_UNMETER(rt, which)  JS_ATOMIC_DECREMENT(&(rt)->which)
                    262: #else
                    263: # define JS_RUNTIME_METER(rt, which)    /* nothing */
                    264: # define JS_RUNTIME_UNMETER(rt, which)  /* nothing */
                    265: #endif
                    266: 
                    267: #define JS_KEEP_ATOMS(rt)   JS_ATOMIC_INCREMENT(&(rt)->gcKeepAtoms);
                    268: #define JS_UNKEEP_ATOMS(rt) JS_ATOMIC_DECREMENT(&(rt)->gcKeepAtoms);
                    269: 
                    270: #ifdef JS_ARGUMENT_FORMATTER_DEFINED
                    271: /*
                    272:  * Linked list mapping format strings for JS_{Convert,Push}Arguments{,VA} to
                    273:  * formatter functions.  Elements are sorted in non-increasing format string
                    274:  * length order.
                    275:  */
                    276: struct JSArgumentFormatMap {
                    277:     const char          *format;
                    278:     size_t              length;
                    279:     JSArgumentFormatter formatter;
                    280:     JSArgumentFormatMap *next;
                    281: };
                    282: #endif
                    283: 
                    284: struct JSStackHeader {
                    285:     uintN               nslots;
                    286:     JSStackHeader       *down;
                    287: };
                    288: 
                    289: #define JS_STACK_SEGMENT(sh)    ((jsval *)(sh) + 2)
                    290: 
                    291: /*
                    292:  * Key and entry types for the JSContext.resolvingTable hash table, typedef'd
                    293:  * here because all consumers need to see these declarations (and not just the
                    294:  * typedef names, as would be the case for an opaque pointer-to-typedef'd-type
                    295:  * declaration), along with cx->resolvingTable.
                    296:  */
                    297: typedef struct JSResolvingKey {
                    298:     JSObject            *obj;
                    299:     jsid                id;
                    300: } JSResolvingKey;
                    301: 
                    302: typedef struct JSResolvingEntry {
                    303:     JSDHashEntryHdr     hdr;
                    304:     JSResolvingKey      key;
                    305:     uint32              flags;
                    306: } JSResolvingEntry;
                    307: 
                    308: #define JSRESFLAG_LOOKUP        0x1     /* resolving id from lookup */
                    309: #define JSRESFLAG_WATCH         0x2     /* resolving id from watch */
                    310: 
                    311: typedef struct JSLocalRootChunk JSLocalRootChunk;
                    312: 
                    313: #define JSLRS_CHUNK_SHIFT       6
                    314: #define JSLRS_CHUNK_SIZE        JS_BIT(JSLRS_CHUNK_SHIFT)
                    315: #define JSLRS_CHUNK_MASK        JS_BITMASK(JSLRS_CHUNK_SHIFT)
                    316: 
                    317: struct JSLocalRootChunk {
                    318:     jsval               roots[JSLRS_CHUNK_SIZE];
                    319:     JSLocalRootChunk    *down;
                    320: };
                    321: 
                    322: typedef struct JSLocalRootStack {
                    323:     uint16              scopeMark;
                    324:     uint16              rootCount;
                    325:     JSLocalRootChunk    *topChunk;
                    326:     JSLocalRootChunk    firstChunk;
                    327: } JSLocalRootStack;
                    328: 
                    329: #define JSLRS_NULL_MARK ((uint16) -1)
                    330: 
                    331: struct JSContext {
                    332:     JSCList             links;
                    333: 
                    334:     /* Interpreter activation count. */
                    335:     uintN               interpLevel;
                    336: 
                    337:     /* Limit pointer for checking stack consumption during recursion. */
                    338:     jsuword             stackLimit;
                    339: 
                    340:     /* Runtime version control identifier and equality operators. */
                    341:     JSVersion           version;
                    342:     jsbytecode          jsop_eq;
                    343:     jsbytecode          jsop_ne;
                    344: 
                    345:     /* Data shared by threads in an address space. */
                    346:     JSRuntime           *runtime;
                    347: 
                    348:     /* Stack arena pool and frame pointer register. */
                    349:     JSArenaPool         stackPool;
                    350:     JSStackFrame        *fp;
                    351: 
                    352:     /* Temporary arena pool used while compiling and decompiling. */
                    353:     JSArenaPool         tempPool;
                    354: 
                    355:     /* Top-level object and pointer to top stack frame's scope chain. */
                    356:     JSObject            *globalObject;
                    357: 
                    358:     /* Most recently created things by type, members of the GC's root set. */
                    359:     JSGCThing           *newborn[GCX_NTYPES];
                    360: 
                    361:     /* Atom root for the last-looked-up atom on this context. */
                    362:     JSAtom              *lastAtom;
                    363: 
                    364:     /* Regular expression class statics (XXX not shared globally). */
                    365:     JSRegExpStatics     regExpStatics;
                    366: 
                    367:     /* State for object and array toSource conversion. */
                    368:     JSSharpObjectMap    sharpObjectMap;
                    369: 
                    370:     /* Argument formatter support for JS_{Convert,Push}Arguments{,VA}. */
                    371:     JSArgumentFormatMap *argumentFormatMap;
                    372: 
                    373:     /* Last message string and trace file for debugging. */
                    374:     char                *lastMessage;
                    375: #ifdef DEBUG
                    376:     void                *tracefp;
                    377: #endif
                    378: 
                    379:     /* Per-context optional user callbacks. */
                    380:     JSBranchCallback    branchCallback;
                    381:     JSErrorReporter     errorReporter;
                    382: 
                    383:     /* Client opaque pointer */
                    384:     void                *data;
                    385: 
                    386:     /* GC and thread-safe state. */
                    387:     JSStackFrame        *dormantFrameChain; /* dormant stack frame to scan */
                    388: #ifdef JS_THREADSAFE
                    389:     jsword              thread;
                    390:     jsrefcount          requestDepth;
                    391:     JSScope             *scopeToShare;      /* weak reference, see jslock.c */
                    392:     JSScope             *lockedSealedScope; /* weak ref, for low-cost sealed
                    393:                                                scope locking */
                    394: #endif
                    395: 
                    396: #if JS_HAS_LVALUE_RETURN
                    397:     /*
                    398:      * Secondary return value from native method called on the left-hand side
                    399:      * of an assignment operator.  The native should store the object in which
                    400:      * to set a property in *rval, and return the property's id expressed as a
                    401:      * jsval by calling JS_SetCallReturnValue2(cx, idval).
                    402:      */
                    403:     jsval               rval2;
                    404:     JSPackedBool        rval2set;
                    405: #endif
                    406: 
                    407:     /*
                    408:      * True if creating an exception object, to prevent runaway recursion.
                    409:      * NB: creatingException packs with rval2set, #if JS_HAS_LVALUE_RETURN,
                    410:      * and with throwing, below.
                    411:      */
                    412:     JSPackedBool        creatingException;
                    413: 
                    414:     /*
                    415:      * Exception state -- the exception member is a GC root by definition.
                    416:      * NB: throwing packs with creatingException and rval2set, above.
                    417:      */
                    418:     JSPackedBool        throwing;           /* is there a pending exception? */
                    419:     jsval               exception;          /* most-recently-thrown exception */
                    420: 
                    421:     /* Per-context options. */
                    422:     uint32              options;            /* see jsapi.h for JSOPTION_* */
                    423: 
                    424:     /* Locale specific callbacks for string conversion. */
                    425:     JSLocaleCallbacks   *localeCallbacks;
                    426: 
                    427:     /*
                    428:      * cx->resolvingTable is non-null and non-empty if we are initializing
                    429:      * standard classes lazily, or if we are otherwise recursing indirectly
                    430:      * from js_LookupProperty through a JSClass.resolve hook.  It is used to
                    431:      * limit runaway recursion (see jsapi.c and jsobj.c).
                    432:      */
                    433:     JSDHashTable        *resolvingTable;
                    434: 
                    435:     /* PDL of stack headers describing stack slots not rooted by argv, etc. */
                    436:     JSStackHeader       *stackHeaders;
                    437: 
                    438:     /* Optional hook to find principals for an object being accessed on cx. */
                    439:     JSObjectPrincipalsFinder findObjectPrincipals;
                    440: 
                    441:     /* Optional stack of scoped local GC roots. */
                    442:     JSLocalRootStack    *localRootStack;
                    443: };
                    444: 
                    445: /*
                    446:  * Slightly more readable macros, also to hide bitset implementation detail.
                    447:  * XXX beware non-boolean truth values, which belie the bitset hiding claim!
                    448:  */
                    449: #define JS_HAS_STRICT_OPTION(cx)        ((cx)->options & JSOPTION_STRICT)
                    450: #define JS_HAS_WERROR_OPTION(cx)        ((cx)->options & JSOPTION_WERROR)
                    451: #define JS_HAS_COMPILE_N_GO_OPTION(cx)  ((cx)->options & JSOPTION_COMPILE_N_GO)
                    452: #define JS_HAS_ATLINE_OPTION(cx)        ((cx)->options & JSOPTION_ATLINE)
                    453: 
                    454: extern JSContext *
                    455: js_NewContext(JSRuntime *rt, size_t stackChunkSize);
                    456: 
                    457: extern void
                    458: js_DestroyContext(JSContext *cx, JSGCMode gcmode);
                    459: 
                    460: /*
                    461:  * Return true if cx points to a context in rt->contextList, else return false.
                    462:  * NB: the caller (see jslock.c:ClaimScope) must hold rt->gcLock.
                    463:  */
                    464: extern JSBool
                    465: js_ValidContextPointer(JSRuntime *rt, JSContext *cx);
                    466: 
                    467: /*
                    468:  * If unlocked, acquire and release rt->gcLock around *iterp update; otherwise
                    469:  * the caller must be holding rt->gcLock.
                    470:  */
                    471: extern JSContext *
                    472: js_ContextIterator(JSRuntime *rt, JSBool unlocked, JSContext **iterp);
                    473: 
                    474: /*
                    475:  * JSClass.resolve and watchpoint recursion damping machinery.
                    476:  */
                    477: extern JSBool
                    478: js_StartResolving(JSContext *cx, JSResolvingKey *key, uint32 flag,
                    479:                   JSResolvingEntry **entryp);
                    480: 
                    481: extern void
                    482: js_StopResolving(JSContext *cx, JSResolvingKey *key, uint32 flag,
                    483:                  JSResolvingEntry *entry, uint32 generation);
                    484: 
                    485: /*
                    486:  * Local root set management.
                    487:  */
                    488: extern JSBool
                    489: js_EnterLocalRootScope(JSContext *cx);
                    490: 
                    491: extern void
                    492: js_LeaveLocalRootScope(JSContext *cx);
                    493: 
                    494: extern void
                    495: js_ForgetLocalRoot(JSContext *cx, jsval v);
                    496: 
                    497: extern int
                    498: js_PushLocalRoot(JSContext *cx, JSLocalRootStack *lrs, jsval v);
                    499: 
                    500: extern void
                    501: js_MarkLocalRoots(JSContext *cx, JSLocalRootStack *lrs);
                    502: 
                    503: /*
                    504:  * Report an exception, which is currently realized as a printf-style format
                    505:  * string and its arguments.
                    506:  */
                    507: typedef enum JSErrNum {
                    508: #define MSG_DEF(name, number, count, exception, format) \
                    509:     name = number,
                    510: #include "js.msg"
                    511: #undef MSG_DEF
                    512:     JSErr_Limit
                    513: } JSErrNum;
                    514: 
                    515: extern const JSErrorFormatString *
                    516: js_GetErrorMessage(void *userRef, const char *locale, const uintN errorNumber);
                    517: 
                    518: #ifdef va_start
                    519: extern JSBool
                    520: js_ReportErrorVA(JSContext *cx, uintN flags, const char *format, va_list ap);
                    521: 
                    522: extern JSBool
                    523: js_ReportErrorNumberVA(JSContext *cx, uintN flags, JSErrorCallback callback,
                    524:                        void *userRef, const uintN errorNumber,
                    525:                        JSBool charArgs, va_list ap);
                    526: 
                    527: extern JSBool
                    528: js_ExpandErrorArguments(JSContext *cx, JSErrorCallback callback,
                    529:                         void *userRef, const uintN errorNumber,
                    530:                         char **message, JSErrorReport *reportp,
                    531:                         JSBool *warningp, JSBool charArgs, va_list ap);
                    532: #endif
                    533: 
                    534: extern void
                    535: js_ReportOutOfMemory(JSContext *cx, JSErrorCallback errorCallback);
                    536: 
                    537: /*
                    538:  * Report an exception using a previously composed JSErrorReport.
                    539:  * XXXbe remove from "friend" API
                    540:  */
                    541: extern JS_FRIEND_API(void)
                    542: js_ReportErrorAgain(JSContext *cx, const char *message, JSErrorReport *report);
                    543: 
                    544: extern void
                    545: js_ReportIsNotDefined(JSContext *cx, const char *name);
                    546: 
                    547: extern JSErrorFormatString js_ErrorFormatString[JSErr_Limit];
                    548: 
                    549: /*
                    550:  * See JS_SetThreadStackLimit in jsapi.c, where we check that the stack grows
                    551:  * in the expected direction.  On Unix-y systems, JS_STACK_GROWTH_DIRECTION is
                    552:  * computed on the build host by jscpucfg.c and written into jsautocfg.h.  The
                    553:  * macro is hardcoded in jscpucfg.h on Windows and Mac systems (for historical
                    554:  * reasons pre-dating autoconf usage).
                    555:  */
                    556: #if JS_STACK_GROWTH_DIRECTION > 0
                    557: # define JS_CHECK_STACK_SIZE(cx, lval)  ((jsuword)&(lval) < (cx)->stackLimit)
                    558: #else
                    559: # define JS_CHECK_STACK_SIZE(cx, lval)  ((jsuword)&(lval) > (cx)->stackLimit)
                    560: #endif
                    561: 
                    562: JS_END_EXTERN_C
                    563: 
                    564: #endif /* jscntxt_h___ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.