2 * Copyright 2008 Jacek Caban for CodeWeavers
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.
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.
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
25 #include "wine/debug.h"
27 WINE_DEFAULT_DEBUG_CHANNEL(jscript
);
31 #define CTXARG_T DWORDLONG
32 #define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
33 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_64Vtbl
37 #define CTXARG_T DWORD
38 #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
39 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_32Vtbl
44 IActiveScript IActiveScript_iface
;
45 IActiveScriptParse IActiveScriptParse_iface
;
46 IActiveScriptParseProcedure2 IActiveScriptParseProcedure2_iface
;
47 IActiveScriptProperty IActiveScriptProperty_iface
;
48 IObjectSafety IObjectSafety_iface
;
49 IVariantChangeType IVariantChangeType_iface
;
50 IWineJScript IWineJScript_iface
;
55 struct thread_data
*thread_data
;
63 IActiveScriptSite
*site
;
65 struct list persistent_code
;
66 struct list queued_code
;
70 IActiveScriptError IActiveScriptError_iface
;
75 void script_release(script_ctx_t
*ctx
)
80 jsval_release(ctx
->acc
);
83 heap_pool_free(&ctx
->tmp_heap
);
85 jsstr_release(ctx
->last_match
);
86 assert(!ctx
->stack_top
);
89 ctx
->jscaller
->ctx
= NULL
;
90 IServiceProvider_Release(&ctx
->jscaller
->IServiceProvider_iface
);
92 release_thread_data(ctx
->thread_data
);
96 static void script_globals_release(script_ctx_t
*ctx
)
99 for(i
= 0; i
< ARRAY_SIZE(ctx
->global_objects
); i
++) {
100 if(ctx
->global_objects
[i
]) {
101 jsdisp_release(ctx
->global_objects
[i
]);
102 ctx
->global_objects
[i
] = NULL
;
107 static void change_state(JScript
*This
, SCRIPTSTATE state
)
109 if(This
->ctx
->state
== state
)
112 This
->ctx
->state
= state
;
114 IActiveScriptSite_OnStateChange(This
->site
, state
);
117 static inline BOOL
is_started(script_ctx_t
*ctx
)
119 return ctx
->state
== SCRIPTSTATE_STARTED
120 || ctx
->state
== SCRIPTSTATE_CONNECTED
121 || ctx
->state
== SCRIPTSTATE_DISCONNECTED
;
124 HRESULT
create_named_item_script_obj(script_ctx_t
*ctx
, named_item_t
*item
)
126 static const builtin_info_t disp_info
= { .class = JSCLASS_GLOBAL
};
127 return create_dispex(ctx
, &disp_info
, NULL
, &item
->script_obj
);
130 static void release_named_item_script_obj(named_item_t
*item
)
132 if(!item
->script_obj
) return;
134 jsdisp_release(item
->script_obj
);
135 item
->script_obj
= NULL
;
138 static HRESULT
retrieve_named_item_disp(IActiveScriptSite
*site
, named_item_t
*item
)
146 hr
= IActiveScriptSite_GetItemInfo(site
, item
->name
, SCRIPTINFO_IUNKNOWN
, &unk
, NULL
);
148 WARN("GetItemInfo failed: %08lx\n", hr
);
152 hr
= IUnknown_QueryInterface(unk
, &IID_IDispatch
, (void**)&item
->disp
);
153 IUnknown_Release(unk
);
155 WARN("object does not implement IDispatch\n");
162 named_item_t
*lookup_named_item(script_ctx_t
*ctx
, const WCHAR
*item_name
, unsigned flags
)
167 LIST_FOR_EACH_ENTRY(item
, &ctx
->named_items
, named_item_t
, entry
) {
168 if((item
->flags
& flags
) == flags
&& !wcscmp(item
->name
, item_name
)) {
169 if(!item
->script_obj
&& !(item
->flags
& SCRIPTITEM_GLOBALMEMBERS
)) {
170 hr
= create_named_item_script_obj(ctx
, item
);
171 if(FAILED(hr
)) return NULL
;
174 if(!item
->disp
&& (flags
|| !(item
->flags
& SCRIPTITEM_CODEONLY
))) {
175 hr
= retrieve_named_item_disp(ctx
->site
, item
);
176 if(FAILED(hr
)) continue;
186 void release_named_item(named_item_t
*item
)
188 if(--item
->ref
) return;
194 static inline JScriptError
*impl_from_IActiveScriptError(IActiveScriptError
*iface
)
196 return CONTAINING_RECORD(iface
, JScriptError
, IActiveScriptError_iface
);
199 static HRESULT WINAPI
JScriptError_QueryInterface(IActiveScriptError
*iface
, REFIID riid
, void **ppv
)
201 JScriptError
*This
= impl_from_IActiveScriptError(iface
);
203 if(IsEqualGUID(riid
, &IID_IUnknown
)) {
204 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
205 *ppv
= &This
->IActiveScriptError_iface
;
206 }else if(IsEqualGUID(riid
, &IID_IActiveScriptError
)) {
207 TRACE("(%p)->(IID_IActiveScriptError %p)\n", This
, ppv
);
208 *ppv
= &This
->IActiveScriptError_iface
;
210 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
212 return E_NOINTERFACE
;
215 IUnknown_AddRef((IUnknown
*)*ppv
);
219 static ULONG WINAPI
JScriptError_AddRef(IActiveScriptError
*iface
)
221 JScriptError
*This
= impl_from_IActiveScriptError(iface
);
222 LONG ref
= InterlockedIncrement(&This
->ref
);
224 TRACE("(%p) ref=%ld\n", This
, ref
);
229 static ULONG WINAPI
JScriptError_Release(IActiveScriptError
*iface
)
231 JScriptError
*This
= impl_from_IActiveScriptError(iface
);
232 LONG ref
= InterlockedDecrement(&This
->ref
);
234 TRACE("(%p) ref=%ld\n", This
, ref
);
244 static HRESULT WINAPI
JScriptError_GetExceptionInfo(IActiveScriptError
*iface
, EXCEPINFO
*excepinfo
)
246 JScriptError
*This
= impl_from_IActiveScriptError(iface
);
248 TRACE("(%p)->(%p)\n", This
, excepinfo
);
253 memset(excepinfo
, 0, sizeof(*excepinfo
));
254 excepinfo
->scode
= This
->ei
.error
;
256 jsstr_to_bstr(This
->ei
.source
, &excepinfo
->bstrSource
);
258 jsstr_to_bstr(This
->ei
.message
, &excepinfo
->bstrDescription
);
262 static HRESULT WINAPI
JScriptError_GetSourcePosition(IActiveScriptError
*iface
, DWORD
*source_context
, ULONG
*line
, LONG
*character
)
264 JScriptError
*This
= impl_from_IActiveScriptError(iface
);
265 bytecode_t
*code
= This
->ei
.code
;
266 unsigned line_pos
, char_pos
;
268 TRACE("(%p)->(%p %p %p)\n", This
, source_context
, line
, character
);
271 FIXME("unknown position\n");
276 *source_context
= This
->ei
.code
->source_context
;
277 if(!line
&& !character
)
280 line_pos
= get_location_line(code
, This
->ei
.loc
, &char_pos
);
284 *character
= char_pos
;
288 static HRESULT WINAPI
JScriptError_GetSourceLineText(IActiveScriptError
*iface
, BSTR
*source
)
290 JScriptError
*This
= impl_from_IActiveScriptError(iface
);
292 TRACE("(%p)->(%p)\n", This
, source
);
302 return jsstr_to_bstr(This
->ei
.line
, source
);
305 static const IActiveScriptErrorVtbl JScriptErrorVtbl
= {
306 JScriptError_QueryInterface
,
308 JScriptError_Release
,
309 JScriptError_GetExceptionInfo
,
310 JScriptError_GetSourcePosition
,
311 JScriptError_GetSourceLineText
314 void reset_ei(jsexcept_t
*ei
)
317 if(ei
->valid_value
) {
318 jsval_release(ei
->value
);
319 ei
->valid_value
= FALSE
;
322 release_bytecode(ei
->code
);
327 jsstr_release(ei
->source
);
331 jsstr_release(ei
->message
);
335 jsstr_release(ei
->line
);
340 void enter_script(script_ctx_t
*ctx
, jsexcept_t
*ei
)
342 memset(ei
, 0, sizeof(*ei
));
345 TRACE("ctx %p ei %p prev %p\n", ctx
, ei
, ei
->prev
);
348 HRESULT
leave_script(script_ctx_t
*ctx
, HRESULT result
)
350 jsexcept_t
*ei
= ctx
->ei
;
351 BOOL enter_notified
= ei
->enter_notified
;
354 TRACE("ctx %p ei %p prev %p\n", ctx
, ei
, ei
->prev
);
357 if(result
== DISP_E_EXCEPTION
) {
364 WARN("%08lx\n", result
);
365 if(ctx
->site
&& (error
= malloc(sizeof(*error
)))) {
368 error
->IActiveScriptError_iface
.lpVtbl
= &JScriptErrorVtbl
;
371 memset(ei
, 0, sizeof(*ei
));
373 hres
= IActiveScriptSite_OnScriptError(ctx
->site
, &error
->IActiveScriptError_iface
);
374 IActiveScriptError_Release(&error
->IActiveScriptError_iface
);
376 result
= SCRIPT_E_REPORTED
;
379 if(enter_notified
&& ctx
->site
)
380 IActiveScriptSite_OnLeaveScript(ctx
->site
);
385 static void clear_script_queue(JScript
*This
)
387 while(!list_empty(&This
->queued_code
))
389 bytecode_t
*iter
= LIST_ENTRY(list_head(&This
->queued_code
), bytecode_t
, entry
);
390 list_remove(&iter
->entry
);
391 if (iter
->is_persistent
)
392 list_add_tail(&This
->persistent_code
, &iter
->entry
);
394 release_bytecode(iter
);
398 static void clear_persistent_code_list(JScript
*This
)
400 while(!list_empty(&This
->persistent_code
))
402 bytecode_t
*iter
= LIST_ENTRY(list_head(&This
->persistent_code
), bytecode_t
, entry
);
403 list_remove(&iter
->entry
);
404 release_bytecode(iter
);
408 static void release_persistent_script_objs(JScript
*This
)
412 LIST_FOR_EACH_ENTRY(iter
, &This
->persistent_code
, bytecode_t
, entry
)
414 release_named_item_script_obj(iter
->named_item
);
417 static void release_named_item_list(JScript
*This
)
419 while(!list_empty(&This
->ctx
->named_items
)) {
420 named_item_t
*iter
= LIST_ENTRY(list_head(&This
->ctx
->named_items
), named_item_t
, entry
);
421 list_remove(&iter
->entry
);
422 release_named_item(iter
);
426 static HRESULT
exec_global_code(script_ctx_t
*ctx
, bytecode_t
*code
, jsval_t
*r
)
428 IServiceProvider
*prev_caller
= ctx
->jscaller
->caller
;
431 ctx
->jscaller
->caller
= SP_CALLER_UNINITIALIZED
;
432 hres
= exec_source(ctx
, EXEC_GLOBAL
, code
, &code
->global_code
, NULL
, NULL
, NULL
, 0, NULL
, r
);
433 ctx
->jscaller
->caller
= prev_caller
;
437 static void exec_queued_code(JScript
*This
)
443 LIST_FOR_EACH_ENTRY(iter
, &This
->queued_code
, bytecode_t
, entry
) {
444 enter_script(This
->ctx
, &ei
);
445 hres
= exec_global_code(This
->ctx
, iter
, NULL
);
446 leave_script(This
->ctx
, hres
);
451 clear_script_queue(This
);
454 static void decrease_state(JScript
*This
, SCRIPTSTATE state
)
456 named_item_t
*item
, *item_next
;
459 switch(This
->ctx
->state
) {
460 case SCRIPTSTATE_CONNECTED
:
461 change_state(This
, SCRIPTSTATE_DISCONNECTED
);
462 if(state
== SCRIPTSTATE_DISCONNECTED
)
465 case SCRIPTSTATE_STARTED
:
466 case SCRIPTSTATE_DISCONNECTED
:
467 clear_script_queue(This
);
469 if(This
->ctx
->state
== SCRIPTSTATE_DISCONNECTED
)
470 change_state(This
, SCRIPTSTATE_INITIALIZED
);
471 if(state
== SCRIPTSTATE_INITIALIZED
)
474 case SCRIPTSTATE_INITIALIZED
:
475 clear_script_queue(This
);
476 release_persistent_script_objs(This
);
478 LIST_FOR_EACH_ENTRY_SAFE(item
, item_next
, &This
->ctx
->named_items
, named_item_t
, entry
)
482 IDispatch_Release(item
->disp
);
485 release_named_item_script_obj(item
);
486 if(!(item
->flags
& SCRIPTITEM_ISPERSISTENT
))
488 list_remove(&item
->entry
);
489 release_named_item(item
);
493 if(This
->ctx
->secmgr
) {
494 IInternetHostSecurityManager_Release(This
->ctx
->secmgr
);
495 This
->ctx
->secmgr
= NULL
;
498 if(This
->ctx
->site
) {
499 IActiveScriptSite_Release(This
->ctx
->site
);
500 This
->ctx
->site
= NULL
;
503 script_globals_release(This
->ctx
);
507 case SCRIPTSTATE_UNINITIALIZED
:
508 change_state(This
, state
);
514 change_state(This
, state
);
515 }else if(state
== SCRIPTSTATE_UNINITIALIZED
) {
517 IActiveScriptSite_OnStateChange(This
->site
, state
);
522 if((state
== SCRIPTSTATE_UNINITIALIZED
|| state
== SCRIPTSTATE_CLOSED
) && This
->thread_data
) {
523 release_thread_data(This
->thread_data
);
524 This
->thread_data
= NULL
;
528 IActiveScriptSite_Release(This
->site
);
534 IServiceProvider IServiceProvider_iface
;
538 IServiceProvider
*sp
;
541 static inline AXSite
*impl_from_IServiceProvider(IServiceProvider
*iface
)
543 return CONTAINING_RECORD(iface
, AXSite
, IServiceProvider_iface
);
546 static HRESULT WINAPI
AXSite_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **ppv
)
548 AXSite
*This
= impl_from_IServiceProvider(iface
);
550 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
551 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
552 *ppv
= &This
->IServiceProvider_iface
;
553 }else if(IsEqualGUID(&IID_IServiceProvider
, riid
)) {
554 TRACE("(%p)->(IID_IServiceProvider %p)\n", This
, ppv
);
555 *ppv
= &This
->IServiceProvider_iface
;
557 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
559 return E_NOINTERFACE
;
562 IUnknown_AddRef((IUnknown
*)*ppv
);
566 static ULONG WINAPI
AXSite_AddRef(IServiceProvider
*iface
)
568 AXSite
*This
= impl_from_IServiceProvider(iface
);
569 LONG ref
= InterlockedIncrement(&This
->ref
);
571 TRACE("(%p) ref=%ld\n", This
, ref
);
576 static ULONG WINAPI
AXSite_Release(IServiceProvider
*iface
)
578 AXSite
*This
= impl_from_IServiceProvider(iface
);
579 LONG ref
= InterlockedDecrement(&This
->ref
);
581 TRACE("(%p) ref=%ld\n", This
, ref
);
586 IServiceProvider_Release(This
->sp
);
594 static HRESULT WINAPI
AXSite_QueryService(IServiceProvider
*iface
,
595 REFGUID guidService
, REFIID riid
, void **ppv
)
597 AXSite
*This
= impl_from_IServiceProvider(iface
);
599 TRACE("(%p)->(%s %s %p)\n", This
, debugstr_guid(guidService
), debugstr_guid(riid
), ppv
);
602 return E_NOINTERFACE
;
604 return IServiceProvider_QueryService(This
->sp
, guidService
, riid
, ppv
);
607 static IServiceProviderVtbl AXSiteVtbl
= {
608 AXSite_QueryInterface
,
614 IUnknown
*create_ax_site(script_ctx_t
*ctx
)
616 IServiceProvider
*sp
= NULL
;
620 hres
= IActiveScriptSite_QueryInterface(ctx
->site
, &IID_IServiceProvider
, (void**)&sp
);
622 TRACE("Could not get IServiceProvider iface: %08lx\n", hres
);
625 ret
= malloc(sizeof(AXSite
));
627 IServiceProvider_Release(sp
);
631 ret
->IServiceProvider_iface
.lpVtbl
= &AXSiteVtbl
;
635 return (IUnknown
*)&ret
->IServiceProvider_iface
;
638 static inline JScript
*impl_from_IActiveScript(IActiveScript
*iface
)
640 return CONTAINING_RECORD(iface
, JScript
, IActiveScript_iface
);
643 static HRESULT WINAPI
JScript_QueryInterface(IActiveScript
*iface
, REFIID riid
, void **ppv
)
645 JScript
*This
= impl_from_IActiveScript(iface
);
649 if(IsEqualGUID(riid
, &IID_IUnknown
)) {
650 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
651 *ppv
= &This
->IActiveScript_iface
;
652 }else if(IsEqualGUID(riid
, &IID_IActiveScript
)) {
653 TRACE("(%p)->(IID_IActiveScript %p)\n", This
, ppv
);
654 *ppv
= &This
->IActiveScript_iface
;
655 }else if(IsEqualGUID(riid
, &IID_IActiveScriptParse
)) {
656 TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This
, ppv
);
657 *ppv
= &This
->IActiveScriptParse_iface
;
658 }else if(IsEqualGUID(riid
, &IID_IActiveScriptParseProcedure
)) {
659 TRACE("(%p)->(IID_IActiveScriptParseProcedure %p)\n", This
, ppv
);
660 *ppv
= &This
->IActiveScriptParseProcedure2_iface
;
661 }else if(IsEqualGUID(riid
, &IID_IActiveScriptParseProcedure2
)) {
662 TRACE("(%p)->(IID_IActiveScriptParseProcedure2 %p)\n", This
, ppv
);
663 *ppv
= &This
->IActiveScriptParseProcedure2_iface
;
664 }else if(IsEqualGUID(riid
, &IID_IActiveScriptProperty
)) {
665 TRACE("(%p)->(IID_IActiveScriptProperty %p)\n", This
, ppv
);
666 *ppv
= &This
->IActiveScriptProperty_iface
;
667 }else if(IsEqualGUID(riid
, &IID_IObjectSafety
)) {
668 TRACE("(%p)->(IID_IObjectSafety %p)\n", This
, ppv
);
669 *ppv
= &This
->IObjectSafety_iface
;
670 }else if(IsEqualGUID(riid
, &IID_IVariantChangeType
)) {
671 TRACE("(%p)->(IID_IVariantChangeType %p)\n", This
, ppv
);
672 *ppv
= &This
->IVariantChangeType_iface
;
673 }else if(IsEqualGUID(riid
, &IID_IWineJScript
)) {
674 TRACE("(%p)->(IID_IWineJScript %p)\n", This
, ppv
);
675 *ppv
= &This
->IWineJScript_iface
;
679 IUnknown_AddRef((IUnknown
*)*ppv
);
683 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
684 return E_NOINTERFACE
;
687 static ULONG WINAPI
JScript_AddRef(IActiveScript
*iface
)
689 JScript
*This
= impl_from_IActiveScript(iface
);
690 LONG ref
= InterlockedIncrement(&This
->ref
);
692 TRACE("(%p) ref=%ld\n", This
, ref
);
697 static ULONG WINAPI
JScript_Release(IActiveScript
*iface
)
699 JScript
*This
= impl_from_IActiveScript(iface
);
700 LONG ref
= InterlockedDecrement(&This
->ref
);
702 TRACE("(%p) ref=%ld\n", iface
, ref
);
705 if(This
->ctx
&& This
->ctx
->state
!= SCRIPTSTATE_CLOSED
)
706 IActiveScript_Close(&This
->IActiveScript_iface
);
708 This
->ctx
->active_script
= NULL
;
709 script_release(This
->ctx
);
711 if(This
->thread_data
)
712 release_thread_data(This
->thread_data
);
720 static HRESULT WINAPI
JScript_SetScriptSite(IActiveScript
*iface
,
721 IActiveScriptSite
*pass
)
723 JScript
*This
= impl_from_IActiveScript(iface
);
724 struct thread_data
*thread_data
;
729 TRACE("(%p)->(%p)\n", This
, pass
);
737 if(!(thread_data
= get_thread_data()))
738 return E_OUTOFMEMORY
;
740 if(InterlockedCompareExchangePointer((void**)&This
->thread_data
, thread_data
, NULL
)) {
741 release_thread_data(thread_data
);
746 script_ctx_t
*ctx
= calloc(1, sizeof(script_ctx_t
));
748 return E_OUTOFMEMORY
;
751 ctx
->state
= SCRIPTSTATE_UNINITIALIZED
;
752 ctx
->active_script
= &This
->IActiveScript_iface
;
753 ctx
->safeopt
= This
->safeopt
;
754 ctx
->version
= This
->version
;
755 ctx
->html_mode
= This
->html_mode
;
756 ctx
->acc
= jsval_undefined();
757 list_init(&ctx
->named_items
);
758 heap_pool_init(&ctx
->tmp_heap
);
760 hres
= create_jscaller(ctx
);
767 ctx
->thread_data
= thread_data
;
768 ctx
->last_match
= jsstr_empty();
773 /* Retrieve new dispatches for persistent named items */
774 LIST_FOR_EACH_ENTRY(item
, &This
->ctx
->named_items
, named_item_t
, entry
)
778 hres
= retrieve_named_item_disp(pass
, item
);
779 if(FAILED(hres
)) return hres
;
782 /* For some reason, CODEONLY flag is lost in re-initialized scripts */
783 item
->flags
&= ~SCRIPTITEM_CODEONLY
;
787 IActiveScriptSite_AddRef(This
->site
);
789 hres
= IActiveScriptSite_GetLCID(This
->site
, &lcid
);
793 This
->ctx
->lcid
= This
->lcid
;
795 hres
= init_global(This
->ctx
);
799 IActiveScriptSite_AddRef(This
->site
);
800 This
->ctx
->site
= This
->site
;
802 if(This
->is_initialized
)
803 change_state(This
, SCRIPTSTATE_INITIALIZED
);
807 static HRESULT WINAPI
JScript_GetScriptSite(IActiveScript
*iface
, REFIID riid
,
810 JScript
*This
= impl_from_IActiveScript(iface
);
811 FIXME("(%p)->()\n", This
);
815 static HRESULT WINAPI
JScript_SetScriptState(IActiveScript
*iface
, SCRIPTSTATE ss
)
817 JScript
*This
= impl_from_IActiveScript(iface
);
819 TRACE("(%p)->(%d)\n", This
, ss
);
821 if(This
->thread_data
&& This
->thread_data
->thread_id
!= GetCurrentThreadId())
824 if(ss
== SCRIPTSTATE_UNINITIALIZED
) {
825 if(This
->ctx
&& This
->ctx
->state
== SCRIPTSTATE_CLOSED
)
828 decrease_state(This
, SCRIPTSTATE_UNINITIALIZED
);
829 list_move_tail(&This
->queued_code
, &This
->persistent_code
);
833 if(!This
->is_initialized
|| !This
->ctx
)
837 case SCRIPTSTATE_STARTED
:
838 case SCRIPTSTATE_CONNECTED
: /* FIXME */
839 if(This
->ctx
->state
== SCRIPTSTATE_UNINITIALIZED
|| This
->ctx
->state
== SCRIPTSTATE_CLOSED
)
842 exec_queued_code(This
);
844 case SCRIPTSTATE_INITIALIZED
:
845 FIXME("unimplemented SCRIPTSTATE_INITIALIZED\n");
848 FIXME("unimplemented state %d\n", ss
);
852 change_state(This
, ss
);
856 static HRESULT WINAPI
JScript_GetScriptState(IActiveScript
*iface
, SCRIPTSTATE
*pssState
)
858 JScript
*This
= impl_from_IActiveScript(iface
);
860 TRACE("(%p)->(%p)\n", This
, pssState
);
865 if(This
->thread_data
&& This
->thread_data
->thread_id
!= GetCurrentThreadId())
868 *pssState
= This
->ctx
? This
->ctx
->state
: SCRIPTSTATE_UNINITIALIZED
;
872 static HRESULT WINAPI
JScript_Close(IActiveScript
*iface
)
874 JScript
*This
= impl_from_IActiveScript(iface
);
876 TRACE("(%p)->()\n", This
);
878 if(This
->thread_data
&& This
->thread_data
->thread_id
!= GetCurrentThreadId())
881 decrease_state(This
, SCRIPTSTATE_CLOSED
);
882 clear_persistent_code_list(This
);
883 release_named_item_list(This
);
887 static HRESULT WINAPI
JScript_AddNamedItem(IActiveScript
*iface
,
888 LPCOLESTR pstrName
, DWORD dwFlags
)
890 JScript
*This
= impl_from_IActiveScript(iface
);
892 IDispatch
*disp
= NULL
;
895 TRACE("(%p)->(%s %lx)\n", This
, debugstr_w(pstrName
), dwFlags
);
897 if(!This
->thread_data
|| This
->thread_data
->thread_id
!= GetCurrentThreadId() || !This
->ctx
|| This
->ctx
->state
== SCRIPTSTATE_CLOSED
)
900 if(dwFlags
& SCRIPTITEM_GLOBALMEMBERS
) {
903 hres
= IActiveScriptSite_GetItemInfo(This
->site
, pstrName
, SCRIPTINFO_IUNKNOWN
, &unk
, NULL
);
905 WARN("GetItemInfo failed: %08lx\n", hres
);
909 hres
= IUnknown_QueryInterface(unk
, &IID_IDispatch
, (void**)&disp
);
910 IUnknown_Release(unk
);
912 WARN("object does not implement IDispatch\n");
917 item
= malloc(sizeof(*item
));
920 IDispatch_Release(disp
);
921 return E_OUTOFMEMORY
;
926 item
->flags
= dwFlags
;
927 item
->script_obj
= NULL
;
928 item
->name
= wcsdup(pstrName
);
931 IDispatch_Release(disp
);
933 return E_OUTOFMEMORY
;
936 list_add_tail(&This
->ctx
->named_items
, &item
->entry
);
940 static HRESULT WINAPI
JScript_AddTypeLib(IActiveScript
*iface
, REFGUID rguidTypeLib
,
941 DWORD dwMajor
, DWORD dwMinor
, DWORD dwFlags
)
943 JScript
*This
= impl_from_IActiveScript(iface
);
944 FIXME("(%p)->()\n", This
);
948 static HRESULT WINAPI
JScript_GetScriptDispatch(IActiveScript
*iface
, LPCOLESTR pstrItemName
,
951 JScript
*This
= impl_from_IActiveScript(iface
);
952 jsdisp_t
*script_obj
;
954 TRACE("(%p)->(%s %p)\n", This
, debugstr_w(pstrItemName
), ppdisp
);
959 if(!This
->thread_data
|| This
->thread_data
->thread_id
!= GetCurrentThreadId() || !This
->ctx
->global
) {
964 script_obj
= This
->ctx
->global
;
966 named_item_t
*item
= lookup_named_item(This
->ctx
, pstrItemName
, 0);
967 if(!item
) return E_INVALIDARG
;
968 if(item
->script_obj
) script_obj
= item
->script_obj
;
971 *ppdisp
= to_disp(script_obj
);
972 IDispatch_AddRef(*ppdisp
);
976 static HRESULT WINAPI
JScript_GetCurrentScriptThreadID(IActiveScript
*iface
,
977 SCRIPTTHREADID
*pstridThread
)
979 JScript
*This
= impl_from_IActiveScript(iface
);
980 FIXME("(%p)->()\n", This
);
984 static HRESULT WINAPI
JScript_GetScriptThreadID(IActiveScript
*iface
,
985 DWORD dwWin32ThreadId
, SCRIPTTHREADID
*pstidThread
)
987 JScript
*This
= impl_from_IActiveScript(iface
);
988 FIXME("(%p)->()\n", This
);
992 static HRESULT WINAPI
JScript_GetScriptThreadState(IActiveScript
*iface
,
993 SCRIPTTHREADID stidThread
, SCRIPTTHREADSTATE
*pstsState
)
995 JScript
*This
= impl_from_IActiveScript(iface
);
996 FIXME("(%p)->()\n", This
);
1000 static HRESULT WINAPI
JScript_InterruptScriptThread(IActiveScript
*iface
,
1001 SCRIPTTHREADID stidThread
, const EXCEPINFO
*pexcepinfo
, DWORD dwFlags
)
1003 JScript
*This
= impl_from_IActiveScript(iface
);
1004 FIXME("(%p)->()\n", This
);
1008 static HRESULT WINAPI
JScript_Clone(IActiveScript
*iface
, IActiveScript
**ppscript
)
1010 JScript
*This
= impl_from_IActiveScript(iface
);
1011 FIXME("(%p)->()\n", This
);
1015 static const IActiveScriptVtbl JScriptVtbl
= {
1016 JScript_QueryInterface
,
1019 JScript_SetScriptSite
,
1020 JScript_GetScriptSite
,
1021 JScript_SetScriptState
,
1022 JScript_GetScriptState
,
1024 JScript_AddNamedItem
,
1026 JScript_GetScriptDispatch
,
1027 JScript_GetCurrentScriptThreadID
,
1028 JScript_GetScriptThreadID
,
1029 JScript_GetScriptThreadState
,
1030 JScript_InterruptScriptThread
,
1034 static inline JScript
*impl_from_IActiveScriptParse(IActiveScriptParse
*iface
)
1036 return CONTAINING_RECORD(iface
, JScript
, IActiveScriptParse_iface
);
1039 static HRESULT WINAPI
JScriptParse_QueryInterface(IActiveScriptParse
*iface
, REFIID riid
, void **ppv
)
1041 JScript
*This
= impl_from_IActiveScriptParse(iface
);
1042 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
1045 static ULONG WINAPI
JScriptParse_AddRef(IActiveScriptParse
*iface
)
1047 JScript
*This
= impl_from_IActiveScriptParse(iface
);
1048 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
1051 static ULONG WINAPI
JScriptParse_Release(IActiveScriptParse
*iface
)
1053 JScript
*This
= impl_from_IActiveScriptParse(iface
);
1054 return IActiveScript_Release(&This
->IActiveScript_iface
);
1057 static HRESULT WINAPI
JScriptParse_InitNew(IActiveScriptParse
*iface
)
1059 JScript
*This
= impl_from_IActiveScriptParse(iface
);
1061 TRACE("(%p)\n", This
);
1063 if(This
->is_initialized
)
1064 return E_UNEXPECTED
;
1065 This
->is_initialized
= TRUE
;
1068 change_state(This
, SCRIPTSTATE_INITIALIZED
);
1072 static HRESULT WINAPI
JScriptParse_AddScriptlet(IActiveScriptParse
*iface
,
1073 LPCOLESTR pstrDefaultName
, LPCOLESTR pstrCode
, LPCOLESTR pstrItemName
,
1074 LPCOLESTR pstrSubItemName
, LPCOLESTR pstrEventName
, LPCOLESTR pstrDelimiter
,
1075 CTXARG_T dwSourceContextCookie
, ULONG ulStartingLineNumber
, DWORD dwFlags
,
1076 BSTR
*pbstrName
, EXCEPINFO
*pexcepinfo
)
1078 JScript
*This
= impl_from_IActiveScriptParse(iface
);
1079 FIXME("(%p)->(%s %s %s %s %s %s %s %lu %lx %p %p)\n", This
, debugstr_w(pstrDefaultName
),
1080 debugstr_w(pstrCode
), debugstr_w(pstrItemName
), debugstr_w(pstrSubItemName
),
1081 debugstr_w(pstrEventName
), debugstr_w(pstrDelimiter
), wine_dbgstr_longlong(dwSourceContextCookie
),
1082 ulStartingLineNumber
, dwFlags
, pbstrName
, pexcepinfo
);
1086 static HRESULT WINAPI
JScriptParse_ParseScriptText(IActiveScriptParse
*iface
,
1087 LPCOLESTR pstrCode
, LPCOLESTR pstrItemName
, IUnknown
*punkContext
,
1088 LPCOLESTR pstrDelimiter
, CTXARG_T dwSourceContextCookie
, ULONG ulStartingLine
,
1089 DWORD dwFlags
, VARIANT
*pvarResult
, EXCEPINFO
*pexcepinfo
)
1091 JScript
*This
= impl_from_IActiveScriptParse(iface
);
1092 named_item_t
*item
= NULL
;
1097 TRACE("(%p)->(%s %s %p %s %s %lu %lx %p %p)\n", This
, debugstr_w(pstrCode
),
1098 debugstr_w(pstrItemName
), punkContext
, debugstr_w(pstrDelimiter
),
1099 wine_dbgstr_longlong(dwSourceContextCookie
), ulStartingLine
, dwFlags
, pvarResult
, pexcepinfo
);
1101 if(!This
->thread_data
|| This
->thread_data
->thread_id
!= GetCurrentThreadId() || This
->ctx
->state
== SCRIPTSTATE_CLOSED
)
1102 return E_UNEXPECTED
;
1105 item
= lookup_named_item(This
->ctx
, pstrItemName
, 0);
1107 WARN("Unknown context %s\n", debugstr_w(pstrItemName
));
1108 return E_INVALIDARG
;
1110 if(!item
->script_obj
) item
= NULL
;
1113 enter_script(This
->ctx
, &ei
);
1114 hres
= compile_script(This
->ctx
, pstrCode
, dwSourceContextCookie
, ulStartingLine
, NULL
, pstrDelimiter
,
1115 (dwFlags
& SCRIPTTEXT_ISEXPRESSION
) != 0, This
->is_encode
, item
, &code
);
1117 return leave_script(This
->ctx
, hres
);
1119 if(dwFlags
& SCRIPTTEXT_ISEXPRESSION
) {
1122 hres
= exec_global_code(This
->ctx
, code
, &r
);
1123 if(SUCCEEDED(hres
)) {
1125 hres
= jsval_to_variant(r
, pvarResult
);
1129 return leave_script(This
->ctx
, hres
);
1132 code
->is_persistent
= (dwFlags
& SCRIPTTEXT_ISPERSISTENT
) != 0;
1135 * Although pvarResult is not really used without SCRIPTTEXT_ISEXPRESSION flag, if it's not NULL,
1136 * script is executed immediately, even if it's not in started state yet.
1138 if(!pvarResult
&& !is_started(This
->ctx
)) {
1139 list_add_tail(&This
->queued_code
, &code
->entry
);
1141 hres
= exec_global_code(This
->ctx
, code
, NULL
);
1142 if(code
->is_persistent
)
1143 list_add_tail(&This
->persistent_code
, &code
->entry
);
1145 release_bytecode(code
);
1148 if(FAILED(hres
= leave_script(This
->ctx
, hres
)))
1152 V_VT(pvarResult
) = VT_EMPTY
;
1156 static const IActiveScriptParseVtbl JScriptParseVtbl
= {
1157 JScriptParse_QueryInterface
,
1158 JScriptParse_AddRef
,
1159 JScriptParse_Release
,
1160 JScriptParse_InitNew
,
1161 JScriptParse_AddScriptlet
,
1162 JScriptParse_ParseScriptText
1165 static inline JScript
*impl_from_IActiveScriptParseProcedure2(IActiveScriptParseProcedure2
*iface
)
1167 return CONTAINING_RECORD(iface
, JScript
, IActiveScriptParseProcedure2_iface
);
1170 static HRESULT WINAPI
JScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2
*iface
, REFIID riid
, void **ppv
)
1172 JScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
1173 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
1176 static ULONG WINAPI
JScriptParseProcedure_AddRef(IActiveScriptParseProcedure2
*iface
)
1178 JScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
1179 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
1182 static ULONG WINAPI
JScriptParseProcedure_Release(IActiveScriptParseProcedure2
*iface
)
1184 JScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
1185 return IActiveScript_Release(&This
->IActiveScript_iface
);
1188 static HRESULT WINAPI
JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2
*iface
,
1189 LPCOLESTR pstrCode
, LPCOLESTR pstrFormalParams
, LPCOLESTR pstrProcedureName
,
1190 LPCOLESTR pstrItemName
, IUnknown
*punkContext
, LPCOLESTR pstrDelimiter
,
1191 CTXARG_T dwSourceContextCookie
, ULONG ulStartingLineNumber
, DWORD dwFlags
, IDispatch
**ppdisp
)
1193 JScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
1194 named_item_t
*item
= NULL
;
1200 TRACE("(%p)->(%s %s %s %s %p %s %s %lu %lx %p)\n", This
, debugstr_w(pstrCode
), debugstr_w(pstrFormalParams
),
1201 debugstr_w(pstrProcedureName
), debugstr_w(pstrItemName
), punkContext
, debugstr_w(pstrDelimiter
),
1202 wine_dbgstr_longlong(dwSourceContextCookie
), ulStartingLineNumber
, dwFlags
, ppdisp
);
1204 if(!This
->thread_data
|| This
->thread_data
->thread_id
!= GetCurrentThreadId() || This
->ctx
->state
== SCRIPTSTATE_CLOSED
)
1205 return E_UNEXPECTED
;
1208 item
= lookup_named_item(This
->ctx
, pstrItemName
, 0);
1210 WARN("Unknown context %s\n", debugstr_w(pstrItemName
));
1211 return E_INVALIDARG
;
1213 if(!item
->script_obj
) item
= NULL
;
1216 enter_script(This
->ctx
, &ei
);
1217 hres
= compile_script(This
->ctx
, pstrCode
, dwSourceContextCookie
, ulStartingLineNumber
, pstrFormalParams
,
1218 pstrDelimiter
, FALSE
, This
->is_encode
, item
, &code
);
1220 return leave_script(This
->ctx
, hres
);
1222 hres
= create_source_function(This
->ctx
, code
, &code
->global_code
, NULL
, &dispex
);
1223 release_bytecode(code
);
1225 hres
= leave_script(This
->ctx
, hres
);
1229 *ppdisp
= to_disp(dispex
);
1233 static const IActiveScriptParseProcedure2Vtbl JScriptParseProcedureVtbl
= {
1234 JScriptParseProcedure_QueryInterface
,
1235 JScriptParseProcedure_AddRef
,
1236 JScriptParseProcedure_Release
,
1237 JScriptParseProcedure_ParseProcedureText
,
1240 static inline JScript
*impl_from_IActiveScriptProperty(IActiveScriptProperty
*iface
)
1242 return CONTAINING_RECORD(iface
, JScript
, IActiveScriptProperty_iface
);
1245 static HRESULT WINAPI
JScriptProperty_QueryInterface(IActiveScriptProperty
*iface
, REFIID riid
, void **ppv
)
1247 JScript
*This
= impl_from_IActiveScriptProperty(iface
);
1248 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
1251 static ULONG WINAPI
JScriptProperty_AddRef(IActiveScriptProperty
*iface
)
1253 JScript
*This
= impl_from_IActiveScriptProperty(iface
);
1254 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
1257 static ULONG WINAPI
JScriptProperty_Release(IActiveScriptProperty
*iface
)
1259 JScript
*This
= impl_from_IActiveScriptProperty(iface
);
1260 return IActiveScript_Release(&This
->IActiveScript_iface
);
1263 static HRESULT WINAPI
JScriptProperty_GetProperty(IActiveScriptProperty
*iface
, DWORD dwProperty
,
1264 VARIANT
*pvarIndex
, VARIANT
*pvarValue
)
1266 JScript
*This
= impl_from_IActiveScriptProperty(iface
);
1267 FIXME("(%p)->(%lx %p %p)\n", This
, dwProperty
, pvarIndex
, pvarValue
);
1271 static HRESULT WINAPI
JScriptProperty_SetProperty(IActiveScriptProperty
*iface
, DWORD dwProperty
,
1272 VARIANT
*pvarIndex
, VARIANT
*pvarValue
)
1274 JScript
*This
= impl_from_IActiveScriptProperty(iface
);
1276 TRACE("(%p)->(%lx %s %s)\n", This
, dwProperty
, debugstr_variant(pvarIndex
), debugstr_variant(pvarValue
));
1279 FIXME("unsupported pvarIndex\n");
1281 switch(dwProperty
) {
1282 case SCRIPTPROP_INVOKEVERSIONING
:
1283 if(V_VT(pvarValue
) != VT_I4
|| V_I4(pvarValue
) < 0
1284 || (V_I4(pvarValue
) > 15 && !(V_I4(pvarValue
) & SCRIPTLANGUAGEVERSION_HTML
))) {
1285 WARN("invalid value %s\n", debugstr_variant(pvarValue
));
1286 return E_INVALIDARG
;
1289 This
->version
= V_I4(pvarValue
) & 0x1ff;
1290 This
->html_mode
= (V_I4(pvarValue
) & SCRIPTLANGUAGEVERSION_HTML
) != 0;
1293 FIXME("Unimplemented property %lx\n", dwProperty
);
1300 static const IActiveScriptPropertyVtbl JScriptPropertyVtbl
= {
1301 JScriptProperty_QueryInterface
,
1302 JScriptProperty_AddRef
,
1303 JScriptProperty_Release
,
1304 JScriptProperty_GetProperty
,
1305 JScriptProperty_SetProperty
1308 static inline JScript
*impl_from_IObjectSafety(IObjectSafety
*iface
)
1310 return CONTAINING_RECORD(iface
, JScript
, IObjectSafety_iface
);
1313 static HRESULT WINAPI
JScriptSafety_QueryInterface(IObjectSafety
*iface
, REFIID riid
, void **ppv
)
1315 JScript
*This
= impl_from_IObjectSafety(iface
);
1316 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
1319 static ULONG WINAPI
JScriptSafety_AddRef(IObjectSafety
*iface
)
1321 JScript
*This
= impl_from_IObjectSafety(iface
);
1322 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
1325 static ULONG WINAPI
JScriptSafety_Release(IObjectSafety
*iface
)
1327 JScript
*This
= impl_from_IObjectSafety(iface
);
1328 return IActiveScript_Release(&This
->IActiveScript_iface
);
1331 #define SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
1333 static HRESULT WINAPI
JScriptSafety_GetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
1334 DWORD
*pdwSupportedOptions
, DWORD
*pdwEnabledOptions
)
1336 JScript
*This
= impl_from_IObjectSafety(iface
);
1338 TRACE("(%p)->(%s %p %p)\n", This
, debugstr_guid(riid
), pdwSupportedOptions
, pdwEnabledOptions
);
1340 if(!pdwSupportedOptions
|| !pdwEnabledOptions
)
1343 *pdwSupportedOptions
= SUPPORTED_OPTIONS
;
1344 *pdwEnabledOptions
= This
->safeopt
;
1349 static HRESULT WINAPI
JScriptSafety_SetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
1350 DWORD dwOptionSetMask
, DWORD dwEnabledOptions
)
1352 JScript
*This
= impl_from_IObjectSafety(iface
);
1354 TRACE("(%p)->(%s %lx %lx)\n", This
, debugstr_guid(riid
), dwOptionSetMask
, dwEnabledOptions
);
1356 if(dwOptionSetMask
& ~SUPPORTED_OPTIONS
)
1359 This
->safeopt
= (dwEnabledOptions
& dwOptionSetMask
) | (This
->safeopt
& ~dwOptionSetMask
) | INTERFACE_USES_DISPEX
;
1363 static const IObjectSafetyVtbl JScriptSafetyVtbl
= {
1364 JScriptSafety_QueryInterface
,
1365 JScriptSafety_AddRef
,
1366 JScriptSafety_Release
,
1367 JScriptSafety_GetInterfaceSafetyOptions
,
1368 JScriptSafety_SetInterfaceSafetyOptions
1371 static inline JScript
*impl_from_IVariantChangeType(IVariantChangeType
*iface
)
1373 return CONTAINING_RECORD(iface
, JScript
, IVariantChangeType_iface
);
1376 static HRESULT WINAPI
VariantChangeType_QueryInterface(IVariantChangeType
*iface
, REFIID riid
, void **ppv
)
1378 JScript
*This
= impl_from_IVariantChangeType(iface
);
1379 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
1382 static ULONG WINAPI
VariantChangeType_AddRef(IVariantChangeType
*iface
)
1384 JScript
*This
= impl_from_IVariantChangeType(iface
);
1385 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
1388 static ULONG WINAPI
VariantChangeType_Release(IVariantChangeType
*iface
)
1390 JScript
*This
= impl_from_IVariantChangeType(iface
);
1391 return IActiveScript_Release(&This
->IActiveScript_iface
);
1394 static HRESULT WINAPI
VariantChangeType_ChangeType(IVariantChangeType
*iface
, VARIANT
*dst
, VARIANT
*src
, LCID lcid
, VARTYPE vt
)
1396 JScript
*This
= impl_from_IVariantChangeType(iface
);
1401 TRACE("(%p)->(%p %s %lx %s)\n", This
, dst
, debugstr_variant(src
), lcid
, debugstr_vt(vt
));
1404 FIXME("Object uninitialized\n");
1405 return E_UNEXPECTED
;
1408 enter_script(This
->ctx
, &ei
);
1409 hres
= variant_change_type(This
->ctx
, &res
, src
, vt
);
1410 hres
= leave_script(This
->ctx
, hres
);
1414 hres
= VariantClear(dst
);
1424 static const IVariantChangeTypeVtbl VariantChangeTypeVtbl
= {
1425 VariantChangeType_QueryInterface
,
1426 VariantChangeType_AddRef
,
1427 VariantChangeType_Release
,
1428 VariantChangeType_ChangeType
1431 static inline JScript
*impl_from_IWineJScript(IWineJScript
*iface
)
1433 return CONTAINING_RECORD(iface
, JScript
, IWineJScript_iface
);
1436 static HRESULT WINAPI
WineJScript_QueryInterface(IWineJScript
*iface
, REFIID riid
, void **ppv
)
1438 JScript
*This
= impl_from_IWineJScript(iface
);
1439 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
1442 static ULONG WINAPI
WineJScript_AddRef(IWineJScript
*iface
)
1444 JScript
*This
= impl_from_IWineJScript(iface
);
1445 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
1448 static ULONG WINAPI
WineJScript_Release(IWineJScript
*iface
)
1450 JScript
*This
= impl_from_IWineJScript(iface
);
1451 return IActiveScript_Release(&This
->IActiveScript_iface
);
1454 static HRESULT WINAPI
WineJScript_InitHostObject(IWineJScript
*iface
, IWineJSDispatchHost
*host_obj
,
1455 IWineJSDispatch
**ret
)
1457 JScript
*This
= impl_from_IWineJScript(iface
);
1458 return init_host_object(This
->ctx
, host_obj
, ret
);
1461 static const IWineJScriptVtbl WineJScriptVtbl
= {
1462 WineJScript_QueryInterface
,
1464 WineJScript_Release
,
1465 WineJScript_InitHostObject
,
1468 HRESULT
create_jscript_object(BOOL is_encode
, REFIID riid
, void **ppv
)
1473 ret
= calloc(1, sizeof(*ret
));
1475 return E_OUTOFMEMORY
;
1479 ret
->IActiveScript_iface
.lpVtbl
= &JScriptVtbl
;
1480 ret
->IActiveScriptParse_iface
.lpVtbl
= &JScriptParseVtbl
;
1481 ret
->IActiveScriptParseProcedure2_iface
.lpVtbl
= &JScriptParseProcedureVtbl
;
1482 ret
->IActiveScriptProperty_iface
.lpVtbl
= &JScriptPropertyVtbl
;
1483 ret
->IObjectSafety_iface
.lpVtbl
= &JScriptSafetyVtbl
;
1484 ret
->IVariantChangeType_iface
.lpVtbl
= &VariantChangeTypeVtbl
;
1485 ret
->IWineJScript_iface
.lpVtbl
= &WineJScriptVtbl
;
1487 ret
->safeopt
= INTERFACE_USES_DISPEX
;
1488 ret
->is_encode
= is_encode
;
1489 list_init(&ret
->persistent_code
);
1490 list_init(&ret
->queued_code
);
1492 hres
= IActiveScript_QueryInterface(&ret
->IActiveScript_iface
, riid
, ppv
);
1493 IActiveScript_Release(&ret
->IActiveScript_iface
);