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

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