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 = ASPARSE_THIS(iface); parser_ctx_t *parser_ctx; 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 = script_parse(This->ctx, pstrCode, pstrDelimiter, &parser_ctx); if(FAILED(hres)) return hres; if(!is_started(This->ctx)) { if(This->queue_tail) This->queue_tail = This->queue_tail->next = parser_ctx; else This->queue_head = This->queue_tail = parser_ctx; return S_OK; } hres = exec_global_code(This, parser_ctx); parser_release(parser_ctx); return hres; }
static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface, LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName, LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp) { JScript *This = ASPARSEPROC_THIS(iface); parser_ctx_t *parser_ctx; DispatchEx *dispex; HRESULT hres; TRACE("(%p)->(%s %s %s %s %p %s %s %u %x %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrFormalParams), debugstr_w(pstrProcedureName), debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter), wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLineNumber, dwFlags, ppdisp); if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED) return E_UNEXPECTED; hres = script_parse(This->ctx, pstrCode, pstrDelimiter, &parser_ctx); if(FAILED(hres)) { WARN("Parse failed %08x\n", hres); return hres; } hres = create_source_function(parser_ctx, NULL, parser_ctx->source, NULL, NULL, 0, &dispex); parser_release(parser_ctx); if(FAILED(hres)) return hres; *ppdisp = (IDispatch*)_IDispatchEx_(dispex); return S_OK; }
static void Function_destructor(DispatchEx *dispex) { FunctionInstance *This = (FunctionInstance*)dispex; if(This->parser) parser_release(This->parser); if(This->scope_chain) scope_release(This->scope_chain); heap_free(This); }
static void clear_script_queue(JScript *This) { parser_ctx_t *iter, *iter2; if(!This->queue_head) return; iter = This->queue_head; while(iter) { iter2 = iter->next; iter->next = NULL; parser_release(iter); iter = iter2; } This->queue_head = This->queue_tail = NULL; }
static HRESULT construct_function(script_ctx_t *ctx, DISPPARAMS *dp, jsexcept_t *ei, IDispatch **ret) { function_expression_t *expr; WCHAR *str = NULL, *ptr; DWORD argc, len = 0, l; parser_ctx_t *parser; DispatchEx *function; BSTR *params = NULL; int i=0, j=0; HRESULT hres = S_OK; static const WCHAR function_anonymousW[] = {'f','u','n','c','t','i','o','n',' ','a','n','o','n','y','m','o','u','s','('}; static const WCHAR function_beginW[] = {')',' ','{','\n'}; static const WCHAR function_endW[] = {'\n','}',0}; argc = arg_cnt(dp); if(argc) { params = heap_alloc(argc*sizeof(BSTR)); if(!params) return E_OUTOFMEMORY; if(argc > 2) len = (argc-2)*2; /* separating commas */ for(i=0; i < argc; i++) { hres = to_string(ctx, get_arg(dp,i), ei, params+i); if(FAILED(hres)) break; len += SysStringLen(params[i]); } } if(SUCCEEDED(hres)) { len += (sizeof(function_anonymousW) + sizeof(function_beginW) + sizeof(function_endW)) / sizeof(WCHAR); str = heap_alloc(len*sizeof(WCHAR)); if(str) { memcpy(str, function_anonymousW, sizeof(function_anonymousW)); ptr = str + sizeof(function_anonymousW)/sizeof(WCHAR); if(argc > 1) { while(1) { l = SysStringLen(params[j]); memcpy(ptr, params[j], l*sizeof(WCHAR)); ptr += l; if(++j == argc-1) break; *ptr++ = ','; *ptr++ = ' '; } } memcpy(ptr, function_beginW, sizeof(function_beginW)); ptr += sizeof(function_beginW)/sizeof(WCHAR); if(argc) { l = SysStringLen(params[argc-1]); memcpy(ptr, params[argc-1], l*sizeof(WCHAR)); ptr += l; } memcpy(ptr, function_endW, sizeof(function_endW)); TRACE("%s\n", debugstr_w(str)); }else { hres = E_OUTOFMEMORY; } } while(--i >= 0) SysFreeString(params[i]); heap_free(params); if(FAILED(hres)) return hres; hres = script_parse(ctx, str, NULL, &parser); heap_free(str); if(FAILED(hres)) return hres; if(!parser->source || !parser->source->functions || parser->source->functions->next || parser->source->variables) { ERR("Invalid parser result!\n"); parser_release(parser); return E_UNEXPECTED; } expr = parser->source->functions->expr; hres = create_source_function(parser, expr->parameter_list, expr->source_elements, NULL, expr->src_str, expr->src_len, &function); parser_release(parser); if(FAILED(hres)) return hres; *ret = (IDispatch*)_IDispatchEx_(function); return S_OK; }