HRESULT init_function_constr(script_ctx_t *ctx, jsdisp_t *object_prototype) { FunctionInstance *prot, *constr; HRESULT hres; static const WCHAR FunctionW[] = {'F','u','n','c','t','i','o','n',0}; hres = create_function(ctx, &Function_info, PROPF_CONSTR, TRUE, object_prototype, &prot); if(FAILED(hres)) return hres; prot->value_proc = FunctionProt_value; prot->name = prototypeW; hres = create_function(ctx, &FunctionInst_info, PROPF_CONSTR|1, TRUE, &prot->dispex, &constr); if(SUCCEEDED(hres)) { constr->value_proc = FunctionConstr_value; constr->name = FunctionW; hres = set_prototype(ctx, &constr->dispex, &prot->dispex); if(SUCCEEDED(hres)) hres = set_constructor_prop(ctx, &constr->dispex, &prot->dispex); if(FAILED(hres)) jsdisp_release(&constr->dispex); } jsdisp_release(&prot->dispex); if(FAILED(hres)) return hres; ctx->function_constr = &constr->dispex; return S_OK; }
HRESULT create_builtin_function(script_ctx_t *ctx, builtin_invoke_t value_proc, const WCHAR *name, const builtin_info_t *builtin_info, DWORD flags, jsdisp_t *prototype, jsdisp_t **ret) { FunctionInstance *function; HRESULT hres; hres = create_function(ctx, builtin_info, flags, FALSE, NULL, &function); if(FAILED(hres)) return hres; if(builtin_info) hres = jsdisp_propput_const(&function->dispex, lengthW, jsval_number(function->length)); if(SUCCEEDED(hres)) hres = set_prototype(ctx, &function->dispex, prototype); if(FAILED(hres)) { jsdisp_release(&function->dispex); return hres; } function->value_proc = value_proc; function->name = name; *ret = &function->dispex; return S_OK; }
HRESULT create_builtin_function(script_ctx_t *ctx, builtin_invoke_t value_proc, const WCHAR *name, const builtin_info_t *builtin_info, DWORD flags, DispatchEx *prototype, DispatchEx **ret) { FunctionInstance *function; HRESULT hres; hres = create_function(ctx, builtin_info, flags, FALSE, NULL, &function); if(FAILED(hres)) return hres; if(builtin_info) { VARIANT var; V_VT(&var) = VT_I4; V_I4(&var) = function->length; hres = jsdisp_propput_const(&function->dispex, lengthW, &var); } if(SUCCEEDED(hres)) hres = set_prototype(ctx, &function->dispex, prototype); if(FAILED(hres)) { jsdisp_release(&function->dispex); return hres; } function->value_proc = value_proc; function->name = name; *ret = &function->dispex; return S_OK; }
HRESULT create_source_function(script_ctx_t *ctx, bytecode_t *code, function_code_t *func_code, scope_chain_t *scope_chain, jsdisp_t **ret) { FunctionInstance *function; jsdisp_t *prototype; HRESULT hres; hres = create_object(ctx, NULL, &prototype); if(FAILED(hres)) return hres; hres = create_function(ctx, NULL, PROPF_CONSTR, FALSE, NULL, &function); if(SUCCEEDED(hres)) { hres = set_prototype(ctx, &function->dispex, prototype); if(FAILED(hres)) jsdisp_release(&function->dispex); } jsdisp_release(prototype); if(FAILED(hres)) return hres; if(scope_chain) { scope_addref(scope_chain); function->scope_chain = scope_chain; } bytecode_addref(code); function->code = code; function->func_code = func_code; function->length = function->func_code->param_cnt; *ret = &function->dispex; return S_OK; }
HRESULT create_source_function(parser_ctx_t *ctx, parameter_t *parameters, source_elements_t *source, scope_chain_t *scope_chain, const WCHAR *src_str, DWORD src_len, DispatchEx **ret) { FunctionInstance *function; DispatchEx *prototype; parameter_t *iter; DWORD length = 0; HRESULT hres; hres = create_object(ctx->script, NULL, &prototype); if(FAILED(hres)) return hres; hres = create_function(ctx->script, NULL, PROPF_CONSTR, FALSE, NULL, &function); if(SUCCEEDED(hres)) { hres = set_prototype(ctx->script, &function->dispex, prototype); if(FAILED(hres)) jsdisp_release(&function->dispex); } jsdisp_release(prototype); if(FAILED(hres)) return hres; function->source = source; function->parameters = parameters; if(scope_chain) { scope_addref(scope_chain); function->scope_chain = scope_chain; } parser_addref(ctx); function->parser = ctx; for(iter = parameters; iter; iter = iter->next) length++; function->length = length; function->src_str = src_str; function->src_len = src_len; *ret = &function->dispex; return S_OK; }