static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine, DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo) { JScript *This = impl_from_IActiveScriptParse(iface); bytecode_t *code; HRESULT hres; TRACE("(%p)->(%s %s %p %s %s %u %x %p %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter), wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLine, dwFlags, pvarResult, pexcepinfo); if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED) return E_UNEXPECTED; hres = compile_script(This->ctx, pstrCode, NULL, pstrDelimiter, (dwFlags & SCRIPTTEXT_ISEXPRESSION) != 0, This->is_encode, &code); if(FAILED(hres)) return hres; if(dwFlags & SCRIPTTEXT_ISEXPRESSION) { jsval_t r; IActiveScriptSite_OnEnterScript(This->site); clear_ei(This->ctx); hres = exec_source(This->ctx, EXEC_GLOBAL, code, &code->global_code, NULL, NULL, NULL, This->ctx->global, 0, NULL, &r); if(SUCCEEDED(hres)) { if(pvarResult) hres = jsval_to_variant(r, pvarResult); jsval_release(r); } IActiveScriptSite_OnLeaveScript(This->site); return hres; } /* * Although pvarResult is not really used without SCRIPTTEXT_ISEXPRESSION flag, if it's not NULL, * script is executed immediately, even if it's not in started state yet. */ if(!pvarResult && !is_started(This->ctx)) { if(This->queue_tail) This->queue_tail = This->queue_tail->next = code; else This->queue_head = This->queue_tail = code; return S_OK; } hres = exec_global_code(This, code); release_bytecode(code); if(FAILED(hres)) return hres; if(pvarResult) V_VT(pvarResult) = VT_EMPTY; return S_OK; }
static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine, DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo) { JScript *This = impl_from_IActiveScriptParse(iface); bytecode_t *code; HRESULT hres; TRACE("(%p)->(%s %s %p %s %s %u %x %p %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter), wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLine, dwFlags, pvarResult, pexcepinfo); if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED) return E_UNEXPECTED; hres = compile_script(This->ctx, pstrCode, NULL, pstrDelimiter, (dwFlags & SCRIPTTEXT_ISEXPRESSION) != 0, This->is_encode, &code); if(FAILED(hres)) return hres; if(dwFlags & SCRIPTTEXT_ISEXPRESSION) { exec_ctx_t *exec_ctx; hres = create_exec_ctx(This->ctx, NULL, This->ctx->global, NULL, TRUE, &exec_ctx); if(SUCCEEDED(hres)) { jsval_t r; IActiveScriptSite_OnEnterScript(This->site); clear_ei(This->ctx); hres = exec_source(exec_ctx, code, &code->global_code, TRUE, &r); if(SUCCEEDED(hres)) { hres = jsval_to_variant(r, pvarResult); jsval_release(r); } exec_release(exec_ctx); IActiveScriptSite_OnLeaveScript(This->site); } return hres; } if(!is_started(This->ctx)) { if(This->queue_tail) This->queue_tail = This->queue_tail->next = code; else This->queue_head = This->queue_tail = code; return S_OK; } hres = exec_global_code(This, code); release_bytecode(code); return hres; }
static HRESULT exec_global_code(JScript *This, bytecode_t *code) { HRESULT hres; IActiveScriptSite_OnEnterScript(This->site); clear_ei(This->ctx); hres = exec_source(This->ctx, EXEC_GLOBAL, code, &code->global_code, NULL, NULL, NULL, This->ctx->global, 0, NULL, NULL); IActiveScriptSite_OnLeaveScript(This->site); return hres; }
static INT index_from_val(script_ctx_t *ctx, jsval_t v) { double n; HRESULT hres; hres = to_number(ctx, v, &n); if(FAILED(hres)) { clear_ei(ctx); /* FIXME: Move ignoring exceptions to to_primitive */ return 0; } n = floor(n); return is_int32(n) ? n : 0; }
void script_release(script_ctx_t *ctx) { if(--ctx->ref) return; clear_ei(ctx); if(ctx->cc) release_cc(ctx->cc); heap_pool_free(&ctx->tmp_heap); if(ctx->last_match) jsstr_release(ctx->last_match); ctx->jscaller->ctx = NULL; IServiceProvider_Release(&ctx->jscaller->IServiceProvider_iface); heap_free(ctx); }
static HRESULT exec_global_code(JScript *This, bytecode_t *code) { exec_ctx_t *exec_ctx; HRESULT hres; hres = create_exec_ctx(This->ctx, NULL, This->ctx->global, NULL, TRUE, &exec_ctx); if(FAILED(hres)) return hres; IActiveScriptSite_OnEnterScript(This->site); clear_ei(This->ctx); hres = exec_source(exec_ctx, code, &code->global_code, FALSE, NULL); exec_release(exec_ctx); IActiveScriptSite_OnLeaveScript(This->site); return hres; }
HRESULT variant_change_type(script_ctx_t *ctx, VARIANT *dst, VARIANT *src, VARTYPE vt) { jsval_t val; HRESULT hres; clear_ei(ctx); hres = variant_to_jsval(src, &val); if(FAILED(hres)) return hres; switch(vt) { case VT_I2: case VT_I4: { INT i; hres = to_int32(ctx, val, &i); if(SUCCEEDED(hres)) { if(vt == VT_I4) V_I4(dst) = i; else V_I2(dst) = i; } break; } case VT_R8: { double n; hres = to_number(ctx, val, &n); if(SUCCEEDED(hres)) V_R8(dst) = n; break; } case VT_R4: { double n; hres = to_number(ctx, val, &n); if(SUCCEEDED(hres)) V_R4(dst) = n; break; } case VT_BOOL: { BOOL b; hres = to_boolean(val, &b); if(SUCCEEDED(hres)) V_BOOL(dst) = b ? VARIANT_TRUE : VARIANT_FALSE; break; } case VT_BSTR: { jsstr_t *str; hres = to_string(ctx, val, &str); if(FAILED(hres)) break; if(str->length_flags & JSSTR_FLAG_NULLBSTR) { V_BSTR(dst) = NULL; break; } V_BSTR(dst) = SysAllocStringLen(str->str, jsstr_length(str)); if(!V_BSTR(dst)) hres = E_OUTOFMEMORY; break; } case VT_EMPTY: hres = V_VT(src) == VT_EMPTY ? S_OK : E_NOTIMPL; break; case VT_NULL: hres = V_VT(src) == VT_NULL ? S_OK : E_NOTIMPL; break; default: FIXME("vt %d not implemented\n", vt); hres = E_NOTIMPL; } jsval_release(val); if(FAILED(hres)) return hres; V_VT(dst) = vt; return S_OK; }