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