📄 jsapi.h
字号:
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the * terms of the GNU Public License (the "GPL"), in which case the * provisions of the GPL are applicable instead of those above. * If you wish to allow use of your version of this file only * under the terms of the GPL and not to allow others to use your * version of this file under the NPL, indicate your decision by * deleting the provisions above and replace them with the notice * and other provisions required by the GPL. If you do not delete * the provisions above, a recipient may use your version of this * file under either the NPL or the GPL. */#ifndef jsapi_h___#define jsapi_h___/* * JavaScript API. */#include <stddef.h>#include <stdio.h>#include "jspubtd.h"JS_BEGIN_EXTERN_C/* * Type tags stored in the low bits of a jsval. */#define JSVAL_OBJECT 0x0 /* untagged reference to object */#define JSVAL_INT 0x1 /* tagged 31-bit integer value */#define JSVAL_DOUBLE 0x2 /* tagged reference to double */#define JSVAL_STRING 0x4 /* tagged reference to string */#define JSVAL_BOOLEAN 0x6 /* tagged boolean value *//* Type tag bitfield length and derived macros. */#define JSVAL_TAGBITS 3#define JSVAL_TAGMASK JS_BITMASK(JSVAL_TAGBITS)#define JSVAL_TAG(v) ((v) & JSVAL_TAGMASK)#define JSVAL_SETTAG(v,t) ((v) | (t))#define JSVAL_CLRTAG(v) ((v) & ~(jsval)JSVAL_TAGMASK)#define JSVAL_ALIGN JS_BIT(JSVAL_TAGBITS)/* Predicates for type testing. */#define JSVAL_IS_OBJECT(v) (JSVAL_TAG(v) == JSVAL_OBJECT)#define JSVAL_IS_NUMBER(v) (JSVAL_IS_INT(v) || JSVAL_IS_DOUBLE(v))#define JSVAL_IS_INT(v) (((v) & JSVAL_INT) && (v) != JSVAL_VOID)#define JSVAL_IS_DOUBLE(v) (JSVAL_TAG(v) == JSVAL_DOUBLE)#define JSVAL_IS_STRING(v) (JSVAL_TAG(v) == JSVAL_STRING)#define JSVAL_IS_BOOLEAN(v) (JSVAL_TAG(v) == JSVAL_BOOLEAN)#define JSVAL_IS_NULL(v) ((v) == JSVAL_NULL)#define JSVAL_IS_VOID(v) ((v) == JSVAL_VOID)#define JSVAL_IS_PRIMITIVE(v) (!JSVAL_IS_OBJECT(v) || JSVAL_IS_NULL(v))/* Objects, strings, and doubles are GC'ed. */#define JSVAL_IS_GCTHING(v) (!((v) & JSVAL_INT) && !JSVAL_IS_BOOLEAN(v))#define JSVAL_TO_GCTHING(v) ((void *)JSVAL_CLRTAG(v))#define JSVAL_TO_OBJECT(v) ((JSObject *)JSVAL_TO_GCTHING(v))#define JSVAL_TO_DOUBLE(v) ((jsdouble *)JSVAL_TO_GCTHING(v))#define JSVAL_TO_STRING(v) ((JSString *)JSVAL_TO_GCTHING(v))#define OBJECT_TO_JSVAL(obj) ((jsval)(obj))#define DOUBLE_TO_JSVAL(dp) JSVAL_SETTAG((jsval)(dp), JSVAL_DOUBLE)#define STRING_TO_JSVAL(str) JSVAL_SETTAG((jsval)(str), JSVAL_STRING)/* Lock and unlock the GC thing held by a jsval. */#define JSVAL_LOCK(cx,v) (JSVAL_IS_GCTHING(v) \ ? JS_LockGCThing(cx, JSVAL_TO_GCTHING(v)) \ : JS_TRUE)#define JSVAL_UNLOCK(cx,v) (JSVAL_IS_GCTHING(v) \ ? JS_UnlockGCThing(cx, JSVAL_TO_GCTHING(v)) \ : JS_TRUE)/* Domain limits for the jsval int type. */#define JSVAL_INT_BITS 31#define JSVAL_INT_POW2(n) ((jsval)1 << (n))#define JSVAL_INT_MIN ((jsval)1 - JSVAL_INT_POW2(30))#define JSVAL_INT_MAX (JSVAL_INT_POW2(30) - 1)#define INT_FITS_IN_JSVAL(i) ((jsuint)((i)+JSVAL_INT_MAX) <= 2*JSVAL_INT_MAX)#define JSVAL_TO_INT(v) ((jsint)(v) >> 1)#define INT_TO_JSVAL(i) (((jsval)(i) << 1) | JSVAL_INT)/* Convert between boolean and jsval. */#define JSVAL_TO_BOOLEAN(v) ((JSBool)((v) >> JSVAL_TAGBITS))#define BOOLEAN_TO_JSVAL(b) JSVAL_SETTAG((jsval)(b) << JSVAL_TAGBITS, \ JSVAL_BOOLEAN)/* A private data pointer (2-byte-aligned) can be stored as an int jsval. */#define JSVAL_TO_PRIVATE(v) ((void *)((v) & ~JSVAL_INT))#define PRIVATE_TO_JSVAL(p) ((jsval)(p) | JSVAL_INT)/* Property attributes, set in JSPropertySpec and passed to API functions. */#define JSPROP_ENUMERATE 0x01 /* property is visible to for/in loop */#define JSPROP_READONLY 0x02 /* not settable: assignment is no-op */#define JSPROP_PERMANENT 0x04 /* property cannot be deleted */#define JSPROP_EXPORTED 0x08 /* property is exported from object */#define JSPROP_GETTER 0x10 /* property holds getter function */#define JSPROP_SETTER 0x20 /* property holds setter function */#define JSPROP_SHARED 0x40 /* don't allocate a value slot for this property; don't copy the property on set of the same-named property in an object that delegates to a prototype containing this property */#define JSPROP_INDEX 0x80 /* name is actually (jsint) index *//* Function flags, set in JSFunctionSpec and passed to JS_NewFunction etc. */#define JSFUN_LAMBDA 0x08 /* expressed, not declared, function */#define JSFUN_GETTER JSPROP_GETTER#define JSFUN_SETTER JSPROP_SETTER#define JSFUN_BOUND_METHOD 0x40 /* bind this to fun->object's parent */#define JSFUN_HEAVYWEIGHT 0x80 /* activation requires a Call object */#define JSFUN_FLAGS_MASK 0xf8 /* overlay JSFUN_* attributes *//* * Well-known JS values. The extern'd variables are initialized when the * first JSContext is created by JS_NewContext (see below). */#define JSVAL_VOID INT_TO_JSVAL(0 - JSVAL_INT_POW2(30))#define JSVAL_NULL OBJECT_TO_JSVAL(0)#define JSVAL_ZERO INT_TO_JSVAL(0)#define JSVAL_ONE INT_TO_JSVAL(1)#define JSVAL_FALSE BOOLEAN_TO_JSVAL(JS_FALSE)#define JSVAL_TRUE BOOLEAN_TO_JSVAL(JS_TRUE)/* Don't want to export data, so provide accessors for non-inline jsvals. */extern JS_PUBLIC_API(jsval)JS_GetNaNValue(JSContext *cx);extern JS_PUBLIC_API(jsval)JS_GetNegativeInfinityValue(JSContext *cx);extern JS_PUBLIC_API(jsval)JS_GetPositiveInfinityValue(JSContext *cx);extern JS_PUBLIC_API(jsval)JS_GetEmptyStringValue(JSContext *cx);/* * Format is a string of the following characters (spaces are insignificant), * specifying the tabulated type conversions: * * b JSBool Boolean * c uint16/jschar ECMA uint16, Unicode char * i int32 ECMA int32 * u uint32 ECMA uint32 * j int32 Rounded int32 (coordinate) * d jsdouble IEEE double * I jsdouble Integral IEEE double * s char * C string * S JSString * Unicode string, accessed by a JSString pointer * W jschar * Unicode character vector, 0-terminated (W for wide) * o JSObject * Object reference * f JSFunction * Function private * v jsval Argument value (no conversion) * * N/A Skip this argument (no vararg) * / N/A End of required arguments * * The variable argument list after format must consist of &b, &c, &s, e.g., * where those variables have the types given above. For the pointer types * char *, JSString *, and JSObject *, the pointed-at memory returned belongs * to the JS runtime, not to the calling native code. The runtime promises * to keep this memory valid so long as argv refers to allocated stack space * (so long as the native function is active). * * Fewer arguments than format specifies may be passed only if there is a / * in format after the last required argument specifier and argc is at least * the number of required arguments. More arguments than format specifies * may be passed without error; it is up to the caller to deal with trailing * unconverted arguments. */extern JS_PUBLIC_API(JSBool)JS_ConvertArguments(JSContext *cx, uintN argc, jsval *argv, const char *format, ...);#ifdef va_startextern JS_PUBLIC_API(JSBool)JS_ConvertArgumentsVA(JSContext *cx, uintN argc, jsval *argv, const char *format, va_list ap);#endif/* * Inverse of JS_ConvertArguments: scan format and convert trailing arguments * into jsvals, GC-rooted if necessary by the JS stack. Return null on error, * and a pointer to the new argument vector on success. Also return a stack * mark on success via *markp, in which case the caller must eventually clean * up by calling JS_PopArguments. * * Note that the number of actual arguments supplied is specified exclusively * by format, so there is no argc parameter. */extern JS_PUBLIC_API(jsval *)JS_PushArguments(JSContext *cx, void **markp, const char *format, ...);#ifdef va_startextern JS_PUBLIC_API(jsval *)JS_PushArgumentsVA(JSContext *cx, void **markp, const char *format, va_list ap);#endifextern JS_PUBLIC_API(void)JS_PopArguments(JSContext *cx, void *mark);#ifdef JS_ARGUMENT_FORMATTER_DEFINED/* * Add and remove a format string handler for JS_{Convert,Push}Arguments{,VA}. * The handler function has this signature (see jspubtd.h): * * JSBool MyArgumentFormatter(JSContext *cx, const char *format, * JSBool fromJS, jsval **vpp, va_list *app); * * It should return true on success, and return false after reporting an error * or detecting an already-reported error. * * For a given format string, for example "AA", the formatter is called from * JS_ConvertArgumentsVA like so: * * formatter(cx, "AA...", JS_TRUE, &sp, &ap); * * sp points into the arguments array on the JS stack, while ap points into * the stdarg.h va_list on the C stack. The JS_TRUE passed for fromJS tells * the formatter to convert zero or more jsvals at sp to zero or more C values * accessed via pointers-to-values at ap, updating both sp (via *vpp) and ap * (via *app) to point past the converted arguments and their result pointers * on the C stack. * * When called from JS_PushArgumentsVA, the formatter is invoked thus: * * formatter(cx, "AA...", JS_FALSE, &sp, &ap); * * where JS_FALSE for fromJS means to wrap the C values at ap according to the * format specifier and store them at sp, updating ap and sp appropriately. * * The "..." after "AA" is the rest of the format string that was passed into * JS_{Convert,Push}Arguments{,VA}. The actual format trailing substring used * in each Convert or PushArguments call is passed to the formatter, so that * one such function may implement several formats, in order to share code. * * Remove just forgets about any handler associated with format. Add does not * copy format, it points at the string storage allocated by the caller, which * is typically a string constant. If format is in dynamic storage, it is up * to the caller to keep the string alive until Remove is called. */extern JS_PUBLIC_API(JSBool)JS_AddArgumentFormatter(JSContext *cx, const char *format, JSArgumentFormatter formatter);extern JS_PUBLIC_API(void)JS_RemoveArgumentFormatter(JSContext *cx, const char *format);#endif /* JS_ARGUMENT_FORMATTER_DEFINED */extern JS_PUBLIC_API(JSBool)JS_ConvertValue(JSContext *cx, jsval v, JSType type, jsval *vp);extern JS_PUBLIC_API(JSBool)JS_ValueToObject(JSContext *cx, jsval v, JSObject **objp);extern JS_PUBLIC_API(JSFunction *)JS_ValueToFunction(JSContext *cx, jsval v);extern JS_PUBLIC_API(JSFunction *)JS_ValueToConstructor(JSContext *cx, jsval v);extern JS_PUBLIC_API(JSString *)JS_ValueToString(JSContext *cx, jsval v);extern JS_PUBLIC_API(JSBool)JS_ValueToNumber(JSContext *cx, jsval v, jsdouble *dp);/* * Convert a value to a number, then to an int32, according to the ECMA rules * for ToInt32. */extern JS_PUBLIC_API(JSBool)JS_ValueToECMAInt32(JSContext *cx, jsval v, int32 *ip);/* * Convert a value to a number, then to a uint32, according to the ECMA rules * for ToUint32. */extern JS_PUBLIC_API(JSBool)JS_ValueToECMAUint32(JSContext *cx, jsval v, uint32 *ip);/* * Convert a value to a number, then to an int32 if it fits by rounding to * nearest; but failing with an error report if the double is out of range * or unordered. */extern JS_PUBLIC_API(JSBool)JS_ValueToInt32(JSContext *cx, jsval v, int32 *ip);/* * ECMA ToUint16, for mapping a jsval to a Unicode point. */extern JS_PUBLIC_API(JSBool)JS_ValueToUint16(JSContext *cx, jsval v, uint16 *ip);extern JS_PUBLIC_API(JSBool)JS_ValueToBoolean(JSContext *cx, jsval v, JSBool *bp);extern JS_PUBLIC_API(JSType)JS_TypeOfValue(JSContext *cx, jsval v);extern JS_PUBLIC_API(const char *)JS_GetTypeName(JSContext *cx, JSType type);/************************************************************************//* * Initialization, locking, contexts, and memory allocation. */#define JS_NewRuntime JS_Init
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -