vbscript: Added beginning bytecode compiler implementation.
[wine] / dlls / vbscript / vbscript.h
1 /*
2  * Copyright 2011 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 #include <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "ole2.h"
26 #include "dispex.h"
27 #include "activscp.h"
28
29 #include "vbscript_classes.h"
30
31 #include "wine/list.h"
32 #include "wine/unicode.h"
33
34 typedef struct _function_t function_t;
35 typedef struct _vbscode_t vbscode_t;
36
37 typedef struct named_item_t {
38     IDispatch *disp;
39     DWORD flags;
40     LPWSTR name;
41
42     struct list entry;
43 } named_item_t;
44
45 typedef struct {
46     IDispatchEx IDispatchEx_iface;
47
48     LONG ref;
49 } vbdisp_t;
50
51 typedef struct {
52     IActiveScriptSite *site;
53     LCID lcid;
54
55     IDispatch *host_global;
56
57     vbdisp_t *script_obj;
58
59     struct list code_list;
60     struct list named_items;
61 } script_ctx_t;
62
63 HRESULT init_global(script_ctx_t*);
64
65 #define OP_LIST \
66     X(ret, 0)
67
68 typedef enum {
69 #define X(x,n) OP_##x,
70 OP_LIST
71 #undef X
72     OP_LAST
73 } vbsop_t;
74
75 typedef struct {
76     vbsop_t op;
77 } instr_t;
78
79 struct _function_t {
80     unsigned code_off;
81     vbscode_t *code_ctx;
82 };
83
84 struct _vbscode_t {
85     instr_t *instrs;
86     WCHAR *source;
87
88     BOOL global_executed;
89     function_t global_code;
90
91     struct list entry;
92 };
93
94 void release_vbscode(vbscode_t*) DECLSPEC_HIDDEN;
95 HRESULT compile_script(script_ctx_t*,const WCHAR*,vbscode_t**) DECLSPEC_HIDDEN;
96
97 HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**);
98
99 static inline void *heap_alloc(size_t len)
100 {
101     return HeapAlloc(GetProcessHeap(), 0, len);
102 }
103
104 static inline void *heap_alloc_zero(size_t len)
105 {
106     return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
107 }
108
109 static inline void *heap_realloc(void *mem, size_t len)
110 {
111     return HeapReAlloc(GetProcessHeap(), 0, mem, len);
112 }
113
114 static inline BOOL heap_free(void *mem)
115 {
116     return HeapFree(GetProcessHeap(), 0, mem);
117 }
118
119 static inline LPWSTR heap_strdupW(LPCWSTR str)
120 {
121     LPWSTR ret = NULL;
122
123     if(str) {
124         DWORD size;
125
126         size = (strlenW(str)+1)*sizeof(WCHAR);
127         ret = heap_alloc(size);
128         if(ret)
129             memcpy(ret, str, size);
130     }
131
132     return ret;
133 }