ref: 06e821df4a51a4b71d33f72b3c293894a6b67ff9
dir: /jsi.h/
#ifndef jsi_h #define jsi_h #include "js.h" #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <stdarg.h> #include <string.h> #include <setjmp.h> #include <math.h> #include <float.h> typedef struct js_Regexp js_Regexp; typedef struct js_Value js_Value; typedef struct js_Object js_Object; typedef struct js_Ast js_Ast; typedef struct js_Function js_Function; typedef struct js_Environment js_Environment; typedef struct js_StringNode js_StringNode; typedef struct js_Jumpbuf js_Jumpbuf; /* Limits */ #define JS_STACKSIZE 256 /* value stack size */ #define JS_TRYLIMIT 64 /* exception stack size */ #define JS_GCLIMIT 10000 /* run gc cycle every N allocations */ /* String interning */ const char *js_intern(js_State *J, const char *s); void jsS_dumpstrings(js_State *J); void jsS_freestrings(js_State *J); /* Private stack functions */ void js_newfunction(js_State *J, js_Function *function, js_Environment *scope); void js_newscript(js_State *J, js_Function *function); js_Regexp *js_toregexp(js_State *J, int idx); int js_isarrayindex(js_State *J, const char *str, unsigned int *idx); int js_runeat(js_State *J, const char *s, int i); void js_pushcharat(js_State *J, const char *s, int pos); void js_dup(js_State *J); void js_rot2(js_State *J); void js_rot3(js_State *J); int js_RegExp_prototype_exec(js_State *J, js_Regexp *re, const char *text); /* Exception handling */ struct js_Jumpbuf { jmp_buf buf; js_Environment *E; int top, bot; short *pc; }; void js_savetry(js_State *J, short *pc); #define js_trypc(J, PC) \ (js_savetry(J, PC), setjmp(J->trybuf[J->trylen++].buf)) #define js_try(J) \ (js_savetry(J, NULL), setjmp(J->trybuf[J->trylen++].buf)) #define js_endtry(J) \ (--J->trylen) /* State struct */ struct js_State { js_StringNode *strings; /* parser input source */ const char *filename; const char *source; int line; /* lexer state */ struct { char *text; size_t len, cap; } lexbuf; int lexline; int lexchar; int lasttoken; int newline; /* parser state */ int lookahead; const char *text; double number; js_Ast *gcast; /* list of allocated nodes to free after parsing */ /* compiler state */ int strict; /* runtime environment */ js_Object *Object_prototype; js_Object *Array_prototype; js_Object *Function_prototype; js_Object *Boolean_prototype; js_Object *Number_prototype; js_Object *String_prototype; js_Object *RegExp_prototype; js_Object *Date_prototype; js_Object *Error_prototype; js_Object *EvalError_prototype; js_Object *RangeError_prototype; js_Object *ReferenceError_prototype; js_Object *SyntaxError_prototype; js_Object *TypeError_prototype; js_Object *URIError_prototype; int nextref; /* for js_ref use */ js_Object *R; /* registry of hidden values */ js_Object *G; /* the global object */ js_Environment *E; /* current environment scope */ js_Environment *GE; /* global environment scope (at the root) */ /* execution stack */ int top, bot; js_Value *stack; /* garbage collector list */ int gcmark; int gccounter; js_Environment *gcenv; js_Function *gcfun; js_Object *gcobj; /* exception stack */ int trylen; js_Jumpbuf trybuf[JS_TRYLIMIT]; }; #endif