msvcp90: Use macro to define RTTI data.
[wine] / dlls / jscript / engine.h
1 /*
2  * Copyright 2008 Jacek Caban for CodeWeavers
3  *
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.
8  *
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.
13  *
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
17  */
18
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;
22 typedef struct _statement_t statement_t;
23
24 typedef struct _function_declaration_t {
25     function_expression_t *expr;
26
27     struct _function_declaration_t *next;
28 } function_declaration_t;
29
30 typedef struct _var_list_t {
31     const WCHAR *identifier;
32
33     struct _var_list_t *next;
34 } var_list_t;
35
36 typedef struct _func_stack {
37     function_declaration_t *func_head;
38     function_declaration_t *func_tail;
39     var_list_t *var_head;
40     var_list_t *var_tail;
41
42     struct _func_stack *next;
43 } func_stack_t;
44
45 #define OP_LIST                            \
46     X(add,        1, 0,0)                  \
47     X(and,        1, 0,0)                  \
48     X(array,      1, 0,0)                  \
49     X(assign,     1, 0,0)                  \
50     X(bool,       1, ARG_INT,    0)        \
51     X(bneg,       1, 0,0)                  \
52     X(call,       1, ARG_UINT,   ARG_UINT) \
53     X(call_member,1, ARG_UINT,   ARG_UINT) \
54     X(carray,     1, ARG_UINT,   0)        \
55     X(delete,     1, 0,0)                  \
56     X(delete_ident,1,ARG_BSTR,   0)        \
57     X(div,        1, 0,0)                  \
58     X(double,     1, ARG_SBL,    0)        \
59     X(eq,         1, 0,0)                  \
60     X(eq2,        1, 0,0)                  \
61     X(func,       1, ARG_FUNC,   0)        \
62     X(gt,         1, 0,0)                  \
63     X(gteq,       1, 0,0)                  \
64     X(ident,      1, ARG_BSTR,   0)        \
65     X(identid,    1, ARG_BSTR,   ARG_INT)  \
66     X(in,         1, 0,0)                  \
67     X(instanceof, 1, 0,0)                  \
68     X(int,        1, ARG_INT,    0)        \
69     X(jmp,        0, ARG_ADDR,   0)        \
70     X(jmp_nz,     0, ARG_ADDR,   0)        \
71     X(jmp_z,      0, ARG_ADDR,   0)        \
72     X(lshift,     1, 0,0)                  \
73     X(lt,         1, 0,0)                  \
74     X(lteq,       1, 0,0)                  \
75     X(member,     1, ARG_BSTR,   0)        \
76     X(memberid,   1, ARG_UINT,   0)        \
77     X(minus,      1, 0,0)                  \
78     X(mod,        1, 0,0)                  \
79     X(mul,        1, 0,0)                  \
80     X(neg,        1, 0,0)                  \
81     X(neq,        1, 0,0)                  \
82     X(neq2,       1, 0,0)                  \
83     X(new,        1, ARG_INT,    0)        \
84     X(new_obj,    1, 0,0)                  \
85     X(null,       1, 0,0)                  \
86     X(obj_prop,   1, ARG_BSTR,   0)        \
87     X(or,         1, 0,0)                  \
88     X(pop,        1, 0,0)                  \
89     X(postinc,    1, ARG_INT,    0)        \
90     X(preinc,     1, ARG_INT,    0)        \
91     X(regexp,     1, ARG_STR,    ARG_INT)  \
92     X(rshift,     1, 0,0)                  \
93     X(rshift2,    1, 0,0)                  \
94     X(str,        1, ARG_STR,    0)        \
95     X(this,       1, 0,0)                  \
96     X(throw,      0, ARG_UINT,   0)        \
97     X(throw_type, 0, ARG_UINT,   ARG_STR)  \
98     X(tonum,      1, 0,0)                  \
99     X(tree,       1, ARG_STAT,   0)        \
100     X(typeof,     1, 0,0)                  \
101     X(typeofid,   1, 0,0)                  \
102     X(typeofident,1, 0,0)                  \
103     X(refval,     1, 0,0)                  \
104     X(ret,        0, 0,0)                  \
105     X(sub,        1, 0,0)                  \
106     X(undefined,  1, 0,0)                  \
107     X(void,       1, 0,0)                  \
108     X(xor,        1, 0,0)
109
110 typedef enum {
111 #define X(x,a,b,c) OP_##x,
112 OP_LIST
113 #undef X
114     OP_LAST
115 } jsop_t;
116
117 typedef union {
118     statement_t *stat;
119     BSTR bstr;
120     double *dbl;
121     LONG lng;
122     WCHAR *str;
123     unsigned uint;
124     function_expression_t *func; /* FIXME */
125 } instr_arg_t;
126
127 typedef enum {
128     ARG_NONE = 0,
129     ARG_ADDR,
130     ARG_BSTR,
131     ARG_STAT,
132     ARG_FUNC,
133     ARG_INT,
134     ARG_STR
135 } instr_arg_type_t;
136
137 typedef struct {
138     jsop_t op;
139     instr_arg_t arg1;
140     instr_arg_t arg2;
141 } instr_t;
142
143 typedef struct {
144     instr_t *instrs;
145     jsheap_t heap;
146
147     BSTR *bstr_pool;
148     unsigned bstr_pool_size;
149     unsigned bstr_cnt;
150 } bytecode_t;
151
152 void release_bytecode(bytecode_t*);
153
154 typedef struct _compiler_ctx_t compiler_ctx_t;
155
156 void release_compiler(compiler_ctx_t*);
157
158 typedef struct _parser_ctx_t {
159     LONG ref;
160
161     WCHAR *begin;
162     const WCHAR *end;
163     const WCHAR *ptr;
164
165     script_ctx_t *script;
166     source_elements_t *source;
167     BOOL nl;
168     BOOL is_html;
169     BOOL lexer_error;
170     HRESULT hres;
171
172     jsheap_t heap;
173
174     func_stack_t *func_stack;
175
176     bytecode_t *code;
177     compiler_ctx_t *compiler;
178
179     struct _parser_ctx_t *next;
180 } parser_ctx_t;
181
182 HRESULT script_parse(script_ctx_t*,const WCHAR*,const WCHAR*,parser_ctx_t**) DECLSPEC_HIDDEN;
183 void parser_release(parser_ctx_t*) DECLSPEC_HIDDEN;
184
185 int parser_lex(void*,parser_ctx_t*) DECLSPEC_HIDDEN;
186
187 static inline void parser_addref(parser_ctx_t *ctx)
188 {
189     ctx->ref++;
190 }
191
192 static inline void *parser_alloc(parser_ctx_t *ctx, DWORD size)
193 {
194     return jsheap_alloc(&ctx->heap, size);
195 }
196
197 static inline void *parser_alloc_tmp(parser_ctx_t *ctx, DWORD size)
198 {
199     return jsheap_alloc(&ctx->script->tmp_heap, size);
200 }
201
202 typedef struct _scope_chain_t {
203     LONG ref;
204     jsdisp_t *obj;
205     struct _scope_chain_t *next;
206 } scope_chain_t;
207
208 HRESULT scope_push(scope_chain_t*,jsdisp_t*,scope_chain_t**) DECLSPEC_HIDDEN;
209 void scope_release(scope_chain_t*) DECLSPEC_HIDDEN;
210
211 static inline void scope_addref(scope_chain_t *scope)
212 {
213     scope->ref++;
214 }
215
216 typedef struct _return_type_t return_type_t;
217
218 struct _exec_ctx_t {
219     LONG ref;
220
221     parser_ctx_t *parser;
222     scope_chain_t *scope_chain;
223     jsdisp_t *var_disp;
224     IDispatch *this_obj;
225     BOOL is_global;
226
227     VARIANT *stack;
228     unsigned stack_size;
229     unsigned top;
230
231     unsigned ip;
232     jsexcept_t *ei;
233     return_type_t *rt; /* FIXME */
234 };
235
236 static inline void exec_addref(exec_ctx_t *ctx)
237 {
238     ctx->ref++;
239 }
240
241 void exec_release(exec_ctx_t*) DECLSPEC_HIDDEN;
242 HRESULT create_exec_ctx(script_ctx_t*,IDispatch*,jsdisp_t*,scope_chain_t*,BOOL,exec_ctx_t**) DECLSPEC_HIDDEN;
243 HRESULT exec_source(exec_ctx_t*,parser_ctx_t*,source_elements_t*,BOOL,jsexcept_t*,VARIANT*) DECLSPEC_HIDDEN;
244
245 typedef struct _parameter_t parameter_t;
246
247 HRESULT create_source_function(parser_ctx_t*,parameter_t*,source_elements_t*,scope_chain_t*,
248         const WCHAR*,DWORD,jsdisp_t**) DECLSPEC_HIDDEN;
249
250 typedef enum {
251     LT_INT,
252     LT_DOUBLE,
253     LT_STRING,
254     LT_BOOL,
255     LT_NULL,
256     LT_REGEXP
257 }literal_type_t;
258
259 typedef struct {
260     literal_type_t type;
261     union {
262         LONG lval;
263         double dval;
264         const WCHAR *wstr;
265         VARIANT_BOOL bval;
266         struct {
267             const WCHAR *str;
268             DWORD str_len;
269             DWORD flags;
270         } regexp;
271     } u;
272 } literal_t;
273
274 literal_t *parse_regexp(parser_ctx_t*) DECLSPEC_HIDDEN;
275 literal_t *new_boolean_literal(parser_ctx_t*,VARIANT_BOOL) DECLSPEC_HIDDEN;
276
277 typedef struct _variable_declaration_t {
278     const WCHAR *identifier;
279     expression_t *expr;
280
281     struct _variable_declaration_t *next;
282 } variable_declaration_t;
283
284 typedef HRESULT (*statement_eval_t)(script_ctx_t*,statement_t*,return_type_t*,VARIANT*);
285
286 typedef enum {
287     STAT_BLOCK,
288     STAT_BREAK,
289     STAT_CONTINUE,
290     STAT_EMPTY,
291     STAT_EXPR,
292     STAT_FOR,
293     STAT_FORIN,
294     STAT_IF,
295     STAT_LABEL,
296     STAT_RETURN,
297     STAT_SWITCH,
298     STAT_THROW,
299     STAT_TRY,
300     STAT_VAR,
301     STAT_WHILE,
302     STAT_WITH
303 } statement_type_t;
304
305 struct _statement_t {
306     statement_type_t type;
307     statement_eval_t eval;
308     unsigned instr_off;
309     statement_t *next;
310 };
311
312 typedef struct {
313     statement_t stat;
314     statement_t *stat_list;
315 } block_statement_t;
316
317 typedef struct {
318     statement_t stat;
319     variable_declaration_t *variable_list;
320 } var_statement_t;
321
322 typedef struct {
323     statement_t stat;
324     expression_t *expr;
325 } expression_statement_t;
326
327 typedef struct {
328     statement_t stat;
329     expression_t *expr;
330     statement_t *if_stat;
331     statement_t *else_stat;
332 } if_statement_t;
333
334 typedef struct {
335     statement_t stat;
336     BOOL do_while;
337     expression_t *expr;
338     statement_t *statement;
339 } while_statement_t;
340
341 typedef struct {
342     statement_t stat;
343     variable_declaration_t *variable_list;
344     expression_t *begin_expr;
345     expression_t *expr;
346     expression_t *end_expr;
347     statement_t *statement;
348 } for_statement_t;
349
350 typedef struct {
351     statement_t stat;
352     variable_declaration_t *variable;
353     expression_t *expr;
354     expression_t *in_expr;
355     statement_t *statement;
356 } forin_statement_t;
357
358 typedef struct {
359     statement_t stat;
360     const WCHAR *identifier;
361 } branch_statement_t;
362
363 typedef struct {
364     statement_t stat;
365     expression_t *expr;
366     statement_t *statement;
367 } with_statement_t;
368
369 typedef struct {
370     statement_t stat;
371     const WCHAR *identifier;
372     statement_t *statement;
373 } labelled_statement_t;
374
375 typedef struct _case_clausule_t {
376     expression_t *expr;
377     statement_t *stat;
378
379     struct _case_clausule_t *next;
380 } case_clausule_t;
381
382 typedef struct {
383     statement_t stat;
384     expression_t *expr;
385     case_clausule_t *case_list;
386 } switch_statement_t;
387
388 typedef struct {
389     const WCHAR *identifier;
390     statement_t *statement;
391 } catch_block_t;
392
393 typedef struct {
394     statement_t stat;
395     statement_t *try_statement;
396     catch_block_t *catch_block;
397     statement_t *finally_statement;
398 } try_statement_t;
399
400 HRESULT compiled_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
401 HRESULT var_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
402 HRESULT while_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
403 HRESULT for_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
404 HRESULT forin_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
405 HRESULT continue_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
406 HRESULT break_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
407 HRESULT return_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
408 HRESULT with_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
409 HRESULT labelled_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
410 HRESULT switch_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
411 HRESULT throw_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
412 HRESULT try_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
413
414 typedef struct {
415     enum {
416         EXPRVAL_VARIANT,
417         EXPRVAL_IDREF,
418         EXPRVAL_INVALID
419     } type;
420     union {
421         VARIANT var;
422         struct {
423             IDispatch *disp;
424             DISPID id;
425         } idref;
426         BSTR identifier;
427     } u;
428 } exprval_t;
429
430 typedef enum {
431      EXPR_COMMA,
432      EXPR_OR,
433      EXPR_AND,
434      EXPR_BOR,
435      EXPR_BXOR,
436      EXPR_BAND,
437      EXPR_INSTANCEOF,
438      EXPR_IN,
439      EXPR_ADD,
440      EXPR_SUB,
441      EXPR_MUL,
442      EXPR_DIV,
443      EXPR_MOD,
444      EXPR_DELETE,
445      EXPR_VOID,
446      EXPR_TYPEOF,
447      EXPR_MINUS,
448      EXPR_PLUS,
449      EXPR_POSTINC,
450      EXPR_POSTDEC,
451      EXPR_PREINC,
452      EXPR_PREDEC,
453      EXPR_EQ,
454      EXPR_EQEQ,
455      EXPR_NOTEQ,
456      EXPR_NOTEQEQ,
457      EXPR_LESS,
458      EXPR_LESSEQ,
459      EXPR_GREATER,
460      EXPR_GREATEREQ,
461      EXPR_BITNEG,
462      EXPR_LOGNEG,
463      EXPR_LSHIFT,
464      EXPR_RSHIFT,
465      EXPR_RRSHIFT,
466      EXPR_ASSIGN,
467      EXPR_ASSIGNLSHIFT,
468      EXPR_ASSIGNRSHIFT,
469      EXPR_ASSIGNRRSHIFT,
470      EXPR_ASSIGNADD,
471      EXPR_ASSIGNSUB,
472      EXPR_ASSIGNMUL,
473      EXPR_ASSIGNDIV,
474      EXPR_ASSIGNMOD,
475      EXPR_ASSIGNAND,
476      EXPR_ASSIGNOR,
477      EXPR_ASSIGNXOR,
478      EXPR_COND,
479      EXPR_ARRAY,
480      EXPR_MEMBER,
481      EXPR_NEW,
482      EXPR_CALL,
483      EXPR_THIS,
484      EXPR_FUNC,
485      EXPR_IDENT,
486      EXPR_ARRAYLIT,
487      EXPR_PROPVAL,
488      EXPR_LITERAL
489 } expression_type_t;
490
491 struct _expression_t {
492     expression_type_t type;
493     unsigned instr_off;
494 };
495
496 struct _parameter_t {
497     const WCHAR *identifier;
498
499     struct _parameter_t *next;
500 };
501
502 struct _source_elements_t {
503     statement_t *statement;
504     statement_t *statement_tail;
505     function_declaration_t *functions;
506     var_list_t *variables;
507 };
508
509 struct _function_expression_t {
510     expression_t expr;
511     const WCHAR *identifier;
512     parameter_t *parameter_list;
513     source_elements_t *source_elements;
514     const WCHAR *src_str;
515     DWORD src_len;
516 };
517
518 typedef struct {
519     expression_t expr;
520     expression_t *expression1;
521     expression_t *expression2;
522 } binary_expression_t;
523
524 typedef struct {
525     expression_t expr;
526     expression_t *expression;
527 } unary_expression_t;
528
529 typedef struct {
530     expression_t expr;
531     expression_t *expression;
532     expression_t *true_expression;
533     expression_t *false_expression;
534 } conditional_expression_t;
535
536 typedef struct {
537     expression_t expr;
538     expression_t *expression;
539     const WCHAR *identifier;
540 } member_expression_t;
541
542 typedef struct _argument_t {
543     expression_t *expr;
544
545     struct _argument_t *next;
546 } argument_t;
547
548 typedef struct {
549     expression_t expr;
550     expression_t *expression;
551     argument_t *argument_list;
552 } call_expression_t;
553
554 typedef struct {
555     expression_t expr;
556     const WCHAR *identifier;
557 } identifier_expression_t;
558
559 typedef struct {
560     expression_t expr;
561     literal_t *literal;
562 } literal_expression_t;
563
564 typedef struct _array_element_t {
565     int elision;
566     expression_t *expr;
567
568     struct _array_element_t *next;
569 } array_element_t;
570
571 typedef struct {
572     expression_t expr;
573     array_element_t *element_list;
574     int length;
575 } array_literal_expression_t;
576
577 typedef struct _prop_val_t {
578     literal_t *name;
579     expression_t *value;
580
581     struct _prop_val_t *next;
582 } prop_val_t;
583
584 typedef struct {
585     expression_t expr;
586     prop_val_t *property_list;
587 } property_value_expression_t;
588
589 HRESULT compile_subscript(parser_ctx_t*,expression_t*,BOOL,unsigned*) DECLSPEC_HIDDEN;
590 HRESULT compile_subscript_stat(parser_ctx_t*,statement_t*,BOOL,unsigned*) DECLSPEC_HIDDEN;