6 #include "ext/jse_canvas.h"
7 #include "ext/jse_event.h"
8 #include "ext/jse_array.h"
13 typedef uint64_t jsval_t;
15 struct js *js_create(
void *buf,
size_t len);
16 jsval_t js_eval(
struct js *,
const char *,
size_t);
17 jsval_t js_glob(
struct js *);
18 const char *js_str(
struct js *, jsval_t val);
19 bool js_chkargs(jsval_t *,
int,
const char *);
20 bool js_truthy(
struct js *, jsval_t);
21 void js_setmaxcss(
struct js *,
size_t);
22 void js_setgct(
struct js *,
size_t);
23 void js_stats(
struct js *,
size_t *total,
size_t *min,
size_t *cstacksize);
24 void js_dump(
struct js *);
25 void js_statsInfo(
struct js *
js);
28 jsval_t js_mkundef(
void);
29 jsval_t js_mknull(
void);
30 jsval_t js_mktrue(
void);
31 jsval_t js_mkfalse(
void);
32 jsval_t js_mkstr(
struct js *,
const void *,
size_t);
33 jsval_t js_mknum(double_t);
34 jsval_t js_mkerr(
struct js *
js,
const char *fmt, ...);
35 jsval_t js_mkfun(jsval_t (*fn)(
struct js *, jsval_t *,
int));
36 jsval_t js_mkobj(
struct js *);
37 void js_set(
struct js *, jsval_t,
const char *, jsval_t);
39 enum { JS_UNDEF, JS_NULL, JS_TRUE, JS_FALSE, JS_STR, JS_NUM, JS_ERR, JS_PRIV };
40 int js_type(jsval_t val);
41 double_t js_getnum(jsval_t val);
42 int js_getbool(jsval_t val);
43 char *js_getstr(
struct js *
js, jsval_t val,
size_t *len);
46 typedef uint32_t jsoff_t;
99 TOK_ERR, TOK_EOF, TOK_IDENTIFIER, TOK_NUMBER, TOK_STRING, TOK_SEMICOLON,
100 TOK_LPAREN, TOK_RPAREN, TOK_LBRACE, TOK_RBRACE,
102 TOK_BREAK = 50, TOK_CASE, TOK_CATCH, TOK_CLASS, TOK_CONST, TOK_CONTINUE,
103 TOK_DEFAULT, TOK_DELETE, TOK_DO, TOK_ELSE, TOK_FINALLY, TOK_FOR, TOK_FUNC,
104 TOK_IF, TOK_IN, TOK_INSTANCEOF, TOK_LET, TOK_NEW, TOK_RETURN, TOK_SWITCH,
105 TOK_THIS, TOK_THROW, TOK_TRY, TOK_VAR, TOK_VOID, TOK_WHILE, TOK_WITH,
106 TOK_YIELD, TOK_UNDEF, TOK_NULL, TOK_TRUE, TOK_FALSE,
108 TOK_DOT = 100, TOK_CALL, TOK_POSTINC, TOK_POSTDEC, TOK_NOT, TOK_TILDA,
109 TOK_TYPEOF, TOK_UPLUS, TOK_UMINUS, TOK_EXP, TOK_MUL, TOK_DIV, TOK_REM,
110 TOK_PLUS, TOK_MINUS, TOK_SHL, TOK_SHR, TOK_ZSHR, TOK_LT, TOK_LE, TOK_GT,
111 TOK_GE, TOK_EQ, TOK_NE, TOK_AND, TOK_XOR, TOK_OR, TOK_LAND, TOK_LOR,
112 TOK_COLON, TOK_Q, TOK_ASSIGN, TOK_PLUS_ASSIGN, TOK_MINUS_ASSIGN,
113 TOK_MUL_ASSIGN, TOK_DIV_ASSIGN, TOK_REM_ASSIGN, TOK_SHL_ASSIGN,
114 TOK_SHR_ASSIGN, TOK_ZSHR_ASSIGN, TOK_AND_ASSIGN, TOK_XOR_ASSIGN,
115 TOK_OR_ASSIGN, TOK_COMMA,
122 T_OBJ, T_PROP, T_STR, T_UNDEF, T_NULL, T_NUM, T_BOOL, T_FUNC, T_CODEREF,
126 static jsval_t tov(double_t d) {
127 union { double_t d; jsval_t v; } u = {d};
130 static jsval_t tov2(
int d) {
union {
int d; jsval_t v; } u = {d};
return u.v; }
131 static double_t tod(jsval_t v) {
132 union { jsval_t v; double_t d; } u = {v};
135 static double_t tod2(jsval_t v) {
136 union { jsval_t v;
int d; } u = {v};
139 static jsval_t mkval(uint8_t type, uint64_t data) {
return ((jsval_t) 0x7ff0U << 48U) | ((jsval_t) (type) << 48) | (data & 0xffffffffffffUL); }
140 static bool is_nan(jsval_t v) {
return (v >> 52U) == 0x7ffU; }
141 static uint8_t vtype(jsval_t v) {
return is_nan(v) ? ((v >> 48U) & 15U) : (uint8_t) T_NUM; }
142 static size_t vdata(jsval_t v) {
return (
size_t) (v & ~((jsval_t) 0x7fffUL << 48U)); }
143 static jsval_t mkcoderef(jsval_t off, jsoff_t len) {
return mkval(T_CODEREF, (off & 0xffffffU) | ((jsval_t)(len & 0xffffffU) << 24U)); }
144 static jsoff_t coderefoff(jsval_t v) {
return v & 0xffffffU; }
145 static jsoff_t codereflen(jsval_t v) {
return (v >> 24U) & 0xffffffU; }
147 static uint8_t unhex(uint8_t c) {
return (c >=
'0' && c <=
'9') ? (uint8_t) (c -
'0') : (c >=
'a' && c <=
'f') ? (uint8_t) (c -
'W') : (c >=
'A' && c <=
'F') ? (uint8_t) (c -
'7') : 0; }
148 static bool is_space(
int c) {
return c ==
' ' || c ==
'\r' || c ==
'\n' || c ==
'\t' || c ==
'\f' || c ==
'\v'; }
149 static bool is_digit(
int c) {
return c >=
'0' && c <=
'9'; }
150 static bool is_xdigit(
int c) {
return is_digit(c) || (c >=
'a' && c <=
'f') || (c >=
'A' && c <=
'F'); }
151 static bool is_alpha(
int c) {
return (c >=
'a' && c <=
'z') || (c >=
'A' && c <=
'Z'); }
152 static bool is_ident_begin(
int c) {
return c ==
'_' || c ==
'$' || is_alpha(c); }
153 static bool is_ident_continue(
int c) {
return c ==
'_' || c ==
'$' || is_alpha(c) || is_digit(c); }
154 static bool is_err(jsval_t v) {
return vtype(v) == T_ERR; }
155 static bool is_unary(uint8_t tok) {
return tok >= TOK_POSTINC && tok <= TOK_UMINUS; }
156 static bool is_assign(uint8_t tok) {
return (tok >= TOK_ASSIGN && tok <= TOK_OR_ASSIGN); }
157 static void saveoff(
struct js *
js, jsoff_t off, jsoff_t val) {
memcpy(&
js->mem[off], &val,
sizeof(val)); }
158 static void saveval(
struct js *
js, jsoff_t off, jsval_t val) {
memcpy(&
js->mem[off], &val,
sizeof(val)); }
159 static jsoff_t loadoff(
struct js *
js, jsoff_t off) { jsoff_t v = 0; passert(
js->brk <=
js->size);
memcpy(&v, &
js->mem[off],
sizeof(v));
return v; }
160 static jsoff_t offtolen(jsoff_t off) {
return (off >> 2) - 1; }
161 static jsoff_t vstrlen(
struct js *
js, jsval_t v) {
return offtolen(loadoff(
js, (jsoff_t) vdata(v))); }
162 static jsval_t loadval(
struct js *
js, jsoff_t off) { jsval_t v = 0;
memcpy(&v, &
js->mem[off],
sizeof(v));
return v; }
163 static jsval_t upper(
struct js *
js, jsval_t scope) {
return mkval(T_OBJ, loadoff(
js, (jsoff_t) (vdata(scope) +
sizeof(jsoff_t)))); }
164 static jsoff_t align32(jsoff_t v) {
return ((v + 3) >> 2) << 2; }
166 #define CHECKV(_v) do { if (is_err(_v)) { res = (_v); goto done; } } while (0)
167 #define EXPECT(_tok, _e) do { if (next(js) != _tok) { _e; return js_mkerr(js, "parse error"); }; js->consumed = 1; } while (0)
169 static size_t tostr(
struct js *
js, jsval_t value,
char *buf,
size_t len);
170 static jsval_t js_expr(
struct js *
js);
171 static jsval_t js_stmt(
struct js *
js);
172 static jsval_t do_op(
struct js *, uint8_t op, jsval_t l, jsval_t r);
174 void jse_file_getBuff(
char* buf);
175 JSE_ARRAY* js_getObjectToArray(
struct js *
js, jsval_t value);
178 jsval_t elk_call_js_fnc(
struct js *
js,
const char *fn, jsoff_t fnlen);
180 #include "ext/jse_function.h"
Основные определения ядра
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.