static HRESULT constructor_call(jsdisp_t *constr, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { if(flags != DISPATCH_PROPERTYGET) return jsdisp_call_value(constr, NULL, flags, argc, argv, r); *r = jsval_obj(jsdisp_addref(constr)); return S_OK; }
static HRESULT constructor_call(jsdisp_t *constr, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei) { if(flags != DISPATCH_PROPERTYGET) return jsdisp_call_value(constr, flags, dp, retv, ei); jsdisp_addref(constr); var_set_jsdisp(retv, constr); return S_OK; }
static HRESULT sort_cmp(script_ctx_t *ctx, jsdisp_t *cmp_func, VARIANT *v1, VARIANT *v2, jsexcept_t *ei, INT *cmp) { HRESULT hres; if(cmp_func) { VARIANTARG args[2]; DISPPARAMS dp = {args, NULL, 2, 0}; double n; VARIANT res; args[0] = *v2; args[1] = *v1; hres = jsdisp_call_value(cmp_func, DISPATCH_METHOD, &dp, &res, ei); if(FAILED(hres)) return hres; hres = to_number(ctx, &res, ei, &n); VariantClear(&res); if(FAILED(hres)) return hres; if(n == 0) *cmp = 0; *cmp = n > 0.0 ? 1 : -1; }else if(V_VT(v1) == VT_EMPTY) { *cmp = V_VT(v2) == VT_EMPTY ? 0 : 1; }else if(V_VT(v2) == VT_EMPTY) { *cmp = -1; }else if(is_num_vt(V_VT(v1)) && is_num_vt(V_VT(v2))) { DOUBLE d = num_val(v1)-num_val(v2); if(d > 0.0) *cmp = 1; else *cmp = d < -0.0 ? -1 : 0; }else { BSTR x, y; hres = to_string(ctx, v1, ei, &x); if(FAILED(hres)) return hres; hres = to_string(ctx, v2, ei, &y); if(SUCCEEDED(hres)) { *cmp = strcmpW(x, y); SysFreeString(y); } SysFreeString(x); if(FAILED(hres)) return hres; } return S_OK; }
static HRESULT constructor_call(DispatchEx *constr, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { if(flags != DISPATCH_PROPERTYGET) return jsdisp_call_value(constr, flags, dp, retv, ei, sp); V_VT(retv) = VT_DISPATCH; V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(constr); IDispatchEx_AddRef(_IDispatchEx_(constr)); return S_OK; }
static HRESULT sort_cmp(script_ctx_t *ctx, jsdisp_t *cmp_func, jsval_t v1, jsval_t v2, INT *cmp) { HRESULT hres; if(cmp_func) { jsval_t args[2]; jsval_t res; double n; args[0] = v1; args[1] = v2; hres = jsdisp_call_value(cmp_func, NULL, DISPATCH_METHOD, 2, args, &res); if(FAILED(hres)) return hres; hres = to_number(ctx, res, &n); jsval_release(res); if(FAILED(hres)) return hres; if(n == 0) *cmp = 0; *cmp = n > 0.0 ? 1 : -1; }else if(is_undefined(v1)) { *cmp = is_undefined(v2) ? 0 : 1; }else if(is_undefined(v2)) { *cmp = -1; }else if(is_number(v1) && is_number(v2)) { double d = get_number(v1)-get_number(v2); if(d > 0.0) *cmp = 1; else *cmp = d < -0.0 ? -1 : 0; }else { jsstr_t *x, *y; hres = to_string(ctx, v1, &x); if(FAILED(hres)) return hres; hres = to_string(ctx, v2, &y); if(SUCCEEDED(hres)) { *cmp = jsstr_cmp(x, y); jsstr_release(y); } jsstr_release(x); if(FAILED(hres)) return hres; } return S_OK; }
static HRESULT rep_call(script_ctx_t *ctx, jsdisp_t *func, jsstr_t *jsstr, const WCHAR *str, match_state_t *match, jsstr_t **ret) { jsval_t *argv; unsigned argc; jsval_t val; jsstr_t *tmp_str; DWORD i; HRESULT hres = S_OK; argc = match->paren_count+3; argv = heap_alloc_zero(sizeof(*argv)*argc); if(!argv) return E_OUTOFMEMORY; tmp_str = jsstr_alloc_len(match->cp-match->match_len, match->match_len); if(!tmp_str) hres = E_OUTOFMEMORY; argv[0] = jsval_string(tmp_str); if(SUCCEEDED(hres)) { for(i=0; i < match->paren_count; i++) { if(match->parens[i].index != -1) tmp_str = jsstr_substr(jsstr, match->parens[i].index, match->parens[i].length); else tmp_str = jsstr_empty(); if(!tmp_str) { hres = E_OUTOFMEMORY; break; } argv[i+1] = jsval_string(tmp_str); } } if(SUCCEEDED(hres)) { argv[match->paren_count+1] = jsval_number(match->cp-str - match->match_len); argv[match->paren_count+2] = jsval_string(jsstr); } if(SUCCEEDED(hres)) hres = jsdisp_call_value(func, NULL, DISPATCH_METHOD, argc, argv, &val); for(i=0; i <= match->paren_count; i++) jsstr_release(get_string(argv[i])); heap_free(argv); if(FAILED(hres)) return hres; hres = to_string(ctx, val, ret); jsval_release(val); return hres; }