jscript: Added parser.
[wine] / dlls / jscript / jscript.c
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 #include "jscript.h"
20 #include "engine.h"
21 #include "objsafe.h"
22
23 #include "wine/debug.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(jscript);
26
27 typedef struct {
28     const IActiveScriptVtbl                 *lpIActiveScriptVtbl;
29     const IActiveScriptParseVtbl            *lpIActiveScriptParseVtbl;
30     const IActiveScriptParseProcedure2Vtbl  *lpIActiveScriptParseProcedure2Vtbl;
31     const IActiveScriptPropertyVtbl         *lpIActiveScriptPropertyVtbl;
32     const IObjectSafetyVtbl                 *lpIObjectSafetyVtbl;
33
34     LONG ref;
35
36     DWORD safeopt;
37     script_ctx_t *ctx;
38     LONG thread_id;
39
40     IActiveScriptSite *site;
41 } JScript;
42
43 #define ACTSCRIPT(x)    ((IActiveScript*)                 &(x)->lpIActiveScriptVtbl)
44 #define ASPARSE(x)      ((IActiveScriptParse*)            &(x)->lpIActiveScriptParseVtbl)
45 #define ASPARSEPROC(x)  ((IActiveScriptParseProcedure2*)  &(x)->lpIActiveScriptParseProcedure2Vtbl)
46 #define ACTSCPPROP(x)   ((IActiveScriptProperty*)         &(x)->lpIActiveScriptPropertyVtbl)
47 #define OBJSAFETY(x)    ((IObjectSafety*)                 &(x)->lpIObjectSafetyVtbl)
48
49 void script_release(script_ctx_t *ctx)
50 {
51     if(--ctx->ref)
52         return;
53
54     heap_free(ctx);
55 }
56
57 static void change_state(JScript *This, SCRIPTSTATE state)
58 {
59     if(This->ctx->state == state)
60         return;
61
62     This->ctx->state = state;
63     IActiveScriptSite_OnStateChange(This->site, state);
64 }
65
66 #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface)
67
68 static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
69 {
70     JScript *This = ACTSCRIPT_THIS(iface);
71
72     *ppv = NULL;
73
74     if(IsEqualGUID(riid, &IID_IUnknown)) {
75         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
76         *ppv = ACTSCRIPT(This);
77     }else if(IsEqualGUID(riid, &IID_IActiveScript)) {
78         TRACE("(%p)->(IID_IActiveScript %p)\n", This, ppv);
79         *ppv = ACTSCRIPT(This);
80     }else if(IsEqualGUID(riid, &IID_IActiveScriptParse)) {
81         TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This, ppv);
82         *ppv = ASPARSE(This);
83     }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure)) {
84         TRACE("(%p)->(IID_IActiveScriptParseProcedure %p)\n", This, ppv);
85         *ppv = ASPARSEPROC(This);
86     }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure2)) {
87         TRACE("(%p)->(IID_IActiveScriptParseProcedure2 %p)\n", This, ppv);
88         *ppv = ASPARSEPROC(This);
89     }else if(IsEqualGUID(riid, &IID_IActiveScriptProperty)) {
90         TRACE("(%p)->(IID_IActiveScriptProperty %p)\n", This, ppv);
91         *ppv = ACTSCPPROP(This);
92     }else if(IsEqualGUID(riid, &IID_IObjectSafety)) {
93         TRACE("(%p)->(IID_IObjectSafety %p)\n", This, ppv);
94         *ppv = OBJSAFETY(This);
95     }
96
97     if(*ppv) {
98         IUnknown_AddRef((IUnknown*)*ppv);
99         return S_OK;
100     }
101
102     FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
103     return E_NOINTERFACE;
104 }
105
106 static ULONG WINAPI JScript_AddRef(IActiveScript *iface)
107 {
108     JScript *This = ACTSCRIPT_THIS(iface);
109     LONG ref = InterlockedIncrement(&This->ref);
110
111     TRACE("(%p) ref=%d\n", This, ref);
112
113     return ref;
114 }
115
116 static ULONG WINAPI JScript_Release(IActiveScript *iface)
117 {
118     JScript *This = ACTSCRIPT_THIS(iface);
119     LONG ref = InterlockedDecrement(&This->ref);
120
121     TRACE("(%p) ref=%d\n", iface, ref);
122
123     if(!ref) {
124         if(This->ctx && This->ctx->state != SCRIPTSTATE_CLOSED)
125             IActiveScript_Close(ACTSCRIPT(This));
126         if(This->ctx)
127             script_release(This->ctx);
128         heap_free(This);
129         unlock_module();
130     }
131
132     return ref;
133 }
134
135 static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
136                                             IActiveScriptSite *pass)
137 {
138     JScript *This = ACTSCRIPT_THIS(iface);
139     LCID lcid;
140     HRESULT hres;
141
142     TRACE("(%p)->(%p)\n", This, pass);
143
144     if(!pass)
145         return E_POINTER;
146
147     if(This->site)
148         return E_UNEXPECTED;
149
150     if(!This->ctx) {
151         hres = IActiveScriptParse_InitNew(ASPARSE(This));
152         if(FAILED(hres))
153             return hres;
154     }
155
156     hres = create_dispex(This->ctx, &This->ctx->script_disp);
157     if(FAILED(hres))
158         return hres;
159
160     if(InterlockedCompareExchange(&This->thread_id, GetCurrentThreadId(), 0))
161         return E_UNEXPECTED;
162
163     This->site = pass;
164     IActiveScriptSite_AddRef(This->site);
165
166     hres = IActiveScriptSite_GetLCID(This->site, &lcid);
167     if(hres == S_OK)
168         This->ctx->lcid = lcid;
169
170     change_state(This, SCRIPTSTATE_INITIALIZED);
171     return S_OK;
172 }
173
174 static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid,
175                                             void **ppvObject)
176 {
177     JScript *This = ACTSCRIPT_THIS(iface);
178     FIXME("(%p)->()\n", This);
179     return E_NOTIMPL;
180 }
181
182 static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
183 {
184     JScript *This = ACTSCRIPT_THIS(iface);
185     FIXME("(%p)->(%d)\n", This, ss);
186     return E_NOTIMPL;
187 }
188
189 static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
190 {
191     JScript *This = ACTSCRIPT_THIS(iface);
192
193     TRACE("(%p)->(%p)\n", This, pssState);
194
195     if(!pssState)
196         return E_POINTER;
197
198     if(!This->thread_id) {
199         *pssState = SCRIPTSTATE_UNINITIALIZED;
200         return S_OK;
201     }
202
203     if(This->thread_id != GetCurrentThreadId())
204         return E_UNEXPECTED;
205
206     *pssState = This->ctx ? This->ctx->state : SCRIPTSTATE_UNINITIALIZED;
207     return S_OK;
208 }
209
210 static HRESULT WINAPI JScript_Close(IActiveScript *iface)
211 {
212     JScript *This = ACTSCRIPT_THIS(iface);
213
214     TRACE("(%p)->()\n", This);
215
216     if(This->thread_id != GetCurrentThreadId())
217         return E_UNEXPECTED;
218
219     if(This->ctx) {
220         change_state(This, SCRIPTSTATE_CLOSED);
221
222         if(This->ctx->script_disp) {
223             IDispatchEx_Release(_IDispatchEx_(This->ctx->script_disp));
224             This->ctx->script_disp = NULL;
225         }
226     }
227
228     if(This->site) {
229         IActiveScriptSite_Release(This->site);
230         This->site = NULL;
231     }
232
233     return S_OK;
234 }
235
236 static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface,
237                                            LPCOLESTR pstrName, DWORD dwFlags)
238 {
239     JScript *This = ACTSCRIPT_THIS(iface);
240     FIXME("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags);
241     return E_NOTIMPL;
242 }
243
244 static HRESULT WINAPI JScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib,
245                                          DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
246 {
247     JScript *This = ACTSCRIPT_THIS(iface);
248     FIXME("(%p)->()\n", This);
249     return E_NOTIMPL;
250 }
251
252 static HRESULT WINAPI JScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName,
253                                                 IDispatch **ppdisp)
254 {
255     JScript *This = ACTSCRIPT_THIS(iface);
256
257     TRACE("(%p)->(%p)\n", This, ppdisp);
258
259     if(!ppdisp)
260         return E_POINTER;
261
262     if(This->thread_id != GetCurrentThreadId() || !This->ctx->script_disp) {
263         *ppdisp = NULL;
264         return E_UNEXPECTED;
265     }
266
267     *ppdisp = (IDispatch*)_IDispatchEx_(This->ctx->script_disp);
268     IDispatch_AddRef(*ppdisp);
269     return S_OK;
270 }
271
272 static HRESULT WINAPI JScript_GetCurrentScriptThreadID(IActiveScript *iface,
273                                                        SCRIPTTHREADID *pstridThread)
274 {
275     JScript *This = ACTSCRIPT_THIS(iface);
276     FIXME("(%p)->()\n", This);
277     return E_NOTIMPL;
278 }
279
280 static HRESULT WINAPI JScript_GetScriptThreadID(IActiveScript *iface,
281                                                 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
282 {
283     JScript *This = ACTSCRIPT_THIS(iface);
284     FIXME("(%p)->()\n", This);
285     return E_NOTIMPL;
286 }
287
288 static HRESULT WINAPI JScript_GetScriptThreadState(IActiveScript *iface,
289         SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
290 {
291     JScript *This = ACTSCRIPT_THIS(iface);
292     FIXME("(%p)->()\n", This);
293     return E_NOTIMPL;
294 }
295
296 static HRESULT WINAPI JScript_InterruptScriptThread(IActiveScript *iface,
297         SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
298 {
299     JScript *This = ACTSCRIPT_THIS(iface);
300     FIXME("(%p)->()\n", This);
301     return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI JScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
305 {
306     JScript *This = ACTSCRIPT_THIS(iface);
307     FIXME("(%p)->()\n", This);
308     return E_NOTIMPL;
309 }
310
311 #undef ACTSCRIPT_THIS
312
313 static const IActiveScriptVtbl JScriptVtbl = {
314     JScript_QueryInterface,
315     JScript_AddRef,
316     JScript_Release,
317     JScript_SetScriptSite,
318     JScript_GetScriptSite,
319     JScript_SetScriptState,
320     JScript_GetScriptState,
321     JScript_Close,
322     JScript_AddNamedItem,
323     JScript_AddTypeLib,
324     JScript_GetScriptDispatch,
325     JScript_GetCurrentScriptThreadID,
326     JScript_GetScriptThreadID,
327     JScript_GetScriptThreadState,
328     JScript_InterruptScriptThread,
329     JScript_Clone
330 };
331
332 #define ASPARSE_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
333
334 static HRESULT WINAPI JScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
335 {
336     JScript *This = ASPARSE_THIS(iface);
337     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
338 }
339
340 static ULONG WINAPI JScriptParse_AddRef(IActiveScriptParse *iface)
341 {
342     JScript *This = ASPARSE_THIS(iface);
343     return IActiveScript_AddRef(ACTSCRIPT(This));
344 }
345
346 static ULONG WINAPI JScriptParse_Release(IActiveScriptParse *iface)
347 {
348     JScript *This = ASPARSE_THIS(iface);
349     return IActiveScript_Release(ACTSCRIPT(This));
350 }
351
352 static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
353 {
354     JScript *This = ASPARSE_THIS(iface);
355     script_ctx_t *ctx;
356
357     TRACE("(%p)\n", This);
358
359     if(This->ctx)
360         return E_UNEXPECTED;
361
362     ctx = heap_alloc_zero(sizeof(script_ctx_t));
363     if(!ctx)
364         return E_OUTOFMEMORY;
365
366     ctx->ref = 1;
367     ctx->state = SCRIPTSTATE_UNINITIALIZED;
368
369     ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL);
370     if(ctx) {
371         script_release(ctx);
372         return E_UNEXPECTED;
373     }
374
375     return S_OK;
376 }
377
378 static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface,
379         LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
380         LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
381         DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
382         BSTR *pbstrName, EXCEPINFO *pexcepinfo)
383 {
384     JScript *This = ASPARSE_THIS(iface);
385     FIXME("(%p)->(%s %s %s %s %s %s %x %u %x %p %p)\n", This, debugstr_w(pstrDefaultName),
386           debugstr_w(pstrCode), debugstr_w(pstrItemName), debugstr_w(pstrSubItemName),
387           debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), dwSourceContextCookie,
388           ulStartingLineNumber, dwFlags, pbstrName, pexcepinfo);
389     return E_NOTIMPL;
390 }
391
392 static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
393         LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
394         LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLine,
395         DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
396 {
397     JScript *This = ASPARSE_THIS(iface);
398     parser_ctx_t *parser_ctx;
399     HRESULT hres;
400
401     FIXME("(%p)->(%s %s %p %s %x %u %x %p %p)\n", This, debugstr_w(pstrCode),
402           debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
403           dwSourceContextCookie, ulStartingLine, dwFlags, pvarResult, pexcepinfo);
404
405     hres = script_parse(This->ctx, pstrCode, &parser_ctx);
406     if(FAILED(hres))
407         return hres;
408
409     parser_release(parser_ctx);
410     return E_NOTIMPL;
411 }
412
413 #undef ASPARSE_THIS
414
415 static const IActiveScriptParseVtbl JScriptParseVtbl = {
416     JScriptParse_QueryInterface,
417     JScriptParse_AddRef,
418     JScriptParse_Release,
419     JScriptParse_InitNew,
420     JScriptParse_AddScriptlet,
421     JScriptParse_ParseScriptText
422 };
423
424 #define ASPARSEPROC_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
425
426 static HRESULT WINAPI JScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2 *iface, REFIID riid, void **ppv)
427 {
428     JScript *This = ASPARSEPROC_THIS(iface);
429     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
430 }
431
432 static ULONG WINAPI JScriptParseProcedure_AddRef(IActiveScriptParseProcedure2 *iface)
433 {
434     JScript *This = ASPARSEPROC_THIS(iface);
435     return IActiveScript_AddRef(ACTSCRIPT(This));
436 }
437
438 static ULONG WINAPI JScriptParseProcedure_Release(IActiveScriptParseProcedure2 *iface)
439 {
440     JScript *This = ASPARSEPROC_THIS(iface);
441     return IActiveScript_Release(ACTSCRIPT(This));
442 }
443
444 static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface,
445         LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName,
446         LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter,
447         DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
448 {
449     JScript *This = ASPARSEPROC_THIS(iface);
450     FIXME("(%p)->()\n", This);
451     return E_NOTIMPL;
452 }
453
454 #undef ASPARSEPROC_THIS
455
456 static const IActiveScriptParseProcedure2Vtbl JScriptParseProcedureVtbl = {
457     JScriptParseProcedure_QueryInterface,
458     JScriptParseProcedure_AddRef,
459     JScriptParseProcedure_Release,
460     JScriptParseProcedure_ParseProcedureText,
461 };
462
463 #define ACTSCPPROP_THIS(iface) DEFINE_THIS(JScript, IActiveScriptProperty, iface)
464
465 static HRESULT WINAPI JScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv)
466 {
467     JScript *This = ACTSCPPROP_THIS(iface);
468     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
469 }
470
471 static ULONG WINAPI JScriptProperty_AddRef(IActiveScriptProperty *iface)
472 {
473     JScript *This = ACTSCPPROP_THIS(iface);
474     return IActiveScript_AddRef(ACTSCRIPT(This));
475 }
476
477 static ULONG WINAPI JScriptProperty_Release(IActiveScriptProperty *iface)
478 {
479     JScript *This = ACTSCPPROP_THIS(iface);
480     return IActiveScript_Release(ACTSCRIPT(This));
481 }
482
483 static HRESULT WINAPI JScriptProperty_GetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
484         VARIANT *pvarIndex, VARIANT *pvarValue)
485 {
486     JScript *This = ACTSCPPROP_THIS(iface);
487     FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
488     return E_NOTIMPL;
489 }
490
491 static HRESULT WINAPI JScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
492         VARIANT *pvarIndex, VARIANT *pvarValue)
493 {
494     JScript *This = ACTSCPPROP_THIS(iface);
495     FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
496     return E_NOTIMPL;
497 }
498
499 #undef ACTSCPPROP_THIS
500
501 static const IActiveScriptPropertyVtbl JScriptPropertyVtbl = {
502     JScriptProperty_QueryInterface,
503     JScriptProperty_AddRef,
504     JScriptProperty_Release,
505     JScriptProperty_GetProperty,
506     JScriptProperty_SetProperty
507 };
508
509 #define OBJSAFETY_THIS(iface) DEFINE_THIS(JScript, IObjectSafety, iface)
510
511 static HRESULT WINAPI JScriptSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
512 {
513     JScript *This = OBJSAFETY_THIS(iface);
514     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
515 }
516
517 static ULONG WINAPI JScriptSafety_AddRef(IObjectSafety *iface)
518 {
519     JScript *This = OBJSAFETY_THIS(iface);
520     return IActiveScript_AddRef(ACTSCRIPT(This));
521 }
522
523 static ULONG WINAPI JScriptSafety_Release(IObjectSafety *iface)
524 {
525     JScript *This = OBJSAFETY_THIS(iface);
526     return IActiveScript_Release(ACTSCRIPT(This));
527 }
528
529 #define SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
530
531 static HRESULT WINAPI JScriptSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
532         DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
533 {
534     JScript *This = OBJSAFETY_THIS(iface);
535
536     TRACE("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
537
538     if(!pdwSupportedOptions || !pdwEnabledOptions)
539         return E_POINTER;
540
541     *pdwSupportedOptions = SUPPORTED_OPTIONS;
542     *pdwEnabledOptions = This->safeopt;
543
544     return S_OK;
545 }
546
547 static HRESULT WINAPI JScriptSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
548         DWORD dwOptionSetMask, DWORD dwEnabledOptions)
549 {
550     JScript *This = OBJSAFETY_THIS(iface);
551
552     TRACE("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
553
554     if(dwOptionSetMask & ~SUPPORTED_OPTIONS)
555         return E_FAIL;
556
557     This->safeopt = dwEnabledOptions & dwEnabledOptions;
558     return S_OK;
559 }
560
561 #undef OBJSAFETY_THIS
562
563 static const IObjectSafetyVtbl JScriptSafetyVtbl = {
564     JScriptSafety_QueryInterface,
565     JScriptSafety_AddRef,
566     JScriptSafety_Release,
567     JScriptSafety_GetInterfaceSafetyOptions,
568     JScriptSafety_SetInterfaceSafetyOptions
569 };
570
571 HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter,
572                                              REFIID riid, void **ppv)
573 {
574     JScript *ret;
575     HRESULT hres;
576
577     TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
578
579     lock_module();
580
581     ret = heap_alloc_zero(sizeof(*ret));
582
583     ret->lpIActiveScriptVtbl                 = &JScriptVtbl;
584     ret->lpIActiveScriptParseVtbl            = &JScriptParseVtbl;
585     ret->lpIActiveScriptParseProcedure2Vtbl  = &JScriptParseProcedureVtbl;
586     ret->lpIActiveScriptPropertyVtbl         = &JScriptPropertyVtbl;
587     ret->lpIObjectSafetyVtbl                 = &JScriptSafetyVtbl;
588     ret->ref = 1;
589     ret->safeopt = INTERFACE_USES_DISPEX;
590
591     hres = IActiveScript_QueryInterface(ACTSCRIPT(ret), riid, ppv);
592     IActiveScript_Release(ACTSCRIPT(ret));
593     return hres;
594 }