vbscript: Added beginning interpreter 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 HRESULT exec_script(script_ctx_t*,function_t*) DECLSPEC_HIDDEN;
97
98 HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**);
99
100 static inline void *heap_alloc(size_t len)
101 {
102     return HeapAlloc(GetProcessHeap(), 0, len);
103 }
104
105 static inline void *heap_alloc_zero(size_t len)
106 {
107     return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
108 }
109
110 static inline void *heap_realloc(void *mem, size_t len)
111 {
112     return HeapReAlloc(GetProcessHeap(), 0, mem, len);
113 }
114
115 static inline BOOL heap_free(void *mem)
116 {
117     return HeapFree(GetProcessHeap(), 0, mem);
118 }
119
120 static inline LPWSTR heap_strdupW(LPCWSTR str)
121 {
122     LPWSTR ret = NULL;
123
124     if(str) {
125         DWORD size;
126
127         size = (strlenW(str)+1)*sizeof(WCHAR);
128         ret = heap_alloc(size);
129         if(ret)
130             memcpy(ret, str, size);
131     }
132
133     return ret;
134 }