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_math(script_ctx_t *ctx, jsdisp_t **ret) { jsdisp_t *math; unsigned i; VARIANT v; HRESULT hres; struct { const WCHAR *name; DOUBLE val; }constants[] = { {EW, M_E}, /* ECMA-262 3rd Edition 15.8.1.1 */ {LN10W, M_LN10}, /* ECMA-262 3rd Edition 15.8.1.2 */ {LN2W, M_LN2}, /* ECMA-262 3rd Edition 15.8.1.3 */ {LOG2EW, M_LOG2E}, /* ECMA-262 3rd Edition 15.8.1.4 */ {LOG10EW, M_LOG10E}, /* ECMA-262 3rd Edition 15.8.1.5 */ {PIW, M_PI}, /* ECMA-262 3rd Edition 15.8.1.6 */ {SQRT1_2W, M_SQRT1_2}, /* ECMA-262 3rd Edition 15.8.1.7 */ {SQRT2W, M_SQRT2}, /* ECMA-262 3rd Edition 15.8.1.8 */ }; math = heap_alloc_zero(sizeof(jsdisp_t)); if(!math) return E_OUTOFMEMORY; hres = init_dispex_from_constr(math, ctx, &Math_info, ctx->object_constr); if(FAILED(hres)) { heap_free(math); return hres; } V_VT(&v) = VT_R8; for(i=0; i < sizeof(constants)/sizeof(*constants); i++) { V_R8(&v) = constants[i].val; hres = jsdisp_propput_const(math, constants[i].name, &v); if(FAILED(hres)) { jsdisp_release(math); return hres; } } *ret = math; return S_OK; }