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

1.1       root        1: /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
                      2:  *
                      3:  * ***** BEGIN LICENSE BLOCK *****
                      4:  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
                      5:  *
                      6:  * The contents of this file are subject to the Mozilla Public License Version
                      7:  * 1.1 (the "License"); you may not use this file except in compliance with
                      8:  * the License. You may obtain a copy of the License at
                      9:  * http://www.mozilla.org/MPL/
                     10:  *
                     11:  * Software distributed under the License is distributed on an "AS IS" basis,
                     12:  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
                     13:  * for the specific language governing rights and limitations under the
                     14:  * License.
                     15:  *
                     16:  * The Original Code is Mozilla Communicator client code, released
                     17:  * March 31, 1998.
                     18:  *
                     19:  * The Initial Developer of the Original Code is
                     20:  * Netscape Communications Corporation.
                     21:  * Portions created by the Initial Developer are Copyright (C) 1998
                     22:  * the Initial Developer. All Rights Reserved.
                     23:  *
                     24:  * Contributor(s):
                     25:  *
                     26:  * Alternatively, the contents of this file may be used under the terms of
                     27:  * either of the GNU General Public License Version 2 or later (the "GPL"),
                     28:  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
                     29:  * in which case the provisions of the GPL or the LGPL are applicable instead
                     30:  * of those above. If you wish to allow use of your version of this file only
                     31:  * under the terms of either the GPL or the LGPL, and not to allow others to
                     32:  * use your version of this file under the terms of the MPL, indicate your
                     33:  * decision by deleting the provisions above and replace them with the notice
                     34:  * and other provisions required by the GPL or the LGPL. If you do not delete
                     35:  * the provisions above, a recipient may use your version of this file under
                     36:  * the terms of any one of the MPL, the GPL or the LGPL.
                     37:  *
                     38:  * ***** END LICENSE BLOCK ***** */
                     39: 
                     40: #ifndef jsapi_h___
                     41: #define jsapi_h___
                     42: /*
                     43:  * JavaScript API.
                     44:  */
                     45: #include <stddef.h>
                     46: #include <stdio.h>
                     47: #include "jspubtd.h"
                     48: 
                     49: JS_BEGIN_EXTERN_C
                     50: 
                     51: /*
                     52:  * Type tags stored in the low bits of a jsval.
                     53:  */
                     54: #define JSVAL_OBJECT            0x0     /* untagged reference to object */
                     55: #define JSVAL_INT               0x1     /* tagged 31-bit integer value */
                     56: #define JSVAL_DOUBLE            0x2     /* tagged reference to double */
                     57: #define JSVAL_STRING            0x4     /* tagged reference to string */
                     58: #define JSVAL_BOOLEAN           0x6     /* tagged boolean value */
                     59: 
                     60: /* Type tag bitfield length and derived macros. */
                     61: #define JSVAL_TAGBITS           3
                     62: #define JSVAL_TAGMASK           JS_BITMASK(JSVAL_TAGBITS)
                     63: #define JSVAL_TAG(v)            ((v) & JSVAL_TAGMASK)
                     64: #define JSVAL_SETTAG(v,t)       ((v) | (t))
                     65: #define JSVAL_CLRTAG(v)         ((v) & ~(jsval)JSVAL_TAGMASK)
                     66: #define JSVAL_ALIGN             JS_BIT(JSVAL_TAGBITS)
                     67: 
                     68: /* Predicates for type testing. */
                     69: #define JSVAL_IS_OBJECT(v)      (JSVAL_TAG(v) == JSVAL_OBJECT)
                     70: #define JSVAL_IS_NUMBER(v)      (JSVAL_IS_INT(v) || JSVAL_IS_DOUBLE(v))
                     71: #define JSVAL_IS_INT(v)         (((v) & JSVAL_INT) && (v) != JSVAL_VOID)
                     72: #define JSVAL_IS_DOUBLE(v)      (JSVAL_TAG(v) == JSVAL_DOUBLE)
                     73: #define JSVAL_IS_STRING(v)      (JSVAL_TAG(v) == JSVAL_STRING)
                     74: #define JSVAL_IS_BOOLEAN(v)     (JSVAL_TAG(v) == JSVAL_BOOLEAN)
                     75: #define JSVAL_IS_NULL(v)        ((v) == JSVAL_NULL)
                     76: #define JSVAL_IS_VOID(v)        ((v) == JSVAL_VOID)
                     77: #define JSVAL_IS_PRIMITIVE(v)   (!JSVAL_IS_OBJECT(v) || JSVAL_IS_NULL(v))
                     78: 
                     79: /* Objects, strings, and doubles are GC'ed. */
                     80: #define JSVAL_IS_GCTHING(v)     (!((v) & JSVAL_INT) && !JSVAL_IS_BOOLEAN(v))
                     81: #define JSVAL_TO_GCTHING(v)     ((void *)JSVAL_CLRTAG(v))
                     82: #define JSVAL_TO_OBJECT(v)      ((JSObject *)JSVAL_TO_GCTHING(v))
                     83: #define JSVAL_TO_DOUBLE(v)      ((jsdouble *)JSVAL_TO_GCTHING(v))
                     84: #define JSVAL_TO_STRING(v)      ((JSString *)JSVAL_TO_GCTHING(v))
                     85: #define OBJECT_TO_JSVAL(obj)    ((jsval)(obj))
                     86: #define DOUBLE_TO_JSVAL(dp)     JSVAL_SETTAG((jsval)(dp), JSVAL_DOUBLE)
                     87: #define STRING_TO_JSVAL(str)    JSVAL_SETTAG((jsval)(str), JSVAL_STRING)
                     88: 
                     89: /* Lock and unlock the GC thing held by a jsval. */
                     90: #define JSVAL_LOCK(cx,v)        (JSVAL_IS_GCTHING(v)                          \
                     91:                                  ? JS_LockGCThing(cx, JSVAL_TO_GCTHING(v))    \
                     92:                                  : JS_TRUE)
                     93: #define JSVAL_UNLOCK(cx,v)      (JSVAL_IS_GCTHING(v)                          \
                     94:                                  ? JS_UnlockGCThing(cx, JSVAL_TO_GCTHING(v))  \
                     95:                                  : JS_TRUE)
                     96: 
                     97: /* Domain limits for the jsval int type. */
                     98: #define JSVAL_INT_BITS          31
                     99: #define JSVAL_INT_POW2(n)       ((jsval)1 << (n))
                    100: #define JSVAL_INT_MIN           ((jsval)1 - JSVAL_INT_POW2(30))
                    101: #define JSVAL_INT_MAX           (JSVAL_INT_POW2(30) - 1)
                    102: #define INT_FITS_IN_JSVAL(i)    ((jsuint)((i)+JSVAL_INT_MAX) <= 2*JSVAL_INT_MAX)
                    103: #define JSVAL_TO_INT(v)         ((jsint)(v) >> 1)
                    104: #define INT_TO_JSVAL(i)         (((jsval)(i) << 1) | JSVAL_INT)
                    105: 
                    106: /* Convert between boolean and jsval. */
                    107: #define JSVAL_TO_BOOLEAN(v)     ((JSBool)((v) >> JSVAL_TAGBITS))
                    108: #define BOOLEAN_TO_JSVAL(b)     JSVAL_SETTAG((jsval)(b) << JSVAL_TAGBITS,     \
                    109:                                              JSVAL_BOOLEAN)
                    110: 
                    111: /* A private data pointer (2-byte-aligned) can be stored as an int jsval. */
                    112: #define JSVAL_TO_PRIVATE(v)     ((void *)((v) & ~JSVAL_INT))
                    113: #define PRIVATE_TO_JSVAL(p)     ((jsval)(p) | JSVAL_INT)
                    114: 
                    115: /* Property attributes, set in JSPropertySpec and passed to API functions. */
                    116: #define JSPROP_ENUMERATE        0x01    /* property is visible to for/in loop */
                    117: #define JSPROP_READONLY         0x02    /* not settable: assignment is no-op */
                    118: #define JSPROP_PERMANENT        0x04    /* property cannot be deleted */
                    119: #define JSPROP_EXPORTED         0x08    /* property is exported from object */
                    120: #define JSPROP_GETTER           0x10    /* property holds getter function */
                    121: #define JSPROP_SETTER           0x20    /* property holds setter function */
                    122: #define JSPROP_SHARED           0x40    /* don't allocate a value slot for this
                    123:                                            property; don't copy the property on
                    124:                                            set of the same-named property in an
                    125:                                            object that delegates to a prototype
                    126:                                            containing this property */
                    127: #define JSPROP_INDEX            0x80    /* name is actually (jsint) index */
                    128: 
                    129: /* Function flags, set in JSFunctionSpec and passed to JS_NewFunction etc. */
                    130: #define JSFUN_LAMBDA            0x08    /* expressed, not declared, function */
                    131: #define JSFUN_GETTER            JSPROP_GETTER
                    132: #define JSFUN_SETTER            JSPROP_SETTER
                    133: #define JSFUN_BOUND_METHOD      0x40    /* bind this to fun->object's parent */
                    134: #define JSFUN_HEAVYWEIGHT       0x80    /* activation requires a Call object */
                    135: #define JSFUN_FLAGS_MASK        0xf8    /* overlay JSFUN_* attributes */
                    136: 
                    137: /*
                    138:  * Well-known JS values.  The extern'd variables are initialized when the
                    139:  * first JSContext is created by JS_NewContext (see below).
                    140:  */
                    141: #define JSVAL_VOID              INT_TO_JSVAL(0 - JSVAL_INT_POW2(30))
                    142: #define JSVAL_NULL              OBJECT_TO_JSVAL(0)
                    143: #define JSVAL_ZERO              INT_TO_JSVAL(0)
                    144: #define JSVAL_ONE               INT_TO_JSVAL(1)
                    145: #define JSVAL_FALSE             BOOLEAN_TO_JSVAL(JS_FALSE)
                    146: #define JSVAL_TRUE              BOOLEAN_TO_JSVAL(JS_TRUE)
                    147: 
                    148: /*
                    149:  * Microseconds since the epoch, midnight, January 1, 1970 UTC.  See the
                    150:  * comment in jstypes.h regarding safe int64 usage.
                    151:  */
                    152: extern JS_PUBLIC_API(int64)
                    153: JS_Now();
                    154: 
                    155: /* Don't want to export data, so provide accessors for non-inline jsvals. */
                    156: extern JS_PUBLIC_API(jsval)
                    157: JS_GetNaNValue(JSContext *cx);
                    158: 
                    159: extern JS_PUBLIC_API(jsval)
                    160: JS_GetNegativeInfinityValue(JSContext *cx);
                    161: 
                    162: extern JS_PUBLIC_API(jsval)
                    163: JS_GetPositiveInfinityValue(JSContext *cx);
                    164: 
                    165: extern JS_PUBLIC_API(jsval)
                    166: JS_GetEmptyStringValue(JSContext *cx);
                    167: 
                    168: /*
                    169:  * Format is a string of the following characters (spaces are insignificant),
                    170:  * specifying the tabulated type conversions:
                    171:  *
                    172:  *   b      JSBool          Boolean
                    173:  *   c      uint16/jschar   ECMA uint16, Unicode char
                    174:  *   i      int32           ECMA int32
                    175:  *   u      uint32          ECMA uint32
                    176:  *   j      int32           Rounded int32 (coordinate)
                    177:  *   d      jsdouble        IEEE double
                    178:  *   I      jsdouble        Integral IEEE double
                    179:  *   s      char *          C string
                    180:  *   S      JSString *      Unicode string, accessed by a JSString pointer
                    181:  *   W      jschar *        Unicode character vector, 0-terminated (W for wide)
                    182:  *   o      JSObject *      Object reference
                    183:  *   f      JSFunction *    Function private
                    184:  *   v      jsval           Argument value (no conversion)
                    185:  *   *      N/A             Skip this argument (no vararg)
                    186:  *   /      N/A             End of required arguments
                    187:  *
                    188:  * The variable argument list after format must consist of &b, &c, &s, e.g.,
                    189:  * where those variables have the types given above.  For the pointer types
                    190:  * char *, JSString *, and JSObject *, the pointed-at memory returned belongs
                    191:  * to the JS runtime, not to the calling native code.  The runtime promises
                    192:  * to keep this memory valid so long as argv refers to allocated stack space
                    193:  * (so long as the native function is active).
                    194:  *
                    195:  * Fewer arguments than format specifies may be passed only if there is a /
                    196:  * in format after the last required argument specifier and argc is at least
                    197:  * the number of required arguments.  More arguments than format specifies
                    198:  * may be passed without error; it is up to the caller to deal with trailing
                    199:  * unconverted arguments.
                    200:  */
                    201: extern JS_PUBLIC_API(JSBool)
                    202: JS_ConvertArguments(JSContext *cx, uintN argc, jsval *argv, const char *format,
                    203:                     ...);
                    204: 
                    205: #ifdef va_start
                    206: extern JS_PUBLIC_API(JSBool)
                    207: JS_ConvertArgumentsVA(JSContext *cx, uintN argc, jsval *argv,
                    208:                       const char *format, va_list ap);
                    209: #endif
                    210: 
                    211: /*
                    212:  * Inverse of JS_ConvertArguments: scan format and convert trailing arguments
                    213:  * into jsvals, GC-rooted if necessary by the JS stack.  Return null on error,
                    214:  * and a pointer to the new argument vector on success.  Also return a stack
                    215:  * mark on success via *markp, in which case the caller must eventually clean
                    216:  * up by calling JS_PopArguments.
                    217:  *
                    218:  * Note that the number of actual arguments supplied is specified exclusively
                    219:  * by format, so there is no argc parameter.
                    220:  */
                    221: extern JS_PUBLIC_API(jsval *)
                    222: JS_PushArguments(JSContext *cx, void **markp, const char *format, ...);
                    223: 
                    224: #ifdef va_start
                    225: extern JS_PUBLIC_API(jsval *)
                    226: JS_PushArgumentsVA(JSContext *cx, void **markp, const char *format, va_list ap);
                    227: #endif
                    228: 
                    229: extern JS_PUBLIC_API(void)
                    230: JS_PopArguments(JSContext *cx, void *mark);
                    231: 
                    232: #ifdef JS_ARGUMENT_FORMATTER_DEFINED
                    233: 
                    234: /*
                    235:  * Add and remove a format string handler for JS_{Convert,Push}Arguments{,VA}.
                    236:  * The handler function has this signature (see jspubtd.h):
                    237:  *
                    238:  *   JSBool MyArgumentFormatter(JSContext *cx, const char *format,
                    239:  *                              JSBool fromJS, jsval **vpp, va_list *app);
                    240:  *
                    241:  * It should return true on success, and return false after reporting an error
                    242:  * or detecting an already-reported error.
                    243:  *
                    244:  * For a given format string, for example "AA", the formatter is called from
                    245:  * JS_ConvertArgumentsVA like so:
                    246:  *
                    247:  *   formatter(cx, "AA...", JS_TRUE, &sp, &ap);
                    248:  *
                    249:  * sp points into the arguments array on the JS stack, while ap points into
                    250:  * the stdarg.h va_list on the C stack.  The JS_TRUE passed for fromJS tells
                    251:  * the formatter to convert zero or more jsvals at sp to zero or more C values
                    252:  * accessed via pointers-to-values at ap, updating both sp (via *vpp) and ap
                    253:  * (via *app) to point past the converted arguments and their result pointers
                    254:  * on the C stack.
                    255:  *
                    256:  * When called from JS_PushArgumentsVA, the formatter is invoked thus:
                    257:  *
                    258:  *   formatter(cx, "AA...", JS_FALSE, &sp, &ap);
                    259:  *
                    260:  * where JS_FALSE for fromJS means to wrap the C values at ap according to the
                    261:  * format specifier and store them at sp, updating ap and sp appropriately.
                    262:  *
                    263:  * The "..." after "AA" is the rest of the format string that was passed into
                    264:  * JS_{Convert,Push}Arguments{,VA}.  The actual format trailing substring used
                    265:  * in each Convert or PushArguments call is passed to the formatter, so that
                    266:  * one such function may implement several formats, in order to share code.
                    267:  *
                    268:  * Remove just forgets about any handler associated with format.  Add does not
                    269:  * copy format, it points at the string storage allocated by the caller, which
                    270:  * is typically a string constant.  If format is in dynamic storage, it is up
                    271:  * to the caller to keep the string alive until Remove is called.
                    272:  */
                    273: extern JS_PUBLIC_API(JSBool)
                    274: JS_AddArgumentFormatter(JSContext *cx, const char *format,
                    275:                         JSArgumentFormatter formatter);
                    276: 
                    277: extern JS_PUBLIC_API(void)
                    278: JS_RemoveArgumentFormatter(JSContext *cx, const char *format);
                    279: 
                    280: #endif /* JS_ARGUMENT_FORMATTER_DEFINED */
                    281: 
                    282: extern JS_PUBLIC_API(JSBool)
                    283: JS_ConvertValue(JSContext *cx, jsval v, JSType type, jsval *vp);
                    284: 
                    285: extern JS_PUBLIC_API(JSBool)
                    286: JS_ValueToObject(JSContext *cx, jsval v, JSObject **objp);
                    287: 
                    288: extern JS_PUBLIC_API(JSFunction *)
                    289: JS_ValueToFunction(JSContext *cx, jsval v);
                    290: 
                    291: extern JS_PUBLIC_API(JSFunction *)
                    292: JS_ValueToConstructor(JSContext *cx, jsval v);
                    293: 
                    294: extern JS_PUBLIC_API(JSString *)
                    295: JS_ValueToString(JSContext *cx, jsval v);
                    296: 
                    297: extern JS_PUBLIC_API(JSBool)
                    298: JS_ValueToNumber(JSContext *cx, jsval v, jsdouble *dp);
                    299: 
                    300: /*
                    301:  * Convert a value to a number, then to an int32, according to the ECMA rules
                    302:  * for ToInt32.
                    303:  */
                    304: extern JS_PUBLIC_API(JSBool)
                    305: JS_ValueToECMAInt32(JSContext *cx, jsval v, int32 *ip);
                    306: 
                    307: /*
                    308:  * Convert a value to a number, then to a uint32, according to the ECMA rules
                    309:  * for ToUint32.
                    310:  */
                    311: extern JS_PUBLIC_API(JSBool)
                    312: JS_ValueToECMAUint32(JSContext *cx, jsval v, uint32 *ip);
                    313: 
                    314: /*
                    315:  * Convert a value to a number, then to an int32 if it fits by rounding to
                    316:  * nearest; but failing with an error report if the double is out of range
                    317:  * or unordered.
                    318:  */
                    319: extern JS_PUBLIC_API(JSBool)
                    320: JS_ValueToInt32(JSContext *cx, jsval v, int32 *ip);
                    321: 
                    322: /*
                    323:  * ECMA ToUint16, for mapping a jsval to a Unicode point.
                    324:  */
                    325: extern JS_PUBLIC_API(JSBool)
                    326: JS_ValueToUint16(JSContext *cx, jsval v, uint16 *ip);
                    327: 
                    328: extern JS_PUBLIC_API(JSBool)
                    329: JS_ValueToBoolean(JSContext *cx, jsval v, JSBool *bp);
                    330: 
                    331: extern JS_PUBLIC_API(JSType)
                    332: JS_TypeOfValue(JSContext *cx, jsval v);
                    333: 
                    334: extern JS_PUBLIC_API(const char *)
                    335: JS_GetTypeName(JSContext *cx, JSType type);
                    336: 
                    337: /************************************************************************/
                    338: 
                    339: /*
                    340:  * Initialization, locking, contexts, and memory allocation.
                    341:  */
                    342: #define JS_NewRuntime       JS_Init
                    343: #define JS_DestroyRuntime   JS_Finish
                    344: #define JS_LockRuntime      JS_Lock
                    345: #define JS_UnlockRuntime    JS_Unlock
                    346: 
                    347: extern JS_PUBLIC_API(JSRuntime *)
                    348: JS_NewRuntime(uint32 maxbytes);
                    349: 
                    350: extern JS_PUBLIC_API(void)
                    351: JS_DestroyRuntime(JSRuntime *rt);
                    352: 
                    353: extern JS_PUBLIC_API(void)
                    354: JS_ShutDown(void);
                    355: 
                    356: JS_PUBLIC_API(void *)
                    357: JS_GetRuntimePrivate(JSRuntime *rt);
                    358: 
                    359: JS_PUBLIC_API(void)
                    360: JS_SetRuntimePrivate(JSRuntime *rt, void *data);
                    361: 
                    362: #ifdef JS_THREADSAFE
                    363: 
                    364: extern JS_PUBLIC_API(void)
                    365: JS_BeginRequest(JSContext *cx);
                    366: 
                    367: extern JS_PUBLIC_API(void)
                    368: JS_EndRequest(JSContext *cx);
                    369: 
                    370: /* Yield to pending GC operations, regardless of request depth */
                    371: extern JS_PUBLIC_API(void)
                    372: JS_YieldRequest(JSContext *cx);
                    373: 
                    374: extern JS_PUBLIC_API(jsrefcount)
                    375: JS_SuspendRequest(JSContext *cx);
                    376: 
                    377: extern JS_PUBLIC_API(void)
                    378: JS_ResumeRequest(JSContext *cx, jsrefcount saveDepth);
                    379: 
                    380: #endif /* JS_THREADSAFE */
                    381: 
                    382: extern JS_PUBLIC_API(void)
                    383: JS_Lock(JSRuntime *rt);
                    384: 
                    385: extern JS_PUBLIC_API(void)
                    386: JS_Unlock(JSRuntime *rt);
                    387: 
                    388: extern JS_PUBLIC_API(JSContext *)
                    389: JS_NewContext(JSRuntime *rt, size_t stackChunkSize);
                    390: 
                    391: extern JS_PUBLIC_API(void)
                    392: JS_DestroyContext(JSContext *cx);
                    393: 
                    394: extern JS_PUBLIC_API(void)
                    395: JS_DestroyContextNoGC(JSContext *cx);
                    396: 
                    397: extern JS_PUBLIC_API(void)
                    398: JS_DestroyContextMaybeGC(JSContext *cx);
                    399: 
                    400: extern JS_PUBLIC_API(void *)
                    401: JS_GetContextPrivate(JSContext *cx);
                    402: 
                    403: extern JS_PUBLIC_API(void)
                    404: JS_SetContextPrivate(JSContext *cx, void *data);
                    405: 
                    406: extern JS_PUBLIC_API(JSRuntime *)
                    407: JS_GetRuntime(JSContext *cx);
                    408: 
                    409: extern JS_PUBLIC_API(JSContext *)
                    410: JS_ContextIterator(JSRuntime *rt, JSContext **iterp);
                    411: 
                    412: extern JS_PUBLIC_API(JSVersion)
                    413: JS_GetVersion(JSContext *cx);
                    414: 
                    415: extern JS_PUBLIC_API(JSVersion)
                    416: JS_SetVersion(JSContext *cx, JSVersion version);
                    417: 
                    418: extern JS_PUBLIC_API(const char *)
                    419: JS_VersionToString(JSVersion version);
                    420: 
                    421: extern JS_PUBLIC_API(JSVersion)
                    422: JS_StringToVersion(const char *string);
                    423: 
                    424: /*
                    425:  * JS options are orthogonal to version, and may be freely composed with one
                    426:  * another as well as with version.
                    427:  *
                    428:  * JSOPTION_VAROBJFIX is recommended -- see the comments associated with the
                    429:  * prototypes for JS_ExecuteScript, JS_EvaluateScript, etc.
                    430:  */
                    431: #define JSOPTION_STRICT         JS_BIT(0)       /* warn on dubious practice */
                    432: #define JSOPTION_WERROR         JS_BIT(1)       /* convert warning to error */
                    433: #define JSOPTION_VAROBJFIX      JS_BIT(2)       /* make JS_EvaluateScript use
                    434:                                                    the last object on its 'obj'
                    435:                                                    param's scope chain as the
                    436:                                                    ECMA 'variables object' */
                    437: #define JSOPTION_PRIVATE_IS_NSISUPPORTS \
                    438:                                 JS_BIT(3)       /* context private data points
                    439:                                                    to an nsISupports subclass */
                    440: #define JSOPTION_COMPILE_N_GO   JS_BIT(4)       /* caller of JS_Compile*Script
                    441:                                                    promises to execute compiled
                    442:                                                    script once only; enables
                    443:                                                    compile-time scope chain
                    444:                                                    resolution of consts. */
                    445: #define JSOPTION_ATLINE         JS_BIT(5)       /* //@line number ["filename"]
                    446:                                                    option supported for the
                    447:                                                    XUL preprocessor and kindred
                    448:                                                    beasts. */
                    449: 
                    450: extern JS_PUBLIC_API(uint32)
                    451: JS_GetOptions(JSContext *cx);
                    452: 
                    453: extern JS_PUBLIC_API(uint32)
                    454: JS_SetOptions(JSContext *cx, uint32 options);
                    455: 
                    456: extern JS_PUBLIC_API(uint32)
                    457: JS_ToggleOptions(JSContext *cx, uint32 options);
                    458: 
                    459: extern JS_PUBLIC_API(const char *)
                    460: JS_GetImplementationVersion(void);
                    461: 
                    462: extern JS_PUBLIC_API(JSObject *)
                    463: JS_GetGlobalObject(JSContext *cx);
                    464: 
                    465: extern JS_PUBLIC_API(void)
                    466: JS_SetGlobalObject(JSContext *cx, JSObject *obj);
                    467: 
                    468: /*
                    469:  * Initialize standard JS class constructors, prototypes, and any top-level
                    470:  * functions and constants associated with the standard classes (e.g. isNaN
                    471:  * for Number).
                    472:  *
                    473:  * NB: This sets cx's global object to obj if it was null.
                    474:  */
                    475: extern JS_PUBLIC_API(JSBool)
                    476: JS_InitStandardClasses(JSContext *cx, JSObject *obj);
                    477: 
                    478: /*
                    479:  * Resolve id, which must contain either a string or an int, to a standard
                    480:  * class name in obj if possible, defining the class's constructor and/or
                    481:  * prototype and storing true in *resolved.  If id does not name a standard
                    482:  * class or a top-level property induced by initializing a standard class,
                    483:  * store false in *resolved and just return true.  Return false on error,
                    484:  * as usual for JSBool result-typed API entry points.
                    485:  *
                    486:  * This API can be called directly from a global object class's resolve op,
                    487:  * to define standard classes lazily.  The class's enumerate op should call
                    488:  * JS_EnumerateStandardClasses(cx, obj), to define eagerly during for..in
                    489:  * loops any classes not yet resolved lazily.
                    490:  */
                    491: extern JS_PUBLIC_API(JSBool)
                    492: JS_ResolveStandardClass(JSContext *cx, JSObject *obj, jsval id,
                    493:                         JSBool *resolved);
                    494: 
                    495: extern JS_PUBLIC_API(JSBool)
                    496: JS_EnumerateStandardClasses(JSContext *cx, JSObject *obj);
                    497: 
                    498: extern JS_PUBLIC_API(JSObject *)
                    499: JS_GetScopeChain(JSContext *cx);
                    500: 
                    501: extern JS_PUBLIC_API(void *)
                    502: JS_malloc(JSContext *cx, size_t nbytes);
                    503: 
                    504: extern JS_PUBLIC_API(void *)
                    505: JS_realloc(JSContext *cx, void *p, size_t nbytes);
                    506: 
                    507: extern JS_PUBLIC_API(void)
                    508: JS_free(JSContext *cx, void *p);
                    509: 
                    510: extern JS_PUBLIC_API(char *)
                    511: JS_strdup(JSContext *cx, const char *s);
                    512: 
                    513: extern JS_PUBLIC_API(jsdouble *)
                    514: JS_NewDouble(JSContext *cx, jsdouble d);
                    515: 
                    516: extern JS_PUBLIC_API(JSBool)
                    517: JS_NewDoubleValue(JSContext *cx, jsdouble d, jsval *rval);
                    518: 
                    519: extern JS_PUBLIC_API(JSBool)
                    520: JS_NewNumberValue(JSContext *cx, jsdouble d, jsval *rval);
                    521: 
                    522: /*
                    523:  * A JS GC root is a pointer to a JSObject *, JSString *, or jsdouble * that
                    524:  * itself points into the GC heap (more recently, we support this extension:
                    525:  * a root may be a pointer to a jsval v for which JSVAL_IS_GCTHING(v) is true).
                    526:  *
                    527:  * Therefore, you never pass JSObject *obj to JS_AddRoot(cx, obj).  You always
                    528:  * call JS_AddRoot(cx, &obj), passing obj by reference.  And later, before obj
                    529:  * or the structure it is embedded within goes out of scope or is freed, you
                    530:  * must call JS_RemoveRoot(cx, &obj).
                    531:  *
                    532:  * Also, use JS_AddNamedRoot(cx, &structPtr->memberObj, "structPtr->memberObj")
                    533:  * in preference to JS_AddRoot(cx, &structPtr->memberObj), in order to identify
                    534:  * roots by their source callsites.  This way, you can find the callsite while
                    535:  * debugging if you should fail to do JS_RemoveRoot(cx, &structPtr->memberObj)
                    536:  * before freeing structPtr's memory.
                    537:  */
                    538: extern JS_PUBLIC_API(JSBool)
                    539: JS_AddRoot(JSContext *cx, void *rp);
                    540: 
                    541: #ifdef NAME_ALL_GC_ROOTS
                    542: #define JS_DEFINE_TO_TOKEN(def) #def
                    543: #define JS_DEFINE_TO_STRING(def) JS_DEFINE_TO_TOKEN(def)
                    544: #define JS_AddRoot(cx,rp) JS_AddNamedRoot((cx), (rp), (__FILE__ ":" JS_TOKEN_TO_STRING(__LINE__))
                    545: #endif
                    546: 
                    547: extern JS_PUBLIC_API(JSBool)
                    548: JS_AddNamedRoot(JSContext *cx, void *rp, const char *name);
                    549: 
                    550: extern JS_PUBLIC_API(JSBool)
                    551: JS_AddNamedRootRT(JSRuntime *rt, void *rp, const char *name);
                    552: 
                    553: extern JS_PUBLIC_API(JSBool)
                    554: JS_RemoveRoot(JSContext *cx, void *rp);
                    555: 
                    556: extern JS_PUBLIC_API(JSBool)
                    557: JS_RemoveRootRT(JSRuntime *rt, void *rp);
                    558: 
                    559: /*
                    560:  * The last GC thing of each type (object, string, double, external string
                    561:  * types) created on a given context is kept alive until another thing of the
                    562:  * same type is created, using a newborn root in the context.  These newborn
                    563:  * roots help native code protect newly-created GC-things from GC invocations
                    564:  * activated before those things can be rooted using local or global roots.
                    565:  *
                    566:  * However, the newborn roots can also entrain great gobs of garbage, so the
                    567:  * JS_GC entry point clears them for the context on which GC is being forced.
                    568:  * Embeddings may need to do likewise for all contexts.
                    569:  *
                    570:  * See the scoped local root API immediately below for a better way to manage
                    571:  * newborns in cases where native hooks (functions, getters, setters, etc.)
                    572:  * create many GC-things, potentially without connecting them to predefined
                    573:  * local roots such as *rval or argv[i] in an active native function.  Using
                    574:  * JS_EnterLocalRootScope disables updating of the context's per-gc-thing-type
                    575:  * newborn roots, until control flow unwinds and leaves the outermost nesting
                    576:  * local root scope.
                    577:  */
                    578: extern JS_PUBLIC_API(void)
                    579: JS_ClearNewbornRoots(JSContext *cx);
                    580: 
                    581: /*
                    582:  * Scoped local root management allows native functions, getter/setters, etc.
                    583:  * to avoid worrying about the newborn root pigeon-holes, overloading local
                    584:  * roots allocated in argv and *rval, or ending up having to call JS_Add*Root
                    585:  * and JS_RemoveRoot to manage global roots temporarily.
                    586:  *
                    587:  * Instead, calling JS_EnterLocalRootScope and JS_LeaveLocalRootScope around
                    588:  * the body of the native hook causes the engine to allocate a local root for
                    589:  * each newborn created in between the two API calls, using a local root stack
                    590:  * associated with cx.  For example:
                    591:  *
                    592:  *    JSBool
                    593:  *    my_GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
                    594:  *    {
                    595:  *        JSBool ok;
                    596:  *
                    597:  *        if (!JS_EnterLocalRootScope(cx))
                    598:  *            return JS_FALSE;
                    599:  *        ok = my_GetPropertyBody(cx, obj, id, vp);
                    600:  *        JS_LeaveLocalRootScope(cx);
                    601:  *        return ok;
                    602:  *    }
                    603:  *
                    604:  * NB: JS_LeaveLocalRootScope must be called once for every prior successful
                    605:  * call to JS_EnterLocalRootScope.  If JS_EnterLocalRootScope fails, you must
                    606:  * not make the matching JS_LeaveLocalRootScope call.
                    607:  *
                    608:  * In case a native hook allocates many objects or other GC-things, but the
                    609:  * native protects some of those GC-things by storing them as property values
                    610:  * in an object that is itself protected, the hook can call JS_ForgetLocalRoot
                    611:  * to free the local root automatically pushed for the now-protected GC-thing.
                    612:  *
                    613:  * JS_ForgetLocalRoot works on any GC-thing allocated in the current local
                    614:  * root scope, but it's more time-efficient when called on references to more
                    615:  * recently created GC-things.  Calling it successively on other than the most
                    616:  * recently allocated GC-thing will tend to average the time inefficiency, and
                    617:  * may risk O(n^2) growth rate, but in any event, you shouldn't allocate too
                    618:  * many local roots if you can root as you go (build a tree of objects from
                    619:  * the top down, forgetting each latest-allocated GC-thing immediately upon
                    620:  * linking it to its parent).
                    621:  */
                    622: extern JS_PUBLIC_API(JSBool)
                    623: JS_EnterLocalRootScope(JSContext *cx);
                    624: 
                    625: extern JS_PUBLIC_API(void)
                    626: JS_LeaveLocalRootScope(JSContext *cx);
                    627: 
                    628: extern JS_PUBLIC_API(void)
                    629: JS_ForgetLocalRoot(JSContext *cx, void *thing);
                    630: 
                    631: #ifdef DEBUG
                    632: extern JS_PUBLIC_API(void)
                    633: JS_DumpNamedRoots(JSRuntime *rt,
                    634:                   void (*dump)(const char *name, void *rp, void *data),
                    635:                   void *data);
                    636: #endif
                    637: 
                    638: /*
                    639:  * Call JS_MapGCRoots to map the GC's roots table using map(rp, name, data).
                    640:  * The root is pointed at by rp; if the root is unnamed, name is null; data is
                    641:  * supplied from the third parameter to JS_MapGCRoots.
                    642:  *
                    643:  * The map function should return JS_MAP_GCROOT_REMOVE to cause the currently
                    644:  * enumerated root to be removed.  To stop enumeration, set JS_MAP_GCROOT_STOP
                    645:  * in the return value.  To keep on mapping, return JS_MAP_GCROOT_NEXT.  These
                    646:  * constants are flags; you can OR them together.
                    647:  *
                    648:  * This function acquires and releases rt's GC lock around the mapping of the
                    649:  * roots table, so the map function should run to completion in as few cycles
                    650:  * as possible.  Of course, map cannot call JS_GC, JS_MaybeGC, JS_BeginRequest,
                    651:  * or any JS API entry point that acquires locks, without double-tripping or
                    652:  * deadlocking on the GC lock.
                    653:  *
                    654:  * JS_MapGCRoots returns the count of roots that were successfully mapped.
                    655:  */
                    656: #define JS_MAP_GCROOT_NEXT      0       /* continue mapping entries */
                    657: #define JS_MAP_GCROOT_STOP      1       /* stop mapping entries */
                    658: #define JS_MAP_GCROOT_REMOVE    2       /* remove and free the current entry */
                    659: 
                    660: typedef intN
                    661: (* JS_DLL_CALLBACK JSGCRootMapFun)(void *rp, const char *name, void *data);
                    662: 
                    663: extern JS_PUBLIC_API(uint32)
                    664: JS_MapGCRoots(JSRuntime *rt, JSGCRootMapFun map, void *data);
                    665: 
                    666: extern JS_PUBLIC_API(JSBool)
                    667: JS_LockGCThing(JSContext *cx, void *thing);
                    668: 
                    669: extern JS_PUBLIC_API(JSBool)
                    670: JS_LockGCThingRT(JSRuntime *rt, void *thing);
                    671: 
                    672: extern JS_PUBLIC_API(JSBool)
                    673: JS_UnlockGCThing(JSContext *cx, void *thing);
                    674: 
                    675: extern JS_PUBLIC_API(JSBool)
                    676: JS_UnlockGCThingRT(JSRuntime *rt, void *thing);
                    677: 
                    678: /*
                    679:  * For implementors of JSObjectOps.mark, to mark a GC-thing reachable via a
                    680:  * property or other strong ref identified for debugging purposes by name.
                    681:  * The name argument's storage needs to live only as long as the call to
                    682:  * this routine.
                    683:  *
                    684:  * The final arg is used by GC_MARK_DEBUG code to build a ref path through
                    685:  * the GC's live thing graph.  Implementors of JSObjectOps.mark should pass
                    686:  * its final arg through to this function when marking all GC-things that are
                    687:  * directly reachable from the object being marked.
                    688:  *
                    689:  * See the JSMarkOp typedef in jspubtd.h, and the JSObjectOps struct below.
                    690:  */
                    691: extern JS_PUBLIC_API(void)
                    692: JS_MarkGCThing(JSContext *cx, void *thing, const char *name, void *arg);
                    693: 
                    694: extern JS_PUBLIC_API(void)
                    695: JS_GC(JSContext *cx);
                    696: 
                    697: extern JS_PUBLIC_API(void)
                    698: JS_MaybeGC(JSContext *cx);
                    699: 
                    700: extern JS_PUBLIC_API(JSGCCallback)
                    701: JS_SetGCCallback(JSContext *cx, JSGCCallback cb);
                    702: 
                    703: extern JS_PUBLIC_API(JSGCCallback)
                    704: JS_SetGCCallbackRT(JSRuntime *rt, JSGCCallback cb);
                    705: 
                    706: extern JS_PUBLIC_API(JSBool)
                    707: JS_IsAboutToBeFinalized(JSContext *cx, void *thing);
                    708: 
                    709: /*
                    710:  * Add an external string finalizer, one created by JS_NewExternalString (see
                    711:  * below) using a type-code returned from this function, and that understands
                    712:  * how to free or release the memory pointed at by JS_GetStringChars(str).
                    713:  *
                    714:  * Return a nonnegative type index if there is room for finalizer in the
                    715:  * global GC finalizers table, else return -1.  If the engine is compiled
                    716:  * JS_THREADSAFE and used in a multi-threaded environment, this function must
                    717:  * be invoked on the primordial thread only, at startup -- or else the entire
                    718:  * program must single-thread itself while loading a module that calls this
                    719:  * function.
                    720:  */
                    721: extern JS_PUBLIC_API(intN)
                    722: JS_AddExternalStringFinalizer(JSStringFinalizeOp finalizer);
                    723: 
                    724: /*
                    725:  * Remove finalizer from the global GC finalizers table, returning its type
                    726:  * code if found, -1 if not found.
                    727:  *
                    728:  * As with JS_AddExternalStringFinalizer, there is a threading restriction
                    729:  * if you compile the engine JS_THREADSAFE: this function may be called for a
                    730:  * given finalizer pointer on only one thread; different threads may call to
                    731:  * remove distinct finalizers safely.
                    732:  *
                    733:  * You must ensure that all strings with finalizer's type have been collected
                    734:  * before calling this function.  Otherwise, string data will be leaked by the
                    735:  * GC, for want of a finalizer to call.
                    736:  */
                    737: extern JS_PUBLIC_API(intN)
                    738: JS_RemoveExternalStringFinalizer(JSStringFinalizeOp finalizer);
                    739: 
                    740: /*
                    741:  * Create a new JSString whose chars member refers to external memory, i.e.,
                    742:  * memory requiring special, type-specific finalization.  The type code must
                    743:  * be a nonnegative return value from JS_AddExternalStringFinalizer.
                    744:  */
                    745: extern JS_PUBLIC_API(JSString *)
                    746: JS_NewExternalString(JSContext *cx, jschar *chars, size_t length, intN type);
                    747: 
                    748: /*
                    749:  * Returns the external-string finalizer index for this string, or -1 if it is
                    750:  * an "internal" (native to JS engine) string.
                    751:  */
                    752: extern JS_PUBLIC_API(intN)
                    753: JS_GetExternalStringGCType(JSRuntime *rt, JSString *str);
                    754: 
                    755: /*
                    756:  * Sets maximum (if stack grows upward) or minimum (downward) legal stack byte
                    757:  * address in limitAddr for the thread or process stack used by cx.  To disable
                    758:  * stack size checking, pass 0 for limitAddr.
                    759:  */
                    760: extern JS_PUBLIC_API(void)
                    761: JS_SetThreadStackLimit(JSContext *cx, jsuword limitAddr);
                    762: 
                    763: /************************************************************************/
                    764: 
                    765: /*
                    766:  * Classes, objects, and properties.
                    767:  */
                    768: 
                    769: /* For detailed comments on the function pointer types, see jspubtd.h. */
                    770: struct JSClass {
                    771:     const char          *name;
                    772:     uint32              flags;
                    773: 
                    774:     /* Mandatory non-null function pointer members. */
                    775:     JSPropertyOp        addProperty;
                    776:     JSPropertyOp        delProperty;
                    777:     JSPropertyOp        getProperty;
                    778:     JSPropertyOp        setProperty;
                    779:     JSEnumerateOp       enumerate;
                    780:     JSResolveOp         resolve;
                    781:     JSConvertOp         convert;
                    782:     JSFinalizeOp        finalize;
                    783: 
                    784:     /* Optionally non-null members start here. */
                    785:     JSGetObjectOps      getObjectOps;
                    786:     JSCheckAccessOp     checkAccess;
                    787:     JSNative            call;
                    788:     JSNative            construct;
                    789:     JSXDRObjectOp       xdrObject;
                    790:     JSHasInstanceOp     hasInstance;
                    791:     JSMarkOp            mark;
                    792:     JSReserveSlotsOp    reserveSlots;
                    793: };
                    794: 
                    795: #define JSCLASS_HAS_PRIVATE             (1<<0)  /* objects have private slot */
                    796: #define JSCLASS_NEW_ENUMERATE           (1<<1)  /* has JSNewEnumerateOp hook */
                    797: #define JSCLASS_NEW_RESOLVE             (1<<2)  /* has JSNewResolveOp hook */
                    798: #define JSCLASS_PRIVATE_IS_NSISUPPORTS  (1<<3)  /* private is (nsISupports *) */
                    799: #define JSCLASS_SHARE_ALL_PROPERTIES    (1<<4)  /* all properties are SHARED */
                    800: #define JSCLASS_NEW_RESOLVE_GETS_START  (1<<5)  /* JSNewResolveOp gets starting
                    801:                                                    object in prototype chain
                    802:                                                    passed in via *objp in/out
                    803:                                                    parameter */
                    804: 
                    805: /*
                    806:  * To reserve slots fetched and stored via JS_Get/SetReservedSlot, bitwise-or
                    807:  * JSCLASS_HAS_RESERVED_SLOTS(n) into the initializer for JSClass.flags, where
                    808:  * n is a constant in [1, 255].  Reserved slots are indexed from 0 to n-1.
                    809:  */
                    810: #define JSCLASS_RESERVED_SLOTS_SHIFT    8       /* room for 8 flags below */
                    811: #define JSCLASS_RESERVED_SLOTS_WIDTH    8       /* and 16 above this field */
                    812: #define JSCLASS_RESERVED_SLOTS_MASK     JS_BITMASK(JSCLASS_RESERVED_SLOTS_WIDTH)
                    813: #define JSCLASS_HAS_RESERVED_SLOTS(n)   (((n) & JSCLASS_RESERVED_SLOTS_MASK)  \
                    814:                                          << JSCLASS_RESERVED_SLOTS_SHIFT)
                    815: #define JSCLASS_RESERVED_SLOTS(clasp)   (((clasp)->flags                      \
                    816:                                           >> JSCLASS_RESERVED_SLOTS_SHIFT)    \
                    817:                                          & JSCLASS_RESERVED_SLOTS_MASK)
                    818: 
                    819: /* Initializer for unused members of statically initialized JSClass structs. */
                    820: #define JSCLASS_NO_OPTIONAL_MEMBERS     0,0,0,0,0,0,0,0
                    821: 
                    822: /* For detailed comments on these function pointer types, see jspubtd.h. */
                    823: struct JSObjectOps {
                    824:     /* Mandatory non-null function pointer members. */
                    825:     JSNewObjectMapOp    newObjectMap;
                    826:     JSObjectMapOp       destroyObjectMap;
                    827:     JSLookupPropOp      lookupProperty;
                    828:     JSDefinePropOp      defineProperty;
                    829:     JSPropertyIdOp      getProperty;
                    830:     JSPropertyIdOp      setProperty;
                    831:     JSAttributesOp      getAttributes;
                    832:     JSAttributesOp      setAttributes;
                    833:     JSPropertyIdOp      deleteProperty;
                    834:     JSConvertOp         defaultValue;
                    835:     JSNewEnumerateOp    enumerate;
                    836:     JSCheckAccessIdOp   checkAccess;
                    837: 
                    838:     /* Optionally non-null members start here. */
                    839:     JSObjectOp          thisObject;
                    840:     JSPropertyRefOp     dropProperty;
                    841:     JSNative            call;
                    842:     JSNative            construct;
                    843:     JSXDRObjectOp       xdrObject;
                    844:     JSHasInstanceOp     hasInstance;
                    845:     JSSetObjectSlotOp   setProto;
                    846:     JSSetObjectSlotOp   setParent;
                    847:     JSMarkOp            mark;
                    848:     JSFinalizeOp        clear;
                    849:     JSGetRequiredSlotOp getRequiredSlot;
                    850:     JSSetRequiredSlotOp setRequiredSlot;
                    851: };
                    852: 
                    853: /*
                    854:  * Classes that expose JSObjectOps via a non-null getObjectOps class hook may
                    855:  * derive a property structure from this struct, return a pointer to it from
                    856:  * lookupProperty and defineProperty, and use the pointer to avoid rehashing
                    857:  * in getAttributes and setAttributes.
                    858:  *
                    859:  * The jsid type contains either an int jsval (see JSVAL_IS_INT above), or an
                    860:  * internal pointer that is opaque to users of this API, but which users may
                    861:  * convert from and to a jsval using JS_ValueToId and JS_IdToValue.
                    862:  */
                    863: struct JSProperty {
                    864:     jsid id;
                    865: };
                    866: 
                    867: struct JSIdArray {
                    868:     jsint length;
                    869:     jsid  vector[1];    /* actually, length jsid words */
                    870: };
                    871: 
                    872: extern JS_PUBLIC_API(void)
                    873: JS_DestroyIdArray(JSContext *cx, JSIdArray *ida);
                    874: 
                    875: extern JS_PUBLIC_API(JSBool)
                    876: JS_ValueToId(JSContext *cx, jsval v, jsid *idp);
                    877: 
                    878: extern JS_PUBLIC_API(JSBool)
                    879: JS_IdToValue(JSContext *cx, jsid id, jsval *vp);
                    880: 
                    881: #define JSRESOLVE_QUALIFIED     0x01    /* resolve a qualified property id */
                    882: #define JSRESOLVE_ASSIGNING     0x02    /* resolve on the left of assignment */
                    883: #define JSRESOLVE_DETECTING     0x04    /* 'if (o.p)...' or '(o.p) ?...:...' */
                    884: #define JSRESOLVE_DECLARING     0x08    /* var, const, or function prolog op */
                    885: #define JSRESOLVE_CLASSNAME     0x10    /* class name used when constructing */
                    886: 
                    887: extern JS_PUBLIC_API(JSBool)
                    888: JS_PropertyStub(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
                    889: 
                    890: extern JS_PUBLIC_API(JSBool)
                    891: JS_EnumerateStub(JSContext *cx, JSObject *obj);
                    892: 
                    893: extern JS_PUBLIC_API(JSBool)
                    894: JS_ResolveStub(JSContext *cx, JSObject *obj, jsval id);
                    895: 
                    896: extern JS_PUBLIC_API(JSBool)
                    897: JS_ConvertStub(JSContext *cx, JSObject *obj, JSType type, jsval *vp);
                    898: 
                    899: extern JS_PUBLIC_API(void)
                    900: JS_FinalizeStub(JSContext *cx, JSObject *obj);
                    901: 
                    902: struct JSConstDoubleSpec {
                    903:     jsdouble        dval;
                    904:     const char      *name;
                    905:     uint8           flags;
                    906:     uint8           spare[3];
                    907: };
                    908: 
                    909: /*
                    910:  * To define an array element rather than a named property member, cast the
                    911:  * element's index to (const char *) and initialize name with it, and set the
                    912:  * JSPROP_INDEX bit in flags.
                    913:  */
                    914: struct JSPropertySpec {
                    915:     const char      *name;
                    916:     int8            tinyid;
                    917:     uint8           flags;
                    918:     JSPropertyOp    getter;
                    919:     JSPropertyOp    setter;
                    920: };
                    921: 
                    922: struct JSFunctionSpec {
                    923:     const char      *name;
                    924:     JSNative        call;
                    925:     uint8           nargs;
                    926:     uint8           flags;
                    927:     uint16          extra;      /* number of arg slots for local GC roots */
                    928: };
                    929: 
                    930: extern JS_PUBLIC_API(JSObject *)
                    931: JS_InitClass(JSContext *cx, JSObject *obj, JSObject *parent_proto,
                    932:              JSClass *clasp, JSNative constructor, uintN nargs,
                    933:              JSPropertySpec *ps, JSFunctionSpec *fs,
                    934:              JSPropertySpec *static_ps, JSFunctionSpec *static_fs);
                    935: 
                    936: #ifdef JS_THREADSAFE
                    937: extern JS_PUBLIC_API(JSClass *)
                    938: JS_GetClass(JSContext *cx, JSObject *obj);
                    939: 
                    940: #define JS_GET_CLASS(cx,obj) JS_GetClass(cx, obj)
                    941: #else
                    942: extern JS_PUBLIC_API(JSClass *)
                    943: JS_GetClass(JSObject *obj);
                    944: 
                    945: #define JS_GET_CLASS(cx,obj) JS_GetClass(obj)
                    946: #endif
                    947: 
                    948: extern JS_PUBLIC_API(JSBool)
                    949: JS_InstanceOf(JSContext *cx, JSObject *obj, JSClass *clasp, jsval *argv);
                    950: 
                    951: extern JS_PUBLIC_API(void *)
                    952: JS_GetPrivate(JSContext *cx, JSObject *obj);
                    953: 
                    954: extern JS_PUBLIC_API(JSBool)
                    955: JS_SetPrivate(JSContext *cx, JSObject *obj, void *data);
                    956: 
                    957: extern JS_PUBLIC_API(void *)
                    958: JS_GetInstancePrivate(JSContext *cx, JSObject *obj, JSClass *clasp,
                    959:                       jsval *argv);
                    960: 
                    961: extern JS_PUBLIC_API(JSObject *)
                    962: JS_GetPrototype(JSContext *cx, JSObject *obj);
                    963: 
                    964: extern JS_PUBLIC_API(JSBool)
                    965: JS_SetPrototype(JSContext *cx, JSObject *obj, JSObject *proto);
                    966: 
                    967: extern JS_PUBLIC_API(JSObject *)
                    968: JS_GetParent(JSContext *cx, JSObject *obj);
                    969: 
                    970: extern JS_PUBLIC_API(JSBool)
                    971: JS_SetParent(JSContext *cx, JSObject *obj, JSObject *parent);
                    972: 
                    973: extern JS_PUBLIC_API(JSObject *)
                    974: JS_GetConstructor(JSContext *cx, JSObject *proto);
                    975: 
                    976: /*
                    977:  * Get a unique identifier for obj, good for the lifetime of obj (even if it
                    978:  * is moved by a copying GC).  Return false on failure (likely out of memory),
                    979:  * and true with *idp containing the unique id on success.
                    980:  */
                    981: extern JS_PUBLIC_API(JSBool)
                    982: JS_GetObjectId(JSContext *cx, JSObject *obj, jsid *idp);
                    983: 
                    984: extern JS_PUBLIC_API(JSObject *)
                    985: JS_NewObject(JSContext *cx, JSClass *clasp, JSObject *proto, JSObject *parent);
                    986: 
                    987: extern JS_PUBLIC_API(JSBool)
                    988: JS_SealObject(JSContext *cx, JSObject *obj, JSBool deep);
                    989: 
                    990: extern JS_PUBLIC_API(JSObject *)
                    991: JS_ConstructObject(JSContext *cx, JSClass *clasp, JSObject *proto,
                    992:                    JSObject *parent);
                    993: 
                    994: extern JS_PUBLIC_API(JSObject *)
                    995: JS_ConstructObjectWithArguments(JSContext *cx, JSClass *clasp, JSObject *proto,
                    996:                                 JSObject *parent, uintN argc, jsval *argv);
                    997: 
                    998: extern JS_PUBLIC_API(JSObject *)
                    999: JS_DefineObject(JSContext *cx, JSObject *obj, const char *name, JSClass *clasp,
                   1000:                 JSObject *proto, uintN attrs);
                   1001: 
                   1002: extern JS_PUBLIC_API(JSBool)
                   1003: JS_DefineConstDoubles(JSContext *cx, JSObject *obj, JSConstDoubleSpec *cds);
                   1004: 
                   1005: extern JS_PUBLIC_API(JSBool)
                   1006: JS_DefineProperties(JSContext *cx, JSObject *obj, JSPropertySpec *ps);
                   1007: 
                   1008: extern JS_PUBLIC_API(JSBool)
                   1009: JS_DefineProperty(JSContext *cx, JSObject *obj, const char *name, jsval value,
                   1010:                   JSPropertyOp getter, JSPropertyOp setter, uintN attrs);
                   1011: 
                   1012: /*
                   1013:  * Determine the attributes (JSPROP_* flags) of a property on a given object.
                   1014:  *
                   1015:  * If the object does not have a property by that name, *foundp will be
                   1016:  * JS_FALSE and the value of *attrsp is undefined.
                   1017:  */
                   1018: extern JS_PUBLIC_API(JSBool)
                   1019: JS_GetPropertyAttributes(JSContext *cx, JSObject *obj, const char *name,
                   1020:                          uintN *attrsp, JSBool *foundp);
                   1021: 
                   1022: /*
                   1023:  * Set the attributes of a property on a given object.
                   1024:  *
                   1025:  * If the object does not have a property by that name, *foundp will be
                   1026:  * JS_FALSE and nothing will be altered.
                   1027:  */
                   1028: extern JS_PUBLIC_API(JSBool)
                   1029: JS_SetPropertyAttributes(JSContext *cx, JSObject *obj, const char *name,
                   1030:                          uintN attrs, JSBool *foundp);
                   1031: 
                   1032: extern JS_PUBLIC_API(JSBool)
                   1033: JS_DefinePropertyWithTinyId(JSContext *cx, JSObject *obj, const char *name,
                   1034:                             int8 tinyid, jsval value,
                   1035:                             JSPropertyOp getter, JSPropertyOp setter,
                   1036:                             uintN attrs);
                   1037: 
                   1038: extern JS_PUBLIC_API(JSBool)
                   1039: JS_AliasProperty(JSContext *cx, JSObject *obj, const char *name,
                   1040:                  const char *alias);
                   1041: 
                   1042: extern JS_PUBLIC_API(JSBool)
                   1043: JS_HasProperty(JSContext *cx, JSObject *obj, const char *name, JSBool *foundp);
                   1044: 
                   1045: extern JS_PUBLIC_API(JSBool)
                   1046: JS_LookupProperty(JSContext *cx, JSObject *obj, const char *name, jsval *vp);
                   1047: 
                   1048: extern JS_PUBLIC_API(JSBool)
                   1049: JS_LookupPropertyWithFlags(JSContext *cx, JSObject *obj, const char *name,
                   1050:                            uintN flags, jsval *vp);
                   1051: 
                   1052: extern JS_PUBLIC_API(JSBool)
                   1053: JS_GetProperty(JSContext *cx, JSObject *obj, const char *name, jsval *vp);
                   1054: 
                   1055: extern JS_PUBLIC_API(JSBool)
                   1056: JS_SetProperty(JSContext *cx, JSObject *obj, const char *name, jsval *vp);
                   1057: 
                   1058: extern JS_PUBLIC_API(JSBool)
                   1059: JS_DeleteProperty(JSContext *cx, JSObject *obj, const char *name);
                   1060: 
                   1061: extern JS_PUBLIC_API(JSBool)
                   1062: JS_DeleteProperty2(JSContext *cx, JSObject *obj, const char *name,
                   1063:                    jsval *rval);
                   1064: 
                   1065: extern JS_PUBLIC_API(JSBool)
                   1066: JS_DefineUCProperty(JSContext *cx, JSObject *obj,
                   1067:                     const jschar *name, size_t namelen, jsval value,
                   1068:                     JSPropertyOp getter, JSPropertyOp setter,
                   1069:                     uintN attrs);
                   1070: 
                   1071: /*
                   1072:  * Determine the attributes (JSPROP_* flags) of a property on a given object.
                   1073:  *
                   1074:  * If the object does not have a property by that name, *foundp will be
                   1075:  * JS_FALSE and the value of *attrsp is undefined.
                   1076:  */
                   1077: extern JS_PUBLIC_API(JSBool)
                   1078: JS_GetUCPropertyAttributes(JSContext *cx, JSObject *obj,
                   1079:                            const jschar *name, size_t namelen,
                   1080:                            uintN *attrsp, JSBool *foundp);
                   1081: 
                   1082: /*
                   1083:  * Set the attributes of a property on a given object.
                   1084:  *
                   1085:  * If the object does not have a property by that name, *foundp will be
                   1086:  * JS_FALSE and nothing will be altered.
                   1087:  */
                   1088: extern JS_PUBLIC_API(JSBool)
                   1089: JS_SetUCPropertyAttributes(JSContext *cx, JSObject *obj,
                   1090:                            const jschar *name, size_t namelen,
                   1091:                            uintN attrs, JSBool *foundp);
                   1092: 
                   1093: 
                   1094: extern JS_PUBLIC_API(JSBool)
                   1095: JS_DefineUCPropertyWithTinyId(JSContext *cx, JSObject *obj,
                   1096:                               const jschar *name, size_t namelen,
                   1097:                               int8 tinyid, jsval value,
                   1098:                               JSPropertyOp getter, JSPropertyOp setter,
                   1099:                               uintN attrs);
                   1100: 
                   1101: extern JS_PUBLIC_API(JSBool)
                   1102: JS_HasUCProperty(JSContext *cx, JSObject *obj,
                   1103:                  const jschar *name, size_t namelen,
                   1104:                  JSBool *vp);
                   1105: 
                   1106: extern JS_PUBLIC_API(JSBool)
                   1107: JS_LookupUCProperty(JSContext *cx, JSObject *obj,
                   1108:                     const jschar *name, size_t namelen,
                   1109:                     jsval *vp);
                   1110: 
                   1111: extern JS_PUBLIC_API(JSBool)
                   1112: JS_GetUCProperty(JSContext *cx, JSObject *obj,
                   1113:                  const jschar *name, size_t namelen,
                   1114:                  jsval *vp);
                   1115: 
                   1116: extern JS_PUBLIC_API(JSBool)
                   1117: JS_SetUCProperty(JSContext *cx, JSObject *obj,
                   1118:                  const jschar *name, size_t namelen,
                   1119:                  jsval *vp);
                   1120: 
                   1121: extern JS_PUBLIC_API(JSBool)
                   1122: JS_DeleteUCProperty2(JSContext *cx, JSObject *obj,
                   1123:                      const jschar *name, size_t namelen,
                   1124:                      jsval *rval);
                   1125: 
                   1126: extern JS_PUBLIC_API(JSObject *)
                   1127: JS_NewArrayObject(JSContext *cx, jsint length, jsval *vector);
                   1128: 
                   1129: extern JS_PUBLIC_API(JSBool)
                   1130: JS_IsArrayObject(JSContext *cx, JSObject *obj);
                   1131: 
                   1132: extern JS_PUBLIC_API(JSBool)
                   1133: JS_GetArrayLength(JSContext *cx, JSObject *obj, jsuint *lengthp);
                   1134: 
                   1135: extern JS_PUBLIC_API(JSBool)
                   1136: JS_SetArrayLength(JSContext *cx, JSObject *obj, jsuint length);
                   1137: 
                   1138: extern JS_PUBLIC_API(JSBool)
                   1139: JS_HasArrayLength(JSContext *cx, JSObject *obj, jsuint *lengthp);
                   1140: 
                   1141: extern JS_PUBLIC_API(JSBool)
                   1142: JS_DefineElement(JSContext *cx, JSObject *obj, jsint index, jsval value,
                   1143:                  JSPropertyOp getter, JSPropertyOp setter, uintN attrs);
                   1144: 
                   1145: extern JS_PUBLIC_API(JSBool)
                   1146: JS_AliasElement(JSContext *cx, JSObject *obj, const char *name, jsint alias);
                   1147: 
                   1148: extern JS_PUBLIC_API(JSBool)
                   1149: JS_HasElement(JSContext *cx, JSObject *obj, jsint index, JSBool *foundp);
                   1150: 
                   1151: extern JS_PUBLIC_API(JSBool)
                   1152: JS_LookupElement(JSContext *cx, JSObject *obj, jsint index, jsval *vp);
                   1153: 
                   1154: extern JS_PUBLIC_API(JSBool)
                   1155: JS_GetElement(JSContext *cx, JSObject *obj, jsint index, jsval *vp);
                   1156: 
                   1157: extern JS_PUBLIC_API(JSBool)
                   1158: JS_SetElement(JSContext *cx, JSObject *obj, jsint index, jsval *vp);
                   1159: 
                   1160: extern JS_PUBLIC_API(JSBool)
                   1161: JS_DeleteElement(JSContext *cx, JSObject *obj, jsint index);
                   1162: 
                   1163: extern JS_PUBLIC_API(JSBool)
                   1164: JS_DeleteElement2(JSContext *cx, JSObject *obj, jsint index, jsval *rval);
                   1165: 
                   1166: extern JS_PUBLIC_API(void)
                   1167: JS_ClearScope(JSContext *cx, JSObject *obj);
                   1168: 
                   1169: extern JS_PUBLIC_API(JSIdArray *)
                   1170: JS_Enumerate(JSContext *cx, JSObject *obj);
                   1171: 
                   1172: extern JS_PUBLIC_API(JSBool)
                   1173: JS_CheckAccess(JSContext *cx, JSObject *obj, jsid id, JSAccessMode mode,
                   1174:                jsval *vp, uintN *attrsp);
                   1175: 
                   1176: extern JS_PUBLIC_API(JSCheckAccessOp)
                   1177: JS_SetCheckObjectAccessCallback(JSRuntime *rt, JSCheckAccessOp acb);
                   1178: 
                   1179: extern JS_PUBLIC_API(JSBool)
                   1180: JS_GetReservedSlot(JSContext *cx, JSObject *obj, uint32 index, jsval *vp);
                   1181: 
                   1182: extern JS_PUBLIC_API(JSBool)
                   1183: JS_SetReservedSlot(JSContext *cx, JSObject *obj, uint32 index, jsval v);
                   1184: 
                   1185: /************************************************************************/
                   1186: 
                   1187: /*
                   1188:  * Security protocol.
                   1189:  */
                   1190: struct JSPrincipals {
                   1191:     char *codebase;
                   1192:     void * (* JS_DLL_CALLBACK getPrincipalArray)(JSContext *cx, JSPrincipals *);
                   1193:     JSBool (* JS_DLL_CALLBACK globalPrivilegesEnabled)(JSContext *cx, JSPrincipals *);
                   1194: 
                   1195:     /* Don't call "destroy"; use reference counting macros below. */
                   1196:     jsrefcount refcount;
                   1197:     void (* JS_DLL_CALLBACK destroy)(JSContext *cx, struct JSPrincipals *);
                   1198: };
                   1199: 
                   1200: #ifdef JS_THREADSAFE
                   1201: #define JSPRINCIPALS_HOLD(cx, principals)   JS_HoldPrincipals(cx,principals)
                   1202: #define JSPRINCIPALS_DROP(cx, principals)   JS_DropPrincipals(cx,principals)
                   1203: 
                   1204: extern JS_PUBLIC_API(jsrefcount)
                   1205: JS_HoldPrincipals(JSContext *cx, JSPrincipals *principals);
                   1206: 
                   1207: extern JS_PUBLIC_API(jsrefcount)
                   1208: JS_DropPrincipals(JSContext *cx, JSPrincipals *principals);
                   1209: 
                   1210: #else
                   1211: #define JSPRINCIPALS_HOLD(cx, principals)   (++(principals)->refcount)
                   1212: #define JSPRINCIPALS_DROP(cx, principals)                                     \
                   1213:     ((--(principals)->refcount == 0)                                          \
                   1214:      ? ((*(principals)->destroy)((cx), (principals)), 0)                      \
                   1215:      : (principals)->refcount)
                   1216: #endif
                   1217: 
                   1218: extern JS_PUBLIC_API(JSPrincipalsTranscoder)
                   1219: JS_SetPrincipalsTranscoder(JSRuntime *rt, JSPrincipalsTranscoder px);
                   1220: 
                   1221: extern JS_PUBLIC_API(JSObjectPrincipalsFinder)
                   1222: JS_SetObjectPrincipalsFinder(JSContext *cx, JSObjectPrincipalsFinder fop);
                   1223: 
                   1224: /************************************************************************/
                   1225: 
                   1226: /*
                   1227:  * Functions and scripts.
                   1228:  */
                   1229: extern JS_PUBLIC_API(JSFunction *)
                   1230: JS_NewFunction(JSContext *cx, JSNative call, uintN nargs, uintN flags,
                   1231:                JSObject *parent, const char *name);
                   1232: 
                   1233: extern JS_PUBLIC_API(JSObject *)
                   1234: JS_GetFunctionObject(JSFunction *fun);
                   1235: 
                   1236: /*
                   1237:  * Deprecated, useful only for diagnostics.  Use JS_GetFunctionId instead for
                   1238:  * anonymous vs. "anonymous" disambiguation and Unicode fidelity.
                   1239:  */
                   1240: extern JS_PUBLIC_API(const char *)
                   1241: JS_GetFunctionName(JSFunction *fun);
                   1242: 
                   1243: /*
                   1244:  * Return the function's identifier as a JSString, or null if fun is unnamed.
                   1245:  * The returned string lives as long as fun, so you don't need to root a saved
                   1246:  * reference to it if fun is well-connected or rooted, and provided you bound
                   1247:  * the use of the saved reference by fun's lifetime.
                   1248:  *
                   1249:  * Prefer JS_GetFunctionId over JS_GetFunctionName because it returns null for
                   1250:  * truly anonymous functions, and because it doesn't chop to ISO-Latin-1 chars
                   1251:  * from UTF-16-ish jschars.
                   1252:  */
                   1253: extern JS_PUBLIC_API(JSString *)
                   1254: JS_GetFunctionId(JSFunction *fun);
                   1255: 
                   1256: /*
                   1257:  * Return JSFUN_* flags for fun.
                   1258:  */
                   1259: extern JS_PUBLIC_API(uintN)
                   1260: JS_GetFunctionFlags(JSFunction *fun);
                   1261: 
                   1262: /*
                   1263:  * Infallible predicate to test whether obj is a function object (faster than
                   1264:  * comparing obj's class name to "Function", but equivalent unless someone has
                   1265:  * overwritten the "Function" identifier with a different constructor and then
                   1266:  * created instances using that constructor that might be passed in as obj).
                   1267:  */
                   1268: extern JS_PUBLIC_API(JSBool)
                   1269: JS_ObjectIsFunction(JSContext *cx, JSObject *obj);
                   1270: 
                   1271: extern JS_PUBLIC_API(JSBool)
                   1272: JS_DefineFunctions(JSContext *cx, JSObject *obj, JSFunctionSpec *fs);
                   1273: 
                   1274: extern JS_PUBLIC_API(JSFunction *)
                   1275: JS_DefineFunction(JSContext *cx, JSObject *obj, const char *name, JSNative call,
                   1276:                   uintN nargs, uintN attrs);
                   1277: 
                   1278: extern JS_PUBLIC_API(JSFunction *)
                   1279: JS_DefineUCFunction(JSContext *cx, JSObject *obj,
                   1280:                     const jschar *name, size_t namelen, JSNative call,
                   1281:                     uintN nargs, uintN attrs);
                   1282: 
                   1283: extern JS_PUBLIC_API(JSObject *)
                   1284: JS_CloneFunctionObject(JSContext *cx, JSObject *funobj, JSObject *parent);
                   1285: 
                   1286: /*
                   1287:  * Given a buffer, return JS_FALSE if the buffer might become a valid
                   1288:  * javascript statement with the addition of more lines.  Otherwise return
                   1289:  * JS_TRUE.  The intent is to support interactive compilation - accumulate
                   1290:  * lines in a buffer until JS_BufferIsCompilableUnit is true, then pass it to
                   1291:  * the compiler.
                   1292:  */
                   1293: extern JS_PUBLIC_API(JSBool)
                   1294: JS_BufferIsCompilableUnit(JSContext *cx, JSObject *obj,
                   1295:                           const char *bytes, size_t length);
                   1296: 
                   1297: /*
                   1298:  * The JSScript objects returned by the following functions refer to string and
                   1299:  * other kinds of literals, including doubles and RegExp objects.  These
                   1300:  * literals are vulnerable to garbage collection; to root script objects and
                   1301:  * prevent literals from being collected, create a rootable object using
                   1302:  * JS_NewScriptObject, and root the resulting object using JS_Add[Named]Root.
                   1303:  */
                   1304: extern JS_PUBLIC_API(JSScript *)
                   1305: JS_CompileScript(JSContext *cx, JSObject *obj,
                   1306:                  const char *bytes, size_t length,
                   1307:                  const char *filename, uintN lineno);
                   1308: 
                   1309: extern JS_PUBLIC_API(JSScript *)
                   1310: JS_CompileScriptForPrincipals(JSContext *cx, JSObject *obj,
                   1311:                               JSPrincipals *principals,
                   1312:                               const char *bytes, size_t length,
                   1313:                               const char *filename, uintN lineno);
                   1314: 
                   1315: extern JS_PUBLIC_API(JSScript *)
                   1316: JS_CompileUCScript(JSContext *cx, JSObject *obj,
                   1317:                    const jschar *chars, size_t length,
                   1318:                    const char *filename, uintN lineno);
                   1319: 
                   1320: extern JS_PUBLIC_API(JSScript *)
                   1321: JS_CompileUCScriptForPrincipals(JSContext *cx, JSObject *obj,
                   1322:                                 JSPrincipals *principals,
                   1323:                                 const jschar *chars, size_t length,
                   1324:                                 const char *filename, uintN lineno);
                   1325: 
                   1326: extern JS_PUBLIC_API(JSScript *)
                   1327: JS_CompileFile(JSContext *cx, JSObject *obj, const char *filename);
                   1328: 
                   1329: extern JS_PUBLIC_API(JSScript *)
                   1330: JS_CompileFileHandle(JSContext *cx, JSObject *obj, const char *filename,
                   1331:                      FILE *fh);
                   1332: 
                   1333: extern JS_PUBLIC_API(JSScript *)
                   1334: JS_CompileFileHandleForPrincipals(JSContext *cx, JSObject *obj,
                   1335:                                   const char *filename, FILE *fh,
                   1336:                                   JSPrincipals *principals);
                   1337: 
                   1338: /*
                   1339:  * NB: you must use JS_NewScriptObject and root a pointer to its return value
                   1340:  * in order to keep a JSScript and its atoms safe from garbage collection after
                   1341:  * creating the script via JS_Compile* and before a JS_ExecuteScript* call.
                   1342:  * E.g., and without error checks:
                   1343:  *
                   1344:  *    JSScript *script = JS_CompileFile(cx, global, filename);
                   1345:  *    JSObject *scrobj = JS_NewScriptObject(cx, script);
                   1346:  *    JS_AddNamedRoot(cx, &scrobj, "scrobj");
                   1347:  *    do {
                   1348:  *        jsval result;
                   1349:  *        JS_ExecuteScript(cx, global, script, &result);
                   1350:  *        JS_GC();
                   1351:  *    } while (!JSVAL_IS_BOOLEAN(result) || JSVAL_TO_BOOLEAN(result));
                   1352:  *    JS_RemoveRoot(cx, &scrobj);
                   1353:  */
                   1354: extern JS_PUBLIC_API(JSObject *)
                   1355: JS_NewScriptObject(JSContext *cx, JSScript *script);
                   1356: 
                   1357: /*
                   1358:  * Infallible getter for a script's object.  If JS_NewScriptObject has not been
                   1359:  * called on script yet, the return value will be null.
                   1360:  */
                   1361: extern JS_PUBLIC_API(JSObject *)
                   1362: JS_GetScriptObject(JSScript *script);
                   1363: 
                   1364: extern JS_PUBLIC_API(void)
                   1365: JS_DestroyScript(JSContext *cx, JSScript *script);
                   1366: 
                   1367: extern JS_PUBLIC_API(JSFunction *)
                   1368: JS_CompileFunction(JSContext *cx, JSObject *obj, const char *name,
                   1369:                    uintN nargs, const char **argnames,
                   1370:                    const char *bytes, size_t length,
                   1371:                    const char *filename, uintN lineno);
                   1372: 
                   1373: extern JS_PUBLIC_API(JSFunction *)
                   1374: JS_CompileFunctionForPrincipals(JSContext *cx, JSObject *obj,
                   1375:                                 JSPrincipals *principals, const char *name,
                   1376:                                 uintN nargs, const char **argnames,
                   1377:                                 const char *bytes, size_t length,
                   1378:                                 const char *filename, uintN lineno);
                   1379: 
                   1380: extern JS_PUBLIC_API(JSFunction *)
                   1381: JS_CompileUCFunction(JSContext *cx, JSObject *obj, const char *name,
                   1382:                      uintN nargs, const char **argnames,
                   1383:                      const jschar *chars, size_t length,
                   1384:                      const char *filename, uintN lineno);
                   1385: 
                   1386: extern JS_PUBLIC_API(JSFunction *)
                   1387: JS_CompileUCFunctionForPrincipals(JSContext *cx, JSObject *obj,
                   1388:                                   JSPrincipals *principals, const char *name,
                   1389:                                   uintN nargs, const char **argnames,
                   1390:                                   const jschar *chars, size_t length,
                   1391:                                   const char *filename, uintN lineno);
                   1392: 
                   1393: extern JS_PUBLIC_API(JSString *)
                   1394: JS_DecompileScript(JSContext *cx, JSScript *script, const char *name,
                   1395:                    uintN indent);
                   1396: 
                   1397: /*
                   1398:  * API extension: OR this into indent to avoid pretty-printing the decompiled
                   1399:  * source resulting from JS_DecompileFunction{,Body}.
                   1400:  */
                   1401: #define JS_DONT_PRETTY_PRINT    ((uintN)0x8000)
                   1402: 
                   1403: extern JS_PUBLIC_API(JSString *)
                   1404: JS_DecompileFunction(JSContext *cx, JSFunction *fun, uintN indent);
                   1405: 
                   1406: extern JS_PUBLIC_API(JSString *)
                   1407: JS_DecompileFunctionBody(JSContext *cx, JSFunction *fun, uintN indent);
                   1408: 
                   1409: /*
                   1410:  * NB: JS_ExecuteScript, JS_ExecuteScriptPart, and the JS_Evaluate*Script*
                   1411:  * quadruplets all use the obj parameter as the initial scope chain header,
                   1412:  * the 'this' keyword value, and the variables object (ECMA parlance for where
                   1413:  * 'var' and 'function' bind names) of the execution context for script.
                   1414:  *
                   1415:  * Using obj as the variables object is problematic if obj's parent (which is
                   1416:  * the scope chain link; see JS_SetParent and JS_NewObject) is not null: in
                   1417:  * this case, variables created by 'var x = 0', e.g., go in obj, but variables
                   1418:  * created by assignment to an unbound id, 'x = 0', go in the last object on
                   1419:  * the scope chain linked by parent.
                   1420:  *
                   1421:  * ECMA calls that last scoping object the "global object", but note that many
                   1422:  * embeddings have several such objects.  ECMA requires that "global code" be
                   1423:  * executed with the variables object equal to this global object.  But these
                   1424:  * JS API entry points provide freedom to execute code against a "sub-global",
                   1425:  * i.e., a parented or scoped object, in which case the variables object will
                   1426:  * differ from the last object on the scope chain, resulting in confusing and
                   1427:  * non-ECMA explicit vs. implicit variable creation.
                   1428:  *
                   1429:  * Caveat embedders: unless you already depend on this buggy variables object
                   1430:  * binding behavior, you should call JS_SetOptions(cx, JSOPTION_VAROBJFIX) or
                   1431:  * JS_SetOptions(cx, JS_GetOptions(cx) | JSOPTION_VAROBJFIX) -- the latter if
                   1432:  * someone may have set other options on cx already -- for each context in the
                   1433:  * application, if you pass parented objects as the obj parameter, or may ever
                   1434:  * pass such objects in the future.
                   1435:  *
                   1436:  * Why a runtime option?  The alternative is to add six or so new API entry
                   1437:  * points with signatures matching the following six, and that doesn't seem
                   1438:  * worth the code bloat cost.  Such new entry points would probably have less
                   1439:  * obvious names, too, so would not tend to be used.  The JS_SetOption call,
                   1440:  * OTOH, can be more easily hacked into existing code that does not depend on
                   1441:  * the bug; such code can continue to use the familiar JS_EvaluateScript,
                   1442:  * etc., entry points.
                   1443:  */
                   1444: extern JS_PUBLIC_API(JSBool)
                   1445: JS_ExecuteScript(JSContext *cx, JSObject *obj, JSScript *script, jsval *rval);
                   1446: 
                   1447: /*
                   1448:  * Execute either the function-defining prolog of a script, or the script's
                   1449:  * main body, but not both.
                   1450:  */
                   1451: typedef enum JSExecPart { JSEXEC_PROLOG, JSEXEC_MAIN } JSExecPart;
                   1452: 
                   1453: extern JS_PUBLIC_API(JSBool)
                   1454: JS_ExecuteScriptPart(JSContext *cx, JSObject *obj, JSScript *script,
                   1455:                      JSExecPart part, jsval *rval);
                   1456: 
                   1457: extern JS_PUBLIC_API(JSBool)
                   1458: JS_EvaluateScript(JSContext *cx, JSObject *obj,
                   1459:                   const char *bytes, uintN length,
                   1460:                   const char *filename, uintN lineno,
                   1461:                   jsval *rval);
                   1462: 
                   1463: extern JS_PUBLIC_API(JSBool)
                   1464: JS_EvaluateScriptForPrincipals(JSContext *cx, JSObject *obj,
                   1465:                                JSPrincipals *principals,
                   1466:                                const char *bytes, uintN length,
                   1467:                                const char *filename, uintN lineno,
                   1468:                                jsval *rval);
                   1469: 
                   1470: extern JS_PUBLIC_API(JSBool)
                   1471: JS_EvaluateUCScript(JSContext *cx, JSObject *obj,
                   1472:                     const jschar *chars, uintN length,
                   1473:                     const char *filename, uintN lineno,
                   1474:                     jsval *rval);
                   1475: 
                   1476: extern JS_PUBLIC_API(JSBool)
                   1477: JS_EvaluateUCScriptForPrincipals(JSContext *cx, JSObject *obj,
                   1478:                                  JSPrincipals *principals,
                   1479:                                  const jschar *chars, uintN length,
                   1480:                                  const char *filename, uintN lineno,
                   1481:                                  jsval *rval);
                   1482: 
                   1483: extern JS_PUBLIC_API(JSBool)
                   1484: JS_CallFunction(JSContext *cx, JSObject *obj, JSFunction *fun, uintN argc,
                   1485:                 jsval *argv, jsval *rval);
                   1486: 
                   1487: extern JS_PUBLIC_API(JSBool)
                   1488: JS_CallFunctionName(JSContext *cx, JSObject *obj, const char *name, uintN argc,
                   1489:                     jsval *argv, jsval *rval);
                   1490: 
                   1491: extern JS_PUBLIC_API(JSBool)
                   1492: JS_CallFunctionValue(JSContext *cx, JSObject *obj, jsval fval, uintN argc,
                   1493:                      jsval *argv, jsval *rval);
                   1494: 
                   1495: extern JS_PUBLIC_API(JSBranchCallback)
                   1496: JS_SetBranchCallback(JSContext *cx, JSBranchCallback cb);
                   1497: 
                   1498: extern JS_PUBLIC_API(JSBool)
                   1499: JS_IsRunning(JSContext *cx);
                   1500: 
                   1501: extern JS_PUBLIC_API(JSBool)
                   1502: JS_IsConstructing(JSContext *cx);
                   1503: 
                   1504: /*
                   1505:  * Returns true if a script is executing and its current bytecode is a set
                   1506:  * (assignment) operation, even if there are native (no script) stack frames
                   1507:  * between the script and the caller to JS_IsAssigning.
                   1508:  */
                   1509: extern JS_FRIEND_API(JSBool)
                   1510: JS_IsAssigning(JSContext *cx);
                   1511: 
                   1512: /*
                   1513:  * Set the second return value, which should be a string or int jsval that
                   1514:  * identifies a property in the returned object, to form an ECMA reference
                   1515:  * type value (obj, id).  Only native methods can return reference types,
                   1516:  * and if the returned value is used on the left-hand side of an assignment
                   1517:  * op, the identified property will be set.  If the return value is in an
                   1518:  * r-value, the interpreter just gets obj[id]'s value.
                   1519:  */
                   1520: extern JS_PUBLIC_API(void)
                   1521: JS_SetCallReturnValue2(JSContext *cx, jsval v);
                   1522: 
                   1523: /************************************************************************/
                   1524: 
                   1525: /*
                   1526:  * Strings.
                   1527:  *
                   1528:  * NB: JS_NewString takes ownership of bytes on success, avoiding a copy; but
                   1529:  * on error (signified by null return), it leaves bytes owned by the caller.
                   1530:  * So the caller must free bytes in the error case, if it has no use for them.
                   1531:  * In contrast, all the JS_New*StringCopy* functions do not take ownership of
                   1532:  * the character memory passed to them -- they copy it.
                   1533:  */
                   1534: extern JS_PUBLIC_API(JSString *)
                   1535: JS_NewString(JSContext *cx, char *bytes, size_t length);
                   1536: 
                   1537: extern JS_PUBLIC_API(JSString *)
                   1538: JS_NewStringCopyN(JSContext *cx, const char *s, size_t n);
                   1539: 
                   1540: extern JS_PUBLIC_API(JSString *)
                   1541: JS_NewStringCopyZ(JSContext *cx, const char *s);
                   1542: 
                   1543: extern JS_PUBLIC_API(JSString *)
                   1544: JS_InternString(JSContext *cx, const char *s);
                   1545: 
                   1546: extern JS_PUBLIC_API(JSString *)
                   1547: JS_NewUCString(JSContext *cx, jschar *chars, size_t length);
                   1548: 
                   1549: extern JS_PUBLIC_API(JSString *)
                   1550: JS_NewUCStringCopyN(JSContext *cx, const jschar *s, size_t n);
                   1551: 
                   1552: extern JS_PUBLIC_API(JSString *)
                   1553: JS_NewUCStringCopyZ(JSContext *cx, const jschar *s);
                   1554: 
                   1555: extern JS_PUBLIC_API(JSString *)
                   1556: JS_InternUCStringN(JSContext *cx, const jschar *s, size_t length);
                   1557: 
                   1558: extern JS_PUBLIC_API(JSString *)
                   1559: JS_InternUCString(JSContext *cx, const jschar *s);
                   1560: 
                   1561: extern JS_PUBLIC_API(char *)
                   1562: JS_GetStringBytes(JSString *str);
                   1563: 
                   1564: extern JS_PUBLIC_API(jschar *)
                   1565: JS_GetStringChars(JSString *str);
                   1566: 
                   1567: extern JS_PUBLIC_API(size_t)
                   1568: JS_GetStringLength(JSString *str);
                   1569: 
                   1570: extern JS_PUBLIC_API(intN)
                   1571: JS_CompareStrings(JSString *str1, JSString *str2);
                   1572: 
                   1573: /*
                   1574:  * Mutable string support.  A string's characters are never mutable in this JS
                   1575:  * implementation, but a growable string has a buffer that can be reallocated,
                   1576:  * and a dependent string is a substring of another (growable, dependent, or
                   1577:  * immutable) string.  The direct data members of the (opaque to API clients)
                   1578:  * JSString struct may be changed in a single-threaded way for growable and
                   1579:  * dependent strings.
                   1580:  *
                   1581:  * Therefore mutable strings cannot be used by more than one thread at a time.
                   1582:  * You may call JS_MakeStringImmutable to convert the string from a mutable
                   1583:  * (growable or dependent) string to an immutable (and therefore thread-safe)
                   1584:  * string.  The engine takes care of converting growable and dependent strings
                   1585:  * to immutable for you if you store strings in multi-threaded objects using
                   1586:  * JS_SetProperty or kindred API entry points.
                   1587:  *
                   1588:  * If you store a JSString pointer in a native data structure that is (safely)
                   1589:  * accessible to multiple threads, you must call JS_MakeStringImmutable before
                   1590:  * retiring the store.
                   1591:  */
                   1592: extern JS_PUBLIC_API(JSString *)
                   1593: JS_NewGrowableString(JSContext *cx, jschar *chars, size_t length);
                   1594: 
                   1595: /*
                   1596:  * Create a dependent string, i.e., a string that owns no character storage,
                   1597:  * but that refers to a slice of another string's chars.  Dependent strings
                   1598:  * are mutable by definition, so the thread safety comments above apply.
                   1599:  */
                   1600: extern JS_PUBLIC_API(JSString *)
                   1601: JS_NewDependentString(JSContext *cx, JSString *str, size_t start,
                   1602:                       size_t length);
                   1603: 
                   1604: /*
                   1605:  * Concatenate two strings, resulting in a new growable string.  If you create
                   1606:  * the left string and pass it to JS_ConcatStrings on a single thread, try to
                   1607:  * use JS_NewGrowableString to create the left string -- doing so helps Concat
                   1608:  * avoid allocating a new buffer for the result and copying left's chars into
                   1609:  * the new buffer.  See above for thread safety comments.
                   1610:  */
                   1611: extern JS_PUBLIC_API(JSString *)
                   1612: JS_ConcatStrings(JSContext *cx, JSString *left, JSString *right);
                   1613: 
                   1614: /*
                   1615:  * Convert a dependent string into an independent one.  This function does not
                   1616:  * change the string's mutability, so the thread safety comments above apply.
                   1617:  */
                   1618: extern JS_PUBLIC_API(const jschar *)
                   1619: JS_UndependString(JSContext *cx, JSString *str);
                   1620: 
                   1621: /*
                   1622:  * Convert a mutable string (either growable or dependent) into an immutable,
                   1623:  * thread-safe one.
                   1624:  */
                   1625: extern JS_PUBLIC_API(JSBool)
                   1626: JS_MakeStringImmutable(JSContext *cx, JSString *str);
                   1627: 
                   1628: /************************************************************************/
                   1629: 
                   1630: /*
                   1631:  * Locale specific string conversion callback.
                   1632:  */
                   1633: struct JSLocaleCallbacks {
                   1634:     JSLocaleToUpperCase     localeToUpperCase;
                   1635:     JSLocaleToLowerCase     localeToLowerCase;
                   1636:     JSLocaleCompare         localeCompare;
                   1637:     JSLocaleToUnicode       localeToUnicode;
                   1638: };
                   1639: 
                   1640: /*
                   1641:  * Establish locale callbacks. The pointer must persist as long as the
                   1642:  * JSContext.  Passing NULL restores the default behaviour.
                   1643:  */
                   1644: extern JS_PUBLIC_API(void)
                   1645: JS_SetLocaleCallbacks(JSContext *cx, JSLocaleCallbacks *callbacks);
                   1646: 
                   1647: /*
                   1648:  * Return the address of the current locale callbacks struct, which may
                   1649:  * be NULL.
                   1650:  */
                   1651: extern JS_PUBLIC_API(JSLocaleCallbacks *)
                   1652: JS_GetLocaleCallbacks(JSContext *cx);
                   1653: 
                   1654: /************************************************************************/
                   1655: 
                   1656: /*
                   1657:  * Error reporting.
                   1658:  */
                   1659: 
                   1660: /*
                   1661:  * Report an exception represented by the sprintf-like conversion of format
                   1662:  * and its arguments.  This exception message string is passed to a pre-set
                   1663:  * JSErrorReporter function (set by JS_SetErrorReporter; see jspubtd.h for
                   1664:  * the JSErrorReporter typedef).
                   1665:  */
                   1666: extern JS_PUBLIC_API(void)
                   1667: JS_ReportError(JSContext *cx, const char *format, ...);
                   1668: 
                   1669: /*
                   1670:  * Use an errorNumber to retrieve the format string, args are char *
                   1671:  */
                   1672: extern JS_PUBLIC_API(void)
                   1673: JS_ReportErrorNumber(JSContext *cx, JSErrorCallback errorCallback,
                   1674:                      void *userRef, const uintN errorNumber, ...);
                   1675: 
                   1676: /*
                   1677:  * Use an errorNumber to retrieve the format string, args are jschar *
                   1678:  */
                   1679: extern JS_PUBLIC_API(void)
                   1680: JS_ReportErrorNumberUC(JSContext *cx, JSErrorCallback errorCallback,
                   1681:                      void *userRef, const uintN errorNumber, ...);
                   1682: 
                   1683: /*
                   1684:  * As above, but report a warning instead (JSREPORT_IS_WARNING(report.flags)).
                   1685:  * Return true if there was no error trying to issue the warning, and if the
                   1686:  * warning was not converted into an error due to the JSOPTION_WERROR option
                   1687:  * being set, false otherwise.
                   1688:  */
                   1689: extern JS_PUBLIC_API(JSBool)
                   1690: JS_ReportWarning(JSContext *cx, const char *format, ...);
                   1691: 
                   1692: extern JS_PUBLIC_API(JSBool)
                   1693: JS_ReportErrorFlagsAndNumber(JSContext *cx, uintN flags,
                   1694:                              JSErrorCallback errorCallback, void *userRef,
                   1695:                              const uintN errorNumber, ...);
                   1696: 
                   1697: extern JS_PUBLIC_API(JSBool)
                   1698: JS_ReportErrorFlagsAndNumberUC(JSContext *cx, uintN flags,
                   1699:                                JSErrorCallback errorCallback, void *userRef,
                   1700:                                const uintN errorNumber, ...);
                   1701: 
                   1702: /*
                   1703:  * Complain when out of memory.
                   1704:  */
                   1705: extern JS_PUBLIC_API(void)
                   1706: JS_ReportOutOfMemory(JSContext *cx);
                   1707: 
                   1708: struct JSErrorReport {
                   1709:     const char      *filename;      /* source file name, URL, etc., or null */
                   1710:     uintN           lineno;         /* source line number */
                   1711:     const char      *linebuf;       /* offending source line without final \n */
                   1712:     const char      *tokenptr;      /* pointer to error token in linebuf */
                   1713:     const jschar    *uclinebuf;     /* unicode (original) line buffer */
                   1714:     const jschar    *uctokenptr;    /* unicode (original) token pointer */
                   1715:     uintN           flags;          /* error/warning, etc. */
                   1716:     uintN           errorNumber;    /* the error number, e.g. see js.msg */
                   1717:     const jschar    *ucmessage;     /* the (default) error message */
                   1718:     const jschar    **messageArgs;  /* arguments for the error message */
                   1719: };
                   1720: 
                   1721: /*
                   1722:  * JSErrorReport flag values.  These may be freely composed.
                   1723:  */
                   1724: #define JSREPORT_ERROR      0x0     /* pseudo-flag for default case */
                   1725: #define JSREPORT_WARNING    0x1     /* reported via JS_ReportWarning */
                   1726: #define JSREPORT_EXCEPTION  0x2     /* exception was thrown */
                   1727: #define JSREPORT_STRICT     0x4     /* error or warning due to strict option */
                   1728: 
                   1729: /*
                   1730:  * If JSREPORT_EXCEPTION is set, then a JavaScript-catchable exception
                   1731:  * has been thrown for this runtime error, and the host should ignore it.
                   1732:  * Exception-aware hosts should also check for JS_IsExceptionPending if
                   1733:  * JS_ExecuteScript returns failure, and signal or propagate the exception, as
                   1734:  * appropriate.
                   1735:  */
                   1736: #define JSREPORT_IS_WARNING(flags)      (((flags) & JSREPORT_WARNING) != 0)
                   1737: #define JSREPORT_IS_EXCEPTION(flags)    (((flags) & JSREPORT_EXCEPTION) != 0)
                   1738: #define JSREPORT_IS_STRICT(flags)       (((flags) & JSREPORT_STRICT) != 0)
                   1739: 
                   1740: extern JS_PUBLIC_API(JSErrorReporter)
                   1741: JS_SetErrorReporter(JSContext *cx, JSErrorReporter er);
                   1742: 
                   1743: /************************************************************************/
                   1744: 
                   1745: /*
                   1746:  * Regular Expressions.
                   1747:  */
                   1748: #define JSREG_FOLD      0x01    /* fold uppercase to lowercase */
                   1749: #define JSREG_GLOB      0x02    /* global exec, creates array of matches */
                   1750: #define JSREG_MULTILINE 0x04    /* treat ^ and $ as begin and end of line */
                   1751: 
                   1752: extern JS_PUBLIC_API(JSObject *)
                   1753: JS_NewRegExpObject(JSContext *cx, char *bytes, size_t length, uintN flags);
                   1754: 
                   1755: extern JS_PUBLIC_API(JSObject *)
                   1756: JS_NewUCRegExpObject(JSContext *cx, jschar *chars, size_t length, uintN flags);
                   1757: 
                   1758: extern JS_PUBLIC_API(void)
                   1759: JS_SetRegExpInput(JSContext *cx, JSString *input, JSBool multiline);
                   1760: 
                   1761: extern JS_PUBLIC_API(void)
                   1762: JS_ClearRegExpStatics(JSContext *cx);
                   1763: 
                   1764: extern JS_PUBLIC_API(void)
                   1765: JS_ClearRegExpRoots(JSContext *cx);
                   1766: 
                   1767: /* TODO: compile, exec, get/set other statics... */
                   1768: 
                   1769: /************************************************************************/
                   1770: 
                   1771: extern JS_PUBLIC_API(JSBool)
                   1772: JS_IsExceptionPending(JSContext *cx);
                   1773: 
                   1774: extern JS_PUBLIC_API(JSBool)
                   1775: JS_GetPendingException(JSContext *cx, jsval *vp);
                   1776: 
                   1777: extern JS_PUBLIC_API(void)
                   1778: JS_SetPendingException(JSContext *cx, jsval v);
                   1779: 
                   1780: extern JS_PUBLIC_API(void)
                   1781: JS_ClearPendingException(JSContext *cx);
                   1782: 
                   1783: extern JS_PUBLIC_API(JSBool)
                   1784: JS_ReportPendingException(JSContext *cx);
                   1785: 
                   1786: /*
                   1787:  * Save the current exception state.  This takes a snapshot of cx's current
                   1788:  * exception state without making any change to that state.
                   1789:  *
                   1790:  * The returned state pointer MUST be passed later to JS_RestoreExceptionState
                   1791:  * (to restore that saved state, overriding any more recent state) or else to
                   1792:  * JS_DropExceptionState (to free the state struct in case it is not correct
                   1793:  * or desirable to restore it).  Both Restore and Drop free the state struct,
                   1794:  * so callers must stop using the pointer returned from Save after calling the
                   1795:  * Release or Drop API.
                   1796:  */
                   1797: extern JS_PUBLIC_API(JSExceptionState *)
                   1798: JS_SaveExceptionState(JSContext *cx);
                   1799: 
                   1800: extern JS_PUBLIC_API(void)
                   1801: JS_RestoreExceptionState(JSContext *cx, JSExceptionState *state);
                   1802: 
                   1803: extern JS_PUBLIC_API(void)
                   1804: JS_DropExceptionState(JSContext *cx, JSExceptionState *state);
                   1805: 
                   1806: /*
                   1807:  * If the given value is an exception object that originated from an error,
                   1808:  * the exception will contain an error report struct, and this API will return
                   1809:  * the address of that struct.  Otherwise, it returns NULL.  The lifetime of
                   1810:  * the error report struct that might be returned is the same as the lifetime
                   1811:  * of the exception object.
                   1812:  */
                   1813: extern JS_PUBLIC_API(JSErrorReport *)
                   1814: JS_ErrorFromException(JSContext *cx, jsval v);
                   1815: 
                   1816: #ifdef JS_THREADSAFE
                   1817: 
                   1818: /*
                   1819:  * Associate the current thread with the given context.  This is done
                   1820:  * implicitly by JS_NewContext.
                   1821:  *
                   1822:  * Returns the old thread id for this context, which should be treated as
                   1823:  * an opaque value.  This value is provided for comparison to 0, which
                   1824:  * indicates that ClearContextThread has been called on this context
                   1825:  * since the last SetContextThread, or non-0, which indicates the opposite.
                   1826:  */
                   1827: extern JS_PUBLIC_API(jsword)
                   1828: JS_GetContextThread(JSContext *cx);
                   1829: 
                   1830: extern JS_PUBLIC_API(jsword)
                   1831: JS_SetContextThread(JSContext *cx);
                   1832: 
                   1833: extern JS_PUBLIC_API(jsword)
                   1834: JS_ClearContextThread(JSContext *cx);
                   1835: 
                   1836: #endif /* JS_THREADSAFE */
                   1837: 
                   1838: /************************************************************************/
                   1839: 
                   1840: JS_END_EXTERN_C
                   1841: 
                   1842: #endif /* jsapi_h___ */

unix.superglobalmegacorp.com

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