wined3d: Fix uploading higher transform matrices.
[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
21 typedef struct _parser_ctx_t {
22     LONG ref;
23
24     const WCHAR *ptr;
25     const WCHAR *begin;
26     const WCHAR *end;
27
28     script_ctx_t *script;
29     source_elements_t *source;
30     BOOL nl;
31     HRESULT hres;
32
33     jsheap_t tmp_heap;
34     jsheap_t heap;
35 } parser_ctx_t;
36
37 HRESULT script_parse(script_ctx_t*,const WCHAR*,parser_ctx_t**);
38 void parser_release(parser_ctx_t*);
39
40 int parser_lex(void*,parser_ctx_t*);
41
42 static inline void parser_addref(parser_ctx_t *ctx)
43 {
44     ctx->ref++;
45 }
46
47 static inline void *parser_alloc(parser_ctx_t *ctx, DWORD size)
48 {
49     return jsheap_alloc(&ctx->heap, size);
50 }
51
52 static inline void *parser_alloc_tmp(parser_ctx_t *ctx, DWORD size)
53 {
54     return jsheap_alloc(&ctx->tmp_heap, size);
55 }
56
57 typedef struct {
58     enum{
59         RT_NORMAL,
60         RT_RETURN,
61         RT_BREAK
62     } type;
63 } return_type_t;
64
65 typedef struct _exec_ctx_t {
66     parser_ctx_t *parser;
67 } exec_ctx_t;
68
69 typedef struct _statement_t statement_t;
70 typedef struct _expression_t expression_t;
71 typedef struct _parameter_t parameter_t;
72
73 typedef struct {
74     VARTYPE vt;
75     union {
76         LONG lval;
77         double dval;
78         const WCHAR *wstr;
79         VARIANT_BOOL bval;
80         IDispatch *disp;
81     } u;
82 } literal_t;
83
84 typedef struct _variable_declaration_t {
85     const WCHAR *identifier;
86     expression_t *expr;
87
88     struct _variable_declaration_t *next;
89 } variable_declaration_t;
90
91 typedef HRESULT (*statement_eval_t)(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
92
93 struct _statement_t {
94     statement_eval_t eval;
95     statement_t *next;
96 };
97
98 typedef struct {
99     statement_t stat;
100     statement_t *stat_list;
101 } block_statement_t;
102
103 typedef struct {
104     statement_t stat;
105     variable_declaration_t *variable_list;
106 } var_statement_t;
107
108 typedef struct {
109     statement_t stat;
110     expression_t *expr;
111 } expression_statement_t;
112
113 typedef struct {
114     statement_t stat;
115     expression_t *expr;
116     statement_t *if_stat;
117     statement_t *else_stat;
118 } if_statement_t;
119
120 typedef struct {
121     statement_t stat;
122     expression_t *expr;
123     statement_t *statement;
124 } while_statement_t;
125
126 typedef struct {
127     statement_t stat;
128     variable_declaration_t *variable_list;
129     expression_t *begin_expr;
130     expression_t *expr;
131     expression_t *end_expr;
132     statement_t *statement;
133 } for_statement_t;
134
135 typedef struct {
136     statement_t stat;
137     variable_declaration_t *variable;
138     expression_t *expr;
139     expression_t *in_expr;
140     statement_t *statement;
141 } forin_statement_t;
142
143 typedef struct {
144     statement_t stat;
145     const WCHAR *identifier;
146 } branch_statement_t;
147
148 typedef struct {
149     statement_t stat;
150     expression_t *expr;
151     statement_t *statement;
152 } with_statement_t;
153
154 typedef struct {
155     statement_t stat;
156     const WCHAR *identifier;
157     statement_t *statement;
158 } labelled_statement_t;
159
160 typedef struct _case_clausule_t {
161     expression_t *expr;
162     statement_t *stat;
163
164     struct _case_clausule_t *next;
165 } case_clausule_t;
166
167 typedef struct {
168     statement_t stat;
169     expression_t *expr;
170     case_clausule_t *case_list;
171 } switch_statement_t;
172
173 typedef struct {
174     const WCHAR *identifier;
175     statement_t *statement;
176 } catch_block_t;
177
178 typedef struct {
179     statement_t stat;
180     statement_t *try_statement;
181     catch_block_t *catch_block;
182     statement_t *finally_statement;
183 } try_statement_t;
184
185 HRESULT block_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
186 HRESULT var_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
187 HRESULT empty_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
188 HRESULT expression_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
189 HRESULT if_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
190 HRESULT dowhile_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
191 HRESULT while_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
192 HRESULT for_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
193 HRESULT forin_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
194 HRESULT continue_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
195 HRESULT break_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
196 HRESULT return_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
197 HRESULT with_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
198 HRESULT labelled_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
199 HRESULT switch_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
200 HRESULT throw_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
201 HRESULT try_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
202
203 typedef struct exprval_t exprval_t;
204 typedef struct jsexcept_t jsexcept_t;
205
206 typedef HRESULT (*expression_eval_t)(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
207
208 struct _expression_t {
209     expression_eval_t eval;
210 };
211
212 struct _parameter_t {
213     const WCHAR *identifier;
214
215     struct _parameter_t *next;
216 };
217
218 typedef struct _function_declaration_t {
219     const WCHAR *identifier;
220     parameter_t *parameter_list;
221     source_elements_t *source_elements;
222
223     struct _function_declaration_t *next;
224 } function_declaration_t;
225
226 struct _source_elements_t {
227     statement_t *statement;
228     statement_t *statement_tail;
229     function_declaration_t *functions;
230     function_declaration_t *functions_tail;
231 };
232
233 typedef struct {
234     expression_t expr;
235     const WCHAR *identifier;
236     parameter_t *parameter_list;
237     source_elements_t *source_elements;
238 } function_expression_t;
239
240 typedef struct {
241     expression_t expr;
242     expression_t *expression1;
243     expression_t *expression2;
244 } binary_expression_t;
245
246 typedef struct {
247     expression_t expr;
248     expression_t *expression;
249 } unary_expression_t;
250
251 typedef struct {
252     expression_t expr;
253     expression_t *expression;
254     expression_t *true_expression;
255     expression_t *false_expression;
256 } conditional_expression_t;
257
258 typedef struct {
259     expression_t expr;
260     expression_t *member_expr;
261     expression_t *expression;
262 } array_expression_t;
263
264 typedef struct {
265     expression_t expr;
266     expression_t *expression;
267     const WCHAR *identifier;
268 } member_expression_t;
269
270 typedef struct _argument_t {
271     expression_t *expr;
272
273     struct _argument_t *next;
274 } argument_t;
275
276 typedef struct {
277     expression_t expr;
278     expression_t *expression;
279     argument_t *argument_list;
280 } call_expression_t;
281
282 typedef struct {
283     expression_t expr;
284     const WCHAR *identifier;
285 } identifier_expression_t;
286
287 typedef struct {
288     expression_t expr;
289     literal_t *literal;
290 } literal_expression_t;
291
292 typedef struct _array_element_t {
293     int elision;
294     expression_t *expr;
295
296     struct _array_element_t *next;
297 } array_element_t;
298
299 typedef struct {
300     expression_t expr;
301     array_element_t *element_list;
302     int length;
303 } array_literal_expression_t;
304
305 typedef struct _prop_val_t {
306     literal_t *name;
307     expression_t *value;
308
309     struct _prop_val_t *next;
310 } prop_val_t;
311
312 typedef struct {
313     expression_t expr;
314     prop_val_t *property_list;
315 } property_value_expression_t;
316
317 typedef enum {
318      EXPR_COMMA,
319      EXPR_OR,
320      EXPR_AND,
321      EXPR_BOR,
322      EXPR_BXOR,
323      EXPR_BAND,
324      EXPR_INSTANCEOF,
325      EXPR_IN,
326      EXPR_ADD,
327      EXPR_SUB,
328      EXPR_MUL,
329      EXPR_DIV,
330      EXPR_MOD,
331      EXPR_DELETE,
332      EXPR_VOID,
333      EXPR_TYPEOF,
334      EXPR_MINUS,
335      EXPR_PLUS,
336      EXPR_POSTINC,
337      EXPR_POSTDEC,
338      EXPR_PREINC,
339      EXPR_PREDEC,
340      EXPR_NEW,
341      EXPR_EQ,
342      EXPR_EQEQ,
343      EXPR_NOTEQ,
344      EXPR_NOTEQEQ,
345      EXPR_LESS,
346      EXPR_LESSEQ,
347      EXPR_GREATER,
348      EXPR_GREATEREQ,
349      EXPR_BITNEG,
350      EXPR_LOGNEG,
351      EXPR_LSHIFT,
352      EXPR_RSHIFT,
353      EXPR_RRSHIFT,
354      EXPR_ASSIGN,
355      EXPR_ASSIGNLSHIFT,
356      EXPR_ASSIGNRSHIFT,
357      EXPR_ASSIGNRRSHIFT,
358      EXPR_ASSIGNADD,
359      EXPR_ASSIGNSUB,
360      EXPR_ASSIGNMUL,
361      EXPR_ASSIGNDIV,
362      EXPR_ASSIGNMOD,
363      EXPR_ASSIGNAND,
364      EXPR_ASSIGNOR,
365      EXPR_ASSIGNXOR
366 } expression_type_t;
367
368 HRESULT function_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
369 HRESULT conditional_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
370 HRESULT array_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
371 HRESULT member_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
372 HRESULT member_new_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
373 HRESULT call_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
374 HRESULT this_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
375 HRESULT identifier_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
376 HRESULT literal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
377 HRESULT array_literal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
378 HRESULT property_value_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
379
380 HRESULT comma_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
381 HRESULT logical_or_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
382 HRESULT logical_and_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
383 HRESULT binary_or_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
384 HRESULT binary_xor_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
385 HRESULT binary_and_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
386 HRESULT instanceof_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
387 HRESULT in_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
388 HRESULT add_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
389 HRESULT sub_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
390 HRESULT mul_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
391 HRESULT div_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
392 HRESULT mod_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
393 HRESULT delete_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
394 HRESULT void_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
395 HRESULT typeof_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
396 HRESULT minus_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
397 HRESULT plus_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
398 HRESULT post_increment_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
399 HRESULT post_decrement_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
400 HRESULT pre_increment_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
401 HRESULT pre_decrement_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
402 HRESULT new_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
403 HRESULT equal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
404 HRESULT equal2_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
405 HRESULT not_equal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
406 HRESULT not_equal2_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
407 HRESULT less_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
408 HRESULT lesseq_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
409 HRESULT greater_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
410 HRESULT greatereq_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
411 HRESULT binary_negation_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
412 HRESULT logical_negation_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
413 HRESULT left_shift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
414 HRESULT right_shift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
415 HRESULT right2_shift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
416 HRESULT assign_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
417 HRESULT assign_lshift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
418 HRESULT assign_rshift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
419 HRESULT assign_rrshift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
420 HRESULT assign_add_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
421 HRESULT assign_sub_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
422 HRESULT assign_mul_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
423 HRESULT assign_div_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
424 HRESULT assign_mod_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
425 HRESULT assign_and_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
426 HRESULT assign_or_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
427 HRESULT assign_xor_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);