Browse Source

public api header

pull/1/head
Sami Vaarala 12 years ago
parent
commit
f74691d95f
  1. 538
      src/duk_api.h

538
src/duk_api.h

@ -0,0 +1,538 @@
/*
* Duktape public API.
*
* Stack indexes are relative to the current frame (call stack entry).
* API calls can only access the current frame (between bottom and top
* of current frame).
*
* +-------+----+----+----+----+
* | . . . | 0 | 1 | 2 | 3 | top = 4
* | | -4 | -3 | -2 | -1 |
* +-------+----+----+----+----+
* : :
* bottom -'
* of frame
*
* DUK_INVALID_INDEX (defined as the minimum integer) represents an
* invalid index / no index in calls where that is appropriate. If
* used elsewhere, it never maps to a valid stack entry.
*
* Any API definition may potentially be a macro, so callers should
* never assume otherwise, e.g. by using API calls as function pointers.
*/
#ifndef __DUK_API_H
#define __DUK_API_H 1
#include <limits.h> /* MIN_INT */
#include <stdarg.h> /* va_list etc */
/*
* Typedefs; avoid all dependencies on internal types
*
* (duk_context *) currently maps directly to (duk_hthread *).
*/
struct duk_memory_functions;
typedef void duk_context;
typedef struct duk_memory_functions duk_memory_functions;
typedef int (*duk_c_function)(duk_context *ctx);
typedef void *(*duk_alloc_function) (void *udata, size_t size);
typedef void *(*duk_realloc_function) (void *udata, void *ptr, size_t size);
typedef void (*duk_free_function) (void *udata, void *ptr);
typedef void (*duk_fatal_function) (duk_context *ctx, int code);
typedef void (*duk_decode_char_function) (void *udata, int codepoint);
typedef int (*duk_map_char_function) (void *udata, int codepoint);
typedef int (*duk_safe_call_function) (duk_context *ctx);
struct duk_memory_functions {
duk_alloc_function alloc;
duk_realloc_function realloc;
duk_free_function free;
void *udata;
};
/*
* Constants
*/
/* Used to represent invalid index; if caller uses this without checking,
* this index will almost certainly map to a non-existent stack entry.
*/
#define DUK_INVALID_INDEX INT_MIN
/* Indicates that a native function does not have a fixed number of args,
* and the argument stack should not be capped/extended at all.
*/
#define DUK_VARARGS (-1)
/* Value types, used by e.g. duk_get_type() */
#define DUK_TYPE_NONE 0 /* no value, e.g. invalid index */
#define DUK_TYPE_UNDEFINED 1 /* Ecmascript undefined */
#define DUK_TYPE_NULL 2 /* Ecmascript null */
#define DUK_TYPE_BOOLEAN 3 /* Ecmascript boolean: 0 or 1 */
#define DUK_TYPE_NUMBER 4 /* Ecmascript number: double */
#define DUK_TYPE_STRING 5 /* Ecmascript string: CESU-8 / extended UTF-8 encoded */
#define DUK_TYPE_OBJECT 6 /* Ecmascript object: includes objects, arrays, functions, threads */
#define DUK_TYPE_BUFFER 7 /* fixed or growable, garbage collected byte buffer */
#define DUK_TYPE_POINTER 8 /* raw void pointer */
/* Value mask types, used by e.g. duk_get_type_mask() */
#define DUK_TYPE_MASK_NONE (1 << DUK_TYPE_NONE)
#define DUK_TYPE_MASK_UNDEFINED (1 << DUK_TYPE_UNDEFINED)
#define DUK_TYPE_MASK_NULL (1 << DUK_TYPE_NULL)
#define DUK_TYPE_MASK_BOOLEAN (1 << DUK_TYPE_BOOLEAN)
#define DUK_TYPE_MASK_NUMBER (1 << DUK_TYPE_NUMBER)
#define DUK_TYPE_MASK_STRING (1 << DUK_TYPE_STRING)
#define DUK_TYPE_MASK_OBJECT (1 << DUK_TYPE_OBJECT)
#define DUK_TYPE_MASK_BUFFER (1 << DUK_TYPE_BUFFER)
#define DUK_TYPE_MASK_POINTER (1 << DUK_TYPE_POINTER)
/* FIXME: these are now used by duk_get_multiple() and duk_push_multiple(),
* but the type chararacters are not very logical and don't cover all the
* current types.
*/
#define DUK_TYPECHAR_UNDEFINED 'u'
#define DUK_TYPECHAR_NULL 'n'
#define DUK_TYPECHAR_BOOLEAN 'b'
#define DUK_TYPECHAR_NUMBER 'd'
#define DUK_TYPECHAR_INTEGER 'i'
#define DUK_TYPECHAR_STRING 's'
#define DUK_TYPECHAR_LSTRING 'l'
#define DUK_TYPECHAR_POINTER 'p'
#define DUK_TYPECHAR_SKIP '-'
/* Coercion hints */
#define DUK_HINT_NONE 0 /* prefer number, unless coercion input is a Date, in which case prefer string (E5 Section 8.12.8) */
#define DUK_HINT_STRING 1 /* prefer string */
#define DUK_HINT_NUMBER 2 /* prefer number */
/* Enumeration flags for duk_enum() */
#define DUK_ENUM_INCLUDE_NONENUMERABLE (1 << 0) /* enumerate non-numerable properties in addition to enumerable */
#define DUK_ENUM_INCLUDE_INTERNAL (1 << 1) /* enumerate internal properties (regardless of enumerability) */
#define DUK_ENUM_OWN_PROPERTIES_ONLY (1 << 2) /* don't walk prototype chain, only check own properties */
/* Internal error codes */
#define DUK_ERR_UNIMPLEMENTED_ERROR 1000 /* UnimplementedError */
#define DUK_ERR_UNSUPPORTED_ERROR 1001 /* UnsupportedError */
#define DUK_ERR_INTERNAL_ERROR 1002 /* InternalError */
#define DUK_ERR_ALLOC_ERROR 1003 /* AllocError */
#define DUK_ERR_ASSERTION_ERROR 1004 /* AssertionError */
#define DUK_ERR_API_ERROR 1005 /* APIError */
#define DUK_ERR_UNCAUGHT_ERROR 1006 /* UncaughtError */
/* Ecmascript E5 specification error codes */
#define DUK_ERR_ERROR 2000 /* Error */
#define DUK_ERR_EVAL_ERROR 2001 /* EvalError */
#define DUK_ERR_RANGE_ERROR 2002 /* RangeError */
#define DUK_ERR_REFERENCE_ERROR 2003 /* ReferenceError */
#define DUK_ERR_SYNTAX_ERROR 2004 /* SyntaxError */
#define DUK_ERR_TYPE_ERROR 2005 /* TypeError */
#define DUK_ERR_URI_ERROR 2006 /* URIError */
/* Return codes for C functions */
#define DUK_RET_UNIMPLEMENTED_ERROR (-DUK_ERR_UNIMPLEMENTED_ERROR)
#define DUK_RET_UNSUPPORTED_ERROR (-DUK_ERR_UNSUPPORTED_ERROR)
#define DUK_RET_INTERNAL_ERROR (-DUK_ERR_INTERNAL_ERROR)
#define DUK_RET_ALLOC_ERROR (-DUK_ERR_ALLOC_ERROR)
#define DUK_RET_ASSERTION_ERROR (-DUK_ERR_ASSERTION_ERROR)
#define DUK_RET_API_ERROR (-DUK_ERR_API_ERROR)
#define DUK_RET_UNCAUGHT_ERROR (-DUK_ERR_UNCAUGHT_ERROR)
#define DUK_RET_ERROR (-DUK_ERR_ERROR)
#define DUK_RET_EVAL_ERROR (-DUK_ERR_EVAL_ERROR)
#define DUK_RET_RANGE_ERROR (-DUK_ERR_RANGE_ERROR)
#define DUK_RET_REFERENCE_ERROR (-DUK_ERR_REFERENCE_ERROR)
#define DUK_RET_SYNTAX_ERROR (-DUK_ERR_SYNTAX_ERROR)
#define DUK_RET_TYPE_ERROR (-DUK_ERR_TYPE_ERROR)
#define DUK_RET_URI_ERROR (-DUK_ERR_URI_ERROR)
/*
* Memory management
*
* Raw functions have no side effects (cannot trigger GC).
*/
void *duk_alloc_raw(duk_context *ctx, size_t size);
void duk_free_raw(duk_context *ctx, void *ptr);
void *duk_realloc_raw(duk_context *ctx, void *ptr, size_t size);
void *duk_alloc(duk_context *ctx, size_t size);
void duk_free(duk_context *ctx, void *ptr);
void *duk_realloc(duk_context *ctx, void *ptr, size_t size);
void duk_get_memory_functions(duk_context *ctx, duk_memory_functions *out_funcs);
/*
* Error handling
*/
void duk_throw(duk_context *ctx); /* throw value on top of stack */
void duk_error(duk_context *ctx, int err_code, const char *fmt, ...); /* push error with msg and throw it */
void duk_fatal(duk_context *ctx, int err_code); /* call fatal error handler */
/*
* Other state related functions
*/
int duk_is_strict_call(duk_context *ctx); /* current activation is strict */
int duk_is_constructor_call(duk_context *ctx); /* current activation is a constructor call ('new Foo()') */
/*
* Stack management
*/
int duk_normalize_index(duk_context *ctx, int index); /* normalize index relative to bottom of current frame; return DUK_INVALID_INDEX (<0) if invalid index */
int duk_require_normalize_index(duk_context *ctx, int index); /* normalize index, raise error if invalid */
int duk_is_valid_index(duk_context *ctx, int index); /* validate index, return non-zero if valid, zero if invalid */
void duk_require_valid_index(duk_context *ctx, int index); /* validate index, raise error if invalid */
int duk_get_top(duk_context *ctx); /* get stack top (>= 0) */
void duk_set_top(duk_context *ctx, int index); /* set stack top (negative values are normalized); pad with undefined or chop */
int duk_require_top_index(duk_context *ctx); /* same as duk_get_top_index() but throw error if
* index is invalid.
*/
int duk_check_stack(duk_context *ctx, unsigned int extra); /* check that stack has at least 'extra' free items,
* growing (but not shrinking) if necessary (internal
* extra is automatically added, so 'extra' should
* reflect caller's need for stack space).
* return zero on error, non-zero on success
*/
void duk_require_stack(duk_context *ctx, unsigned int extra); /* same as duk_check_stack(), but raise error if
* fails to grow.
*/
int duk_check_stack_top(duk_context *ctx, unsigned int top); /* like duk_check_stack(), but ensures there is space in
* the valstack up to 'top', plus internal extra.
*/
void duk_require_stack_top(duk_context *ctx, unsigned int top); /* like duk_check_stack_top(), but raise error if
* fails to grow.
*/
/*
* Stack manipulation (other than push/pop)
*/
void duk_swap(duk_context *ctx, int index1, int index2); /* swap value at two indices */
void duk_swap_top(duk_context *ctx, int index); /* swap top and value at index */
void duk_dup(duk_context *ctx, int from_index); /* push a duplicate of value at index onto stack */
void duk_dup_top(duk_context *ctx); /* push a duplicate of top onto stack */
void duk_insert(duk_context *ctx, int to_index); /* insert element at top to specified index (and pop top) */
void duk_replace(duk_context *ctx, int to_index); /* replace value at index with top (and pop top) */
void duk_remove(duk_context *ctx, int index); /* remove element at index (and shift) */
void duk_xmove(duk_context *from_ctx, duk_context *to_ctx, unsigned int count); /* move 'count' value between tops of two contexts of the same heap */
/* XXX: slice operations */
/*
* Push operations
*
* Push functions return the absolute (relative to bottom of frame)
* position of the pushed value for convenience.
*
* Note: duk_dup() is technically a push.
*/
void duk_push_undefined(duk_context *ctx);
void duk_push_null(duk_context *ctx);
void duk_push_boolean(duk_context *ctx, int val);
void duk_push_true(duk_context *ctx);
void duk_push_false(duk_context *ctx);
void duk_push_number(duk_context *ctx, double val);
void duk_push_int(duk_context *ctx, int val);
const char *duk_push_string(duk_context *ctx, const char *str); /* may fail; returns interned string ptr */
const char *duk_push_lstring(duk_context *ctx, const char *str, size_t len); /* may fail; returns interned string ptr */
void duk_push_pointer(duk_context *ctx, void *p);
const char *duk_push_sprintf(duk_context *ctx, const char *fmt, ...); /* may fail */
const char *duk_push_vsprintf(duk_context *ctx, const char *fmt, va_list ap); /* may fail */
void duk_push_multiple(duk_context *ctx, const char *types, ...); /* push multiple values, see duk_get_multiple */
void duk_push_this(duk_context *ctx); /* push the current 'this' binding */
void duk_push_current_function(duk_context *ctx); /* push the currently running (C) function */
void duk_push_current_thread(duk_context *ctx); /* push the currently running thread */
void duk_push_global_object(duk_context *ctx); /* push the global object */
int duk_push_new_object(duk_context *ctx); /* returns positive index of pushed object (may fail) */
int duk_push_new_array(duk_context *ctx); /* returns positive index of pushed array (may fail) */
int duk_push_new_thread(duk_context *ctx); /* returns positive index of pushed thread (may fail) */
int duk_push_new_c_function(duk_context *ctx, duk_c_function func, int nargs); /* returns positive index of pushed object (may fail); nargs == DUK_VARARGS creates a variable args function */
int duk_push_new_error_object(duk_context *ctx, int err_code, const char *fmt, ...); /* returns positive index of pushed error */
void *duk_push_new_buffer(duk_context *ctx, size_t size, int growable); /* returns pointer to buffer (may be NULL if size is 0; may fail) */
void *duk_push_new_fixed_buffer(duk_context *ctx, size_t size);
void *duk_push_new_growable_buffer(duk_context *ctx, size_t size);
/*
* Pop operations
*/
void duk_pop(duk_context *ctx); /* pop top */
void duk_pop_n(duk_context *ctx, unsigned int count);
void duk_pop_2(duk_context *ctx); /* shortcut */
void duk_pop_3(duk_context *ctx); /* shortcut */
/*
* Type checks
*
* duk_is_none(), which would indicate whether index it outside of stack,
* is not needed; duk_is_valid_index() gives the same information.
*/
int duk_get_type(duk_context *ctx, int index); /* returns one of DUK_TYPE_xxx, DUK_TYPE_NONE for invalid index */
int duk_get_type_mask(duk_context *ctx, int index); /* returns one of DUK_TYPE_MASK_xxx, DUK_TYPE_MASK_NONE for invalid index */
int duk_is_undefined(duk_context *ctx, int index);
int duk_is_null(duk_context *ctx, int index);
int duk_is_null_or_undefined(duk_context *ctx, int index); /* useful in Ecmascript, similar to 'x == null' which also matches undefined */
int duk_is_boolean(duk_context *ctx, int index);
int duk_is_number(duk_context *ctx, int index);
int duk_is_string(duk_context *ctx, int index);
int duk_is_object(duk_context *ctx, int index);
int duk_is_buffer(duk_context *ctx, int index);
int duk_is_pointer(duk_context *ctx, int index);
int duk_is_array(duk_context *ctx, int index); /* implies: duk_is_object=true */
int duk_is_function(duk_context *ctx, int index); /* implies: duk_is_object=true */
int duk_is_c_function(duk_context *ctx, int index); /* implies: duk_is_function=duk_is_object=true */
int duk_is_ecmascript_function(duk_context *ctx, int index); /* implies: duk_is_function=duk_is_object=true */
int duk_is_bound_function(duk_context *ctx, int index); /* implies: duk_is_function=duk_is_object=true */
int duk_is_thread(duk_context *ctx, int index); /* implies: duk_is_object=true */
int duk_is_callable(duk_context *ctx, int index); /* currently same as duk_is_function() */
int duk_is_growable(duk_context *ctx, int index); /* for buffer */
int duk_is_primitive(duk_context *ctx, int index); /* E5 Section 9.1; anything but object is primitive */
int duk_is_object_coercible(duk_context *ctx, int index); /* E5 Section 9.10 */
/*
* Get operations: no coercion, returns default value for invalid
* indices and invalid value types.
*
* duk_get_undefined() and duk_get_null() would be pointless and
* are not included.
*/
int duk_get_boolean(duk_context *ctx, int index); /* default: false */
double duk_get_number(duk_context *ctx, int index); /* default: NaN */
int duk_get_int(duk_context *ctx, int index); /* default: 0, truncated using E5 Section 9.4 */
const char *duk_get_string(duk_context *ctx, int index); /* default: NULL */
const char *duk_get_lstring(duk_context *ctx, int index, size_t *out_len); /* default: NULL (lua uses lstring), out_len may be NULL */
void *duk_get_buffer(duk_context *ctx, int index, size_t *out_size); /* default: NULL, out_size may be NULL */
void *duk_get_pointer(duk_context *ctx, int index); /* default: NULL */
void duk_get_multiple(duk_context *ctx, int start_index, const char *types, ...);
duk_c_function duk_get_c_function(duk_context *ctx, int index);
duk_context *duk_get_context(duk_context *ctx, int index);
size_t duk_get_length(duk_context *ctx, int index); /* string: char length,
* object: 'length' property,
* buffer: byte length
*/
/*
* Require operations: no coercion, throw error if index or type
* is incorrect. No defaulting.
*/
void duk_require_undefined(duk_context *ctx, int index);
void duk_require_null(duk_context *ctx, int index);
int duk_require_boolean(duk_context *ctx, int index);
double duk_require_number(duk_context *ctx, int index);
int duk_require_int(duk_context *ctx, int index); /* returns truncated value (e.g. 1.5 -> 1) */
const char *duk_require_string(duk_context *ctx, int index);
const char *duk_require_lstring(duk_context *ctx, int index, size_t *out_len); /* out_len may be NULL */
void *duk_require_buffer(duk_context *ctx, int index, size_t *out_size);
void *duk_require_pointer(duk_context *ctx, int index);
duk_c_function duk_require_c_function(duk_context *ctx, int index);
duk_context *duk_require_context(duk_context *ctx, int index);
/*
* Coercion operations: in-place coercion, return coerced value where
* applicable. If index is invalid, throw error. Some coercions may
* throw an expected error (e.g. from a toString() or valueOf() call)
* or an internal error (e.g. from out of memory).
*/
void duk_to_undefined(duk_context *ctx, int index); /* replace value with undefined */
void duk_to_null(duk_context *ctx, int index); /* replace value with null */
int duk_to_boolean(duk_context *ctx, int index); /* Ecmascript ToBoolean coercion, E5 Section 9.2 */
double duk_to_number(duk_context *ctx, int index); /* Ecmascript ToNumber coercion, E5 Section 9.3 */
int duk_to_int(duk_context *ctx, int index); /* Ecmascript ToInteger coercion, E5 Section 9.4 */
int duk_to_int32(duk_context *ctx, int index); /* Ecmascript ToInt32 coercion, E5 Section 9.5 */
unsigned int duk_to_uint32(duk_context *ctx, int index); /* Ecmascript ToUint32 coercion, E5 Section 9.6 */
unsigned int duk_to_uint16(duk_context *ctx, int index); /* Ecmascript ToUint16 coercion, E5 Section 9.7 */
const char *duk_to_string(duk_context *ctx, int index); /* Ecmascript ToString coercion, E5 Section 9.8 */
const char *duk_to_lstring(duk_context *ctx, int index, size_t *out_len); /* out_len may be NULL */
void *duk_to_buffer(duk_context *ctx, int index); /* coerces: buffer to itself, string to buffer, others: use ToString, then to buffer */
void *duk_to_pointer(duk_context *ctx, int index); /* coerces: pointer to itself, heap object to heap pointer (debug only), others to NULL */
void duk_to_object(duk_context *ctx, int index); /* Ecmascript ToObject coercion, E5 Section 9.9 (returns nothing) */
void duk_to_defaultvalue(duk_context *ctx, int index, int hint); /* Ecmascript E5 Section 8.12.18, with optional hint */
void duk_to_primitive(duk_context *ctx, int index, int hint); /* Ecmascript E5 Section 9.1, with optional hint */
/*
* Misc conversion
*/
/* XXX: stack convention? */
const char *duk_to_base64(duk_context *ctx, int index);
/* XXX: duk_to_json */
/*
* Buffer
*/
void *duk_resize_buffer(duk_context *ctx, int index, size_t new_size); /* may fail (throw error) */
/*
* Property access
*
* The basic function assumes key is on stack. The _string variant takes
* a C string as a property name, while the _index variant takes an array
* index as a property name (e.g. 123 is equivalent to the key "123").
*/
int duk_get_prop(duk_context *ctx, int obj_index); /* [key] -> [val] */
int duk_get_prop_string(duk_context *ctx, int obj_index, const char *key); /* [] -> [val] */
int duk_get_prop_index(duk_context *ctx, int obj_index, unsigned int arr_index); /* [] -> [val] */
int duk_put_prop(duk_context *ctx, int obj_index); /* [key val] -> [] */
int duk_put_prop_string(duk_context *ctx, int obj_index, const char *key); /* [val] -> [] */
int duk_put_prop_index(duk_context *ctx, int obj_index, unsigned int arr_index); /* [val] -> [] */
int duk_del_prop(duk_context *ctx, int obj_index); /* [key] -> [] */
int duk_del_prop_string(duk_context *ctx, int obj_index, const char *key); /* [] -> [] */
int duk_del_prop_index(duk_context *ctx, int obj_index, unsigned int arr_index); /* [] -> [] */
int duk_has_prop(duk_context *ctx, int obj_index); /* [key] -> [] */
int duk_has_prop_string(duk_context *ctx, int obj_index, const char *key); /* [] -> [] */
int duk_has_prop_index(duk_context *ctx, int obj_index, unsigned int arr_index); /* [] -> [] */
/*
* Variable access
*/
int duk_get_var(duk_context *ctx); /* [varname] -> [val] */
int duk_put_var(duk_context *ctx); /* [varname val] -> [res] */
int duk_del_var(duk_context *ctx); /* [varname] -> [res] */
int duk_has_var(duk_context *ctx); /* [varname] */
/*
* Object operations
*/
void duk_compact(duk_context *ctx, int obj_index); /* [] -> [] */
void duk_enum(duk_context *ctx, int obj_index, int enum_flags); /* [] -> [enum] */
int duk_next(duk_context *ctx, int enum_index, int get_value); /* [] -> [key] or [] -> [key val] (if get_value != 0);
* return zero if enum finished (in which case undefined is pushed).
* Note that getting the value may cause an error (e.g. in case of a getter).
*/
/*
* String manipulation
*/
/* FIXME: decode and map string should probably have a slice syntax */
/* FIXME: char_code_at */
void duk_concat(duk_context *ctx, unsigned int count); /* [val1 ... valN] -> [res], coerced and concatenated */
void duk_join(duk_context *ctx, unsigned int count); /* [sep val1 ... valN] -> [res], coerced and joined */
void duk_decode_string(duk_context *ctx, int index, duk_decode_char_function callback, void *udata);
void duk_map_string(duk_context *ctx, int index, duk_map_char_function callback, void *udata);
void duk_substring(duk_context *ctx, unsigned int start_offset, unsigned int end_offset);
/*
* Ecmascript operators
*/
/* FIXME: what to include; there are plenty of operators, arithmetic, comparison, bit ops, etc */
#if 0 /* FIXME: to be decided */
int duk_equals(duk_context *ctx, int index1, int index2); /* true if equals with Ecmascript '==' semantics; false if either index invalid */
int duk_strictly_equals(duk_context *ctx, int index1, int index2); /* true if equals with Ecmascript '===' semantics; false if either index invalid */
int duk_less_than(duk_context *ctx, int index1, int index2); /* 'x < y' comparison, E5 Section 11.8.5 */
int duk_same_value(duk_context *ctx, int index1, int index2); /* true with Ecmascript SameValue, E5 Section 9.12 (stricter than '===') */
#endif
/*
* Function (method) calls
*
* If 'errhandler_index' is DUK_INVALID_INDEX, the current errhandler will be
* used. If 'errhandler_index' points to an undefined value in the stack,
* a NULL errhandler will be used, replacing any existing errhandler.
*/
void duk_call(duk_context *ctx, int nargs); /* [func arg1 ... argN] -> [retval] */
void duk_call_method(duk_context *ctx, int nargs); /* [func this arg1 ... argN] -> [retval] */
void duk_call_prop(duk_context *ctx, int obj_index, int nargs); /* [key arg1 ... argN] -> [retval] ('this' bound to obj) */
int duk_pcall(duk_context *ctx, int nargs, int errhandler_index); /* [func arg1 ... argN] -> [retval] or [err] */
int duk_pcall_method(duk_context *ctx, int nargs, int errhandler_index); /* [func this arg1 ... argN] -> [retval] or [err] */
int duk_pcall_prop(duk_context *ctx, int obj_index, int nargs, int errhandler_index); /* [key arg1 ... argN] -> [retval] or [err] ('this' bound to obj) */
void duk_new(duk_context *ctx, int nargs); /* [... constructor arg1 ... argN] -> [retval] */
/*
* Protected pure C function call. Operates on the existing value stack
* frame and is not visible on the call stack. This call is useful as it
* provides a place to catch errors, perform cleanup, and perhaps rethrow.
*
* Because this call operates on the current value stack frame, stack
* behavior differs a bit from other call types.
*
* The top 'nargs' elements of the stack top are identified as arguments to
* 'func' establishing a "base index" for the return stack as:
*
* (duk_get_top() - nargs)
*
* When 'func' returns, it indicates with its return value the number of
* return values it has pushed on top of the stack; multiple or zero return
* values possible. The stack is then manipulated so that there are exactly
* 'nrets' values starting at the "base index" established before the call.
*
* Note that since 'func' has full access to the value stack, it may modify
* the stack below the indended arguments and even pop elements below the
* "base index" off the stack. Such elements are restored with 'undefined'
* values before returning, to ensure that the stack is always in a
* consistent state upon returning.
*
* If an error occurs, the stack will still have 'nrets' values at "base
* index"; the first of such values is the error, and the remaining values
* are undefined. If 'nrets' is zero, the error will not be present on the
* stack (the return stack top will equal the "base index"), so calling this
* function with nrets = 0 may not be very useful.
*
* Example: with nargs = 3, nrets = 2, 'func' rc = 4, pipe chars indicate
* logical boundaries:
*
* .--- frame bottom
* v
* [ ... | ... | a b c ] stack before calling 'func'
*
* [ ... | ... | a b | x y z w ] stack after calling 'func', which has
* popped one argument and written four
* return values
*
* [ ... | ... | x y ] stack after duk_safe_call() returns,
* 2 (= nrets) first 'func' return values
* are left at "base index"
*
* Note: 'func' uses caller stack frame, so bottom-based references are
* dangerous within 'func'.
*/
int duk_safe_call(duk_context *ctx, duk_safe_call_function func, int nargs, int nrets, int errhandler_index);
/*
* Thread management
*/
/* There are currently no native functions to yield/resume, due to the internal
* limitations on coroutine handling. These will be added later.
*/
/*
* Compilation and evaluation
*/
/* FIXME: flags, such as "strict"? */
/* FIXME: helper for protected eval, duk_peval()? */
/* FIXME: global program -> through compile flags? */
int duk_eval(duk_context *ctx); /* [code] -> [retval] (may throw error) */
int duk_compile(duk_context *ctx); /* [code] -> [func] (may throw error) */
#endif /* __DUK_API_H */
Loading…
Cancel
Save