jscript: Added minimal bytecode compiler/interpreter and use it for '===' expressions.
[wine/wine-gecko.git] / dlls / jscript / engine.h
blob09f6e11b9d1d3860d7e44d7802b0149ed14664b3
1 /*
2 * Copyright 2008 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 typedef struct _source_elements_t source_elements_t;
20 typedef struct _function_expression_t function_expression_t;
21 typedef struct _expression_t expression_t;
23 typedef struct _function_declaration_t {
24 function_expression_t *expr;
26 struct _function_declaration_t *next;
27 } function_declaration_t;
29 typedef struct _var_list_t {
30 const WCHAR *identifier;
32 struct _var_list_t *next;
33 } var_list_t;
35 typedef struct _func_stack {
36 function_declaration_t *func_head;
37 function_declaration_t *func_tail;
38 var_list_t *var_head;
39 var_list_t *var_tail;
41 struct _func_stack *next;
42 } func_stack_t;
44 #define OP_LIST \
45 X(eq2, 1, 0) \
46 X(tree, 1, ARG_EXPR) \
47 X(ret, 0, 0)
49 typedef enum {
50 #define X(x,a,b) OP_##x,
51 OP_LIST
52 #undef X
53 OP_LAST
54 } jsop_t;
56 typedef union {
57 expression_t *expr;
58 } instr_arg_t;
60 typedef enum {
61 ARG_NONE = 0,
62 ARG_EXPR
63 } instr_arg_type_t;
65 typedef struct {
66 jsop_t op;
67 instr_arg_t arg1;
68 } instr_t;
70 typedef struct {
71 instr_t *instrs;
72 } bytecode_t;
74 void release_bytecode(bytecode_t*);
76 typedef struct _compiler_ctx_t compiler_ctx_t;
78 void release_compiler(compiler_ctx_t*);
80 typedef struct _parser_ctx_t {
81 LONG ref;
83 WCHAR *begin;
84 const WCHAR *end;
85 const WCHAR *ptr;
87 script_ctx_t *script;
88 source_elements_t *source;
89 BOOL nl;
90 BOOL is_html;
91 BOOL lexer_error;
92 HRESULT hres;
94 jsheap_t heap;
96 func_stack_t *func_stack;
98 bytecode_t *code;
99 compiler_ctx_t *compiler;
101 struct _parser_ctx_t *next;
102 } parser_ctx_t;
104 HRESULT script_parse(script_ctx_t*,const WCHAR*,const WCHAR*,parser_ctx_t**) DECLSPEC_HIDDEN;
105 void parser_release(parser_ctx_t*) DECLSPEC_HIDDEN;
107 int parser_lex(void*,parser_ctx_t*) DECLSPEC_HIDDEN;
109 static inline void parser_addref(parser_ctx_t *ctx)
111 ctx->ref++;
114 static inline void *parser_alloc(parser_ctx_t *ctx, DWORD size)
116 return jsheap_alloc(&ctx->heap, size);
119 static inline void *parser_alloc_tmp(parser_ctx_t *ctx, DWORD size)
121 return jsheap_alloc(&ctx->script->tmp_heap, size);
124 typedef struct _scope_chain_t {
125 LONG ref;
126 jsdisp_t *obj;
127 struct _scope_chain_t *next;
128 } scope_chain_t;
130 HRESULT scope_push(scope_chain_t*,jsdisp_t*,scope_chain_t**) DECLSPEC_HIDDEN;
131 void scope_release(scope_chain_t*) DECLSPEC_HIDDEN;
133 static inline void scope_addref(scope_chain_t *scope)
135 scope->ref++;
138 struct _exec_ctx_t {
139 LONG ref;
141 parser_ctx_t *parser;
142 scope_chain_t *scope_chain;
143 jsdisp_t *var_disp;
144 IDispatch *this_obj;
145 BOOL is_global;
147 VARIANT *stack;
148 unsigned stack_size;
149 unsigned top;
151 unsigned ip;
152 jsexcept_t ei;
155 static inline void exec_addref(exec_ctx_t *ctx)
157 ctx->ref++;
160 void exec_release(exec_ctx_t*) DECLSPEC_HIDDEN;
161 HRESULT create_exec_ctx(script_ctx_t*,IDispatch*,jsdisp_t*,scope_chain_t*,BOOL,exec_ctx_t**) DECLSPEC_HIDDEN;
162 HRESULT exec_source(exec_ctx_t*,parser_ctx_t*,source_elements_t*,BOOL,jsexcept_t*,VARIANT*) DECLSPEC_HIDDEN;
164 typedef struct _statement_t statement_t;
165 typedef struct _parameter_t parameter_t;
167 HRESULT create_source_function(parser_ctx_t*,parameter_t*,source_elements_t*,scope_chain_t*,
168 const WCHAR*,DWORD,jsdisp_t**) DECLSPEC_HIDDEN;
170 typedef enum {
171 LT_INT,
172 LT_DOUBLE,
173 LT_STRING,
174 LT_BOOL,
175 LT_NULL,
176 LT_REGEXP
177 }literal_type_t;
179 typedef struct {
180 literal_type_t type;
181 union {
182 LONG lval;
183 double dval;
184 const WCHAR *wstr;
185 VARIANT_BOOL bval;
186 IDispatch *disp;
187 struct {
188 const WCHAR *str;
189 DWORD str_len;
190 DWORD flags;
191 } regexp;
192 } u;
193 } literal_t;
195 literal_t *parse_regexp(parser_ctx_t*) DECLSPEC_HIDDEN;
196 literal_t *new_boolean_literal(parser_ctx_t*,VARIANT_BOOL) DECLSPEC_HIDDEN;
198 typedef struct _variable_declaration_t {
199 const WCHAR *identifier;
200 expression_t *expr;
202 struct _variable_declaration_t *next;
203 } variable_declaration_t;
205 typedef struct _return_type_t return_type_t;
207 typedef HRESULT (*statement_eval_t)(script_ctx_t*,statement_t*,return_type_t*,VARIANT*);
209 struct _statement_t {
210 statement_eval_t eval;
211 statement_t *next;
214 typedef struct {
215 statement_t stat;
216 statement_t *stat_list;
217 } block_statement_t;
219 typedef struct {
220 statement_t stat;
221 variable_declaration_t *variable_list;
222 } var_statement_t;
224 typedef struct {
225 statement_t stat;
226 expression_t *expr;
227 } expression_statement_t;
229 typedef struct {
230 statement_t stat;
231 expression_t *expr;
232 statement_t *if_stat;
233 statement_t *else_stat;
234 } if_statement_t;
236 typedef struct {
237 statement_t stat;
238 BOOL do_while;
239 expression_t *expr;
240 statement_t *statement;
241 } while_statement_t;
243 typedef struct {
244 statement_t stat;
245 variable_declaration_t *variable_list;
246 expression_t *begin_expr;
247 expression_t *expr;
248 expression_t *end_expr;
249 statement_t *statement;
250 } for_statement_t;
252 typedef struct {
253 statement_t stat;
254 variable_declaration_t *variable;
255 expression_t *expr;
256 expression_t *in_expr;
257 statement_t *statement;
258 } forin_statement_t;
260 typedef struct {
261 statement_t stat;
262 const WCHAR *identifier;
263 } branch_statement_t;
265 typedef struct {
266 statement_t stat;
267 expression_t *expr;
268 statement_t *statement;
269 } with_statement_t;
271 typedef struct {
272 statement_t stat;
273 const WCHAR *identifier;
274 statement_t *statement;
275 } labelled_statement_t;
277 typedef struct _case_clausule_t {
278 expression_t *expr;
279 statement_t *stat;
281 struct _case_clausule_t *next;
282 } case_clausule_t;
284 typedef struct {
285 statement_t stat;
286 expression_t *expr;
287 case_clausule_t *case_list;
288 } switch_statement_t;
290 typedef struct {
291 const WCHAR *identifier;
292 statement_t *statement;
293 } catch_block_t;
295 typedef struct {
296 statement_t stat;
297 statement_t *try_statement;
298 catch_block_t *catch_block;
299 statement_t *finally_statement;
300 } try_statement_t;
302 HRESULT block_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
303 HRESULT var_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
304 HRESULT empty_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
305 HRESULT expression_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
306 HRESULT if_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
307 HRESULT while_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
308 HRESULT for_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
309 HRESULT forin_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
310 HRESULT continue_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
311 HRESULT break_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
312 HRESULT return_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
313 HRESULT with_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
314 HRESULT labelled_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
315 HRESULT switch_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
316 HRESULT throw_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
317 HRESULT try_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
319 typedef struct {
320 enum {
321 EXPRVAL_VARIANT,
322 EXPRVAL_IDREF,
323 EXPRVAL_NAMEREF,
324 EXPRVAL_INVALID
325 } type;
326 union {
327 VARIANT var;
328 struct {
329 IDispatch *disp;
330 DISPID id;
331 } idref;
332 struct {
333 IDispatch *disp;
334 BSTR name;
335 } nameref;
336 BSTR identifier;
337 } u;
338 } exprval_t;
340 typedef enum {
341 EXPR_COMMA,
342 EXPR_OR,
343 EXPR_AND,
344 EXPR_BOR,
345 EXPR_BXOR,
346 EXPR_BAND,
347 EXPR_INSTANCEOF,
348 EXPR_IN,
349 EXPR_ADD,
350 EXPR_SUB,
351 EXPR_MUL,
352 EXPR_DIV,
353 EXPR_MOD,
354 EXPR_DELETE,
355 EXPR_VOID,
356 EXPR_TYPEOF,
357 EXPR_MINUS,
358 EXPR_PLUS,
359 EXPR_POSTINC,
360 EXPR_POSTDEC,
361 EXPR_PREINC,
362 EXPR_PREDEC,
363 EXPR_EQ,
364 EXPR_EQEQ,
365 EXPR_NOTEQ,
366 EXPR_NOTEQEQ,
367 EXPR_LESS,
368 EXPR_LESSEQ,
369 EXPR_GREATER,
370 EXPR_GREATEREQ,
371 EXPR_BITNEG,
372 EXPR_LOGNEG,
373 EXPR_LSHIFT,
374 EXPR_RSHIFT,
375 EXPR_RRSHIFT,
376 EXPR_ASSIGN,
377 EXPR_ASSIGNLSHIFT,
378 EXPR_ASSIGNRSHIFT,
379 EXPR_ASSIGNRRSHIFT,
380 EXPR_ASSIGNADD,
381 EXPR_ASSIGNSUB,
382 EXPR_ASSIGNMUL,
383 EXPR_ASSIGNDIV,
384 EXPR_ASSIGNMOD,
385 EXPR_ASSIGNAND,
386 EXPR_ASSIGNOR,
387 EXPR_ASSIGNXOR,
388 EXPR_COND,
389 EXPR_ARRAY,
390 EXPR_MEMBER,
391 EXPR_NEW,
392 EXPR_CALL,
393 EXPR_THIS,
394 EXPR_FUNC,
395 EXPR_IDENT,
396 EXPR_ARRAYLIT,
397 EXPR_PROPVAL,
398 EXPR_LITERAL
399 } expression_type_t;
401 typedef HRESULT (*expression_eval_t)(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
403 struct _expression_t {
404 expression_type_t type;
405 expression_eval_t eval;
406 unsigned instr_off;
409 struct _parameter_t {
410 const WCHAR *identifier;
412 struct _parameter_t *next;
415 struct _source_elements_t {
416 statement_t *statement;
417 statement_t *statement_tail;
418 function_declaration_t *functions;
419 var_list_t *variables;
422 struct _function_expression_t {
423 expression_t expr;
424 const WCHAR *identifier;
425 parameter_t *parameter_list;
426 source_elements_t *source_elements;
427 const WCHAR *src_str;
428 DWORD src_len;
431 typedef struct {
432 expression_t expr;
433 expression_t *expression1;
434 expression_t *expression2;
435 } binary_expression_t;
437 typedef struct {
438 expression_t expr;
439 expression_t *expression;
440 } unary_expression_t;
442 typedef struct {
443 expression_t expr;
444 expression_t *expression;
445 expression_t *true_expression;
446 expression_t *false_expression;
447 } conditional_expression_t;
449 typedef struct {
450 expression_t expr;
451 expression_t *member_expr;
452 expression_t *expression;
453 } array_expression_t;
455 typedef struct {
456 expression_t expr;
457 expression_t *expression;
458 const WCHAR *identifier;
459 } member_expression_t;
461 typedef struct _argument_t {
462 expression_t *expr;
464 struct _argument_t *next;
465 } argument_t;
467 typedef struct {
468 expression_t expr;
469 expression_t *expression;
470 argument_t *argument_list;
471 } call_expression_t;
473 typedef struct {
474 expression_t expr;
475 const WCHAR *identifier;
476 } identifier_expression_t;
478 typedef struct {
479 expression_t expr;
480 literal_t *literal;
481 } literal_expression_t;
483 typedef struct _array_element_t {
484 int elision;
485 expression_t *expr;
487 struct _array_element_t *next;
488 } array_element_t;
490 typedef struct {
491 expression_t expr;
492 array_element_t *element_list;
493 int length;
494 } array_literal_expression_t;
496 typedef struct _prop_val_t {
497 literal_t *name;
498 expression_t *value;
500 struct _prop_val_t *next;
501 } prop_val_t;
503 typedef struct {
504 expression_t expr;
505 prop_val_t *property_list;
506 } property_value_expression_t;
508 HRESULT function_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
509 HRESULT conditional_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
510 HRESULT array_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
511 HRESULT member_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
512 HRESULT new_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
513 HRESULT call_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
514 HRESULT this_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
515 HRESULT identifier_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
516 HRESULT literal_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
517 HRESULT array_literal_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
518 HRESULT property_value_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
520 HRESULT comma_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
521 HRESULT logical_or_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
522 HRESULT logical_and_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
523 HRESULT binary_or_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
524 HRESULT binary_xor_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
525 HRESULT binary_and_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
526 HRESULT instanceof_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
527 HRESULT in_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
528 HRESULT add_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
529 HRESULT sub_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
530 HRESULT mul_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
531 HRESULT div_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
532 HRESULT mod_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
533 HRESULT delete_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
534 HRESULT void_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
535 HRESULT typeof_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
536 HRESULT minus_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
537 HRESULT plus_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
538 HRESULT post_increment_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
539 HRESULT post_decrement_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
540 HRESULT pre_increment_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
541 HRESULT pre_decrement_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
542 HRESULT equal_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
543 HRESULT not_equal_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
544 HRESULT not_equal2_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
545 HRESULT less_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
546 HRESULT lesseq_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
547 HRESULT greater_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
548 HRESULT greatereq_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
549 HRESULT binary_negation_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
550 HRESULT logical_negation_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
551 HRESULT left_shift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
552 HRESULT right_shift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
553 HRESULT right2_shift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
554 HRESULT assign_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
555 HRESULT assign_lshift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
556 HRESULT assign_rshift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
557 HRESULT assign_rrshift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
558 HRESULT assign_add_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
559 HRESULT assign_sub_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
560 HRESULT assign_mul_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
561 HRESULT assign_div_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
562 HRESULT assign_mod_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
563 HRESULT assign_and_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
564 HRESULT assign_or_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
565 HRESULT assign_xor_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
567 HRESULT compiled_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
569 HRESULT compile_subscript(parser_ctx_t*,expression_t*,unsigned*) DECLSPEC_HIDDEN;