| jsapi.h | | jsapi.h | |
| | | | |
| skipping to change at line 135 | | skipping to change at line 135 | |
| object that delegates to a proto
type | | object that delegates to a proto
type | |
| containing this property */ | | containing this property */ | |
| #define JSPROP_INDEX 0x80 /* name is actually (jsint) index *
/ | | #define JSPROP_INDEX 0x80 /* name is actually (jsint) index *
/ | |
| | | | |
| /* Function flags, set in JSFunctionSpec and passed to JS_NewFunction etc.
*/ | | /* Function flags, set in JSFunctionSpec and passed to JS_NewFunction etc.
*/ | |
| #define JSFUN_LAMBDA 0x08 /* expressed, not declared, functio
n */ | | #define JSFUN_LAMBDA 0x08 /* expressed, not declared, functio
n */ | |
| #define JSFUN_GETTER JSPROP_GETTER | | #define JSFUN_GETTER JSPROP_GETTER | |
| #define JSFUN_SETTER JSPROP_SETTER | | #define JSFUN_SETTER JSPROP_SETTER | |
| #define JSFUN_BOUND_METHOD 0x40 /* bind this to fun->object's paren
t */ | | #define JSFUN_BOUND_METHOD 0x40 /* bind this to fun->object's paren
t */ | |
| #define JSFUN_HEAVYWEIGHT 0x80 /* activation requires a Call objec
t */ | | #define JSFUN_HEAVYWEIGHT 0x80 /* activation requires a Call objec
t */ | |
|
| | | | |
| | | #define JSFUN_DISJOINT_FLAGS(f) ((f) & 0x0f) | |
| | | #define JSFUN_GSFLAGS(f) ((f) & (JSFUN_GETTER | JSFUN_SETTER)) | |
| | | | |
| | | #ifdef MOZILLA_1_8_BRANCH | |
| | | | |
| | | /* | |
| | | * Squeeze three more bits into existing 8-bit flags by taking advantage of | |
| | | * the invalid combination (JSFUN_GETTER | JSFUN_SETTER). | |
| | | */ | |
| | | #define JSFUN_GETTER_TEST(f) (JSFUN_GSFLAGS(f) == JSFUN_GETTER) | |
| | | #define JSFUN_SETTER_TEST(f) (JSFUN_GSFLAGS(f) == JSFUN_SETTER) | |
| | | #define JSFUN_FLAGS_TEST(f,t) (JSFUN_GSFLAGS(~(f)) ? (f) & (t) : 0) | |
| | | #define JSFUN_BOUND_METHOD_TEST(f) JSFUN_FLAGS_TEST(f, JSFUN_BOUND_METHOD) | |
| | | #define JSFUN_HEAVYWEIGHT_TEST(f) JSFUN_FLAGS_TEST(f, JSFUN_HEAVYWEIGHT) | |
| | | | |
| | | #define JSFUN_GSFLAG2ATTR(f) (JSFUN_GETTER_TEST(f) ? JSPROP_GETTER : | |
| | | \ | |
| | | JSFUN_SETTER_TEST(f) ? JSPROP_SETTER : | |
| | | 0) | |
| | | | |
| | | #define JSFUN_THISP_FLAGS(f) (JSFUN_GSFLAGS(~(f)) ? 0 : | |
| | | \ | |
| | | (f) & JSFUN_THISP_PRIMITIVE) | |
| | | #define JSFUN_THISP_TEST(f,t) ((f) == (t) || (f) == JSFUN_THISP_PRIMITIVE | |
| | | ) | |
| | | | |
| | | #define JSFUN_THISP_STRING 0x30 /* |this| may be a primitive string | |
| | | */ | |
| | | #define JSFUN_THISP_NUMBER 0x70 /* |this| may be a primitive number | |
| | | */ | |
| | | #define JSFUN_THISP_BOOLEAN 0xb0 /* |this| may be a primitive boolea | |
| | | n */ | |
| | | #define JSFUN_THISP_PRIMITIVE 0xf0 /* |this| may be any primitive valu | |
| | | e */ | |
| | | | |
| #define JSFUN_FLAGS_MASK 0xf8 /* overlay JSFUN_* attributes */ | | #define JSFUN_FLAGS_MASK 0xf8 /* overlay JSFUN_* attributes */ | |
| | | | |
|
| | | #else | |
| | | | |
| | | #define JSFUN_GETTER_TEST(f) ((f) & JSFUN_GETTER) | |
| | | #define JSFUN_SETTER_TEST(f) ((f) & JSFUN_SETTER) | |
| | | #define JSFUN_BOUND_METHOD_TEST(f) ((f) & JSFUN_BOUND_METHOD) | |
| | | #define JSFUN_HEAVYWEIGHT_TEST(f) ((f) & JSFUN_HEAVYWEIGHT) | |
| | | | |
| | | #define JSFUN_GSFLAG2ATTR(f) JSFUN_GSFLAGS(f) | |
| | | | |
| | | #define JSFUN_THISP_FLAGS(f) (f) | |
| | | #define JSFUN_THISP_TEST(f,t) ((f) & t) | |
| | | | |
| | | #define JSFUN_THISP_STRING 0x0100 /* |this| may be a primitive string | |
| | | */ | |
| | | #define JSFUN_THISP_NUMBER 0x0200 /* |this| may be a primitive number | |
| | | */ | |
| | | #define JSFUN_THISP_BOOLEAN 0x0400 /* |this| may be a primitive boolea | |
| | | n */ | |
| | | #define JSFUN_THISP_PRIMITIVE 0x0700 /* |this| may be any primitive valu | |
| | | e */ | |
| | | | |
| | | #define JSFUN_FLAGS_MASK 0x07f8 /* overlay JSFUN_* attributes -- | |
| | | note that bit #15 is used intern | |
| | | ally | |
| | | to flag interpreted functions */ | |
| | | | |
| | | #endif | |
| | | | |
| | | /* | |
| | | * Re-use JSFUN_LAMBDA, which applies only to scripted functions, for use i | |
| | | n | |
| | | * JSFunctionSpec arrays that specify generic native prototype methods, i.e | |
| | | ., | |
| | | * methods of a class prototype that are exposed as static methods taking a | |
| | | n | |
| | | * extra leading argument: the generic |this| parameter. | |
| | | * | |
| | | * If you set this flag in a JSFunctionSpec struct's flags initializer, the | |
| | | n | |
| | | * that struct must live at least as long as the native static method objec | |
| | | t | |
| | | * created due to this flag by JS_DefineFunctions or JS_InitClass. Typical | |
| | | ly | |
| | | * JSFunctionSpec structs are allocated in static arrays. | |
| | | */ | |
| | | #define JSFUN_GENERIC_NATIVE JSFUN_LAMBDA | |
| | | | |
| /* | | /* | |
| * Well-known JS values. The extern'd variables are initialized when the | | * Well-known JS values. The extern'd variables are initialized when the | |
| * first JSContext is created by JS_NewContext (see below). | | * first JSContext is created by JS_NewContext (see below). | |
| */ | | */ | |
| #define JSVAL_VOID INT_TO_JSVAL(0 - JSVAL_INT_POW2(30)) | | #define JSVAL_VOID INT_TO_JSVAL(0 - JSVAL_INT_POW2(30)) | |
| #define JSVAL_NULL OBJECT_TO_JSVAL(0) | | #define JSVAL_NULL OBJECT_TO_JSVAL(0) | |
| #define JSVAL_ZERO INT_TO_JSVAL(0) | | #define JSVAL_ZERO INT_TO_JSVAL(0) | |
| #define JSVAL_ONE INT_TO_JSVAL(1) | | #define JSVAL_ONE INT_TO_JSVAL(1) | |
| #define JSVAL_FALSE BOOLEAN_TO_JSVAL(JS_FALSE) | | #define JSVAL_FALSE BOOLEAN_TO_JSVAL(JS_FALSE) | |
| #define JSVAL_TRUE BOOLEAN_TO_JSVAL(JS_TRUE) | | #define JSVAL_TRUE BOOLEAN_TO_JSVAL(JS_TRUE) | |
| | | | |
| skipping to change at line 380 | | skipping to change at line 444 | |
| /* Yield to pending GC operations, regardless of request depth */ | | /* Yield to pending GC operations, regardless of request depth */ | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_YieldRequest(JSContext *cx); | | JS_YieldRequest(JSContext *cx); | |
| | | | |
| extern JS_PUBLIC_API(jsrefcount) | | extern JS_PUBLIC_API(jsrefcount) | |
| JS_SuspendRequest(JSContext *cx); | | JS_SuspendRequest(JSContext *cx); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_ResumeRequest(JSContext *cx, jsrefcount saveDepth); | | JS_ResumeRequest(JSContext *cx, jsrefcount saveDepth); | |
| | | | |
|
| | | #ifdef __cplusplus | |
| | | JS_END_EXTERN_C | |
| | | | |
| | | class JSAutoRequest { | |
| | | public: | |
| | | JSAutoRequest(JSContext *cx) : mContext(cx), mSaveDepth(0) { | |
| | | JS_BeginRequest(mContext); | |
| | | } | |
| | | ~JSAutoRequest() { | |
| | | JS_EndRequest(mContext); | |
| | | } | |
| | | | |
| | | void suspend() { | |
| | | mSaveDepth = JS_SuspendRequest(mContext); | |
| | | } | |
| | | void resume() { | |
| | | JS_ResumeRequest(mContext, mSaveDepth); | |
| | | } | |
| | | | |
| | | protected: | |
| | | JSContext *mContext; | |
| | | jsrefcount mSaveDepth; | |
| | | | |
| | | #if 0 | |
| | | private: | |
| | | static void *operator new(size_t) CPP_THROW_NEW { return 0; }; | |
| | | static void operator delete(void *, size_t) { }; | |
| | | #endif | |
| | | }; | |
| | | | |
| | | JS_BEGIN_EXTERN_C | |
| | | #endif | |
| | | | |
| #endif /* JS_THREADSAFE */ | | #endif /* JS_THREADSAFE */ | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_Lock(JSRuntime *rt); | | JS_Lock(JSRuntime *rt); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_Unlock(JSRuntime *rt); | | JS_Unlock(JSRuntime *rt); | |
| | | | |
|
| | | extern JS_PUBLIC_API(JSContextCallback) | |
| | | JS_SetContextCallback(JSRuntime *rt, JSContextCallback cxCallback); | |
| | | | |
| extern JS_PUBLIC_API(JSContext *) | | extern JS_PUBLIC_API(JSContext *) | |
| JS_NewContext(JSRuntime *rt, size_t stackChunkSize); | | JS_NewContext(JSRuntime *rt, size_t stackChunkSize); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_DestroyContext(JSContext *cx); | | JS_DestroyContext(JSContext *cx); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_DestroyContextNoGC(JSContext *cx); | | JS_DestroyContextNoGC(JSContext *cx); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| | | | |
| skipping to change at line 449 | | skipping to change at line 549 | |
| to an nsISupports subcla
ss */ | | to an nsISupports subcla
ss */ | |
| #define JSOPTION_COMPILE_N_GO JS_BIT(4) /* caller of JS_Compile*Scr
ipt | | #define JSOPTION_COMPILE_N_GO JS_BIT(4) /* caller of JS_Compile*Scr
ipt | |
| promises to execute comp
iled | | promises to execute comp
iled | |
| script once only; enable
s | | script once only; enable
s | |
| compile-time scope chain | | compile-time scope chain | |
| resolution of consts. */ | | resolution of consts. */ | |
| #define JSOPTION_ATLINE JS_BIT(5) /* //@line number ["filenam
e"] | | #define JSOPTION_ATLINE JS_BIT(5) /* //@line number ["filenam
e"] | |
| option supported for the | | option supported for the | |
| XUL preprocessor and kin
dred | | XUL preprocessor and kin
dred | |
| beasts. */ | | beasts. */ | |
|
| | | #define JSOPTION_XML JS_BIT(6) /* EMCAScript for XML suppo | |
| | | rt: | |
| | | parse <!-- --> as a toke | |
| | | n, | |
| | | not backward compatible | |
| | | with | |
| | | the comment-hiding hack | |
| | | used | |
| | | in HTML script tags. */ | |
| | | #define JSOPTION_NATIVE_BRANCH_CALLBACK \ | |
| | | JS_BIT(7) /* the branch callback set | |
| | | by | |
| | | JS_SetBranchCallback may | |
| | | be | |
| | | called with a null scrip | |
| | | t | |
| | | parameter, by native cod | |
| | | e | |
| | | that loops intensively * | |
| | | / | |
| | | #define JSOPTION_DONT_REPORT_UNCAUGHT \ | |
| | | JS_BIT(8) /* When returning from the | |
| | | outermost API call, prev | |
| | | ent | |
| | | uncaught exceptions from | |
| | | being converted to error | |
| | | reports */ | |
| | | | |
| extern JS_PUBLIC_API(uint32) | | extern JS_PUBLIC_API(uint32) | |
| JS_GetOptions(JSContext *cx); | | JS_GetOptions(JSContext *cx); | |
| | | | |
| extern JS_PUBLIC_API(uint32) | | extern JS_PUBLIC_API(uint32) | |
| JS_SetOptions(JSContext *cx, uint32 options); | | JS_SetOptions(JSContext *cx, uint32 options); | |
| | | | |
| extern JS_PUBLIC_API(uint32) | | extern JS_PUBLIC_API(uint32) | |
| JS_ToggleOptions(JSContext *cx, uint32 options); | | JS_ToggleOptions(JSContext *cx, uint32 options); | |
| | | | |
| | | | |
| skipping to change at line 498 | | skipping to change at line 615 | |
| * JS_EnumerateStandardClasses(cx, obj), to define eagerly during for..in | | * JS_EnumerateStandardClasses(cx, obj), to define eagerly during for..in | |
| * loops any classes not yet resolved lazily. | | * loops any classes not yet resolved lazily. | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_ResolveStandardClass(JSContext *cx, JSObject *obj, jsval id, | | JS_ResolveStandardClass(JSContext *cx, JSObject *obj, jsval id, | |
| JSBool *resolved); | | JSBool *resolved); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_EnumerateStandardClasses(JSContext *cx, JSObject *obj); | | JS_EnumerateStandardClasses(JSContext *cx, JSObject *obj); | |
| | | | |
|
| | | /* | |
| | | * Enumerate any already-resolved standard class ids into ida, or into a ne | |
| | | w | |
| | | * JSIdArray if ida is null. Return the augmented array on success, null o | |
| | | n | |
| | | * failure with ida (if it was non-null on entry) destroyed. | |
| | | */ | |
| | | extern JS_PUBLIC_API(JSIdArray *) | |
| | | JS_EnumerateResolvedStandardClasses(JSContext *cx, JSObject *obj, | |
| | | JSIdArray *ida); | |
| | | | |
| | | extern JS_PUBLIC_API(JSBool) | |
| | | JS_GetClassObject(JSContext *cx, JSObject *obj, JSProtoKey key, | |
| | | JSObject **objp); | |
| | | | |
| extern JS_PUBLIC_API(JSObject *) | | extern JS_PUBLIC_API(JSObject *) | |
| JS_GetScopeChain(JSContext *cx); | | JS_GetScopeChain(JSContext *cx); | |
| | | | |
| extern JS_PUBLIC_API(void *) | | extern JS_PUBLIC_API(void *) | |
| JS_malloc(JSContext *cx, size_t nbytes); | | JS_malloc(JSContext *cx, size_t nbytes); | |
| | | | |
| extern JS_PUBLIC_API(void *) | | extern JS_PUBLIC_API(void *) | |
| JS_realloc(JSContext *cx, void *p, size_t nbytes); | | JS_realloc(JSContext *cx, void *p, size_t nbytes); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| | | | |
| skipping to change at line 608 | | skipping to change at line 738 | |
| * return JS_FALSE; | | * return JS_FALSE; | |
| * ok = my_GetPropertyBody(cx, obj, id, vp); | | * ok = my_GetPropertyBody(cx, obj, id, vp); | |
| * JS_LeaveLocalRootScope(cx); | | * JS_LeaveLocalRootScope(cx); | |
| * return ok; | | * return ok; | |
| * } | | * } | |
| * | | * | |
| * NB: JS_LeaveLocalRootScope must be called once for every prior successfu
l | | * NB: JS_LeaveLocalRootScope must be called once for every prior successfu
l | |
| * call to JS_EnterLocalRootScope. If JS_EnterLocalRootScope fails, you mu
st | | * call to JS_EnterLocalRootScope. If JS_EnterLocalRootScope fails, you mu
st | |
| * not make the matching JS_LeaveLocalRootScope call. | | * not make the matching JS_LeaveLocalRootScope call. | |
| * | | * | |
|
| | | * JS_LeaveLocalRootScopeWithResult(cx, rval) is an alternative way to leav | |
| | | e | |
| | | * a local root scope that protects a result or return value, by effectivel | |
| | | y | |
| | | * pushing it in the caller's local root scope. | |
| | | * | |
| * In case a native hook allocates many objects or other GC-things, but the | | * In case a native hook allocates many objects or other GC-things, but the | |
| * native protects some of those GC-things by storing them as property valu
es | | * native protects some of those GC-things by storing them as property valu
es | |
| * in an object that is itself protected, the hook can call JS_ForgetLocalR
oot | | * in an object that is itself protected, the hook can call JS_ForgetLocalR
oot | |
| * to free the local root automatically pushed for the now-protected GC-thi
ng. | | * to free the local root automatically pushed for the now-protected GC-thi
ng. | |
| * | | * | |
| * JS_ForgetLocalRoot works on any GC-thing allocated in the current local | | * JS_ForgetLocalRoot works on any GC-thing allocated in the current local | |
| * root scope, but it's more time-efficient when called on references to mo
re | | * root scope, but it's more time-efficient when called on references to mo
re | |
| * recently created GC-things. Calling it successively on other than the m
ost | | * recently created GC-things. Calling it successively on other than the m
ost | |
| * recently allocated GC-thing will tend to average the time inefficiency,
and | | * recently allocated GC-thing will tend to average the time inefficiency,
and | |
| * may risk O(n^2) growth rate, but in any event, you shouldn't allocate to
o | | * may risk O(n^2) growth rate, but in any event, you shouldn't allocate to
o | |
| | | | |
| skipping to change at line 629 | | skipping to change at line 763 | |
| * the top down, forgetting each latest-allocated GC-thing immediately upon | | * the top down, forgetting each latest-allocated GC-thing immediately upon | |
| * linking it to its parent). | | * linking it to its parent). | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_EnterLocalRootScope(JSContext *cx); | | JS_EnterLocalRootScope(JSContext *cx); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_LeaveLocalRootScope(JSContext *cx); | | JS_LeaveLocalRootScope(JSContext *cx); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
|
| | | JS_LeaveLocalRootScopeWithResult(JSContext *cx, jsval rval); | |
| | | | |
| | | extern JS_PUBLIC_API(void) | |
| JS_ForgetLocalRoot(JSContext *cx, void *thing); | | JS_ForgetLocalRoot(JSContext *cx, void *thing); | |
| | | | |
|
| | | #ifdef __cplusplus | |
| | | JS_END_EXTERN_C | |
| | | | |
| | | class JSAutoLocalRootScope { | |
| | | public: | |
| | | JSAutoLocalRootScope(JSContext *cx) : mContext(cx) { | |
| | | JS_EnterLocalRootScope(mContext); | |
| | | } | |
| | | ~JSAutoLocalRootScope() { | |
| | | JS_LeaveLocalRootScope(mContext); | |
| | | } | |
| | | | |
| | | void forget(void *thing) { | |
| | | JS_ForgetLocalRoot(mContext, thing); | |
| | | } | |
| | | | |
| | | protected: | |
| | | JSContext *mContext; | |
| | | | |
| | | #if 0 | |
| | | private: | |
| | | static void *operator new(size_t) CPP_THROW_NEW { return 0; }; | |
| | | static void operator delete(void *, size_t) { }; | |
| | | #endif | |
| | | }; | |
| | | | |
| | | JS_BEGIN_EXTERN_C | |
| | | #endif | |
| | | | |
| #ifdef DEBUG | | #ifdef DEBUG | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_DumpNamedRoots(JSRuntime *rt, | | JS_DumpNamedRoots(JSRuntime *rt, | |
| void (*dump)(const char *name, void *rp, void *data), | | void (*dump)(const char *name, void *rp, void *data), | |
| void *data); | | void *data); | |
| #endif | | #endif | |
| | | | |
| /* | | /* | |
| * Call JS_MapGCRoots to map the GC's roots table using map(rp, name, data)
. | | * Call JS_MapGCRoots to map the GC's roots table using map(rp, name, data)
. | |
| * The root is pointed at by rp; if the root is unnamed, name is null; data
is | | * The root is pointed at by rp; if the root is unnamed, name is null; data
is | |
| | | | |
| skipping to change at line 709 | | skipping to change at line 875 | |
| | | | |
| extern JS_PUBLIC_API(JSGCCallback) | | extern JS_PUBLIC_API(JSGCCallback) | |
| JS_SetGCCallback(JSContext *cx, JSGCCallback cb); | | JS_SetGCCallback(JSContext *cx, JSGCCallback cb); | |
| | | | |
| extern JS_PUBLIC_API(JSGCCallback) | | extern JS_PUBLIC_API(JSGCCallback) | |
| JS_SetGCCallbackRT(JSRuntime *rt, JSGCCallback cb); | | JS_SetGCCallbackRT(JSRuntime *rt, JSGCCallback cb); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_IsAboutToBeFinalized(JSContext *cx, void *thing); | | JS_IsAboutToBeFinalized(JSContext *cx, void *thing); | |
| | | | |
|
| | | typedef enum JSGCParamKey { | |
| | | JSGC_MAX_BYTES = 0, /* maximum nominal heap before last ditch G | |
| | | C */ | |
| | | JSGC_MAX_MALLOC_BYTES = 1 /* # of JS_malloc bytes before last ditch G | |
| | | C */ | |
| | | } JSGCParamKey; | |
| | | | |
| | | extern JS_PUBLIC_API(void) | |
| | | JS_SetGCParameter(JSRuntime *rt, JSGCParamKey key, uint32 value); | |
| | | | |
| /* | | /* | |
|
| * Add an external string finalizer, one created by JS_NewExternalString (s
ee | | * Add a finalizer for external strings created by JS_NewExternalString (se
e | |
| * below) using a type-code returned from this function, and that understan
ds | | * below) using a type-code returned from this function, and that understan
ds | |
| * how to free or release the memory pointed at by JS_GetStringChars(str). | | * how to free or release the memory pointed at by JS_GetStringChars(str). | |
| * | | * | |
| * Return a nonnegative type index if there is room for finalizer in the | | * Return a nonnegative type index if there is room for finalizer in the | |
| * global GC finalizers table, else return -1. If the engine is compiled | | * global GC finalizers table, else return -1. If the engine is compiled | |
| * JS_THREADSAFE and used in a multi-threaded environment, this function mu
st | | * JS_THREADSAFE and used in a multi-threaded environment, this function mu
st | |
| * be invoked on the primordial thread only, at startup -- or else the enti
re | | * be invoked on the primordial thread only, at startup -- or else the enti
re | |
| * program must single-thread itself while loading a module that calls this | | * program must single-thread itself while loading a module that calls this | |
| * function. | | * function. | |
| */ | | */ | |
| | | | |
| skipping to change at line 795 | | skipping to change at line 969 | |
| JSGetObjectOps getObjectOps; | | JSGetObjectOps getObjectOps; | |
| JSCheckAccessOp checkAccess; | | JSCheckAccessOp checkAccess; | |
| JSNative call; | | JSNative call; | |
| JSNative construct; | | JSNative construct; | |
| JSXDRObjectOp xdrObject; | | JSXDRObjectOp xdrObject; | |
| JSHasInstanceOp hasInstance; | | JSHasInstanceOp hasInstance; | |
| JSMarkOp mark; | | JSMarkOp mark; | |
| JSReserveSlotsOp reserveSlots; | | JSReserveSlotsOp reserveSlots; | |
| }; | | }; | |
| | | | |
|
| | | struct JSExtendedClass { | |
| | | JSClass base; | |
| | | JSEqualityOp equality; | |
| | | JSObjectOp outerObject; | |
| | | JSObjectOp innerObject; | |
| | | void (*reserved0)(); | |
| | | void (*reserved1)(); | |
| | | void (*reserved2)(); | |
| | | void (*reserved3)(); | |
| | | void (*reserved4)(); | |
| | | }; | |
| | | | |
| #define JSCLASS_HAS_PRIVATE (1<<0) /* objects have private slo
t */ | | #define JSCLASS_HAS_PRIVATE (1<<0) /* objects have private slo
t */ | |
| #define JSCLASS_NEW_ENUMERATE (1<<1) /* has JSNewEnumerateOp hoo
k */ | | #define JSCLASS_NEW_ENUMERATE (1<<1) /* has JSNewEnumerateOp hoo
k */ | |
| #define JSCLASS_NEW_RESOLVE (1<<2) /* has JSNewResolveOp hook
*/ | | #define JSCLASS_NEW_RESOLVE (1<<2) /* has JSNewResolveOp hook
*/ | |
| #define JSCLASS_PRIVATE_IS_NSISUPPORTS (1<<3) /* private is (nsISupports
*) */ | | #define JSCLASS_PRIVATE_IS_NSISUPPORTS (1<<3) /* private is (nsISupports
*) */ | |
| #define JSCLASS_SHARE_ALL_PROPERTIES (1<<4) /* all properties are SHARE
D */ | | #define JSCLASS_SHARE_ALL_PROPERTIES (1<<4) /* all properties are SHARE
D */ | |
| #define JSCLASS_NEW_RESOLVE_GETS_START (1<<5) /* JSNewResolveOp gets star
ting | | #define JSCLASS_NEW_RESOLVE_GETS_START (1<<5) /* JSNewResolveOp gets star
ting | |
| object in prototype chai
n | | object in prototype chai
n | |
| passed in via *objp in/o
ut | | passed in via *objp in/o
ut | |
| parameter */ | | parameter */ | |
|
| | | #define JSCLASS_CONSTRUCT_PROTOTYPE (1<<6) /* call constructor on clas | |
| | | s | |
| | | prototype */ | |
| | | #define JSCLASS_DOCUMENT_OBSERVER (1<<7) /* DOM document observer */ | |
| | | | |
| /* | | /* | |
| * To reserve slots fetched and stored via JS_Get/SetReservedSlot, bitwise-
or | | * To reserve slots fetched and stored via JS_Get/SetReservedSlot, bitwise-
or | |
| * JSCLASS_HAS_RESERVED_SLOTS(n) into the initializer for JSClass.flags, wh
ere | | * JSCLASS_HAS_RESERVED_SLOTS(n) into the initializer for JSClass.flags, wh
ere | |
| * n is a constant in [1, 255]. Reserved slots are indexed from 0 to n-1. | | * n is a constant in [1, 255]. Reserved slots are indexed from 0 to n-1. | |
| */ | | */ | |
| #define JSCLASS_RESERVED_SLOTS_SHIFT 8 /* room for 8 flags below *
/ | | #define JSCLASS_RESERVED_SLOTS_SHIFT 8 /* room for 8 flags below *
/ | |
| #define JSCLASS_RESERVED_SLOTS_WIDTH 8 /* and 16 above this field
*/ | | #define JSCLASS_RESERVED_SLOTS_WIDTH 8 /* and 16 above this field
*/ | |
| #define JSCLASS_RESERVED_SLOTS_MASK JS_BITMASK(JSCLASS_RESERVED_SLOTS_W
IDTH) | | #define JSCLASS_RESERVED_SLOTS_MASK JS_BITMASK(JSCLASS_RESERVED_SLOTS_W
IDTH) | |
| #define JSCLASS_HAS_RESERVED_SLOTS(n) (((n) & JSCLASS_RESERVED_SLOTS_MASK
) \ | | #define JSCLASS_HAS_RESERVED_SLOTS(n) (((n) & JSCLASS_RESERVED_SLOTS_MASK
) \ | |
| << JSCLASS_RESERVED_SLOTS_SHIFT) | | << JSCLASS_RESERVED_SLOTS_SHIFT) | |
| #define JSCLASS_RESERVED_SLOTS(clasp) (((clasp)->flags
\ | | #define JSCLASS_RESERVED_SLOTS(clasp) (((clasp)->flags
\ | |
| >> JSCLASS_RESERVED_SLOTS_SHIFT)
\ | | >> JSCLASS_RESERVED_SLOTS_SHIFT)
\ | |
| & JSCLASS_RESERVED_SLOTS_MASK) | | & JSCLASS_RESERVED_SLOTS_MASK) | |
| | | | |
|
| | | #define JSCLASS_HIGH_FLAGS_SHIFT (JSCLASS_RESERVED_SLOTS_SHIFT + | |
| | | \ | |
| | | JSCLASS_RESERVED_SLOTS_WIDTH) | |
| | | | |
| | | /* True if JSClass is really a JSExtendedClass. */ | |
| | | #define JSCLASS_IS_EXTENDED (1<<(JSCLASS_HIGH_FLAGS_SHIFT+0)) | |
| | | #define JSCLASS_IS_ANONYMOUS (1<<(JSCLASS_HIGH_FLAGS_SHIFT+1)) | |
| | | #define JSCLASS_IS_GLOBAL (1<<(JSCLASS_HIGH_FLAGS_SHIFT+2)) | |
| | | | |
| | | /* | |
| | | * ECMA-262 requires that most constructors used internally create objects | |
| | | * with "the original Foo.prototype value" as their [[Prototype]] (__proto_ | |
| | | _) | |
| | | * member initial value. The "original ... value" verbiage is there becaus | |
| | | e | |
| | | * in ECMA-262, global properties naming class objects are read/write and | |
| | | * deleteable, for the most part. | |
| | | * | |
| | | * Implementing this efficiently requires that global objects have classes | |
| | | * with the following flags. Failure to use JSCLASS_GLOBAL_FLAGS won't bre | |
| | | ak | |
| | | * anything except the ECMA-262 "original prototype value" behavior, which | |
| | | was | |
| | | * broken for years in SpiderMonkey. In other words, without these flags y | |
| | | ou | |
| | | * get backward compatibility. | |
| | | */ | |
| | | #define JSCLASS_GLOBAL_FLAGS \ | |
| | | (JSCLASS_IS_GLOBAL | JSCLASS_HAS_RESERVED_SLOTS(JSProto_LIMIT)) | |
| | | | |
| | | /* Fast access to the original value of each standard class's prototype. */ | |
| | | #define JSCLASS_CACHED_PROTO_SHIFT (JSCLASS_HIGH_FLAGS_SHIFT + 8) | |
| | | #define JSCLASS_CACHED_PROTO_WIDTH 8 | |
| | | #define JSCLASS_CACHED_PROTO_MASK JS_BITMASK(JSCLASS_CACHED_PROTO_WID | |
| | | TH) | |
| | | #define JSCLASS_HAS_CACHED_PROTO(key) ((key) << JSCLASS_CACHED_PROTO_SHIF | |
| | | T) | |
| | | #define JSCLASS_CACHED_PROTO_KEY(clasp) (((clasp)->flags | |
| | | \ | |
| | | >> JSCLASS_CACHED_PROTO_SHIFT) | |
| | | \ | |
| | | & JSCLASS_CACHED_PROTO_MASK) | |
| | | | |
| /* Initializer for unused members of statically initialized JSClass structs
. */ | | /* Initializer for unused members of statically initialized JSClass structs
. */ | |
| #define JSCLASS_NO_OPTIONAL_MEMBERS 0,0,0,0,0,0,0,0 | | #define JSCLASS_NO_OPTIONAL_MEMBERS 0,0,0,0,0,0,0,0 | |
|
| | | #define JSCLASS_NO_RESERVED_MEMBERS 0,0,0,0,0 | |
| | | | |
| /* For detailed comments on these function pointer types, see jspubtd.h. */ | | /* For detailed comments on these function pointer types, see jspubtd.h. */ | |
| struct JSObjectOps { | | struct JSObjectOps { | |
| /* Mandatory non-null function pointer members. */ | | /* Mandatory non-null function pointer members. */ | |
| JSNewObjectMapOp newObjectMap; | | JSNewObjectMapOp newObjectMap; | |
| JSObjectMapOp destroyObjectMap; | | JSObjectMapOp destroyObjectMap; | |
| JSLookupPropOp lookupProperty; | | JSLookupPropOp lookupProperty; | |
| JSDefinePropOp defineProperty; | | JSDefinePropOp defineProperty; | |
| JSPropertyIdOp getProperty; | | JSPropertyIdOp getProperty; | |
| JSPropertyIdOp setProperty; | | JSPropertyIdOp setProperty; | |
| | | | |
| skipping to change at line 853 | | skipping to change at line 1076 | |
| JSXDRObjectOp xdrObject; | | JSXDRObjectOp xdrObject; | |
| JSHasInstanceOp hasInstance; | | JSHasInstanceOp hasInstance; | |
| JSSetObjectSlotOp setProto; | | JSSetObjectSlotOp setProto; | |
| JSSetObjectSlotOp setParent; | | JSSetObjectSlotOp setParent; | |
| JSMarkOp mark; | | JSMarkOp mark; | |
| JSFinalizeOp clear; | | JSFinalizeOp clear; | |
| JSGetRequiredSlotOp getRequiredSlot; | | JSGetRequiredSlotOp getRequiredSlot; | |
| JSSetRequiredSlotOp setRequiredSlot; | | JSSetRequiredSlotOp setRequiredSlot; | |
| }; | | }; | |
| | | | |
|
| | | struct JSXMLObjectOps { | |
| | | JSObjectOps base; | |
| | | JSGetMethodOp getMethod; | |
| | | JSSetMethodOp setMethod; | |
| | | JSEnumerateValuesOp enumerateValues; | |
| | | JSEqualityOp equality; | |
| | | JSConcatenateOp concatenate; | |
| | | }; | |
| | | | |
| /* | | /* | |
| * Classes that expose JSObjectOps via a non-null getObjectOps class hook m
ay | | * Classes that expose JSObjectOps via a non-null getObjectOps class hook m
ay | |
| * derive a property structure from this struct, return a pointer to it fro
m | | * derive a property structure from this struct, return a pointer to it fro
m | |
| * lookupProperty and defineProperty, and use the pointer to avoid rehashin
g | | * lookupProperty and defineProperty, and use the pointer to avoid rehashin
g | |
| * in getAttributes and setAttributes. | | * in getAttributes and setAttributes. | |
| * | | * | |
| * The jsid type contains either an int jsval (see JSVAL_IS_INT above), or
an | | * The jsid type contains either an int jsval (see JSVAL_IS_INT above), or
an | |
| * internal pointer that is opaque to users of this API, but which users ma
y | | * internal pointer that is opaque to users of this API, but which users ma
y | |
| * convert from and to a jsval using JS_ValueToId and JS_IdToValue. | | * convert from and to a jsval using JS_ValueToId and JS_IdToValue. | |
| */ | | */ | |
| | | | |
| skipping to change at line 881 | | skipping to change at line 1113 | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_DestroyIdArray(JSContext *cx, JSIdArray *ida); | | JS_DestroyIdArray(JSContext *cx, JSIdArray *ida); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_ValueToId(JSContext *cx, jsval v, jsid *idp); | | JS_ValueToId(JSContext *cx, jsval v, jsid *idp); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_IdToValue(JSContext *cx, jsid id, jsval *vp); | | JS_IdToValue(JSContext *cx, jsid id, jsval *vp); | |
| | | | |
|
| | | /* | |
| | | * The magic XML namespace id is int-tagged, but not a valid integer jsval. | |
| | | * Global object classes in embeddings that enable JS_HAS_XML_SUPPORT (E4X) | |
| | | * should handle this id specially before converting id via JSVAL_TO_INT. | |
| | | */ | |
| | | #define JS_DEFAULT_XML_NAMESPACE_ID ((jsid) JSVAL_VOID) | |
| | | | |
| | | /* | |
| | | * JSNewResolveOp flag bits. | |
| | | */ | |
| #define JSRESOLVE_QUALIFIED 0x01 /* resolve a qualified property id
*/ | | #define JSRESOLVE_QUALIFIED 0x01 /* resolve a qualified property id
*/ | |
| #define JSRESOLVE_ASSIGNING 0x02 /* resolve on the left of assignmen
t */ | | #define JSRESOLVE_ASSIGNING 0x02 /* resolve on the left of assignmen
t */ | |
| #define JSRESOLVE_DETECTING 0x04 /* 'if (o.p)...' or '(o.p) ?...:...
' */ | | #define JSRESOLVE_DETECTING 0x04 /* 'if (o.p)...' or '(o.p) ?...:...
' */ | |
| #define JSRESOLVE_DECLARING 0x08 /* var, const, or function prolog o
p */ | | #define JSRESOLVE_DECLARING 0x08 /* var, const, or function prolog o
p */ | |
| #define JSRESOLVE_CLASSNAME 0x10 /* class name used when constructin
g */ | | #define JSRESOLVE_CLASSNAME 0x10 /* class name used when constructin
g */ | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_PropertyStub(JSContext *cx, JSObject *obj, jsval id, jsval *vp); | | JS_PropertyStub(JSContext *cx, JSObject *obj, jsval id, jsval *vp); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| | | | |
| skipping to change at line 925 | | skipping to change at line 1167 | |
| const char *name; | | const char *name; | |
| int8 tinyid; | | int8 tinyid; | |
| uint8 flags; | | uint8 flags; | |
| JSPropertyOp getter; | | JSPropertyOp getter; | |
| JSPropertyOp setter; | | JSPropertyOp setter; | |
| }; | | }; | |
| | | | |
| struct JSFunctionSpec { | | struct JSFunctionSpec { | |
| const char *name; | | const char *name; | |
| JSNative call; | | JSNative call; | |
|
| | | #ifdef MOZILLA_1_8_BRANCH | |
| uint8 nargs; | | uint8 nargs; | |
| uint8 flags; | | uint8 flags; | |
|
| uint16 extra; /* number of arg slots for local GC roots * | | uint16 extra; | |
| / | | #else | |
| | | uint16 nargs; | |
| | | uint16 flags; | |
| | | uint32 extra; /* extra & 0xFFFF: | |
| | | number of arg slots for local GC roots | |
| | | extra >> 16: | |
| | | reserved, must be zero */ | |
| | | #endif | |
| }; | | }; | |
| | | | |
| extern JS_PUBLIC_API(JSObject *) | | extern JS_PUBLIC_API(JSObject *) | |
| JS_InitClass(JSContext *cx, JSObject *obj, JSObject *parent_proto, | | JS_InitClass(JSContext *cx, JSObject *obj, JSObject *parent_proto, | |
| JSClass *clasp, JSNative constructor, uintN nargs, | | JSClass *clasp, JSNative constructor, uintN nargs, | |
| JSPropertySpec *ps, JSFunctionSpec *fs, | | JSPropertySpec *ps, JSFunctionSpec *fs, | |
| JSPropertySpec *static_ps, JSFunctionSpec *static_fs); | | JSPropertySpec *static_ps, JSFunctionSpec *static_fs); | |
| | | | |
| #ifdef JS_THREADSAFE | | #ifdef JS_THREADSAFE | |
| extern JS_PUBLIC_API(JSClass *) | | extern JS_PUBLIC_API(JSClass *) | |
| | | | |
| skipping to change at line 951 | | skipping to change at line 1202 | |
| #else | | #else | |
| extern JS_PUBLIC_API(JSClass *) | | extern JS_PUBLIC_API(JSClass *) | |
| JS_GetClass(JSObject *obj); | | JS_GetClass(JSObject *obj); | |
| | | | |
| #define JS_GET_CLASS(cx,obj) JS_GetClass(obj) | | #define JS_GET_CLASS(cx,obj) JS_GetClass(obj) | |
| #endif | | #endif | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_InstanceOf(JSContext *cx, JSObject *obj, JSClass *clasp, jsval *argv); | | JS_InstanceOf(JSContext *cx, JSObject *obj, JSClass *clasp, jsval *argv); | |
| | | | |
|
| | | extern JS_PUBLIC_API(JSBool) | |
| | | JS_HasInstance(JSContext *cx, JSObject *obj, jsval v, JSBool *bp); | |
| | | | |
| extern JS_PUBLIC_API(void *) | | extern JS_PUBLIC_API(void *) | |
| JS_GetPrivate(JSContext *cx, JSObject *obj); | | JS_GetPrivate(JSContext *cx, JSObject *obj); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_SetPrivate(JSContext *cx, JSObject *obj, void *data); | | JS_SetPrivate(JSContext *cx, JSObject *obj, void *data); | |
| | | | |
| extern JS_PUBLIC_API(void *) | | extern JS_PUBLIC_API(void *) | |
| JS_GetInstancePrivate(JSContext *cx, JSObject *obj, JSClass *clasp, | | JS_GetInstancePrivate(JSContext *cx, JSObject *obj, JSClass *clasp, | |
| jsval *argv); | | jsval *argv); | |
| | | | |
| | | | |
| skipping to change at line 1023 | | skipping to change at line 1277 | |
| * Determine the attributes (JSPROP_* flags) of a property on a given objec
t. | | * Determine the attributes (JSPROP_* flags) of a property on a given objec
t. | |
| * | | * | |
| * If the object does not have a property by that name, *foundp will be | | * If the object does not have a property by that name, *foundp will be | |
| * JS_FALSE and the value of *attrsp is undefined. | | * JS_FALSE and the value of *attrsp is undefined. | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_GetPropertyAttributes(JSContext *cx, JSObject *obj, const char *name, | | JS_GetPropertyAttributes(JSContext *cx, JSObject *obj, const char *name, | |
| uintN *attrsp, JSBool *foundp); | | uintN *attrsp, JSBool *foundp); | |
| | | | |
| /* | | /* | |
|
| | | * The same, but if the property is native, return its getter and setter vi | |
| | | a | |
| | | * *getterp and *setterp, respectively (and only if the out parameter point | |
| | | er | |
| | | * is not null). | |
| | | */ | |
| | | extern JS_PUBLIC_API(JSBool) | |
| | | JS_GetPropertyAttrsGetterAndSetter(JSContext *cx, JSObject *obj, | |
| | | const char *name, | |
| | | uintN *attrsp, JSBool *foundp, | |
| | | JSPropertyOp *getterp, | |
| | | JSPropertyOp *setterp); | |
| | | | |
| | | /* | |
| * Set the attributes of a property on a given object. | | * Set the attributes of a property on a given object. | |
| * | | * | |
| * If the object does not have a property by that name, *foundp will be | | * If the object does not have a property by that name, *foundp will be | |
| * JS_FALSE and nothing will be altered. | | * JS_FALSE and nothing will be altered. | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_SetPropertyAttributes(JSContext *cx, JSObject *obj, const char *name, | | JS_SetPropertyAttributes(JSContext *cx, JSObject *obj, const char *name, | |
| uintN attrs, JSBool *foundp); | | uintN attrs, JSBool *foundp); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| | | | |
| skipping to change at line 1056 | | skipping to change at line 1322 | |
| JS_LookupProperty(JSContext *cx, JSObject *obj, const char *name, jsval *vp
); | | JS_LookupProperty(JSContext *cx, JSObject *obj, const char *name, jsval *vp
); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_LookupPropertyWithFlags(JSContext *cx, JSObject *obj, const char *name, | | JS_LookupPropertyWithFlags(JSContext *cx, JSObject *obj, const char *name, | |
| uintN flags, jsval *vp); | | uintN flags, jsval *vp); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_GetProperty(JSContext *cx, JSObject *obj, const char *name, jsval *vp); | | JS_GetProperty(JSContext *cx, JSObject *obj, const char *name, jsval *vp); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
|
| | | JS_GetMethodById(JSContext *cx, JSObject *obj, jsid id, JSObject **objp, | |
| | | jsval *vp); | |
| | | | |
| | | extern JS_PUBLIC_API(JSBool) | |
| | | JS_GetMethod(JSContext *cx, JSObject *obj, const char *name, JSObject **obj | |
| | | p, | |
| | | jsval *vp); | |
| | | | |
| | | extern JS_PUBLIC_API(JSBool) | |
| JS_SetProperty(JSContext *cx, JSObject *obj, const char *name, jsval *vp); | | JS_SetProperty(JSContext *cx, JSObject *obj, const char *name, jsval *vp); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_DeleteProperty(JSContext *cx, JSObject *obj, const char *name); | | JS_DeleteProperty(JSContext *cx, JSObject *obj, const char *name); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_DeleteProperty2(JSContext *cx, JSObject *obj, const char *name, | | JS_DeleteProperty2(JSContext *cx, JSObject *obj, const char *name, | |
| jsval *rval); | | jsval *rval); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| | | | |
| skipping to change at line 1083 | | skipping to change at line 1357 | |
| * | | * | |
| * If the object does not have a property by that name, *foundp will be | | * If the object does not have a property by that name, *foundp will be | |
| * JS_FALSE and the value of *attrsp is undefined. | | * JS_FALSE and the value of *attrsp is undefined. | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_GetUCPropertyAttributes(JSContext *cx, JSObject *obj, | | JS_GetUCPropertyAttributes(JSContext *cx, JSObject *obj, | |
| const jschar *name, size_t namelen, | | const jschar *name, size_t namelen, | |
| uintN *attrsp, JSBool *foundp); | | uintN *attrsp, JSBool *foundp); | |
| | | | |
| /* | | /* | |
|
| | | * The same, but if the property is native, return its getter and setter vi | |
| | | a | |
| | | * *getterp and *setterp, respectively (and only if the out parameter point | |
| | | er | |
| | | * is not null). | |
| | | */ | |
| | | extern JS_PUBLIC_API(JSBool) | |
| | | JS_GetUCPropertyAttrsGetterAndSetter(JSContext *cx, JSObject *obj, | |
| | | const jschar *name, size_t namelen, | |
| | | uintN *attrsp, JSBool *foundp, | |
| | | JSPropertyOp *getterp, | |
| | | JSPropertyOp *setterp); | |
| | | | |
| | | /* | |
| * Set the attributes of a property on a given object. | | * Set the attributes of a property on a given object. | |
| * | | * | |
| * If the object does not have a property by that name, *foundp will be | | * If the object does not have a property by that name, *foundp will be | |
| * JS_FALSE and nothing will be altered. | | * JS_FALSE and nothing will be altered. | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_SetUCPropertyAttributes(JSContext *cx, JSObject *obj, | | JS_SetUCPropertyAttributes(JSContext *cx, JSObject *obj, | |
| const jschar *name, size_t namelen, | | const jschar *name, size_t namelen, | |
| uintN attrs, JSBool *foundp); | | uintN attrs, JSBool *foundp); | |
| | | | |
| | | | |
| skipping to change at line 1171 | | skipping to change at line 1457 | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_DeleteElement2(JSContext *cx, JSObject *obj, jsint index, jsval *rval); | | JS_DeleteElement2(JSContext *cx, JSObject *obj, jsint index, jsval *rval); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_ClearScope(JSContext *cx, JSObject *obj); | | JS_ClearScope(JSContext *cx, JSObject *obj); | |
| | | | |
| extern JS_PUBLIC_API(JSIdArray *) | | extern JS_PUBLIC_API(JSIdArray *) | |
| JS_Enumerate(JSContext *cx, JSObject *obj); | | JS_Enumerate(JSContext *cx, JSObject *obj); | |
| | | | |
|
| | | /* | |
| | | * Create an object to iterate over enumerable properties of obj, in arbitr | |
| | | ary | |
| | | * property definition order. NB: This differs from longstanding for..in l | |
| | | oop | |
| | | * order, which uses order of property definition in obj. | |
| | | */ | |
| | | extern JS_PUBLIC_API(JSObject *) | |
| | | JS_NewPropertyIterator(JSContext *cx, JSObject *obj); | |
| | | | |
| | | /* | |
| | | * Return true on success with *idp containing the id of the next enumerabl | |
| | | e | |
| | | * property to visit using iterobj, or JSVAL_VOID if there is no such prope | |
| | | rty | |
| | | * left to visit. Return false on error. | |
| | | */ | |
| | | extern JS_PUBLIC_API(JSBool) | |
| | | JS_NextProperty(JSContext *cx, JSObject *iterobj, jsid *idp); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_CheckAccess(JSContext *cx, JSObject *obj, jsid id, JSAccessMode mode, | | JS_CheckAccess(JSContext *cx, JSObject *obj, jsid id, JSAccessMode mode, | |
| jsval *vp, uintN *attrsp); | | jsval *vp, uintN *attrsp); | |
| | | | |
| extern JS_PUBLIC_API(JSCheckAccessOp) | | extern JS_PUBLIC_API(JSCheckAccessOp) | |
| JS_SetCheckObjectAccessCallback(JSRuntime *rt, JSCheckAccessOp acb); | | JS_SetCheckObjectAccessCallback(JSRuntime *rt, JSCheckAccessOp acb); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_GetReservedSlot(JSContext *cx, JSObject *obj, uint32 index, jsval *vp); | | JS_GetReservedSlot(JSContext *cx, JSObject *obj, uint32 index, jsval *vp); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_SetReservedSlot(JSContext *cx, JSObject *obj, uint32 index, jsval v); | | JS_SetReservedSlot(JSContext *cx, JSObject *obj, uint32 index, jsval v); | |
| | | | |
| /************************************************************************/ | | /************************************************************************/ | |
| | | | |
| /* | | /* | |
| * Security protocol. | | * Security protocol. | |
| */ | | */ | |
| struct JSPrincipals { | | struct JSPrincipals { | |
| char *codebase; | | char *codebase; | |
|
| | | | |
| | | /* XXX unspecified and unused by Mozilla code -- can we remove these? * | |
| | | / | |
| void * (* JS_DLL_CALLBACK getPrincipalArray)(JSContext *cx, JSPrincipal
s *); | | void * (* JS_DLL_CALLBACK getPrincipalArray)(JSContext *cx, JSPrincipal
s *); | |
| JSBool (* JS_DLL_CALLBACK globalPrivilegesEnabled)(JSContext *cx, JSPri
ncipals *); | | JSBool (* JS_DLL_CALLBACK globalPrivilegesEnabled)(JSContext *cx, JSPri
ncipals *); | |
| | | | |
| /* Don't call "destroy"; use reference counting macros below. */ | | /* Don't call "destroy"; use reference counting macros below. */ | |
| jsrefcount refcount; | | jsrefcount refcount; | |
|
| void (* JS_DLL_CALLBACK destroy)(JSContext *cx, struct JSPrincipals *); | | | |
| | | void (* JS_DLL_CALLBACK destroy)(JSContext *cx, JSPrincipals *); | |
| | | JSBool (* JS_DLL_CALLBACK subsume)(JSPrincipals *, JSPrincipals *); | |
| }; | | }; | |
| | | | |
| #ifdef JS_THREADSAFE | | #ifdef JS_THREADSAFE | |
| #define JSPRINCIPALS_HOLD(cx, principals) JS_HoldPrincipals(cx,principals
) | | #define JSPRINCIPALS_HOLD(cx, principals) JS_HoldPrincipals(cx,principals
) | |
| #define JSPRINCIPALS_DROP(cx, principals) JS_DropPrincipals(cx,principals
) | | #define JSPRINCIPALS_DROP(cx, principals) JS_DropPrincipals(cx,principals
) | |
| | | | |
| extern JS_PUBLIC_API(jsrefcount) | | extern JS_PUBLIC_API(jsrefcount) | |
| JS_HoldPrincipals(JSContext *cx, JSPrincipals *principals); | | JS_HoldPrincipals(JSContext *cx, JSPrincipals *principals); | |
| | | | |
| extern JS_PUBLIC_API(jsrefcount) | | extern JS_PUBLIC_API(jsrefcount) | |
| | | | |
| skipping to change at line 1221 | | skipping to change at line 1527 | |
| #define JSPRINCIPALS_DROP(cx, principals)
\ | | #define JSPRINCIPALS_DROP(cx, principals)
\ | |
| ((--(principals)->refcount == 0)
\ | | ((--(principals)->refcount == 0)
\ | |
| ? ((*(principals)->destroy)((cx), (principals)), 0)
\ | | ? ((*(principals)->destroy)((cx), (principals)), 0)
\ | |
| : (principals)->refcount) | | : (principals)->refcount) | |
| #endif | | #endif | |
| | | | |
| extern JS_PUBLIC_API(JSPrincipalsTranscoder) | | extern JS_PUBLIC_API(JSPrincipalsTranscoder) | |
| JS_SetPrincipalsTranscoder(JSRuntime *rt, JSPrincipalsTranscoder px); | | JS_SetPrincipalsTranscoder(JSRuntime *rt, JSPrincipalsTranscoder px); | |
| | | | |
| extern JS_PUBLIC_API(JSObjectPrincipalsFinder) | | extern JS_PUBLIC_API(JSObjectPrincipalsFinder) | |
|
| JS_SetObjectPrincipalsFinder(JSContext *cx, JSObjectPrincipalsFinder fop); | | JS_SetObjectPrincipalsFinder(JSRuntime *rt, JSObjectPrincipalsFinder fop); | |
| | | | |
| /************************************************************************/ | | /************************************************************************/ | |
| | | | |
| /* | | /* | |
| * Functions and scripts. | | * Functions and scripts. | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSFunction *) | | extern JS_PUBLIC_API(JSFunction *) | |
| JS_NewFunction(JSContext *cx, JSNative call, uintN nargs, uintN flags, | | JS_NewFunction(JSContext *cx, JSNative call, uintN nargs, uintN flags, | |
| JSObject *parent, const char *name); | | JSObject *parent, const char *name); | |
| | | | |
| | | | |
| skipping to change at line 1262 | | skipping to change at line 1568 | |
| extern JS_PUBLIC_API(JSString *) | | extern JS_PUBLIC_API(JSString *) | |
| JS_GetFunctionId(JSFunction *fun); | | JS_GetFunctionId(JSFunction *fun); | |
| | | | |
| /* | | /* | |
| * Return JSFUN_* flags for fun. | | * Return JSFUN_* flags for fun. | |
| */ | | */ | |
| extern JS_PUBLIC_API(uintN) | | extern JS_PUBLIC_API(uintN) | |
| JS_GetFunctionFlags(JSFunction *fun); | | JS_GetFunctionFlags(JSFunction *fun); | |
| | | | |
| /* | | /* | |
|
| | | * Return the arity (length) of fun. | |
| | | */ | |
| | | extern JS_PUBLIC_API(uint16) | |
| | | JS_GetFunctionArity(JSFunction *fun); | |
| | | | |
| | | /* | |
| * Infallible predicate to test whether obj is a function object (faster th
an | | * Infallible predicate to test whether obj is a function object (faster th
an | |
| * comparing obj's class name to "Function", but equivalent unless someone
has | | * comparing obj's class name to "Function", but equivalent unless someone
has | |
| * overwritten the "Function" identifier with a different constructor and t
hen | | * overwritten the "Function" identifier with a different constructor and t
hen | |
| * created instances using that constructor that might be passed in as obj)
. | | * created instances using that constructor that might be passed in as obj)
. | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_ObjectIsFunction(JSContext *cx, JSObject *obj); | | JS_ObjectIsFunction(JSContext *cx, JSObject *obj); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_DefineFunctions(JSContext *cx, JSObject *obj, JSFunctionSpec *fs); | | JS_DefineFunctions(JSContext *cx, JSObject *obj, JSFunctionSpec *fs); | |
| | | | |
| skipping to change at line 1522 | | skipping to change at line 1834 | |
| * Set the second return value, which should be a string or int jsval that | | * Set the second return value, which should be a string or int jsval that | |
| * identifies a property in the returned object, to form an ECMA reference | | * identifies a property in the returned object, to form an ECMA reference | |
| * type value (obj, id). Only native methods can return reference types, | | * type value (obj, id). Only native methods can return reference types, | |
| * and if the returned value is used on the left-hand side of an assignment | | * and if the returned value is used on the left-hand side of an assignment | |
| * op, the identified property will be set. If the return value is in an | | * op, the identified property will be set. If the return value is in an | |
| * r-value, the interpreter just gets obj[id]'s value. | | * r-value, the interpreter just gets obj[id]'s value. | |
| */ | | */ | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_SetCallReturnValue2(JSContext *cx, jsval v); | | JS_SetCallReturnValue2(JSContext *cx, jsval v); | |
| | | | |
|
| | | /* | |
| | | * Saving and restoring frame chains. | |
| | | * | |
| | | * These two functions are used to set aside cx->fp while that frame is | |
| | | * inactive. After a call to JS_SaveFrameChain, it looks as if there is no | |
| | | * code running on cx. Before calling JS_RestoreFrameChain, cx's call stack | |
| | | * must be balanced and all nested calls to JS_SaveFrameChain must have had | |
| | | * matching JS_RestoreFrameChain calls. | |
| | | * | |
| | | * JS_SaveFrameChain deals with cx not having any code running on it. A nul | |
| | | l | |
| | | * return does not signify an error and JS_RestoreFrameChain handles null | |
| | | * frames. | |
| | | */ | |
| | | extern JS_PUBLIC_API(JSStackFrame *) | |
| | | JS_SaveFrameChain(JSContext *cx); | |
| | | | |
| | | extern JS_PUBLIC_API(void) | |
| | | JS_RestoreFrameChain(JSContext *cx, JSStackFrame *fp); | |
| | | | |
| /************************************************************************/ | | /************************************************************************/ | |
| | | | |
| /* | | /* | |
| * Strings. | | * Strings. | |
| * | | * | |
| * NB: JS_NewString takes ownership of bytes on success, avoiding a copy; b
ut | | * NB: JS_NewString takes ownership of bytes on success, avoiding a copy; b
ut | |
| * on error (signified by null return), it leaves bytes owned by the caller
. | | * on error (signified by null return), it leaves bytes owned by the caller
. | |
| * So the caller must free bytes in the error case, if it has no use for th
em. | | * So the caller must free bytes in the error case, if it has no use for th
em. | |
| * In contrast, all the JS_New*StringCopy* functions do not take ownership
of | | * In contrast, all the JS_New*StringCopy* functions do not take ownership
of | |
| * the character memory passed to them -- they copy it. | | * the character memory passed to them -- they copy it. | |
| | | | |
| skipping to change at line 1627 | | skipping to change at line 1958 | |
| extern JS_PUBLIC_API(const jschar *) | | extern JS_PUBLIC_API(const jschar *) | |
| JS_UndependString(JSContext *cx, JSString *str); | | JS_UndependString(JSContext *cx, JSString *str); | |
| | | | |
| /* | | /* | |
| * Convert a mutable string (either growable or dependent) into an immutabl
e, | | * Convert a mutable string (either growable or dependent) into an immutabl
e, | |
| * thread-safe one. | | * thread-safe one. | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_MakeStringImmutable(JSContext *cx, JSString *str); | | JS_MakeStringImmutable(JSContext *cx, JSString *str); | |
| | | | |
|
| | | /* | |
| | | * Return JS_TRUE if C (char []) strings passed via the API and internally | |
| | | * are UTF-8. The source must be compiled with JS_C_STRINGS_ARE_UTF8 define | |
| | | d | |
| | | * to get UTF-8 support. | |
| | | */ | |
| | | JS_PUBLIC_API(JSBool) | |
| | | JS_CStringsAreUTF8(); | |
| | | | |
| | | /* | |
| | | * Character encoding support. | |
| | | * | |
| | | * For both JS_EncodeCharacters and JS_DecodeBytes, set *dstlenp to the siz | |
| | | e | |
| | | * of the destination buffer before the call; on return, *dstlenp contains | |
| | | the | |
| | | * number of bytes (JS_EncodeCharacters) or jschars (JS_DecodeBytes) actual | |
| | | ly | |
| | | * stored. To determine the necessary destination buffer size, make a sizi | |
| | | ng | |
| | | * call that passes NULL for dst. | |
| | | * | |
| | | * On errors, the functions report the error. In that case, *dstlenp contai | |
| | | ns | |
| | | * the number of characters or bytes transferred so far. If cx is NULL, no | |
| | | * error is reported on failure, and the functions simply return JS_FALSE. | |
| | | * | |
| | | * NB: Neither function stores an additional zero byte or jschar after the | |
| | | * transcoded string. | |
| | | * | |
| | | * If the source has been compiled with the #define JS_C_STRINGS_ARE_UTF8 t | |
| | | o | |
| | | * enable UTF-8 interpretation of C char[] strings, then JS_EncodeCharacter | |
| | | s | |
| | | * encodes to UTF-8, and JS_DecodeBytes decodes from UTF-8, which may creat | |
| | | e | |
| | | * addititional errors if the character sequence is malformed. If UTF-8 | |
| | | * support is disabled, the functions deflate and inflate, respectively. | |
| | | */ | |
| | | JS_PUBLIC_API(JSBool) | |
| | | JS_EncodeCharacters(JSContext *cx, const jschar *src, size_t srclen, char * | |
| | | dst, | |
| | | size_t *dstlenp); | |
| | | | |
| | | JS_PUBLIC_API(JSBool) | |
| | | JS_DecodeBytes(JSContext *cx, const char *src, size_t srclen, jschar *dst, | |
| | | size_t *dstlenp); | |
| | | | |
| /************************************************************************/ | | /************************************************************************/ | |
| | | | |
| /* | | /* | |
|
| * Locale specific string conversion callback. | | * Locale specific string conversion and error message callbacks. | |
| */ | | */ | |
| struct JSLocaleCallbacks { | | struct JSLocaleCallbacks { | |
| JSLocaleToUpperCase localeToUpperCase; | | JSLocaleToUpperCase localeToUpperCase; | |
| JSLocaleToLowerCase localeToLowerCase; | | JSLocaleToLowerCase localeToLowerCase; | |
| JSLocaleCompare localeCompare; | | JSLocaleCompare localeCompare; | |
| JSLocaleToUnicode localeToUnicode; | | JSLocaleToUnicode localeToUnicode; | |
|
| | | JSErrorCallback localeGetErrorMessage; | |
| }; | | }; | |
| | | | |
| /* | | /* | |
| * Establish locale callbacks. The pointer must persist as long as the | | * Establish locale callbacks. The pointer must persist as long as the | |
| * JSContext. Passing NULL restores the default behaviour. | | * JSContext. Passing NULL restores the default behaviour. | |
| */ | | */ | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_SetLocaleCallbacks(JSContext *cx, JSLocaleCallbacks *callbacks); | | JS_SetLocaleCallbacks(JSContext *cx, JSLocaleCallbacks *callbacks); | |
| | | | |
| /* | | /* | |
| | | | |
| skipping to change at line 1815 | | skipping to change at line 2185 | |
| /* | | /* | |
| * If the given value is an exception object that originated from an error, | | * If the given value is an exception object that originated from an error, | |
| * the exception will contain an error report struct, and this API will ret
urn | | * the exception will contain an error report struct, and this API will ret
urn | |
| * the address of that struct. Otherwise, it returns NULL. The lifetime o
f | | * the address of that struct. Otherwise, it returns NULL. The lifetime o
f | |
| * the error report struct that might be returned is the same as the lifeti
me | | * the error report struct that might be returned is the same as the lifeti
me | |
| * of the exception object. | | * of the exception object. | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSErrorReport *) | | extern JS_PUBLIC_API(JSErrorReport *) | |
| JS_ErrorFromException(JSContext *cx, jsval v); | | JS_ErrorFromException(JSContext *cx, jsval v); | |
| | | | |
|
| | | /* | |
| | | * Given a reported error's message and JSErrorReport struct pointer, throw | |
| | | * the corresponding exception on cx. | |
| | | */ | |
| | | extern JS_PUBLIC_API(JSBool) | |
| | | JS_ThrowReportedError(JSContext *cx, const char *message, | |
| | | JSErrorReport *reportp); | |
| | | | |
| #ifdef JS_THREADSAFE | | #ifdef JS_THREADSAFE | |
| | | | |
| /* | | /* | |
| * Associate the current thread with the given context. This is done | | * Associate the current thread with the given context. This is done | |
| * implicitly by JS_NewContext. | | * implicitly by JS_NewContext. | |
| * | | * | |
| * Returns the old thread id for this context, which should be treated as | | * Returns the old thread id for this context, which should be treated as | |
| * an opaque value. This value is provided for comparison to 0, which | | * an opaque value. This value is provided for comparison to 0, which | |
| * indicates that ClearContextThread has been called on this context | | * indicates that ClearContextThread has been called on this context | |
| * since the last SetContextThread, or non-0, which indicates the opposite. | | * since the last SetContextThread, or non-0, which indicates the opposite. | |
| | | | |
End of changes. 33 change blocks. |
| 6 lines changed or deleted | | 450 lines changed or added | |
|
| jsatom.h | | jsatom.h | |
| | | | |
| skipping to change at line 61 | | skipping to change at line 61 | |
| | | | |
| #ifdef JS_THREADSAFE | | #ifdef JS_THREADSAFE | |
| #include "jslock.h" | | #include "jslock.h" | |
| #endif | | #endif | |
| | | | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
| #define ATOM_PINNED 0x01 /* atom is pinned against GC */ | | #define ATOM_PINNED 0x01 /* atom is pinned against GC */ | |
| #define ATOM_INTERNED 0x02 /* pinned variant for JS_Intern* AP
I */ | | #define ATOM_INTERNED 0x02 /* pinned variant for JS_Intern* AP
I */ | |
| #define ATOM_MARK 0x04 /* atom is reachable via GC */ | | #define ATOM_MARK 0x04 /* atom is reachable via GC */ | |
|
| | | #define ATOM_HIDDEN 0x08 /* atom is in special hidden subspa
ce */ | |
| #define ATOM_NOCOPY 0x40 /* don't copy atom string bytes */ | | #define ATOM_NOCOPY 0x40 /* don't copy atom string bytes */ | |
| #define ATOM_TMPSTR 0x80 /* internal, to avoid extra string
*/ | | #define ATOM_TMPSTR 0x80 /* internal, to avoid extra string
*/ | |
| | | | |
| struct JSAtom { | | struct JSAtom { | |
|
| JSHashEntry entry; /* key is jsval, value keyword info | | JSHashEntry entry; /* key is jsval or unhidden atom | |
| */ | | if ATOM_HIDDEN */ | |
| uint32 flags; /* pinned, interned, and mark flags
*/ | | uint32 flags; /* pinned, interned, and mark flags
*/ | |
| jsatomid number; /* atom serial number and hash code
*/ | | jsatomid number; /* atom serial number and hash code
*/ | |
| }; | | }; | |
| | | | |
| #define ATOM_KEY(atom) ((jsval)(atom)->entry.key) | | #define ATOM_KEY(atom) ((jsval)(atom)->entry.key) | |
| #define ATOM_IS_OBJECT(atom) JSVAL_IS_OBJECT(ATOM_KEY(atom)) | | #define ATOM_IS_OBJECT(atom) JSVAL_IS_OBJECT(ATOM_KEY(atom)) | |
| #define ATOM_TO_OBJECT(atom) JSVAL_TO_OBJECT(ATOM_KEY(atom)) | | #define ATOM_TO_OBJECT(atom) JSVAL_TO_OBJECT(ATOM_KEY(atom)) | |
| #define ATOM_IS_INT(atom) JSVAL_IS_INT(ATOM_KEY(atom)) | | #define ATOM_IS_INT(atom) JSVAL_IS_INT(ATOM_KEY(atom)) | |
| #define ATOM_TO_INT(atom) JSVAL_TO_INT(ATOM_KEY(atom)) | | #define ATOM_TO_INT(atom) JSVAL_TO_INT(ATOM_KEY(atom)) | |
| #define ATOM_IS_DOUBLE(atom) JSVAL_IS_DOUBLE(ATOM_KEY(atom)) | | #define ATOM_IS_DOUBLE(atom) JSVAL_IS_DOUBLE(ATOM_KEY(atom)) | |
| | | | |
| skipping to change at line 90 | | skipping to change at line 92 | |
| #define ATOM_TO_BOOLEAN(atom) JSVAL_TO_BOOLEAN(ATOM_KEY(atom)) | | #define ATOM_TO_BOOLEAN(atom) JSVAL_TO_BOOLEAN(ATOM_KEY(atom)) | |
| | | | |
| /* | | /* | |
| * Return a printable, lossless char[] representation of a string-type atom
. | | * Return a printable, lossless char[] representation of a string-type atom
. | |
| * The lifetime of the result extends at least until the next GC activation
, | | * The lifetime of the result extends at least until the next GC activation
, | |
| * longer if cx's string newborn root is not overwritten. | | * longer if cx's string newborn root is not overwritten. | |
| */ | | */ | |
| extern JS_FRIEND_API(const char *) | | extern JS_FRIEND_API(const char *) | |
| js_AtomToPrintableString(JSContext *cx, JSAtom *atom); | | js_AtomToPrintableString(JSContext *cx, JSAtom *atom); | |
| | | | |
|
| #define ATOM_KEYWORD(atom) ((struct keyword *)(atom)->entry.value) | | | |
| #define ATOM_SET_KEYWORD(atom,kw) ((atom)->entry.value = (kw)) | | | |
| | | | |
| struct JSAtomListElement { | | struct JSAtomListElement { | |
| JSHashEntry entry; | | JSHashEntry entry; | |
| }; | | }; | |
| | | | |
| #define ALE_ATOM(ale) ((JSAtom *) (ale)->entry.key) | | #define ALE_ATOM(ale) ((JSAtom *) (ale)->entry.key) | |
|
| #define ALE_INDEX(ale) ((jsatomid) (ale)->entry.value) | | #define ALE_INDEX(ale) ((jsatomid) JS_PTR_TO_UINT32((ale)->entry.value)) | |
| #define ALE_JSOP(ale) ((JSOp) (ale)->entry.value) | | #define ALE_JSOP(ale) ((JSOp) (ale)->entry.value) | |
| #define ALE_VALUE(ale) ((jsval) (ale)->entry.value) | | #define ALE_VALUE(ale) ((jsval) (ale)->entry.value) | |
| #define ALE_NEXT(ale) ((JSAtomListElement *) (ale)->entry.next) | | #define ALE_NEXT(ale) ((JSAtomListElement *) (ale)->entry.next) | |
| | | | |
| #define ALE_SET_ATOM(ale,atom) ((ale)->entry.key = (const void *)(atom)) | | #define ALE_SET_ATOM(ale,atom) ((ale)->entry.key = (const void *)(atom)) | |
|
| #define ALE_SET_INDEX(ale,index)((ale)->entry.value = (void *)(index)) | | #define ALE_SET_INDEX(ale,index)((ale)->entry.value = JS_UINT32_TO_PTR(inde | |
| #define ALE_SET_JSOP(ale,op) ((ale)->entry.value = (void *)(op)) | | x)) | |
| | | #define ALE_SET_JSOP(ale,op) ((ale)->entry.value = JS_UINT32_TO_PTR(op)) | |
| #define ALE_SET_VALUE(ale,val) ((ale)->entry.value = (JSHashEntry *)(val)) | | #define ALE_SET_VALUE(ale,val) ((ale)->entry.value = (JSHashEntry *)(val)) | |
| #define ALE_SET_NEXT(ale,link) ((ale)->entry.next = (JSHashEntry *)(link)) | | #define ALE_SET_NEXT(ale,link) ((ale)->entry.next = (JSHashEntry *)(link)) | |
| | | | |
| struct JSAtomList { | | struct JSAtomList { | |
| JSAtomListElement *list; /* literals indexed for mapping */ | | JSAtomListElement *list; /* literals indexed for mapping */ | |
| JSHashTable *table; /* hash table if list gets too long
*/ | | JSHashTable *table; /* hash table if list gets too long
*/ | |
| jsuint count; /* count of indexed literals */ | | jsuint count; /* count of indexed literals */ | |
| }; | | }; | |
| | | | |
| #define ATOM_LIST_INIT(al) ((al)->list = NULL, (al)->table = NULL,
\ | | #define ATOM_LIST_INIT(al) ((al)->list = NULL, (al)->table = NULL,
\ | |
| | | | |
| skipping to change at line 156 | | skipping to change at line 155 | |
| JSAtom **vector; /* array of ptrs to indexed atoms *
/ | | JSAtom **vector; /* array of ptrs to indexed atoms *
/ | |
| jsatomid length; /* count of (to-be-)indexed atoms *
/ | | jsatomid length; /* count of (to-be-)indexed atoms *
/ | |
| }; | | }; | |
| | | | |
| struct JSAtomState { | | struct JSAtomState { | |
| JSRuntime *runtime; /* runtime that owns us */ | | JSRuntime *runtime; /* runtime that owns us */ | |
| JSHashTable *table; /* hash table containing all atoms
*/ | | JSHashTable *table; /* hash table containing all atoms
*/ | |
| jsatomid number; /* one beyond greatest atom number
*/ | | jsatomid number; /* one beyond greatest atom number
*/ | |
| jsatomid liveAtoms; /* number of live atoms after last
GC */ | | jsatomid liveAtoms; /* number of live atoms after last
GC */ | |
| | | | |
|
| | | /* The rt->emptyString atom, see jsstr.c's js_InitRuntimeStringState. * | |
| | | / | |
| | | JSAtom *emptyAtom; | |
| | | | |
| /* Type names and value literals. */ | | /* Type names and value literals. */ | |
| JSAtom *typeAtoms[JSTYPE_LIMIT]; | | JSAtom *typeAtoms[JSTYPE_LIMIT]; | |
| JSAtom *booleanAtoms[2]; | | JSAtom *booleanAtoms[2]; | |
| JSAtom *nullAtom; | | JSAtom *nullAtom; | |
| | | | |
|
| | | /* Standard class constructor or prototype names. */ | |
| | | JSAtom *classAtoms[JSProto_LIMIT]; | |
| | | | |
| /* Various built-in or commonly-used atoms, pinned on first context. */ | | /* Various built-in or commonly-used atoms, pinned on first context. */ | |
|
| JSAtom *ArgumentsAtom; | | | |
| JSAtom *ArrayAtom; | | | |
| JSAtom *BooleanAtom; | | | |
| JSAtom *CallAtom; | | | |
| JSAtom *DateAtom; | | | |
| JSAtom *ErrorAtom; | | | |
| JSAtom *FunctionAtom; | | | |
| JSAtom *MathAtom; | | | |
| JSAtom *NumberAtom; | | | |
| JSAtom *ObjectAtom; | | | |
| JSAtom *RegExpAtom; | | | |
| JSAtom *ScriptAtom; | | | |
| JSAtom *StringAtom; | | | |
| JSAtom *anonymousAtom; | | JSAtom *anonymousAtom; | |
| JSAtom *argumentsAtom; | | JSAtom *argumentsAtom; | |
| JSAtom *arityAtom; | | JSAtom *arityAtom; | |
| JSAtom *calleeAtom; | | JSAtom *calleeAtom; | |
| JSAtom *callerAtom; | | JSAtom *callerAtom; | |
| JSAtom *classPrototypeAtom; | | JSAtom *classPrototypeAtom; | |
|
| | | JSAtom *closeAtom; | |
| JSAtom *constructorAtom; | | JSAtom *constructorAtom; | |
| JSAtom *countAtom; | | JSAtom *countAtom; | |
|
| | | JSAtom *eachAtom; | |
| | | JSAtom *etagoAtom; | |
| JSAtom *evalAtom; | | JSAtom *evalAtom; | |
|
| | | JSAtom *fileNameAtom; | |
| JSAtom *getAtom; | | JSAtom *getAtom; | |
| JSAtom *getterAtom; | | JSAtom *getterAtom; | |
| JSAtom *indexAtom; | | JSAtom *indexAtom; | |
| JSAtom *inputAtom; | | JSAtom *inputAtom; | |
|
| | | JSAtom *iteratorAtom; | |
| JSAtom *lengthAtom; | | JSAtom *lengthAtom; | |
|
| | | JSAtom *lineNumberAtom; | |
| | | JSAtom *messageAtom; | |
| JSAtom *nameAtom; | | JSAtom *nameAtom; | |
|
| | | JSAtom *namespaceAtom; | |
| | | JSAtom *nextAtom; | |
| JSAtom *noSuchMethodAtom; | | JSAtom *noSuchMethodAtom; | |
| JSAtom *parentAtom; | | JSAtom *parentAtom; | |
| JSAtom *protoAtom; | | JSAtom *protoAtom; | |
|
| | | JSAtom *ptagcAtom; | |
| | | JSAtom *qualifierAtom; | |
| JSAtom *setAtom; | | JSAtom *setAtom; | |
| JSAtom *setterAtom; | | JSAtom *setterAtom; | |
|
| | | JSAtom *spaceAtom; | |
| | | JSAtom *stackAtom; | |
| | | JSAtom *stagoAtom; | |
| | | JSAtom *starAtom; | |
| | | JSAtom *starQualifierAtom; | |
| | | JSAtom *tagcAtom; | |
| JSAtom *toLocaleStringAtom; | | JSAtom *toLocaleStringAtom; | |
| JSAtom *toSourceAtom; | | JSAtom *toSourceAtom; | |
| JSAtom *toStringAtom; | | JSAtom *toStringAtom; | |
| JSAtom *valueOfAtom; | | JSAtom *valueOfAtom; | |
|
| | | JSAtom *xmlAtom; | |
| | | | |
| /* Less frequently used atoms, pinned lazily by JS_ResolveStandardClass
. */ | | /* Less frequently used atoms, pinned lazily by JS_ResolveStandardClass
. */ | |
| struct { | | struct { | |
|
| JSAtom *EvalErrorAtom; | | | |
| JSAtom *InfinityAtom; | | JSAtom *InfinityAtom; | |
|
| JSAtom *InternalErrorAtom; | | | |
| JSAtom *NaNAtom; | | JSAtom *NaNAtom; | |
|
| JSAtom *RangeErrorAtom; | | JSAtom *XMLListAtom; | |
| JSAtom *ReferenceErrorAtom; | | | |
| JSAtom *SyntaxErrorAtom; | | | |
| JSAtom *TypeErrorAtom; | | | |
| JSAtom *URIErrorAtom; | | | |
| JSAtom *decodeURIAtom; | | JSAtom *decodeURIAtom; | |
| JSAtom *decodeURIComponentAtom; | | JSAtom *decodeURIComponentAtom; | |
| JSAtom *defineGetterAtom; | | JSAtom *defineGetterAtom; | |
| JSAtom *defineSetterAtom; | | JSAtom *defineSetterAtom; | |
| JSAtom *encodeURIAtom; | | JSAtom *encodeURIAtom; | |
| JSAtom *encodeURIComponentAtom; | | JSAtom *encodeURIComponentAtom; | |
| JSAtom *escapeAtom; | | JSAtom *escapeAtom; | |
|
| | | JSAtom *functionNamespaceURIAtom; | |
| JSAtom *hasOwnPropertyAtom; | | JSAtom *hasOwnPropertyAtom; | |
| JSAtom *isFiniteAtom; | | JSAtom *isFiniteAtom; | |
| JSAtom *isNaNAtom; | | JSAtom *isNaNAtom; | |
| JSAtom *isPrototypeOfAtom; | | JSAtom *isPrototypeOfAtom; | |
|
| | | JSAtom *isXMLNameAtom; | |
| JSAtom *lookupGetterAtom; | | JSAtom *lookupGetterAtom; | |
| JSAtom *lookupSetterAtom; | | JSAtom *lookupSetterAtom; | |
| JSAtom *parseFloatAtom; | | JSAtom *parseFloatAtom; | |
| JSAtom *parseIntAtom; | | JSAtom *parseIntAtom; | |
| JSAtom *propertyIsEnumerableAtom; | | JSAtom *propertyIsEnumerableAtom; | |
| JSAtom *unescapeAtom; | | JSAtom *unescapeAtom; | |
| JSAtom *unevalAtom; | | JSAtom *unevalAtom; | |
| JSAtom *unwatchAtom; | | JSAtom *unwatchAtom; | |
| JSAtom *watchAtom; | | JSAtom *watchAtom; | |
| } lazy; | | } lazy; | |
| | | | |
| skipping to change at line 246 | | skipping to change at line 252 | |
| #endif | | #endif | |
| #ifdef NARCISSUS | | #ifdef NARCISSUS | |
| JSAtom *callAtom; | | JSAtom *callAtom; | |
| JSAtom *constructAtom; | | JSAtom *constructAtom; | |
| JSAtom *hasInstanceAtom; | | JSAtom *hasInstanceAtom; | |
| JSAtom *ExecutionContextAtom; | | JSAtom *ExecutionContextAtom; | |
| JSAtom *currentAtom; | | JSAtom *currentAtom; | |
| #endif | | #endif | |
| }; | | }; | |
| | | | |
|
| | | #define CLASS_ATOM(cx,name) \ | |
| | | ((cx)->runtime->atomState.classAtoms[JSProto_##name]) | |
| | | | |
| /* Well-known predefined strings and their atoms. */ | | /* Well-known predefined strings and their atoms. */ | |
|
| extern const char *js_type_str[]; | | extern const char *js_type_strs[]; | |
| extern const char *js_boolean_str[]; | | extern const char *js_boolean_strs[]; | |
| | | extern const char *js_proto_strs[]; | |
| | | | |
| | | #define JS_PROTO(name,code,init) extern const char js_##name##_str[]; | |
| | | #include "jsproto.tbl" | |
| | | #undef JS_PROTO | |
| | | | |
|
| extern const char js_Arguments_str[]; | | | |
| extern const char js_Array_str[]; | | | |
| extern const char js_Boolean_str[]; | | | |
| extern const char js_Call_str[]; | | | |
| extern const char js_Date_str[]; | | | |
| extern const char js_Function_str[]; | | | |
| extern const char js_Math_str[]; | | | |
| extern const char js_Number_str[]; | | | |
| extern const char js_Object_str[]; | | | |
| extern const char js_RegExp_str[]; | | | |
| extern const char js_Script_str[]; | | | |
| extern const char js_String_str[]; | | | |
| extern const char js_anonymous_str[]; | | extern const char js_anonymous_str[]; | |
| extern const char js_arguments_str[]; | | extern const char js_arguments_str[]; | |
| extern const char js_arity_str[]; | | extern const char js_arity_str[]; | |
| extern const char js_callee_str[]; | | extern const char js_callee_str[]; | |
| extern const char js_caller_str[]; | | extern const char js_caller_str[]; | |
| extern const char js_class_prototype_str[]; | | extern const char js_class_prototype_str[]; | |
|
| | | extern const char js_close_str[]; | |
| extern const char js_constructor_str[]; | | extern const char js_constructor_str[]; | |
| extern const char js_count_str[]; | | extern const char js_count_str[]; | |
|
| | | extern const char js_etago_str[]; | |
| | | extern const char js_each_str[]; | |
| extern const char js_eval_str[]; | | extern const char js_eval_str[]; | |
|
| extern const char js_getter_str[]; | | extern const char js_fileName_str[]; | |
| extern const char js_get_str[]; | | extern const char js_get_str[]; | |
|
| | | extern const char js_getter_str[]; | |
| extern const char js_index_str[]; | | extern const char js_index_str[]; | |
| extern const char js_input_str[]; | | extern const char js_input_str[]; | |
|
| | | extern const char js_iterator_str[]; | |
| extern const char js_length_str[]; | | extern const char js_length_str[]; | |
|
| | | extern const char js_lineNumber_str[]; | |
| | | extern const char js_message_str[]; | |
| extern const char js_name_str[]; | | extern const char js_name_str[]; | |
|
| | | extern const char js_namespace_str[]; | |
| | | extern const char js_next_str[]; | |
| extern const char js_noSuchMethod_str[]; | | extern const char js_noSuchMethod_str[]; | |
|
| | | extern const char js_object_str[]; | |
| extern const char js_parent_str[]; | | extern const char js_parent_str[]; | |
|
| | | extern const char js_private_str[]; | |
| extern const char js_proto_str[]; | | extern const char js_proto_str[]; | |
|
| | | extern const char js_ptagc_str[]; | |
| | | extern const char js_qualifier_str[]; | |
| | | extern const char js_send_str[]; | |
| extern const char js_setter_str[]; | | extern const char js_setter_str[]; | |
| extern const char js_set_str[]; | | extern const char js_set_str[]; | |
|
| | | extern const char js_space_str[]; | |
| | | extern const char js_stack_str[]; | |
| | | extern const char js_stago_str[]; | |
| | | extern const char js_star_str[]; | |
| | | extern const char js_starQualifier_str[]; | |
| | | extern const char js_tagc_str[]; | |
| extern const char js_toSource_str[]; | | extern const char js_toSource_str[]; | |
| extern const char js_toString_str[]; | | extern const char js_toString_str[]; | |
| extern const char js_toLocaleString_str[]; | | extern const char js_toLocaleString_str[]; | |
| extern const char js_valueOf_str[]; | | extern const char js_valueOf_str[]; | |
|
| | | extern const char js_xml_str[]; | |
| | | | |
| #ifdef NARCISSUS | | #ifdef NARCISSUS | |
| extern const char js_call_str[]; | | extern const char js_call_str[]; | |
| extern const char js_construct_str[]; | | extern const char js_construct_str[]; | |
| extern const char js_hasInstance_str[]; | | extern const char js_hasInstance_str[]; | |
| extern const char js_ExecutionContext_str[]; | | extern const char js_ExecutionContext_str[]; | |
| extern const char js_current_str[]; | | extern const char js_current_str[]; | |
| #endif | | #endif | |
| | | | |
| /* | | /* | |
| | | | |
| skipping to change at line 331 | | skipping to change at line 354 | |
| extern void | | extern void | |
| js_FinishAtomState(JSAtomState *state); | | js_FinishAtomState(JSAtomState *state); | |
| | | | |
| /* | | /* | |
| * Atom garbage collection hooks. | | * Atom garbage collection hooks. | |
| */ | | */ | |
| typedef void | | typedef void | |
| (*JSGCThingMarker)(void *thing, void *data); | | (*JSGCThingMarker)(void *thing, void *data); | |
| | | | |
| extern void | | extern void | |
|
| js_MarkAtomState(JSAtomState *state, uintN gcflags, JSGCThingMarker mark, | | js_MarkAtomState(JSAtomState *state, JSBool keepAtoms, JSGCThingMarker mark
, | |
| void *data); | | void *data); | |
| | | | |
| extern void | | extern void | |
| js_SweepAtomState(JSAtomState *state); | | js_SweepAtomState(JSAtomState *state); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_InitPinnedAtoms(JSContext *cx, JSAtomState *state); | | js_InitPinnedAtoms(JSContext *cx, JSAtomState *state); | |
| | | | |
| extern void | | extern void | |
| js_UnpinPinnedAtoms(JSAtomState *state); | | js_UnpinPinnedAtoms(JSAtomState *state); | |
| | | | |
| skipping to change at line 385 | | skipping to change at line 408 | |
| extern JSAtom * | | extern JSAtom * | |
| js_AtomizeString(JSContext *cx, JSString *str, uintN flags); | | js_AtomizeString(JSContext *cx, JSString *str, uintN flags); | |
| | | | |
| extern JS_FRIEND_API(JSAtom *) | | extern JS_FRIEND_API(JSAtom *) | |
| js_Atomize(JSContext *cx, const char *bytes, size_t length, uintN flags); | | js_Atomize(JSContext *cx, const char *bytes, size_t length, uintN flags); | |
| | | | |
| extern JS_FRIEND_API(JSAtom *) | | extern JS_FRIEND_API(JSAtom *) | |
| js_AtomizeChars(JSContext *cx, const jschar *chars, size_t length, uintN fl
ags); | | js_AtomizeChars(JSContext *cx, const jschar *chars, size_t length, uintN fl
ags); | |
| | | | |
| /* | | /* | |
|
| | | * Return an existing atom for the given char array or null if the char | |
| | | * sequence is currently not atomized. | |
| | | */ | |
| | | extern JSAtom * | |
| | | js_GetExistingStringAtom(JSContext *cx, const jschar *chars, size_t length) | |
| | | ; | |
| | | | |
| | | /* | |
| * This variant handles all value tag types. | | * This variant handles all value tag types. | |
| */ | | */ | |
| extern JSAtom * | | extern JSAtom * | |
| js_AtomizeValue(JSContext *cx, jsval value, uintN flags); | | js_AtomizeValue(JSContext *cx, jsval value, uintN flags); | |
| | | | |
| /* | | /* | |
| * Convert v to an atomized string. | | * Convert v to an atomized string. | |
| */ | | */ | |
| extern JSAtom * | | extern JSAtom * | |
| js_ValueToStringAtom(JSContext *cx, jsval v); | | js_ValueToStringAtom(JSContext *cx, jsval v); | |
| | | | |
End of changes. 39 change blocks. |
| 44 lines changed or deleted | | 76 lines changed or added | |
|
| jscntxt.h | | jscntxt.h | |
| /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- | | /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- | |
|
| | | * vim: set ts=8 sw=4 et tw=78: | |
| * | | * | |
| * ***** BEGIN LICENSE BLOCK ***** | | * ***** BEGIN LICENSE BLOCK ***** | |
| * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | |
| * | | * | |
| * The contents of this file are subject to the Mozilla Public License Vers
ion | | * The contents of this file are subject to the Mozilla Public License Vers
ion | |
| * 1.1 (the "License"); you may not use this file except in compliance with | | * 1.1 (the "License"); you may not use this file except in compliance with | |
| * the License. You may obtain a copy of the License at | | * the License. You may obtain a copy of the License at | |
| * http://www.mozilla.org/MPL/ | | * http://www.mozilla.org/MPL/ | |
| * | | * | |
| * Software distributed under the License is distributed on an "AS IS" basi
s, | | * Software distributed under the License is distributed on an "AS IS" basi
s, | |
| | | | |
| skipping to change at line 57 | | skipping to change at line 58 | |
| #include "jslong.h" | | #include "jslong.h" | |
| #include "jsatom.h" | | #include "jsatom.h" | |
| #include "jsconfig.h" | | #include "jsconfig.h" | |
| #include "jsdhash.h" | | #include "jsdhash.h" | |
| #include "jsgc.h" | | #include "jsgc.h" | |
| #include "jsinterp.h" | | #include "jsinterp.h" | |
| #include "jsobj.h" | | #include "jsobj.h" | |
| #include "jsprvtd.h" | | #include "jsprvtd.h" | |
| #include "jspubtd.h" | | #include "jspubtd.h" | |
| #include "jsregexp.h" | | #include "jsregexp.h" | |
|
| | | #include "jsutil.h" | |
| | | | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
|
| typedef enum JSGCMode { JS_NO_GC, JS_MAYBE_GC, JS_FORCE_GC } JSGCMode; | | /* | |
| | | * js_GetSrcNote cache to avoid O(n^2) growth in finding a source note for | |
| | | a | |
| | | * given pc in a script. | |
| | | */ | |
| | | typedef struct JSGSNCache { | |
| | | JSScript *script; | |
| | | JSDHashTable table; | |
| | | #ifdef JS_GSNMETER | |
| | | uint32 hits; | |
| | | uint32 misses; | |
| | | uint32 fills; | |
| | | uint32 clears; | |
| | | # define GSN_CACHE_METER(cache,cnt) (++(cache)->cnt) | |
| | | #else | |
| | | # define GSN_CACHE_METER(cache,cnt) /* nothing */ | |
| | | #endif | |
| | | } JSGSNCache; | |
| | | | |
| | | #define GSN_CACHE_CLEAR(cache) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | (cache)->script = NULL; | |
| | | \ | |
| | | if ((cache)->table.ops) { | |
| | | \ | |
| | | JS_DHashTableFinish(&(cache)->table); | |
| | | \ | |
| | | (cache)->table.ops = NULL; | |
| | | \ | |
| | | } | |
| | | \ | |
| | | GSN_CACHE_METER(cache, clears); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | /* These helper macros take a cx as parameter and operate on its GSN cache. | |
| | | */ | |
| | | #define JS_CLEAR_GSN_CACHE(cx) GSN_CACHE_CLEAR(&JS_GSN_CACHE(cx)) | |
| | | #define JS_METER_GSN_CACHE(cx,cnt) GSN_CACHE_METER(&JS_GSN_CACHE(cx), cnt) | |
| | | | |
| | | #ifdef JS_THREADSAFE | |
| | | | |
| | | /* | |
| | | * Structure uniquely representing a thread. It holds thread-private data | |
| | | * that can be accessed without a global lock. | |
| | | */ | |
| | | struct JSThread { | |
| | | /* Linked list of all contexts active on this thread. */ | |
| | | JSCList contextList; | |
| | | | |
| | | /* Opaque thread-id, from NSPR's PR_GetCurrentThread(). */ | |
| | | jsword id; | |
| | | | |
| | | /* Thread-local gc free lists array. */ | |
| | | JSGCThing *gcFreeLists[GC_NUM_FREELISTS]; | |
| | | | |
| | | /* | |
| | | * Thread-local version of JSRuntime.gcMallocBytes to avoid taking | |
| | | * locks on each JS_malloc. | |
| | | */ | |
| | | uint32 gcMallocBytes; | |
| | | | |
| | | #if JS_HAS_GENERATORS | |
| | | /* Flag indicating that the current thread is executing close hooks. */ | |
| | | JSBool gcRunningCloseHooks; | |
| | | #endif | |
| | | | |
| | | /* | |
| | | * Store the GSN cache in struct JSThread, not struct JSContext, both t | |
| | | o | |
| | | * save space and to simplify cleanup in js_GC. Any embedding (Firefox | |
| | | * or another Gecko application) that uses many contexts per thread is | |
| | | * unlikely to interleave js_GetSrcNote-intensive loops in the decompil | |
| | | er | |
| | | * among two or more contexts running script in one thread. | |
| | | */ | |
| | | JSGSNCache gsnCache; | |
| | | }; | |
| | | | |
| | | #define JS_GSN_CACHE(cx) ((cx)->thread->gsnCache) | |
| | | | |
| | | extern void JS_DLL_CALLBACK | |
| | | js_ThreadDestructorCB(void *ptr); | |
| | | | |
| | | extern JSBool | |
| | | js_SetContextThread(JSContext *cx); | |
| | | | |
| | | extern void | |
| | | js_ClearContextThread(JSContext *cx); | |
| | | | |
| | | extern JSThread * | |
| | | js_GetCurrentThread(JSRuntime *rt); | |
| | | | |
| | | #endif /* JS_THREADSAFE */ | |
| | | | |
| | | typedef enum JSDestroyContextMode { | |
| | | JSDCM_NO_GC, | |
| | | JSDCM_MAYBE_GC, | |
| | | JSDCM_FORCE_GC, | |
| | | JSDCM_NEW_FAILED | |
| | | } JSDestroyContextMode; | |
| | | | |
| typedef enum JSRuntimeState { | | typedef enum JSRuntimeState { | |
| JSRTS_DOWN, | | JSRTS_DOWN, | |
| JSRTS_LAUNCHING, | | JSRTS_LAUNCHING, | |
| JSRTS_UP, | | JSRTS_UP, | |
| JSRTS_LANDING | | JSRTS_LANDING | |
| } JSRuntimeState; | | } JSRuntimeState; | |
| | | | |
| typedef struct JSPropertyTreeEntry { | | typedef struct JSPropertyTreeEntry { | |
| JSDHashEntryHdr hdr; | | JSDHashEntryHdr hdr; | |
| JSScopeProperty *child; | | JSScopeProperty *child; | |
| } JSPropertyTreeEntry; | | } JSPropertyTreeEntry; | |
| | | | |
|
| | | /* | |
| | | * Forward declaration for opaque JSRuntime.nativeIteratorStates. | |
| | | */ | |
| | | typedef struct JSNativeIteratorState JSNativeIteratorState; | |
| | | | |
| struct JSRuntime { | | struct JSRuntime { | |
| /* Runtime state, synchronized by the stateChange/gcLock condvar/lock.
*/ | | /* Runtime state, synchronized by the stateChange/gcLock condvar/lock.
*/ | |
| JSRuntimeState state; | | JSRuntimeState state; | |
| | | | |
|
| | | /* Context create/destroy callback. */ | |
| | | JSContextCallback cxCallback; | |
| | | | |
| /* Garbage collector state, used by jsgc.c. */ | | /* Garbage collector state, used by jsgc.c. */ | |
|
| JSArenaPool gcArenaPool; | | JSGCArenaList gcArenaList[GC_NUM_FREELISTS]; | |
| JSDHashTable gcRootsHash; | | JSDHashTable gcRootsHash; | |
| JSDHashTable *gcLocksHash; | | JSDHashTable *gcLocksHash; | |
|
| JSGCThing *gcFreeList; | | | |
| jsrefcount gcKeepAtoms; | | jsrefcount gcKeepAtoms; | |
| uint32 gcBytes; | | uint32 gcBytes; | |
| uint32 gcLastBytes; | | uint32 gcLastBytes; | |
| uint32 gcMaxBytes; | | uint32 gcMaxBytes; | |
|
| | | uint32 gcMaxMallocBytes; | |
| uint32 gcLevel; | | uint32 gcLevel; | |
| uint32 gcNumber; | | uint32 gcNumber; | |
|
| | | | |
| | | /* | |
| | | * NB: do not pack another flag here by claiming gcPadding unless the n | |
| | | ew | |
| | | * flag is written only by the GC thread. Atomic updates to packed byt | |
| | | es | |
| | | * are not guaranteed, so stores issued by one thread may be lost due t | |
| | | o | |
| | | * unsynchronized read-modify-write cycles on other threads. | |
| | | */ | |
| JSPackedBool gcPoke; | | JSPackedBool gcPoke; | |
| JSPackedBool gcRunning; | | JSPackedBool gcRunning; | |
|
| | | uint16 gcPadding; | |
| | | | |
| JSGCCallback gcCallback; | | JSGCCallback gcCallback; | |
| uint32 gcMallocBytes; | | uint32 gcMallocBytes; | |
|
| | | JSGCArena *gcUnscannedArenaStackTop; | |
| | | #ifdef DEBUG | |
| | | size_t gcUnscannedBagSize; | |
| | | #endif | |
| | | | |
| | | /* | |
| | | * API compatibility requires keeping GCX_PRIVATE bytes separate from t | |
| | | he | |
| | | * original GC types' byte tally. Otherwise embeddings that configure | |
| | | a | |
| | | * good limit for pre-GCX_PRIVATE versions of the engine will see memor | |
| | | y | |
| | | * over-pressure too often, possibly leading to failed last-ditch GCs. | |
| | | * | |
| | | * The new XML GC-thing types do add to gcBytes, and they're larger tha | |
| | | n | |
| | | * the original GC-thing type size (8 bytes on most architectures). So | |
| | | a | |
| | | * user who enables E4X may want to increase the maxbytes value passed | |
| | | to | |
| | | * JS_NewRuntime. TODO: Note this in the API docs. | |
| | | */ | |
| | | uint32 gcPrivateBytes; | |
| | | | |
| | | /* | |
| | | * Table for tracking iterators to ensure that we close iterator's stat | |
| | | e | |
| | | * before finalizing the iterable object. | |
| | | */ | |
| | | JSPtrTable gcIteratorTable; | |
| | | | |
| | | #if JS_HAS_GENERATORS | |
| | | /* Runtime state to support close hooks. */ | |
| | | JSGCCloseState gcCloseState; | |
| | | #endif | |
| | | | |
| #ifdef JS_GCMETER | | #ifdef JS_GCMETER | |
| JSGCStats gcStats; | | JSGCStats gcStats; | |
| #endif | | #endif | |
| | | | |
| /* Literal table maintained by jsatom.c functions. */ | | /* Literal table maintained by jsatom.c functions. */ | |
| JSAtomState atomState; | | JSAtomState atomState; | |
| | | | |
| /* Random number generator state, used by jsmath.c. */ | | /* Random number generator state, used by jsmath.c. */ | |
| JSBool rngInitialized; | | JSBool rngInitialized; | |
| int64 rngMultiplier; | | int64 rngMultiplier; | |
| int64 rngAddend; | | int64 rngAddend; | |
| int64 rngMask; | | int64 rngMask; | |
| int64 rngSeed; | | int64 rngSeed; | |
| jsdouble rngDscale; | | jsdouble rngDscale; | |
| | | | |
| /* Well-known numbers held for use by this runtime's contexts. */ | | /* Well-known numbers held for use by this runtime's contexts. */ | |
| jsdouble *jsNaN; | | jsdouble *jsNaN; | |
| jsdouble *jsNegativeInfinity; | | jsdouble *jsNegativeInfinity; | |
| jsdouble *jsPositiveInfinity; | | jsdouble *jsPositiveInfinity; | |
| | | | |
|
| | | #ifdef JS_THREADSAFE | |
| | | JSLock *deflatedStringCacheLock; | |
| | | #endif | |
| | | JSHashTable *deflatedStringCache; | |
| | | #ifdef DEBUG | |
| | | uint32 deflatedStringCacheBytes; | |
| | | #endif | |
| | | | |
| /* Empty string held for use by this runtime's contexts. */ | | /* Empty string held for use by this runtime's contexts. */ | |
| JSString *emptyString; | | JSString *emptyString; | |
| | | | |
| /* List of active contexts sharing this runtime; protected by gcLock. *
/ | | /* List of active contexts sharing this runtime; protected by gcLock. *
/ | |
| JSCList contextList; | | JSCList contextList; | |
| | | | |
| /* These are used for debugging -- see jsprvtd.h and jsdbgapi.h. */ | | /* These are used for debugging -- see jsprvtd.h and jsdbgapi.h. */ | |
| JSTrapHandler interruptHandler; | | JSTrapHandler interruptHandler; | |
| void *interruptHandlerData; | | void *interruptHandlerData; | |
| JSNewScriptHook newScriptHook; | | JSNewScriptHook newScriptHook; | |
| | | | |
| skipping to change at line 158 | | skipping to change at line 304 | |
| | | | |
| /* Client opaque pointer */ | | /* Client opaque pointer */ | |
| void *data; | | void *data; | |
| | | | |
| #ifdef JS_THREADSAFE | | #ifdef JS_THREADSAFE | |
| /* These combine to interlock the GC and new requests. */ | | /* These combine to interlock the GC and new requests. */ | |
| PRLock *gcLock; | | PRLock *gcLock; | |
| PRCondVar *gcDone; | | PRCondVar *gcDone; | |
| PRCondVar *requestDone; | | PRCondVar *requestDone; | |
| uint32 requestCount; | | uint32 requestCount; | |
|
| jsword gcThread; | | JSThread *gcThread; | |
| | | | |
| /* Lock and owning thread pointer for JS_LOCK_RUNTIME. */ | | /* Lock and owning thread pointer for JS_LOCK_RUNTIME. */ | |
| PRLock *rtLock; | | PRLock *rtLock; | |
| #ifdef DEBUG | | #ifdef DEBUG | |
| jsword rtLockOwner; | | jsword rtLockOwner; | |
| #endif | | #endif | |
| | | | |
| /* Used to synchronize down/up state change; protected by gcLock. */ | | /* Used to synchronize down/up state change; protected by gcLock. */ | |
| PRCondVar *stateChange; | | PRCondVar *stateChange; | |
| | | | |
| | | | |
| skipping to change at line 196 | | skipping to change at line 342 | |
| JSScope *scopeSharingTodo; | | JSScope *scopeSharingTodo; | |
| | | | |
| /* | | /* | |
| * Magic terminator for the rt->scopeSharingTodo linked list, threaded thro
ugh | | * Magic terminator for the rt->scopeSharingTodo linked list, threaded thro
ugh | |
| * scope->u.link. This hack allows us to test whether a scope is on the li
st | | * scope->u.link. This hack allows us to test whether a scope is on the li
st | |
| * by asking whether scope->u.link is non-null. We use a large, likely bog
us | | * by asking whether scope->u.link is non-null. We use a large, likely bog
us | |
| * pointer here to distinguish this value from any valid u.count (small int
) | | * pointer here to distinguish this value from any valid u.count (small int
) | |
| * value. | | * value. | |
| */ | | */ | |
| #define NO_SCOPE_SHARING_TODO ((JSScope *) 0xfeedbeef) | | #define NO_SCOPE_SHARING_TODO ((JSScope *) 0xfeedbeef) | |
|
| | | | |
| | | /* | |
| | | * The index for JSThread info, returned by PR_NewThreadPrivateIndex. | |
| | | * The value is visible and shared by all threads, but the data is | |
| | | * private to each thread. | |
| | | */ | |
| | | PRUintn threadTPIndex; | |
| #endif /* JS_THREADSAFE */ | | #endif /* JS_THREADSAFE */ | |
| | | | |
| /* | | /* | |
| * Check property accessibility for objects of arbitrary class. Used a
t | | * Check property accessibility for objects of arbitrary class. Used a
t | |
| * present to check f.caller accessibility for any function object f. | | * present to check f.caller accessibility for any function object f. | |
| */ | | */ | |
| JSCheckAccessOp checkObjectAccess; | | JSCheckAccessOp checkObjectAccess; | |
| | | | |
| /* Security principals serialization support. */ | | /* Security principals serialization support. */ | |
| JSPrincipalsTranscoder principalsTranscoder; | | JSPrincipalsTranscoder principalsTranscoder; | |
| | | | |
|
| /* Shared scope property tree, and allocator for its nodes. */ | | /* Optional hook to find principals for an object in this runtime. */ | |
| | | JSObjectPrincipalsFinder findObjectPrincipals; | |
| | | | |
| | | /* | |
| | | * Shared scope property tree, and arena-pool for allocating its nodes. | |
| | | * The propertyRemovals counter is incremented for every js_ClearScope, | |
| | | * and for each js_RemoveScopeProperty that frees a slot in an object. | |
| | | * See js_NativeGet and js_NativeSet in jsobj.c. | |
| | | */ | |
| JSDHashTable propertyTreeHash; | | JSDHashTable propertyTreeHash; | |
| JSScopeProperty *propertyFreeList; | | JSScopeProperty *propertyFreeList; | |
| JSArenaPool propertyArenaPool; | | JSArenaPool propertyArenaPool; | |
|
| | | int32 propertyRemovals; | |
| | | | |
| /* Script filename table. */ | | /* Script filename table. */ | |
| struct JSHashTable *scriptFilenameTable; | | struct JSHashTable *scriptFilenameTable; | |
|
| | | JSCList scriptFilenamePrefixes; | |
| #ifdef JS_THREADSAFE | | #ifdef JS_THREADSAFE | |
| PRLock *scriptFilenameTableLock; | | PRLock *scriptFilenameTableLock; | |
| #endif | | #endif | |
| | | | |
| /* Number localization, used by jsnum.c */ | | /* Number localization, used by jsnum.c */ | |
| const char *thousandsSeparator; | | const char *thousandsSeparator; | |
| const char *decimalSeparator; | | const char *decimalSeparator; | |
| const char *numGrouping; | | const char *numGrouping; | |
| | | | |
|
| | | /* | |
| | | * Weak references to lazily-created, well-known XML singletons. | |
| | | * | |
| | | * NB: Singleton objects must be carefully disconnected from the rest o | |
| | | f | |
| | | * the object graph usually associated with a JSContext's global object | |
| | | , | |
| | | * including the set of standard class objects. See jsxml.c for detail | |
| | | s. | |
| | | */ | |
| | | JSObject *anynameObject; | |
| | | JSObject *functionNamespaceObject; | |
| | | | |
| | | /* | |
| | | * A helper list for the GC, so it can mark native iterator states. See | |
| | | * js_MarkNativeIteratorStates for details. | |
| | | */ | |
| | | JSNativeIteratorState *nativeIteratorStates; | |
| | | | |
| | | #ifndef JS_THREADSAFE | |
| | | /* | |
| | | * For thread-unsafe embeddings, the GSN cache lives in the runtime and | |
| | | * not each context, since we expect it to be filled once when decompil | |
| | | ing | |
| | | * a longer script, then hit repeatedly as js_GetSrcNote is called duri | |
| | | ng | |
| | | * the decompiler activation that filled it. | |
| | | */ | |
| | | JSGSNCache gsnCache; | |
| | | | |
| | | #define JS_GSN_CACHE(cx) ((cx)->runtime->gsnCache) | |
| | | #endif | |
| | | | |
| #ifdef DEBUG | | #ifdef DEBUG | |
| /* Function invocation metering. */ | | /* Function invocation metering. */ | |
| jsrefcount inlineCalls; | | jsrefcount inlineCalls; | |
| jsrefcount nativeCalls; | | jsrefcount nativeCalls; | |
| jsrefcount nonInlineCalls; | | jsrefcount nonInlineCalls; | |
| jsrefcount constructs; | | jsrefcount constructs; | |
| | | | |
| /* Scope lock and property metering. */ | | /* Scope lock and property metering. */ | |
| jsrefcount claimAttempts; | | jsrefcount claimAttempts; | |
| jsrefcount claimedScopes; | | jsrefcount claimedScopes; | |
| | | | |
| skipping to change at line 313 | | skipping to change at line 504 | |
| JSDHashEntryHdr hdr; | | JSDHashEntryHdr hdr; | |
| JSResolvingKey key; | | JSResolvingKey key; | |
| uint32 flags; | | uint32 flags; | |
| } JSResolvingEntry; | | } JSResolvingEntry; | |
| | | | |
| #define JSRESFLAG_LOOKUP 0x1 /* resolving id from lookup */ | | #define JSRESFLAG_LOOKUP 0x1 /* resolving id from lookup */ | |
| #define JSRESFLAG_WATCH 0x2 /* resolving id from watch */ | | #define JSRESFLAG_WATCH 0x2 /* resolving id from watch */ | |
| | | | |
| typedef struct JSLocalRootChunk JSLocalRootChunk; | | typedef struct JSLocalRootChunk JSLocalRootChunk; | |
| | | | |
|
| #define JSLRS_CHUNK_SHIFT 6 | | #define JSLRS_CHUNK_SHIFT 8 | |
| #define JSLRS_CHUNK_SIZE JS_BIT(JSLRS_CHUNK_SHIFT) | | #define JSLRS_CHUNK_SIZE JS_BIT(JSLRS_CHUNK_SHIFT) | |
| #define JSLRS_CHUNK_MASK JS_BITMASK(JSLRS_CHUNK_SHIFT) | | #define JSLRS_CHUNK_MASK JS_BITMASK(JSLRS_CHUNK_SHIFT) | |
| | | | |
| struct JSLocalRootChunk { | | struct JSLocalRootChunk { | |
| jsval roots[JSLRS_CHUNK_SIZE]; | | jsval roots[JSLRS_CHUNK_SIZE]; | |
| JSLocalRootChunk *down; | | JSLocalRootChunk *down; | |
| }; | | }; | |
| | | | |
| typedef struct JSLocalRootStack { | | typedef struct JSLocalRootStack { | |
|
| uint16 scopeMark; | | uint32 scopeMark; | |
| uint16 rootCount; | | uint32 rootCount; | |
| JSLocalRootChunk *topChunk; | | JSLocalRootChunk *topChunk; | |
| JSLocalRootChunk firstChunk; | | JSLocalRootChunk firstChunk; | |
| } JSLocalRootStack; | | } JSLocalRootStack; | |
| | | | |
|
| #define JSLRS_NULL_MARK ((uint16) -1) | | #define JSLRS_NULL_MARK ((uint32) -1) | |
| | | | |
| | | typedef struct JSTempValueRooter JSTempValueRooter; | |
| | | typedef void | |
| | | (* JS_DLL_CALLBACK JSTempValueMarker)(JSContext *cx, JSTempValueRooter *tvr | |
| | | ); | |
| | | | |
| | | typedef union JSTempValueUnion { | |
| | | jsval value; | |
| | | JSObject *object; | |
| | | JSString *string; | |
| | | void *gcthing; | |
| | | JSTempValueMarker marker; | |
| | | JSScopeProperty *sprop; | |
| | | JSWeakRoots *weakRoots; | |
| | | jsval *array; | |
| | | } JSTempValueUnion; | |
| | | | |
| | | /* | |
| | | * The following allows to reinterpret JSTempValueUnion.object as jsval usi | |
| | | ng | |
| | | * the tagging property of a generic jsval described below. | |
| | | */ | |
| | | JS_STATIC_ASSERT(sizeof(JSTempValueUnion) == sizeof(jsval)); | |
| | | JS_STATIC_ASSERT(sizeof(JSTempValueUnion) == sizeof(JSObject *)); | |
| | | | |
| | | /* | |
| | | * Context-linked stack of temporary GC roots. | |
| | | * | |
| | | * If count is -1, then u.value contains the single value or GC-thing to ro | |
| | | ot. | |
| | | * If count is -2, then u.marker holds a mark hook called to mark the value | |
| | | s. | |
| | | * If count is -3, then u.sprop points to the property tree node to mark. | |
| | | * If count is -4, then u.weakRoots points to saved weak roots. | |
| | | * If count >= 0, then u.array points to a stack-allocated vector of jsvals | |
| | | . | |
| | | * | |
| | | * To root a single GC-thing pointer, which need not be tagged and stored a | |
| | | s a | |
| | | * jsval, use JS_PUSH_TEMP_ROOT_GCTHING. The macro reinterprets an arbitrar | |
| | | y | |
| | | * GC-thing as jsval. It works because a GC-thing is aligned on a 0 mod 8 | |
| | | * boundary, and object has the 0 jsval tag. So any GC-thing may be tagged | |
| | | as | |
| | | * if it were an object and untagged, if it's then used only as an opaque | |
| | | * pointer until discriminated by other means than tag bits (this is how th | |
| | | e | |
| | | * GC mark function uses its |thing| parameter -- it consults GC-thing flag | |
| | | s | |
| | | * stored separately from the thing to decide the type of thing). | |
| | | * | |
| | | * JS_PUSH_TEMP_ROOT_OBJECT and JS_PUSH_TEMP_ROOT_STRING are type-safe | |
| | | * alternatives to JS_PUSH_TEMP_ROOT_GCTHING for JSObject and JSString. The | |
| | | y | |
| | | * also provide a simple way to get a single pointer to rooted JSObject or | |
| | | * JSString via JS_PUSH_TEMP_ROOT_(OBJECT|STRTING)(cx, NULL, &tvr). Then | |
| | | * &tvr.u.object or tvr.u.string gives the necessary pointer, which puns | |
| | | * tvr.u.value safely because JSObject * and JSString * are GC-things and, | |
| | | as | |
| | | * such, their tag bits are all zeroes. | |
| | | * | |
| | | * If you need to protect a result value that flows out of a C function acr | |
| | | oss | |
| | | * several layers of other functions, use the js_LeaveLocalRootScopeWithRes | |
| | | ult | |
| | | * internal API (see further below) instead. | |
| | | */ | |
| | | struct JSTempValueRooter { | |
| | | JSTempValueRooter *down; | |
| | | ptrdiff_t count; | |
| | | JSTempValueUnion u; | |
| | | }; | |
| | | | |
| | | #define JSTVU_SINGLE (-1) | |
| | | #define JSTVU_MARKER (-2) | |
| | | #define JSTVU_SPROP (-3) | |
| | | #define JSTVU_WEAK_ROOTS (-4) | |
| | | | |
| | | #define JS_PUSH_TEMP_ROOT_COMMON(cx,tvr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | JS_ASSERT((cx)->tempValueRooters != (tvr)); | |
| | | \ | |
| | | (tvr)->down = (cx)->tempValueRooters; | |
| | | \ | |
| | | (cx)->tempValueRooters = (tvr); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | #define JS_PUSH_SINGLE_TEMP_ROOT(cx,val,tvr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | (tvr)->count = JSTVU_SINGLE; | |
| | | \ | |
| | | (tvr)->u.value = val; | |
| | | \ | |
| | | JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | #define JS_PUSH_TEMP_ROOT(cx,cnt,arr,tvr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | JS_ASSERT((ptrdiff_t)(cnt) >= 0); | |
| | | \ | |
| | | (tvr)->count = (ptrdiff_t)(cnt); | |
| | | \ | |
| | | (tvr)->u.array = (arr); | |
| | | \ | |
| | | JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | #define JS_PUSH_TEMP_ROOT_MARKER(cx,marker_,tvr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | (tvr)->count = JSTVU_MARKER; | |
| | | \ | |
| | | (tvr)->u.marker = (marker_); | |
| | | \ | |
| | | JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | #define JS_PUSH_TEMP_ROOT_OBJECT(cx,obj,tvr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | (tvr)->count = JSTVU_SINGLE; | |
| | | \ | |
| | | (tvr)->u.object = (obj); | |
| | | \ | |
| | | JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | #define JS_PUSH_TEMP_ROOT_STRING(cx,str,tvr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | (tvr)->count = JSTVU_SINGLE; | |
| | | \ | |
| | | (tvr)->u.string = (str); | |
| | | \ | |
| | | JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | #define JS_PUSH_TEMP_ROOT_GCTHING(cx,thing,tvr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | JS_ASSERT(JSVAL_IS_OBJECT((jsval)thing)); | |
| | | \ | |
| | | (tvr)->count = JSTVU_SINGLE; | |
| | | \ | |
| | | (tvr)->u.gcthing = (thing); | |
| | | \ | |
| | | JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | #define JS_POP_TEMP_ROOT(cx,tvr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | JS_ASSERT((cx)->tempValueRooters == (tvr)); | |
| | | \ | |
| | | (cx)->tempValueRooters = (tvr)->down; | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | #define JS_TEMP_ROOT_EVAL(cx,cnt,val,expr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | JSTempValueRooter tvr; | |
| | | \ | |
| | | JS_PUSH_TEMP_ROOT(cx, cnt, val, &tvr); | |
| | | \ | |
| | | (expr); | |
| | | \ | |
| | | JS_POP_TEMP_ROOT(cx, &tvr); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | #define JS_PUSH_TEMP_ROOT_SPROP(cx,sprop_,tvr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | (tvr)->count = JSTVU_SPROP; | |
| | | \ | |
| | | (tvr)->u.sprop = (sprop_); | |
| | | \ | |
| | | JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| | | #define JS_PUSH_TEMP_ROOT_WEAK_COPY(cx,weakRoots_,tvr) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | (tvr)->count = JSTVU_WEAK_ROOTS; | |
| | | \ | |
| | | (tvr)->u.weakRoots = (weakRoots_); | |
| | | \ | |
| | | JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| struct JSContext { | | struct JSContext { | |
|
| | | /* JSRuntime contextList linkage. */ | |
| JSCList links; | | JSCList links; | |
| | | | |
| /* Interpreter activation count. */ | | /* Interpreter activation count. */ | |
| uintN interpLevel; | | uintN interpLevel; | |
| | | | |
| /* Limit pointer for checking stack consumption during recursion. */ | | /* Limit pointer for checking stack consumption during recursion. */ | |
| jsuword stackLimit; | | jsuword stackLimit; | |
| | | | |
| /* Runtime version control identifier and equality operators. */ | | /* Runtime version control identifier and equality operators. */ | |
|
| JSVersion version; | | uint16 version; | |
| jsbytecode jsop_eq; | | jsbytecode jsop_eq; | |
| jsbytecode jsop_ne; | | jsbytecode jsop_ne; | |
| | | | |
| /* Data shared by threads in an address space. */ | | /* Data shared by threads in an address space. */ | |
| JSRuntime *runtime; | | JSRuntime *runtime; | |
| | | | |
| /* Stack arena pool and frame pointer register. */ | | /* Stack arena pool and frame pointer register. */ | |
| JSArenaPool stackPool; | | JSArenaPool stackPool; | |
| JSStackFrame *fp; | | JSStackFrame *fp; | |
| | | | |
| /* Temporary arena pool used while compiling and decompiling. */ | | /* Temporary arena pool used while compiling and decompiling. */ | |
| JSArenaPool tempPool; | | JSArenaPool tempPool; | |
| | | | |
| /* Top-level object and pointer to top stack frame's scope chain. */ | | /* Top-level object and pointer to top stack frame's scope chain. */ | |
| JSObject *globalObject; | | JSObject *globalObject; | |
| | | | |
|
| /* Most recently created things by type, members of the GC's root set. | | /* Storage to root recently allocated GC things and script result. */ | |
| */ | | JSWeakRoots weakRoots; | |
| JSGCThing *newborn[GCX_NTYPES]; | | | |
| | | | |
| /* Atom root for the last-looked-up atom on this context. */ | | | |
| JSAtom *lastAtom; | | | |
| | | | |
| /* Regular expression class statics (XXX not shared globally). */ | | /* Regular expression class statics (XXX not shared globally). */ | |
| JSRegExpStatics regExpStatics; | | JSRegExpStatics regExpStatics; | |
| | | | |
| /* State for object and array toSource conversion. */ | | /* State for object and array toSource conversion. */ | |
| JSSharpObjectMap sharpObjectMap; | | JSSharpObjectMap sharpObjectMap; | |
| | | | |
| /* Argument formatter support for JS_{Convert,Push}Arguments{,VA}. */ | | /* Argument formatter support for JS_{Convert,Push}Arguments{,VA}. */ | |
| JSArgumentFormatMap *argumentFormatMap; | | JSArgumentFormatMap *argumentFormatMap; | |
| | | | |
| | | | |
| skipping to change at line 389 | | skipping to change at line 720 | |
| /* Per-context optional user callbacks. */ | | /* Per-context optional user callbacks. */ | |
| JSBranchCallback branchCallback; | | JSBranchCallback branchCallback; | |
| JSErrorReporter errorReporter; | | JSErrorReporter errorReporter; | |
| | | | |
| /* Client opaque pointer */ | | /* Client opaque pointer */ | |
| void *data; | | void *data; | |
| | | | |
| /* GC and thread-safe state. */ | | /* GC and thread-safe state. */ | |
| JSStackFrame *dormantFrameChain; /* dormant stack frame to scan
*/ | | JSStackFrame *dormantFrameChain; /* dormant stack frame to scan
*/ | |
| #ifdef JS_THREADSAFE | | #ifdef JS_THREADSAFE | |
|
| jsword thread; | | JSThread *thread; | |
| jsrefcount requestDepth; | | jsrefcount requestDepth; | |
| JSScope *scopeToShare; /* weak reference, see jslock.c
*/ | | JSScope *scopeToShare; /* weak reference, see jslock.c
*/ | |
| JSScope *lockedSealedScope; /* weak ref, for low-cost seale
d | | JSScope *lockedSealedScope; /* weak ref, for low-cost seale
d | |
| scope locking */ | | scope locking */ | |
|
| | | JSCList threadLinks; /* JSThread contextList linkage | |
| | | */ | |
| | | | |
| | | #define CX_FROM_THREAD_LINKS(tl) \ | |
| | | ((JSContext *)((char *)(tl) - offsetof(JSContext, threadLinks))) | |
| #endif | | #endif | |
| | | | |
| #if JS_HAS_LVALUE_RETURN | | #if JS_HAS_LVALUE_RETURN | |
| /* | | /* | |
| * Secondary return value from native method called on the left-hand si
de | | * Secondary return value from native method called on the left-hand si
de | |
| * of an assignment operator. The native should store the object in wh
ich | | * of an assignment operator. The native should store the object in wh
ich | |
| * to set a property in *rval, and return the property's id expressed a
s a | | * to set a property in *rval, and return the property's id expressed a
s a | |
| * jsval by calling JS_SetCallReturnValue2(cx, idval). | | * jsval by calling JS_SetCallReturnValue2(cx, idval). | |
| */ | | */ | |
| jsval rval2; | | jsval rval2; | |
| JSPackedBool rval2set; | | JSPackedBool rval2set; | |
| #endif | | #endif | |
| | | | |
|
| | | #if JS_HAS_XML_SUPPORT | |
| | | /* | |
| | | * Bit-set formed from binary exponentials of the XML_* tiny-ids define | |
| | | d | |
| | | * for boolean settings in jsxml.c, plus an XSF_CACHE_VALID bit. Toget | |
| | | her | |
| | | * these act as a cache of the boolean XML.ignore* and XML.prettyPrinti | |
| | | ng | |
| | | * property values associated with this context's global object. | |
| | | */ | |
| | | uint8 xmlSettingFlags; | |
| | | #endif | |
| | | | |
| /* | | /* | |
| * True if creating an exception object, to prevent runaway recursion. | | * True if creating an exception object, to prevent runaway recursion. | |
|
| * NB: creatingException packs with rval2set, #if JS_HAS_LVALUE_RETURN, | | * NB: creatingException packs with rval2set, #if JS_HAS_LVALUE_RETURN; | |
| * and with throwing, below. | | * with xmlSettingFlags, #if JS_HAS_XML_SUPPORT; and with throwing belo | |
| | | w. | |
| */ | | */ | |
| JSPackedBool creatingException; | | JSPackedBool creatingException; | |
| | | | |
| /* | | /* | |
| * Exception state -- the exception member is a GC root by definition. | | * Exception state -- the exception member is a GC root by definition. | |
| * NB: throwing packs with creatingException and rval2set, above. | | * NB: throwing packs with creatingException and rval2set, above. | |
| */ | | */ | |
| JSPackedBool throwing; /* is there a pending exception
? */ | | JSPackedBool throwing; /* is there a pending exception
? */ | |
| jsval exception; /* most-recently-thrown excepti
on */ | | jsval exception; /* most-recently-thrown excepti
on */ | |
|
| | | /* Flag to indicate that we run inside gcCallback(cx, JSGC_MARK_END). * | |
| | | / | |
| | | JSPackedBool insideGCMarkCallback; | |
| | | | |
| /* Per-context options. */ | | /* Per-context options. */ | |
| uint32 options; /* see jsapi.h for JSOPTION_* *
/ | | uint32 options; /* see jsapi.h for JSOPTION_* *
/ | |
| | | | |
| /* Locale specific callbacks for string conversion. */ | | /* Locale specific callbacks for string conversion. */ | |
| JSLocaleCallbacks *localeCallbacks; | | JSLocaleCallbacks *localeCallbacks; | |
| | | | |
| /* | | /* | |
| * cx->resolvingTable is non-null and non-empty if we are initializing | | * cx->resolvingTable is non-null and non-empty if we are initializing | |
| * standard classes lazily, or if we are otherwise recursing indirectly | | * standard classes lazily, or if we are otherwise recursing indirectly | |
| * from js_LookupProperty through a JSClass.resolve hook. It is used t
o | | * from js_LookupProperty through a JSClass.resolve hook. It is used t
o | |
| * limit runaway recursion (see jsapi.c and jsobj.c). | | * limit runaway recursion (see jsapi.c and jsobj.c). | |
| */ | | */ | |
| JSDHashTable *resolvingTable; | | JSDHashTable *resolvingTable; | |
| | | | |
| /* PDL of stack headers describing stack slots not rooted by argv, etc.
*/ | | /* PDL of stack headers describing stack slots not rooted by argv, etc.
*/ | |
| JSStackHeader *stackHeaders; | | JSStackHeader *stackHeaders; | |
| | | | |
|
| /* Optional hook to find principals for an object being accessed on cx. | | /* Optional stack of heap-allocated scoped local GC roots. */ | |
| */ | | | |
| JSObjectPrincipalsFinder findObjectPrincipals; | | | |
| | | | |
| /* Optional stack of scoped local GC roots. */ | | | |
| JSLocalRootStack *localRootStack; | | JSLocalRootStack *localRootStack; | |
|
| | | | |
| | | /* Stack of thread-stack-allocated temporary GC roots. */ | |
| | | JSTempValueRooter *tempValueRooters; | |
| | | | |
| | | #ifdef GC_MARK_DEBUG | |
| | | /* Top of the GC mark stack. */ | |
| | | void *gcCurrentMarkNode; | |
| | | #endif | |
| | | }; | |
| | | | |
| | | #ifdef JS_THREADSAFE | |
| | | # define JS_THREAD_ID(cx) ((cx)->thread ? (cx)->thread->id : 0) | |
| | | #endif | |
| | | | |
| | | #ifdef __cplusplus | |
| | | /* FIXME(bug 332648): Move this into a public header. */ | |
| | | class JSAutoTempValueRooter | |
| | | { | |
| | | public: | |
| | | JSAutoTempValueRooter(JSContext *cx, size_t len, jsval *vec) | |
| | | : mContext(cx) { | |
| | | JS_PUSH_TEMP_ROOT(mContext, len, vec, &mTvr); | |
| | | } | |
| | | JSAutoTempValueRooter(JSContext *cx, jsval v) | |
| | | : mContext(cx) { | |
| | | JS_PUSH_SINGLE_TEMP_ROOT(mContext, v, &mTvr); | |
| | | } | |
| | | | |
| | | ~JSAutoTempValueRooter() { | |
| | | JS_POP_TEMP_ROOT(mContext, &mTvr); | |
| | | } | |
| | | | |
| | | private: | |
| | | static void *operator new(size_t); | |
| | | static void operator delete(void *, size_t); | |
| | | | |
| | | JSContext *mContext; | |
| | | JSTempValueRooter mTvr; | |
| }; | | }; | |
|
| | | #endif | |
| | | | |
| /* | | /* | |
|
| * Slightly more readable macros, also to hide bitset implementation detail | | * Slightly more readable macros for testing per-context option settings (a | |
| . | | lso | |
| * XXX beware non-boolean truth values, which belie the bitset hiding claim | | * to hide bitset implementation detail). | |
| ! | | * | |
| | | * JSOPTION_XML must be handled specially in order to propagate from compil | |
| | | e- | |
| | | * to run-time (from cx->options to script->version/cx->version). To do th | |
| | | at, | |
| | | * we copy JSOPTION_XML from cx->options into cx->version as JSVERSION_HAS_ | |
| | | XML | |
| | | * whenever options are set, and preserve this XML flag across version numb | |
| | | er | |
| | | * changes done via the JS_SetVersion API. | |
| | | * | |
| | | * But when executing a script or scripted function, the interpreter change | |
| | | s | |
| | | * cx->version, including the XML flag, to script->version. Thus JSOPTION_ | |
| | | XML | |
| | | * is a compile-time option that causes a run-time version change during ea | |
| | | ch | |
| | | * activation of the compiled script. That version change has the effect o | |
| | | f | |
| | | * changing JS_HAS_XML_OPTION, so that any compiling done via eval enables | |
| | | XML | |
| | | * support. If an XML-enabled script or function calls a non-XML function, | |
| | | * the flag bit will be cleared during the callee's activation. | |
| | | * | |
| | | * Note that JS_SetVersion API calls never pass JSVERSION_HAS_XML or'd into | |
| | | * that API's version parameter. | |
| | | * | |
| | | * Note also that script->version must contain this XML option flag in orde | |
| | | r | |
| | | * for XDR'ed scripts to serialize and deserialize with that option preserv | |
| | | ed | |
| | | * for detection at run-time. We can't copy other compile-time options int | |
| | | o | |
| | | * script->version because that would break backward compatibility (certain | |
| | | * other options, e.g. JSOPTION_VAROBJFIX, are analogous to JSOPTION_XML). | |
| */ | | */ | |
|
| #define JS_HAS_STRICT_OPTION(cx) ((cx)->options & JSOPTION_STRICT) | | #define JS_HAS_OPTION(cx,option) (((cx)->options & (option)) != 0) | |
| #define JS_HAS_WERROR_OPTION(cx) ((cx)->options & JSOPTION_WERROR) | | #define JS_HAS_STRICT_OPTION(cx) JS_HAS_OPTION(cx, JSOPTION_STRICT) | |
| #define JS_HAS_COMPILE_N_GO_OPTION(cx) ((cx)->options & JSOPTION_COMPILE_N | | #define JS_HAS_WERROR_OPTION(cx) JS_HAS_OPTION(cx, JSOPTION_WERROR) | |
| _GO) | | #define JS_HAS_COMPILE_N_GO_OPTION(cx) JS_HAS_OPTION(cx, JSOPTION_COMPILE_ | |
| #define JS_HAS_ATLINE_OPTION(cx) ((cx)->options & JSOPTION_ATLINE) | | N_GO) | |
| | | #define JS_HAS_ATLINE_OPTION(cx) JS_HAS_OPTION(cx, JSOPTION_ATLINE) | |
| | | | |
| | | #define JSVERSION_MASK 0x0FFF /* see JSVersion in jspubtd | |
| | | .h */ | |
| | | #define JSVERSION_HAS_XML 0x1000 /* flag induced by XML opti | |
| | | on */ | |
| | | | |
| | | #define JSVERSION_NUMBER(cx) ((cx)->version & JSVERSION_MASK) | |
| | | #define JS_HAS_XML_OPTION(cx) ((cx)->version & JSVERSION_HAS_XML | |
| | | || \ | |
| | | JSVERSION_NUMBER(cx) >= JSVERSION_ | |
| | | 1_6) | |
| | | | |
| | | #define JS_HAS_NATIVE_BRANCH_CALLBACK_OPTION(cx) | |
| | | \ | |
| | | JS_HAS_OPTION(cx, JSOPTION_NATIVE_BRANCH_CALLBACK) | |
| | | | |
| | | /* | |
| | | * Wrappers for the JSVERSION_IS_* macros from jspubtd.h taking JSContext * | |
| | | cx | |
| | | * and masking off the XML flag and any other high order bits. | |
| | | */ | |
| | | #define JS_VERSION_IS_ECMA(cx) JSVERSION_IS_ECMA(JSVERSION_NUMBER( | |
| | | cx)) | |
| | | | |
|
| | | /* | |
| | | * Common subroutine of JS_SetVersion and js_SetVersion, to update per-cont | |
| | | ext | |
| | | * data that depends on version. | |
| | | */ | |
| | | extern void | |
| | | js_OnVersionChange(JSContext *cx); | |
| | | | |
| | | /* | |
| | | * Unlike the JS_SetVersion API, this function stores JSVERSION_HAS_XML and | |
| | | * any future non-version-number flags induced by compiler options. | |
| | | */ | |
| | | extern void | |
| | | js_SetVersion(JSContext *cx, JSVersion version); | |
| | | | |
| | | /* | |
| | | * Create and destroy functions for JSContext, which is manually allocated | |
| | | * and exclusively owned. | |
| | | */ | |
| extern JSContext * | | extern JSContext * | |
| js_NewContext(JSRuntime *rt, size_t stackChunkSize); | | js_NewContext(JSRuntime *rt, size_t stackChunkSize); | |
| | | | |
| extern void | | extern void | |
|
| js_DestroyContext(JSContext *cx, JSGCMode gcmode); | | js_DestroyContext(JSContext *cx, JSDestroyContextMode mode); | |
| | | | |
| /* | | /* | |
| * Return true if cx points to a context in rt->contextList, else return fa
lse. | | * Return true if cx points to a context in rt->contextList, else return fa
lse. | |
| * NB: the caller (see jslock.c:ClaimScope) must hold rt->gcLock. | | * NB: the caller (see jslock.c:ClaimScope) must hold rt->gcLock. | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
| js_ValidContextPointer(JSRuntime *rt, JSContext *cx); | | js_ValidContextPointer(JSRuntime *rt, JSContext *cx); | |
| | | | |
| /* | | /* | |
| * If unlocked, acquire and release rt->gcLock around *iterp update; otherw
ise | | * If unlocked, acquire and release rt->gcLock around *iterp update; otherw
ise | |
| | | | |
| skipping to change at line 487 | | skipping to change at line 928 | |
| extern JSBool | | extern JSBool | |
| js_StartResolving(JSContext *cx, JSResolvingKey *key, uint32 flag, | | js_StartResolving(JSContext *cx, JSResolvingKey *key, uint32 flag, | |
| JSResolvingEntry **entryp); | | JSResolvingEntry **entryp); | |
| | | | |
| extern void | | extern void | |
| js_StopResolving(JSContext *cx, JSResolvingKey *key, uint32 flag, | | js_StopResolving(JSContext *cx, JSResolvingKey *key, uint32 flag, | |
| JSResolvingEntry *entry, uint32 generation); | | JSResolvingEntry *entry, uint32 generation); | |
| | | | |
| /* | | /* | |
| * Local root set management. | | * Local root set management. | |
|
| | | * | |
| | | * NB: the jsval parameters below may be properly tagged jsvals, or GC-thin | |
| | | g | |
| | | * pointers cast to (jsval). This relies on JSObject's tag being zero, but | |
| | | * on the up side it lets us push int-jsval-encoded scopeMark values on the | |
| | | * local root stack. | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
| js_EnterLocalRootScope(JSContext *cx); | | js_EnterLocalRootScope(JSContext *cx); | |
| | | | |
|
| | | #define js_LeaveLocalRootScope(cx) \ | |
| | | js_LeaveLocalRootScopeWithResult(cx, JSVAL_NULL) | |
| | | | |
| extern void | | extern void | |
|
| js_LeaveLocalRootScope(JSContext *cx); | | js_LeaveLocalRootScopeWithResult(JSContext *cx, jsval rval); | |
| | | | |
| extern void | | extern void | |
| js_ForgetLocalRoot(JSContext *cx, jsval v); | | js_ForgetLocalRoot(JSContext *cx, jsval v); | |
| | | | |
| extern int | | extern int | |
| js_PushLocalRoot(JSContext *cx, JSLocalRootStack *lrs, jsval v); | | js_PushLocalRoot(JSContext *cx, JSLocalRootStack *lrs, jsval v); | |
| | | | |
| extern void | | extern void | |
| js_MarkLocalRoots(JSContext *cx, JSLocalRootStack *lrs); | | js_MarkLocalRoots(JSContext *cx, JSLocalRootStack *lrs); | |
| | | | |
| | | | |
| skipping to change at line 535 | | skipping to change at line 984 | |
| JSBool charArgs, va_list ap); | | JSBool charArgs, va_list ap); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_ExpandErrorArguments(JSContext *cx, JSErrorCallback callback, | | js_ExpandErrorArguments(JSContext *cx, JSErrorCallback callback, | |
| void *userRef, const uintN errorNumber, | | void *userRef, const uintN errorNumber, | |
| char **message, JSErrorReport *reportp, | | char **message, JSErrorReport *reportp, | |
| JSBool *warningp, JSBool charArgs, va_list ap); | | JSBool *warningp, JSBool charArgs, va_list ap); | |
| #endif | | #endif | |
| | | | |
| extern void | | extern void | |
|
| js_ReportOutOfMemory(JSContext *cx, JSErrorCallback errorCallback); | | js_ReportOutOfMemory(JSContext *cx); | |
| | | | |
| /* | | /* | |
| * Report an exception using a previously composed JSErrorReport. | | * Report an exception using a previously composed JSErrorReport. | |
| * XXXbe remove from "friend" API | | * XXXbe remove from "friend" API | |
| */ | | */ | |
| extern JS_FRIEND_API(void) | | extern JS_FRIEND_API(void) | |
| js_ReportErrorAgain(JSContext *cx, const char *message, JSErrorReport *repo
rt); | | js_ReportErrorAgain(JSContext *cx, const char *message, JSErrorReport *repo
rt); | |
| | | | |
| extern void | | extern void | |
| js_ReportIsNotDefined(JSContext *cx, const char *name); | | js_ReportIsNotDefined(JSContext *cx, const char *name); | |
| | | | |
End of changes. 40 change blocks. |
| 36 lines changed or deleted | | 607 lines changed or added | |
|
| jsconfig.h | | jsconfig.h | |
| | | | |
| skipping to change at line 44 | | skipping to change at line 44 | |
| * and other provisions required by the GPL or the LGPL. If you do not dele
te | | * and other provisions required by the GPL or the LGPL. If you do not dele
te | |
| * the provisions above, a recipient may use your version of this file unde
r | | * the provisions above, a recipient may use your version of this file unde
r | |
| * the terms of any one of the MPL, the GPL or the LGPL. | | * the terms of any one of the MPL, the GPL or the LGPL. | |
| * | | * | |
| * ***** END LICENSE BLOCK ***** */ | | * ***** END LICENSE BLOCK ***** */ | |
| | | | |
| /* | | /* | |
| * JS configuration macros. | | * JS configuration macros. | |
| */ | | */ | |
| #ifndef JS_VERSION | | #ifndef JS_VERSION | |
|
| #define JS_VERSION 150 | | #define JS_VERSION 170 | |
| #endif | | #endif | |
| | | | |
| /* | | /* | |
| * Compile-time JS version configuration. The JS version numbers lie on th
e | | * Compile-time JS version configuration. The JS version numbers lie on th
e | |
| * number line like so: | | * number line like so: | |
| * | | * | |
|
| * 1.0 1.1 1.2 1.3 1.4 ECMAv3 1.5 | | * 1.0 1.1 1.2 1.3 1.4 ECMAv3 1.5 1.6 | |
| * ^ ^ | | * ^ ^ | |
| * | | | | * | | | |
| * basis for ECMAv1 close to ECMAv2 | | * basis for ECMAv1 close to ECMAv2 | |
| * | | * | |
| * where ECMAv3 stands for ECMA-262 Edition 3. See the runtime version enu
m | | * where ECMAv3 stands for ECMA-262 Edition 3. See the runtime version enu
m | |
| * JSVersion in jspubtd.h. Code in the engine can therefore count on versi
on | | * JSVersion in jspubtd.h. Code in the engine can therefore count on versi
on | |
| * <= JSVERSION_1_4 to mean "before the Third Edition of ECMA-262" and vers
ion | | * <= JSVERSION_1_4 to mean "before the Third Edition of ECMA-262" and vers
ion | |
| * > JSVERSION_1_4 to mean "at or after the Third Edition". | | * > JSVERSION_1_4 to mean "at or after the Third Edition". | |
| * | | * | |
|
| * In the unlikely event that SpiderMonkey ever implements JavaScript 2.0, | | * In the (likely?) event that SpiderMonkey grows to implement JavaScript 2 | |
| or | | .0, | |
| * ECMA-262 Edition 4 (JS2 without certain extensions), the version number | | * or ECMA-262 Edition 4 (JS2 without certain extensions), the version numb | |
| to | | er | |
| * use would be near 200, or greater. | | * to use would be near 200, or greater. | |
| * | | * | |
| * The JS_VERSION_ECMA_3 version is the minimal configuration conforming to | | * The JS_VERSION_ECMA_3 version is the minimal configuration conforming to | |
| * the ECMA-262 Edition 3 specification. Use it for minimal embeddings, wh
ere | | * the ECMA-262 Edition 3 specification. Use it for minimal embeddings, wh
ere | |
| * you're sure you don't need any of the extensions disabled in this versio
n. | | * you're sure you don't need any of the extensions disabled in this versio
n. | |
| * In order to facilitate testing, JS_HAS_OBJ_PROTO_PROP is defined as part
of | | * In order to facilitate testing, JS_HAS_OBJ_PROTO_PROP is defined as part
of | |
| * the JS_VERSION_ECMA_3_TEST version. | | * the JS_VERSION_ECMA_3_TEST version. | |
|
| | | * | |
| | | * To keep things sane in the modern age, where we need exceptions in order | |
| | | to | |
| | | * implement, e.g., iterators and generators, we are dropping support for a | |
| | | ll | |
| | | * versions <= 1.4. | |
| */ | | */ | |
| #define JS_VERSION_ECMA_3 148 | | #define JS_VERSION_ECMA_3 148 | |
| #define JS_VERSION_ECMA_3_TEST 149 | | #define JS_VERSION_ECMA_3_TEST 149 | |
| | | | |
| #if JS_VERSION == JS_VERSION_ECMA_3 ||
\ | | #if JS_VERSION == JS_VERSION_ECMA_3 ||
\ | |
| JS_VERSION == JS_VERSION_ECMA_3_TEST | | JS_VERSION == JS_VERSION_ECMA_3_TEST | |
| | | | |
|
| #define JS_BUG_NULL_INDEX_PROPS 0 /* o[0] defaults to null, not void | | | |
| */ | | | |
| #define JS_BUG_EMPTY_INDEX_ZERO 0 /* o[""] is equivalent to o[0] */ | | | |
| #define JS_BUG_EAGER_TOSTRING 0 /* o.toString() trumps o.valueOf() | | | |
| */ | | | |
| #define JS_BUG_VOID_TOSTRING 0 /* void 0 + 0 == "undefined0" */ | | | |
| #define JS_BUG_EVAL_THIS_FUN 0 /* eval('this') in function f is f | | | |
| */ | | | |
| #define JS_BUG_EVAL_THIS_SCOPE 0 /* Math.eval('sin(x)') vs. local x | | | |
| */ | | | |
| #define JS_BUG_FALLIBLE_EQOPS 0 /* fallible/intransitive equality o | | | |
| ps */ | | | |
| #define JS_BUG_FALLIBLE_TONUM 0 /* fallible ValueToNumber primitive | | | |
| */ | | | |
| #define JS_BUG_WITH_CLOSURE 0 /* with(o)function f(){} sets o.f * | | | |
| / | | | |
| | | | |
| #define JS_HAS_PROP_DELETE 1 /* delete o.p removes p from o */ | | | |
| #define JS_HAS_CALL_OBJECT 1 /* fun.caller is stack frame obj */ | | | |
| #define JS_HAS_LABEL_STATEMENT 1 /* has break/continue to label: */ | | | |
| #define JS_HAS_DO_WHILE_LOOP 1 /* has do {...} while (b) */ | | | |
| #define JS_HAS_SWITCH_STATEMENT 1 /* has switch (v) {case c: ...} */ | | | |
| #define JS_HAS_SOME_PERL_FUN 1 /* has array.join/reverse/sort */ | | | |
| #define JS_HAS_MORE_PERL_FUN 1 /* has array.push, array.pop, etc * | | | |
| / | | | |
| #define JS_HAS_STR_HTML_HELPERS 0 /* has str.anchor, str.bold, etc. *
/ | | #define JS_HAS_STR_HTML_HELPERS 0 /* has str.anchor, str.bold, etc. *
/ | |
| #define JS_HAS_PERL_SUBSTR 0 /* has str.substr */ | | #define JS_HAS_PERL_SUBSTR 0 /* has str.substr */ | |
|
| #define JS_HAS_VALUEOF_HINT 1 /* valueOf(hint) where hint is type | | | |
| of */ | | | |
| #define JS_HAS_LEXICAL_CLOSURE 1 /* nested functions, lexically clos | | | |
| ed */ | | | |
| #define JS_HAS_APPLY_FUNCTION 1 /* has fun.apply(obj, argArray) */ | | | |
| #define JS_HAS_CALL_FUNCTION 1 /* has fun.call(obj, arg1, ... argN | | | |
| ) */ | | | |
| #if JS_VERSION == JS_VERSION_ECMA_3_TEST | | #if JS_VERSION == JS_VERSION_ECMA_3_TEST | |
| #define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ | | #define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ | |
| #else | | #else | |
| #define JS_HAS_OBJ_PROTO_PROP 0 /* has o.__proto__ etc. */ | | #define JS_HAS_OBJ_PROTO_PROP 0 /* has o.__proto__ etc. */ | |
| #endif | | #endif | |
|
| #define JS_HAS_REGEXPS 1 /* has perl r.e.s via RegExp, /pat/ | | | |
| */ | | | |
| #define JS_HAS_SEQUENCE_OPS 1 /* has array.slice, string.concat * | | | |
| / | | | |
| #define JS_HAS_INITIALIZERS 1 /* has var o = {'foo': 42, 'bar':3} | | | |
| */ | | | |
| #define JS_HAS_OBJ_WATCHPOINT 0 /* has o.watch and o.unwatch */ | | #define JS_HAS_OBJ_WATCHPOINT 0 /* has o.watch and o.unwatch */ | |
| #define JS_HAS_EXPORT_IMPORT 0 /* has export fun; import obj.fun *
/ | | #define JS_HAS_EXPORT_IMPORT 0 /* has export fun; import obj.fun *
/ | |
| #define JS_HAS_EVAL_THIS_SCOPE 0 /* Math.eval is same as with (Math)
*/ | | #define JS_HAS_EVAL_THIS_SCOPE 0 /* Math.eval is same as with (Math)
*/ | |
|
| #define JS_HAS_TRIPLE_EQOPS 1 /* has === and !== identity eqops *
/ | | | |
| #define JS_HAS_SHARP_VARS 0 /* has #n=, #n# for object literals
*/ | | #define JS_HAS_SHARP_VARS 0 /* has #n=, #n# for object literals
*/ | |
|
| #define JS_HAS_REPLACE_LAMBDA 1 /* has string.replace(re, lambda) *
/ | | | |
| #define JS_HAS_SCRIPT_OBJECT 0 /* has (new Script("x++")).exec() *
/ | | #define JS_HAS_SCRIPT_OBJECT 0 /* has (new Script("x++")).exec() *
/ | |
| #define JS_HAS_XDR 0 /* has XDR API and internal support
*/ | | #define JS_HAS_XDR 0 /* has XDR API and internal support
*/ | |
| #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho
ds */ | | #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho
ds */ | |
|
| #define JS_HAS_EXCEPTIONS 1 /* has exception handling */ | | | |
| #define JS_HAS_UNDEFINED 1 /* has global "undefined" property | | | |
| */ | | | |
| #define JS_HAS_TOSOURCE 0 /* has Object/Array toSource method
*/ | | #define JS_HAS_TOSOURCE 0 /* has Object/Array toSource method
*/ | |
|
| #define JS_HAS_IN_OPERATOR 1 /* has in operator ('p' in {p:1}) * | | | |
| / | | | |
| #define JS_HAS_INSTANCEOF 1 /* has {p:1} instanceof Object */ | | | |
| #define JS_HAS_ARGS_OBJECT 1 /* has minimal ECMA arguments objec | | | |
| t */ | | | |
| #define JS_HAS_DEBUGGER_KEYWORD 0 /* has hook for debugger keyword */ | | #define JS_HAS_DEBUGGER_KEYWORD 0 /* has hook for debugger keyword */ | |
|
| #define JS_HAS_ERROR_EXCEPTIONS 1 /* has error object hierarchy */ | | | |
| #define JS_HAS_CATCH_GUARD 0 /* has exception handling catch gua
rd */ | | #define JS_HAS_CATCH_GUARD 0 /* has exception handling catch gua
rd */ | |
|
| #define JS_HAS_NEW_OBJ_METHODS 1 /* has Object.prototype query metho
ds */ | | | |
| #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele
ms */ | | #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele
ms */ | |
|
| #define JS_HAS_DFLT_MSG_STRINGS 1 /* provides English error messages | | | |
| */ | | | |
| #define JS_HAS_NUMBER_FORMATS 1 /* numbers have formatting methods | | | |
| */ | | | |
| #define JS_HAS_GETTER_SETTER 0 /* has JS2 getter/setter functions
*/ | | #define JS_HAS_GETTER_SETTER 0 /* has JS2 getter/setter functions
*/ | |
| #define JS_HAS_UNEVAL 0 /* has uneval() top-level function
*/ | | #define JS_HAS_UNEVAL 0 /* has uneval() top-level function
*/ | |
| #define JS_HAS_CONST 0 /* has JS2 const as alternative var
*/ | | #define JS_HAS_CONST 0 /* has JS2 const as alternative var
*/ | |
| #define JS_HAS_FUN_EXPR_STMT 0 /* has function expression statemen
t */ | | #define JS_HAS_FUN_EXPR_STMT 0 /* has function expression statemen
t */ | |
| #define JS_HAS_LVALUE_RETURN 1 /* has o.item(i) = j; for native it
em */ | | #define JS_HAS_LVALUE_RETURN 1 /* has o.item(i) = j; for native it
em */ | |
| #define JS_HAS_NO_SUCH_METHOD 0 /* has o.__noSuchMethod__ handler *
/ | | #define JS_HAS_NO_SUCH_METHOD 0 /* has o.__noSuchMethod__ handler *
/ | |
|
| | | #define JS_HAS_XML_SUPPORT 0 /* has ECMAScript for XML support * | |
| | | / | |
| | | #define JS_HAS_ARRAY_EXTRAS 0 /* has indexOf and Lispy extras */ | |
| | | #define JS_HAS_GENERATORS 0 /* has yield in generator function | |
| | | */ | |
| | | #define JS_HAS_BLOCK_SCOPE 0 /* has block scope via let/arraycom | |
| | | p */ | |
| | | #define JS_HAS_DESTRUCTURING 0 /* has [a,b] = ... or {p:a,q:b} = . | |
| | | .. */ | |
| | | | |
|
| #elif JS_VERSION == 100 | | #elif JS_VERSION < 150 | |
| | | | |
| #define JS_BUG_NULL_INDEX_PROPS 1 /* o[0] defaults to null, not void | | | |
| */ | | | |
| #define JS_BUG_EMPTY_INDEX_ZERO 1 /* o[""] is equivalent to o[0] */ | | | |
| #define JS_BUG_EAGER_TOSTRING 1 /* o.toString() trumps o.valueOf() | | | |
| */ | | | |
| #define JS_BUG_VOID_TOSTRING 0 /* void 0 + 0 == "undefined0" */ | | | |
| #define JS_BUG_EVAL_THIS_FUN 0 /* eval('this') in function f is f | | | |
| */ | | | |
| #define JS_BUG_EVAL_THIS_SCOPE 0 /* Math.eval('sin(x)') vs. local x | | | |
| */ | | | |
| #define JS_BUG_FALLIBLE_EQOPS 1 /* fallible/intransitive equality o | | | |
| ps */ | | | |
| #define JS_BUG_FALLIBLE_TONUM 1 /* fallible ValueToNumber primitive | | | |
| */ | | | |
| #define JS_BUG_WITH_CLOSURE 0 /* with(o)function f(){} sets o.f * | | | |
| / | | | |
| | | | |
| #define JS_HAS_PROP_DELETE 0 /* delete o.p removes p from o */ | | | |
| #define JS_HAS_CALL_OBJECT 0 /* fun.caller is stack frame obj */ | | | |
| #define JS_HAS_LABEL_STATEMENT 0 /* has break/continue to label: */ | | | |
| #define JS_HAS_DO_WHILE_LOOP 0 /* has do {...} while (b) */ | | | |
| #define JS_HAS_SWITCH_STATEMENT 0 /* has switch (v) {case c: ...} */ | | | |
| #define JS_HAS_SOME_PERL_FUN 0 /* has array.join/reverse/sort */ | | | |
| #define JS_HAS_MORE_PERL_FUN 0 /* has array.push, str.substr, etc | | | |
| */ | | | |
| #define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. * | | | |
| / | | | |
| #define JS_HAS_PERL_SUBSTR 0 /* has str.substr */ | | | |
| #define JS_HAS_VALUEOF_HINT 0 /* valueOf(hint) where hint is type | | | |
| of */ | | | |
| #define JS_HAS_LEXICAL_CLOSURE 0 /* nested functions, lexically clos | | | |
| ed */ | | | |
| #define JS_HAS_APPLY_FUNCTION 0 /* has fun.apply(obj, argArray) */ | | | |
| #define JS_HAS_CALL_FUNCTION 0 /* has fun.call(obj, arg1, ... argN | | | |
| ) */ | | | |
| #define JS_HAS_OBJ_PROTO_PROP 0 /* has o.__proto__ etc. */ | | | |
| #define JS_HAS_REGEXPS 0 /* has perl r.e.s via RegExp, /pat/ | | | |
| */ | | | |
| #define JS_HAS_SEQUENCE_OPS 0 /* has array.slice, string.concat * | | | |
| / | | | |
| #define JS_HAS_INITIALIZERS 0 /* has var o = {'foo': 42, 'bar':3} | | | |
| */ | | | |
| #define JS_HAS_OBJ_WATCHPOINT 0 /* has o.watch and o.unwatch */ | | | |
| #define JS_HAS_EXPORT_IMPORT 0 /* has export fun; import obj.fun * | | | |
| / | | | |
| #define JS_HAS_EVAL_THIS_SCOPE 0 /* Math.eval is same as with (Math) | | | |
| */ | | | |
| #define JS_HAS_TRIPLE_EQOPS 0 /* has === and !== identity eqops * | | | |
| / | | | |
| #define JS_HAS_SHARP_VARS 0 /* has #n=, #n# for object literals | | | |
| */ | | | |
| #define JS_HAS_REPLACE_LAMBDA 0 /* has string.replace(re, lambda) * | | | |
| / | | | |
| #define JS_HAS_SCRIPT_OBJECT 0 /* has (new Script("x++")).exec() * | | | |
| / | | | |
| #define JS_HAS_XDR 0 /* has XDR API and internal support | | | |
| */ | | | |
| #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho | | | |
| ds */ | | | |
| #define JS_HAS_EXCEPTIONS 0 /* has exception handling */ | | | |
| #define JS_HAS_UNDEFINED 0 /* has global "undefined" property | | | |
| */ | | | |
| #define JS_HAS_TOSOURCE 0 /* has Object/Array toSource method | | | |
| */ | | | |
| #define JS_HAS_IN_OPERATOR 0 /* has in operator ('p' in {p:1}) * | | | |
| / | | | |
| #define JS_HAS_INSTANCEOF 0 /* has {p:1} instanceof Object */ | | | |
| #define JS_HAS_ARGS_OBJECT 0 /* has minimal ECMA arguments objec | | | |
| t */ | | | |
| #define JS_HAS_DEBUGGER_KEYWORD 0 /* has hook for debugger keyword */ | | | |
| #define JS_HAS_ERROR_EXCEPTIONS 0 /* has error object hierarchy */ | | | |
| #define JS_HAS_CATCH_GUARD 0 /* has exception handling catch gua | | | |
| rd */ | | | |
| #define JS_HAS_NEW_OBJ_METHODS 0 /* has Object.prototype query metho | | | |
| ds */ | | | |
| #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele | | | |
| ms */ | | | |
| #define JS_HAS_DFLT_MSG_STRINGS 1 /* provides English error messages | | | |
| */ | | | |
| #define JS_HAS_NUMBER_FORMATS 0 /* numbers have formatting methods | | | |
| */ | | | |
| #define JS_HAS_GETTER_SETTER 0 /* has JS2 getter/setter functions | | | |
| */ | | | |
| #define JS_HAS_UNEVAL 0 /* has uneval() top-level function | | | |
| */ | | | |
| #define JS_HAS_CONST 0 /* has JS2 const as alternative var | | | |
| */ | | | |
| #define JS_HAS_FUN_EXPR_STMT 0 /* has function expression statemen | | | |
| t */ | | | |
| #define JS_HAS_LVALUE_RETURN 0 /* has o.item(i) = j; for native it | | | |
| em */ | | | |
| #define JS_HAS_NO_SUCH_METHOD 0 /* has o.__noSuchMethod__ handler * | | | |
| / | | | |
| | | | |
| #elif JS_VERSION == 110 | | | |
| | | | |
| #define JS_BUG_NULL_INDEX_PROPS 1 /* o[0] defaults to null, not void | | | |
| */ | | | |
| #define JS_BUG_EMPTY_INDEX_ZERO 1 /* o[""] is equivalent to o[0] */ | | | |
| #define JS_BUG_EAGER_TOSTRING 1 /* o.toString() trumps o.valueOf() | | | |
| */ | | | |
| #define JS_BUG_VOID_TOSTRING 0 /* void 0 + 0 == "undefined0" */ | | | |
| #define JS_BUG_EVAL_THIS_FUN 1 /* eval('this') in function f is f | | | |
| */ | | | |
| #define JS_BUG_EVAL_THIS_SCOPE 1 /* Math.eval('sin(x)') vs. local x | | | |
| */ | | | |
| #define JS_BUG_FALLIBLE_EQOPS 1 /* fallible/intransitive equality o | | | |
| ps */ | | | |
| #define JS_BUG_FALLIBLE_TONUM 1 /* fallible ValueToNumber primitive | | | |
| */ | | | |
| #define JS_BUG_WITH_CLOSURE 0 /* with(o)function f(){} sets o.f * | | | |
| / | | | |
| | | | |
| #define JS_HAS_PROP_DELETE 0 /* delete o.p removes p from o */ | | | |
| #define JS_HAS_CALL_OBJECT 0 /* fun.caller is stack frame obj */ | | | |
| #define JS_HAS_LABEL_STATEMENT 0 /* has break/continue to label: */ | | | |
| #define JS_HAS_DO_WHILE_LOOP 0 /* has do {...} while (b) */ | | | |
| #define JS_HAS_SWITCH_STATEMENT 0 /* has switch (v) {case c: ...} */ | | | |
| #define JS_HAS_SOME_PERL_FUN 1 /* has array.join/reverse/sort */ | | | |
| #define JS_HAS_MORE_PERL_FUN 0 /* has array.push, str.substr, etc | | | |
| */ | | | |
| #define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. * | | | |
| / | | | |
| #define JS_HAS_PERL_SUBSTR 0 /* has str.substr */ | | | |
| #define JS_HAS_VALUEOF_HINT 0 /* valueOf(hint) where hint is type | | | |
| of */ | | | |
| #define JS_HAS_LEXICAL_CLOSURE 0 /* nested functions, lexically clos | | | |
| ed */ | | | |
| #define JS_HAS_APPLY_FUNCTION 0 /* has apply(fun, arg1, ... argN) * | | | |
| / | | | |
| #define JS_HAS_CALL_FUNCTION 0 /* has fun.call(obj, arg1, ... argN | | | |
| ) */ | | | |
| #define JS_HAS_OBJ_PROTO_PROP 0 /* has o.__proto__ etc. */ | | | |
| #define JS_HAS_REGEXPS 0 /* has perl r.e.s via RegExp, /pat/ | | | |
| */ | | | |
| #define JS_HAS_SEQUENCE_OPS 0 /* has array.slice, string.concat * | | | |
| / | | | |
| #define JS_HAS_INITIALIZERS 0 /* has var o = {'foo': 42, 'bar':3} | | | |
| */ | | | |
| #define JS_HAS_OBJ_WATCHPOINT 0 /* has o.watch and o.unwatch */ | | | |
| #define JS_HAS_EXPORT_IMPORT 0 /* has export fun; import obj.fun * | | | |
| / | | | |
| #define JS_HAS_EVAL_THIS_SCOPE 0 /* Math.eval is same as with (Math) | | | |
| */ | | | |
| #define JS_HAS_TRIPLE_EQOPS 0 /* has === and !== identity eqops * | | | |
| / | | | |
| #define JS_HAS_SHARP_VARS 0 /* has #n=, #n# for object literals | | | |
| */ | | | |
| #define JS_HAS_REPLACE_LAMBDA 0 /* has string.replace(re, lambda) * | | | |
| / | | | |
| #define JS_HAS_SCRIPT_OBJECT 0 /* has (new Script("x++")).exec() * | | | |
| / | | | |
| #define JS_HAS_XDR 0 /* has XDR API and internal support | | | |
| */ | | | |
| #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho | | | |
| ds */ | | | |
| #define JS_HAS_EXCEPTIONS 0 /* has exception handling */ | | | |
| #define JS_HAS_UNDEFINED 0 /* has global "undefined" property | | | |
| */ | | | |
| #define JS_HAS_TOSOURCE 0 /* has Object/Array toSource method | | | |
| */ | | | |
| #define JS_HAS_IN_OPERATOR 0 /* has in operator ('p' in {p:1}) * | | | |
| / | | | |
| #define JS_HAS_INSTANCEOF 0 /* has {p:1} instanceof Object */ | | | |
| #define JS_HAS_ARGS_OBJECT 0 /* has minimal ECMA arguments objec | | | |
| t */ | | | |
| #define JS_HAS_DEBUGGER_KEYWORD 0 /* has hook for debugger keyword */ | | | |
| #define JS_HAS_ERROR_EXCEPTIONS 0 /* has error object hierarchy */ | | | |
| #define JS_HAS_CATCH_GUARD 0 /* has exception handling catch gua | | | |
| rd */ | | | |
| #define JS_HAS_NEW_OBJ_METHODS 0 /* has Object.prototype query metho | | | |
| ds */ | | | |
| #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele | | | |
| ms */ | | | |
| #define JS_HAS_DFLT_MSG_STRINGS 1 /* provides English error messages | | | |
| */ | | | |
| #define JS_HAS_NUMBER_FORMATS 0 /* numbers have formatting methods | | | |
| */ | | | |
| #define JS_HAS_GETTER_SETTER 0 /* has JS2 getter/setter functions | | | |
| */ | | | |
| #define JS_HAS_UNEVAL 0 /* has uneval() top-level function | | | |
| */ | | | |
| #define JS_HAS_CONST 0 /* has JS2 const as alternative var | | | |
| */ | | | |
| #define JS_HAS_FUN_EXPR_STMT 0 /* has function expression statemen | | | |
| t */ | | | |
| #define JS_HAS_LVALUE_RETURN 0 /* has o.item(i) = j; for native it | | | |
| em */ | | | |
| #define JS_HAS_NO_SUCH_METHOD 0 /* has o.__noSuchMethod__ handler * | | | |
| / | | | |
| | | | |
| #elif JS_VERSION == 120 | | | |
| | | | |
| #define JS_BUG_NULL_INDEX_PROPS 0 /* o[0] defaults to null, not void | | | |
| */ | | | |
| #define JS_BUG_EMPTY_INDEX_ZERO 0 /* o[""] is equivalent to o[0] */ | | | |
| #define JS_BUG_EAGER_TOSTRING 0 /* o.toString() trumps o.valueOf() | | | |
| */ | | | |
| #define JS_BUG_VOID_TOSTRING 1 /* void 0 + 0 == "undefined0" */ | | | |
| #define JS_BUG_EVAL_THIS_FUN 0 /* eval('this') in function f is f | | | |
| */ | | | |
| #define JS_BUG_EVAL_THIS_SCOPE 0 /* Math.eval('sin(x)') vs. local x | | | |
| */ | | | |
| #define JS_BUG_FALLIBLE_EQOPS 0 /* fallible/intransitive equality o | | | |
| ps */ | | | |
| #define JS_BUG_FALLIBLE_TONUM 0 /* fallible ValueToNumber primitive | | | |
| */ | | | |
| #define JS_BUG_WITH_CLOSURE 1 /* with(o)function f(){} sets o.f * | | | |
| / | | | |
| | | | |
| #define JS_HAS_PROP_DELETE 1 /* delete o.p removes p from o */ | | | |
| #define JS_HAS_CALL_OBJECT 1 /* fun.caller is stack frame obj */ | | | |
| #define JS_HAS_LABEL_STATEMENT 1 /* has break/continue to label: */ | | | |
| #define JS_HAS_DO_WHILE_LOOP 1 /* has do {...} while (b) */ | | | |
| #define JS_HAS_SWITCH_STATEMENT 1 /* has switch (v) {case c: ...} */ | | | |
| #define JS_HAS_SOME_PERL_FUN 1 /* has array.join/reverse/sort */ | | | |
| #define JS_HAS_MORE_PERL_FUN 1 /* has array.push, str.substr, etc | | | |
| */ | | | |
| #define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. * | | | |
| / | | | |
| #define JS_HAS_PERL_SUBSTR 1 /* has str.substr */ | | | |
| #define JS_HAS_VALUEOF_HINT 1 /* valueOf(hint) where hint is type | | | |
| of */ | | | |
| #define JS_HAS_LEXICAL_CLOSURE 1 /* nested functions, lexically clos | | | |
| ed */ | | | |
| #define JS_HAS_APPLY_FUNCTION 1 /* has apply(fun, arg1, ... argN) * | | | |
| / | | | |
| #define JS_HAS_CALL_FUNCTION 0 /* has fun.call(obj, arg1, ... argN | | | |
| ) */ | | | |
| #define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ | | | |
| #define JS_HAS_REGEXPS 1 /* has perl r.e.s via RegExp, /pat/ | | | |
| */ | | | |
| #define JS_HAS_SEQUENCE_OPS 1 /* has array.slice, string.concat * | | | |
| / | | | |
| #define JS_HAS_INITIALIZERS 1 /* has var o = {'foo': 42, 'bar':3} | | | |
| */ | | | |
| #define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ | | | |
| #define JS_HAS_EXPORT_IMPORT 1 /* has export fun; import obj.fun * | | | |
| / | | | |
| #define JS_HAS_EVAL_THIS_SCOPE 1 /* Math.eval is same as with (Math) | | | |
| */ | | | |
| #define JS_HAS_TRIPLE_EQOPS 0 /* has === and !== identity eqops * | | | |
| / | | | |
| #define JS_HAS_SHARP_VARS 0 /* has #n=, #n# for object literals | | | |
| */ | | | |
| #define JS_HAS_REPLACE_LAMBDA 0 /* has string.replace(re, lambda) * | | | |
| / | | | |
| #define JS_HAS_SCRIPT_OBJECT 0 /* has (new Script("x++")).exec() * | | | |
| / | | | |
| #define JS_HAS_XDR 0 /* has XDR API and internal support | | | |
| */ | | | |
| #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho | | | |
| ds */ | | | |
| #define JS_HAS_EXCEPTIONS 0 /* has exception handling */ | | | |
| #define JS_HAS_UNDEFINED 0 /* has global "undefined" property | | | |
| */ | | | |
| #define JS_HAS_TOSOURCE 0 /* has Object/Array toSource method | | | |
| */ | | | |
| #define JS_HAS_IN_OPERATOR 0 /* has in operator ('p' in {p:1}) * | | | |
| / | | | |
| #define JS_HAS_INSTANCEOF 0 /* has {p:1} instanceof Object */ | | | |
| #define JS_HAS_ARGS_OBJECT 0 /* has minimal ECMA arguments objec | | | |
| t */ | | | |
| #define JS_HAS_DEBUGGER_KEYWORD 0 /* has hook for debugger keyword */ | | | |
| #define JS_HAS_ERROR_EXCEPTIONS 0 /* has error object hierarchy */ | | | |
| #define JS_HAS_CATCH_GUARD 0 /* has exception handling catch gua | | | |
| rd */ | | | |
| #define JS_HAS_NEW_OBJ_METHODS 0 /* has Object.prototype query metho | | | |
| ds */ | | | |
| #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele | | | |
| ms */ | | | |
| #define JS_HAS_DFLT_MSG_STRINGS 1 /* provides English error messages | | | |
| */ | | | |
| #define JS_HAS_NUMBER_FORMATS 0 /* numbers have formatting methods | | | |
| */ | | | |
| #define JS_HAS_GETTER_SETTER 0 /* has JS2 getter/setter functions | | | |
| */ | | | |
| #define JS_HAS_UNEVAL 0 /* has uneval() top-level function | | | |
| */ | | | |
| #define JS_HAS_CONST 0 /* has JS2 const as alternative var | | | |
| */ | | | |
| #define JS_HAS_FUN_EXPR_STMT 0 /* has function expression statemen | | | |
| t */ | | | |
| #define JS_HAS_LVALUE_RETURN 0 /* has o.item(i) = j; for native it | | | |
| em */ | | | |
| #define JS_HAS_NO_SUCH_METHOD 0 /* has o.__noSuchMethod__ handler * | | | |
| / | | | |
| | | | |
|
| #elif JS_VERSION == 130 | | #error "unsupported JS_VERSION" | |
| | | | |
|
| #define JS_BUG_NULL_INDEX_PROPS 0 /* o[0] defaults to null, not void | | #elif JS_VERSION == 150 | |
| */ | | | |
| #define JS_BUG_EMPTY_INDEX_ZERO 0 /* o[""] is equivalent to o[0] */ | | | |
| #define JS_BUG_EAGER_TOSTRING 0 /* o.toString() trumps o.valueOf() | | | |
| */ | | | |
| #define JS_BUG_VOID_TOSTRING 0 /* void 0 + 0 == "undefined0" */ | | | |
| #define JS_BUG_EVAL_THIS_FUN 0 /* eval('this') in function f is f | | | |
| */ | | | |
| #define JS_BUG_EVAL_THIS_SCOPE 0 /* Math.eval('sin(x)') vs. local x | | | |
| */ | | | |
| #define JS_BUG_FALLIBLE_EQOPS 0 /* fallible/intransitive equality o | | | |
| ps */ | | | |
| #define JS_BUG_FALLIBLE_TONUM 0 /* fallible ValueToNumber primitive | | | |
| */ | | | |
| #define JS_BUG_WITH_CLOSURE 1 /* with(o)function f(){} sets o.f * | | | |
| / | | | |
| | | | |
|
| #define JS_HAS_PROP_DELETE 1 /* delete o.p removes p from o */ | | | |
| #define JS_HAS_CALL_OBJECT 1 /* fun.caller is stack frame obj */ | | | |
| #define JS_HAS_LABEL_STATEMENT 1 /* has break/continue to label: */ | | | |
| #define JS_HAS_DO_WHILE_LOOP 1 /* has do {...} while (b) */ | | | |
| #define JS_HAS_SWITCH_STATEMENT 1 /* has switch (v) {case c: ...} */ | | | |
| #define JS_HAS_SOME_PERL_FUN 1 /* has array.join/reverse/sort */ | | | |
| #define JS_HAS_MORE_PERL_FUN 1 /* has array.push, str.substr, etc | | | |
| */ | | | |
| #define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. *
/ | | #define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. *
/ | |
| #define JS_HAS_PERL_SUBSTR 1 /* has str.substr */ | | #define JS_HAS_PERL_SUBSTR 1 /* has str.substr */ | |
|
| #define JS_HAS_VALUEOF_HINT 1 /* valueOf(hint) where hint is type | | | |
| of */ | | | |
| #define JS_HAS_LEXICAL_CLOSURE 1 /* nested functions, lexically clos | | | |
| ed */ | | | |
| #define JS_HAS_APPLY_FUNCTION 1 /* has apply(fun, arg1, ... argN) * | | | |
| / | | | |
| #define JS_HAS_CALL_FUNCTION 1 /* has fun.call(obj, arg1, ... argN | | | |
| ) */ | | | |
| #define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ | | #define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ | |
|
| #define JS_HAS_REGEXPS 1 /* has perl r.e.s via RegExp, /pat/ | | | |
| */ | | | |
| #define JS_HAS_SEQUENCE_OPS 1 /* has array.slice, string.concat * | | | |
| / | | | |
| #define JS_HAS_INITIALIZERS 1 /* has var o = {'foo': 42, 'bar':3} | | | |
| */ | | | |
| #define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ | | #define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ | |
| #define JS_HAS_EXPORT_IMPORT 1 /* has export fun; import obj.fun *
/ | | #define JS_HAS_EXPORT_IMPORT 1 /* has export fun; import obj.fun *
/ | |
| #define JS_HAS_EVAL_THIS_SCOPE 1 /* Math.eval is same as with (Math)
*/ | | #define JS_HAS_EVAL_THIS_SCOPE 1 /* Math.eval is same as with (Math)
*/ | |
|
| #define JS_HAS_TRIPLE_EQOPS 1 /* has === and !== identity eqops *
/ | | | |
| #define JS_HAS_SHARP_VARS 1 /* has #n=, #n# for object literals
*/ | | #define JS_HAS_SHARP_VARS 1 /* has #n=, #n# for object literals
*/ | |
|
| #define JS_HAS_REPLACE_LAMBDA 1 /* has string.replace(re, lambda) *
/ | | | |
| #define JS_HAS_SCRIPT_OBJECT 1 /* has (new Script("x++")).exec() *
/ | | #define JS_HAS_SCRIPT_OBJECT 1 /* has (new Script("x++")).exec() *
/ | |
| #define JS_HAS_XDR 1 /* has XDR API and internal support
*/ | | #define JS_HAS_XDR 1 /* has XDR API and internal support
*/ | |
| #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho
ds */ | | #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho
ds */ | |
|
| #define JS_HAS_EXCEPTIONS 0 /* has exception handling */ | | | |
| #define JS_HAS_UNDEFINED 1 /* has global "undefined" property | | | |
| */ | | | |
| #define JS_HAS_TOSOURCE 1 /* has Object/Array toSource method
*/ | | #define JS_HAS_TOSOURCE 1 /* has Object/Array toSource method
*/ | |
|
| #define JS_HAS_IN_OPERATOR 0 /* has in operator ('p' in {p:1}) * | | | |
| / | | | |
| #define JS_HAS_INSTANCEOF 0 /* has {p:1} instanceof Object */ | | | |
| #define JS_HAS_ARGS_OBJECT 1 /* has minimal ECMA arguments objec | | | |
| t */ | | | |
| #define JS_HAS_DEBUGGER_KEYWORD 1 /* has hook for debugger keyword */ | | #define JS_HAS_DEBUGGER_KEYWORD 1 /* has hook for debugger keyword */ | |
|
| #define JS_HAS_ERROR_EXCEPTIONS 0 /* has error object hierarchy */ | | #define JS_HAS_CATCH_GUARD 1 /* has exception handling catch gua | |
| #define JS_HAS_CATCH_GUARD 0 /* has exception handling catch gua | | rd */ | |
| rd */ | | | |
| #define JS_HAS_NEW_OBJ_METHODS 0 /* has Object.prototype query metho | | | |
| ds */ | | | |
| #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele
ms */ | | #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele
ms */ | |
|
| #define JS_HAS_DFLT_MSG_STRINGS 1 /* provides English error messages | | #define JS_HAS_GETTER_SETTER 1 /* has JS2 getter/setter functions | |
| */ | | */ | |
| #define JS_HAS_NUMBER_FORMATS 0 /* numbers have formatting methods | | #define JS_HAS_UNEVAL 1 /* has uneval() top-level function | |
| */ | | */ | |
| #define JS_HAS_GETTER_SETTER 0 /* has JS2 getter/setter functions | | #define JS_HAS_CONST 1 /* has JS2 const as alternative var | |
| */ | | */ | |
| #define JS_HAS_UNEVAL 0 /* has uneval() top-level function | | #define JS_HAS_FUN_EXPR_STMT 1 /* has function expression statemen | |
| */ | | t */ | |
| #define JS_HAS_CONST 0 /* has JS2 const as alternative var | | #define JS_HAS_LVALUE_RETURN 1 /* has o.item(i) = j; for native it | |
| */ | | em */ | |
| #define JS_HAS_FUN_EXPR_STMT 0 /* has function expression statemen | | #define JS_HAS_NO_SUCH_METHOD 1 /* has o.__noSuchMethod__ handler * | |
| t */ | | / | |
| #define JS_HAS_LVALUE_RETURN 0 /* has o.item(i) = j; for native it | | #define JS_HAS_XML_SUPPORT 0 /* has ECMAScript for XML support * | |
| em */ | | / | |
| #define JS_HAS_NO_SUCH_METHOD 0 /* has o.__noSuchMethod__ handler * | | #define JS_HAS_ARRAY_EXTRAS 0 /* has indexOf and Lispy extras */ | |
| / | | #define JS_HAS_GENERATORS 0 /* has yield in generator function | |
| | | */ | |
| #elif JS_VERSION == 140 | | #define JS_HAS_BLOCK_SCOPE 0 /* has block scope via let/arraycom | |
| | | p */ | |
| | | #define JS_HAS_DESTRUCTURING 0 /* has [a,b] = ... or {p:a,q:b} = . | |
| | | .. */ | |
| | | | |
|
| #define JS_BUG_NULL_INDEX_PROPS 0 /* o[0] defaults to null, not void | | #elif JS_VERSION == 160 | |
| */ | | | |
| #define JS_BUG_EMPTY_INDEX_ZERO 0 /* o[""] is equivalent to o[0] */ | | | |
| #define JS_BUG_EAGER_TOSTRING 0 /* o.toString() trumps o.valueOf() | | | |
| */ | | | |
| #define JS_BUG_VOID_TOSTRING 0 /* void 0 + 0 == "undefined0" */ | | | |
| #define JS_BUG_EVAL_THIS_FUN 0 /* eval('this') in function f is f | | | |
| */ | | | |
| #define JS_BUG_EVAL_THIS_SCOPE 0 /* Math.eval('sin(x)') vs. local x | | | |
| */ | | | |
| #define JS_BUG_FALLIBLE_EQOPS 0 /* fallible/intransitive equality o | | | |
| ps */ | | | |
| #define JS_BUG_FALLIBLE_TONUM 0 /* fallible ValueToNumber primitive | | | |
| */ | | | |
| #define JS_BUG_WITH_CLOSURE 1 /* with(o)function f(){} sets o.f * | | | |
| / | | | |
| | | | |
|
| #define JS_HAS_PROP_DELETE 1 /* delete o.p removes p from o */ | | | |
| #define JS_HAS_CALL_OBJECT 1 /* fun.caller is stack frame obj */ | | | |
| #define JS_HAS_LABEL_STATEMENT 1 /* has break/continue to label: */ | | | |
| #define JS_HAS_DO_WHILE_LOOP 1 /* has do {...} while (b) */ | | | |
| #define JS_HAS_SWITCH_STATEMENT 1 /* has switch (v) {case c: ...} */ | | | |
| #define JS_HAS_SOME_PERL_FUN 1 /* has array.join/reverse/sort */ | | | |
| #define JS_HAS_MORE_PERL_FUN 1 /* has array.push, str.substr, etc | | | |
| */ | | | |
| #define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. *
/ | | #define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. *
/ | |
| #define JS_HAS_PERL_SUBSTR 1 /* has str.substr */ | | #define JS_HAS_PERL_SUBSTR 1 /* has str.substr */ | |
|
| #define JS_HAS_VALUEOF_HINT 1 /* valueOf(hint) where hint is type | | | |
| of */ | | | |
| #define JS_HAS_LEXICAL_CLOSURE 1 /* nested functions, lexically clos | | | |
| ed */ | | | |
| #define JS_HAS_APPLY_FUNCTION 1 /* has apply(fun, arg1, ... argN) * | | | |
| / | | | |
| #define JS_HAS_CALL_FUNCTION 1 /* has fun.call(obj, arg1, ... argN | | | |
| ) */ | | | |
| #define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ | | #define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ | |
|
| #define JS_HAS_REGEXPS 1 /* has perl r.e.s via RegExp, /pat/ | | | |
| */ | | | |
| #define JS_HAS_SEQUENCE_OPS 1 /* has array.slice, string.concat * | | | |
| / | | | |
| #define JS_HAS_INITIALIZERS 1 /* has var o = {'foo': 42, 'bar':3} | | | |
| */ | | | |
| #define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ | | #define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ | |
| #define JS_HAS_EXPORT_IMPORT 1 /* has export fun; import obj.fun *
/ | | #define JS_HAS_EXPORT_IMPORT 1 /* has export fun; import obj.fun *
/ | |
| #define JS_HAS_EVAL_THIS_SCOPE 1 /* Math.eval is same as with (Math)
*/ | | #define JS_HAS_EVAL_THIS_SCOPE 1 /* Math.eval is same as with (Math)
*/ | |
|
| #define JS_HAS_TRIPLE_EQOPS 1 /* has === and !== identity eqops *
/ | | | |
| #define JS_HAS_SHARP_VARS 1 /* has #n=, #n# for object literals
*/ | | #define JS_HAS_SHARP_VARS 1 /* has #n=, #n# for object literals
*/ | |
|
| #define JS_HAS_REPLACE_LAMBDA 1 /* has string.replace(re, lambda) *
/ | | | |
| #define JS_HAS_SCRIPT_OBJECT 1 /* has (new Script("x++")).exec() *
/ | | #define JS_HAS_SCRIPT_OBJECT 1 /* has (new Script("x++")).exec() *
/ | |
| #define JS_HAS_XDR 1 /* has XDR API and internal support
*/ | | #define JS_HAS_XDR 1 /* has XDR API and internal support
*/ | |
| #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho
ds */ | | #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho
ds */ | |
|
| #define JS_HAS_EXCEPTIONS 1 /* has exception handling */ | | | |
| #define JS_HAS_UNDEFINED 1 /* has global "undefined" property | | | |
| */ | | | |
| #define JS_HAS_TOSOURCE 1 /* has Object/Array toSource method
*/ | | #define JS_HAS_TOSOURCE 1 /* has Object/Array toSource method
*/ | |
|
| #define JS_HAS_IN_OPERATOR 1 /* has in operator ('p' in {p:1}) * | | | |
| / | | | |
| #define JS_HAS_INSTANCEOF 1 /* has {p:1} instanceof Object */ | | | |
| #define JS_HAS_ARGS_OBJECT 1 /* has minimal ECMA arguments objec | | | |
| t */ | | | |
| #define JS_HAS_DEBUGGER_KEYWORD 1 /* has hook for debugger keyword */ | | #define JS_HAS_DEBUGGER_KEYWORD 1 /* has hook for debugger keyword */ | |
|
| #define JS_HAS_ERROR_EXCEPTIONS 0 /* rt errors reflected as exception | | #define JS_HAS_CATCH_GUARD 1 /* has exception handling catch gua | |
| s */ | | rd */ | |
| #define JS_HAS_CATCH_GUARD 0 /* has exception handling catch gua | | | |
| rd */ | | | |
| #define JS_HAS_NEW_OBJ_METHODS 0 /* has Object.prototype query metho | | | |
| ds */ | | | |
| #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele
ms */ | | #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele
ms */ | |
|
| #define JS_HAS_DFLT_MSG_STRINGS 1 /* provides English error messages | | #define JS_HAS_GETTER_SETTER 1 /* has JS2 getter/setter functions | |
| */ | | */ | |
| #define JS_HAS_NUMBER_FORMATS 0 /* numbers have formatting methods | | #define JS_HAS_UNEVAL 1 /* has uneval() top-level function | |
| */ | | */ | |
| #define JS_HAS_GETTER_SETTER 0 /* has JS2 getter/setter functions | | #define JS_HAS_CONST 1 /* has JS2 const as alternative var | |
| */ | | */ | |
| #define JS_HAS_UNEVAL 0 /* has uneval() top-level function | | #define JS_HAS_FUN_EXPR_STMT 1 /* has function expression statemen | |
| */ | | t */ | |
| #define JS_HAS_CONST 0 /* has JS2 const as alternative var | | #define JS_HAS_LVALUE_RETURN 1 /* has o.item(i) = j; for native it | |
| */ | | em */ | |
| #define JS_HAS_FUN_EXPR_STMT 0 /* has function expression statemen | | #define JS_HAS_NO_SUCH_METHOD 1 /* has o.__noSuchMethod__ handler * | |
| t */ | | / | |
| #define JS_HAS_LVALUE_RETURN 0 /* has o.item(i) = j; for native it | | #define JS_HAS_XML_SUPPORT 1 /* has ECMAScript for XML support * | |
| em */ | | / | |
| #define JS_HAS_NO_SUCH_METHOD 0 /* has o.__noSuchMethod__ handler * | | #define JS_HAS_ARRAY_EXTRAS 1 /* has indexOf and Lispy extras */ | |
| / | | #define JS_HAS_GENERATORS 0 /* has yield in generator function | |
| | | */ | |
| #elif JS_VERSION == 150 | | #define JS_HAS_BLOCK_SCOPE 0 /* has block scope via let/arraycom | |
| | | p */ | |
| | | #define JS_HAS_DESTRUCTURING 0 /* has [a,b] = ... or {p:a,q:b} = . | |
| | | .. */ | |
| | | | |
|
| #define JS_BUG_NULL_INDEX_PROPS 0 /* o[0] defaults to null, not void | | #elif JS_VERSION == 170 | |
| */ | | | |
| #define JS_BUG_EMPTY_INDEX_ZERO 0 /* o[""] is equivalent to o[0] */ | | | |
| #define JS_BUG_EAGER_TOSTRING 0 /* o.toString() trumps o.valueOf() | | | |
| */ | | | |
| #define JS_BUG_VOID_TOSTRING 0 /* void 0 + 0 == "undefined0" */ | | | |
| #define JS_BUG_EVAL_THIS_FUN 0 /* eval('this') in function f is f | | | |
| */ | | | |
| #define JS_BUG_EVAL_THIS_SCOPE 0 /* Math.eval('sin(x)') vs. local x | | | |
| */ | | | |
| #define JS_BUG_FALLIBLE_EQOPS 0 /* fallible/intransitive equality o | | | |
| ps */ | | | |
| #define JS_BUG_FALLIBLE_TONUM 0 /* fallible ValueToNumber primitive | | | |
| */ | | | |
| #define JS_BUG_WITH_CLOSURE 0 /* with(o)function f(){} sets o.f * | | | |
| / | | | |
| | | | |
|
| #define JS_HAS_PROP_DELETE 1 /* delete o.p removes p from o */ | | | |
| #define JS_HAS_CALL_OBJECT 1 /* fun.caller is stack frame obj */ | | | |
| #define JS_HAS_LABEL_STATEMENT 1 /* has break/continue to label: */ | | | |
| #define JS_HAS_DO_WHILE_LOOP 1 /* has do {...} while (b) */ | | | |
| #define JS_HAS_SWITCH_STATEMENT 1 /* has switch (v) {case c: ...} */ | | | |
| #define JS_HAS_SOME_PERL_FUN 1 /* has array.join/reverse/sort */ | | | |
| #define JS_HAS_MORE_PERL_FUN 1 /* has array.push, str.substr, etc | | | |
| */ | | | |
| #define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. *
/ | | #define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. *
/ | |
| #define JS_HAS_PERL_SUBSTR 1 /* has str.substr */ | | #define JS_HAS_PERL_SUBSTR 1 /* has str.substr */ | |
|
| #define JS_HAS_VALUEOF_HINT 1 /* valueOf(hint) where hint is type | | | |
| of */ | | | |
| #define JS_HAS_LEXICAL_CLOSURE 1 /* nested functions, lexically clos | | | |
| ed */ | | | |
| #define JS_HAS_APPLY_FUNCTION 1 /* has apply(fun, arg1, ... argN) * | | | |
| / | | | |
| #define JS_HAS_CALL_FUNCTION 1 /* has fun.call(obj, arg1, ... argN | | | |
| ) */ | | | |
| #define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ | | #define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ | |
|
| #define JS_HAS_REGEXPS 1 /* has perl r.e.s via RegExp, /pat/ | | | |
| */ | | | |
| #define JS_HAS_SEQUENCE_OPS 1 /* has array.slice, string.concat * | | | |
| / | | | |
| #define JS_HAS_INITIALIZERS 1 /* has var o = {'foo': 42, 'bar':3} | | | |
| */ | | | |
| #define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ | | #define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ | |
| #define JS_HAS_EXPORT_IMPORT 1 /* has export fun; import obj.fun *
/ | | #define JS_HAS_EXPORT_IMPORT 1 /* has export fun; import obj.fun *
/ | |
| #define JS_HAS_EVAL_THIS_SCOPE 1 /* Math.eval is same as with (Math)
*/ | | #define JS_HAS_EVAL_THIS_SCOPE 1 /* Math.eval is same as with (Math)
*/ | |
|
| #define JS_HAS_TRIPLE_EQOPS 1 /* has === and !== identity eqops *
/ | | | |
| #define JS_HAS_SHARP_VARS 1 /* has #n=, #n# for object literals
*/ | | #define JS_HAS_SHARP_VARS 1 /* has #n=, #n# for object literals
*/ | |
|
| #define JS_HAS_REPLACE_LAMBDA 1 /* has string.replace(re, lambda) *
/ | | | |
| #define JS_HAS_SCRIPT_OBJECT 1 /* has (new Script("x++")).exec() *
/ | | #define JS_HAS_SCRIPT_OBJECT 1 /* has (new Script("x++")).exec() *
/ | |
| #define JS_HAS_XDR 1 /* has XDR API and internal support
*/ | | #define JS_HAS_XDR 1 /* has XDR API and internal support
*/ | |
| #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho
ds */ | | #define JS_HAS_XDR_FREEZE_THAW 0 /* has XDR freeze/thaw script metho
ds */ | |
|
| #define JS_HAS_EXCEPTIONS 1 /* has exception handling */ | | | |
| #define JS_HAS_UNDEFINED 1 /* has global "undefined" property | | | |
| */ | | | |
| #define JS_HAS_TOSOURCE 1 /* has Object/Array toSource method
*/ | | #define JS_HAS_TOSOURCE 1 /* has Object/Array toSource method
*/ | |
|
| #define JS_HAS_IN_OPERATOR 1 /* has in operator ('p' in {p:1}) * | | | |
| / | | | |
| #define JS_HAS_INSTANCEOF 1 /* has {p:1} instanceof Object */ | | | |
| #define JS_HAS_ARGS_OBJECT 1 /* has minimal ECMA arguments objec | | | |
| t */ | | | |
| #define JS_HAS_DEBUGGER_KEYWORD 1 /* has hook for debugger keyword */ | | #define JS_HAS_DEBUGGER_KEYWORD 1 /* has hook for debugger keyword */ | |
|
| #define JS_HAS_ERROR_EXCEPTIONS 1 /* rt errors reflected as exception
s */ | | | |
| #define JS_HAS_CATCH_GUARD 1 /* has exception handling catch gua
rd */ | | #define JS_HAS_CATCH_GUARD 1 /* has exception handling catch gua
rd */ | |
|
| #define JS_HAS_NEW_OBJ_METHODS 1 /* has Object.prototype query metho
ds */ | | | |
| #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele
ms */ | | #define JS_HAS_SPARSE_ARRAYS 0 /* array methods preserve empty ele
ms */ | |
|
| #define JS_HAS_DFLT_MSG_STRINGS 1 /* provides English error messages | | | |
| */ | | | |
| #define JS_HAS_NUMBER_FORMATS 1 /* numbers have formatting methods | | | |
| */ | | | |
| #define JS_HAS_GETTER_SETTER 1 /* has JS2 getter/setter functions
*/ | | #define JS_HAS_GETTER_SETTER 1 /* has JS2 getter/setter functions
*/ | |
| #define JS_HAS_UNEVAL 1 /* has uneval() top-level function
*/ | | #define JS_HAS_UNEVAL 1 /* has uneval() top-level function
*/ | |
| #define JS_HAS_CONST 1 /* has JS2 const as alternative var
*/ | | #define JS_HAS_CONST 1 /* has JS2 const as alternative var
*/ | |
| #define JS_HAS_FUN_EXPR_STMT 1 /* has function expression statemen
t */ | | #define JS_HAS_FUN_EXPR_STMT 1 /* has function expression statemen
t */ | |
| #define JS_HAS_LVALUE_RETURN 1 /* has o.item(i) = j; for native it
em */ | | #define JS_HAS_LVALUE_RETURN 1 /* has o.item(i) = j; for native it
em */ | |
| #define JS_HAS_NO_SUCH_METHOD 1 /* has o.__noSuchMethod__ handler *
/ | | #define JS_HAS_NO_SUCH_METHOD 1 /* has o.__noSuchMethod__ handler *
/ | |
|
| | | #define JS_HAS_XML_SUPPORT 1 /* has ECMAScript for XML support * | |
| | | / | |
| | | #define JS_HAS_ARRAY_EXTRAS 1 /* has indexOf and Lispy extras */ | |
| | | #define JS_HAS_GENERATORS 1 /* has yield in generator function | |
| | | */ | |
| | | #define JS_HAS_BLOCK_SCOPE 1 /* has block scope via let/arraycom | |
| | | p */ | |
| | | #define JS_HAS_DESTRUCTURING 1 /* has [a,b] = ... or {p:a,q:b} = . | |
| | | .. */ | |
| | | | |
| #else | | #else | |
| | | | |
| #error "unknown JS_VERSION" | | #error "unknown JS_VERSION" | |
| | | | |
| #endif | | #endif | |
|
| | | | |
| | | /* Features that are present in all versions. */ | |
| | | #define JS_HAS_RESERVED_JAVA_KEYWORDS 1 | |
| | | #define JS_HAS_RESERVED_ECMA_KEYWORDS 1 | |
| | | | |
End of changes. 50 change blocks. |
| 548 lines changed or deleted | | 82 lines changed or added | |
|
| jsdbgapi.h | | jsdbgapi.h | |
| | | | |
| skipping to change at line 56 | | skipping to change at line 56 | |
| #include "jsopcode.h" | | #include "jsopcode.h" | |
| #include "jsprvtd.h" | | #include "jsprvtd.h" | |
| | | | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
| extern void | | extern void | |
| js_PatchOpcode(JSContext *cx, JSScript *script, jsbytecode *pc, JSOp op); | | js_PatchOpcode(JSContext *cx, JSScript *script, jsbytecode *pc, JSOp op); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_SetTrap(JSContext *cx, JSScript *script, jsbytecode *pc, | | JS_SetTrap(JSContext *cx, JSScript *script, jsbytecode *pc, | |
|
| JSTrapHandler handler, void *closure); | | JSTrapHandler handler, void *closure); | |
| | | | |
| extern JS_PUBLIC_API(JSOp) | | extern JS_PUBLIC_API(JSOp) | |
| JS_GetTrapOpcode(JSContext *cx, JSScript *script, jsbytecode *pc); | | JS_GetTrapOpcode(JSContext *cx, JSScript *script, jsbytecode *pc); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_ClearTrap(JSContext *cx, JSScript *script, jsbytecode *pc, | | JS_ClearTrap(JSContext *cx, JSScript *script, jsbytecode *pc, | |
|
| JSTrapHandler *handlerp, void **closurep); | | JSTrapHandler *handlerp, void **closurep); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_ClearScriptTraps(JSContext *cx, JSScript *script); | | JS_ClearScriptTraps(JSContext *cx, JSScript *script); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_ClearAllTraps(JSContext *cx); | | JS_ClearAllTraps(JSContext *cx); | |
| | | | |
| extern JS_PUBLIC_API(JSTrapStatus) | | extern JS_PUBLIC_API(JSTrapStatus) | |
| JS_HandleTrap(JSContext *cx, JSScript *script, jsbytecode *pc, jsval *rval)
; | | JS_HandleTrap(JSContext *cx, JSScript *script, jsbytecode *pc, jsval *rval)
; | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_SetInterrupt(JSRuntime *rt, JSTrapHandler handler, void *closure); | | JS_SetInterrupt(JSRuntime *rt, JSTrapHandler handler, void *closure); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_ClearInterrupt(JSRuntime *rt, JSTrapHandler *handlerp, void **closurep); | | JS_ClearInterrupt(JSRuntime *rt, JSTrapHandler *handlerp, void **closurep); | |
| | | | |
| /************************************************************************/ | | /************************************************************************/ | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_SetWatchPoint(JSContext *cx, JSObject *obj, jsval id, | | JS_SetWatchPoint(JSContext *cx, JSObject *obj, jsval id, | |
|
| JSWatchPointHandler handler, void *closure); | | JSWatchPointHandler handler, void *closure); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_ClearWatchPoint(JSContext *cx, JSObject *obj, jsval id, | | JS_ClearWatchPoint(JSContext *cx, JSObject *obj, jsval id, | |
|
| JSWatchPointHandler *handlerp, void **closurep); | | JSWatchPointHandler *handlerp, void **closurep); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_ClearWatchPointsForObject(JSContext *cx, JSObject *obj); | | JS_ClearWatchPointsForObject(JSContext *cx, JSObject *obj); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_ClearAllWatchPoints(JSContext *cx); | | JS_ClearAllWatchPoints(JSContext *cx); | |
| | | | |
| #ifdef JS_HAS_OBJ_WATCHPOINT | | #ifdef JS_HAS_OBJ_WATCHPOINT | |
| /* | | /* | |
| * Hide these non-API function prototypes by testing whether the internal | | * Hide these non-API function prototypes by testing whether the internal | |
| * header file "jsconfig.h" has been included. | | * header file "jsconfig.h" has been included. | |
| */ | | */ | |
| extern void | | extern void | |
|
| js_MarkWatchPoints(JSRuntime *rt); | | js_MarkWatchPoints(JSContext *cx); | |
| | | | |
| extern JSScopeProperty * | | extern JSScopeProperty * | |
| js_FindWatchPoint(JSRuntime *rt, JSScope *scope, jsid id); | | js_FindWatchPoint(JSRuntime *rt, JSScope *scope, jsid id); | |
| | | | |
| extern JSPropertyOp | | extern JSPropertyOp | |
| js_GetWatchedSetter(JSRuntime *rt, JSScope *scope, | | js_GetWatchedSetter(JSRuntime *rt, JSScope *scope, | |
| const JSScopeProperty *sprop); | | const JSScopeProperty *sprop); | |
| | | | |
| extern JSBool JS_DLL_CALLBACK | | extern JSBool JS_DLL_CALLBACK | |
| js_watch_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp); | | js_watch_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp); | |
| | | | |
| skipping to change at line 134 | | skipping to change at line 134 | |
| | | | |
| extern JS_PUBLIC_API(uintN) | | extern JS_PUBLIC_API(uintN) | |
| JS_PCToLineNumber(JSContext *cx, JSScript *script, jsbytecode *pc); | | JS_PCToLineNumber(JSContext *cx, JSScript *script, jsbytecode *pc); | |
| | | | |
| extern JS_PUBLIC_API(jsbytecode *) | | extern JS_PUBLIC_API(jsbytecode *) | |
| JS_LineNumberToPC(JSContext *cx, JSScript *script, uintN lineno); | | JS_LineNumberToPC(JSContext *cx, JSScript *script, uintN lineno); | |
| | | | |
| extern JS_PUBLIC_API(JSScript *) | | extern JS_PUBLIC_API(JSScript *) | |
| JS_GetFunctionScript(JSContext *cx, JSFunction *fun); | | JS_GetFunctionScript(JSContext *cx, JSFunction *fun); | |
| | | | |
|
| | | extern JS_PUBLIC_API(JSNative) | |
| | | JS_GetFunctionNative(JSContext *cx, JSFunction *fun); | |
| | | | |
| extern JS_PUBLIC_API(JSPrincipals *) | | extern JS_PUBLIC_API(JSPrincipals *) | |
| JS_GetScriptPrincipals(JSContext *cx, JSScript *script); | | JS_GetScriptPrincipals(JSContext *cx, JSScript *script); | |
| | | | |
| /* | | /* | |
| * Stack Frame Iterator | | * Stack Frame Iterator | |
| * | | * | |
| * Used to iterate through the JS stack frames to extract | | * Used to iterate through the JS stack frames to extract | |
| * information from the frames. | | * information from the frames. | |
| */ | | */ | |
| | | | |
| | | | |
| skipping to change at line 167 | | skipping to change at line 170 | |
| JS_GetScriptedCaller(JSContext *cx, JSStackFrame *fp); | | JS_GetScriptedCaller(JSContext *cx, JSStackFrame *fp); | |
| | | | |
| /* | | /* | |
| * Return a weak reference to fp's principals. A null return does not deno
te | | * Return a weak reference to fp's principals. A null return does not deno
te | |
| * an error, it means there are no principals. | | * an error, it means there are no principals. | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSPrincipals *) | | extern JS_PUBLIC_API(JSPrincipals *) | |
| JS_StackFramePrincipals(JSContext *cx, JSStackFrame *fp); | | JS_StackFramePrincipals(JSContext *cx, JSStackFrame *fp); | |
| | | | |
| /* | | /* | |
|
| * Like JS_StackFramePrincipals(cx, caller), but if cx->findObjectPrincipal | | * This API is like JS_StackFramePrincipals(cx, caller), except that if | |
| s | | * cx->runtime->findObjectPrincipals is non-null, it returns the weaker of | |
| * is non-null, return the object principals for fp's callee function objec | | * the caller's principals and the object principals of fp's callee functio | |
| t | | n | |
| * (fp->argv[-2]), which is eval, Function, or a similar eval-like method. | | * object (fp->argv[-2]), which is eval, Function, or a similar eval-like | |
| * The caller parameter should be the result of JS_GetScriptedCaller(cx, fp | | * method. The caller parameter should be JS_GetScriptedCaller(cx, fp). | |
| ). | | | |
| * | | * | |
| * All eval-like methods must use JS_EvalFramePrincipals to acquire a weak | | * All eval-like methods must use JS_EvalFramePrincipals to acquire a weak | |
| * reference to the correct principals for the eval call to be secure, give
n | | * reference to the correct principals for the eval call to be secure, give
n | |
| * an embedding that calls JS_SetObjectPrincipalsFinder (see jsapi.h). | | * an embedding that calls JS_SetObjectPrincipalsFinder (see jsapi.h). | |
| */ | | */ | |
| extern JS_PUBLIC_API(JSPrincipals *) | | extern JS_PUBLIC_API(JSPrincipals *) | |
| JS_EvalFramePrincipals(JSContext *cx, JSStackFrame *fp, JSStackFrame *calle
r); | | JS_EvalFramePrincipals(JSContext *cx, JSStackFrame *fp, JSStackFrame *calle
r); | |
| | | | |
| extern JS_PUBLIC_API(void *) | | extern JS_PUBLIC_API(void *) | |
| JS_GetFrameAnnotation(JSContext *cx, JSStackFrame *fp); | | JS_GetFrameAnnotation(JSContext *cx, JSStackFrame *fp); | |
| | | | |
| skipping to change at line 224 | | skipping to change at line 228 | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_IsDebuggerFrame(JSContext *cx, JSStackFrame *fp); | | JS_IsDebuggerFrame(JSContext *cx, JSStackFrame *fp); | |
| | | | |
| extern JS_PUBLIC_API(jsval) | | extern JS_PUBLIC_API(jsval) | |
| JS_GetFrameReturnValue(JSContext *cx, JSStackFrame *fp); | | JS_GetFrameReturnValue(JSContext *cx, JSStackFrame *fp); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_SetFrameReturnValue(JSContext *cx, JSStackFrame *fp, jsval rval); | | JS_SetFrameReturnValue(JSContext *cx, JSStackFrame *fp, jsval rval); | |
| | | | |
|
| | | /** | |
| | | * Return fp's callee function object (fp->argv[-2]) if it has one. | |
| | | */ | |
| | | extern JS_PUBLIC_API(JSObject *) | |
| | | JS_GetFrameCalleeObject(JSContext *cx, JSStackFrame *fp); | |
| | | | |
| /************************************************************************/ | | /************************************************************************/ | |
| | | | |
| extern JS_PUBLIC_API(const char *) | | extern JS_PUBLIC_API(const char *) | |
| JS_GetScriptFilename(JSContext *cx, JSScript *script); | | JS_GetScriptFilename(JSContext *cx, JSScript *script); | |
| | | | |
| extern JS_PUBLIC_API(uintN) | | extern JS_PUBLIC_API(uintN) | |
| JS_GetScriptBaseLineNumber(JSContext *cx, JSScript *script); | | JS_GetScriptBaseLineNumber(JSContext *cx, JSScript *script); | |
| | | | |
| extern JS_PUBLIC_API(uintN) | | extern JS_PUBLIC_API(uintN) | |
| JS_GetScriptLineExtent(JSContext *cx, JSScript *script); | | JS_GetScriptLineExtent(JSContext *cx, JSScript *script); | |
| | | | |
| skipping to change at line 253 | | skipping to change at line 263 | |
| * synonyms. | | * synonyms. | |
| */ | | */ | |
| #define JS_SetNewScriptHook JS_SetNewScriptHookProc | | #define JS_SetNewScriptHook JS_SetNewScriptHookProc | |
| #define JS_SetDestroyScriptHook JS_SetDestroyScriptHookProc | | #define JS_SetDestroyScriptHook JS_SetDestroyScriptHookProc | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_SetNewScriptHook(JSRuntime *rt, JSNewScriptHook hook, void *callerdata); | | JS_SetNewScriptHook(JSRuntime *rt, JSNewScriptHook hook, void *callerdata); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_SetDestroyScriptHook(JSRuntime *rt, JSDestroyScriptHook hook, | | JS_SetDestroyScriptHook(JSRuntime *rt, JSDestroyScriptHook hook, | |
|
| void *callerdata); | | void *callerdata); | |
| | | | |
| /************************************************************************/ | | /************************************************************************/ | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_EvaluateUCInStackFrame(JSContext *cx, JSStackFrame *fp, | | JS_EvaluateUCInStackFrame(JSContext *cx, JSStackFrame *fp, | |
|
| const jschar *bytes, uintN length, | | const jschar *chars, uintN length, | |
| const char *filename, uintN lineno, | | const char *filename, uintN lineno, | |
| jsval *rval); | | jsval *rval); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_EvaluateInStackFrame(JSContext *cx, JSStackFrame *fp, | | JS_EvaluateInStackFrame(JSContext *cx, JSStackFrame *fp, | |
|
| const char *bytes, uintN length, | | const char *bytes, uintN length, | |
| const char *filename, uintN lineno, | | const char *filename, uintN lineno, | |
| jsval *rval); | | jsval *rval); | |
| | | | |
| /************************************************************************/ | | /************************************************************************/ | |
| | | | |
| typedef struct JSPropertyDesc { | | typedef struct JSPropertyDesc { | |
| jsval id; /* primary id, a string or int */ | | jsval id; /* primary id, a string or int */ | |
| jsval value; /* property value */ | | jsval value; /* property value */ | |
| uint8 flags; /* flags, see below */ | | uint8 flags; /* flags, see below */ | |
| uint8 spare; /* unused */ | | uint8 spare; /* unused */ | |
| uint16 slot; /* argument/variable slot */ | | uint16 slot; /* argument/variable slot */ | |
| jsval alias; /* alias id if JSPD_ALIAS flag */ | | jsval alias; /* alias id if JSPD_ALIAS flag */ | |
| | | | |
| skipping to change at line 301 | | skipping to change at line 311 | |
| typedef struct JSPropertyDescArray { | | typedef struct JSPropertyDescArray { | |
| uint32 length; /* number of elements in array */ | | uint32 length; /* number of elements in array */ | |
| JSPropertyDesc *array; /* alloc'd by Get, freed by Put */ | | JSPropertyDesc *array; /* alloc'd by Get, freed by Put */ | |
| } JSPropertyDescArray; | | } JSPropertyDescArray; | |
| | | | |
| extern JS_PUBLIC_API(JSScopeProperty *) | | extern JS_PUBLIC_API(JSScopeProperty *) | |
| JS_PropertyIterator(JSObject *obj, JSScopeProperty **iteratorp); | | JS_PropertyIterator(JSObject *obj, JSScopeProperty **iteratorp); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_GetPropertyDesc(JSContext *cx, JSObject *obj, JSScopeProperty *sprop, | | JS_GetPropertyDesc(JSContext *cx, JSObject *obj, JSScopeProperty *sprop, | |
|
| JSPropertyDesc *pd); | | JSPropertyDesc *pd); | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| JS_GetPropertyDescArray(JSContext *cx, JSObject *obj, JSPropertyDescArray *
pda); | | JS_GetPropertyDescArray(JSContext *cx, JSObject *obj, JSPropertyDescArray *
pda); | |
| | | | |
| extern JS_PUBLIC_API(void) | | extern JS_PUBLIC_API(void) | |
| JS_PutPropertyDescArray(JSContext *cx, JSPropertyDescArray *pda); | | JS_PutPropertyDescArray(JSContext *cx, JSPropertyDescArray *pda); | |
| | | | |
| /************************************************************************/ | | /************************************************************************/ | |
| | | | |
| extern JS_PUBLIC_API(JSBool) | | extern JS_PUBLIC_API(JSBool) | |
| | | | |
| skipping to change at line 343 | | skipping to change at line 353 | |
| | | | |
| extern JS_PUBLIC_API(size_t) | | extern JS_PUBLIC_API(size_t) | |
| JS_GetObjectTotalSize(JSContext *cx, JSObject *obj); | | JS_GetObjectTotalSize(JSContext *cx, JSObject *obj); | |
| | | | |
| extern JS_PUBLIC_API(size_t) | | extern JS_PUBLIC_API(size_t) | |
| JS_GetFunctionTotalSize(JSContext *cx, JSFunction *fun); | | JS_GetFunctionTotalSize(JSContext *cx, JSFunction *fun); | |
| | | | |
| extern JS_PUBLIC_API(size_t) | | extern JS_PUBLIC_API(size_t) | |
| JS_GetScriptTotalSize(JSContext *cx, JSScript *script); | | JS_GetScriptTotalSize(JSContext *cx, JSScript *script); | |
| | | | |
|
| | | /* | |
| | | * Get the top-most running script on cx starting from fp, or from the top | |
| | | of | |
| | | * cx's frame stack if fp is null, and return its script filename flags. I | |
| | | f | |
| | | * the script has a null filename member, return JSFILENAME_NULL. | |
| | | */ | |
| | | extern JS_PUBLIC_API(uint32) | |
| | | JS_GetTopScriptFilenameFlags(JSContext *cx, JSStackFrame *fp); | |
| | | | |
| | | /* | |
| | | * Get the script filename flags for the script. If the script doesn't hav | |
| | | e a | |
| | | * filename, return JSFILENAME_NULL. | |
| | | */ | |
| | | extern JS_PUBLIC_API(uint32) | |
| | | JS_GetScriptFilenameFlags(JSScript *script); | |
| | | | |
| | | /* | |
| | | * Associate flags with a script filename prefix in rt, so that any subsequ | |
| | | ent | |
| | | * script compilation will inherit those flags if the script's filename is | |
| | | the | |
| | | * same as prefix, or if prefix is a substring of the script's filename. | |
| | | * | |
| | | * The API defines only one flag bit, JSFILENAME_SYSTEM, leaving the remain | |
| | | ing | |
| | | * 31 bits up to the API client to define. The union of all 32 bits must n | |
| | | ot | |
| | | * be a legal combination, however, in order to preserve JSFILENAME_NULL as | |
| | | a | |
| | | * unique value. API clients may depend on JSFILENAME_SYSTEM being a set b | |
| | | it | |
| | | * in JSFILENAME_NULL -- a script with a null filename member is presumed t | |
| | | o | |
| | | * be a "system" script. | |
| | | */ | |
| | | extern JS_PUBLIC_API(JSBool) | |
| | | JS_FlagScriptFilenamePrefix(JSRuntime *rt, const char *prefix, uint32 flags | |
| | | ); | |
| | | | |
| | | #define JSFILENAME_NULL 0xffffffff /* null script filename */ | |
| | | #define JSFILENAME_SYSTEM 0x00000001 /* "system" script, see bel | |
| | | ow */ | |
| | | | |
| | | /* | |
| | | * Return true if obj is a "system" object, that is, one flagged by a prior | |
| | | * call to JS_FlagSystemObject(cx, obj). What "system" means is up to the | |
| | | API | |
| | | * client, but it can be used to coordinate access control policies based o | |
| | | n | |
| | | * script filenames and their prefixes, using JS_FlagScriptFilenamePrefix a | |
| | | nd | |
| | | * JS_GetTopScriptFilenameFlags. | |
| | | */ | |
| | | extern JS_PUBLIC_API(JSBool) | |
| | | JS_IsSystemObject(JSContext *cx, JSObject *obj); | |
| | | | |
| | | /* | |
| | | * Flag obj as a "system" object. The API client can flag system objects t | |
| | | o | |
| | | * optimize access control checks. The engine stores but does not interpre | |
| | | t | |
| | | * the per-object flag set by this call. | |
| | | */ | |
| | | extern JS_PUBLIC_API(void) | |
| | | JS_FlagSystemObject(JSContext *cx, JSObject *obj); | |
| | | | |
| JS_END_EXTERN_C | | JS_END_EXTERN_C | |
| | | | |
| #endif /* jsdbgapi_h___ */ | | #endif /* jsdbgapi_h___ */ | |
| | | | |
End of changes. 13 change blocks. |
| 18 lines changed or deleted | | 94 lines changed or added | |
|
| jsemit.h | | jsemit.h | |
| /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- | | /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- | |
|
| | | * vim: set ts=8 sw=4 et tw=78: | |
| * | | * | |
| * ***** BEGIN LICENSE BLOCK ***** | | * ***** BEGIN LICENSE BLOCK ***** | |
| * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | |
| * | | * | |
| * The contents of this file are subject to the Mozilla Public License Vers
ion | | * The contents of this file are subject to the Mozilla Public License Vers
ion | |
| * 1.1 (the "License"); you may not use this file except in compliance with | | * 1.1 (the "License"); you may not use this file except in compliance with | |
| * the License. You may obtain a copy of the License at | | * the License. You may obtain a copy of the License at | |
| * http://www.mozilla.org/MPL/ | | * http://www.mozilla.org/MPL/ | |
| * | | * | |
| * Software distributed under the License is distributed on an "AS IS" basi
s, | | * Software distributed under the License is distributed on an "AS IS" basi
s, | |
| | | | |
| skipping to change at line 56 | | skipping to change at line 57 | |
| #include "jsstddef.h" | | #include "jsstddef.h" | |
| #include "jstypes.h" | | #include "jstypes.h" | |
| #include "jsatom.h" | | #include "jsatom.h" | |
| #include "jsopcode.h" | | #include "jsopcode.h" | |
| #include "jsprvtd.h" | | #include "jsprvtd.h" | |
| #include "jspubtd.h" | | #include "jspubtd.h" | |
| | | | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
| /* | | /* | |
|
| * NB: If you add non-loop STMT_* enumerators, do so before STMT_DO_LOOP or | | * NB: If you add enumerators for scope statements, add them between STMT_W | |
| * you will break the STMT_IS_LOOP macro, just below this enum. | | ITH | |
| | | * and STMT_CATCH, or you will break the STMT_TYPE_IS_SCOPE macro. If you | |
| | | add | |
| | | * non-looping statement enumerators, add them before STMT_DO_LOOP or you w | |
| | | ill | |
| | | * break the STMT_TYPE_IS_LOOP macro. | |
| | | * | |
| | | * Also remember to keep the statementName array in jsemit.c in sync. | |
| */ | | */ | |
| typedef enum JSStmtType { | | typedef enum JSStmtType { | |
|
| STMT_BLOCK = 0, /* compound statement: { s1[;... sN] } */ | | STMT_LABEL, /* labeled statement: L: s */ | |
| STMT_LABEL = 1, /* labeled statement: L: s */ | | STMT_IF, /* if (then) statement */ | |
| STMT_IF = 2, /* if (then) statement */ | | STMT_ELSE, /* else clause of if statement */ | |
| STMT_ELSE = 3, /* else clause of if statement */ | | STMT_BODY, /* synthetic body of function with | |
| STMT_SWITCH = 4, /* switch statement */ | | destructuring formal parameters */ | |
| STMT_WITH = 5, /* with statement */ | | STMT_BLOCK, /* compound statement: { s1[;... sN] } */ | |
| STMT_TRY = 6, /* try statement */ | | STMT_SWITCH, /* switch statement */ | |
| STMT_CATCH = 7, /* catch block */ | | STMT_WITH, /* with statement */ | |
| STMT_FINALLY = 8, /* finally statement */ | | STMT_CATCH, /* catch block */ | |
| STMT_SUBROUTINE = 9, /* gosub-target subroutine body */ | | STMT_TRY, /* try block */ | |
| STMT_DO_LOOP = 10, /* do/while loop statement */ | | STMT_FINALLY, /* finally block */ | |
| STMT_FOR_LOOP = 11, /* for loop statement */ | | STMT_SUBROUTINE, /* gosub-target subroutine body */ | |
| STMT_FOR_IN_LOOP = 12, /* for/in loop statement */ | | STMT_DO_LOOP, /* do/while loop statement */ | |
| STMT_WHILE_LOOP = 13 /* while loop statement */ | | STMT_FOR_LOOP, /* for loop statement */ | |
| | | STMT_FOR_IN_LOOP, /* for/in loop statement */ | |
| | | STMT_WHILE_LOOP /* while loop statement */ | |
| } JSStmtType; | | } JSStmtType; | |
| | | | |
|
| #define STMT_IS_LOOP(stmt) ((stmt)->type >= STMT_DO_LOOP) | | #define STMT_TYPE_IN_RANGE(t,b,e) ((uint)((t) - (b)) <= (uintN)((e) - (b))) | |
| | | | |
| | | /* | |
| | | * A comment on the encoding of the JSStmtType enum and type-testing macros | |
| | | : | |
| | | * | |
| | | * STMT_TYPE_MAYBE_SCOPE tells whether a statement type is always, or may | |
| | | * become, a lexical scope. It therefore includes block and switch (the tw | |
| | | o | |
| | | * low-numbered "maybe" scope types) and excludes with (with has dynamic sc | |
| | | ope | |
| | | * pending the "reformed with" in ES4/JS2). It includes all try-catch-fina | |
| | | lly | |
| | | * types, which are high-numbered maybe-scope types. | |
| | | * | |
| | | * STMT_TYPE_LINKS_SCOPE tells whether a JSStmtInfo of the given type eager | |
| | | ly | |
| | | * links to other scoping statement info records. It excludes the two earl | |
| | | y | |
| | | * "maybe" types, block and switch, as well as the try and both finally typ | |
| | | es, | |
| | | * since try and the other trailing maybe-scope types don't need block scop | |
| | | e | |
| | | * unless they contain let declarations. | |
| | | * | |
| | | * We treat with as a static scope because it prevents lexical binding from | |
| | | * continuing further up the static scope chain. With the "reformed with" | |
| | | * proposal for JS2, we'll be able to model it statically, too. | |
| | | */ | |
| | | #define STMT_TYPE_MAYBE_SCOPE(type) | |
| | | \ | |
| | | (type != STMT_WITH && | |
| | | \ | |
| | | STMT_TYPE_IN_RANGE(type, STMT_BLOCK, STMT_SUBROUTINE)) | |
| | | | |
| | | #define STMT_TYPE_LINKS_SCOPE(type) | |
| | | \ | |
| | | STMT_TYPE_IN_RANGE(type, STMT_WITH, STMT_CATCH) | |
| | | | |
| | | #define STMT_TYPE_IS_TRYING(type) | |
| | | \ | |
| | | STMT_TYPE_IN_RANGE(type, STMT_TRY, STMT_SUBROUTINE) | |
| | | | |
| | | #define STMT_TYPE_IS_LOOP(type) ((type) >= STMT_DO_LOOP) | |
| | | | |
| | | #define STMT_MAYBE_SCOPE(stmt) STMT_TYPE_MAYBE_SCOPE((stmt)->type) | |
| | | #define STMT_LINKS_SCOPE(stmt) (STMT_TYPE_LINKS_SCOPE((stmt)->type) || | |
| | | \ | |
| | | ((stmt)->flags & SIF_SCOPE)) | |
| | | #define STMT_IS_TRYING(stmt) STMT_TYPE_IS_TRYING((stmt)->type) | |
| | | #define STMT_IS_LOOP(stmt) STMT_TYPE_IS_LOOP((stmt)->type) | |
| | | | |
| typedef struct JSStmtInfo JSStmtInfo; | | typedef struct JSStmtInfo JSStmtInfo; | |
| | | | |
| struct JSStmtInfo { | | struct JSStmtInfo { | |
|
| JSStmtType type; /* statement type */ | | uint16 type; /* statement type */ | |
| | | uint16 flags; /* flags, see below */ | |
| ptrdiff_t update; /* loop update offset (top if none) */ | | ptrdiff_t update; /* loop update offset (top if none) */ | |
| ptrdiff_t breaks; /* offset of last break in loop */ | | ptrdiff_t breaks; /* offset of last break in loop */ | |
| ptrdiff_t continues; /* offset of last continue in loop */ | | ptrdiff_t continues; /* offset of last continue in loop */ | |
|
| ptrdiff_t gosub; /* offset of last GOSUB for this finall | | JSAtom *atom; /* name of LABEL, or block scope object | |
| y */ | | */ | |
| ptrdiff_t catchJump; /* offset of last end-of-catch jump */ | | | |
| JSAtom *label; /* name of LABEL or CATCH var */ | | | |
| JSStmtInfo *down; /* info for enclosing statement */ | | JSStmtInfo *down; /* info for enclosing statement */ | |
|
| | | JSStmtInfo *downScope; /* next enclosing lexical scope */ | |
| }; | | }; | |
| | | | |
|
| | | #define SIF_SCOPE 0x0001 /* statement has its own lexical scope | |
| | | */ | |
| | | #define SIF_BODY_BLOCK 0x0002 /* STMT_BLOCK type is a function body * | |
| | | / | |
| | | | |
| | | /* | |
| | | * To reuse space in JSStmtInfo, rename breaks and continues for use during | |
| | | * try/catch/finally code generation and backpatching. To match most commo | |
| | | n | |
| | | * use cases, the macro argument is a struct, not a struct pointer. Only a | |
| | | * loop, switch, or label statement info record can have breaks and continu | |
| | | es, | |
| | | * and only a for loop has an update backpatch chain, so it's safe to overl | |
| | | ay | |
| | | * these for the "trying" JSStmtTypes. | |
| | | */ | |
| | | #define CATCHNOTE(stmt) ((stmt).update) | |
| | | #define GOSUBS(stmt) ((stmt).breaks) | |
| | | #define GUARDJUMP(stmt) ((stmt).continues) | |
| | | | |
| | | #define AT_TOP_LEVEL(tc) | |
| | | \ | |
| | | (!(tc)->topStmt || ((tc)->topStmt->flags & SIF_BODY_BLOCK)) | |
| | | | |
| #define SET_STATEMENT_TOP(stmt, top)
\ | | #define SET_STATEMENT_TOP(stmt, top)
\ | |
|
| ((stmt)->update = (top), (stmt)->breaks = | | ((stmt)->update = (top), (stmt)->breaks = (stmt)->continues = (-1)) | |
| \ | | | |
| (stmt)->continues = (stmt)->catchJump = (stmt)->gosub = (-1)) | | | |
| | | | |
| struct JSTreeContext { /* tree context for semantic checks */ | | struct JSTreeContext { /* tree context for semantic checks */ | |
| uint16 flags; /* statement state flags, see below */ | | uint16 flags; /* statement state flags, see below */ | |
| uint16 numGlobalVars; /* max. no. of global variables/regexps
*/ | | uint16 numGlobalVars; /* max. no. of global variables/regexps
*/ | |
| uint32 tryCount; /* total count of try statements parsed
*/ | | uint32 tryCount; /* total count of try statements parsed
*/ | |
| uint32 globalUses; /* optimizable global var uses in total
*/ | | uint32 globalUses; /* optimizable global var uses in total
*/ | |
| uint32 loopyGlobalUses;/* optimizable global var uses in loops
*/ | | uint32 loopyGlobalUses;/* optimizable global var uses in loops
*/ | |
| JSStmtInfo *topStmt; /* top of statement info stack */ | | JSStmtInfo *topStmt; /* top of statement info stack */ | |
|
| | | JSStmtInfo *topScopeStmt; /* top lexical scope statement */ | |
| | | JSObject *blockChain; /* compile time block scope chain (NB: | |
| | | one | |
| | | deeper than the topScopeStmt/downSco | |
| | | pe | |
| | | chain when in head of let block/expr | |
| | | ) */ | |
| | | JSParseNode *blockNode; /* parse node for a lexical scope. | |
| | | XXX combine with blockChain? */ | |
| JSAtomList decls; /* function, const, and var declaration
s */ | | JSAtomList decls; /* function, const, and var declaration
s */ | |
| JSParseNode *nodeList; /* list of recyclable parse-node struct
s */ | | JSParseNode *nodeList; /* list of recyclable parse-node struct
s */ | |
| }; | | }; | |
| | | | |
| #define TCF_COMPILING 0x01 /* generating bytecode; this tc is a cg
*/ | | #define TCF_COMPILING 0x01 /* generating bytecode; this tc is a cg
*/ | |
| #define TCF_IN_FUNCTION 0x02 /* parsing inside function body */ | | #define TCF_IN_FUNCTION 0x02 /* parsing inside function body */ | |
| #define TCF_RETURN_EXPR 0x04 /* function has 'return expr;' */ | | #define TCF_RETURN_EXPR 0x04 /* function has 'return expr;' */ | |
| #define TCF_RETURN_VOID 0x08 /* function has 'return;' */ | | #define TCF_RETURN_VOID 0x08 /* function has 'return;' */ | |
|
| | | #define TCF_RETURN_FLAGS 0x0C /* propagate these out of blocks */ | |
| #define TCF_IN_FOR_INIT 0x10 /* parsing init expr of for; exclude 'i
n' */ | | #define TCF_IN_FOR_INIT 0x10 /* parsing init expr of for; exclude 'i
n' */ | |
| #define TCF_FUN_CLOSURE_VS_VAR 0x20 /* function and var with same name */ | | #define TCF_FUN_CLOSURE_VS_VAR 0x20 /* function and var with same name */ | |
| #define TCF_FUN_USES_NONLOCALS 0x40 /* function refers to non-local names *
/ | | #define TCF_FUN_USES_NONLOCALS 0x40 /* function refers to non-local names *
/ | |
| #define TCF_FUN_HEAVYWEIGHT 0x80 /* function needs Call object per call
*/ | | #define TCF_FUN_HEAVYWEIGHT 0x80 /* function needs Call object per call
*/ | |
|
| #define TCF_FUN_FLAGS 0xE0 /* flags to propagate from FunctionBody | | #define TCF_FUN_IS_GENERATOR 0x100 /* parsed yield statement in function * | |
| */ | | / | |
| | | #define TCF_FUN_FLAGS 0x1E0 /* flags to propagate from FunctionBody | |
| | | */ | |
| | | #define TCF_HAS_DEFXMLNS 0x200 /* default xml namespace = ...; parsed | |
| | | */ | |
| | | #define TCF_HAS_FUNCTION_STMT 0x400 /* block contains a function statement | |
| | | */ | |
| | | | |
| #define TREE_CONTEXT_INIT(tc)
\ | | #define TREE_CONTEXT_INIT(tc)
\ | |
| ((tc)->flags = (tc)->numGlobalVars = 0,
\ | | ((tc)->flags = (tc)->numGlobalVars = 0,
\ | |
| (tc)->tryCount = (tc)->globalUses = (tc)->loopyGlobalUses = 0,
\ | | (tc)->tryCount = (tc)->globalUses = (tc)->loopyGlobalUses = 0,
\ | |
|
| (tc)->topStmt = NULL, ATOM_LIST_INIT(&(tc)->decls), | | (tc)->topStmt = (tc)->topScopeStmt = NULL, | |
| \ | | \ | |
| (tc)->nodeList = NULL) | | (tc)->blockChain = NULL, | |
| | | \ | |
| | | ATOM_LIST_INIT(&(tc)->decls), | |
| | | \ | |
| | | (tc)->nodeList = NULL, (tc)->blockNode = NULL) | |
| | | | |
| #define TREE_CONTEXT_FINISH(tc)
\ | | #define TREE_CONTEXT_FINISH(tc)
\ | |
| ((void)0) | | ((void)0) | |
| | | | |
| /* | | /* | |
| * Span-dependent instructions are jumps whose span (from the jump bytecode
to | | * Span-dependent instructions are jumps whose span (from the jump bytecode
to | |
| * the jump target) may require 2 or 4 bytes of immediate operand. | | * the jump target) may require 2 or 4 bytes of immediate operand. | |
| */ | | */ | |
| typedef struct JSSpanDep JSSpanDep; | | typedef struct JSSpanDep JSSpanDep; | |
| typedef struct JSJumpTarget JSJumpTarget; | | typedef struct JSJumpTarget JSJumpTarget; | |
| | | | |
| skipping to change at line 175 | | skipping to change at line 248 | |
| #define JT_CLR_TAG(jt) ((JSJumpTarget *)((jsword)(jt) & ~JT_TAG_BI
T)) | | #define JT_CLR_TAG(jt) ((JSJumpTarget *)((jsword)(jt) & ~JT_TAG_BI
T)) | |
| #define JT_HAS_TAG(jt) ((jsword)(jt) & JT_TAG_BIT) | | #define JT_HAS_TAG(jt) ((jsword)(jt) & JT_TAG_BIT) | |
| | | | |
| #define BITS_PER_PTRDIFF (sizeof(ptrdiff_t) * JS_BITS_PER_BYTE) | | #define BITS_PER_PTRDIFF (sizeof(ptrdiff_t) * JS_BITS_PER_BYTE) | |
| #define BITS_PER_BPDELTA (BITS_PER_PTRDIFF - 1 - JT_UNTAG_SHIFT) | | #define BITS_PER_BPDELTA (BITS_PER_PTRDIFF - 1 - JT_UNTAG_SHIFT) | |
| #define BPDELTA_MAX (((ptrdiff_t)1 << BITS_PER_BPDELTA) - 1) | | #define BPDELTA_MAX (((ptrdiff_t)1 << BITS_PER_BPDELTA) - 1) | |
| #define BPDELTA_TO_JT(bp) ((JSJumpTarget *)((bp) << JT_UNTAG_SHIFT)) | | #define BPDELTA_TO_JT(bp) ((JSJumpTarget *)((bp) << JT_UNTAG_SHIFT)) | |
| #define JT_TO_BPDELTA(jt) ((ptrdiff_t)((jsword)(jt) >> JT_UNTAG_SHIFT
)) | | #define JT_TO_BPDELTA(jt) ((ptrdiff_t)((jsword)(jt) >> JT_UNTAG_SHIFT
)) | |
| | | | |
| #define SD_SET_TARGET(sd,jt) ((sd)->target = JT_SET_TAG(jt)) | | #define SD_SET_TARGET(sd,jt) ((sd)->target = JT_SET_TAG(jt)) | |
|
| | | #define SD_GET_TARGET(sd) (JS_ASSERT(JT_HAS_TAG((sd)->target)), | |
| | | \ | |
| | | JT_CLR_TAG((sd)->target)) | |
| #define SD_SET_BPDELTA(sd,bp) ((sd)->target = BPDELTA_TO_JT(bp)) | | #define SD_SET_BPDELTA(sd,bp) ((sd)->target = BPDELTA_TO_JT(bp)) | |
| #define SD_GET_BPDELTA(sd) (JS_ASSERT(!JT_HAS_TAG((sd)->target)),
\ | | #define SD_GET_BPDELTA(sd) (JS_ASSERT(!JT_HAS_TAG((sd)->target)),
\ | |
| JT_TO_BPDELTA((sd)->target)) | | JT_TO_BPDELTA((sd)->target)) | |
|
| #define SD_TARGET_OFFSET(sd) (JS_ASSERT(JT_HAS_TAG((sd)->target)), | | | |
| \ | | /* Avoid asserting twice by expanding SD_GET_TARGET in the "then" clause. * | |
| JT_CLR_TAG((sd)->target)->offset) | | / | |
| | | #define SD_SPAN(sd,pivot) (SD_GET_TARGET(sd) | |
| | | \ | |
| | | ? JT_CLR_TAG((sd)->target)->offset - (pivo | |
| | | t) \ | |
| | | : 0) | |
| | | | |
| struct JSCodeGenerator { | | struct JSCodeGenerator { | |
| JSTreeContext treeContext; /* base state: statement info stack, et
c. */ | | JSTreeContext treeContext; /* base state: statement info stack, et
c. */ | |
|
| | | | |
| JSArenaPool *codePool; /* pointer to thread code arena pool */ | | JSArenaPool *codePool; /* pointer to thread code arena pool */ | |
| JSArenaPool *notePool; /* pointer to thread srcnote arena pool
*/ | | JSArenaPool *notePool; /* pointer to thread srcnote arena pool
*/ | |
| void *codeMark; /* low watermark in cg->codePool */ | | void *codeMark; /* low watermark in cg->codePool */ | |
| void *noteMark; /* low watermark in cg->notePool */ | | void *noteMark; /* low watermark in cg->notePool */ | |
| void *tempMark; /* low watermark in cx->tempPool */ | | void *tempMark; /* low watermark in cx->tempPool */ | |
|
| | | | |
| struct { | | struct { | |
| jsbytecode *base; /* base of JS bytecode vector */ | | jsbytecode *base; /* base of JS bytecode vector */ | |
| jsbytecode *limit; /* one byte beyond end of bytecode */ | | jsbytecode *limit; /* one byte beyond end of bytecode */ | |
| jsbytecode *next; /* pointer to next free bytecode */ | | jsbytecode *next; /* pointer to next free bytecode */ | |
| jssrcnote *notes; /* source notes, see below */ | | jssrcnote *notes; /* source notes, see below */ | |
| uintN noteCount; /* number of source notes so far */ | | uintN noteCount; /* number of source notes so far */ | |
| uintN noteMask; /* growth increment for notes */ | | uintN noteMask; /* growth increment for notes */ | |
| ptrdiff_t lastNoteOffset; /* code offset for last source note */ | | ptrdiff_t lastNoteOffset; /* code offset for last source note */ | |
| uintN currentLine; /* line number for tree-based srcnote g
en */ | | uintN currentLine; /* line number for tree-based srcnote g
en */ | |
| } prolog, main, *current; | | } prolog, main, *current; | |
| | | | |
| skipping to change at line 198 | | skipping to change at line 278 | |
| struct { | | struct { | |
| jsbytecode *base; /* base of JS bytecode vector */ | | jsbytecode *base; /* base of JS bytecode vector */ | |
| jsbytecode *limit; /* one byte beyond end of bytecode */ | | jsbytecode *limit; /* one byte beyond end of bytecode */ | |
| jsbytecode *next; /* pointer to next free bytecode */ | | jsbytecode *next; /* pointer to next free bytecode */ | |
| jssrcnote *notes; /* source notes, see below */ | | jssrcnote *notes; /* source notes, see below */ | |
| uintN noteCount; /* number of source notes so far */ | | uintN noteCount; /* number of source notes so far */ | |
| uintN noteMask; /* growth increment for notes */ | | uintN noteMask; /* growth increment for notes */ | |
| ptrdiff_t lastNoteOffset; /* code offset for last source note */ | | ptrdiff_t lastNoteOffset; /* code offset for last source note */ | |
| uintN currentLine; /* line number for tree-based srcnote g
en */ | | uintN currentLine; /* line number for tree-based srcnote g
en */ | |
| } prolog, main, *current; | | } prolog, main, *current; | |
|
| | | | |
| const char *filename; /* null or weak link to source filename
*/ | | const char *filename; /* null or weak link to source filename
*/ | |
| uintN firstLine; /* first line, for js_NewScriptFromCG *
/ | | uintN firstLine; /* first line, for js_NewScriptFromCG *
/ | |
| JSPrincipals *principals; /* principals for constant folding eval
*/ | | JSPrincipals *principals; /* principals for constant folding eval
*/ | |
| JSAtomList atomList; /* literals indexed for mapping */ | | JSAtomList atomList; /* literals indexed for mapping */ | |
|
| | | | |
| intN stackDepth; /* current stack depth in script frame
*/ | | intN stackDepth; /* current stack depth in script frame
*/ | |
| uintN maxStackDepth; /* maximum stack depth so far */ | | uintN maxStackDepth; /* maximum stack depth so far */ | |
|
| | | | |
| JSTryNote *tryBase; /* first exception handling note */ | | JSTryNote *tryBase; /* first exception handling note */ | |
| JSTryNote *tryNext; /* next available note */ | | JSTryNote *tryNext; /* next available note */ | |
| size_t tryNoteSpace; /* # of bytes allocated at tryBase */ | | size_t tryNoteSpace; /* # of bytes allocated at tryBase */ | |
|
| | | | |
| JSSpanDep *spanDeps; /* span dependent instruction records *
/ | | JSSpanDep *spanDeps; /* span dependent instruction records *
/ | |
| JSJumpTarget *jumpTargets; /* AVL tree of jump target offsets */ | | JSJumpTarget *jumpTargets; /* AVL tree of jump target offsets */ | |
| JSJumpTarget *jtFreeList; /* JT_LEFT-linked list of free structs
*/ | | JSJumpTarget *jtFreeList; /* JT_LEFT-linked list of free structs
*/ | |
| uintN numSpanDeps; /* number of span dependencies */ | | uintN numSpanDeps; /* number of span dependencies */ | |
| uintN numJumpTargets; /* number of jump targets */ | | uintN numJumpTargets; /* number of jump targets */ | |
|
| | | ptrdiff_t spanDepTodo; /* offset from main.base of potentially | |
| | | unoptimized spandeps */ | |
| | | | |
| | | uintN arrayCompSlot; /* stack slot of array in comprehension | |
| | | */ | |
| | | | |
| uintN emitLevel; /* js_EmitTree recursion level */ | | uintN emitLevel; /* js_EmitTree recursion level */ | |
| JSAtomList constList; /* compile time constants */ | | JSAtomList constList; /* compile time constants */ | |
| JSCodeGenerator *parent; /* Enclosing function or global context
*/ | | JSCodeGenerator *parent; /* Enclosing function or global context
*/ | |
| }; | | }; | |
| | | | |
| #define CG_BASE(cg) ((cg)->current->base) | | #define CG_BASE(cg) ((cg)->current->base) | |
| #define CG_LIMIT(cg) ((cg)->current->limit) | | #define CG_LIMIT(cg) ((cg)->current->limit) | |
| #define CG_NEXT(cg) ((cg)->current->next) | | #define CG_NEXT(cg) ((cg)->current->next) | |
| #define CG_CODE(cg,offset) (CG_BASE(cg) + (offset)) | | #define CG_CODE(cg,offset) (CG_BASE(cg) + (offset)) | |
| #define CG_OFFSET(cg) PTRDIFF(CG_NEXT(cg), CG_BASE(cg), jsbytecod
e) | | #define CG_OFFSET(cg) PTRDIFF(CG_NEXT(cg), CG_BASE(cg), jsbytecod
e) | |
| | | | |
| skipping to change at line 302 | | skipping to change at line 391 | |
| return JS_FALSE;
\ | | return JS_FALSE;
\ | |
| JS_END_MACRO | | JS_END_MACRO | |
| | | | |
| #define CHECK_AND_SET_JUMP_OFFSET_AT(cx,cg,off)
\ | | #define CHECK_AND_SET_JUMP_OFFSET_AT(cx,cg,off)
\ | |
| CHECK_AND_SET_JUMP_OFFSET(cx, cg, CG_CODE(cg,off), CG_OFFSET(cg) - (off
)) | | CHECK_AND_SET_JUMP_OFFSET(cx, cg, CG_CODE(cg,off), CG_OFFSET(cg) - (off
)) | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_SetJumpOffset(JSContext *cx, JSCodeGenerator *cg, jsbytecode *pc, | | js_SetJumpOffset(JSContext *cx, JSCodeGenerator *cg, jsbytecode *pc, | |
| ptrdiff_t off); | | ptrdiff_t off); | |
| | | | |
|
| /* Test whether we're in a with statement. */ | | /* Test whether we're in a statement of given type. */ | |
| extern JSBool | | extern JSBool | |
|
| js_InWithStatement(JSTreeContext *tc); | | js_InStatement(JSTreeContext *tc, JSStmtType type); | |
| | | | |
|
| /* Test whether we're in a catch block with exception named by atom. */ | | /* Test whether we're in a with statement. */ | |
| | | #define js_InWithStatement(tc) js_InStatement(tc, STMT_WITH) | |
| | | | |
| | | /* | |
| | | * Test whether atom refers to a global variable (or is a reference error). | |
| | | * Return true in *loopyp if any loops enclose the lexical reference, false | |
| | | * otherwise. | |
| | | */ | |
| extern JSBool | | extern JSBool | |
|
| js_InCatchBlock(JSTreeContext *tc, JSAtom *atom); | | js_IsGlobalReference(JSTreeContext *tc, JSAtom *atom, JSBool *loopyp); | |
| | | | |
| /* | | /* | |
| * Push the C-stack-allocated struct at stmt onto the stmtInfo stack. | | * Push the C-stack-allocated struct at stmt onto the stmtInfo stack. | |
| */ | | */ | |
| extern void | | extern void | |
| js_PushStatement(JSTreeContext *tc, JSStmtInfo *stmt, JSStmtType type, | | js_PushStatement(JSTreeContext *tc, JSStmtInfo *stmt, JSStmtType type, | |
| ptrdiff_t top); | | ptrdiff_t top); | |
| | | | |
| /* | | /* | |
|
| | | * Push a block scope statement and link blockAtom's object-valued key into | |
| | | * tc->blockChain. To pop this statement info record, use js_PopStatement | |
| | | as | |
| | | * usual, or if appropriate (if generating code), js_PopStatementCG. | |
| | | */ | |
| | | extern void | |
| | | js_PushBlockScope(JSTreeContext *tc, JSStmtInfo *stmt, JSAtom *blockAtom, | |
| | | ptrdiff_t top); | |
| | | | |
| | | /* | |
| * Pop tc->topStmt. If the top JSStmtInfo struct is not stack-allocated, i
t | | * Pop tc->topStmt. If the top JSStmtInfo struct is not stack-allocated, i
t | |
| * is up to the caller to free it. | | * is up to the caller to free it. | |
| */ | | */ | |
| extern void | | extern void | |
| js_PopStatement(JSTreeContext *tc); | | js_PopStatement(JSTreeContext *tc); | |
| | | | |
| /* | | /* | |
|
| * Like js_PopStatement(&cg->treeContext), also patch breaks and continues. | | * Like js_PopStatement(&cg->treeContext), also patch breaks and continues | |
| | | * unless the top statement info record represents a try-catch-finally suit | |
| | | e. | |
| * May fail if a jump offset overflows. | | * May fail if a jump offset overflows. | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
| js_PopStatementCG(JSContext *cx, JSCodeGenerator *cg); | | js_PopStatementCG(JSContext *cx, JSCodeGenerator *cg); | |
| | | | |
| /* | | /* | |
| * Define and lookup a primitive jsval associated with the const named by a
tom. | | * Define and lookup a primitive jsval associated with the const named by a
tom. | |
| * js_DefineCompileTimeConstant analyzes the constant-folded initializer at
pn | | * js_DefineCompileTimeConstant analyzes the constant-folded initializer at
pn | |
| * and saves the const's value in cg->constList, if it can be used at compi
le | | * and saves the const's value in cg->constList, if it can be used at compi
le | |
| * time. It returns true unless an error occurred. | | * time. It returns true unless an error occurred. | |
| | | | |
| skipping to change at line 352 | | skipping to change at line 458 | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
| js_DefineCompileTimeConstant(JSContext *cx, JSCodeGenerator *cg, JSAtom *at
om, | | js_DefineCompileTimeConstant(JSContext *cx, JSCodeGenerator *cg, JSAtom *at
om, | |
| JSParseNode *pn); | | JSParseNode *pn); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_LookupCompileTimeConstant(JSContext *cx, JSCodeGenerator *cg, JSAtom *at
om, | | js_LookupCompileTimeConstant(JSContext *cx, JSCodeGenerator *cg, JSAtom *at
om, | |
| jsval *vp); | | jsval *vp); | |
| | | | |
| /* | | /* | |
|
| | | * Find a lexically scoped variable (one declared by let, catch, or an arra | |
| | | y | |
| | | * comprehension) named by atom, looking in tc's compile-time scopes. | |
| | | * | |
| | | * If a WITH statement is reached along the scope stack, return its stateme | |
| | | nt | |
| | | * info record, so callers can tell that atom is ambiguous. If slotp is no | |
| | | t | |
| | | * null, then if atom is found, set *slotp to its stack slot, otherwise to | |
| | | -1. | |
| | | * This means that if slotp is not null, all the block objects on the lexic | |
| | | al | |
| | | * scope chain must have had their depth slots computed by the code generat | |
| | | or, | |
| | | * so the caller must be under js_EmitTree. | |
| | | * | |
| | | * In any event, directly return the statement info record in which atom wa | |
| | | s | |
| | | * found. Otherwise return null. | |
| | | */ | |
| | | extern JSStmtInfo * | |
| | | js_LexicalLookup(JSTreeContext *tc, JSAtom *atom, jsint *slotp, | |
| | | JSBool letdecl); | |
| | | | |
| | | /* | |
| * Emit code into cg for the tree rooted at pn. | | * Emit code into cg for the tree rooted at pn. | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
| js_EmitTree(JSContext *cx, JSCodeGenerator *cg, JSParseNode *pn); | | js_EmitTree(JSContext *cx, JSCodeGenerator *cg, JSParseNode *pn); | |
| | | | |
| /* | | /* | |
|
| | | * Emit function code into cg for the tree rooted at body. | |
| | | */ | |
| | | extern JSBool | |
| | | js_EmitFunctionBytecode(JSContext *cx, JSCodeGenerator *cg, JSParseNode *bo | |
| | | dy); | |
| | | | |
| | | /* | |
| * Emit code into cg for the tree rooted at body, then create a persistent | | * Emit code into cg for the tree rooted at body, then create a persistent | |
| * script for fun from cg. | | * script for fun from cg. | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
| js_EmitFunctionBody(JSContext *cx, JSCodeGenerator *cg, JSParseNode *body, | | js_EmitFunctionBody(JSContext *cx, JSCodeGenerator *cg, JSParseNode *body, | |
| JSFunction *fun); | | JSFunction *fun); | |
| | | | |
| /* | | /* | |
| * Source notes generated along with bytecode for decompiling and debugging
. | | * Source notes generated along with bytecode for decompiling and debugging
. | |
| * A source note is a uint8 with 5 bits of type and 3 of offset from the pc
of | | * A source note is a uint8 with 5 bits of type and 3 of offset from the pc
of | |
| | | | |
| skipping to change at line 383 | | skipping to change at line 513 | |
| * Source Note Extended Delta | | * Source Note Extended Delta | |
| * +7-6-5-4-3+2-1-0+ +7-6-5+4-3-2-1-0+ | | * +7-6-5-4-3+2-1-0+ +7-6-5+4-3-2-1-0+ | |
| * |note-type|delta| |1 1| ext-delta | | | * |note-type|delta| |1 1| ext-delta | | |
| * +---------+-----+ +---+-----------+ | | * +---------+-----+ +---+-----------+ | |
| * | | * | |
| * At most one "gettable" note (i.e., a note of type other than SRC_NEWLINE
, | | * At most one "gettable" note (i.e., a note of type other than SRC_NEWLINE
, | |
| * SRC_SETLINE, and SRC_XDELTA) applies to a given bytecode. | | * SRC_SETLINE, and SRC_XDELTA) applies to a given bytecode. | |
| * | | * | |
| * NB: the js_SrcNoteSpec array in jsemit.c is indexed by this enum, so its | | * NB: the js_SrcNoteSpec array in jsemit.c is indexed by this enum, so its | |
| * initializers need to match the order here. | | * initializers need to match the order here. | |
|
| | | * | |
| | | * Note on adding new source notes: every pair of bytecodes (A, B) where A | |
| | | and | |
| | | * B have disjoint sets of source notes that could apply to each bytecode m | |
| | | ay | |
| | | * reuse the same note type value for two notes (snA, snB) that have the sa | |
| | | me | |
| | | * arity, offsetBias, and isSpanDep initializers in js_SrcNoteSpec. This i | |
| | | s | |
| | | * why SRC_IF and SRC_INITPROP have the same value below. For bad historic | |
| | | al | |
| | | * reasons, some bytecodes below that could be overlayed have not been, but | |
| | | * before using SRC_EXTENDED, consider compressing the existing note types. | |
| | | * | |
| | | * Don't forget to update JSXDR_BYTECODE_VERSION in jsxdrapi.h for all such | |
| | | * incompatible source note or other bytecode changes. | |
| */ | | */ | |
| typedef enum JSSrcNoteType { | | typedef enum JSSrcNoteType { | |
| SRC_NULL = 0, /* terminates a note vector */ | | SRC_NULL = 0, /* terminates a note vector */ | |
| SRC_IF = 1, /* JSOP_IFEQ bytecode is from an if-then */ | | SRC_IF = 1, /* JSOP_IFEQ bytecode is from an if-then */ | |
|
| | | SRC_INITPROP = 1, /* disjoint meaning applied to JSOP_INITELE | |
| | | M or | |
| | | to an index label in a regular (structur | |
| | | ing) | |
| | | or a destructuring object initialiser */ | |
| SRC_IF_ELSE = 2, /* JSOP_IFEQ bytecode is from an if-then-el
se */ | | SRC_IF_ELSE = 2, /* JSOP_IFEQ bytecode is from an if-then-el
se */ | |
| SRC_WHILE = 3, /* JSOP_IFEQ is from a while loop */ | | SRC_WHILE = 3, /* JSOP_IFEQ is from a while loop */ | |
| SRC_FOR = 4, /* JSOP_NOP or JSOP_POP in for loop head */ | | SRC_FOR = 4, /* JSOP_NOP or JSOP_POP in for loop head */ | |
| SRC_CONTINUE = 5, /* JSOP_GOTO is a continue, not a break; | | SRC_CONTINUE = 5, /* JSOP_GOTO is a continue, not a break; | |
| also used on JSOP_ENDINIT if extra comma | | also used on JSOP_ENDINIT if extra comma | |
| at end of array literal: [1,2,,] */ | | at end of array literal: [1,2,,] */ | |
|
| SRC_VAR = 6, /* JSOP_NAME/SETNAME/FORNAME in a var decl | | SRC_DECL = 6, /* type of a declaration (var, const, let*) | |
| */ | | */ | |
| SRC_PCDELTA = 7, /* offset from comma-operator to next POP, | | SRC_DESTRUCT = 6, /* JSOP_DUP starting a destructuring assign | |
| or from CONDSWITCH to first CASE opcode | | ment | |
| */ | | operation, with SRC_DECL_* offset operan | |
| | | d */ | |
| | | SRC_PCDELTA = 7, /* distance forward from comma-operator to | |
| | | next POP, or from CONDSWITCH to first CA | |
| | | SE | |
| | | opcode, etc. -- always a forward delta * | |
| | | / | |
| | | SRC_GROUPASSIGN = 7, /* SRC_DESTRUCT variant for [a, b] = [c, d] | |
| | | */ | |
| SRC_ASSIGNOP = 8, /* += or another assign-op follows */ | | SRC_ASSIGNOP = 8, /* += or another assign-op follows */ | |
| SRC_COND = 9, /* JSOP_IFEQ is from conditional ?: operato
r */ | | SRC_COND = 9, /* JSOP_IFEQ is from conditional ?: operato
r */ | |
|
| SRC_RESERVED0 = 10, /* reserved for future use */ | | SRC_BRACE = 10, /* mandatory brace, for scope or to avoid | |
| | | dangling else */ | |
| SRC_HIDDEN = 11, /* opcode shouldn't be decompiled */ | | SRC_HIDDEN = 11, /* opcode shouldn't be decompiled */ | |
|
| SRC_PCBASE = 12, /* offset of first obj.prop.subprop bytecod | | SRC_PCBASE = 12, /* distance back from annotated getprop or | |
| e */ | | setprop op to left-most obj.prop.subprop | |
| | | bytecode -- always a backward delta */ | |
| | | SRC_METHODBASE = 13, /* SRC_PCBASE variant for obj.function::foo | |
| | | gets and sets; disjoint from SRC_LABEL b | |
| | | y | |
| | | bytecode to which it applies */ | |
| SRC_LABEL = 13, /* JSOP_NOP for label: with atomid immediat
e */ | | SRC_LABEL = 13, /* JSOP_NOP for label: with atomid immediat
e */ | |
| SRC_LABELBRACE = 14, /* JSOP_NOP for label: {...} begin brace */ | | SRC_LABELBRACE = 14, /* JSOP_NOP for label: {...} begin brace */ | |
| SRC_ENDBRACE = 15, /* JSOP_NOP for label: {...} end brace */ | | SRC_ENDBRACE = 15, /* JSOP_NOP for label: {...} end brace */ | |
| SRC_BREAK2LABEL = 16, /* JSOP_GOTO for 'break label' with atomid
*/ | | SRC_BREAK2LABEL = 16, /* JSOP_GOTO for 'break label' with atomid
*/ | |
| SRC_CONT2LABEL = 17, /* JSOP_GOTO for 'continue label' with atom
id */ | | SRC_CONT2LABEL = 17, /* JSOP_GOTO for 'continue label' with atom
id */ | |
| SRC_SWITCH = 18, /* JSOP_*SWITCH with offset to end of switc
h, | | SRC_SWITCH = 18, /* JSOP_*SWITCH with offset to end of switc
h, | |
| 2nd off to first JSOP_CASE if condswitch
*/ | | 2nd off to first JSOP_CASE if condswitch
*/ | |
| SRC_FUNCDEF = 19, /* JSOP_NOP for function f() with atomid */ | | SRC_FUNCDEF = 19, /* JSOP_NOP for function f() with atomid */ | |
| SRC_CATCH = 20, /* catch block has guard */ | | SRC_CATCH = 20, /* catch block has guard */ | |
|
| SRC_CONST = 21, /* JSOP_SETCONST in a const decl */ | | SRC_EXTENDED = 21, /* extended source note, 32-159, in next by
te */ | |
| SRC_NEWLINE = 22, /* bytecode follows a source newline */ | | SRC_NEWLINE = 22, /* bytecode follows a source newline */ | |
| SRC_SETLINE = 23, /* a file-absolute source line number note
*/ | | SRC_SETLINE = 23, /* a file-absolute source line number note
*/ | |
| SRC_XDELTA = 24 /* 24-31 are for extended delta notes */ | | SRC_XDELTA = 24 /* 24-31 are for extended delta notes */ | |
| } JSSrcNoteType; | | } JSSrcNoteType; | |
| | | | |
|
| | | /* | |
| | | * Constants for the SRC_DECL source note. Note that span-dependent byteco | |
| | | de | |
| | | * selection means that any SRC_DECL offset greater than SRC_DECL_LET may n | |
| | | eed | |
| | | * to be adjusted, but these "offsets" are too small to span a span-depende | |
| | | nt | |
| | | * instruction, so can be used to denote distinct declaration syntaxes to t | |
| | | he | |
| | | * decompiler. | |
| | | * | |
| | | * NB: the var_prefix array in jsopcode.c depends on these dense indexes fr | |
| | | om | |
| | | * SRC_DECL_VAR through SRC_DECL_LET. | |
| | | */ | |
| | | #define SRC_DECL_VAR 0 | |
| | | #define SRC_DECL_CONST 1 | |
| | | #define SRC_DECL_LET 2 | |
| | | #define SRC_DECL_NONE 3 | |
| | | | |
| #define SN_TYPE_BITS 5 | | #define SN_TYPE_BITS 5 | |
| #define SN_DELTA_BITS 3 | | #define SN_DELTA_BITS 3 | |
| #define SN_XDELTA_BITS 6 | | #define SN_XDELTA_BITS 6 | |
| #define SN_TYPE_MASK (JS_BITMASK(SN_TYPE_BITS) << SN_DELTA_BITS) | | #define SN_TYPE_MASK (JS_BITMASK(SN_TYPE_BITS) << SN_DELTA_BITS) | |
| #define SN_DELTA_MASK ((ptrdiff_t)JS_BITMASK(SN_DELTA_BITS)) | | #define SN_DELTA_MASK ((ptrdiff_t)JS_BITMASK(SN_DELTA_BITS)) | |
| #define SN_XDELTA_MASK ((ptrdiff_t)JS_BITMASK(SN_XDELTA_BITS)) | | #define SN_XDELTA_MASK ((ptrdiff_t)JS_BITMASK(SN_XDELTA_BITS)) | |
| | | | |
| #define SN_MAKE_NOTE(sn,t,d) (*(sn) = (jssrcnote)
\ | | #define SN_MAKE_NOTE(sn,t,d) (*(sn) = (jssrcnote)
\ | |
| (((t) << SN_DELTA_BITS)
\ | | (((t) << SN_DELTA_BITS)
\ | |
| | ((d) & SN_DELTA_MASK))) | | | ((d) & SN_DELTA_MASK))) | |
| | | | |
End of changes. 37 change blocks. |
| 47 lines changed or deleted | | 275 lines changed or added | |
|
| jsgc.h | | jsgc.h | |
| | | | |
| skipping to change at line 48 | | skipping to change at line 48 | |
| * ***** END LICENSE BLOCK ***** */ | | * ***** END LICENSE BLOCK ***** */ | |
| | | | |
| #ifndef jsgc_h___ | | #ifndef jsgc_h___ | |
| #define jsgc_h___ | | #define jsgc_h___ | |
| /* | | /* | |
| * JS Garbage Collector. | | * JS Garbage Collector. | |
| */ | | */ | |
| #include "jsprvtd.h" | | #include "jsprvtd.h" | |
| #include "jspubtd.h" | | #include "jspubtd.h" | |
| #include "jsdhash.h" | | #include "jsdhash.h" | |
|
| | | #include "jsutil.h" | |
| | | | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
| /* GC thing type indexes. */ | | /* GC thing type indexes. */ | |
| #define GCX_OBJECT 0 /* JSObject */ | | #define GCX_OBJECT 0 /* JSObject */ | |
| #define GCX_STRING 1 /* JSString */ | | #define GCX_STRING 1 /* JSString */ | |
| #define GCX_DOUBLE 2 /* jsdouble */ | | #define GCX_DOUBLE 2 /* jsdouble */ | |
| #define GCX_MUTABLE_STRING 3 /* JSString that's mutable
-- | | #define GCX_MUTABLE_STRING 3 /* JSString that's mutable
-- | |
| single-threaded only! */ | | single-threaded only! */ | |
|
| #define GCX_EXTERNAL_STRING 4 /* JSString w/ external cha | | #define GCX_PRIVATE 4 /* private (unscanned) data | |
| rs */ | | */ | |
| #define GCX_NTYPES_LOG2 3 /* type index bits */ | | #define GCX_NAMESPACE 5 /* JSXMLNamespace */ | |
| | | #define GCX_QNAME 6 /* JSXMLQName */ | |
| | | #define GCX_XML 7 /* JSXML */ | |
| | | #define GCX_EXTERNAL_STRING 8 /* JSString w/ external cha | |
| | | rs */ | |
| | | | |
| | | #define GCX_NTYPES_LOG2 4 /* type index bits */ | |
| #define GCX_NTYPES JS_BIT(GCX_NTYPES_LOG2) | | #define GCX_NTYPES JS_BIT(GCX_NTYPES_LOG2) | |
| | | | |
| /* GC flag definitions, must fit in 8 bits (type index goes in the low bits
). */ | | /* GC flag definitions, must fit in 8 bits (type index goes in the low bits
). */ | |
| #define GCF_TYPEMASK JS_BITMASK(GCX_NTYPES_LOG2) | | #define GCF_TYPEMASK JS_BITMASK(GCX_NTYPES_LOG2) | |
| #define GCF_MARK JS_BIT(GCX_NTYPES_LOG2) | | #define GCF_MARK JS_BIT(GCX_NTYPES_LOG2) | |
| #define GCF_FINAL JS_BIT(GCX_NTYPES_LOG2 + 1) | | #define GCF_FINAL JS_BIT(GCX_NTYPES_LOG2 + 1) | |
|
| #define GCF_LOCKSHIFT (GCX_NTYPES_LOG2 + 2) /* lock bit shift and mask | | #define GCF_SYSTEM JS_BIT(GCX_NTYPES_LOG2 + 2) | |
| */ | | #define GCF_LOCKSHIFT (GCX_NTYPES_LOG2 + 3) /* lock bit shift */ | |
| #define GCF_LOCKMASK (JS_BITMASK(8 - GCF_LOCKSHIFT) << GCF_LOCKSHIFT) | | | |
| #define GCF_LOCK JS_BIT(GCF_LOCKSHIFT) /* lock request bit in API
*/ | | #define GCF_LOCK JS_BIT(GCF_LOCKSHIFT) /* lock request bit in API
*/ | |
| | | | |
| /* Pseudo-flag that modifies GCX_STRING to make GCX_MUTABLE_STRING. */ | | /* Pseudo-flag that modifies GCX_STRING to make GCX_MUTABLE_STRING. */ | |
| #define GCF_MUTABLE 2 | | #define GCF_MUTABLE 2 | |
| | | | |
| #if (GCX_STRING | GCF_MUTABLE) != GCX_MUTABLE_STRING | | #if (GCX_STRING | GCF_MUTABLE) != GCX_MUTABLE_STRING | |
| # error "mutable string type index botch!" | | # error "mutable string type index botch!" | |
| #endif | | #endif | |
| | | | |
| extern uint8 * | | extern uint8 * | |
| js_GetGCThingFlags(void *thing); | | js_GetGCThingFlags(void *thing); | |
| | | | |
|
| /* These are compatible with JSDHashEntryStub. */ | | /* | |
| struct JSGCRootHashEntry { | | * The sole purpose of the function is to preserve public API compatibility | |
| JSDHashEntryHdr hdr; | | * in JS_GetStringBytes which takes only single JSString* argument. | |
| void *root; | | */ | |
| const char *name; | | JSRuntime* | |
| }; | | js_GetGCStringRuntime(JSString *str); | |
| | | | |
| struct JSGCLockHashEntry { | | | |
| JSDHashEntryHdr hdr; | | | |
| const JSGCThing *thing; | | | |
| uint32 count; | | | |
| }; | | | |
| | | | |
| #if 1 | | #if 1 | |
| /* | | /* | |
| * Since we're forcing a GC from JS_GC anyway, don't bother wasting cycles | | * Since we're forcing a GC from JS_GC anyway, don't bother wasting cycles | |
| * loading oldval. XXX remove implied force, fix jsinterp.c's "second arg | | * loading oldval. XXX remove implied force, fix jsinterp.c's "second arg | |
| * ignored", etc. | | * ignored", etc. | |
| */ | | */ | |
| #define GC_POKE(cx, oldval) ((cx)->runtime->gcPoke = JS_TRUE) | | #define GC_POKE(cx, oldval) ((cx)->runtime->gcPoke = JS_TRUE) | |
| #else | | #else | |
| #define GC_POKE(cx, oldval) ((cx)->runtime->gcPoke = JSVAL_IS_GCTHING(oldva
l)) | | #define GC_POKE(cx, oldval) ((cx)->runtime->gcPoke = JSVAL_IS_GCTHING(oldva
l)) | |
| | | | |
| skipping to change at line 122 | | skipping to change at line 122 | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_AddRoot(JSContext *cx, void *rp, const char *name); | | js_AddRoot(JSContext *cx, void *rp, const char *name); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_AddRootRT(JSRuntime *rt, void *rp, const char *name); | | js_AddRootRT(JSRuntime *rt, void *rp, const char *name); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_RemoveRoot(JSRuntime *rt, void *rp); | | js_RemoveRoot(JSRuntime *rt, void *rp); | |
| | | | |
|
| | | #ifdef DEBUG | |
| | | extern void | |
| | | js_DumpNamedRoots(JSRuntime *rt, | |
| | | void (*dump)(const char *name, void *rp, void *data), | |
| | | void *data); | |
| | | #endif | |
| | | | |
| | | extern uint32 | |
| | | js_MapGCRoots(JSRuntime *rt, JSGCRootMapFun map, void *data); | |
| | | | |
| | | /* Table of pointers with count valid members. */ | |
| | | typedef struct JSPtrTable { | |
| | | size_t count; | |
| | | void **array; | |
| | | } JSPtrTable; | |
| | | | |
| | | extern JSBool | |
| | | js_RegisterCloseableIterator(JSContext *cx, JSObject *obj); | |
| | | | |
| | | #if JS_HAS_GENERATORS | |
| | | | |
| | | /* | |
| | | * Runtime state to support generators' close hooks. | |
| | | */ | |
| | | typedef struct JSGCCloseState { | |
| | | /* | |
| | | * Singly linked list of generators that are reachable from GC roots or | |
| | | * were created after the last GC. | |
| | | */ | |
| | | JSGenerator *reachableList; | |
| | | | |
| | | /* | |
| | | * Head of the queue of generators that have already become unreachable | |
| | | but | |
| | | * whose close hooks are not yet run. | |
| | | */ | |
| | | JSGenerator *todoQueue; | |
| | | | |
| | | #ifndef JS_THREADSAFE | |
| | | /* | |
| | | * Flag indicating that the current thread is excuting a close hook for | |
| | | * single thread case. | |
| | | */ | |
| | | JSBool runningCloseHook; | |
| | | #endif | |
| | | } JSGCCloseState; | |
| | | | |
| | | extern void | |
| | | js_RegisterGenerator(JSContext *cx, JSGenerator *gen); | |
| | | | |
| | | extern JSBool | |
| | | js_RunCloseHooks(JSContext *cx); | |
| | | | |
| | | #endif | |
| | | | |
| | | /* | |
| | | * The private JSGCThing struct, which describes a gcFreeList element. | |
| | | */ | |
| | | struct JSGCThing { | |
| | | JSGCThing *next; | |
| | | uint8 *flagp; | |
| | | }; | |
| | | | |
| | | #define GC_NBYTES_MAX (10 * sizeof(JSGCThing)) | |
| | | #define GC_NUM_FREELISTS (GC_NBYTES_MAX / sizeof(JSGCThing)) | |
| | | #define GC_FREELIST_NBYTES(i) (((i) + 1) * sizeof(JSGCThing)) | |
| | | #define GC_FREELIST_INDEX(n) (((n) / sizeof(JSGCThing)) - 1) | |
| | | | |
| extern void * | | extern void * | |
|
| js_AllocGCThing(JSContext *cx, uintN flags); | | js_NewGCThing(JSContext *cx, uintN flags, size_t nbytes); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_LockGCThing(JSContext *cx, void *thing); | | js_LockGCThing(JSContext *cx, void *thing); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_LockGCThingRT(JSRuntime *rt, void *thing); | | js_LockGCThingRT(JSRuntime *rt, void *thing); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_UnlockGCThingRT(JSRuntime *rt, void *thing); | | js_UnlockGCThingRT(JSRuntime *rt, void *thing); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_IsAboutToBeFinalized(JSContext *cx, void *thing); | | js_IsAboutToBeFinalized(JSContext *cx, void *thing); | |
| | | | |
| extern void | | extern void | |
|
| js_MarkAtom(JSContext *cx, JSAtom *atom, void *arg); | | js_MarkAtom(JSContext *cx, JSAtom *atom); | |
| | | | |
| /* We avoid a large number of unnecessary calls by doing the flag check fir
st */ | | /* We avoid a large number of unnecessary calls by doing the flag check fir
st */ | |
|
| #define GC_MARK_ATOM(cx, atom, arg)
\ | | #define GC_MARK_ATOM(cx, atom)
\ | |
| JS_BEGIN_MACRO
\ | | JS_BEGIN_MACRO
\ | |
| if (!((atom)->flags & ATOM_MARK))
\ | | if (!((atom)->flags & ATOM_MARK))
\ | |
|
| js_MarkAtom(cx, atom, arg);
\ | | js_MarkAtom(cx, atom);
\ | |
| JS_END_MACRO | | JS_END_MACRO | |
| | | | |
|
| | | /* | |
| | | * Always use GC_MARK macro and never call js_MarkGCThing directly so | |
| | | * when GC_MARK_DEBUG is defined the dump of live GC things does not miss | |
| | | * a thing. | |
| | | */ | |
| extern void | | extern void | |
|
| js_MarkGCThing(JSContext *cx, void *thing, void *arg); | | js_MarkGCThing(JSContext *cx, void *thing); | |
| | | | |
| #ifdef GC_MARK_DEBUG | | #ifdef GC_MARK_DEBUG | |
| | | | |
|
| typedef struct GCMarkNode GCMarkNode; | | # define GC_MARK(cx, thing, name) js_MarkNamedGCThing(cx, thing, name) | |
| | | | |
|
| struct GCMarkNode { | | extern void | |
| void *thing; | | js_MarkNamedGCThing(JSContext *cx, void *thing, const char *name); | |
| const char *name; | | | |
| GCMarkNode *next; | | | |
| GCMarkNode *prev; | | | |
| }; | | | |
| | | | |
|
| #define GC_MARK(cx_, thing_, name_, prev_) | | extern JS_FRIEND_DATA(FILE *) js_DumpGCHeap; | |
| \ | | JS_EXTERN_DATA(void *) js_LiveThingToFind; | |
| JS_BEGIN_MACRO | | | |
| \ | | | |
| GCMarkNode node_; | | | |
| \ | | | |
| node_.thing = thing_; | | | |
| \ | | | |
| node_.name = name_; | | | |
| \ | | | |
| node_.next = NULL; | | | |
| \ | | | |
| node_.prev = prev_; | | | |
| \ | | | |
| if (prev_) ((GCMarkNode *)(prev_))->next = &node_; | | | |
| \ | | | |
| js_MarkGCThing(cx_, thing_, &node_); | | | |
| \ | | | |
| JS_END_MACRO | | | |
| | | | |
|
| #else /* !GC_MARK_DEBUG */ | | #else | |
| | | | |
|
| #define GC_MARK(cx, thing, name, prev) js_MarkGCThing(cx, thing, NULL) | | # define GC_MARK(cx, thing, name) js_MarkGCThing(cx, thing) | |
| | | | |
|
| #endif /* !GC_MARK_DEBUG */ | | #endif | |
| | | | |
| | | extern void | |
| | | js_MarkStackFrame(JSContext *cx, JSStackFrame *fp); | |
| | | | |
| /* | | /* | |
|
| * Flags to modify how a GC marks and sweeps: | | * Kinds of js_GC invocation. | |
| * GC_KEEP_ATOMS Don't sweep unmarked atoms, they may be in use by t | | | |
| he | | | |
| * compiler, or by an API function that calls js_Atomi | | | |
| ze, | | | |
| * when the GC is called from js_AllocGCThing, due to | | | |
| a | | | |
| * malloc failure or the runtime GC-thing limit. | | | |
| * GC_LAST_CONTEXT Called from js_DestroyContext for last JSContext in | | | |
| a | | | |
| * JSRuntime, when it is imperative that rt->gcPoke ge | | | |
| ts | | | |
| * cleared early in js_GC, if it is set. | | | |
| * GC_ALREADY_LOCKED rt->gcLock is already held on entry to js_GC, and k | | | |
| ept | | | |
| * on return to its caller. | | | |
| */ | | */ | |
|
| #define GC_KEEP_ATOMS 0x1 | | typedef enum JSGCInvocationKind { | |
| #define GC_LAST_CONTEXT 0x2 | | /* Normal invocation. */ | |
| #define GC_ALREADY_LOCKED 0x4 | | GC_NORMAL, | |
| | | | |
| | | /* | |
| | | * Called from js_DestroyContext for last JSContext in a JSRuntime, whe | |
| | | n | |
| | | * it is imperative that rt->gcPoke gets cleared early in js_GC. | |
| | | */ | |
| | | GC_LAST_CONTEXT, | |
| | | | |
| | | /* | |
| | | * Called from js_NewGCThing as a last-ditch GC attempt. See comments | |
| | | * before js_GC definition for details. | |
| | | */ | |
| | | GC_LAST_DITCH | |
| | | } JSGCInvocationKind; | |
| | | | |
| extern void | | extern void | |
|
| js_ForceGC(JSContext *cx, uintN gcflags); | | js_GC(JSContext *cx, JSGCInvocationKind gckind); | |
| | | | |
|
| | | /* Call this after succesful malloc of memory for GC-related things. */ | |
| extern void | | extern void | |
|
| js_GC(JSContext *cx, uintN gcflags); | | js_UpdateMallocCounter(JSContext *cx, size_t nbytes); | |
| | | | |
| | | #ifdef DEBUG_notme | |
| | | #define JS_GCMETER 1 | |
| | | #endif | |
| | | | |
| #ifdef JS_GCMETER | | #ifdef JS_GCMETER | |
| | | | |
| typedef struct JSGCStats { | | typedef struct JSGCStats { | |
|
| | | #ifdef JS_THREADSAFE | |
| | | uint32 localalloc; /* number of succeeded allocations from local lists | |
| | | */ | |
| | | #endif | |
| uint32 alloc; /* number of allocation attempts */ | | uint32 alloc; /* number of allocation attempts */ | |
|
| uint32 freelen; /* gcFreeList length */ | | | |
| uint32 recycle; /* number of things recycled through gcFreeList */ | | | |
| uint32 retry; /* allocation attempt retries after running the GC
*/ | | uint32 retry; /* allocation attempt retries after running the GC
*/ | |
|
| | | uint32 retryhalt; /* allocation retries halted by the branch callback
*/ | |
| uint32 fail; /* allocation failures */ | | uint32 fail; /* allocation failures */ | |
| uint32 finalfail; /* finalizer calls allocator failures */ | | uint32 finalfail; /* finalizer calls allocator failures */ | |
|
| | | uint32 lockborn; /* things born locked */ | |
| uint32 lock; /* valid lock calls */ | | uint32 lock; /* valid lock calls */ | |
| uint32 unlock; /* valid unlock calls */ | | uint32 unlock; /* valid unlock calls */ | |
|
| uint32 stuck; /* stuck reference counts seen by lock calls */ | | uint32 depth; /* mark tail recursion depth */ | |
| uint32 unstuck; /* unlock calls that saw a stuck lock count */ | | uint32 maxdepth; /* maximum mark tail recursion depth */ | |
| uint32 depth; /* mark recursion depth */ | | uint32 cdepth; /* mark recursion depth of C functions */ | |
| uint32 maxdepth; /* maximum mark recursion depth */ | | uint32 maxcdepth; /* maximum mark recursion depth of C functions */ | |
| | | uint32 unscanned; /* mark C stack overflows or number of times | |
| | | GC things were put in unscanned bag */ | |
| | | #ifdef DEBUG | |
| | | uint32 maxunscanned; /* maximum size of unscanned bag */ | |
| | | #endif | |
| uint32 maxlevel; /* maximum GC nesting (indirect recursion) level */ | | uint32 maxlevel; /* maximum GC nesting (indirect recursion) level */ | |
| uint32 poke; /* number of potentially useful GC calls */ | | uint32 poke; /* number of potentially useful GC calls */ | |
| uint32 nopoke; /* useless GC calls where js_PokeGC was not set */ | | uint32 nopoke; /* useless GC calls where js_PokeGC was not set */ | |
| uint32 afree; /* thing arenas freed so far */ | | uint32 afree; /* thing arenas freed so far */ | |
| uint32 stackseg; /* total extraordinary stack segments scanned */ | | uint32 stackseg; /* total extraordinary stack segments scanned */ | |
| uint32 segslots; /* total stack segment jsval slots scanned */ | | uint32 segslots; /* total stack segment jsval slots scanned */ | |
|
| | | uint32 nclose; /* number of objects with close hooks */ | |
| | | uint32 maxnclose; /* max number of objects with close hooks */ | |
| | | uint32 closelater; /* number of close hooks scheduled to run */ | |
| | | uint32 maxcloselater; /* max number of close hooks scheduled to run */ | |
| } JSGCStats; | | } JSGCStats; | |
| | | | |
|
| extern void | | extern JS_FRIEND_API(void) | |
| js_DumpGCStats(JSRuntime *rt, FILE *fp); | | js_DumpGCStats(JSRuntime *rt, FILE *fp); | |
| | | | |
| #endif /* JS_GCMETER */ | | #endif /* JS_GCMETER */ | |
| | | | |
|
| | | typedef struct JSGCArena JSGCArena; | |
| | | typedef struct JSGCArenaList JSGCArenaList; | |
| | | | |
| | | #ifdef JS_GCMETER | |
| | | typedef struct JSGCArenaStats JSGCArenaStats; | |
| | | | |
| | | struct JSGCArenaStats { | |
| | | uint32 narenas; /* number of arena in list */ | |
| | | uint32 maxarenas; /* maximun number of allocated arenas */ | |
| | | uint32 nthings; /* number of allocates JSGCThing */ | |
| | | uint32 maxthings; /* maximum number number of allocates JSGCThing | |
| | | */ | |
| | | uint32 totalnew; /* number of succeeded calls to js_NewGCThing * | |
| | | / | |
| | | uint32 freelen; /* freeList lengths */ | |
| | | uint32 recycle; /* number of things recycled through freeList * | |
| | | / | |
| | | uint32 totalarenas; /* total number of arenas with live things that | |
| | | GC scanned so far */ | |
| | | uint32 totalfreelen; /* total number of things that GC put to free | |
| | | list so far */ | |
| | | }; | |
| | | #endif | |
| | | | |
| | | struct JSGCArenaList { | |
| | | JSGCArena *last; /* last allocated GC arena */ | |
| | | uint16 lastLimit; /* end offset of allocated so far things in | |
| | | the last arena */ | |
| | | uint16 thingSize; /* size of things to allocate on this list | |
| | | */ | |
| | | JSGCThing *freeList; /* list of free GC things */ | |
| | | #ifdef JS_GCMETER | |
| | | JSGCArenaStats stats; | |
| | | #endif | |
| | | }; | |
| | | | |
| | | typedef struct JSWeakRoots { | |
| | | /* Most recently created things by type, members of the GC's root set. | |
| | | */ | |
| | | JSGCThing *newborn[GCX_NTYPES]; | |
| | | | |
| | | /* Atom root for the last-looked-up atom on this context. */ | |
| | | JSAtom *lastAtom; | |
| | | | |
| | | /* Root for the result of the most recent js_InternalInvoke call. */ | |
| | | jsval lastInternalResult; | |
| | | } JSWeakRoots; | |
| | | | |
| | | JS_STATIC_ASSERT(JSVAL_NULL == 0); | |
| | | #define JS_CLEAR_WEAK_ROOTS(wr) (memset((wr), 0, sizeof(JSWeakRoots))) | |
| | | | |
| | | #ifdef DEBUG_notme | |
| | | #define TOO_MUCH_GC 1 | |
| | | #endif | |
| | | | |
| | | #ifdef WAY_TOO_MUCH_GC | |
| | | #define TOO_MUCH_GC 1 | |
| | | #endif | |
| | | | |
| JS_END_EXTERN_C | | JS_END_EXTERN_C | |
| | | | |
| #endif /* jsgc_h___ */ | | #endif /* jsgc_h___ */ | |
| | | | |
End of changes. 30 change blocks. |
| 80 lines changed or deleted | | 211 lines changed or added | |
|
| jsinterp.h | | jsinterp.h | |
| | | | |
| skipping to change at line 51 | | skipping to change at line 51 | |
| #define jsinterp_h___ | | #define jsinterp_h___ | |
| /* | | /* | |
| * JS interpreter interface. | | * JS interpreter interface. | |
| */ | | */ | |
| #include "jsprvtd.h" | | #include "jsprvtd.h" | |
| #include "jspubtd.h" | | #include "jspubtd.h" | |
| | | | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
| /* | | /* | |
|
| * JS stack frame, allocated on the C stack. | | * JS stack frame, may be allocated on the C stack by native callers. Alwa | |
| | | ys | |
| | | * allocated on cx->stackPool for calls from the interpreter to an interpre | |
| | | ted | |
| | | * function. | |
| | | * | |
| | | * NB: This struct is manually initialized in jsinterp.c and jsiter.c. If | |
| | | you | |
| | | * add new members, update both files. But first, try to remove members. | |
| | | The | |
| | | * sharp* and xml* members should be moved onto the stack as local variable | |
| | | s | |
| | | * with well-known slots, if possible. | |
| */ | | */ | |
| struct JSStackFrame { | | struct JSStackFrame { | |
| JSObject *callobj; /* lazily created Call object */ | | JSObject *callobj; /* lazily created Call object */ | |
| JSObject *argsobj; /* lazily created arguments object */ | | JSObject *argsobj; /* lazily created arguments object */ | |
| JSObject *varobj; /* variables object, where vars go */ | | JSObject *varobj; /* variables object, where vars go */ | |
| JSScript *script; /* script being interpreted */ | | JSScript *script; /* script being interpreted */ | |
| JSFunction *fun; /* function being called or null */ | | JSFunction *fun; /* function being called or null */ | |
| JSObject *thisp; /* "this" pointer if in method */ | | JSObject *thisp; /* "this" pointer if in method */ | |
| uintN argc; /* actual argument count */ | | uintN argc; /* actual argument count */ | |
| jsval *argv; /* base of argument stack slots */ | | jsval *argv; /* base of argument stack slots */ | |
| | | | |
| skipping to change at line 75 | | skipping to change at line 82 | |
| JSStackFrame *down; /* previous frame */ | | JSStackFrame *down; /* previous frame */ | |
| void *annotation; /* used by Java security */ | | void *annotation; /* used by Java security */ | |
| JSObject *scopeChain; /* scope chain */ | | JSObject *scopeChain; /* scope chain */ | |
| jsbytecode *pc; /* program counter */ | | jsbytecode *pc; /* program counter */ | |
| jsval *sp; /* stack pointer */ | | jsval *sp; /* stack pointer */ | |
| jsval *spbase; /* operand stack base */ | | jsval *spbase; /* operand stack base */ | |
| uintN sharpDepth; /* array/object initializer depth */ | | uintN sharpDepth; /* array/object initializer depth */ | |
| JSObject *sharpArray; /* scope for #n= initializer vars */ | | JSObject *sharpArray; /* scope for #n= initializer vars */ | |
| uint32 flags; /* frame flags -- see below */ | | uint32 flags; /* frame flags -- see below */ | |
| JSStackFrame *dormantNext; /* next dormant frame chain */ | | JSStackFrame *dormantNext; /* next dormant frame chain */ | |
|
| | | JSObject *xmlNamespace; /* null or default xml namespace in E4X | |
| | | */ | |
| | | JSObject *blockChain; /* active compile-time block scopes */ | |
| }; | | }; | |
| | | | |
| typedef struct JSInlineFrame { | | typedef struct JSInlineFrame { | |
| JSStackFrame frame; /* base struct */ | | JSStackFrame frame; /* base struct */ | |
|
| | | jsval *rvp; /* ptr to caller's return value slot */ | |
| void *mark; /* mark before inline frame */ | | void *mark; /* mark before inline frame */ | |
| void *hookData; /* debugger call hook data */ | | void *hookData; /* debugger call hook data */ | |
| JSVersion callerVersion; /* dynamic version of calling script */ | | JSVersion callerVersion; /* dynamic version of calling script */ | |
| } JSInlineFrame; | | } JSInlineFrame; | |
| | | | |
| /* JS stack frame flags. */ | | /* JS stack frame flags. */ | |
| #define JSFRAME_CONSTRUCTING 0x01 /* frame is for a constructor invocatio
n */ | | #define JSFRAME_CONSTRUCTING 0x01 /* frame is for a constructor invocatio
n */ | |
| #define JSFRAME_INTERNAL 0x02 /* internal call, not invoked by a scri
pt */ | | #define JSFRAME_INTERNAL 0x02 /* internal call, not invoked by a scri
pt */ | |
| #define JSFRAME_SKIP_CALLER 0x04 /* skip one link when evaluating f.call
er | | #define JSFRAME_SKIP_CALLER 0x04 /* skip one link when evaluating f.call
er | |
| for this invocation of f */ | | for this invocation of f */ | |
| #define JSFRAME_ASSIGNING 0x08 /* a complex (not simplex JOF_ASSIGNING
) op | | #define JSFRAME_ASSIGNING 0x08 /* a complex (not simplex JOF_ASSIGNING
) op | |
| is currently assigning to a property
*/ | | is currently assigning to a property
*/ | |
| #define JSFRAME_DEBUGGER 0x10 /* frame for JS_EvaluateInStackFrame */ | | #define JSFRAME_DEBUGGER 0x10 /* frame for JS_EvaluateInStackFrame */ | |
| #define JSFRAME_EVAL 0x20 /* frame for obj_eval */ | | #define JSFRAME_EVAL 0x20 /* frame for obj_eval */ | |
| #define JSFRAME_SPECIAL 0x30 /* special evaluation frame flags */ | | #define JSFRAME_SPECIAL 0x30 /* special evaluation frame flags */ | |
| #define JSFRAME_COMPILING 0x40 /* frame is being used by compiler */ | | #define JSFRAME_COMPILING 0x40 /* frame is being used by compiler */ | |
| #define JSFRAME_COMPILE_N_GO 0x80 /* compiler-and-go mode, can optimize n
ame | | #define JSFRAME_COMPILE_N_GO 0x80 /* compiler-and-go mode, can optimize n
ame | |
| references based on scope chain */ | | references based on scope chain */ | |
|
| | | #define JSFRAME_SCRIPT_OBJECT 0x100 /* compiling source for a Script object | |
| | | */ | |
| | | #define JSFRAME_YIELDING 0x200 /* js_Interpret dispatched JSOP_YIELD * | |
| | | / | |
| | | #define JSFRAME_FILTERING 0x400 /* XML filtering predicate expression * | |
| | | / | |
| | | #define JSFRAME_ITERATOR 0x800 /* trying to get an iterator for for-in | |
| | | */ | |
| | | #define JSFRAME_POP_BLOCKS 0x1000 /* scope chain contains blocks to pop * | |
| | | / | |
| | | #define JSFRAME_GENERATOR 0x2000 /* frame belongs to generator-iterator | |
| | | */ | |
| | | | |
| #define JSFRAME_OVERRIDE_SHIFT 24 /* override bit-set params; see jsfun.c
*/ | | #define JSFRAME_OVERRIDE_SHIFT 24 /* override bit-set params; see jsfun.c
*/ | |
| #define JSFRAME_OVERRIDE_BITS 8 | | #define JSFRAME_OVERRIDE_BITS 8 | |
| | | | |
| /* | | /* | |
| * Property cache for quickened get/set property opcodes. | | * Property cache for quickened get/set property opcodes. | |
| */ | | */ | |
| #define PROPERTY_CACHE_LOG2 10 | | #define PROPERTY_CACHE_LOG2 10 | |
| #define PROPERTY_CACHE_SIZE JS_BIT(PROPERTY_CACHE_LOG2) | | #define PROPERTY_CACHE_SIZE JS_BIT(PROPERTY_CACHE_LOG2) | |
| #define PROPERTY_CACHE_MASK JS_BITMASK(PROPERTY_CACHE_LOG2) | | #define PROPERTY_CACHE_MASK JS_BITMASK(PROPERTY_CACHE_LOG2) | |
| | | | |
| skipping to change at line 258 | | skipping to change at line 274 | |
| #ifdef DUMP_CALL_TABLE | | #ifdef DUMP_CALL_TABLE | |
| # define JSOPTION_LOGCALL_TOSOURCE JS_BIT(15) | | # define JSOPTION_LOGCALL_TOSOURCE JS_BIT(15) | |
| | | | |
| extern JSHashTable *js_CallTable; | | extern JSHashTable *js_CallTable; | |
| extern size_t js_LogCallToSourceLimit; | | extern size_t js_LogCallToSourceLimit; | |
| | | | |
| extern void js_DumpCallTable(JSContext *cx); | | extern void js_DumpCallTable(JSContext *cx); | |
| #endif | | #endif | |
| | | | |
| /* | | /* | |
|
| | | * Refresh and return fp->scopeChain. It may be stale if block scopes are | |
| | | * active but not yet reflected by objects in the scope chain. If a block | |
| | | * scope contains a with, eval, XML filtering predicate, or similar such | |
| | | * dynamically scoped construct, then compile-time block scope at fp->block | |
| | | s | |
| | | * must reflect at runtime. | |
| | | */ | |
| | | extern JSObject * | |
| | | js_GetScopeChain(JSContext *cx, JSStackFrame *fp); | |
| | | | |
| | | /* | |
| | | * Compute the 'this' parameter for a call with nominal 'this' given by thi | |
| | | sp | |
| | | * and arguments including argv[-1] (nominal 'this') and argv[-2] (callee). | |
| | | * Activation objects ("Call" objects not created with "new Call()", i.e., | |
| | | * "Call" objects that have private data) may not be referred to by 'this', | |
| | | * per ECMA-262, so js_ComputeThis censors them. | |
| | | */ | |
| | | extern JSObject * | |
| | | js_ComputeThis(JSContext *cx, JSObject *thisp, jsval *argv); | |
| | | | |
| | | /* | |
| * NB: js_Invoke requires that cx is currently running JS (i.e., that cx->f
p | | * NB: js_Invoke requires that cx is currently running JS (i.e., that cx->f
p | |
|
| * is non-null). | | * is non-null), and that the callee, |this| parameter, and actual argument | |
| | | s | |
| | | * are already pushed on the stack under cx->fp->sp. | |
| */ | | */ | |
| extern JS_FRIEND_API(JSBool) | | extern JS_FRIEND_API(JSBool) | |
| js_Invoke(JSContext *cx, uintN argc, uintN flags); | | js_Invoke(JSContext *cx, uintN argc, uintN flags); | |
| | | | |
| /* | | /* | |
|
| * Consolidated js_Invoke flags simply rename the low JSFRAME_* flags. | | * Consolidated js_Invoke flags simply rename certain JSFRAME_* flags, so t | |
| | | hat | |
| | | * we can share bits stored in JSStackFrame.flags and passed to: | |
| | | * | |
| | | * js_Invoke | |
| | | * js_InternalInvoke | |
| | | * js_ValueToFunction | |
| | | * js_ValueToFunctionObject | |
| | | * js_ValueToCallableObject | |
| | | * js_ReportIsNotFunction | |
| | | * | |
| | | * See jsfun.h for the latter four and flag renaming macros. | |
| */ | | */ | |
| #define JSINVOKE_CONSTRUCT JSFRAME_CONSTRUCTING | | #define JSINVOKE_CONSTRUCT JSFRAME_CONSTRUCTING | |
| #define JSINVOKE_INTERNAL JSFRAME_INTERNAL | | #define JSINVOKE_INTERNAL JSFRAME_INTERNAL | |
| #define JSINVOKE_SKIP_CALLER JSFRAME_SKIP_CALLER | | #define JSINVOKE_SKIP_CALLER JSFRAME_SKIP_CALLER | |
|
| | | #define JSINVOKE_ITERATOR JSFRAME_ITERATOR | |
| | | | |
| | | /* | |
| | | * Mask to isolate construct and iterator flags for use with jsfun.h functi | |
| | | ons. | |
| | | */ | |
| | | #define JSINVOKE_FUNFLAGS (JSINVOKE_CONSTRUCT | JSINVOKE_ITERATOR) | |
| | | | |
| /* | | /* | |
| * "Internal" calls may come from C or C++ code using a JSContext on which
no | | * "Internal" calls may come from C or C++ code using a JSContext on which
no | |
| * JS is running (!cx->fp), so they may need to push a dummy JSStackFrame. | | * JS is running (!cx->fp), so they may need to push a dummy JSStackFrame. | |
| */ | | */ | |
| #define js_InternalCall(cx,obj,fval,argc,argv,rval)
\ | | #define js_InternalCall(cx,obj,fval,argc,argv,rval)
\ | |
| js_InternalInvoke(cx, obj, fval, 0, argc, argv, rval) | | js_InternalInvoke(cx, obj, fval, 0, argc, argv, rval) | |
| | | | |
| #define js_InternalConstruct(cx,obj,fval,argc,argv,rval)
\ | | #define js_InternalConstruct(cx,obj,fval,argc,argv,rval)
\ | |
| js_InternalInvoke(cx, obj, fval, JSINVOKE_CONSTRUCT, argc, argv, rval) | | js_InternalInvoke(cx, obj, fval, JSINVOKE_CONSTRUCT, argc, argv, rval) | |
| | | | |
| skipping to change at line 298 | | skipping to change at line 351 | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_Execute(JSContext *cx, JSObject *chain, JSScript *script, | | js_Execute(JSContext *cx, JSObject *chain, JSScript *script, | |
| JSStackFrame *down, uintN flags, jsval *result); | | JSStackFrame *down, uintN flags, jsval *result); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_CheckRedeclaration(JSContext *cx, JSObject *obj, jsid id, uintN attrs, | | js_CheckRedeclaration(JSContext *cx, JSObject *obj, jsid id, uintN attrs, | |
| JSObject **objp, JSProperty **propp); | | JSObject **objp, JSProperty **propp); | |
| | | | |
| extern JSBool | | extern JSBool | |
|
| js_Interpret(JSContext *cx, jsval *result); | | js_StrictlyEqual(jsval lval, jsval rval); | |
| | | | |
| | | extern JSBool | |
| | | js_InvokeConstructor(JSContext *cx, jsval *vp, uintN argc); | |
| | | | |
| | | extern JSBool | |
| | | js_Interpret(JSContext *cx, jsbytecode *pc, jsval *result); | |
| | | | |
| JS_END_EXTERN_C | | JS_END_EXTERN_C | |
| | | | |
| #endif /* jsinterp_h___ */ | | #endif /* jsinterp_h___ */ | |
| | | | |
End of changes. 9 change blocks. |
| 4 lines changed or deleted | | 80 lines changed or added | |
|
| jslock.h | | jslock.h | |
| | | | |
| skipping to change at line 48 | | skipping to change at line 48 | |
| * ***** END LICENSE BLOCK ***** */ | | * ***** END LICENSE BLOCK ***** */ | |
| #ifndef jslock_h__ | | #ifndef jslock_h__ | |
| #define jslock_h__ | | #define jslock_h__ | |
| | | | |
| #ifdef JS_THREADSAFE | | #ifdef JS_THREADSAFE | |
| | | | |
| #include "jstypes.h" | | #include "jstypes.h" | |
| #include "pratom.h" | | #include "pratom.h" | |
| #include "prlock.h" | | #include "prlock.h" | |
| #include "prcvar.h" | | #include "prcvar.h" | |
|
| | | #include "prthread.h" | |
| | | | |
| #include "jsprvtd.h" /* for JSScope, etc. */ | | #include "jsprvtd.h" /* for JSScope, etc. */ | |
| #include "jspubtd.h" /* for JSRuntime, etc. */ | | #include "jspubtd.h" /* for JSRuntime, etc. */ | |
| | | | |
| #define Thin_GetWait(W) ((jsword)(W) & 0x1) | | #define Thin_GetWait(W) ((jsword)(W) & 0x1) | |
| #define Thin_SetWait(W) ((jsword)(W) | 0x1) | | #define Thin_SetWait(W) ((jsword)(W) | 0x1) | |
| #define Thin_RemoveWait(W) ((jsword)(W) & ~0x1) | | #define Thin_RemoveWait(W) ((jsword)(W) & ~0x1) | |
| | | | |
| typedef struct JSFatLock JSFatLock; | | typedef struct JSFatLock JSFatLock; | |
| | | | |
| | | | |
| skipping to change at line 71 | | skipping to change at line 72 | |
| PRCondVar *svar; | | PRCondVar *svar; | |
| JSFatLock *next; | | JSFatLock *next; | |
| JSFatLock **prevp; | | JSFatLock **prevp; | |
| }; | | }; | |
| | | | |
| typedef struct JSThinLock { | | typedef struct JSThinLock { | |
| jsword owner; | | jsword owner; | |
| JSFatLock *fat; | | JSFatLock *fat; | |
| } JSThinLock; | | } JSThinLock; | |
| | | | |
|
| | | #define CX_THINLOCK_ID(cx) ((jsword)(cx)->thread) | |
| | | #define CURRENT_THREAD_IS_ME(me) (((JSThread *)me)->id == js_CurrentThreadI | |
| | | d()) | |
| | | | |
| typedef PRLock JSLock; | | typedef PRLock JSLock; | |
| | | | |
| typedef struct JSFatLockTable { | | typedef struct JSFatLockTable { | |
| JSFatLock *free; | | JSFatLock *free; | |
| JSFatLock *taken; | | JSFatLock *taken; | |
| } JSFatLockTable; | | } JSFatLockTable; | |
| | | | |
| /* | | /* | |
| * Atomic increment and decrement for a reference counter, given jsrefcount
*p. | | * Atomic increment and decrement for a reference counter, given jsrefcount
*p. | |
| * NB: jsrefcount is int32, aka PRInt32, so that pratom.h functions work. | | * NB: jsrefcount is int32, aka PRInt32, so that pratom.h functions work. | |
| */ | | */ | |
| #define JS_ATOMIC_INCREMENT(p) PR_AtomicIncrement((PRInt32 *)(p)) | | #define JS_ATOMIC_INCREMENT(p) PR_AtomicIncrement((PRInt32 *)(p)) | |
| #define JS_ATOMIC_DECREMENT(p) PR_AtomicDecrement((PRInt32 *)(p)) | | #define JS_ATOMIC_DECREMENT(p) PR_AtomicDecrement((PRInt32 *)(p)) | |
| #define JS_ATOMIC_ADD(p,v) PR_AtomicAdd((PRInt32 *)(p), (PRInt32)(
v)) | | #define JS_ATOMIC_ADD(p,v) PR_AtomicAdd((PRInt32 *)(p), (PRInt32)(
v)) | |
| | | | |
|
| #define CurrentThreadId() (jsword)PR_GetCurrentThread() | | #define js_CurrentThreadId() (jsword)PR_GetCurrentThread() | |
| #define JS_CurrentThreadId() js_CurrentThreadId() | | | |
| #define JS_NEW_LOCK() PR_NewLock() | | #define JS_NEW_LOCK() PR_NewLock() | |
| #define JS_DESTROY_LOCK(l) PR_DestroyLock(l) | | #define JS_DESTROY_LOCK(l) PR_DestroyLock(l) | |
| #define JS_ACQUIRE_LOCK(l) PR_Lock(l) | | #define JS_ACQUIRE_LOCK(l) PR_Lock(l) | |
| #define JS_RELEASE_LOCK(l) PR_Unlock(l) | | #define JS_RELEASE_LOCK(l) PR_Unlock(l) | |
| #define JS_LOCK0(P,M) js_Lock(P,M) | | #define JS_LOCK0(P,M) js_Lock(P,M) | |
| #define JS_UNLOCK0(P,M) js_Unlock(P,M) | | #define JS_UNLOCK0(P,M) js_Unlock(P,M) | |
| | | | |
| #define JS_NEW_CONDVAR(l) PR_NewCondVar(l) | | #define JS_NEW_CONDVAR(l) PR_NewCondVar(l) | |
| #define JS_DESTROY_CONDVAR(cv) PR_DestroyCondVar(cv) | | #define JS_DESTROY_CONDVAR(cv) PR_DestroyCondVar(cv) | |
| #define JS_WAIT_CONDVAR(cv,to) PR_WaitCondVar(cv,to) | | #define JS_WAIT_CONDVAR(cv,to) PR_WaitCondVar(cv,to) | |
| | | | |
| skipping to change at line 109 | | skipping to change at line 112 | |
| #define JS_NOTIFY_CONDVAR(cv) PR_NotifyCondVar(cv) | | #define JS_NOTIFY_CONDVAR(cv) PR_NotifyCondVar(cv) | |
| #define JS_NOTIFY_ALL_CONDVAR(cv) PR_NotifyAllCondVar(cv) | | #define JS_NOTIFY_ALL_CONDVAR(cv) PR_NotifyAllCondVar(cv) | |
| | | | |
| /* | | /* | |
| * Include jsscope.h so JS_LOCK_OBJ macro callers don't have to include it. | | * Include jsscope.h so JS_LOCK_OBJ macro callers don't have to include it. | |
| * Since there is a JSThinLock member in JSScope, we can't nest this includ
e | | * Since there is a JSThinLock member in JSScope, we can't nest this includ
e | |
| * much earlier (see JSThinLock's typedef, above). Yes, that means there i
s | | * much earlier (see JSThinLock's typedef, above). Yes, that means there i
s | |
| * an #include cycle between jslock.h and jsscope.h: moderate-sized XXX her
e, | | * an #include cycle between jslock.h and jsscope.h: moderate-sized XXX her
e, | |
| * to be fixed by moving JS_LOCK_SCOPE to jsscope.h, JS_LOCK_OBJ to jsobj.h
, | | * to be fixed by moving JS_LOCK_SCOPE to jsscope.h, JS_LOCK_OBJ to jsobj.h
, | |
| * and so on. | | * and so on. | |
|
| * | | | |
| * We also need jsscope.h #ifdef DEBUG for SET_OBJ_INFO and SET_SCOPE_INFO, | | | |
| * but we do not want any nested includes that depend on DEBUG. Those lead | | | |
| * to build bustage when someone makes a change that depends in a subtle wa | | | |
| y | | | |
| * on jsscope.h being included directly or indirectly, but does not test by | | | |
| * building optimized as well as DEBUG. | | | |
| */ | | */ | |
| #include "jsscope.h" | | #include "jsscope.h" | |
| | | | |
|
| #ifdef DEBUG | | | |
| | | | |
| #define SET_OBJ_INFO(obj_,file_,line_) | | | |
| \ | | | |
| SET_SCOPE_INFO(OBJ_SCOPE(obj_),file_,line_) | | | |
| | | | |
| #define SET_SCOPE_INFO(scope_,file_,line_) | | | |
| \ | | | |
| ((scope_)->ownercx ? (void)0 : | | | |
| \ | | | |
| (JS_ASSERT((0 < (scope_)->u.count && (scope_)->u.count <= 4) || | | | |
| \ | | | |
| SCOPE_IS_SEALED(scope_)), | | | |
| \ | | | |
| (void)((scope_)->file[(scope_)->u.count-1] = (file_), | | | |
| \ | | | |
| (scope_)->line[(scope_)->u.count-1] = (line_)))) | | | |
| #endif /* DEBUG */ | | | |
| | | | |
| #define JS_LOCK_RUNTIME(rt) js_LockRuntime(rt) | | #define JS_LOCK_RUNTIME(rt) js_LockRuntime(rt) | |
| #define JS_UNLOCK_RUNTIME(rt) js_UnlockRuntime(rt) | | #define JS_UNLOCK_RUNTIME(rt) js_UnlockRuntime(rt) | |
| | | | |
| /* | | /* | |
| * NB: The JS_LOCK_OBJ and JS_UNLOCK_OBJ macros work *only* on native objec
ts | | * NB: The JS_LOCK_OBJ and JS_UNLOCK_OBJ macros work *only* on native objec
ts | |
| * (objects for which OBJ_IS_NATIVE returns true). All uses of these macro
s in | | * (objects for which OBJ_IS_NATIVE returns true). All uses of these macro
s in | |
| * the engine are predicated on OBJ_IS_NATIVE or equivalent checks. These
uses | | * the engine are predicated on OBJ_IS_NATIVE or equivalent checks. These
uses | |
| * are for optimizations above the JSObjectOps layer, under which object lo
cks | | * are for optimizations above the JSObjectOps layer, under which object lo
cks | |
| * normally hide. | | * normally hide. | |
| */ | | */ | |
| #define JS_LOCK_OBJ(cx,obj) ((OBJ_SCOPE(obj)->ownercx == (cx))
\ | | #define JS_LOCK_OBJ(cx,obj) ((OBJ_SCOPE(obj)->ownercx == (cx))
\ | |
| ? (void)0
\ | | ? (void)0
\ | |
|
| : (js_LockObj(cx, obj), | | : (js_LockObj(cx, obj))) | |
| \ | | | |
| SET_OBJ_INFO(obj,__FILE__,__LINE__) | | | |
| )) | | | |
| #define JS_UNLOCK_OBJ(cx,obj) ((OBJ_SCOPE(obj)->ownercx == (cx))
\ | | #define JS_UNLOCK_OBJ(cx,obj) ((OBJ_SCOPE(obj)->ownercx == (cx))
\ | |
| ? (void)0 : js_UnlockObj(cx, obj)) | | ? (void)0 : js_UnlockObj(cx, obj)) | |
| | | | |
|
| #define JS_LOCK_SCOPE(cx,scope) ((scope)->ownercx == (cx) ? (void)0 : | | #define JS_LOCK_SCOPE(cx,scope) ((scope)->ownercx == (cx) ? (void)0 | |
| \ | | \ | |
| (js_LockScope(cx, scope), | | : js_LockScope(cx, scope)) | |
| \ | | #define JS_UNLOCK_SCOPE(cx,scope) ((scope)->ownercx == (cx) ? (void)0 | |
| SET_SCOPE_INFO(scope,__FILE__,__LINE_ | | \ | |
| _))) | | : js_UnlockScope(cx, scope)) | |
| #define JS_UNLOCK_SCOPE(cx,scope) ((scope)->ownercx == (cx) ? (void)0 : | | | |
| \ | | | |
| js_UnlockScope(cx, scope)) | | | |
| #define JS_TRANSFER_SCOPE_LOCK(cx, scope, newscope)
\ | | #define JS_TRANSFER_SCOPE_LOCK(cx, scope, newscope)
\ | |
| js_TransferScopeLock(cx, scope, newscop
e) | | js_TransferScopeLock(cx, scope, newscop
e) | |
| | | | |
|
| extern jsword js_CurrentThreadId(); | | | |
| extern void js_LockRuntime(JSRuntime *rt); | | extern void js_LockRuntime(JSRuntime *rt); | |
| extern void js_UnlockRuntime(JSRuntime *rt); | | extern void js_UnlockRuntime(JSRuntime *rt); | |
| extern void js_LockObj(JSContext *cx, JSObject *obj); | | extern void js_LockObj(JSContext *cx, JSObject *obj); | |
| extern void js_UnlockObj(JSContext *cx, JSObject *obj); | | extern void js_UnlockObj(JSContext *cx, JSObject *obj); | |
| extern void js_LockScope(JSContext *cx, JSScope *scope); | | extern void js_LockScope(JSContext *cx, JSScope *scope); | |
| extern void js_UnlockScope(JSContext *cx, JSScope *scope); | | extern void js_UnlockScope(JSContext *cx, JSScope *scope); | |
| extern int js_SetupLocks(int,int); | | extern int js_SetupLocks(int,int); | |
| extern void js_CleanupLocks(); | | extern void js_CleanupLocks(); | |
|
| extern void js_InitContextForLocking(JSContext *); | | | |
| extern void js_TransferScopeLock(JSContext *, JSScope *, JSScope *); | | extern void js_TransferScopeLock(JSContext *, JSScope *, JSScope *); | |
| extern JS_FRIEND_API(jsval) | | extern JS_FRIEND_API(jsval) | |
| js_GetSlotThreadSafe(JSContext *, JSObject *, uint32); | | js_GetSlotThreadSafe(JSContext *, JSObject *, uint32); | |
| extern void js_SetSlotThreadSafe(JSContext *, JSObject *, uint32, jsval); | | extern void js_SetSlotThreadSafe(JSContext *, JSObject *, uint32, jsval); | |
| extern void js_InitLock(JSThinLock *); | | extern void js_InitLock(JSThinLock *); | |
| extern void js_FinishLock(JSThinLock *); | | extern void js_FinishLock(JSThinLock *); | |
| extern void js_FinishSharingScope(JSRuntime *rt, JSScope *scope); | | extern void js_FinishSharingScope(JSRuntime *rt, JSScope *scope); | |
| | | | |
| #ifdef DEBUG | | #ifdef DEBUG | |
| | | | |
| | | | |
| skipping to change at line 205 | | skipping to change at line 185 | |
| e;
\ | | e;
\ | |
| JS_UNLOCK_OBJ(cx, obj);
\ | | JS_UNLOCK_OBJ(cx, obj);
\ | |
| JS_END_MACRO | | JS_END_MACRO | |
| | | | |
| #define JS_LOCK_VOID(cx, e)
\ | | #define JS_LOCK_VOID(cx, e)
\ | |
| JS_BEGIN_MACRO
\ | | JS_BEGIN_MACRO
\ | |
| JSRuntime *_rt = (cx)->runtime;
\ | | JSRuntime *_rt = (cx)->runtime;
\ | |
| JS_LOCK_RUNTIME_VOID(_rt, e);
\ | | JS_LOCK_RUNTIME_VOID(_rt, e);
\ | |
| JS_END_MACRO | | JS_END_MACRO | |
| | | | |
|
| | | /* FIXME: bug 353962 hackaround */ | |
| | | #define JS_USE_ONLY_NSPR_LOCKS 1 | |
| | | | |
| #if defined(JS_USE_ONLY_NSPR_LOCKS) ||
\ | | #if defined(JS_USE_ONLY_NSPR_LOCKS) ||
\ | |
| !( (defined(_WIN32) && defined(_M_IX86)) ||
\ | | !( (defined(_WIN32) && defined(_M_IX86)) ||
\ | |
| (defined(__GNUC__) && defined(__i386__)) ||
\ | | (defined(__GNUC__) && defined(__i386__)) ||
\ | |
|
| | | ((defined(__USLC__) || defined(_SCO_DS)) && defined(i386)) ||
\ | |
| (defined(SOLARIS) && defined(sparc) && defined(ULTRA_SPARC)) ||
\ | | (defined(SOLARIS) && defined(sparc) && defined(ULTRA_SPARC)) ||
\ | |
| defined(AIX) ) | | defined(AIX) ) | |
| | | | |
| #define NSPR_LOCK 1 | | #define NSPR_LOCK 1 | |
| | | | |
| #undef JS_LOCK0 | | #undef JS_LOCK0 | |
| #undef JS_UNLOCK0 | | #undef JS_UNLOCK0 | |
| #define JS_LOCK0(P,M) (JS_ACQUIRE_LOCK(((JSLock*)(P)->fat)), (P)->owner =
(M)) | | #define JS_LOCK0(P,M) (JS_ACQUIRE_LOCK(((JSLock*)(P)->fat)), (P)->owner =
(M)) | |
| #define JS_UNLOCK0(P,M) ((P)->owner = 0, JS_RELEASE_LOCK(((JSLock*)(P)->fat
))) | | #define JS_UNLOCK0(P,M) ((P)->owner = 0, JS_RELEASE_LOCK(((JSLock*)(P)->fat
))) | |
| | | | |
| | | | |
| skipping to change at line 279 | | skipping to change at line 263 | |
| | | | |
| #define JS_LOCK_GC(rt) JS_ACQUIRE_LOCK((rt)->gcLock) | | #define JS_LOCK_GC(rt) JS_ACQUIRE_LOCK((rt)->gcLock) | |
| #define JS_UNLOCK_GC(rt) JS_RELEASE_LOCK((rt)->gcLock) | | #define JS_UNLOCK_GC(rt) JS_RELEASE_LOCK((rt)->gcLock) | |
| #define JS_LOCK_GC_VOID(rt,e) (JS_LOCK_GC(rt), (e), JS_UNLOCK_GC(rt)) | | #define JS_LOCK_GC_VOID(rt,e) (JS_LOCK_GC(rt), (e), JS_UNLOCK_GC(rt)) | |
| #define JS_AWAIT_GC_DONE(rt) JS_WAIT_CONDVAR((rt)->gcDone, JS_NO_TIM
EOUT) | | #define JS_AWAIT_GC_DONE(rt) JS_WAIT_CONDVAR((rt)->gcDone, JS_NO_TIM
EOUT) | |
| #define JS_NOTIFY_GC_DONE(rt) JS_NOTIFY_ALL_CONDVAR((rt)->gcDone) | | #define JS_NOTIFY_GC_DONE(rt) JS_NOTIFY_ALL_CONDVAR((rt)->gcDone) | |
| #define JS_AWAIT_REQUEST_DONE(rt) JS_WAIT_CONDVAR((rt)->requestDone,
\ | | #define JS_AWAIT_REQUEST_DONE(rt) JS_WAIT_CONDVAR((rt)->requestDone,
\ | |
| JS_NO_TIMEOUT) | | JS_NO_TIMEOUT) | |
| #define JS_NOTIFY_REQUEST_DONE(rt) JS_NOTIFY_CONDVAR((rt)->requestDone) | | #define JS_NOTIFY_REQUEST_DONE(rt) JS_NOTIFY_CONDVAR((rt)->requestDone) | |
| | | | |
|
| #define JS_LOCK(P,CX) JS_LOCK0(P,(CX)->thread) | | #define JS_LOCK(P,CX) JS_LOCK0(P, CX_THINLOCK_ID(CX)) | |
| #define JS_UNLOCK(P,CX) JS_UNLOCK0(P,(CX)->thread) | | #define JS_UNLOCK(P,CX) JS_UNLOCK0(P, CX_THINLOCK_ID(CX)) | |
| | | | |
| #ifndef SET_OBJ_INFO | | | |
| #define SET_OBJ_INFO(obj,f,l) ((void)0) | | | |
| #endif | | | |
| #ifndef SET_SCOPE_INFO | | | |
| #define SET_SCOPE_INFO(scope,f,l) ((void)0) | | | |
| #endif | | | |
| | | | |
| #endif /* jslock_h___ */ | | #endif /* jslock_h___ */ | |
| | | | |
End of changes. 12 change blocks. |
| 52 lines changed or deleted | | 19 lines changed or added | |
|
| jsobj.h | | jsobj.h | |
| /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- | | /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- | |
|
| | | * vim: set ts=8 sw=4 et tw=80: | |
| * | | * | |
| * ***** BEGIN LICENSE BLOCK ***** | | * ***** BEGIN LICENSE BLOCK ***** | |
| * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | |
| * | | * | |
| * The contents of this file are subject to the Mozilla Public License Vers
ion | | * The contents of this file are subject to the Mozilla Public License Vers
ion | |
| * 1.1 (the "License"); you may not use this file except in compliance with | | * 1.1 (the "License"); you may not use this file except in compliance with | |
| * the License. You may obtain a copy of the License at | | * the License. You may obtain a copy of the License at | |
| * http://www.mozilla.org/MPL/ | | * http://www.mozilla.org/MPL/ | |
| * | | * | |
| * Software distributed under the License is distributed on an "AS IS" basi
s, | | * Software distributed under the License is distributed on an "AS IS" basi
s, | |
| | | | |
| skipping to change at line 64 | | skipping to change at line 65 | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
| struct JSObjectMap { | | struct JSObjectMap { | |
| jsrefcount nrefs; /* count of all referencing objects */ | | jsrefcount nrefs; /* count of all referencing objects */ | |
| JSObjectOps *ops; /* high level object operation vtable */ | | JSObjectOps *ops; /* high level object operation vtable */ | |
| uint32 nslots; /* length of obj->slots vector */ | | uint32 nslots; /* length of obj->slots vector */ | |
| uint32 freeslot; /* index of next free obj->slots element */ | | uint32 freeslot; /* index of next free obj->slots element */ | |
| }; | | }; | |
| | | | |
| /* Shorthand macros for frequently-made calls. */ | | /* Shorthand macros for frequently-made calls. */ | |
|
| #if defined JS_THREADSAFE && defined DEBUG | | | |
| #define OBJ_LOOKUP_PROPERTY(cx,obj,id,objp,propp) | | | |
| \ | | | |
| (obj)->map->ops->lookupProperty(cx,obj,id,objp,propp,__FILE__,__LINE__) | | | |
| #else | | | |
| #define OBJ_LOOKUP_PROPERTY(cx,obj,id,objp,propp)
\ | | #define OBJ_LOOKUP_PROPERTY(cx,obj,id,objp,propp)
\ | |
| (obj)->map->ops->lookupProperty(cx,obj,id,objp,propp) | | (obj)->map->ops->lookupProperty(cx,obj,id,objp,propp) | |
|
| #endif | | | |
| #define OBJ_DEFINE_PROPERTY(cx,obj,id,value,getter,setter,attrs,propp)
\ | | #define OBJ_DEFINE_PROPERTY(cx,obj,id,value,getter,setter,attrs,propp)
\ | |
| (obj)->map->ops->defineProperty(cx,obj,id,value,getter,setter,attrs,pro
pp) | | (obj)->map->ops->defineProperty(cx,obj,id,value,getter,setter,attrs,pro
pp) | |
| #define OBJ_GET_PROPERTY(cx,obj,id,vp)
\ | | #define OBJ_GET_PROPERTY(cx,obj,id,vp)
\ | |
| (obj)->map->ops->getProperty(cx,obj,id,vp) | | (obj)->map->ops->getProperty(cx,obj,id,vp) | |
| #define OBJ_SET_PROPERTY(cx,obj,id,vp)
\ | | #define OBJ_SET_PROPERTY(cx,obj,id,vp)
\ | |
| (obj)->map->ops->setProperty(cx,obj,id,vp) | | (obj)->map->ops->setProperty(cx,obj,id,vp) | |
| #define OBJ_GET_ATTRIBUTES(cx,obj,id,prop,attrsp)
\ | | #define OBJ_GET_ATTRIBUTES(cx,obj,id,prop,attrsp)
\ | |
| (obj)->map->ops->getAttributes(cx,obj,id,prop,attrsp) | | (obj)->map->ops->getAttributes(cx,obj,id,prop,attrsp) | |
| #define OBJ_SET_ATTRIBUTES(cx,obj,id,prop,attrsp)
\ | | #define OBJ_SET_ATTRIBUTES(cx,obj,id,prop,attrsp)
\ | |
| (obj)->map->ops->setAttributes(cx,obj,id,prop,attrsp) | | (obj)->map->ops->setAttributes(cx,obj,id,prop,attrsp) | |
| | | | |
| skipping to change at line 108 | | skipping to change at line 104 | |
| : (void)0) | | : (void)0) | |
| #define OBJ_GET_REQUIRED_SLOT(cx,obj,slot)
\ | | #define OBJ_GET_REQUIRED_SLOT(cx,obj,slot)
\ | |
| ((obj)->map->ops->getRequiredSlot
\ | | ((obj)->map->ops->getRequiredSlot
\ | |
| ? (obj)->map->ops->getRequiredSlot(cx, obj, slot)
\ | | ? (obj)->map->ops->getRequiredSlot(cx, obj, slot)
\ | |
| : JSVAL_VOID) | | : JSVAL_VOID) | |
| #define OBJ_SET_REQUIRED_SLOT(cx,obj,slot,v)
\ | | #define OBJ_SET_REQUIRED_SLOT(cx,obj,slot,v)
\ | |
| ((obj)->map->ops->setRequiredSlot
\ | | ((obj)->map->ops->setRequiredSlot
\ | |
| ? (obj)->map->ops->setRequiredSlot(cx, obj, slot, v)
\ | | ? (obj)->map->ops->setRequiredSlot(cx, obj, slot, v)
\ | |
| : JS_TRUE) | | : JS_TRUE) | |
| | | | |
|
| | | #define OBJ_TO_INNER_OBJECT(cx,obj) | |
| | | \ | |
| | | JS_BEGIN_MACRO | |
| | | \ | |
| | | JSClass *clasp_ = OBJ_GET_CLASS(cx, obj); | |
| | | \ | |
| | | if (clasp_->flags & JSCLASS_IS_EXTENDED) { | |
| | | \ | |
| | | JSExtendedClass *xclasp_ = (JSExtendedClass*)clasp_; | |
| | | \ | |
| | | if (xclasp_->innerObject) | |
| | | \ | |
| | | obj = xclasp_->innerObject(cx, obj); | |
| | | \ | |
| | | } | |
| | | \ | |
| | | JS_END_MACRO | |
| | | | |
| /* | | /* | |
| * In the original JS engine design, obj->slots pointed to a vector of leng
th | | * In the original JS engine design, obj->slots pointed to a vector of leng
th | |
| * JS_INITIAL_NSLOTS words if obj->map was shared with a prototype object, | | * JS_INITIAL_NSLOTS words if obj->map was shared with a prototype object, | |
| * else of length obj->map->nslots. With the advent of JS_GetReservedSlot, | | * else of length obj->map->nslots. With the advent of JS_GetReservedSlot, | |
| * JS_SetReservedSlot, and JSCLASS_HAS_RESERVED_SLOTS (see jsapi.h), the si
ze | | * JS_SetReservedSlot, and JSCLASS_HAS_RESERVED_SLOTS (see jsapi.h), the si
ze | |
| * of the minimum length slots vector in the case where map is shared canno
t | | * of the minimum length slots vector in the case where map is shared canno
t | |
| * be constant. This length starts at JS_INITIAL_NSLOTS, but may advance t
o | | * be constant. This length starts at JS_INITIAL_NSLOTS, but may advance t
o | |
| * include all the reserved slots. | | * include all the reserved slots. | |
| * | | * | |
| * Therefore slots must be self-describing. Rather than tag its low order
bit | | * Therefore slots must be self-describing. Rather than tag its low order
bit | |
| | | | |
| skipping to change at line 233 | | skipping to change at line 239 | |
| #define MAP_IS_NATIVE(map)
\ | | #define MAP_IS_NATIVE(map)
\ | |
| ((map)->ops == &js_ObjectOps ||
\ | | ((map)->ops == &js_ObjectOps ||
\ | |
| ((map)->ops && (map)->ops->newObjectMap == js_ObjectOps.newObjectMap)) | | ((map)->ops && (map)->ops->newObjectMap == js_ObjectOps.newObjectMap)) | |
| | | | |
| #define OBJ_IS_NATIVE(obj) MAP_IS_NATIVE((obj)->map) | | #define OBJ_IS_NATIVE(obj) MAP_IS_NATIVE((obj)->map) | |
| | | | |
| extern JS_FRIEND_DATA(JSObjectOps) js_ObjectOps; | | extern JS_FRIEND_DATA(JSObjectOps) js_ObjectOps; | |
| extern JS_FRIEND_DATA(JSObjectOps) js_WithObjectOps; | | extern JS_FRIEND_DATA(JSObjectOps) js_WithObjectOps; | |
| extern JSClass js_ObjectClass; | | extern JSClass js_ObjectClass; | |
| extern JSClass js_WithClass; | | extern JSClass js_WithClass; | |
|
| | | extern JSClass js_BlockClass; | |
| | | | |
| | | /* | |
| | | * Block scope object macros. The slots reserved by js_BlockClass are: | |
| | | * | |
| | | * JSSLOT_PRIVATE JSStackFrame * active frame pointer or null | |
| | | * JSSLOT_BLOCK_DEPTH int depth of block slots in frame | |
| | | * | |
| | | * After JSSLOT_BLOCK_DEPTH come one or more slots for the block locals. | |
| | | * OBJ_BLOCK_COUNT depends on this arrangement. | |
| | | * | |
| | | * A With object is like a Block object, in that both have one reserved slo | |
| | | t | |
| | | * telling the stack depth of the relevant slots (the slot whose value is t | |
| | | he | |
| | | * object named in the with statement, the slots containing the block's loc | |
| | | al | |
| | | * variables); and both have a private slot referring to the JSStackFrame i | |
| | | n | |
| | | * whose activation they were created (or null if the with or block object | |
| | | * outlives the frame). | |
| | | */ | |
| | | #define JSSLOT_BLOCK_DEPTH (JSSLOT_PRIVATE + 1) | |
| | | | |
| | | #define OBJ_BLOCK_COUNT(cx,obj) \ | |
| | | ((obj)->map->freeslot - (JSSLOT_BLOCK_DEPTH + 1)) | |
| | | #define OBJ_BLOCK_DEPTH(cx,obj) \ | |
| | | JSVAL_TO_INT(OBJ_GET_SLOT(cx, obj, JSSLOT_BLOCK_DEPTH)) | |
| | | #define OBJ_SET_BLOCK_DEPTH(cx,obj,depth) \ | |
| | | OBJ_SET_SLOT(cx, obj, JSSLOT_BLOCK_DEPTH, INT_TO_JSVAL(depth)) | |
| | | | |
| | | /* | |
| | | * To make sure this slot is well-defined, always call js_NewWithObject to | |
| | | * create a With object, don't call js_NewObject directly. When creating a | |
| | | * With object that does not correspond to a stack slot, pass -1 for depth. | |
| | | * | |
| | | * When popping the stack across this object's "with" statement, client cod | |
| | | e | |
| | | * must call JS_SetPrivate(cx, withobj, NULL). | |
| | | */ | |
| | | extern JSObject * | |
| | | js_NewWithObject(JSContext *cx, JSObject *proto, JSObject *parent, jsint de | |
| | | pth); | |
| | | | |
| | | /* | |
| | | * Create a new block scope object not linked to any proto or parent object | |
| | | . | |
| | | * Blocks are created by the compiler to reify let blocks and comprehension | |
| | | s. | |
| | | * Only when dynamic scope is captured do they need to be cloned and splice | |
| | | d | |
| | | * into an active scope chain. | |
| | | */ | |
| | | extern JSObject * | |
| | | js_NewBlockObject(JSContext *cx); | |
| | | | |
| | | extern JSObject * | |
| | | js_CloneBlockObject(JSContext *cx, JSObject *proto, JSObject *parent, | |
| | | JSStackFrame *fp); | |
| | | | |
| | | extern JSBool | |
| | | js_PutBlockObject(JSContext *cx, JSObject *obj); | |
| | | | |
| struct JSSharpObjectMap { | | struct JSSharpObjectMap { | |
| jsrefcount depth; | | jsrefcount depth; | |
| jsatomid sharpgen; | | jsatomid sharpgen; | |
| JSHashTable *table; | | JSHashTable *table; | |
| }; | | }; | |
| | | | |
| #define SHARP_BIT ((jsatomid) 1) | | #define SHARP_BIT ((jsatomid) 1) | |
| #define BUSY_BIT ((jsatomid) 2) | | #define BUSY_BIT ((jsatomid) 2) | |
| #define SHARP_ID_SHIFT 2 | | #define SHARP_ID_SHIFT 2 | |
|
| #define IS_SHARP(he) ((jsatomid)(he)->value & SHARP_BIT) | | #define IS_SHARP(he) (JS_PTR_TO_UINT32((he)->value) & SHARP_BIT) | |
| #define MAKE_SHARP(he) ((he)->value = (void*)((jsatomid)(he)->value|SHARP_ | | #define MAKE_SHARP(he) ((he)->value = JS_UINT32_TO_PTR(JS_PTR_TO_UINT32((h | |
| BIT)) | | e)->value)|SHARP_BIT)) | |
| #define IS_BUSY(he) ((jsatomid)(he)->value & BUSY_BIT) | | #define IS_BUSY(he) (JS_PTR_TO_UINT32((he)->value) & BUSY_BIT) | |
| #define MAKE_BUSY(he) ((he)->value = (void*)((jsatomid)(he)->value|BUSY_B | | #define MAKE_BUSY(he) ((he)->value = JS_UINT32_TO_PTR(JS_PTR_TO_UINT32((h | |
| IT)) | | e)->value)|BUSY_BIT)) | |
| #define CLEAR_BUSY(he) ((he)->value = (void*)((jsatomid)(he)->value&~BUSY_ | | #define CLEAR_BUSY(he) ((he)->value = JS_UINT32_TO_PTR(JS_PTR_TO_UINT32((h | |
| BIT)) | | e)->value)&~BUSY_BIT)) | |
| | | | |
| extern JSHashEntry * | | extern JSHashEntry * | |
| js_EnterSharpObject(JSContext *cx, JSObject *obj, JSIdArray **idap, | | js_EnterSharpObject(JSContext *cx, JSObject *obj, JSIdArray **idap, | |
|
| jschar **sp); | | jschar **sp); | |
| | | | |
| extern void | | extern void | |
| js_LeaveSharpObject(JSContext *cx, JSIdArray **idap); | | js_LeaveSharpObject(JSContext *cx, JSIdArray **idap); | |
| | | | |
|
| | | /* | |
| | | * Mark objects stored in map if GC happens between js_EnterSharpObject | |
| | | * and js_LeaveSharpObject. GC calls this when map->depth > 0. | |
| | | */ | |
| | | extern void | |
| | | js_GCMarkSharpMap(JSContext *cx, JSSharpObjectMap *map); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_obj_toSource(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, | | js_obj_toSource(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, | |
|
| jsval *rval); | | jsval *rval); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_obj_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, | | js_obj_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, | |
|
| jsval *rval); | | jsval *rval); | |
| | | | |
| | | extern JSBool | |
| | | js_HasOwnPropertyHelper(JSContext *cx, JSObject *obj, JSLookupPropOp lookup | |
| | | , | |
| | | uintN argc, jsval *argv, jsval *rval); | |
| | | | |
| | | extern JSObject* | |
| | | js_InitBlockClass(JSContext *cx, JSObject* obj); | |
| | | | |
| extern JSObject * | | extern JSObject * | |
| js_InitObjectClass(JSContext *cx, JSObject *obj); | | js_InitObjectClass(JSContext *cx, JSObject *obj); | |
| | | | |
| /* Select Object.prototype method names shared between jsapi.c and jsobj.c.
*/ | | /* Select Object.prototype method names shared between jsapi.c and jsobj.c.
*/ | |
| extern const char js_watch_str[]; | | extern const char js_watch_str[]; | |
| extern const char js_unwatch_str[]; | | extern const char js_unwatch_str[]; | |
| extern const char js_hasOwnProperty_str[]; | | extern const char js_hasOwnProperty_str[]; | |
| extern const char js_isPrototypeOf_str[]; | | extern const char js_isPrototypeOf_str[]; | |
| extern const char js_propertyIsEnumerable_str[]; | | extern const char js_propertyIsEnumerable_str[]; | |
| extern const char js_defineGetter_str[]; | | extern const char js_defineGetter_str[]; | |
| extern const char js_defineSetter_str[]; | | extern const char js_defineSetter_str[]; | |
| extern const char js_lookupGetter_str[]; | | extern const char js_lookupGetter_str[]; | |
| extern const char js_lookupSetter_str[]; | | extern const char js_lookupSetter_str[]; | |
| | | | |
| extern void | | extern void | |
| js_InitObjectMap(JSObjectMap *map, jsrefcount nrefs, JSObjectOps *ops, | | js_InitObjectMap(JSObjectMap *map, jsrefcount nrefs, JSObjectOps *ops, | |
|
| JSClass *clasp); | | JSClass *clasp); | |
| | | | |
| extern JSObjectMap * | | extern JSObjectMap * | |
| js_NewObjectMap(JSContext *cx, jsrefcount nrefs, JSObjectOps *ops, | | js_NewObjectMap(JSContext *cx, jsrefcount nrefs, JSObjectOps *ops, | |
|
| JSClass *clasp, JSObject *obj); | | JSClass *clasp, JSObject *obj); | |
| | | | |
| extern void | | extern void | |
| js_DestroyObjectMap(JSContext *cx, JSObjectMap *map); | | js_DestroyObjectMap(JSContext *cx, JSObjectMap *map); | |
| | | | |
| extern JSObjectMap * | | extern JSObjectMap * | |
| js_HoldObjectMap(JSContext *cx, JSObjectMap *map); | | js_HoldObjectMap(JSContext *cx, JSObjectMap *map); | |
| | | | |
| extern JSObjectMap * | | extern JSObjectMap * | |
| js_DropObjectMap(JSContext *cx, JSObjectMap *map, JSObject *obj); | | js_DropObjectMap(JSContext *cx, JSObjectMap *map, JSObject *obj); | |
| | | | |
|
| | | extern JSBool | |
| | | js_GetClassId(JSContext *cx, JSClass *clasp, jsid *idp); | |
| | | | |
| extern JSObject * | | extern JSObject * | |
| js_NewObject(JSContext *cx, JSClass *clasp, JSObject *proto, JSObject *pare
nt); | | js_NewObject(JSContext *cx, JSClass *clasp, JSObject *proto, JSObject *pare
nt); | |
| | | | |
|
| | | /* | |
| | | * Fast access to immutable standard objects (constructors and prototypes). | |
| | | */ | |
| | | extern JSBool | |
| | | js_GetClassObject(JSContext *cx, JSObject *obj, JSProtoKey key, | |
| | | JSObject **objp); | |
| | | | |
| | | extern JSBool | |
| | | js_SetClassObject(JSContext *cx, JSObject *obj, JSProtoKey key, JSObject *c | |
| | | obj); | |
| | | | |
| | | extern JSBool | |
| | | js_FindClassObject(JSContext *cx, JSObject *start, jsid id, jsval *vp); | |
| | | | |
| extern JSObject * | | extern JSObject * | |
| js_ConstructObject(JSContext *cx, JSClass *clasp, JSObject *proto, | | js_ConstructObject(JSContext *cx, JSClass *clasp, JSObject *proto, | |
| JSObject *parent, uintN argc, jsval *argv); | | JSObject *parent, uintN argc, jsval *argv); | |
| | | | |
| extern void | | extern void | |
| js_FinalizeObject(JSContext *cx, JSObject *obj); | | js_FinalizeObject(JSContext *cx, JSObject *obj); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_AllocSlot(JSContext *cx, JSObject *obj, uint32 *slotp); | | js_AllocSlot(JSContext *cx, JSObject *obj, uint32 *slotp); | |
| | | | |
| extern void | | extern void | |
| js_FreeSlot(JSContext *cx, JSObject *obj, uint32 slot); | | js_FreeSlot(JSContext *cx, JSObject *obj, uint32 slot); | |
| | | | |
| /* | | /* | |
|
| | | * Native property add and lookup variants that hide id in the hidden atom | |
| | | * subspace, so as to avoid collisions between internal properties such as | |
| | | * formal arguments and local variables in function objects, and externally | |
| | | * set properties with the same ids. | |
| | | */ | |
| | | extern JSScopeProperty * | |
| | | js_AddHiddenProperty(JSContext *cx, JSObject *obj, jsid id, | |
| | | JSPropertyOp getter, JSPropertyOp setter, uint32 slot, | |
| | | uintN attrs, uintN flags, intN shortid); | |
| | | | |
| | | extern JSBool | |
| | | js_LookupHiddenProperty(JSContext *cx, JSObject *obj, jsid id, JSObject **o | |
| | | bjp, | |
| | | JSProperty **propp); | |
| | | | |
| | | /* | |
| * Find or create a property named by id in obj's scope, with the given get
ter | | * Find or create a property named by id in obj's scope, with the given get
ter | |
| * and setter, slot, attributes, and other members. | | * and setter, slot, attributes, and other members. | |
| */ | | */ | |
| extern JSScopeProperty * | | extern JSScopeProperty * | |
| js_AddNativeProperty(JSContext *cx, JSObject *obj, jsid id, | | js_AddNativeProperty(JSContext *cx, JSObject *obj, jsid id, | |
| JSPropertyOp getter, JSPropertyOp setter, uint32 slot, | | JSPropertyOp getter, JSPropertyOp setter, uint32 slot, | |
| uintN attrs, uintN flags, intN shortid); | | uintN attrs, uintN flags, intN shortid); | |
| | | | |
| /* | | /* | |
| * Change sprop to have the given attrs, getter, and setter in scope, morph
ing | | * Change sprop to have the given attrs, getter, and setter in scope, morph
ing | |
| | | | |
| skipping to change at line 339 | | skipping to change at line 443 | |
| | | | |
| /* | | /* | |
| * On error, return false. On success, if propp is non-null, return true w
ith | | * On error, return false. On success, if propp is non-null, return true w
ith | |
| * obj locked and with a held property in *propp; if propp is null, return
true | | * obj locked and with a held property in *propp; if propp is null, return
true | |
| * but release obj's lock first. Therefore all callers who pass non-null p
ropp | | * but release obj's lock first. Therefore all callers who pass non-null p
ropp | |
| * result parameters must later call OBJ_DROP_PROPERTY(cx, obj, *propp) bot
h to | | * result parameters must later call OBJ_DROP_PROPERTY(cx, obj, *propp) bot
h to | |
| * drop the held property, and to release the lock on obj. | | * drop the held property, and to release the lock on obj. | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
| js_DefineProperty(JSContext *cx, JSObject *obj, jsid id, jsval value, | | js_DefineProperty(JSContext *cx, JSObject *obj, jsid id, jsval value, | |
|
| JSPropertyOp getter, JSPropertyOp setter, uintN attrs, | | JSPropertyOp getter, JSPropertyOp setter, uintN attrs, | |
| JSProperty **propp); | | JSProperty **propp); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_DefineNativeProperty(JSContext *cx, JSObject *obj, jsid id, jsval value, | | js_DefineNativeProperty(JSContext *cx, JSObject *obj, jsid id, jsval value, | |
| JSPropertyOp getter, JSPropertyOp setter, uintN att
rs, | | JSPropertyOp getter, JSPropertyOp setter, uintN att
rs, | |
| uintN flags, intN shortid, JSProperty **propp); | | uintN flags, intN shortid, JSProperty **propp); | |
| | | | |
| /* | | /* | |
| * Unlike js_DefineProperty, propp must be non-null. On success, and if id
was | | * Unlike js_DefineProperty, propp must be non-null. On success, and if id
was | |
| * found, return true with *objp non-null and locked, and with a held prope
rty | | * found, return true with *objp non-null and locked, and with a held prope
rty | |
| * stored in *propp. If successful but id was not found, return true with
both | | * stored in *propp. If successful but id was not found, return true with
both | |
| * *objp and *propp null. Therefore all callers who receive a non-null *pr
opp | | * *objp and *propp null. Therefore all callers who receive a non-null *pr
opp | |
| * must later call OBJ_DROP_PROPERTY(cx, *objp, *propp). | | * must later call OBJ_DROP_PROPERTY(cx, *objp, *propp). | |
| */ | | */ | |
|
| #if defined JS_THREADSAFE && defined DEBUG | | | |
| extern JS_FRIEND_API(JSBool) | | | |
| _js_LookupProperty(JSContext *cx, JSObject *obj, jsid id, JSObject **objp, | | | |
| JSProperty **propp, const char *file, uintN line); | | | |
| | | | |
| #define js_LookupProperty(cx,obj,id,objp,propp) \ | | | |
| _js_LookupProperty(cx,obj,id,objp,propp,__FILE__,__LINE__) | | | |
| #else | | | |
| extern JS_FRIEND_API(JSBool) | | extern JS_FRIEND_API(JSBool) | |
| js_LookupProperty(JSContext *cx, JSObject *obj, jsid id, JSObject **objp, | | js_LookupProperty(JSContext *cx, JSObject *obj, jsid id, JSObject **objp, | |
|
| JSProperty **propp); | | JSProperty **propp); | |
| #endif | | | |
| | | | |
| /* | | /* | |
| * Specialized subroutine that allows caller to preset JSRESOLVE_* flags. | | * Specialized subroutine that allows caller to preset JSRESOLVE_* flags. | |
|
| | | * JSRESOLVE_HIDDEN flags hidden function param/local name lookups, just fo | |
| | | r | |
| | | * internal use by fun_resolve and similar built-ins. | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
| js_LookupPropertyWithFlags(JSContext *cx, JSObject *obj, jsid id, uintN fla
gs, | | js_LookupPropertyWithFlags(JSContext *cx, JSObject *obj, jsid id, uintN fla
gs, | |
|
| JSObject **objp, JSProperty **propp | | JSObject **objp, JSProperty **propp); | |
| #if defined JS_THREADSAFE && defined DEBUG | | | |
| , const char *file, uintN line | | #define JSRESOLVE_HIDDEN 0x8000 | |
| #endif | | | |
| ); | | | |
| | | | |
| extern JS_FRIEND_API(JSBool) | | extern JS_FRIEND_API(JSBool) | |
| js_FindProperty(JSContext *cx, jsid id, JSObject **objp, JSObject **pobjp, | | js_FindProperty(JSContext *cx, jsid id, JSObject **objp, JSObject **pobjp, | |
|
| JSProperty **propp); | | JSProperty **propp); | |
| | | | |
| extern JSObject * | | extern JSObject * | |
| js_FindIdentifierBase(JSContext *cx, jsid id); | | js_FindIdentifierBase(JSContext *cx, jsid id); | |
| | | | |
| extern JSObject * | | extern JSObject * | |
| js_FindVariableScope(JSContext *cx, JSFunction **funp); | | js_FindVariableScope(JSContext *cx, JSFunction **funp); | |
| | | | |
|
| | | /* | |
| | | * NB: js_NativeGet and js_NativeSet are called with the scope containing s | |
| | | prop | |
| | | * (pobj's scope for Get, obj's for Set) locked, and on successful return, | |
| | | that | |
| | | * scope is again locked. But on failure, both functions return false with | |
| | | the | |
| | | * scope containing sprop unlocked. | |
| | | */ | |
| | | extern JSBool | |
| | | js_NativeGet(JSContext *cx, JSObject *obj, JSObject *pobj, | |
| | | JSScopeProperty *sprop, jsval *vp); | |
| | | | |
| | | extern JSBool | |
| | | js_NativeSet(JSContext *cx, JSObject *obj, JSScopeProperty *sprop, jsval *v | |
| | | p); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_GetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp); | | js_GetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_SetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp); | | js_SetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_GetAttributes(JSContext *cx, JSObject *obj, jsid id, JSProperty *prop, | | js_GetAttributes(JSContext *cx, JSObject *obj, jsid id, JSProperty *prop, | |
|
| uintN *attrsp); | | uintN *attrsp); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_SetAttributes(JSContext *cx, JSObject *obj, jsid id, JSProperty *prop, | | js_SetAttributes(JSContext *cx, JSObject *obj, jsid id, JSProperty *prop, | |
|
| uintN *attrsp); | | uintN *attrsp); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_DeleteProperty(JSContext *cx, JSObject *obj, jsid id, jsval *rval); | | js_DeleteProperty(JSContext *cx, JSObject *obj, jsid id, jsval *rval); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_DefaultValue(JSContext *cx, JSObject *obj, JSType hint, jsval *vp); | | js_DefaultValue(JSContext *cx, JSObject *obj, JSType hint, jsval *vp); | |
| | | | |
| extern JSIdArray * | | extern JSIdArray * | |
| js_NewIdArray(JSContext *cx, jsint length); | | js_NewIdArray(JSContext *cx, jsint length); | |
| | | | |
|
| | | /* | |
| | | * Unlike realloc(3), this function frees ida on failure. | |
| | | */ | |
| extern JSIdArray * | | extern JSIdArray * | |
|
| js_GrowIdArray(JSContext *cx, JSIdArray *ida, jsint length); | | js_SetIdArrayLength(JSContext *cx, JSIdArray *ida, jsint length); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_Enumerate(JSContext *cx, JSObject *obj, JSIterateOp enum_op, | | js_Enumerate(JSContext *cx, JSObject *obj, JSIterateOp enum_op, | |
|
| jsval *statep, jsid *idp); | | jsval *statep, jsid *idp); | |
| | | | |
| | | extern void | |
| | | js_MarkNativeIteratorStates(JSContext *cx); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_CheckAccess(JSContext *cx, JSObject *obj, jsid id, JSAccessMode mode, | | js_CheckAccess(JSContext *cx, JSObject *obj, jsid id, JSAccessMode mode, | |
|
| jsval *vp, uintN *attrsp); | | jsval *vp, uintN *attrsp); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
; | | js_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
; | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, | | js_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, | |
|
| jsval *rval); | | jsval *rval); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_HasInstance(JSContext *cx, JSObject *obj, jsval v, JSBool *bp); | | js_HasInstance(JSContext *cx, JSObject *obj, jsval v, JSBool *bp); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_SetProtoOrParent(JSContext *cx, JSObject *obj, uint32 slot, JSObject *po
bj); | | js_SetProtoOrParent(JSContext *cx, JSObject *obj, uint32 slot, JSObject *po
bj); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_IsDelegate(JSContext *cx, JSObject *obj, jsval v, JSBool *bp); | | js_IsDelegate(JSContext *cx, JSObject *obj, jsval v, JSBool *bp); | |
| | | | |
| extern JSBool | | extern JSBool | |
|
| js_GetClassPrototype(JSContext *cx, const char *name, JSObject **protop); | | js_GetClassPrototype(JSContext *cx, JSObject *scope, jsid id, | |
| | | JSObject **protop); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_SetClassPrototype(JSContext *cx, JSObject *ctor, JSObject *proto, | | js_SetClassPrototype(JSContext *cx, JSObject *ctor, JSObject *proto, | |
|
| uintN attrs); | | uintN attrs); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_ValueToObject(JSContext *cx, jsval v, JSObject **objp); | | js_ValueToObject(JSContext *cx, jsval v, JSObject **objp); | |
| | | | |
| extern JSObject * | | extern JSObject * | |
| js_ValueToNonNullObject(JSContext *cx, jsval v); | | js_ValueToNonNullObject(JSContext *cx, jsval v); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_TryValueOf(JSContext *cx, JSObject *obj, JSType type, jsval *rval); | | js_TryValueOf(JSContext *cx, JSObject *obj, JSType type, jsval *rval); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_TryMethod(JSContext *cx, JSObject *obj, JSAtom *atom, | | js_TryMethod(JSContext *cx, JSObject *obj, JSAtom *atom, | |
|
| uintN argc, jsval *argv, jsval *rval); | | uintN argc, jsval *argv, jsval *rval); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_XDRObject(JSXDRState *xdr, JSObject **objp); | | js_XDRObject(JSXDRState *xdr, JSObject **objp); | |
| | | | |
| extern uint32 | | extern uint32 | |
| js_Mark(JSContext *cx, JSObject *obj, void *arg); | | js_Mark(JSContext *cx, JSObject *obj, void *arg); | |
| | | | |
| extern void | | extern void | |
| js_Clear(JSContext *cx, JSObject *obj); | | js_Clear(JSContext *cx, JSObject *obj); | |
| | | | |
| extern jsval | | extern jsval | |
| js_GetRequiredSlot(JSContext *cx, JSObject *obj, uint32 slot); | | js_GetRequiredSlot(JSContext *cx, JSObject *obj, uint32 slot); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_SetRequiredSlot(JSContext *cx, JSObject *obj, uint32 slot, jsval v); | | js_SetRequiredSlot(JSContext *cx, JSObject *obj, uint32 slot, jsval v); | |
| | | | |
|
| | | extern JSObject * | |
| | | js_CheckScopeChainValidity(JSContext *cx, JSObject *scopeobj, const char *c | |
| | | aller); | |
| | | | |
| | | extern JSBool | |
| | | js_CheckPrincipalsAccess(JSContext *cx, JSObject *scopeobj, | |
| | | JSPrincipals *principals, JSAtom *caller); | |
| JS_END_EXTERN_C | | JS_END_EXTERN_C | |
| | | | |
| #endif /* jsobj_h___ */ | | #endif /* jsobj_h___ */ | |
| | | | |
End of changes. 33 change blocks. |
| 46 lines changed or deleted | | 192 lines changed or added | |
|
| jsopcode.h | | jsopcode.h | |
| | | | |
| skipping to change at line 48 | | skipping to change at line 48 | |
| * ***** END LICENSE BLOCK ***** */ | | * ***** END LICENSE BLOCK ***** */ | |
| | | | |
| #ifndef jsopcode_h___ | | #ifndef jsopcode_h___ | |
| #define jsopcode_h___ | | #define jsopcode_h___ | |
| /* | | /* | |
| * JS bytecode definitions. | | * JS bytecode definitions. | |
| */ | | */ | |
| #include <stddef.h> | | #include <stddef.h> | |
| #include "jsprvtd.h" | | #include "jsprvtd.h" | |
| #include "jspubtd.h" | | #include "jspubtd.h" | |
|
| | | #include "jsutil.h" | |
| | | | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
| /* | | /* | |
| * JS operation bytecodes. | | * JS operation bytecodes. | |
| */ | | */ | |
| typedef enum JSOp { | | typedef enum JSOp { | |
| #define OPDEF(op,val,name,token,length,nuses,ndefs,prec,format) \ | | #define OPDEF(op,val,name,token,length,nuses,ndefs,prec,format) \ | |
| op = val, | | op = val, | |
| #include "jsopcode.tbl" | | #include "jsopcode.tbl" | |
| #undef OPDEF | | #undef OPDEF | |
| JSOP_LIMIT | | JSOP_LIMIT | |
| } JSOp; | | } JSOp; | |
| | | | |
|
| | | typedef enum JSOpLength { | |
| | | #define OPDEF(op,val,name,token,length,nuses,ndefs,prec,format) \ | |
| | | op##_LENGTH = length, | |
| | | #include "jsopcode.tbl" | |
| | | #undef OPDEF | |
| | | JSOP_LIMIT_LENGTH | |
| | | } JSOpLength; | |
| | | | |
| /* | | /* | |
| * JS bytecode formats. | | * JS bytecode formats. | |
| */ | | */ | |
| #define JOF_BYTE 0 /* single bytecode, no immediates */ | | #define JOF_BYTE 0 /* single bytecode, no immediates */ | |
| #define JOF_JUMP 1 /* signed 16-bit jump offset immediate */ | | #define JOF_JUMP 1 /* signed 16-bit jump offset immediate */ | |
| #define JOF_CONST 2 /* unsigned 16-bit constant pool index */ | | #define JOF_CONST 2 /* unsigned 16-bit constant pool index */ | |
| #define JOF_UINT16 3 /* unsigned 16-bit immediate operand */ | | #define JOF_UINT16 3 /* unsigned 16-bit immediate operand */ | |
| #define JOF_TABLESWITCH 4 /* table switch */ | | #define JOF_TABLESWITCH 4 /* table switch */ | |
| #define JOF_LOOKUPSWITCH 5 /* lookup switch */ | | #define JOF_LOOKUPSWITCH 5 /* lookup switch */ | |
| #define JOF_QARG 6 /* quickened get/set function argument op
s */ | | #define JOF_QARG 6 /* quickened get/set function argument op
s */ | |
| #define JOF_QVAR 7 /* quickened get/set local variable ops *
/ | | #define JOF_QVAR 7 /* quickened get/set local variable ops *
/ | |
|
| #define JOF_DEFLOCALVAR 8 /* define local var with initial value */ | | #define JOF_INDEXCONST 8 /* uint16 slot index + constant pool inde
x */ | |
| #define JOF_JUMPX 9 /* signed 32-bit jump offset immediate */ | | #define JOF_JUMPX 9 /* signed 32-bit jump offset immediate */ | |
| #define JOF_TABLESWITCHX 10 /* extended (32-bit offset) table switch
*/ | | #define JOF_TABLESWITCHX 10 /* extended (32-bit offset) table switch
*/ | |
| #define JOF_LOOKUPSWITCHX 11 /* extended (32-bit offset) lookup switch
*/ | | #define JOF_LOOKUPSWITCHX 11 /* extended (32-bit offset) lookup switch
*/ | |
|
| | | #define JOF_UINT24 12 /* extended unsigned 24-bit literal (inde | |
| | | x) */ | |
| | | #define JOF_LITOPX 13 /* JOF_UINT24 followed by op being extend | |
| | | ed, | |
| | | where op if JOF_CONST has no unsigned | |
| | | 16- | |
| | | bit immediate operand */ | |
| | | #define JOF_LOCAL 14 /* block-local operand stack variable */ | |
| #define JOF_TYPEMASK 0x000f /* mask for above immediate types */ | | #define JOF_TYPEMASK 0x000f /* mask for above immediate types */ | |
| #define JOF_NAME 0x0010 /* name operation */ | | #define JOF_NAME 0x0010 /* name operation */ | |
| #define JOF_PROP 0x0020 /* obj.prop operation */ | | #define JOF_PROP 0x0020 /* obj.prop operation */ | |
| #define JOF_ELEM 0x0030 /* obj[index] operation */ | | #define JOF_ELEM 0x0030 /* obj[index] operation */ | |
| #define JOF_MODEMASK 0x0030 /* mask for above addressing modes */ | | #define JOF_MODEMASK 0x0030 /* mask for above addressing modes */ | |
| #define JOF_SET 0x0040 /* set (i.e., assignment) operation */ | | #define JOF_SET 0x0040 /* set (i.e., assignment) operation */ | |
| #define JOF_DEL 0x0080 /* delete operation */ | | #define JOF_DEL 0x0080 /* delete operation */ | |
| #define JOF_DEC 0x0100 /* decrement (--, not ++) opcode */ | | #define JOF_DEC 0x0100 /* decrement (--, not ++) opcode */ | |
| #define JOF_INC 0x0200 /* increment (++, not --) opcode */ | | #define JOF_INC 0x0200 /* increment (++, not --) opcode */ | |
| #define JOF_INCDEC 0x0300 /* increment or decrement opcode */ | | #define JOF_INCDEC 0x0300 /* increment or decrement opcode */ | |
| #define JOF_POST 0x0400 /* postorder increment or decrement */ | | #define JOF_POST 0x0400 /* postorder increment or decrement */ | |
| #define JOF_IMPORT 0x0800 /* import property op */ | | #define JOF_IMPORT 0x0800 /* import property op */ | |
| #define JOF_FOR 0x1000 /* for-in property op */ | | #define JOF_FOR 0x1000 /* for-in property op */ | |
| #define JOF_ASSIGNING JOF_SET /* hint for JSClass.resolve, used for ops | | #define JOF_ASSIGNING JOF_SET /* hint for JSClass.resolve, used for ops | |
| that do simplex assignment */ | | that do simplex assignment */ | |
| #define JOF_DETECTING 0x2000 /* object detection flag for JSNewResolve
Op */ | | #define JOF_DETECTING 0x2000 /* object detection flag for JSNewResolve
Op */ | |
| #define JOF_BACKPATCH 0x4000 /* backpatch placeholder during codegen *
/ | | #define JOF_BACKPATCH 0x4000 /* backpatch placeholder during codegen *
/ | |
| #define JOF_LEFTASSOC 0x8000 /* left-associative operator */ | | #define JOF_LEFTASSOC 0x8000 /* left-associative operator */ | |
| #define JOF_DECLARING 0x10000 /* var, const, or function declaration op
*/ | | #define JOF_DECLARING 0x10000 /* var, const, or function declaration op
*/ | |
|
| | | #define JOF_XMLNAME 0x20000 /* XML name: *, a::b, @a, @a::b, etc. */ | |
| | | | |
| #define JOF_TYPE_IS_EXTENDED_JUMP(t) \ | | #define JOF_TYPE_IS_EXTENDED_JUMP(t) \ | |
| ((unsigned)((t) - JOF_JUMPX) <= (unsigned)(JOF_LOOKUPSWITCHX - JOF_JUMP
X)) | | ((unsigned)((t) - JOF_JUMPX) <= (unsigned)(JOF_LOOKUPSWITCHX - JOF_JUMP
X)) | |
| | | | |
| /* | | /* | |
| * Immediate operand getters, setters, and bounds. | | * Immediate operand getters, setters, and bounds. | |
| */ | | */ | |
| | | | |
| /* Short (2-byte signed offset) relative jump macros. */ | | /* Short (2-byte signed offset) relative jump macros. */ | |
| #define JUMP_OFFSET_LEN 2 | | #define JUMP_OFFSET_LEN 2 | |
| #define JUMP_OFFSET_HI(off) ((jsbytecode)((off) >> 8)) | | #define JUMP_OFFSET_HI(off) ((jsbytecode)((off) >> 8)) | |
| #define JUMP_OFFSET_LO(off) ((jsbytecode)(off)) | | #define JUMP_OFFSET_LO(off) ((jsbytecode)(off)) | |
| #define GET_JUMP_OFFSET(pc) ((int16)(((pc)[1] << 8) | (pc)[2])) | | #define GET_JUMP_OFFSET(pc) ((int16)(((pc)[1] << 8) | (pc)[2])) | |
| #define SET_JUMP_OFFSET(pc,off) ((pc)[1] = JUMP_OFFSET_HI(off),
\ | | #define SET_JUMP_OFFSET(pc,off) ((pc)[1] = JUMP_OFFSET_HI(off),
\ | |
|
| (pc)[2] = JUMP_OFFSET_LO(off)) | | (pc)[2] = JUMP_OFFSET_LO(off)) | |
| #define JUMP_OFFSET_MIN ((int16)0x8000) | | #define JUMP_OFFSET_MIN ((int16)0x8000) | |
| #define JUMP_OFFSET_MAX ((int16)0x7fff) | | #define JUMP_OFFSET_MAX ((int16)0x7fff) | |
| | | | |
| /* | | /* | |
| * When a short jump won't hold a relative offset, its 2-byte immediate off
set | | * When a short jump won't hold a relative offset, its 2-byte immediate off
set | |
| * operand is an unsigned index of a span-dependency record, maintained unt
il | | * operand is an unsigned index of a span-dependency record, maintained unt
il | |
| * code generation finishes -- after which some (but we hope not nearly all
) | | * code generation finishes -- after which some (but we hope not nearly all
) | |
| * span-dependent jumps must be extended (see OptimizeSpanDeps in jsemit.c)
. | | * span-dependent jumps must be extended (see OptimizeSpanDeps in jsemit.c)
. | |
| * | | * | |
| * If the span-dependency record index overflows SPANDEP_INDEX_MAX, the jum
p | | * If the span-dependency record index overflows SPANDEP_INDEX_MAX, the jum
p | |
| * offset will contain SPANDEP_INDEX_HUGE, indicating that the record must
be | | * offset will contain SPANDEP_INDEX_HUGE, indicating that the record must
be | |
| * found (via binary search) by its "before span-dependency optimization" p
c | | * found (via binary search) by its "before span-dependency optimization" p
c | |
| * offset (from script main entry point). | | * offset (from script main entry point). | |
| */ | | */ | |
| #define GET_SPANDEP_INDEX(pc) ((uint16)(((pc)[1] << 8) | (pc)[2])) | | #define GET_SPANDEP_INDEX(pc) ((uint16)(((pc)[1] << 8) | (pc)[2])) | |
| #define SET_SPANDEP_INDEX(pc,i) ((pc)[1] = JUMP_OFFSET_HI(i),
\ | | #define SET_SPANDEP_INDEX(pc,i) ((pc)[1] = JUMP_OFFSET_HI(i),
\ | |
|
| (pc)[2] = JUMP_OFFSET_LO(i)) | | (pc)[2] = JUMP_OFFSET_LO(i)) | |
| #define SPANDEP_INDEX_MAX ((uint16)0xfffe) | | #define SPANDEP_INDEX_MAX ((uint16)0xfffe) | |
| #define SPANDEP_INDEX_HUGE ((uint16)0xffff) | | #define SPANDEP_INDEX_HUGE ((uint16)0xffff) | |
| | | | |
| /* Ultimately, if short jumps won't do, emit long (4-byte signed) offsets.
*/ | | /* Ultimately, if short jumps won't do, emit long (4-byte signed) offsets.
*/ | |
| #define JUMPX_OFFSET_LEN 4 | | #define JUMPX_OFFSET_LEN 4 | |
| #define JUMPX_OFFSET_B3(off) ((jsbytecode)((off) >> 24)) | | #define JUMPX_OFFSET_B3(off) ((jsbytecode)((off) >> 24)) | |
| #define JUMPX_OFFSET_B2(off) ((jsbytecode)((off) >> 16)) | | #define JUMPX_OFFSET_B2(off) ((jsbytecode)((off) >> 16)) | |
| #define JUMPX_OFFSET_B1(off) ((jsbytecode)((off) >> 8)) | | #define JUMPX_OFFSET_B1(off) ((jsbytecode)((off) >> 8)) | |
| #define JUMPX_OFFSET_B0(off) ((jsbytecode)(off)) | | #define JUMPX_OFFSET_B0(off) ((jsbytecode)(off)) | |
| #define GET_JUMPX_OFFSET(pc) ((int32)(((pc)[1] << 24) | ((pc)[2] << 16)
\ | | #define GET_JUMPX_OFFSET(pc) ((int32)(((pc)[1] << 24) | ((pc)[2] << 16)
\ | |
| | ((pc)[3] << 8) | (pc)[4])) | | | ((pc)[3] << 8) | (pc)[4])) | |
| #define SET_JUMPX_OFFSET(pc,off)((pc)[1] = JUMPX_OFFSET_B3(off),
\ | | #define SET_JUMPX_OFFSET(pc,off)((pc)[1] = JUMPX_OFFSET_B3(off),
\ | |
| (pc)[2] = JUMPX_OFFSET_B2(off),
\ | | (pc)[2] = JUMPX_OFFSET_B2(off),
\ | |
| (pc)[3] = JUMPX_OFFSET_B1(off),
\ | | (pc)[3] = JUMPX_OFFSET_B1(off),
\ | |
| (pc)[4] = JUMPX_OFFSET_B0(off)) | | (pc)[4] = JUMPX_OFFSET_B0(off)) | |
| #define JUMPX_OFFSET_MIN ((int32)0x80000000) | | #define JUMPX_OFFSET_MIN ((int32)0x80000000) | |
| #define JUMPX_OFFSET_MAX ((int32)0x7fffffff) | | #define JUMPX_OFFSET_MAX ((int32)0x7fffffff) | |
| | | | |
|
| /* A literal is indexed by a per-script atom map. */ | | /* | |
| | | * A literal is indexed by a per-script atom map. Most scripts have relati | |
| | | vely | |
| | | * few literals, so the standard JOF_CONST format specifies a fixed 16 bits | |
| | | of | |
| | | * immediate operand index. A script with more than 64K literals must push | |
| | | all | |
| | | * high-indexed literals on the stack using JSOP_LITERAL, then use JOF_ELEM | |
| | | ops | |
| | | * instead of JOF_PROP, etc. | |
| | | */ | |
| #define ATOM_INDEX_LEN 2 | | #define ATOM_INDEX_LEN 2 | |
|
| #define ATOM_INDEX_HI(index) ((jsbytecode)((index) >> 8)) | | #define ATOM_INDEX_HI(i) ((jsbytecode)((i) >> 8)) | |
| #define ATOM_INDEX_LO(index) ((jsbytecode)(index)) | | #define ATOM_INDEX_LO(i) ((jsbytecode)(i)) | |
| #define GET_ATOM_INDEX(pc) ((jsatomid)(((pc)[1] << 8) | (pc)[2])) | | #define GET_ATOM_INDEX(pc) ((jsatomid)(((pc)[1] << 8) | (pc)[2])) | |
|
| #define SET_ATOM_INDEX(pc,index)((pc)[1] = ATOM_INDEX_HI(index), | | #define SET_ATOM_INDEX(pc,i) ((pc)[1] = ATOM_INDEX_HI(i), | |
| \ | | \ | |
| (pc)[2] = ATOM_INDEX_LO(index)) | | (pc)[2] = ATOM_INDEX_LO(i)) | |
| #define GET_ATOM(cx,script,pc) js_GetAtom((cx), &(script)->atomMap,
\ | | #define GET_ATOM(cx,script,pc) js_GetAtom((cx), &(script)->atomMap,
\ | |
|
| GET_ATOM_INDEX(pc)) | | GET_ATOM_INDEX(pc)) | |
| #define ATOM_INDEX_LIMIT_LOG2 16 | | | |
| | | /* A full atom index for JSOP_UINT24 uses 24 bits of immediate operand. */ | |
| | | #define UINT24_HI(i) ((jsbytecode)((i) >> 16)) | |
| | | #define UINT24_MID(i) ((jsbytecode)((i) >> 8)) | |
| | | #define UINT24_LO(i) ((jsbytecode)(i)) | |
| | | #define GET_UINT24(pc) ((jsatomid)(((pc)[1] << 16) | | |
| | | \ | |
| | | ((pc)[2] << 8) | | |
| | | \ | |
| | | (pc)[3])) | |
| | | #define SET_UINT24(pc,i) ((pc)[1] = UINT24_HI(i), | |
| | | \ | |
| | | (pc)[2] = UINT24_MID(i), | |
| | | \ | |
| | | (pc)[3] = UINT24_LO(i)) | |
| | | | |
| | | /* Same format for JSOP_LITERAL, etc., but future-proof with different name | |
| | | s. */ | |
| | | #define LITERAL_INDEX_LEN 3 | |
| | | #define LITERAL_INDEX_HI(i) UINT24_HI(i) | |
| | | #define LITERAL_INDEX_MID(i) UINT24_MID(i) | |
| | | #define LITERAL_INDEX_LO(i) UINT24_LO(i) | |
| | | #define GET_LITERAL_INDEX(pc) GET_UINT24(pc) | |
| | | #define SET_LITERAL_INDEX(pc,i) SET_UINT24(pc,i) | |
| | | | |
| | | /* Atom index limit is determined by SN_3BYTE_OFFSET_FLAG, see jsemit.h. */ | |
| | | #define ATOM_INDEX_LIMIT_LOG2 23 | |
| #define ATOM_INDEX_LIMIT ((uint32)1 << ATOM_INDEX_LIMIT_LOG2) | | #define ATOM_INDEX_LIMIT ((uint32)1 << ATOM_INDEX_LIMIT_LOG2) | |
| | | | |
|
| | | JS_STATIC_ASSERT(sizeof(jsatomid) * JS_BITS_PER_BYTE >= | |
| | | ATOM_INDEX_LIMIT_LOG2 + 1); | |
| | | | |
| | | /* Common uint16 immediate format helpers. */ | |
| | | #define UINT16_HI(i) ((jsbytecode)((i) >> 8)) | |
| | | #define UINT16_LO(i) ((jsbytecode)(i)) | |
| | | #define GET_UINT16(pc) ((uintN)(((pc)[1] << 8) | (pc)[2])) | |
| | | #define SET_UINT16(pc,i) ((pc)[1] = UINT16_HI(i), (pc)[2] = UINT16_L | |
| | | O(i)) | |
| | | #define UINT16_LIMIT ((uintN)1 << 16) | |
| | | | |
| /* Actual argument count operand format helpers. */ | | /* Actual argument count operand format helpers. */ | |
|
| #define ARGC_HI(argc) ((jsbytecode)((argc) >> 8)) | | #define ARGC_HI(argc) UINT16_HI(argc) | |
| #define ARGC_LO(argc) ((jsbytecode)(argc)) | | #define ARGC_LO(argc) UINT16_LO(argc) | |
| #define GET_ARGC(pc) ((uintN)(((pc)[1] << 8) | (pc)[2])) | | #define GET_ARGC(pc) GET_UINT16(pc) | |
| #define ARGC_LIMIT ((uint32)1 << 16) | | #define ARGC_LIMIT UINT16_LIMIT | |
| | | | |
| /* Synonyms for quick JOF_QARG and JOF_QVAR bytecodes. */ | | /* Synonyms for quick JOF_QARG and JOF_QVAR bytecodes. */ | |
|
| #define GET_ARGNO(pc) GET_ARGC(pc) | | #define GET_ARGNO(pc) GET_UINT16(pc) | |
| #define SET_ARGNO(pc,argno) SET_JUMP_OFFSET(pc,argno) | | #define SET_ARGNO(pc,argno) SET_UINT16(pc,argno) | |
| #define ARGNO_LEN JUMP_OFFSET_LEN | | #define ARGNO_LEN 2 | |
| #define GET_VARNO(pc) GET_ARGC(pc) | | #define ARGNO_LIMIT UINT16_LIMIT | |
| #define SET_VARNO(pc,varno) SET_JUMP_OFFSET(pc,varno) | | | |
| #define VARNO_LEN JUMP_OFFSET_LEN | | #define GET_VARNO(pc) GET_UINT16(pc) | |
| | | #define SET_VARNO(pc,varno) SET_UINT16(pc,varno) | |
| | | #define VARNO_LEN 2 | |
| | | #define VARNO_LIMIT UINT16_LIMIT | |
| | | | |
| struct JSCodeSpec { | | struct JSCodeSpec { | |
| const char *name; /* JS bytecode name */ | | const char *name; /* JS bytecode name */ | |
| const char *token; /* JS source literal or null */ | | const char *token; /* JS source literal or null */ | |
| int8 length; /* length including opcode byte */ | | int8 length; /* length including opcode byte */ | |
| int8 nuses; /* arity, -1 if variadic */ | | int8 nuses; /* arity, -1 if variadic */ | |
| int8 ndefs; /* number of stack results */ | | int8 ndefs; /* number of stack results */ | |
| uint8 prec; /* operator precedence */ | | uint8 prec; /* operator precedence */ | |
| uint32 format; /* immediate operand format */ | | uint32 format; /* immediate operand format */ | |
| }; | | }; | |
| | | | |
|
| extern const char js_const_str[]; | | | |
| extern const char js_var_str[]; | | | |
| extern const char js_function_str[]; | | | |
| extern const char js_in_str[]; | | | |
| extern const char js_instanceof_str[]; | | | |
| extern const char js_new_str[]; | | | |
| extern const char js_delete_str[]; | | | |
| extern const char js_typeof_str[]; | | | |
| extern const char js_void_str[]; | | | |
| extern const char js_null_str[]; | | | |
| extern const char js_this_str[]; | | | |
| extern const char js_false_str[]; | | | |
| extern const char js_true_str[]; | | | |
| extern const JSCodeSpec js_CodeSpec[]; | | extern const JSCodeSpec js_CodeSpec[]; | |
| extern uintN js_NumCodeSpecs; | | extern uintN js_NumCodeSpecs; | |
| extern const jschar js_EscapeMap[]; | | extern const jschar js_EscapeMap[]; | |
| | | | |
| /* | | /* | |
| * Return a GC'ed string containing the chars in str, with any non-printing | | * Return a GC'ed string containing the chars in str, with any non-printing | |
| * chars or quotes (' or " as specified by the quote argument) escaped, and | | * chars or quotes (' or " as specified by the quote argument) escaped, and | |
| * with the quote character at the beginning and end of the result string. | | * with the quote character at the beginning and end of the result string. | |
| */ | | */ | |
| extern JSString * | | extern JSString * | |
| | | | |
| skipping to change at line 233 | | skipping to change at line 275 | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_puts(JSPrinter *jp, const char *s); | | js_puts(JSPrinter *jp, const char *s); | |
| | | | |
| #ifdef DEBUG | | #ifdef DEBUG | |
| /* | | /* | |
| * Disassemblers, for debugging only. | | * Disassemblers, for debugging only. | |
| */ | | */ | |
| #include <stdio.h> | | #include <stdio.h> | |
| | | | |
|
| extern JS_FRIEND_API(void) | | extern JS_FRIEND_API(JSBool) | |
| js_Disassemble(JSContext *cx, JSScript *script, JSBool lines, FILE *fp); | | js_Disassemble(JSContext *cx, JSScript *script, JSBool lines, FILE *fp); | |
| | | | |
| extern JS_FRIEND_API(uintN) | | extern JS_FRIEND_API(uintN) | |
| js_Disassemble1(JSContext *cx, JSScript *script, jsbytecode *pc, uintN loc, | | js_Disassemble1(JSContext *cx, JSScript *script, jsbytecode *pc, uintN loc, | |
|
| JSBool lines, FILE *fp); | | JSBool lines, FILE *fp); | |
| #endif /* DEBUG */ | | #endif /* DEBUG */ | |
| | | | |
| /* | | /* | |
| * Decompilers, for script, function, and expression pretty-printing. | | * Decompilers, for script, function, and expression pretty-printing. | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
|
| js_DecompileCode(JSPrinter *jp, JSScript *script, jsbytecode *pc, uintN len | | js_DecompileCode(JSPrinter *jp, JSScript *script, jsbytecode *pc, uintN len | |
| ); | | , | |
| | | uintN pcdepth); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_DecompileScript(JSPrinter *jp, JSScript *script); | | js_DecompileScript(JSPrinter *jp, JSScript *script); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_DecompileFunctionBody(JSPrinter *jp, JSFunction *fun); | | js_DecompileFunctionBody(JSPrinter *jp, JSFunction *fun); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_DecompileFunction(JSPrinter *jp, JSFunction *fun); | | js_DecompileFunction(JSPrinter *jp, JSFunction *fun); | |
| | | | |
| | | | |
| skipping to change at line 268 | | skipping to change at line 311 | |
| * containing it. Fall back on v's string conversion (fallback) if we can'
t | | * containing it. Fall back on v's string conversion (fallback) if we can'
t | |
| * find the bytecode that generated and pushed v on the operand stack. | | * find the bytecode that generated and pushed v on the operand stack. | |
| * | | * | |
| * Search the current stack frame if spindex is JSDVG_SEARCH_STACK. Don't | | * Search the current stack frame if spindex is JSDVG_SEARCH_STACK. Don't | |
| * look for v on the stack if spindex is JSDVG_IGNORE_STACK. Otherwise, | | * look for v on the stack if spindex is JSDVG_IGNORE_STACK. Otherwise, | |
| * spindex is the negative index of v, measured from cx->fp->sp, or from a | | * spindex is the negative index of v, measured from cx->fp->sp, or from a | |
| * lower frame's sp if cx->fp is native. | | * lower frame's sp if cx->fp is native. | |
| */ | | */ | |
| extern JSString * | | extern JSString * | |
| js_DecompileValueGenerator(JSContext *cx, intN spindex, jsval v, | | js_DecompileValueGenerator(JSContext *cx, intN spindex, jsval v, | |
|
| JSString *fallback); | | JSString *fallback); | |
| | | | |
| #define JSDVG_IGNORE_STACK 0 | | #define JSDVG_IGNORE_STACK 0 | |
| #define JSDVG_SEARCH_STACK 1 | | #define JSDVG_SEARCH_STACK 1 | |
| | | | |
| JS_END_EXTERN_C | | JS_END_EXTERN_C | |
| | | | |
| #endif /* jsopcode_h___ */ | | #endif /* jsopcode_h___ */ | |
| | | | |
End of changes. 19 change blocks. |
| 39 lines changed or deleted | | 95 lines changed or added | |
|
| jsparse.h | | jsparse.h | |
| /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- | | /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- | |
|
| | | * vim: set ts=8 sw=4 et tw=78: | |
| * | | * | |
| * ***** BEGIN LICENSE BLOCK ***** | | * ***** BEGIN LICENSE BLOCK ***** | |
| * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | |
| * | | * | |
| * The contents of this file are subject to the Mozilla Public License Vers
ion | | * The contents of this file are subject to the Mozilla Public License Vers
ion | |
| * 1.1 (the "License"); you may not use this file except in compliance with | | * 1.1 (the "License"); you may not use this file except in compliance with | |
| * the License. You may obtain a copy of the License at | | * the License. You may obtain a copy of the License at | |
| * http://www.mozilla.org/MPL/ | | * http://www.mozilla.org/MPL/ | |
| * | | * | |
| * Software distributed under the License is distributed on an "AS IS" basi
s, | | * Software distributed under the License is distributed on an "AS IS" basi
s, | |
| | | | |
| skipping to change at line 45 | | skipping to change at line 46 | |
| * the provisions above, a recipient may use your version of this file unde
r | | * the provisions above, a recipient may use your version of this file unde
r | |
| * the terms of any one of the MPL, the GPL or the LGPL. | | * the terms of any one of the MPL, the GPL or the LGPL. | |
| * | | * | |
| * ***** END LICENSE BLOCK ***** */ | | * ***** END LICENSE BLOCK ***** */ | |
| | | | |
| #ifndef jsparse_h___ | | #ifndef jsparse_h___ | |
| #define jsparse_h___ | | #define jsparse_h___ | |
| /* | | /* | |
| * JS parser definitions. | | * JS parser definitions. | |
| */ | | */ | |
|
| | | #include "jsconfig.h" | |
| #include "jsprvtd.h" | | #include "jsprvtd.h" | |
| #include "jspubtd.h" | | #include "jspubtd.h" | |
| #include "jsscan.h" | | #include "jsscan.h" | |
| | | | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
| /* | | /* | |
| * Parsing builds a tree of nodes that directs code generation. This tree
is | | * Parsing builds a tree of nodes that directs code generation. This tree
is | |
| * not a concrete syntax tree in all respects (for example, || and && are l
eft | | * not a concrete syntax tree in all respects (for example, || and && are l
eft | |
| * associative, but (A && B && C) translates into the right-associated tree | | * associative, but (A && B && C) translates into the right-associated tree | |
| | | | |
| skipping to change at line 83 | | skipping to change at line 85 | |
| * TOK_EXPORT list pn_head: list of pn_count TOK_NAMEs or one TOK_
STAR | | * TOK_EXPORT list pn_head: list of pn_count TOK_NAMEs or one TOK_
STAR | |
| * (which is not a multiply node) | | * (which is not a multiply node) | |
| * TOK_IMPORT list pn_head: list of pn_count sub-trees of the form | | * TOK_IMPORT list pn_head: list of pn_count sub-trees of the form | |
| * a.b.*, a[b].*, a.*, a.b, or a[b] -- but never
a. | | * a.b.*, a[b].*, a.*, a.b, or a[b] -- but never
a. | |
| * Each member is expressed with TOK_DOT or TOK_
LB. | | * Each member is expressed with TOK_DOT or TOK_
LB. | |
| * Each sub-tree's root node has a pn_op in the
set | | * Each sub-tree's root node has a pn_op in the
set | |
| * JSOP_IMPORT{ALL,PROP,ELEM} | | * JSOP_IMPORT{ALL,PROP,ELEM} | |
| * TOK_IF ternary pn_kid1: cond, pn_kid2: then, pn_kid3: else or
null | | * TOK_IF ternary pn_kid1: cond, pn_kid2: then, pn_kid3: else or
null | |
| * TOK_SWITCH binary pn_left: discriminant | | * TOK_SWITCH binary pn_left: discriminant | |
| * pn_right: list of TOK_CASE nodes, with at most
one | | * pn_right: list of TOK_CASE nodes, with at most
one | |
|
| * TOK_DEFAULT node | | * TOK_DEFAULT node, or if there are let binding | |
| | | s | |
| | | * in the top level of the switch body's cases, | |
| | | a | |
| | | * TOK_LEXICALSCOPE node that contains the list | |
| | | of | |
| | | * TOK_CASE nodes. | |
| * TOK_CASE, binary pn_left: case expr or null if TOK_DEFAULT | | * TOK_CASE, binary pn_left: case expr or null if TOK_DEFAULT | |
| * TOK_DEFAULT pn_right: TOK_LC node for this case's statement
s | | * TOK_DEFAULT pn_right: TOK_LC node for this case's statement
s | |
| * pn_val: constant value if lookup or table switc
h | | * pn_val: constant value if lookup or table switc
h | |
| * TOK_WHILE binary pn_left: cond, pn_right: body | | * TOK_WHILE binary pn_left: cond, pn_right: body | |
| * TOK_DO binary pn_left: body, pn_right: cond | | * TOK_DO binary pn_left: body, pn_right: cond | |
| * TOK_FOR binary pn_left: either | | * TOK_FOR binary pn_left: either | |
| * for/in loop: a binary TOK_IN node with | | * for/in loop: a binary TOK_IN node with | |
| * pn_left: TOK_VAR or TOK_NAME to left of 'i
n' | | * pn_left: TOK_VAR or TOK_NAME to left of 'i
n' | |
| * if TOK_VAR, its pn_extra may have PNX_POP
VAR | | * if TOK_VAR, its pn_extra may have PNX_POP
VAR | |
| * and PNX_FORINVAR bits set | | * and PNX_FORINVAR bits set | |
| * pn_right: object expr to right of 'in' | | * pn_right: object expr to right of 'in' | |
| * for(;;) loop: a ternary TOK_RESERVED node wit
h | | * for(;;) loop: a ternary TOK_RESERVED node wit
h | |
| * pn_kid1: init expr before first ';' | | * pn_kid1: init expr before first ';' | |
| * pn_kid2: cond expr before second ';' | | * pn_kid2: cond expr before second ';' | |
| * pn_kid3: update expr after second ';' | | * pn_kid3: update expr after second ';' | |
| * any kid may be null | | * any kid may be null | |
| * pn_right: body | | * pn_right: body | |
| * TOK_THROW unary pn_op: JSOP_THROW, pn_kid: exception | | * TOK_THROW unary pn_op: JSOP_THROW, pn_kid: exception | |
| * TOK_TRY ternary pn_kid1: try block | | * TOK_TRY ternary pn_kid1: try block | |
|
| * pn_kid2: catch blocks or null | | * pn_kid2: null or TOK_RESERVED list of | |
| * pn_kid3: finally block or null | | * TOK_LEXICALSCOPE nodes, each with pn_expr point | |
| * TOK_CATCH ternary pn_kid1: PN_NAME node for catch var (with pn_ex | | ing | |
| pr | | * to a TOK_CATCH node | |
| * null or the catch guard expression) | | * pn_kid3: null or finally block | |
| * pn_kid2: more catch blocks or null | | * TOK_CATCH ternary pn_kid1: TOK_NAME, TOK_RB, or TOK_RC catch var | |
| | | node | |
| | | * (TOK_RB or TOK_RC if destructuring) | |
| | | * pn_kid2: null or the catch guard expression | |
| * pn_kid3: catch block statements | | * pn_kid3: catch block statements | |
| * TOK_BREAK name pn_atom: label or null | | * TOK_BREAK name pn_atom: label or null | |
| * TOK_CONTINUE name pn_atom: label or null | | * TOK_CONTINUE name pn_atom: label or null | |
| * TOK_WITH binary pn_left: head expr, pn_right: body | | * TOK_WITH binary pn_left: head expr, pn_right: body | |
| * TOK_VAR list pn_head: list of pn_count TOK_NAME nodes | | * TOK_VAR list pn_head: list of pn_count TOK_NAME nodes | |
| * each name node has | | * each name node has | |
| * pn_atom: variable name | | * pn_atom: variable name | |
| * pn_expr: initializer or null | | * pn_expr: initializer or null | |
| * TOK_RETURN unary pn_kid: return expr or null | | * TOK_RETURN unary pn_kid: return expr or null | |
| * TOK_SEMI unary pn_kid: expr or null statement | | * TOK_SEMI unary pn_kid: expr or null statement | |
| | | | |
| skipping to change at line 158 | | skipping to change at line 165 | |
| * TOK_STAR, binary pn_left: left-assoc MUL expr, pn_right: UNARY e
xpr | | * TOK_STAR, binary pn_left: left-assoc MUL expr, pn_right: UNARY e
xpr | |
| * TOK_DIVOP pn_op: JSOP_MUL, JSOP_DIV, JSOP_MOD | | * TOK_DIVOP pn_op: JSOP_MUL, JSOP_DIV, JSOP_MOD | |
| * TOK_UNARYOP unary pn_kid: UNARY expr, pn_op: JSOP_NEG, JSOP_POS, | | * TOK_UNARYOP unary pn_kid: UNARY expr, pn_op: JSOP_NEG, JSOP_POS, | |
| * JSOP_NOT, JSOP_BITNOT, JSOP_TYPEOF, JSOP_VOID | | * JSOP_NOT, JSOP_BITNOT, JSOP_TYPEOF, JSOP_VOID | |
| * TOK_INC, unary pn_kid: MEMBER expr | | * TOK_INC, unary pn_kid: MEMBER expr | |
| * TOK_DEC | | * TOK_DEC | |
| * TOK_NEW list pn_head: list of ctor, arg1, arg2, ... argN | | * TOK_NEW list pn_head: list of ctor, arg1, arg2, ... argN | |
| * pn_count: 1 + N (where N is number of args) | | * pn_count: 1 + N (where N is number of args) | |
| * ctor is a MEMBER expr | | * ctor is a MEMBER expr | |
| * TOK_DELETE unary pn_kid: MEMBER expr | | * TOK_DELETE unary pn_kid: MEMBER expr | |
|
| * TOK_DOT name pn_expr: MEMBER expr to left of . | | * TOK_DOT, name pn_expr: MEMBER expr to left of . | |
| * pn_atom: name to right of . | | * TOK_DBLDOT pn_atom: name to right of . | |
| * TOK_LB binary pn_left: MEMBER expr to left of [ | | * TOK_LB binary pn_left: MEMBER expr to left of [ | |
| * pn_right: expr between [ and ] | | * pn_right: expr between [ and ] | |
| * TOK_LP list pn_head: list of call, arg1, arg2, ... argN | | * TOK_LP list pn_head: list of call, arg1, arg2, ... argN | |
| * pn_count: 1 + N (where N is number of args) | | * pn_count: 1 + N (where N is number of args) | |
| * call is a MEMBER expr naming a callable object | | * call is a MEMBER expr naming a callable object | |
| * TOK_RB list pn_head: list of pn_count array element exprs | | * TOK_RB list pn_head: list of pn_count array element exprs | |
| * [,,] holes are represented by TOK_COMMA nodes | | * [,,] holes are represented by TOK_COMMA nodes | |
| * #n=[...] produces TOK_DEFSHARP at head of list | | * #n=[...] produces TOK_DEFSHARP at head of list | |
| * pn_extra: PN_ENDCOMMA if extra comma at end | | * pn_extra: PN_ENDCOMMA if extra comma at end | |
| * TOK_RC list pn_head: list of pn_count TOK_COLON nodes where | | * TOK_RC list pn_head: list of pn_count TOK_COLON nodes where | |
| | | | |
| skipping to change at line 185 | | skipping to change at line 192 | |
| * literal expressions | | * literal expressions | |
| * TOK_USESHARP nullary pn_num: jsint value of n in #n# | | * TOK_USESHARP nullary pn_num: jsint value of n in #n# | |
| * TOK_RP unary pn_kid: parenthesized expression | | * TOK_RP unary pn_kid: parenthesized expression | |
| * TOK_NAME, name pn_atom: name, string, or object atom | | * TOK_NAME, name pn_atom: name, string, or object atom | |
| * TOK_STRING, pn_op: JSOP_NAME, JSOP_STRING, or JSOP_OBJECT,
or | | * TOK_STRING, pn_op: JSOP_NAME, JSOP_STRING, or JSOP_OBJECT,
or | |
| * JSOP_REGEXP | | * JSOP_REGEXP | |
| * TOK_OBJECT If JSOP_NAME, pn_op may be JSOP_*ARG or JSOP_*V
AR | | * TOK_OBJECT If JSOP_NAME, pn_op may be JSOP_*ARG or JSOP_*V
AR | |
| * with pn_slot >= 0 and pn_attrs telling const-ne
ss | | * with pn_slot >= 0 and pn_attrs telling const-ne
ss | |
| * TOK_NUMBER dval pn_dval: double value of numeric literal | | * TOK_NUMBER dval pn_dval: double value of numeric literal | |
| * TOK_PRIMARY nullary pn_op: JSOp bytecode | | * TOK_PRIMARY nullary pn_op: JSOp bytecode | |
|
| | | * | |
| | | * <E4X node descriptions> | |
| | | * TOK_ANYNAME nullary pn_op: JSOP_ANYNAME | |
| | | * pn_atom: cx->runtime->atomState.starAtom | |
| | | * TOK_AT unary pn_op: JSOP_TOATTRNAME; pn_kid attribute id/exp | |
| | | r | |
| | | * TOK_DBLCOLON binary pn_op: JSOP_QNAME | |
| | | * pn_left: TOK_ANYNAME or TOK_NAME node | |
| | | * pn_right: TOK_STRING "*" node, or expr within [ | |
| | | ] | |
| | | * name pn_op: JSOP_QNAMECONST | |
| | | * pn_expr: TOK_ANYNAME or TOK_NAME left operand | |
| | | * pn_atom: name on right of :: | |
| | | * TOK_XMLELEM list XML element node | |
| | | * pn_head: start tag, content1, ... contentN, end | |
| | | tag | |
| | | * pn_count: 2 + N where N is number of content no | |
| | | des | |
| | | * N may be > x.length() if {expr} embed | |
| | | ded | |
| | | * TOK_XMLLIST list XML list node | |
| | | * pn_head: content1, ... contentN | |
| | | * TOK_XMLSTAGO, list XML start, end, and point tag contents | |
| | | * TOK_XMLETAGC, pn_head: tag name or {expr}, ... XML attrs ... | |
| | | * TOK_XMLPTAGO | |
| | | * TOK_XMLNAME nullary pn_atom: XML name, with no {expr} embedded | |
| | | * TOK_XMLNAME list pn_head: tag name or {expr}, ... name or {expr} | |
| | | * TOK_XMLATTR, nullary pn_atom: attribute value string; pn_op: JSOP_ST | |
| | | RING | |
| | | * TOK_XMLCDATA, | |
| | | * TOK_XMLCOMMENT | |
| | | * TOK_XMLPI nullary pn_atom: XML processing instruction target | |
| | | * pn_atom2: XML PI content, or null if no content | |
| | | * TOK_XMLTEXT nullary pn_atom: marked-up text, or null if empty strin | |
| | | g | |
| | | * TOK_LC unary {expr} in XML tag or content; pn_kid is expr | |
| | | * | |
| | | * So an XML tag with no {expr} and three attributes is a list with the for | |
| | | m: | |
| | | * | |
| | | * (tagname attrname1 attrvalue1 attrname2 attrvalue2 attrname2 attrvalu | |
| | | e3) | |
| | | * | |
| | | * An XML tag with embedded expressions like so: | |
| | | * | |
| | | * <name1{expr1} name2{expr2}name3={expr3}> | |
| | | * | |
| | | * would have the form: | |
| | | * | |
| | | * ((name1 {expr1}) (name2 {expr2} name3) {expr3}) | |
| | | * | |
| | | * where () bracket a list with elements separated by spaces, and {expr} is | |
| | | a | |
| | | * TOK_LC unary node with expr as its kid. | |
| | | * | |
| | | * Thus, the attribute name/value pairs occupy successive odd and even list | |
| | | * locations, where pn_head is the TOK_XMLNAME node at list location 0. Th | |
| | | e | |
| | | * parser builds the same sort of structures for elements: | |
| | | * | |
| | | * <a x={x}>Hi there!<b y={y}>How are you?</b><answer>{x + y}</answer></ | |
| | | a> | |
| | | * | |
| | | * translates to: | |
| | | * | |
| | | * ((a x {x}) 'Hi there!' ((b y {y}) 'How are you?') ((answer) {x + y})) | |
| | | * | |
| | | * <Non-E4X node descriptions, continued> | |
| | | * | |
| | | * Label Variant Members | |
| | | * ----- ------- ------- | |
| | | * TOK_LEXICALSCOPE name pn_op: JSOP_LEAVEBLOCK or JSOP_LEAVEBLOCKEX | |
| | | PR | |
| | | * pn_atom: block object | |
| | | * pn_expr: block body | |
| | | * TOK_ARRAYCOMP list pn_head: list of pn_count (1 or 2) elements | |
| | | * if pn_count is 2, first element is #n=[...] | |
| | | * last element is block enclosing for loop( | |
| | | s) | |
| | | * and optionally if-guarded TOK_ARRAYPUSH | |
| | | * pn_extra: stack slot, used during code gen | |
| | | * TOK_ARRAYPUSH unary pn_op: JSOP_ARRAYCOMP | |
| | | * pn_kid: array comprehension expression | |
| */ | | */ | |
| typedef enum JSParseNodeArity { | | typedef enum JSParseNodeArity { | |
| PN_FUNC = -3, | | PN_FUNC = -3, | |
| PN_LIST = -2, | | PN_LIST = -2, | |
| PN_TERNARY = 3, | | PN_TERNARY = 3, | |
| PN_BINARY = 2, | | PN_BINARY = 2, | |
| PN_UNARY = 1, | | PN_UNARY = 1, | |
| PN_NAME = -1, | | PN_NAME = -1, | |
| PN_NULLARY = 0 | | PN_NULLARY = 0 | |
| } JSParseNodeArity; | | } JSParseNodeArity; | |
| | | | |
| struct JSParseNode { | | struct JSParseNode { | |
|
| JSTokenType pn_type; | | uint16 pn_type; | |
| | | uint8 pn_op; | |
| | | int8 pn_arity; | |
| JSTokenPos pn_pos; | | JSTokenPos pn_pos; | |
|
| JSOp pn_op; | | | |
| ptrdiff_t pn_offset; /* first generated bytecode offset
*/ | | ptrdiff_t pn_offset; /* first generated bytecode offset
*/ | |
|
| JSParseNodeArity pn_arity; | | | |
| union { | | union { | |
| struct { /* TOK_FUNCTION node */ | | struct { /* TOK_FUNCTION node */ | |
| JSAtom *funAtom; /* atomized function object */ | | JSAtom *funAtom; /* atomized function object */ | |
| JSParseNode *body; /* TOK_LC list of statements */ | | JSParseNode *body; /* TOK_LC list of statements */ | |
| uint32 flags; /* accumulated tree context flags *
/ | | uint32 flags; /* accumulated tree context flags *
/ | |
| uint32 tryCount; /* count of try statements in body
*/ | | uint32 tryCount; /* count of try statements in body
*/ | |
| } func; | | } func; | |
| struct { /* list of next-linked nodes */ | | struct { /* list of next-linked nodes */ | |
| JSParseNode *head; /* first node in list */ | | JSParseNode *head; /* first node in list */ | |
| JSParseNode **tail; /* ptr to ptr to last node in list
*/ | | JSParseNode **tail; /* ptr to ptr to last node in list
*/ | |
| uint32 count; /* number of nodes in list */ | | uint32 count; /* number of nodes in list */ | |
|
| uint32 extra; /* extra comma flag for [1,2,,] */ | | uint32 extra; /* extra flags, see below */ | |
| } list; | | } list; | |
| struct { /* ternary: if, for(;;), ?: */ | | struct { /* ternary: if, for(;;), ?: */ | |
| JSParseNode *kid1; /* condition, discriminant, etc. */ | | JSParseNode *kid1; /* condition, discriminant, etc. */ | |
| JSParseNode *kid2; /* then-part, case list, etc. */ | | JSParseNode *kid2; /* then-part, case list, etc. */ | |
| JSParseNode *kid3; /* else-part, default case, etc. */ | | JSParseNode *kid3; /* else-part, default case, etc. */ | |
| } ternary; | | } ternary; | |
| struct { /* two kids if binary */ | | struct { /* two kids if binary */ | |
| JSParseNode *left; | | JSParseNode *left; | |
| JSParseNode *right; | | JSParseNode *right; | |
| jsval val; /* switch case value */ | | jsval val; /* switch case value */ | |
| | | | |
| skipping to change at line 235 | | skipping to change at line 311 | |
| struct { /* one kid if unary */ | | struct { /* one kid if unary */ | |
| JSParseNode *kid; | | JSParseNode *kid; | |
| jsint num; /* -1 or sharp variable number */ | | jsint num; /* -1 or sharp variable number */ | |
| } unary; | | } unary; | |
| struct { /* name, labeled statement, etc. */ | | struct { /* name, labeled statement, etc. */ | |
| JSAtom *atom; /* name or label atom, null if slot
*/ | | JSAtom *atom; /* name or label atom, null if slot
*/ | |
| JSParseNode *expr; /* object or initializer */ | | JSParseNode *expr; /* object or initializer */ | |
| jsint slot; /* -1 or arg or local var slot */ | | jsint slot; /* -1 or arg or local var slot */ | |
| uintN attrs; /* attributes if local var or const
*/ | | uintN attrs; /* attributes if local var or const
*/ | |
| } name; | | } name; | |
|
| | | struct { | |
| | | JSAtom *atom; /* first atom in pair */ | |
| | | JSAtom *atom2; /* second atom in pair or null */ | |
| | | } apair; | |
| jsdouble dval; /* aligned numeric literal value */ | | jsdouble dval; /* aligned numeric literal value */ | |
| } pn_u; | | } pn_u; | |
| JSParseNode *pn_next; /* to align dval and pn_u on RISCs
*/ | | JSParseNode *pn_next; /* to align dval and pn_u on RISCs
*/ | |
|
| | | JSTokenStream *pn_ts; /* token stream for error reports * | |
| | | / | |
| | | JSAtom *pn_source; /* saved source for decompilation * | |
| | | / | |
| }; | | }; | |
| | | | |
| #define pn_funAtom pn_u.func.funAtom | | #define pn_funAtom pn_u.func.funAtom | |
| #define pn_body pn_u.func.body | | #define pn_body pn_u.func.body | |
| #define pn_flags pn_u.func.flags | | #define pn_flags pn_u.func.flags | |
| #define pn_tryCount pn_u.func.tryCount | | #define pn_tryCount pn_u.func.tryCount | |
| #define pn_head pn_u.list.head | | #define pn_head pn_u.list.head | |
| #define pn_tail pn_u.list.tail | | #define pn_tail pn_u.list.tail | |
| #define pn_count pn_u.list.count | | #define pn_count pn_u.list.count | |
| #define pn_extra pn_u.list.extra | | #define pn_extra pn_u.list.extra | |
| | | | |
| skipping to change at line 261 | | skipping to change at line 343 | |
| #define pn_left pn_u.binary.left | | #define pn_left pn_u.binary.left | |
| #define pn_right pn_u.binary.right | | #define pn_right pn_u.binary.right | |
| #define pn_val pn_u.binary.val | | #define pn_val pn_u.binary.val | |
| #define pn_kid pn_u.unary.kid | | #define pn_kid pn_u.unary.kid | |
| #define pn_num pn_u.unary.num | | #define pn_num pn_u.unary.num | |
| #define pn_atom pn_u.name.atom | | #define pn_atom pn_u.name.atom | |
| #define pn_expr pn_u.name.expr | | #define pn_expr pn_u.name.expr | |
| #define pn_slot pn_u.name.slot | | #define pn_slot pn_u.name.slot | |
| #define pn_attrs pn_u.name.attrs | | #define pn_attrs pn_u.name.attrs | |
| #define pn_dval pn_u.dval | | #define pn_dval pn_u.dval | |
|
| | | #define pn_atom2 pn_u.apair.atom2 | |
| | | | |
| /* PN_LIST pn_extra flags. */ | | /* PN_LIST pn_extra flags. */ | |
| #define PNX_STRCAT 0x01 /* TOK_PLUS list has string term */ | | #define PNX_STRCAT 0x01 /* TOK_PLUS list has string term */ | |
| #define PNX_CANTFOLD 0x02 /* TOK_PLUS list has unfoldable ter
m */ | | #define PNX_CANTFOLD 0x02 /* TOK_PLUS list has unfoldable ter
m */ | |
| #define PNX_POPVAR 0x04 /* TOK_VAR last result needs poppin
g */ | | #define PNX_POPVAR 0x04 /* TOK_VAR last result needs poppin
g */ | |
| #define PNX_FORINVAR 0x08 /* TOK_VAR is left kid of TOK_IN no
de, | | #define PNX_FORINVAR 0x08 /* TOK_VAR is left kid of TOK_IN no
de, | |
| which is left kid of TOK_FOR */ | | which is left kid of TOK_FOR */ | |
| #define PNX_ENDCOMMA 0x10 /* array literal has comma at end *
/ | | #define PNX_ENDCOMMA 0x10 /* array literal has comma at end *
/ | |
|
| | | #define PNX_XMLROOT 0x20 /* top-most node in XML literal tre | |
| | | e */ | |
| | | #define PNX_GROUPINIT 0x40 /* var [a, b] = [c, d]; unit list * | |
| | | / | |
| | | #define PNX_NEEDBRACES 0x80 /* braces necessary due to closure | |
| | | */ | |
| | | | |
| /* | | /* | |
| * Move pn2 into pn, preserving pn->pn_pos and pn->pn_offset and handing of
f | | * Move pn2 into pn, preserving pn->pn_pos and pn->pn_offset and handing of
f | |
| * any kids in pn2->pn_u, by clearing pn2. | | * any kids in pn2->pn_u, by clearing pn2. | |
| */ | | */ | |
| #define PN_MOVE_NODE(pn, pn2)
\ | | #define PN_MOVE_NODE(pn, pn2)
\ | |
| JS_BEGIN_MACRO
\ | | JS_BEGIN_MACRO
\ | |
| (pn)->pn_type = (pn2)->pn_type;
\ | | (pn)->pn_type = (pn2)->pn_type;
\ | |
| (pn)->pn_op = (pn2)->pn_op;
\ | | (pn)->pn_op = (pn2)->pn_op;
\ | |
| (pn)->pn_arity = (pn2)->pn_arity;
\ | | (pn)->pn_arity = (pn2)->pn_arity;
\ | |
| | | | |
| skipping to change at line 307 | | skipping to change at line 393 | |
| * Compute a pointer to the last JSParseNode element in a singly-linked lis
t. | | * Compute a pointer to the last JSParseNode element in a singly-linked lis
t. | |
| * NB: list must be non-empty for correct PN_LAST usage! | | * NB: list must be non-empty for correct PN_LAST usage! | |
| */ | | */ | |
| #define PN_LAST(list) \ | | #define PN_LAST(list) \ | |
| ((JSParseNode *)((char *)(list)->pn_tail - offsetof(JSParseNode, pn_nex
t))) | | ((JSParseNode *)((char *)(list)->pn_tail - offsetof(JSParseNode, pn_nex
t))) | |
| | | | |
| #define PN_INIT_LIST(list)
\ | | #define PN_INIT_LIST(list)
\ | |
| JS_BEGIN_MACRO
\ | | JS_BEGIN_MACRO
\ | |
| (list)->pn_head = NULL;
\ | | (list)->pn_head = NULL;
\ | |
| (list)->pn_tail = &(list)->pn_head;
\ | | (list)->pn_tail = &(list)->pn_head;
\ | |
|
| (list)->pn_count = 0;
\ | | (list)->pn_count = (list)->pn_extra = 0;
\ | |
| JS_END_MACRO | | JS_END_MACRO | |
| | | | |
| #define PN_INIT_LIST_1(list, pn)
\ | | #define PN_INIT_LIST_1(list, pn)
\ | |
| JS_BEGIN_MACRO
\ | | JS_BEGIN_MACRO
\ | |
| (list)->pn_head = (pn);
\ | | (list)->pn_head = (pn);
\ | |
| (list)->pn_tail = &(pn)->pn_next;
\ | | (list)->pn_tail = &(pn)->pn_next;
\ | |
| (list)->pn_count = 1;
\ | | (list)->pn_count = 1;
\ | |
|
| | | (list)->pn_extra = 0;
\ | |
| JS_END_MACRO | | JS_END_MACRO | |
| | | | |
| #define PN_APPEND(list, pn)
\ | | #define PN_APPEND(list, pn)
\ | |
| JS_BEGIN_MACRO
\ | | JS_BEGIN_MACRO
\ | |
| *(list)->pn_tail = (pn);
\ | | *(list)->pn_tail = (pn);
\ | |
| (list)->pn_tail = &(pn)->pn_next;
\ | | (list)->pn_tail = &(pn)->pn_next;
\ | |
| (list)->pn_count++;
\ | | (list)->pn_count++;
\ | |
| JS_END_MACRO | | JS_END_MACRO | |
| | | | |
| /* | | /* | |
| | | | |
| skipping to change at line 343 | | skipping to change at line 430 | |
| extern JS_FRIEND_API(JSBool) | | extern JS_FRIEND_API(JSBool) | |
| js_CompileTokenStream(JSContext *cx, JSObject *chain, JSTokenStream *ts, | | js_CompileTokenStream(JSContext *cx, JSObject *chain, JSTokenStream *ts, | |
| JSCodeGenerator *cg); | | JSCodeGenerator *cg); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_CompileFunctionBody(JSContext *cx, JSTokenStream *ts, JSFunction *fun); | | js_CompileFunctionBody(JSContext *cx, JSTokenStream *ts, JSFunction *fun); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_FoldConstants(JSContext *cx, JSParseNode *pn, JSTreeContext *tc); | | js_FoldConstants(JSContext *cx, JSParseNode *pn, JSTreeContext *tc); | |
| | | | |
|
| | | #if JS_HAS_XML_SUPPORT | |
| | | JS_FRIEND_API(JSParseNode *) | |
| | | js_ParseXMLTokenStream(JSContext *cx, JSObject *chain, JSTokenStream *ts, | |
| | | JSBool allowList); | |
| | | #endif | |
| | | | |
| JS_END_EXTERN_C | | JS_END_EXTERN_C | |
| | | | |
| #endif /* jsparse_h___ */ | | #endif /* jsparse_h___ */ | |
| | | | |
End of changes. 17 change blocks. |
| 14 lines changed or deleted | | 130 lines changed or added | |
|
| jspubtd.h | | jspubtd.h | |
| | | | |
| skipping to change at line 72 | | skipping to change at line 72 | |
| * #if expressions. | | * #if expressions. | |
| */ | | */ | |
| typedef enum JSVersion { | | typedef enum JSVersion { | |
| JSVERSION_1_0 = 100, | | JSVERSION_1_0 = 100, | |
| JSVERSION_1_1 = 110, | | JSVERSION_1_1 = 110, | |
| JSVERSION_1_2 = 120, | | JSVERSION_1_2 = 120, | |
| JSVERSION_1_3 = 130, | | JSVERSION_1_3 = 130, | |
| JSVERSION_1_4 = 140, | | JSVERSION_1_4 = 140, | |
| JSVERSION_ECMA_3 = 148, | | JSVERSION_ECMA_3 = 148, | |
| JSVERSION_1_5 = 150, | | JSVERSION_1_5 = 150, | |
|
| | | JSVERSION_1_6 = 160, | |
| | | JSVERSION_1_7 = 170, | |
| JSVERSION_DEFAULT = 0, | | JSVERSION_DEFAULT = 0, | |
| JSVERSION_UNKNOWN = -1 | | JSVERSION_UNKNOWN = -1 | |
| } JSVersion; | | } JSVersion; | |
| | | | |
| #define JSVERSION_IS_ECMA(version) \ | | #define JSVERSION_IS_ECMA(version) \ | |
| ((version) == JSVERSION_DEFAULT || (version) >= JSVERSION_1_3) | | ((version) == JSVERSION_DEFAULT || (version) >= JSVERSION_1_3) | |
| | | | |
| /* Result of typeof operator enumeration. */ | | /* Result of typeof operator enumeration. */ | |
| typedef enum JSType { | | typedef enum JSType { | |
| JSTYPE_VOID, /* undefined */ | | JSTYPE_VOID, /* undefined */ | |
| JSTYPE_OBJECT, /* object */ | | JSTYPE_OBJECT, /* object */ | |
| JSTYPE_FUNCTION, /* function */ | | JSTYPE_FUNCTION, /* function */ | |
| JSTYPE_STRING, /* string */ | | JSTYPE_STRING, /* string */ | |
| JSTYPE_NUMBER, /* number */ | | JSTYPE_NUMBER, /* number */ | |
| JSTYPE_BOOLEAN, /* boolean */ | | JSTYPE_BOOLEAN, /* boolean */ | |
|
| | | JSTYPE_NULL, /* null */ | |
| | | JSTYPE_XML, /* xml object */ | |
| JSTYPE_LIMIT | | JSTYPE_LIMIT | |
| } JSType; | | } JSType; | |
| | | | |
|
| | | /* Dense index into cached prototypes and class atoms for standard objects. | |
| | | */ | |
| | | typedef enum JSProtoKey { | |
| | | #define JS_PROTO(name,code,init) JSProto_##name = code, | |
| | | #include "jsproto.tbl" | |
| | | #undef JS_PROTO | |
| | | JSProto_LIMIT | |
| | | } JSProtoKey; | |
| | | | |
| /* JSObjectOps.checkAccess mode enumeration. */ | | /* JSObjectOps.checkAccess mode enumeration. */ | |
| typedef enum JSAccessMode { | | typedef enum JSAccessMode { | |
| JSACC_PROTO = 0, /* XXXbe redundant w.r.t. id */ | | JSACC_PROTO = 0, /* XXXbe redundant w.r.t. id */ | |
| JSACC_PARENT = 1, /* XXXbe redundant w.r.t. id */ | | JSACC_PARENT = 1, /* XXXbe redundant w.r.t. id */ | |
| JSACC_IMPORT = 2, /* import foo.bar */ | | JSACC_IMPORT = 2, /* import foo.bar */ | |
| JSACC_WATCH = 3, /* a watchpoint on object foo for id 'bar'
*/ | | JSACC_WATCH = 3, /* a watchpoint on object foo for id 'bar'
*/ | |
| JSACC_READ = 4, /* a "get" of foo.bar */ | | JSACC_READ = 4, /* a "get" of foo.bar */ | |
| JSACC_WRITE = 8, /* a "set" of foo.bar = baz */ | | JSACC_WRITE = 8, /* a "set" of foo.bar = baz */ | |
| JSACC_LIMIT | | JSACC_LIMIT | |
| } JSAccessMode; | | } JSAccessMode; | |
| | | | |
| skipping to change at line 115 | | skipping to change at line 127 | |
| * iterator function that has type JSNewEnumerate. | | * iterator function that has type JSNewEnumerate. | |
| */ | | */ | |
| typedef enum JSIterateOp { | | typedef enum JSIterateOp { | |
| JSENUMERATE_INIT, /* Create new iterator state */ | | JSENUMERATE_INIT, /* Create new iterator state */ | |
| JSENUMERATE_NEXT, /* Iterate once */ | | JSENUMERATE_NEXT, /* Iterate once */ | |
| JSENUMERATE_DESTROY /* Destroy iterator state */ | | JSENUMERATE_DESTROY /* Destroy iterator state */ | |
| } JSIterateOp; | | } JSIterateOp; | |
| | | | |
| /* Struct typedefs. */ | | /* Struct typedefs. */ | |
| typedef struct JSClass JSClass; | | typedef struct JSClass JSClass; | |
|
| | | typedef struct JSExtendedClass JSExtendedClass; | |
| typedef struct JSConstDoubleSpec JSConstDoubleSpec; | | typedef struct JSConstDoubleSpec JSConstDoubleSpec; | |
| typedef struct JSContext JSContext; | | typedef struct JSContext JSContext; | |
| typedef struct JSErrorReport JSErrorReport; | | typedef struct JSErrorReport JSErrorReport; | |
| typedef struct JSFunction JSFunction; | | typedef struct JSFunction JSFunction; | |
| typedef struct JSFunctionSpec JSFunctionSpec; | | typedef struct JSFunctionSpec JSFunctionSpec; | |
| typedef struct JSIdArray JSIdArray; | | typedef struct JSIdArray JSIdArray; | |
| typedef struct JSProperty JSProperty; | | typedef struct JSProperty JSProperty; | |
| typedef struct JSPropertySpec JSPropertySpec; | | typedef struct JSPropertySpec JSPropertySpec; | |
| typedef struct JSObject JSObject; | | typedef struct JSObject JSObject; | |
| typedef struct JSObjectMap JSObjectMap; | | typedef struct JSObjectMap JSObjectMap; | |
| typedef struct JSObjectOps JSObjectOps; | | typedef struct JSObjectOps JSObjectOps; | |
|
| | | typedef struct JSXMLObjectOps JSXMLObjectOps; | |
| typedef struct JSRuntime JSRuntime; | | typedef struct JSRuntime JSRuntime; | |
|
| typedef struct JSRuntime JSTaskState; /* XXX deprecated name */ | | typedef struct JSRuntime JSTaskState; /* XXX deprecated name */ | |
| typedef struct JSScript JSScript; | | typedef struct JSScript JSScript; | |
|
| | | typedef struct JSStackFrame JSStackFrame; | |
| typedef struct JSString JSString; | | typedef struct JSString JSString; | |
|
| typedef struct JSXDRState JSXDRState; | | typedef struct JSXDRState JSXDRState; | |
| typedef struct JSExceptionState JSExceptionState; | | typedef struct JSExceptionState JSExceptionState; | |
| typedef struct JSLocaleCallbacks JSLocaleCallbacks; | | typedef struct JSLocaleCallbacks JSLocaleCallbacks; | |
| | | | |
| /* JSClass (and JSObjectOps where appropriate) function pointer typedefs. *
/ | | /* JSClass (and JSObjectOps where appropriate) function pointer typedefs. *
/ | |
| | | | |
| /* | | /* | |
| * Add, delete, get or set a property named by id in obj. Note the jsval i
d | | * Add, delete, get or set a property named by id in obj. Note the jsval i
d | |
| * type -- id may be a string (Unicode property identifier) or an int (elem
ent | | * type -- id may be a string (Unicode property identifier) or an int (elem
ent | |
| * index). The *vp out parameter, on success, is the new property value af
ter | | * index). The *vp out parameter, on success, is the new property value af
ter | |
| * an add, get, or set. After a successful delete, *vp is JSVAL_FALSE iff | | * an add, get, or set. After a successful delete, *vp is JSVAL_FALSE iff | |
| | | | |
| skipping to change at line 206 | | skipping to change at line 221 | |
| * NB: JSNewResolveOp provides a cheaper way to resolve lazy properties. | | * NB: JSNewResolveOp provides a cheaper way to resolve lazy properties. | |
| */ | | */ | |
| typedef JSBool | | typedef JSBool | |
| (* JS_DLL_CALLBACK JSResolveOp)(JSContext *cx, JSObject *obj, jsval id); | | (* JS_DLL_CALLBACK JSResolveOp)(JSContext *cx, JSObject *obj, jsval id); | |
| | | | |
| /* | | /* | |
| * Like JSResolveOp, but flags provide contextual information as follows: | | * Like JSResolveOp, but flags provide contextual information as follows: | |
| * | | * | |
| * JSRESOLVE_QUALIFIED a qualified property id: obj.id or obj[id], not i
d | | * JSRESOLVE_QUALIFIED a qualified property id: obj.id or obj[id], not i
d | |
| * JSRESOLVE_ASSIGNING obj[id] is on the left-hand side of an assignment | | * JSRESOLVE_ASSIGNING obj[id] is on the left-hand side of an assignment | |
|
| | | * JSRESOLVE_DETECTING 'if (o.p)...' or similar detection opcode sequenc | |
| | | e | |
| | | * JSRESOLVE_DECLARING var, const, or function prolog declaration opcode | |
| | | * JSRESOLVE_CLASSNAME class name used when constructing | |
| * | | * | |
| * The *objp out parameter, on success, should be null to indicate that id | | * The *objp out parameter, on success, should be null to indicate that id | |
| * was not resolved; and non-null, referring to obj or one of its prototype
s, | | * was not resolved; and non-null, referring to obj or one of its prototype
s, | |
| * if id was resolved. | | * if id was resolved. | |
| * | | * | |
| * This hook instead of JSResolveOp is called via the JSClass.resolve membe
r | | * This hook instead of JSResolveOp is called via the JSClass.resolve membe
r | |
| * if JSCLASS_NEW_RESOLVE is set in JSClass.flags. | | * if JSCLASS_NEW_RESOLVE is set in JSClass.flags. | |
| * | | * | |
| * Setting JSCLASS_NEW_RESOLVE and JSCLASS_NEW_RESOLVE_GETS_START further | | * Setting JSCLASS_NEW_RESOLVE and JSCLASS_NEW_RESOLVE_GETS_START further | |
| * extends this hook by passing in the starting object on the prototype cha
in | | * extends this hook by passing in the starting object on the prototype cha
in | |
| | | | |
| skipping to change at line 266 | | skipping to change at line 284 | |
| * to discover the set of high-level object operations to use for new objec
ts | | * to discover the set of high-level object operations to use for new objec
ts | |
| * of the given class. All native objects have a JSClass, which is stored
as | | * of the given class. All native objects have a JSClass, which is stored
as | |
| * a private (int-tagged) pointer in obj->slots[JSSLOT_CLASS]. In contrast
, | | * a private (int-tagged) pointer in obj->slots[JSSLOT_CLASS]. In contrast
, | |
| * all native and host objects have a JSObjectMap at obj->map, which may be | | * all native and host objects have a JSObjectMap at obj->map, which may be | |
| * shared among a number of objects, and which contains the JSObjectOps *op
s | | * shared among a number of objects, and which contains the JSObjectOps *op
s | |
| * pointer used to dispatch object operations from API calls. | | * pointer used to dispatch object operations from API calls. | |
| * | | * | |
| * Thus JSClass (which pre-dates JSObjectOps in the API) provides a low-lev
el | | * Thus JSClass (which pre-dates JSObjectOps in the API) provides a low-lev
el | |
| * interface to class-specific code and data, while JSObjectOps allows for
a | | * interface to class-specific code and data, while JSObjectOps allows for
a | |
| * higher level of operation, which does not use the object's class except
to | | * higher level of operation, which does not use the object's class except
to | |
|
| * find the class's JSObjectOps struct, by calling clasp->getObjectOps. | | * find the class's JSObjectOps struct, by calling clasp->getObjectOps, and | |
| | | to | |
| | | * finalize the object. | |
| * | | * | |
| * If this seems backwards, that's because it is! API compatibility requir
es | | * If this seems backwards, that's because it is! API compatibility requir
es | |
| * a JSClass *clasp parameter to JS_NewObject, etc. Most host objects do n
ot | | * a JSClass *clasp parameter to JS_NewObject, etc. Most host objects do n
ot | |
| * need to implement the larger JSObjectOps, and can share the common JSSco
pe | | * need to implement the larger JSObjectOps, and can share the common JSSco
pe | |
| * code and data used by the native (js_ObjectOps, see jsobj.c) ops. | | * code and data used by the native (js_ObjectOps, see jsobj.c) ops. | |
|
| | | * | |
| | | * Further extension to preserve API compatibility: if this function return | |
| | | s | |
| | | * a pointer to JSXMLObjectOps.base, not to JSObjectOps, then the engine ca | |
| | | lls | |
| | | * extended hooks needed for E4X. | |
| */ | | */ | |
| typedef JSObjectOps * | | typedef JSObjectOps * | |
| (* JS_DLL_CALLBACK JSGetObjectOps)(JSContext *cx, JSClass *clasp); | | (* JS_DLL_CALLBACK JSGetObjectOps)(JSContext *cx, JSClass *clasp); | |
| | | | |
| /* | | /* | |
| * JSClass.checkAccess type: check whether obj[id] may be accessed per mode
, | | * JSClass.checkAccess type: check whether obj[id] may be accessed per mode
, | |
| * returning false on error/exception, true on success with obj[id]'s last-
got | | * returning false on error/exception, true on success with obj[id]'s last-
got | |
| * value in *vp, and its attributes in *attrsp. As for JSPropertyOp above,
id | | * value in *vp, and its attributes in *attrsp. As for JSPropertyOp above,
id | |
| * is either a string or an int jsval. | | * is either a string or an int jsval. | |
| * | | * | |
| | | | |
| skipping to change at line 390 | | skipping to change at line 413 | |
| * that bypasses id re-lookup. In any case, a non-null *propp result after
a | | * that bypasses id re-lookup. In any case, a non-null *propp result after
a | |
| * successful lookup must be dropped via JSObjectOps.dropProperty. | | * successful lookup must be dropped via JSObjectOps.dropProperty. | |
| * | | * | |
| * NB: successful return with non-null *propp means the implementation may | | * NB: successful return with non-null *propp means the implementation may | |
| * have locked *objp and added a reference count associated with *propp, so | | * have locked *objp and added a reference count associated with *propp, so | |
| * callers should not risk deadlock by nesting or interleaving other lookup
s | | * callers should not risk deadlock by nesting or interleaving other lookup
s | |
| * or any obj-bearing ops before dropping *propp. | | * or any obj-bearing ops before dropping *propp. | |
| */ | | */ | |
| typedef JSBool | | typedef JSBool | |
| (* JS_DLL_CALLBACK JSLookupPropOp)(JSContext *cx, JSObject *obj, jsid id, | | (* JS_DLL_CALLBACK JSLookupPropOp)(JSContext *cx, JSObject *obj, jsid id, | |
|
| JSObject **objp, JSProperty **propp | | JSObject **objp, JSProperty **propp); | |
| #if defined JS_THREADSAFE && defined DEBUG | | | |
| , const char *file, uintN line | | | |
| #endif | | | |
| ); | | | |
| | | | |
| /* | | /* | |
| * Define obj[id], a direct property of obj named id, having the given init
ial | | * Define obj[id], a direct property of obj named id, having the given init
ial | |
| * value, with the specified getter, setter, and attributes. If the propp
out | | * value, with the specified getter, setter, and attributes. If the propp
out | |
| * param is non-null, *propp on successful return contains an opaque proper
ty | | * param is non-null, *propp on successful return contains an opaque proper
ty | |
| * pointer usable as a speedup hint with JSAttributesOp. But note that pro
pp | | * pointer usable as a speedup hint with JSAttributesOp. But note that pro
pp | |
| * may be null, indicating that the caller is not interested in recovering
an | | * may be null, indicating that the caller is not interested in recovering
an | |
| * opaque pointer to the newly-defined property. | | * opaque pointer to the newly-defined property. | |
| * | | * | |
| * If propp is non-null and JSDefinePropOp succeeds, its caller must be sur
e | | * If propp is non-null and JSDefinePropOp succeeds, its caller must be sur
e | |
| | | | |
| skipping to change at line 494 | | skipping to change at line 513 | |
| * class, and optionally, the private data slot. | | * class, and optionally, the private data slot. | |
| */ | | */ | |
| typedef jsval | | typedef jsval | |
| (* JS_DLL_CALLBACK JSGetRequiredSlotOp)(JSContext *cx, JSObject *obj, | | (* JS_DLL_CALLBACK JSGetRequiredSlotOp)(JSContext *cx, JSObject *obj, | |
| uint32 slot); | | uint32 slot); | |
| | | | |
| typedef JSBool | | typedef JSBool | |
| (* JS_DLL_CALLBACK JSSetRequiredSlotOp)(JSContext *cx, JSObject *obj, | | (* JS_DLL_CALLBACK JSSetRequiredSlotOp)(JSContext *cx, JSObject *obj, | |
| uint32 slot, jsval v); | | uint32 slot, jsval v); | |
| | | | |
|
| | | typedef JSObject * | |
| | | (* JS_DLL_CALLBACK JSGetMethodOp)(JSContext *cx, JSObject *obj, jsid id, | |
| | | jsval *vp); | |
| | | | |
| | | typedef JSBool | |
| | | (* JS_DLL_CALLBACK JSSetMethodOp)(JSContext *cx, JSObject *obj, jsid id, | |
| | | jsval *vp); | |
| | | | |
| | | typedef JSBool | |
| | | (* JS_DLL_CALLBACK JSEnumerateValuesOp)(JSContext *cx, JSObject *obj, | |
| | | JSIterateOp enum_op, | |
| | | jsval *statep, jsid *idp, jsval *vp | |
| | | ); | |
| | | | |
| | | typedef JSBool | |
| | | (* JS_DLL_CALLBACK JSEqualityOp)(JSContext *cx, JSObject *obj, jsval v, | |
| | | JSBool *bp); | |
| | | | |
| | | typedef JSBool | |
| | | (* JS_DLL_CALLBACK JSConcatenateOp)(JSContext *cx, JSObject *obj, jsval v, | |
| | | jsval *vp); | |
| | | | |
| /* Typedef for native functions called by the JS VM. */ | | /* Typedef for native functions called by the JS VM. */ | |
| | | | |
| typedef JSBool | | typedef JSBool | |
| (* JS_DLL_CALLBACK JSNative)(JSContext *cx, JSObject *obj, uintN argc, | | (* JS_DLL_CALLBACK JSNative)(JSContext *cx, JSObject *obj, uintN argc, | |
| jsval *argv, jsval *rval); | | jsval *argv, jsval *rval); | |
| | | | |
| /* Callbacks and their arguments. */ | | /* Callbacks and their arguments. */ | |
| | | | |
|
| | | typedef enum JSContextOp { | |
| | | JSCONTEXT_NEW, | |
| | | JSCONTEXT_DESTROY | |
| | | } JSContextOp; | |
| | | | |
| | | /* | |
| | | * The possible values for contextOp when the runtime calls the callback ar | |
| | | e: | |
| | | * JSCONTEXT_NEW JS_NewContext succesfully created a new JSContext | |
| | | * instance. The callback can initialize the instance | |
| | | as | |
| | | * required. If the callback returns false, the instan | |
| | | ce | |
| | | * will be destroyed and JS_NewContext returns null. I | |
| | | n | |
| | | * this case the callback is not called again. | |
| | | * JSCONTEXT_DESTROY One of JS_DestroyContext* methods is called. The | |
| | | * callback may perform its own cleanup and must alway | |
| | | s | |
| | | * return true. | |
| | | * Any other value For future compatibility the callback must do nothi | |
| | | ng | |
| | | * and return true in this case. | |
| | | */ | |
| | | typedef JSBool | |
| | | (* JS_DLL_CALLBACK JSContextCallback)(JSContext *cx, uintN contextOp); | |
| | | | |
| typedef enum JSGCStatus { | | typedef enum JSGCStatus { | |
| JSGC_BEGIN, | | JSGC_BEGIN, | |
| JSGC_END, | | JSGC_END, | |
| JSGC_MARK_END, | | JSGC_MARK_END, | |
| JSGC_FINALIZE_END | | JSGC_FINALIZE_END | |
| } JSGCStatus; | | } JSGCStatus; | |
| | | | |
| typedef JSBool | | typedef JSBool | |
| (* JS_DLL_CALLBACK JSGCCallback)(JSContext *cx, JSGCStatus status); | | (* JS_DLL_CALLBACK JSGCCallback)(JSContext *cx, JSGCStatus status); | |
| | | | |
| typedef JSBool | | typedef JSBool | |
| (* JS_DLL_CALLBACK JSBranchCallback)(JSContext *cx, JSScript *script); | | (* JS_DLL_CALLBACK JSBranchCallback)(JSContext *cx, JSScript *script); | |
| | | | |
| typedef void | | typedef void | |
| (* JS_DLL_CALLBACK JSErrorReporter)(JSContext *cx, const char *message, | | (* JS_DLL_CALLBACK JSErrorReporter)(JSContext *cx, const char *message, | |
| JSErrorReport *report); | | JSErrorReport *report); | |
| | | | |
|
| | | /* | |
| | | * Possible exception types. These types are part of a JSErrorFormatString | |
| | | * structure. They define which error to throw in case of a runtime error. | |
| | | * JSEXN_NONE marks an unthrowable error. | |
| | | */ | |
| | | typedef enum JSExnType { | |
| | | JSEXN_NONE = -1, | |
| | | JSEXN_ERR, | |
| | | JSEXN_INTERNALERR, | |
| | | JSEXN_EVALERR, | |
| | | JSEXN_RANGEERR, | |
| | | JSEXN_REFERENCEERR, | |
| | | JSEXN_SYNTAXERR, | |
| | | JSEXN_TYPEERR, | |
| | | JSEXN_URIERR, | |
| | | JSEXN_LIMIT | |
| | | } JSExnType; | |
| | | | |
| typedef struct JSErrorFormatString { | | typedef struct JSErrorFormatString { | |
|
| | | /* The error format string (UTF-8 if JS_C_STRINGS_ARE_UTF8 is defined).
*/ | |
| const char *format; | | const char *format; | |
|
| uintN argCount; | | | |
| | | /* The number of arguments to expand in the formatted error message. */ | |
| | | uint16 argCount; | |
| | | | |
| | | /* One of the JSExnType constants above. */ | |
| | | int16 exnType; | |
| } JSErrorFormatString; | | } JSErrorFormatString; | |
| | | | |
| typedef const JSErrorFormatString * | | typedef const JSErrorFormatString * | |
| (* JS_DLL_CALLBACK JSErrorCallback)(void *userRef, const char *locale, | | (* JS_DLL_CALLBACK JSErrorCallback)(void *userRef, const char *locale, | |
|
| const uintN errorNumber); | | const uintN errorNumber); | |
| | | | |
| #ifdef va_start | | #ifdef va_start | |
| #define JS_ARGUMENT_FORMATTER_DEFINED 1 | | #define JS_ARGUMENT_FORMATTER_DEFINED 1 | |
| | | | |
| typedef JSBool | | typedef JSBool | |
| (* JS_DLL_CALLBACK JSArgumentFormatter)(JSContext *cx, const char *format, | | (* JS_DLL_CALLBACK JSArgumentFormatter)(JSContext *cx, const char *format, | |
| JSBool fromJS, jsval **vpp, | | JSBool fromJS, jsval **vpp, | |
| va_list *app); | | va_list *app); | |
| #endif | | #endif | |
| | | | |
| | | | |
End of changes. 18 change blocks. |
| 10 lines changed or deleted | | 107 lines changed or added | |
|
| jsscan.h | | jsscan.h | |
| | | | |
| skipping to change at line 47 | | skipping to change at line 47 | |
| * | | * | |
| * ***** END LICENSE BLOCK ***** */ | | * ***** END LICENSE BLOCK ***** */ | |
| | | | |
| #ifndef jsscan_h___ | | #ifndef jsscan_h___ | |
| #define jsscan_h___ | | #define jsscan_h___ | |
| /* | | /* | |
| * JS lexical scanner interface. | | * JS lexical scanner interface. | |
| */ | | */ | |
| #include <stddef.h> | | #include <stddef.h> | |
| #include <stdio.h> | | #include <stdio.h> | |
|
| | | #include "jsconfig.h" | |
| #include "jsopcode.h" | | #include "jsopcode.h" | |
| #include "jsprvtd.h" | | #include "jsprvtd.h" | |
| #include "jspubtd.h" | | #include "jspubtd.h" | |
| | | | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
|
| | | #define JS_KEYWORD(keyword, type, op, version) \ | |
| | | extern const char js_##keyword##_str[]; | |
| | | #include "jskeyword.tbl" | |
| | | #undef JS_KEYWORD | |
| | | | |
| typedef enum JSTokenType { | | typedef enum JSTokenType { | |
| TOK_ERROR = -1, /* well-known as the only code < EO
F */ | | TOK_ERROR = -1, /* well-known as the only code < EO
F */ | |
| TOK_EOF = 0, /* end of file */ | | TOK_EOF = 0, /* end of file */ | |
| TOK_EOL = 1, /* end of line */ | | TOK_EOL = 1, /* end of line */ | |
| TOK_SEMI = 2, /* semicolon */ | | TOK_SEMI = 2, /* semicolon */ | |
| TOK_COMMA = 3, /* comma operator */ | | TOK_COMMA = 3, /* comma operator */ | |
| TOK_ASSIGN = 4, /* assignment ops (= += -= etc.) */ | | TOK_ASSIGN = 4, /* assignment ops (= += -= etc.) */ | |
| TOK_HOOK = 5, TOK_COLON = 6, /* conditional (?:) */ | | TOK_HOOK = 5, TOK_COLON = 6, /* conditional (?:) */ | |
| TOK_OR = 7, /* logical or (||) */ | | TOK_OR = 7, /* logical or (||) */ | |
| TOK_AND = 8, /* logical and (&&) */ | | TOK_AND = 8, /* logical and (&&) */ | |
| | | | |
| skipping to change at line 110 | | skipping to change at line 116 | |
| TOK_NEW = 51, /* new keyword */ | | TOK_NEW = 51, /* new keyword */ | |
| TOK_DELETE = 52, /* delete keyword */ | | TOK_DELETE = 52, /* delete keyword */ | |
| TOK_DEFSHARP = 53, /* #n= for object/array initializer
s */ | | TOK_DEFSHARP = 53, /* #n= for object/array initializer
s */ | |
| TOK_USESHARP = 54, /* #n# for object/array initializer
s */ | | TOK_USESHARP = 54, /* #n# for object/array initializer
s */ | |
| TOK_TRY = 55, /* try keyword */ | | TOK_TRY = 55, /* try keyword */ | |
| TOK_CATCH = 56, /* catch keyword */ | | TOK_CATCH = 56, /* catch keyword */ | |
| TOK_FINALLY = 57, /* finally keyword */ | | TOK_FINALLY = 57, /* finally keyword */ | |
| TOK_THROW = 58, /* throw keyword */ | | TOK_THROW = 58, /* throw keyword */ | |
| TOK_INSTANCEOF = 59, /* instanceof keyword */ | | TOK_INSTANCEOF = 59, /* instanceof keyword */ | |
| TOK_DEBUGGER = 60, /* debugger keyword */ | | TOK_DEBUGGER = 60, /* debugger keyword */ | |
|
| | | TOK_XMLSTAGO = 61, /* XML start tag open (<) */ | |
| | | TOK_XMLETAGO = 62, /* XML end tag open (</) */ | |
| | | TOK_XMLPTAGC = 63, /* XML point tag close (/>) */ | |
| | | TOK_XMLTAGC = 64, /* XML start or end tag close (>) * | |
| | | / | |
| | | TOK_XMLNAME = 65, /* XML start-tag non-final fragment | |
| | | */ | |
| | | TOK_XMLATTR = 66, /* XML quoted attribute value */ | |
| | | TOK_XMLSPACE = 67, /* XML whitespace */ | |
| | | TOK_XMLTEXT = 68, /* XML text */ | |
| | | TOK_XMLCOMMENT = 69, /* XML comment */ | |
| | | TOK_XMLCDATA = 70, /* XML CDATA section */ | |
| | | TOK_XMLPI = 71, /* XML processing instruction */ | |
| | | TOK_AT = 72, /* XML attribute op (@) */ | |
| | | TOK_DBLCOLON = 73, /* namespace qualified name op (::) | |
| | | */ | |
| | | TOK_ANYNAME = 74, /* XML AnyName singleton (*) */ | |
| | | TOK_DBLDOT = 75, /* XML descendant op (..) */ | |
| | | TOK_FILTER = 76, /* XML filtering predicate op (.()) | |
| | | */ | |
| | | TOK_XMLELEM = 77, /* XML element node type (no token) | |
| | | */ | |
| | | TOK_XMLLIST = 78, /* XML list node type (no token) */ | |
| | | TOK_YIELD = 79, /* yield from generator function */ | |
| | | TOK_ARRAYCOMP = 80, /* array comprehension initialiser | |
| | | */ | |
| | | TOK_ARRAYPUSH = 81, /* array push within comprehension | |
| | | */ | |
| | | TOK_LEXICALSCOPE = 82, /* block scope AST node label */ | |
| | | TOK_LET = 83, /* let keyword */ | |
| | | TOK_BODY = 84, /* synthetic body of function with | |
| | | destructuring formal parameters | |
| | | */ | |
| TOK_RESERVED, /* reserved keywords */ | | TOK_RESERVED, /* reserved keywords */ | |
| TOK_LIMIT /* domain size */ | | TOK_LIMIT /* domain size */ | |
| } JSTokenType; | | } JSTokenType; | |
| | | | |
| #define IS_PRIMARY_TOKEN(tt) \ | | #define IS_PRIMARY_TOKEN(tt) \ | |
| ((uintN)((tt) - TOK_NAME) <= (uintN)(TOK_PRIMARY - TOK_NAME)) | | ((uintN)((tt) - TOK_NAME) <= (uintN)(TOK_PRIMARY - TOK_NAME)) | |
| | | | |
|
| | | #define TOKEN_TYPE_IS_XML(tt) \ | |
| | | (tt == TOK_AT || tt == TOK_DBLCOLON || tt == TOK_ANYNAME) | |
| | | | |
| | | #if JS_HAS_BLOCK_SCOPE | |
| | | # define TOKEN_TYPE_IS_DECL(tt) ((tt) == TOK_VAR || (tt) == TOK_LET) | |
| | | #else | |
| | | # define TOKEN_TYPE_IS_DECL(tt) ((tt) == TOK_VAR) | |
| | | #endif | |
| | | | |
| | | struct JSStringBuffer { | |
| | | jschar *base; | |
| | | jschar *limit; /* length limit for quick bounds check */ | |
| | | jschar *ptr; /* slot for next non-NUL char to store */ | |
| | | void *data; | |
| | | JSBool (*grow)(JSStringBuffer *sb, size_t newlength); | |
| | | void (*free)(JSStringBuffer *sb); | |
| | | }; | |
| | | | |
| | | #define STRING_BUFFER_ERROR_BASE ((jschar *) 1) | |
| | | #define STRING_BUFFER_OK(sb) ((sb)->base != STRING_BUFFER_ERROR_ | |
| | | BASE) | |
| | | #define STRING_BUFFER_OFFSET(sb) ((sb)->ptr -(sb)->base) | |
| | | | |
| | | extern void | |
| | | js_InitStringBuffer(JSStringBuffer *sb); | |
| | | | |
| | | extern void | |
| | | js_FinishStringBuffer(JSStringBuffer *sb); | |
| | | | |
| | | extern void | |
| | | js_AppendChar(JSStringBuffer *sb, jschar c); | |
| | | | |
| | | extern void | |
| | | js_RepeatChar(JSStringBuffer *sb, jschar c, uintN count); | |
| | | | |
| | | extern void | |
| | | js_AppendCString(JSStringBuffer *sb, const char *asciiz); | |
| | | | |
| | | extern void | |
| | | js_AppendJSString(JSStringBuffer *sb, JSString *str); | |
| | | | |
| struct JSTokenPtr { | | struct JSTokenPtr { | |
| uint16 index; /* index of char in physical line *
/ | | uint16 index; /* index of char in physical line *
/ | |
| uint16 lineno; /* physical line number */ | | uint16 lineno; /* physical line number */ | |
| }; | | }; | |
| | | | |
| struct JSTokenPos { | | struct JSTokenPos { | |
| JSTokenPtr begin; /* first character and line of toke
n */ | | JSTokenPtr begin; /* first character and line of toke
n */ | |
| JSTokenPtr end; /* index 1 past last char, last lin
e */ | | JSTokenPtr end; /* index 1 past last char, last lin
e */ | |
| }; | | }; | |
| | | | |
| struct JSToken { | | struct JSToken { | |
| JSTokenType type; /* char value or above enumerator *
/ | | JSTokenType type; /* char value or above enumerator *
/ | |
| JSTokenPos pos; /* token position in file */ | | JSTokenPos pos; /* token position in file */ | |
| jschar *ptr; /* beginning of token in line buffe
r */ | | jschar *ptr; /* beginning of token in line buffe
r */ | |
| union { | | union { | |
|
| struct { | | struct { /* non-numeric literal */ | |
| JSOp op; /* operator, for minimal parser */ | | JSOp op; /* operator, for minimal parser */ | |
| JSAtom *atom; /* atom table entry */ | | JSAtom *atom; /* atom table entry */ | |
| } s; | | } s; | |
|
| | | struct { /* atom pair, for XML PIs */ | |
| | | JSAtom *atom2; /* auxiliary atom table entry */ | |
| | | JSAtom *atom; /* main atom table entry */ | |
| | | } p; | |
| jsdouble dval; /* floating point number */ | | jsdouble dval; /* floating point number */ | |
| } u; | | } u; | |
| }; | | }; | |
| | | | |
| #define t_op u.s.op | | #define t_op u.s.op | |
| #define t_atom u.s.atom | | #define t_atom u.s.atom | |
|
| | | #define t_atom2 u.p.atom2 | |
| #define t_dval u.dval | | #define t_dval u.dval | |
| | | | |
| typedef struct JSTokenBuf { | | typedef struct JSTokenBuf { | |
| jschar *base; /* base of line or stream buffer */ | | jschar *base; /* base of line or stream buffer */ | |
| jschar *limit; /* limit for quick bounds check */ | | jschar *limit; /* limit for quick bounds check */ | |
| jschar *ptr; /* next char to get, or slot to use
*/ | | jschar *ptr; /* next char to get, or slot to use
*/ | |
| } JSTokenBuf; | | } JSTokenBuf; | |
| | | | |
| #define JS_LINE_LIMIT 256 /* logical line buffer size limit -
- | | #define JS_LINE_LIMIT 256 /* logical line buffer size limit -
- | |
| physical line length is unlimite
d */ | | physical line length is unlimite
d */ | |
| | | | |
| skipping to change at line 167 | | skipping to change at line 243 | |
| uintN cursor; /* index of last parsed token */ | | uintN cursor; /* index of last parsed token */ | |
| uintN lookahead; /* count of lookahead tokens */ | | uintN lookahead; /* count of lookahead tokens */ | |
| uintN lineno; /* current line number */ | | uintN lineno; /* current line number */ | |
| uintN ungetpos; /* next free char slot in ungetbuf
*/ | | uintN ungetpos; /* next free char slot in ungetbuf
*/ | |
| jschar ungetbuf[6]; /* at most 6, for \uXXXX lookahead
*/ | | jschar ungetbuf[6]; /* at most 6, for \uXXXX lookahead
*/ | |
| uintN flags; /* flags -- see below */ | | uintN flags; /* flags -- see below */ | |
| ptrdiff_t linelen; /* physical linebuf segment length
*/ | | ptrdiff_t linelen; /* physical linebuf segment length
*/ | |
| ptrdiff_t linepos; /* linebuf offset in physical line
*/ | | ptrdiff_t linepos; /* linebuf offset in physical line
*/ | |
| JSTokenBuf linebuf; /* line buffer for diagnostics */ | | JSTokenBuf linebuf; /* line buffer for diagnostics */ | |
| JSTokenBuf userbuf; /* user input buffer if !file */ | | JSTokenBuf userbuf; /* user input buffer if !file */ | |
|
| JSTokenBuf tokenbuf; /* current token string buffer */ | | JSStringBuffer tokenbuf; /* current token string buffer */ | |
| const char *filename; /* input filename or null */ | | const char *filename; /* input filename or null */ | |
| FILE *file; /* stdio stream if reading from fil
e */ | | FILE *file; /* stdio stream if reading from fil
e */ | |
| JSPrincipals *principals; /* principals associated with sourc
e */ | | JSPrincipals *principals; /* principals associated with sourc
e */ | |
| JSSourceHandler listener; /* callback for source; eg debugger
*/ | | JSSourceHandler listener; /* callback for source; eg debugger
*/ | |
| void *listenerData; /* listener 'this' data */ | | void *listenerData; /* listener 'this' data */ | |
| void *listenerTSData;/* listener data for this TokenStre
am */ | | void *listenerTSData;/* listener data for this TokenStre
am */ | |
| jschar *saveEOL; /* save next end of line in userbuf
, to | | jschar *saveEOL; /* save next end of line in userbuf
, to | |
| optimize for very long lines */ | | optimize for very long lines */ | |
| }; | | }; | |
| | | | |
| | | | |
| skipping to change at line 190 | | skipping to change at line 266 | |
| | | | |
| /* JSTokenStream flags */ | | /* JSTokenStream flags */ | |
| #define TSF_ERROR 0x01 /* fatal error while compiling */ | | #define TSF_ERROR 0x01 /* fatal error while compiling */ | |
| #define TSF_EOF 0x02 /* hit end of file */ | | #define TSF_EOF 0x02 /* hit end of file */ | |
| #define TSF_NEWLINES 0x04 /* tokenize newlines */ | | #define TSF_NEWLINES 0x04 /* tokenize newlines */ | |
| #define TSF_OPERAND 0x08 /* looking for operand, not operato
r */ | | #define TSF_OPERAND 0x08 /* looking for operand, not operato
r */ | |
| #define TSF_NLFLAG 0x20 /* last linebuf ended with \n */ | | #define TSF_NLFLAG 0x20 /* last linebuf ended with \n */ | |
| #define TSF_CRFLAG 0x40 /* linebuf would have ended with \r
*/ | | #define TSF_CRFLAG 0x40 /* linebuf would have ended with \r
*/ | |
| #define TSF_DIRTYLINE 0x80 /* non-whitespace since start of li
ne */ | | #define TSF_DIRTYLINE 0x80 /* non-whitespace since start of li
ne */ | |
| #define TSF_OWNFILENAME 0x100 /* ts->filename is malloc'd */ | | #define TSF_OWNFILENAME 0x100 /* ts->filename is malloc'd */ | |
|
| | | #define TSF_XMLTAGMODE 0x200 /* scanning within an XML tag in E4 | |
| | | X */ | |
| | | #define TSF_XMLTEXTMODE 0x400 /* scanning XMLText terminal from E | |
| | | 4X */ | |
| | | #define TSF_XMLONLYMODE 0x800 /* don't scan {expr} within text/ta | |
| | | g */ | |
| | | | |
| | | /* Flag indicating unexpected end of input, i.e. TOK_EOF not at top-level. | |
| | | */ | |
| | | #define TSF_UNEXPECTED_EOF 0x1000 | |
| | | | |
| | | /* | |
| | | * To handle the hard case of contiguous HTML comments, we want to clear th | |
| | | e | |
| | | * TSF_DIRTYINPUT flag at the end of each such comment. But we'd rather no | |
| | | t | |
| | | * scan for --> within every //-style comment unless we have to. So we set | |
| | | * TSF_IN_HTML_COMMENT when a <!-- is scanned as an HTML begin-comment, and | |
| | | * clear it (and TSF_DIRTYINPUT) when we scan --> either on a clean line, o | |
| | | r | |
| | | * only if (ts->flags & TSF_IN_HTML_COMMENT), in a //-style comment. | |
| | | * | |
| | | * This still works as before given a malformed comment hiding hack such as | |
| | | : | |
| | | * | |
| | | * <script> | |
| | | * <!-- comment hiding hack #1 | |
| | | * code goes here | |
| | | * // --> oops, markup for script-unaware browsers goes here! | |
| | | * </script> | |
| | | * | |
| | | * It does not cope with malformed comment hiding hacks where --> is hidden | |
| | | * by C-style comments, or on a dirty line. Such cases are already broken. | |
| | | */ | |
| | | #define TSF_IN_HTML_COMMENT 0x2000 | |
| | | | |
| | | /* Ignore keywords and return TOK_NAME instead to the parser. */ | |
| | | #define TSF_KEYWORD_IS_NAME 0x4000 | |
| | | | |
| /* Unicode separators that are treated as line terminators, in addition to
\n, \r */ | | /* Unicode separators that are treated as line terminators, in addition to
\n, \r */ | |
| #define LINE_SEPARATOR 0x2028 | | #define LINE_SEPARATOR 0x2028 | |
| #define PARA_SEPARATOR 0x2029 | | #define PARA_SEPARATOR 0x2029 | |
| | | | |
| /* | | /* | |
| * Create a new token stream, either from an input buffer or from a file. | | * Create a new token stream, either from an input buffer or from a file. | |
| * Return null on file-open or memory-allocation failure. | | * Return null on file-open or memory-allocation failure. | |
| * | | * | |
| * NB: All of js_New{,Buffer,File}TokenStream() return a pointer to transie
nt | | * NB: All of js_New{,Buffer,File}TokenStream() return a pointer to transie
nt | |
| | | | |
| skipping to change at line 216 | | skipping to change at line 322 | |
| | | | |
| extern JS_FRIEND_API(JSTokenStream *) | | extern JS_FRIEND_API(JSTokenStream *) | |
| js_NewBufferTokenStream(JSContext *cx, const jschar *base, size_t length); | | js_NewBufferTokenStream(JSContext *cx, const jschar *base, size_t length); | |
| | | | |
| extern JS_FRIEND_API(JSTokenStream *) | | extern JS_FRIEND_API(JSTokenStream *) | |
| js_NewFileTokenStream(JSContext *cx, const char *filename, FILE *defaultfp)
; | | js_NewFileTokenStream(JSContext *cx, const char *filename, FILE *defaultfp)
; | |
| | | | |
| extern JS_FRIEND_API(JSBool) | | extern JS_FRIEND_API(JSBool) | |
| js_CloseTokenStream(JSContext *cx, JSTokenStream *ts); | | js_CloseTokenStream(JSContext *cx, JSTokenStream *ts); | |
| | | | |
|
| | | extern JS_FRIEND_API(int) | |
| | | js_fgets(char *buf, int size, FILE *file); | |
| | | | |
| /* | | /* | |
|
| * Initialize the scanner, installing JS keywords into cx's global scope. | | * If the given char array forms JavaScript keyword, return corresponding | |
| | | * token. Otherwise return TOK_EOF. | |
| */ | | */ | |
|
| extern JSBool | | extern JSTokenType | |
| js_InitScanner(JSContext *cx); | | js_CheckKeyword(const jschar *chars, size_t length); | |
| | | | |
| | | #define js_IsKeyword(chars, length) \ | |
| | | (js_CheckKeyword(chars, length) != TOK_EOF) | |
| | | | |
| /* | | /* | |
| * Friend-exported API entry point to call a mapping function on each reser
ved | | * Friend-exported API entry point to call a mapping function on each reser
ved | |
| * identifier in the scanner's keyword table. | | * identifier in the scanner's keyword table. | |
| */ | | */ | |
| extern JS_FRIEND_API(void) | | extern JS_FRIEND_API(void) | |
| js_MapKeywords(void (*mapfun)(const char *)); | | js_MapKeywords(void (*mapfun)(const char *)); | |
| | | | |
| /* | | /* | |
| * Report a compile-time error by its number, using ts or cg to show contex
t. | | * Report a compile-time error by its number, using ts or cg to show contex
t. | |
| * Return true for a warning, false for an error. | | * Return true for a warning, false for an error. | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
|
| js_ReportCompileErrorNumber(JSContext *cx, JSTokenStream *ts, | | js_ReportCompileErrorNumber(JSContext *cx, void *handle, uintN flags, | |
| JSCodeGenerator *cg, uintN flags, | | uintN errorNumber, ...); | |
| const uintN errorNumber, ...); | | | |
| | | extern JSBool | |
| | | js_ReportCompileErrorNumberUC(JSContext *cx, void *handle, uintN flags, | |
| | | uintN errorNumber, ...); | |
| | | | |
| | | /* Steal some JSREPORT_* bits (see jsapi.h) to tell handle's type. */ | |
| | | #define JSREPORT_HANDLE 0x300 | |
| | | #define JSREPORT_TS 0x000 | |
| | | #define JSREPORT_CG 0x100 | |
| | | #define JSREPORT_PN 0x200 | |
| | | | |
| /* | | /* | |
| * Look ahead one token and return its type. | | * Look ahead one token and return its type. | |
| */ | | */ | |
| extern JSTokenType | | extern JSTokenType | |
| js_PeekToken(JSContext *cx, JSTokenStream *ts); | | js_PeekToken(JSContext *cx, JSTokenStream *ts); | |
| | | | |
| extern JSTokenType | | extern JSTokenType | |
| js_PeekTokenSameLine(JSContext *cx, JSTokenStream *ts); | | js_PeekTokenSameLine(JSContext *cx, JSTokenStream *ts); | |
| | | | |
| | | | |
End of changes. 13 change blocks. |
| 8 lines changed or deleted | | 147 lines changed or added | |
|
| jsscope.h | | jsscope.h | |
| /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- | | /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- | |
|
| | | * vim: set ts=8 sw=4 et tw=78: | |
| * | | * | |
| * ***** BEGIN LICENSE BLOCK ***** | | * ***** BEGIN LICENSE BLOCK ***** | |
| * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | |
| * | | * | |
| * The contents of this file are subject to the Mozilla Public License Vers
ion | | * The contents of this file are subject to the Mozilla Public License Vers
ion | |
| * 1.1 (the "License"); you may not use this file except in compliance with | | * 1.1 (the "License"); you may not use this file except in compliance with | |
| * the License. You may obtain a copy of the License at | | * the License. You may obtain a copy of the License at | |
| * http://www.mozilla.org/MPL/ | | * http://www.mozilla.org/MPL/ | |
| * | | * | |
| * Software distributed under the License is distributed on an "AS IS" basi
s, | | * Software distributed under the License is distributed on an "AS IS" basi
s, | |
| | | | |
| skipping to change at line 204 | | skipping to change at line 205 | |
| * allocating scope->table, we leave it null while initializing all the oth
er | | * allocating scope->table, we leave it null while initializing all the oth
er | |
| * scope members as if it were non-null and minimal-length. Until a proper
ty | | * scope members as if it were non-null and minimal-length. Until a proper
ty | |
| * is added that crosses the threshold of 6 or more entries for hashing, or | | * is added that crosses the threshold of 6 or more entries for hashing, or | |
| * until a "middle delete" occurs, we use linear search from scope->lastPro
p | | * until a "middle delete" occurs, we use linear search from scope->lastPro
p | |
| * to find a given id, and save on the space overhead of a hash table. | | * to find a given id, and save on the space overhead of a hash table. | |
| */ | | */ | |
| | | | |
| struct JSScope { | | struct JSScope { | |
| JSObjectMap map; /* base class state */ | | JSObjectMap map; /* base class state */ | |
| JSObject *object; /* object that owns this scope */ | | JSObject *object; /* object that owns this scope */ | |
|
| uint16 flags; /* flags, see below */ | | uint8 flags; /* flags, see below */ | |
| int16 hashShift; /* multiplicative hash shift */ | | int8 hashShift; /* multiplicative hash shift */ | |
| | | uint16 spare; /* reserved */ | |
| uint32 entryCount; /* number of entries in table */ | | uint32 entryCount; /* number of entries in table */ | |
| uint32 removedCount; /* removed entry sentinels in table
*/ | | uint32 removedCount; /* removed entry sentinels in table
*/ | |
| JSScopeProperty **table; /* table of ptrs to shared tree nod
es */ | | JSScopeProperty **table; /* table of ptrs to shared tree nod
es */ | |
| JSScopeProperty *lastProp; /* pointer to last property added *
/ | | JSScopeProperty *lastProp; /* pointer to last property added *
/ | |
| #ifdef JS_THREADSAFE | | #ifdef JS_THREADSAFE | |
| JSContext *ownercx; /* creating context, NULL if shared
*/ | | JSContext *ownercx; /* creating context, NULL if shared
*/ | |
| JSThinLock lock; /* binary semaphore protecting scop
e */ | | JSThinLock lock; /* binary semaphore protecting scop
e */ | |
| union { /* union lockful and lock-free stat
e: */ | | union { /* union lockful and lock-free stat
e: */ | |
| jsrefcount count; /* lock entry count for reentrancy
*/ | | jsrefcount count; /* lock entry count for reentrancy
*/ | |
| JSScope *link; /* next link in rt->scopeSharingTod
o */ | | JSScope *link; /* next link in rt->scopeSharingTod
o */ | |
| | | | |
| skipping to change at line 293 | | skipping to change at line 295 | |
| | | | |
| #define SPROP_STORE_PRESERVING_COLLISION(spp, sprop)
\ | | #define SPROP_STORE_PRESERVING_COLLISION(spp, sprop)
\ | |
| (*(spp) = (JSScopeProperty *) ((jsuword)(sprop)
\ | | (*(spp) = (JSScopeProperty *) ((jsuword)(sprop)
\ | |
| | SPROP_HAD_COLLISION(*(spp)))) | | | SPROP_HAD_COLLISION(*(spp)))) | |
| | | | |
| /* Bits stored in sprop->flags. */ | | /* Bits stored in sprop->flags. */ | |
| #define SPROP_MARK 0x01 | | #define SPROP_MARK 0x01 | |
| #define SPROP_IS_DUPLICATE 0x02 | | #define SPROP_IS_DUPLICATE 0x02 | |
| #define SPROP_IS_ALIAS 0x04 | | #define SPROP_IS_ALIAS 0x04 | |
| #define SPROP_HAS_SHORTID 0x08 | | #define SPROP_HAS_SHORTID 0x08 | |
|
| | | #define SPROP_IS_HIDDEN 0x10 /* a normally-hidden proper | |
| | | ty, | |
| | | e.g., function arg or va | |
| | | r */ | |
| | | | |
| /* | | /* | |
| * If SPROP_HAS_SHORTID is set in sprop->flags, we use sprop->shortid rathe
r | | * If SPROP_HAS_SHORTID is set in sprop->flags, we use sprop->shortid rathe
r | |
| * than id when calling sprop's getter or setter. | | * than id when calling sprop's getter or setter. | |
| */ | | */ | |
| #define SPROP_USERID(sprop)
\ | | #define SPROP_USERID(sprop)
\ | |
| (((sprop)->flags & SPROP_HAS_SHORTID) ? INT_TO_JSVAL((sprop)->shortid)
\ | | (((sprop)->flags & SPROP_HAS_SHORTID) ? INT_TO_JSVAL((sprop)->shortid)
\ | |
| : ID_TO_VALUE((sprop)->id)) | | : ID_TO_VALUE((sprop)->id)) | |
| | | | |
| #define SPROP_INVALID_SLOT 0xffffffff | | #define SPROP_INVALID_SLOT 0xffffffff | |
| | | | |
|
| #define SPROP_HAS_VALID_SLOT(sprop, scope) | | #define SLOT_IN_SCOPE(slot,scope) ((slot) < (scope)->map.freeslot) | |
| \ | | #define SPROP_HAS_VALID_SLOT(sprop,scope) SLOT_IN_SCOPE((sprop)->slot, scop | |
| ((sprop)->slot < (scope)->map.freeslot) | | e) | |
| | | | |
| #define SPROP_HAS_STUB_GETTER(sprop) (!(sprop)->getter) | | #define SPROP_HAS_STUB_GETTER(sprop) (!(sprop)->getter) | |
| #define SPROP_HAS_STUB_SETTER(sprop) (!(sprop)->setter) | | #define SPROP_HAS_STUB_SETTER(sprop) (!(sprop)->setter) | |
| | | | |
|
| #define SPROP_CALL_GETTER(cx,sprop,getter,obj,obj2,vp) | | /* | |
| \ | | * NB: SPROP_GET must not be called if SPROP_HAS_STUB_GETTER(sprop). | |
| (!(getter) || | | */ | |
| \ | | | |
| (getter)(cx, OBJ_THIS_OBJECT(cx,obj), SPROP_USERID(sprop), vp)) | | | |
| #define SPROP_CALL_SETTER(cx,sprop,setter,obj,obj2,vp) | | | |
| \ | | | |
| (!(setter) || | | | |
| \ | | | |
| (setter)(cx, OBJ_THIS_OBJECT(cx,obj), SPROP_USERID(sprop), vp)) | | | |
| | | | |
| #define SPROP_GET(cx,sprop,obj,obj2,vp)
\ | | #define SPROP_GET(cx,sprop,obj,obj2,vp)
\ | |
| (((sprop)->attrs & JSPROP_GETTER)
\ | | (((sprop)->attrs & JSPROP_GETTER)
\ | |
| ? js_InternalGetOrSet(cx, obj, (sprop)->id,
\ | | ? js_InternalGetOrSet(cx, obj, (sprop)->id,
\ | |
| OBJECT_TO_JSVAL((sprop)->getter), JSACC_READ,
\ | | OBJECT_TO_JSVAL((sprop)->getter), JSACC_READ,
\ | |
| 0, 0, vp)
\ | | 0, 0, vp)
\ | |
|
| : SPROP_CALL_GETTER(cx, sprop, (sprop)->getter, obj, obj2, vp)) | | : (sprop)->getter(cx, OBJ_THIS_OBJECT(cx,obj), SPROP_USERID(sprop), vp
)) | |
| | | | |
|
| | | /* | |
| | | * NB: SPROP_SET must not be called if (SPROP_HAS_STUB_SETTER(sprop) && | |
| | | * !(sprop->attrs & JSPROP_GETTER)). | |
| | | */ | |
| #define SPROP_SET(cx,sprop,obj,obj2,vp)
\ | | #define SPROP_SET(cx,sprop,obj,obj2,vp)
\ | |
| (((sprop)->attrs & JSPROP_SETTER)
\ | | (((sprop)->attrs & JSPROP_SETTER)
\ | |
| ? js_InternalGetOrSet(cx, obj, (sprop)->id,
\ | | ? js_InternalGetOrSet(cx, obj, (sprop)->id,
\ | |
| OBJECT_TO_JSVAL((sprop)->setter), JSACC_WRITE,
\ | | OBJECT_TO_JSVAL((sprop)->setter), JSACC_WRITE,
\ | |
| 1, vp, vp)
\ | | 1, vp, vp)
\ | |
| : ((sprop)->attrs & JSPROP_GETTER)
\ | | : ((sprop)->attrs & JSPROP_GETTER)
\ | |
| ? (JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
\ | | ? (JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
\ | |
| JSMSG_GETTER_ONLY, NULL), JS_FALSE)
\ | | JSMSG_GETTER_ONLY, NULL), JS_FALSE)
\ | |
|
| : SPROP_CALL_SETTER(cx, sprop, (sprop)->setter, obj, obj2, vp)) | | : (sprop)->setter(cx, OBJ_THIS_OBJECT(cx,obj), SPROP_USERID(sprop), vp
)) | |
| | | | |
| /* Macro for common expression to test for shared permanent attributes. */ | | /* Macro for common expression to test for shared permanent attributes. */ | |
| #define SPROP_IS_SHARED_PERMANENT(sprop)
\ | | #define SPROP_IS_SHARED_PERMANENT(sprop)
\ | |
| ((~(sprop)->attrs & (JSPROP_SHARED | JSPROP_PERMANENT)) == 0) | | ((~(sprop)->attrs & (JSPROP_SHARED | JSPROP_PERMANENT)) == 0) | |
| | | | |
| extern JSScope * | | extern JSScope * | |
| js_GetMutableScope(JSContext *cx, JSObject *obj); | | js_GetMutableScope(JSContext *cx, JSObject *obj); | |
| | | | |
| extern JSScope * | | extern JSScope * | |
| js_NewScope(JSContext *cx, jsrefcount nrefs, JSObjectOps *ops, JSClass *cla
sp, | | js_NewScope(JSContext *cx, jsrefcount nrefs, JSObjectOps *ops, JSClass *cla
sp, | |
| JSObject *obj); | | JSObject *obj); | |
| | | | |
| extern void | | extern void | |
| js_DestroyScope(JSContext *cx, JSScope *scope); | | js_DestroyScope(JSContext *cx, JSScope *scope); | |
| | | | |
|
| #define ID_TO_VALUE(id) (((id) & JSVAL_INT) ? id : ATOM_KEY((JSAtom *)(id)) | | #define ID_TO_VALUE(id) (JSID_IS_ATOM(id) ? ATOM_JSID_TO_JSVAL(id) : | |
| ) | | \ | |
| #define HASH_ID(id) (((id) & JSVAL_INT) | | JSID_IS_OBJECT(id) ? OBJECT_JSID_TO_JSVAL(id) : | |
| \ | | \ | |
| ? (jsatomid) JSVAL_TO_INT(id) | | (jsval)(id)) | |
| \ | | #define HASH_ID(id) (JSID_IS_ATOM(id) ? JSID_TO_ATOM(id)->number : | |
| : ((JSAtom *)id)->number) | | \ | |
| | | JSID_IS_OBJECT(id) ? (jsatomid) JSID_CLRTAG(id) : | |
| | | \ | |
| | | (jsatomid) JSID_TO_INT(id)) | |
| | | | |
| extern JS_FRIEND_API(JSScopeProperty **) | | extern JS_FRIEND_API(JSScopeProperty **) | |
| js_SearchScope(JSScope *scope, jsid id, JSBool adding); | | js_SearchScope(JSScope *scope, jsid id, JSBool adding); | |
| | | | |
| #define SCOPE_GET_PROPERTY(scope, id)
\ | | #define SCOPE_GET_PROPERTY(scope, id)
\ | |
| SPROP_FETCH(js_SearchScope(scope, id, JS_FALSE)) | | SPROP_FETCH(js_SearchScope(scope, id, JS_FALSE)) | |
| | | | |
| #define SCOPE_HAS_PROPERTY(scope, sprop)
\ | | #define SCOPE_HAS_PROPERTY(scope, sprop)
\ | |
| (SCOPE_GET_PROPERTY(scope, (sprop)->id) == (sprop)) | | (SCOPE_GET_PROPERTY(scope, (sprop)->id) == (sprop)) | |
| | | | |
| | | | |
| skipping to change at line 378 | | skipping to change at line 384 | |
| js_ChangeScopePropertyAttrs(JSContext *cx, JSScope *scope, | | js_ChangeScopePropertyAttrs(JSContext *cx, JSScope *scope, | |
| JSScopeProperty *sprop, uintN attrs, uintN mask
, | | JSScopeProperty *sprop, uintN attrs, uintN mask
, | |
| JSPropertyOp getter, JSPropertyOp setter); | | JSPropertyOp getter, JSPropertyOp setter); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_RemoveScopeProperty(JSContext *cx, JSScope *scope, jsid id); | | js_RemoveScopeProperty(JSContext *cx, JSScope *scope, jsid id); | |
| | | | |
| extern void | | extern void | |
| js_ClearScope(JSContext *cx, JSScope *scope); | | js_ClearScope(JSContext *cx, JSScope *scope); | |
| | | | |
|
| #define MARK_SCOPE_PROPERTY(sprop) ((sprop)->flags |= SPROP_MARK) | | /* | |
| | | * These macros used to inline short code sequences, but they grew over tim | |
| | | e. | |
| | | * We retain them for internal backward compatibility, and in case one or b | |
| | | oth | |
| | | * ever shrink to inline-able size. | |
| | | */ | |
| | | #define MARK_ID(cx,id) js_MarkId(cx, id) | |
| | | #define MARK_SCOPE_PROPERTY(cx,sprop) js_MarkScopeProperty(cx, sprop) | |
| | | | |
| | | extern void | |
| | | js_MarkId(JSContext *cx, jsid id); | |
| | | | |
| | | extern void | |
| | | js_MarkScopeProperty(JSContext *cx, JSScopeProperty *sprop); | |
| | | | |
| extern void | | extern void | |
| js_SweepScopeProperties(JSRuntime *rt); | | js_SweepScopeProperties(JSRuntime *rt); | |
| | | | |
| extern JSBool | | extern JSBool | |
| js_InitPropertyTree(JSRuntime *rt); | | js_InitPropertyTree(JSRuntime *rt); | |
| | | | |
| extern void | | extern void | |
| js_FinishPropertyTree(JSRuntime *rt); | | js_FinishPropertyTree(JSRuntime *rt); | |
| | | | |
| | | | |
End of changes. 10 change blocks. |
| 26 lines changed or deleted | | 45 lines changed or added | |
|
| jsstr.h | | jsstr.h | |
| | | | |
| skipping to change at line 213 | | skipping to change at line 213 | |
| JSCT_CURRENCY_SYMBOL = 26, | | JSCT_CURRENCY_SYMBOL = 26, | |
| JSCT_MODIFIER_SYMBOL = 27, | | JSCT_MODIFIER_SYMBOL = 27, | |
| JSCT_OTHER_SYMBOL = 28 | | JSCT_OTHER_SYMBOL = 28 | |
| } JSCharType; | | } JSCharType; | |
| | | | |
| /* Character classifying and mapping macros, based on java.lang.Character.
*/ | | /* Character classifying and mapping macros, based on java.lang.Character.
*/ | |
| #define JS_CCODE(c) (js_A[js_Y[(js_X[(uint16)(c)>>6]<<6)|((c)&0x3F)]]) | | #define JS_CCODE(c) (js_A[js_Y[(js_X[(uint16)(c)>>6]<<6)|((c)&0x3F)]]) | |
| #define JS_CTYPE(c) (JS_CCODE(c) & 0x1F) | | #define JS_CTYPE(c) (JS_CCODE(c) & 0x1F) | |
| | | | |
| #define JS_ISALPHA(c) ((((1 << JSCT_UPPERCASE_LETTER) |
\ | | #define JS_ISALPHA(c) ((((1 << JSCT_UPPERCASE_LETTER) |
\ | |
|
| (1 << JSCT_LOWERCASE_LETTER) | | | (1 << JSCT_LOWERCASE_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_TITLECASE_LETTER) | | | (1 << JSCT_TITLECASE_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_MODIFIER_LETTER) | | | (1 << JSCT_MODIFIER_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_OTHER_LETTER)) | | (1 << JSCT_OTHER_LETTER)) | |
| \ | | \ | |
| >> JS_CTYPE(c)) & 1) | | >> JS_CTYPE(c)) & 1) | |
| | | | |
| #define JS_ISALNUM(c) ((((1 << JSCT_UPPERCASE_LETTER) |
\ | | #define JS_ISALNUM(c) ((((1 << JSCT_UPPERCASE_LETTER) |
\ | |
|
| (1 << JSCT_LOWERCASE_LETTER) | | | (1 << JSCT_LOWERCASE_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_TITLECASE_LETTER) | | | (1 << JSCT_TITLECASE_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_MODIFIER_LETTER) | | | (1 << JSCT_MODIFIER_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_OTHER_LETTER) | | | (1 << JSCT_OTHER_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_DECIMAL_DIGIT_NUMBER)) | | (1 << JSCT_DECIMAL_DIGIT_NUMBER)) | |
| \ | | \ | |
| >> JS_CTYPE(c)) & 1) | | >> JS_CTYPE(c)) & 1) | |
| | | | |
| /* A unicode letter, suitable for use in an identifier. */ | | /* A unicode letter, suitable for use in an identifier. */ | |
|
| #define JS_ISUC_LETTER(c) ((((1 << JSCT_UPPERCASE_LETTER) | | | #define JS_ISLETTER(c) ((((1 << JSCT_UPPERCASE_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_LOWERCASE_LETTER) | | | (1 << JSCT_LOWERCASE_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_TITLECASE_LETTER) | | | (1 << JSCT_TITLECASE_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_MODIFIER_LETTER) | | | (1 << JSCT_MODIFIER_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_OTHER_LETTER) | | | (1 << JSCT_OTHER_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_LETTER_NUMBER)) | | (1 << JSCT_LETTER_NUMBER)) | |
| \ | | \ | |
| >> JS_CTYPE(c)) & 1) | | >> JS_CTYPE(c)) & 1) | |
| | | | |
| /* | | /* | |
| * 'IdentifierPart' from ECMA grammar, is Unicode letter or combining mark
or | | * 'IdentifierPart' from ECMA grammar, is Unicode letter or combining mark
or | |
| * digit or connector punctuation. | | * digit or connector punctuation. | |
| */ | | */ | |
|
| #define JS_ISID_PART(c) ((((1 << JSCT_UPPERCASE_LETTER) | | | #define JS_ISIDPART(c) ((((1 << JSCT_UPPERCASE_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_LOWERCASE_LETTER) | | | (1 << JSCT_LOWERCASE_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_TITLECASE_LETTER) | | | (1 << JSCT_TITLECASE_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_MODIFIER_LETTER) | | | (1 << JSCT_MODIFIER_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_OTHER_LETTER) | | | (1 << JSCT_OTHER_LETTER) | | |
| \ | | \ | |
| (1 << JSCT_LETTER_NUMBER) | | | (1 << JSCT_LETTER_NUMBER) | | |
| \ | | \ | |
| (1 << JSCT_NON_SPACING_MARK) | | | (1 << JSCT_NON_SPACING_MARK) | | |
| \ | | \ | |
| (1 << JSCT_COMBINING_SPACING_MARK) | | | (1 << JSCT_COMBINING_SPACING_MARK) | | |
| \ | | \ | |
| (1 << JSCT_DECIMAL_DIGIT_NUMBER) | | | (1 << JSCT_DECIMAL_DIGIT_NUMBER) | | |
| \ | | \ | |
| (1 << JSCT_CONNECTOR_PUNCTUATION)) | | (1 << JSCT_CONNECTOR_PUNCTUATION)) | |
| \ | | \ | |
| >> JS_CTYPE(c)) & 1) | | >> JS_CTYPE(c)) & 1) | |
| | | | |
| /* Unicode control-format characters, ignored in input */ | | /* Unicode control-format characters, ignored in input */ | |
| #define JS_ISFORMAT(c) (((1 << JSCT_FORMAT) >> JS_CTYPE(c)) & 1) | | #define JS_ISFORMAT(c) (((1 << JSCT_FORMAT) >> JS_CTYPE(c)) & 1) | |
| | | | |
| /* | | /* | |
| * Per ECMA-262 15.10.2.6, these characters are the only ones that make up
a | | * Per ECMA-262 15.10.2.6, these characters are the only ones that make up
a | |
| * "word", as far as a RegExp is concerned. If we want a Unicode-friendlie
r | | * "word", as far as a RegExp is concerned. If we want a Unicode-friendlie
r | |
| * definition of "word", we should rename this macro to something regexp-y. | | * definition of "word", we should rename this macro to something regexp-y. | |
| */ | | */ | |
| #define JS_ISWORD(c) ((c) < 128 && (isalnum(c) || (c) == '_')) | | #define JS_ISWORD(c) ((c) < 128 && (isalnum(c) || (c) == '_')) | |
| | | | |
|
| /* XXXbe unify on A/X/Y tbls, avoid ctype.h? */ | | #define JS_ISIDSTART(c) (JS_ISLETTER(c) || (c) == '_' || (c) == '$') | |
| #define JS_ISIDENT_START(c) (JS_ISUC_LETTER(c) || (c) == '_' || (c) == '$') | | #define JS_ISIDENT(c) (JS_ISIDPART(c) || (c) == '_' || (c) == '$') | |
| #define JS_ISIDENT(c) (JS_ISID_PART(c) || (c) == '_' || (c) == '$') | | | |
| | | #define JS_ISXMLSPACE(c) ((c) == ' ' || (c) == '\t' || (c) == '\r' | | |
| | | | \ | |
| | | (c) == '\n') | |
| | | #define JS_ISXMLNSSTART(c) ((JS_CCODE(c) & 0x00000100) || (c) == '_') | |
| | | #define JS_ISXMLNS(c) ((JS_CCODE(c) & 0x00000080) || (c) == '.' | | |
| | | | \ | |
| | | (c) == '-' || (c) == '_') | |
| | | #define JS_ISXMLNAMESTART(c) (JS_ISXMLNSSTART(c) || (c) == ':') | |
| | | #define JS_ISXMLNAME(c) (JS_ISXMLNS(c) || (c) == ':') | |
| | | | |
| #define JS_ISDIGIT(c) (JS_CTYPE(c) == JSCT_DECIMAL_DIGIT_NUMBER) | | #define JS_ISDIGIT(c) (JS_CTYPE(c) == JSCT_DECIMAL_DIGIT_NUMBER) | |
| | | | |
|
| | | /* XXXbe unify on A/X/Y tbls, avoid ctype.h? */ | |
| /* XXXbe fs, etc. ? */ | | /* XXXbe fs, etc. ? */ | |
| #define JS_ISSPACE(c) ((JS_CCODE(c) & 0x00070000) == 0x00040000) | | #define JS_ISSPACE(c) ((JS_CCODE(c) & 0x00070000) == 0x00040000) | |
| #define JS_ISPRINT(c) ((c) < 128 && isprint(c)) | | #define JS_ISPRINT(c) ((c) < 128 && isprint(c)) | |
| | | | |
| #define JS_ISUPPER(c) (JS_CTYPE(c) == JSCT_UPPERCASE_LETTER) | | #define JS_ISUPPER(c) (JS_CTYPE(c) == JSCT_UPPERCASE_LETTER) | |
| #define JS_ISLOWER(c) (JS_CTYPE(c) == JSCT_LOWERCASE_LETTER) | | #define JS_ISLOWER(c) (JS_CTYPE(c) == JSCT_LOWERCASE_LETTER) | |
| | | | |
| #define JS_TOUPPER(c) ((jschar) ((JS_CCODE(c) & 0x00100000)
\ | | #define JS_TOUPPER(c) ((jschar) ((JS_CCODE(c) & 0x00100000)
\ | |
| ? (c) - ((int32)JS_CCODE(c) >> 22)
\ | | ? (c) - ((int32)JS_CCODE(c) >> 22)
\ | |
| : (c))) | | : (c))) | |
| #define JS_TOLOWER(c) ((jschar) ((JS_CCODE(c) & 0x00200000)
\ | | #define JS_TOLOWER(c) ((jschar) ((JS_CCODE(c) & 0x00200000)
\ | |
| ? (c) + ((int32)JS_CCODE(c) >> 22)
\ | | ? (c) + ((int32)JS_CCODE(c) >> 22)
\ | |
| : (c))) | | : (c))) | |
| | | | |
|
| #define JS_TOCTRL(c) ((c) ^ 64) /* XXX unsafe! requires uppercase c | | /* | |
| */ | | * Shorthands for ASCII (7-bit) decimal and hex conversion. | |
| | | * Manually inline isdigit for performance; MSVC doesn't do this for us. | |
| /* Shorthands for ASCII (7-bit) decimal and hex conversion. */ | | */ | |
| #define JS7_ISDEC(c) ((c) < 128 && isdigit(c)) | | #define JS7_ISDEC(c) ((((unsigned)(c)) - '0') <= 9) | |
| #define JS7_UNDEC(c) ((c) - '0') | | #define JS7_UNDEC(c) ((c) - '0') | |
| #define JS7_ISHEX(c) ((c) < 128 && isxdigit(c)) | | #define JS7_ISHEX(c) ((c) < 128 && isxdigit(c)) | |
|
| #define JS7_UNHEX(c) (uintN)(isdigit(c) ? (c) - '0' : 10 + tolower(c) -
'a') | | #define JS7_UNHEX(c) (uintN)(JS7_ISDEC(c) ? (c) - '0' : 10 + tolower(c)
- 'a') | |
| #define JS7_ISLET(c) ((c) < 128 && isalpha(c)) | | #define JS7_ISLET(c) ((c) < 128 && isalpha(c)) | |
| | | | |
|
| /* Initialize truly global state associated with JS strings. */ | | | |
| extern JSBool | | | |
| js_InitStringGlobals(void); | | | |
| | | | |
| extern void | | | |
| js_FreeStringGlobals(void); | | | |
| | | | |
| extern void | | | |
| js_PurgeDeflatedStringCache(JSString *str); | | | |
| | | | |
| /* Initialize per-runtime string state for the first context in the runtime
. */ | | /* Initialize per-runtime string state for the first context in the runtime
. */ | |
| extern JSBool | | extern JSBool | |
| js_InitRuntimeStringState(JSContext *cx); | | js_InitRuntimeStringState(JSContext *cx); | |
| | | | |
| extern void | | extern void | |
| js_FinishRuntimeStringState(JSContext *cx); | | js_FinishRuntimeStringState(JSContext *cx); | |
| | | | |
|
| | | extern void | |
| | | js_FinishDeflatedStringCache(JSRuntime *rt); | |
| | | | |
| /* Initialize the String class, returning its prototype object. */ | | /* Initialize the String class, returning its prototype object. */ | |
|
| | | extern JSClass js_StringClass; | |
| | | | |
| extern JSObject * | | extern JSObject * | |
| js_InitStringClass(JSContext *cx, JSObject *obj); | | js_InitStringClass(JSContext *cx, JSObject *obj); | |
| | | | |
| extern const char js_escape_str[]; | | extern const char js_escape_str[]; | |
| extern const char js_unescape_str[]; | | extern const char js_unescape_str[]; | |
| extern const char js_uneval_str[]; | | extern const char js_uneval_str[]; | |
| extern const char js_decodeURI_str[]; | | extern const char js_decodeURI_str[]; | |
| extern const char js_encodeURI_str[]; | | extern const char js_encodeURI_str[]; | |
| extern const char js_decodeURIComponent_str[]; | | extern const char js_decodeURIComponent_str[]; | |
| extern const char js_encodeURIComponent_str[]; | | extern const char js_encodeURIComponent_str[]; | |
| | | | |
| skipping to change at line 348 | | skipping to change at line 352 | |
| js_FinalizeString(JSContext *cx, JSString *str); | | js_FinalizeString(JSContext *cx, JSString *str); | |
| | | | |
| extern void | | extern void | |
| js_FinalizeStringRT(JSRuntime *rt, JSString *str); | | js_FinalizeStringRT(JSRuntime *rt, JSString *str); | |
| | | | |
| /* Wrap a string value in a String object. */ | | /* Wrap a string value in a String object. */ | |
| extern JSObject * | | extern JSObject * | |
| js_StringToObject(JSContext *cx, JSString *str); | | js_StringToObject(JSContext *cx, JSString *str); | |
| | | | |
| /* | | /* | |
|
| | | * Convert a value to a printable C string. | |
| | | */ | |
| | | typedef JSString *(*JSValueToStringFun)(JSContext *cx, jsval v); | |
| | | | |
| | | extern JS_FRIEND_API(const char *) | |
| | | js_ValueToPrintable(JSContext *cx, jsval v, JSValueToStringFun v2sfun); | |
| | | | |
| | | #define js_ValueToPrintableString(cx,v) \ | |
| | | js_ValueToPrintable(cx, v, js_ValueToString) | |
| | | | |
| | | #define js_ValueToPrintableSource(cx,v) \ | |
| | | js_ValueToPrintable(cx, v, js_ValueToSource) | |
| | | | |
| | | /* | |
| * Convert a value to a string, returning null after reporting an error, | | * Convert a value to a string, returning null after reporting an error, | |
| * otherwise returning a new string reference. | | * otherwise returning a new string reference. | |
| */ | | */ | |
|
| extern JSString * | | extern JS_FRIEND_API(JSString *) | |
| js_ValueToString(JSContext *cx, jsval v); | | js_ValueToString(JSContext *cx, jsval v); | |
| | | | |
| /* | | /* | |
| * Convert a value to its source expression, returning null after reporting | | * Convert a value to its source expression, returning null after reporting | |
| * an error, otherwise returning a new string reference. | | * an error, otherwise returning a new string reference. | |
| */ | | */ | |
|
| extern JSString * | | extern JS_FRIEND_API(JSString *) | |
| js_ValueToSource(JSContext *cx, jsval v); | | js_ValueToSource(JSContext *cx, jsval v); | |
| | | | |
|
| #ifdef HT_ENUMERATE_NEXT /* XXX don't require jshash.h */ | | #ifdef HT_ENUMERATE_NEXT /* XXX don't require jshash.h */ | |
| /* | | /* | |
| * Compute a hash function from str. | | * Compute a hash function from str. | |
| */ | | */ | |
| extern JSHashNumber | | extern JSHashNumber | |
| js_HashString(JSString *str); | | js_HashString(JSString *str); | |
| #endif | | #endif | |
| | | | |
| /* | | /* | |
| * Return less than, equal to, or greater than zero depending on whether | | * Return less than, equal to, or greater than zero depending on whether | |
| * str1 is less than, equal to, or greater than str2. | | * str1 is less than, equal to, or greater than str2. | |
| */ | | */ | |
| extern intN | | extern intN | |
| js_CompareStrings(JSString *str1, JSString *str2); | | js_CompareStrings(JSString *str1, JSString *str2); | |
| | | | |
| /* | | /* | |
|
| | | * Test if strings are equal. | |
| | | */ | |
| | | extern JSBool | |
| | | js_EqualStrings(JSString *str1, JSString *str2); | |
| | | | |
| | | /* | |
| * Boyer-Moore-Horspool superlinear search for pat:patlen in text:textlen. | | * Boyer-Moore-Horspool superlinear search for pat:patlen in text:textlen. | |
| * The patlen argument must be positive and no greater than BMH_PATLEN_MAX. | | * The patlen argument must be positive and no greater than BMH_PATLEN_MAX. | |
| * The start argument tells where in text to begin the search. | | * The start argument tells where in text to begin the search. | |
| * | | * | |
| * Return the index of pat in text, or -1 if not found. | | * Return the index of pat in text, or -1 if not found. | |
| */ | | */ | |
| #define BMH_CHARSET_SIZE 256 /* ISO-Latin-1 */ | | #define BMH_CHARSET_SIZE 256 /* ISO-Latin-1 */ | |
| #define BMH_PATLEN_MAX 255 /* skip table element is uint8 */ | | #define BMH_PATLEN_MAX 255 /* skip table element is uint8 */ | |
| | | | |
| #define BMH_BAD_PATTERN (-2) /* return value if pat is not ISO-Latin-1 *
/ | | #define BMH_BAD_PATTERN (-2) /* return value if pat is not ISO-Latin-1 *
/ | |
| | | | |
| skipping to change at line 413 | | skipping to change at line 437 | |
| | | | |
| /* | | /* | |
| * Return s advanced past any Unicode white space characters. | | * Return s advanced past any Unicode white space characters. | |
| */ | | */ | |
| extern const jschar * | | extern const jschar * | |
| js_SkipWhiteSpace(const jschar *s); | | js_SkipWhiteSpace(const jschar *s); | |
| | | | |
| /* | | /* | |
| * Inflate bytes to JS chars and vice versa. Report out of memory via cx | | * Inflate bytes to JS chars and vice versa. Report out of memory via cx | |
| * and return null on error, otherwise return the jschar or byte vector tha
t | | * and return null on error, otherwise return the jschar or byte vector tha
t | |
|
| * was JS_malloc'ed. | | * was JS_malloc'ed. length is updated with the length of the new string in
jschars. | |
| */ | | */ | |
| extern jschar * | | extern jschar * | |
|
| js_InflateString(JSContext *cx, const char *bytes, size_t length); | | js_InflateString(JSContext *cx, const char *bytes, size_t *length); | |
| | | | |
| extern char * | | extern char * | |
| js_DeflateString(JSContext *cx, const jschar *chars, size_t length); | | js_DeflateString(JSContext *cx, const jschar *chars, size_t length); | |
| | | | |
| /* | | /* | |
| * Inflate bytes to JS chars into a buffer. | | * Inflate bytes to JS chars into a buffer. | |
|
| * 'chars' must be large enough for 'length'+1 jschars. | | * 'chars' must be large enough for 'length' jschars. | |
| | | * The buffer is NOT null-terminated. | |
| | | * cx may be NULL, which means no errors are thrown. | |
| | | * The destination length needs to be initialized with the buffer size, tak | |
| | | es | |
| | | * the number of chars moved. | |
| */ | | */ | |
|
| extern void | | extern JSBool | |
| js_InflateStringToBuffer(jschar *chars, const char *bytes, size_t length); | | js_InflateStringToBuffer(JSContext* cx, const char *bytes, size_t length, | |
| | | jschar *chars, size_t* charsLength); | |
| | | | |
| | | /* | |
| | | * Deflate JS chars to bytes into a buffer. | |
| | | * 'bytes' must be large enough for 'length chars. | |
| | | * The buffer is NOT null-terminated. | |
| | | * cx may be NULL, which means no errors are thrown. | |
| | | * The destination length needs to be initialized with the buffer size, tak | |
| | | es | |
| | | * the number of bytes moved. | |
| | | */ | |
| | | extern JSBool | |
| | | js_DeflateStringToBuffer(JSContext* cx, const jschar *chars, | |
| | | size_t charsLength, char *bytes, size_t* length); | |
| | | | |
| /* | | /* | |
| * Associate bytes with str in the deflated string cache, returning true on | | * Associate bytes with str in the deflated string cache, returning true on | |
| * successful association, false on out of memory. | | * successful association, false on out of memory. | |
| */ | | */ | |
| extern JSBool | | extern JSBool | |
|
| js_SetStringBytes(JSString *str, char *bytes, size_t length); | | js_SetStringBytes(JSRuntime *rt, JSString *str, char *bytes, size_t length)
; | |
| | | | |
| /* | | /* | |
| * Find or create a deflated string cache entry for str that contains its | | * Find or create a deflated string cache entry for str that contains its | |
| * characters chopped from Unicode code points into bytes. | | * characters chopped from Unicode code points into bytes. | |
| */ | | */ | |
| extern char * | | extern char * | |
|
| js_GetStringBytes(JSString *str); | | js_GetStringBytes(JSRuntime *rt, JSString *str); | |
| | | | |
| | | /* Remove a deflated string cache entry associated with str if any. */ | |
| | | extern void | |
| | | js_PurgeDeflatedStringCache(JSRuntime *rt, JSString *str); | |
| | | | |
| JSBool | | JSBool | |
| js_str_escape(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, | | js_str_escape(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, | |
| jsval *rval); | | jsval *rval); | |
| | | | |
|
| | | /* | |
| | | * Convert one UCS-4 char and write it into a UTF-8 buffer, which must be a | |
| | | t | |
| | | * least 6 bytes long. Return the number of UTF-8 bytes of data written. | |
| | | */ | |
| | | extern int | |
| | | js_OneUcs4ToUtf8Char(uint8 *utf8Buffer, uint32 ucs4Char); | |
| | | | |
| JS_END_EXTERN_C | | JS_END_EXTERN_C | |
| | | | |
| #endif /* jsstr_h___ */ | | #endif /* jsstr_h___ */ | |
| | | | |
End of changes. 23 change blocks. |
| 83 lines changed or deleted | | 139 lines changed or added | |
|
| jstypes.h | | jstypes.h | |
| | | | |
| skipping to change at line 89 | | skipping to change at line 89 | |
| #ifdef WIN32 | | #ifdef WIN32 | |
| /* These also work for __MWERKS__ */ | | /* These also work for __MWERKS__ */ | |
| #define JS_EXTERN_API(__type) extern __declspec(dllexport) __type | | #define JS_EXTERN_API(__type) extern __declspec(dllexport) __type | |
| #define JS_EXPORT_API(__type) __declspec(dllexport) __type | | #define JS_EXPORT_API(__type) __declspec(dllexport) __type | |
| #define JS_EXTERN_DATA(__type) extern __declspec(dllexport) __type | | #define JS_EXTERN_DATA(__type) extern __declspec(dllexport) __type | |
| #define JS_EXPORT_DATA(__type) __declspec(dllexport) __type | | #define JS_EXPORT_DATA(__type) __declspec(dllexport) __type | |
| | | | |
| #define JS_DLL_CALLBACK | | #define JS_DLL_CALLBACK | |
| #define JS_STATIC_DLL_CALLBACK(__x) static __x | | #define JS_STATIC_DLL_CALLBACK(__x) static __x | |
| | | | |
|
| | | #elif defined(XP_OS2) && defined(__declspec) | |
| | | | |
| | | #define JS_EXTERN_API(__type) extern __declspec(dllexport) __type | |
| | | #define JS_EXPORT_API(__type) __declspec(dllexport) __type | |
| | | #define JS_EXTERN_DATA(__type) extern __declspec(dllexport) __type | |
| | | #define JS_EXPORT_DATA(__type) __declspec(dllexport) __type | |
| | | | |
| | | #define JS_DLL_CALLBACK | |
| | | #define JS_STATIC_DLL_CALLBACK(__x) static __x | |
| | | | |
| #elif defined(WIN16) | | #elif defined(WIN16) | |
| | | | |
| #ifdef _WINDLL | | #ifdef _WINDLL | |
| #define JS_EXTERN_API(__type) extern __type _cdecl _export _loadds | | #define JS_EXTERN_API(__type) extern __type _cdecl _export _loadds | |
| #define JS_EXPORT_API(__type) __type _cdecl _export _loadds | | #define JS_EXPORT_API(__type) __type _cdecl _export _loadds | |
| #define JS_EXTERN_DATA(__type) extern __type _export | | #define JS_EXTERN_DATA(__type) extern __type _export | |
| #define JS_EXPORT_DATA(__type) __type _export | | #define JS_EXPORT_DATA(__type) __type _export | |
| | | | |
| #define JS_DLL_CALLBACK __cdecl __loadds | | #define JS_DLL_CALLBACK __cdecl __loadds | |
| #define JS_STATIC_DLL_CALLBACK(__x) static __x CALLBACK | | #define JS_STATIC_DLL_CALLBACK(__x) static __x CALLBACK | |
| | | | |
| skipping to change at line 110 | | skipping to change at line 120 | |
| #else /* this must be .EXE */ | | #else /* this must be .EXE */ | |
| #define JS_EXTERN_API(__type) extern __type _cdecl _export | | #define JS_EXTERN_API(__type) extern __type _cdecl _export | |
| #define JS_EXPORT_API(__type) __type _cdecl _export | | #define JS_EXPORT_API(__type) __type _cdecl _export | |
| #define JS_EXTERN_DATA(__type) extern __type _export | | #define JS_EXTERN_DATA(__type) extern __type _export | |
| #define JS_EXPORT_DATA(__type) __type _export | | #define JS_EXPORT_DATA(__type) __type _export | |
| | | | |
| #define JS_DLL_CALLBACK __cdecl __loadds | | #define JS_DLL_CALLBACK __cdecl __loadds | |
| #define JS_STATIC_DLL_CALLBACK(__x) __x JS_DLL_CALLBACK | | #define JS_STATIC_DLL_CALLBACK(__x) __x JS_DLL_CALLBACK | |
| #endif /* _WINDLL */ | | #endif /* _WINDLL */ | |
| | | | |
|
| #elif defined(XP_MAC) | | | |
| #define JS_EXTERN_API(__type) extern __declspec(export) __type | | | |
| #define JS_EXPORT_API(__type) __declspec(export) __type | | | |
| #define JS_EXTERN_DATA(__type) extern __declspec(export) __type | | | |
| #define JS_EXPORT_DATA(__type) __declspec(export) __type | | | |
| | | | |
| #define JS_DLL_CALLBACK | | | |
| #define JS_STATIC_DLL_CALLBACK(__x) static __x | | | |
| | | | |
| #else /* Unix */ | | #else /* Unix */ | |
| | | | |
|
| #define JS_EXTERN_API(__type) extern __type | | #ifdef HAVE_VISIBILITY_ATTRIBUTE | |
| #define JS_EXPORT_API(__type) __type | | #define JS_EXTERNAL_VIS __attribute__((visibility ("default"))) | |
| #define JS_EXTERN_DATA(__type) extern __type | | #else | |
| #define JS_EXPORT_DATA(__type) __type | | #define JS_EXTERNAL_VIS | |
| | | #endif | |
| | | | |
| | | #define JS_EXTERN_API(__type) extern JS_EXTERNAL_VIS __type | |
| | | #define JS_EXPORT_API(__type) JS_EXTERNAL_VIS __type | |
| | | #define JS_EXTERN_DATA(__type) extern JS_EXTERNAL_VIS __type | |
| | | #define JS_EXPORT_DATA(__type) JS_EXTERNAL_VIS __type | |
| | | | |
| #define JS_DLL_CALLBACK | | #define JS_DLL_CALLBACK | |
| #define JS_STATIC_DLL_CALLBACK(__x) static __x | | #define JS_STATIC_DLL_CALLBACK(__x) static __x | |
| | | | |
| #endif | | #endif | |
| | | | |
| #ifdef _WIN32 | | #ifdef _WIN32 | |
| # if defined(__MWERKS__) || defined(__GNUC__) | | # if defined(__MWERKS__) || defined(__GNUC__) | |
| # define JS_IMPORT_API(__x) __x | | # define JS_IMPORT_API(__x) __x | |
| # else | | # else | |
| # define JS_IMPORT_API(__x) __declspec(dllimport) __x | | # define JS_IMPORT_API(__x) __declspec(dllimport) __x | |
| # endif | | # endif | |
|
| | | #elif defined(XP_OS2) && defined(__declspec) | |
| | | # define JS_IMPORT_API(__x) __declspec(dllimport) __x | |
| #else | | #else | |
| # define JS_IMPORT_API(__x) JS_EXPORT_API (__x) | | # define JS_IMPORT_API(__x) JS_EXPORT_API (__x) | |
| #endif | | #endif | |
| | | | |
| #if defined(_WIN32) && !defined(__MWERKS__) | | #if defined(_WIN32) && !defined(__MWERKS__) | |
| # define JS_IMPORT_DATA(__x) __declspec(dllimport) __x | | # define JS_IMPORT_DATA(__x) __declspec(dllimport) __x | |
|
| | | #elif defined(XP_OS2) && defined(__declspec) | |
| | | # define JS_IMPORT_DATA(__x) __declspec(dllimport) __x | |
| #else | | #else | |
|
| # define JS_IMPORT_DATA(__x) __x | | # define JS_IMPORT_DATA(__x) JS_EXPORT_DATA (__x) | |
| #endif | | #endif | |
| | | | |
| /* | | /* | |
| * The linkage of JS API functions differs depending on whether the file is | | * The linkage of JS API functions differs depending on whether the file is | |
| * used within the JS library or not. Any source file within the JS | | * used within the JS library or not. Any source file within the JS | |
| * interpreter should define EXPORT_JS_API whereas any client of the librar
y | | * interpreter should define EXPORT_JS_API whereas any client of the librar
y | |
| * should not. | | * should not. | |
| */ | | */ | |
| #ifdef EXPORT_JS_API | | #ifdef EXPORT_JS_API | |
| #define JS_PUBLIC_API(t) JS_EXPORT_API(t) | | #define JS_PUBLIC_API(t) JS_EXPORT_API(t) | |
| | | | |
| skipping to change at line 206 | | skipping to change at line 217 | |
| /*********************************************************************** | | /*********************************************************************** | |
| ** MACROS: JS_BIT | | ** MACROS: JS_BIT | |
| ** JS_BITMASK | | ** JS_BITMASK | |
| ** DESCRIPTION: | | ** DESCRIPTION: | |
| ** Bit masking macros. XXX n must be <= 31 to be portable | | ** Bit masking macros. XXX n must be <= 31 to be portable | |
| ***********************************************************************/ | | ***********************************************************************/ | |
| #define JS_BIT(n) ((JSUint32)1 << (n)) | | #define JS_BIT(n) ((JSUint32)1 << (n)) | |
| #define JS_BITMASK(n) (JS_BIT(n) - 1) | | #define JS_BITMASK(n) (JS_BIT(n) - 1) | |
| | | | |
| /*********************************************************************** | | /*********************************************************************** | |
|
| | | ** MACROS: JS_PTR_TO_INT32 | |
| | | ** JS_PTR_TO_UINT32 | |
| | | ** JS_INT32_TO_PTR | |
| | | ** JS_UINT32_TO_PTR | |
| | | ** DESCRIPTION: | |
| | | ** Integer to pointer and pointer to integer conversion macros. | |
| | | ***********************************************************************/ | |
| | | #define JS_PTR_TO_INT32(x) ((jsint)((char *)(x) - (char *)0)) | |
| | | #define JS_PTR_TO_UINT32(x) ((jsuint)((char *)(x) - (char *)0)) | |
| | | #define JS_INT32_TO_PTR(x) ((void *)((char *)0 + (jsint)(x))) | |
| | | #define JS_UINT32_TO_PTR(x) ((void *)((char *)0 + (jsuint)(x))) | |
| | | | |
| | | /*********************************************************************** | |
| ** MACROS: JS_HOWMANY | | ** MACROS: JS_HOWMANY | |
| ** JS_ROUNDUP | | ** JS_ROUNDUP | |
| ** JS_MIN | | ** JS_MIN | |
| ** JS_MAX | | ** JS_MAX | |
| ** DESCRIPTION: | | ** DESCRIPTION: | |
| ** Commonly used macros for operations on compatible types. | | ** Commonly used macros for operations on compatible types. | |
| ***********************************************************************/ | | ***********************************************************************/ | |
| #define JS_HOWMANY(x,y) (((x)+(y)-1)/(y)) | | #define JS_HOWMANY(x,y) (((x)+(y)-1)/(y)) | |
| #define JS_ROUNDUP(x,y) (JS_HOWMANY(x,y)*(y)) | | #define JS_ROUNDUP(x,y) (JS_HOWMANY(x,y)*(y)) | |
| #define JS_MIN(x,y) ((x)<(y)?(x):(y)) | | #define JS_MIN(x,y) ((x)<(y)?(x):(y)) | |
| #define JS_MAX(x,y) ((x)>(y)?(x):(y)) | | #define JS_MAX(x,y) ((x)>(y)?(x):(y)) | |
| | | | |
|
| #if (defined(XP_MAC) || defined(XP_WIN)) && !defined(CROSS_COMPILE) | | #if (defined(XP_WIN) && !defined(CROSS_COMPILE)) || defined (WINCE) | |
| # include "jscpucfg.h" /* Use standard Mac or Windows configurati
on */ | | # include "jscpucfg.h" /* Use standard Mac or Windows configurati
on */ | |
| #elif defined(XP_UNIX) || defined(XP_BEOS) || defined(XP_OS2) || defined(CR
OSS_COMPILE) | | #elif defined(XP_UNIX) || defined(XP_BEOS) || defined(XP_OS2) || defined(CR
OSS_COMPILE) | |
| # include "jsautocfg.h" /* Use auto-detected configuration */ | | # include "jsautocfg.h" /* Use auto-detected configuration */ | |
| # include "jsosdep.h" /* ...and platform-specific flags */ | | # include "jsosdep.h" /* ...and platform-specific flags */ | |
| #else | | #else | |
|
| # error "Must define one of XP_BEOS, XP_MAC, XP_OS2, XP_WIN or XP_UNIX" | | # error "Must define one of XP_BEOS, XP_OS2, XP_WIN or XP_UNIX" | |
| #endif | | #endif | |
| | | | |
| JS_BEGIN_EXTERN_C | | JS_BEGIN_EXTERN_C | |
| | | | |
| /************************************************************************ | | /************************************************************************ | |
| ** TYPES: JSUint8 | | ** TYPES: JSUint8 | |
| ** JSInt8 | | ** JSInt8 | |
| ** DESCRIPTION: | | ** DESCRIPTION: | |
| ** The int8 types are known to be 8 bits each. There is no type that | | ** The int8 types are known to be 8 bits each. There is no type that | |
| ** is equivalent to a plain "char". | | ** is equivalent to a plain "char". | |
| | | | |
| skipping to change at line 355 | | skipping to change at line 379 | |
| ** for storing a pointer or pointer sutraction. | | ** for storing a pointer or pointer sutraction. | |
| ************************************************************************/ | | ************************************************************************/ | |
| typedef ptrdiff_t JSPtrdiff; | | typedef ptrdiff_t JSPtrdiff; | |
| | | | |
| /************************************************************************ | | /************************************************************************ | |
| ** TYPES: JSUptrdiff | | ** TYPES: JSUptrdiff | |
| ** DESCRIPTION: | | ** DESCRIPTION: | |
| ** A type for pointer difference. Variables of this type are suitable | | ** A type for pointer difference. Variables of this type are suitable | |
| ** for storing a pointer or pointer sutraction. | | ** for storing a pointer or pointer sutraction. | |
| ************************************************************************/ | | ************************************************************************/ | |
|
| | | #if JS_BYTES_PER_WORD == 8 && JS_BYTES_PER_LONG != 8 | |
| | | typedef JSUint64 JSUptrdiff; | |
| | | #else | |
| typedef unsigned long JSUptrdiff; | | typedef unsigned long JSUptrdiff; | |
|
| | | #endif | |
| | | | |
| /************************************************************************ | | /************************************************************************ | |
| ** TYPES: JSBool | | ** TYPES: JSBool | |
| ** DESCRIPTION: | | ** DESCRIPTION: | |
| ** Use JSBool for variables and parameter types. Use JS_FALSE and JS_TRUE | | ** Use JSBool for variables and parameter types. Use JS_FALSE and JS_TRUE | |
| ** for clarity of target type in assignments and actual arguments. Use | | ** for clarity of target type in assignments and actual arguments. Use | |
| ** 'if (bool)', 'while (!bool)', '(bool) ? x : y' etc., to test boolea
ns | | ** 'if (bool)', 'while (!bool)', '(bool) ? x : y' etc., to test boolea
ns | |
| ** just as you would C int-valued conditions. | | ** just as you would C int-valued conditions. | |
| ************************************************************************/ | | ************************************************************************/ | |
| typedef JSIntn JSBool; | | typedef JSIntn JSBool; | |
| #define JS_TRUE (JSIntn)1 | | #define JS_TRUE (JSIntn)1 | |
| #define JS_FALSE (JSIntn)0 | | #define JS_FALSE (JSIntn)0 | |
| | | | |
| /************************************************************************ | | /************************************************************************ | |
| ** TYPES: JSPackedBool | | ** TYPES: JSPackedBool | |
| ** DESCRIPTION: | | ** DESCRIPTION: | |
| ** Use JSPackedBool within structs where bitfields are not desireable | | ** Use JSPackedBool within structs where bitfields are not desireable | |
|
| ** but minimum and consistant overhead matters. | | ** but minimum and consistent overhead matters. | |
| ************************************************************************/ | | ************************************************************************/ | |
| typedef JSUint8 JSPackedBool; | | typedef JSUint8 JSPackedBool; | |
| | | | |
| /* | | /* | |
| ** A JSWord is an integer that is the same size as a void* | | ** A JSWord is an integer that is the same size as a void* | |
| */ | | */ | |
|
| | | #if JS_BYTES_PER_WORD == 8 && JS_BYTES_PER_LONG != 8 | |
| | | typedef JSInt64 JSWord; | |
| | | typedef JSUint64 JSUword; | |
| | | #else | |
| typedef long JSWord; | | typedef long JSWord; | |
| typedef unsigned long JSUword; | | typedef unsigned long JSUword; | |
|
| | | #endif | |
| | | | |
| #include "jsotypes.h" | | #include "jsotypes.h" | |
| | | | |
|
| | | /*********************************************************************** | |
| | | ** MACROS: JS_LIKELY | |
| | | ** JS_UNLIKELY | |
| | | ** DESCRIPTION: | |
| | | ** These macros allow you to give a hint to the compiler about branch | |
| | | ** probability so that it can better optimize. Use them like this: | |
| | | ** | |
| | | ** if (JS_LIKELY(v == 1)) { | |
| | | ** ... expected code path ... | |
| | | ** } | |
| | | ** | |
| | | ** if (JS_UNLIKELY(v == 0)) { | |
| | | ** ... non-expected code path ... | |
| | | ** } | |
| | | ** | |
| | | ***********************************************************************/ | |
| | | #if defined(__GNUC__) && (__GNUC__ > 2) | |
| | | #define JS_LIKELY(x) (__builtin_expect((x), 1)) | |
| | | #define JS_UNLIKELY(x) (__builtin_expect((x), 0)) | |
| | | #else | |
| | | #define JS_LIKELY(x) (x) | |
| | | #define JS_UNLIKELY(x) (x) | |
| | | #endif | |
| | | | |
| | | /*********************************************************************** | |
| | | ** MACROS: JS_ARRAY_LENGTH | |
| | | ** JS_ARRAY_END | |
| | | ** DESCRIPTION: | |
| | | ** Macros to get the number of elements and the pointer to one past th | |
| | | e | |
| | | ** last element of a C array. Use them like this: | |
| | | ** | |
| | | ** jschar buf[10], *s; | |
| | | ** JSString *str; | |
| | | ** ... | |
| | | ** for (s = buf; s != JS_ARRAY_END(buf); ++s) *s = ...; | |
| | | ** ... | |
| | | ** str = JS_NewStringCopyN(cx, buf, JS_ARRAY_LENGTH(buf)); | |
| | | ** ... | |
| | | ** | |
| | | ***********************************************************************/ | |
| | | | |
| | | #define JS_ARRAY_LENGTH(array) (sizeof (array) / sizeof (array)[0]) | |
| | | #define JS_ARRAY_END(array) ((array) + JS_ARRAY_LENGTH(array)) | |
| | | | |
| JS_END_EXTERN_C | | JS_END_EXTERN_C | |
| | | | |
| #endif /* jstypes_h___ */ | | #endif /* jstypes_h___ */ | |
| | | | |
End of changes. 15 change blocks. |
| 17 lines changed or deleted | | 95 lines changed or added | |
|