From 7bb41e75b63a2bd2362555d74317b2923aca90c1 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 27 Mar 2012 11:30:51 +0200 Subject: [PATCH] jscript: Store value as double in NumberInstance object. --- dlls/jscript/jscript.h | 2 +- dlls/jscript/jsutils.c | 2 +- dlls/jscript/number.c | 33 ++++++++++++++------------------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index fbe3142ec63..3948a9cda57 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -242,7 +242,7 @@ HRESULT create_regexp(script_ctx_t*,const WCHAR *,int,DWORD,jsdisp_t**) DECLSPEC HRESULT create_regexp_var(script_ctx_t*,VARIANT*,VARIANT*,jsdisp_t**) DECLSPEC_HIDDEN; HRESULT create_string(script_ctx_t*,const WCHAR*,DWORD,jsdisp_t**) DECLSPEC_HIDDEN; HRESULT create_bool(script_ctx_t*,VARIANT_BOOL,jsdisp_t**) DECLSPEC_HIDDEN; -HRESULT create_number(script_ctx_t*,VARIANT*,jsdisp_t**) DECLSPEC_HIDDEN; +HRESULT create_number(script_ctx_t*,double,jsdisp_t**) DECLSPEC_HIDDEN; HRESULT create_vbarray(script_ctx_t*,SAFEARRAY*,jsdisp_t**) DECLSPEC_HIDDEN; typedef enum { diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c index 564dba69f8d..31c471f62d2 100644 --- a/dlls/jscript/jsutils.c +++ b/dlls/jscript/jsutils.c @@ -623,7 +623,7 @@ HRESULT to_object(script_ctx_t *ctx, VARIANT *v, IDispatch **disp) break; case VT_I4: case VT_R8: - hres = create_number(ctx, v, &dispex); + hres = create_number(ctx, num_val(v), &dispex); if(FAILED(hres)) return hres; diff --git a/dlls/jscript/number.c b/dlls/jscript/number.c index 7a3d8b0d4b6..de0ff6307ff 100644 --- a/dlls/jscript/number.c +++ b/dlls/jscript/number.c @@ -30,7 +30,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript); typedef struct { jsdisp_t dispex; - VARIANT num; + double value; } NumberInstance; static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; @@ -76,17 +76,16 @@ static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D return throw_type_error(ctx, ei, JS_E_INVALIDARG, NULL); } - if(V_VT(&number->num) == VT_I4) - val = V_I4(&number->num); - else - val = V_R8(&number->num); + val = number->value; if(radix==10 || isnan(val) || isinf(val)) { - hres = to_string(ctx, &number->num, ei, &str); + VARIANT v; + + num_set_val(&v, val); + hres = to_string(ctx, &v, ei, &str); if(FAILED(hres)) return hres; - } - else { + }else { INT idx = 0; DOUBLE integ, frac, log_radix = 0; WCHAR buf[NUMBER_TOSTRING_BUF_SIZE+16]; @@ -218,7 +217,7 @@ static HRESULT Number_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DI return throw_type_error(ctx, ei, JS_E_NUMBER_EXPECTED, NULL); if(retv) - *retv = number->num; + num_set_val(retv, number->value); return S_OK; } @@ -231,7 +230,7 @@ static HRESULT Number_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP case INVOKE_FUNC: return throw_type_error(ctx, ei, JS_E_FUNCTION_EXPECTED, NULL); case DISPATCH_PROPERTYGET: - *retv = number->num; + num_set_val(retv, number->value); break; default: @@ -288,20 +287,16 @@ static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags case DISPATCH_CONSTRUCT: { jsdisp_t *obj; - VARIANT v; if(arg_cnt(dp)) { hres = to_number(ctx, get_arg(dp, 0), ei, &n); if(FAILED(hres)) return hres; - - num_set_val(&v, n); }else { - V_VT(&v) = VT_I4; - V_I4(&v) = 0; + n = 0; } - hres = create_number(ctx, &v, &obj); + hres = create_number(ctx, n, &obj); if(FAILED(hres)) return hres; @@ -347,7 +342,7 @@ HRESULT create_number_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdi if(FAILED(hres)) return hres; - V_VT(&number->num) = VT_I4; + number->value = 0; hres = create_builtin_function(ctx, NumberConstr_value, NumberW, NULL, PROPF_CONSTR|1, &number->dispex, ret); @@ -355,7 +350,7 @@ HRESULT create_number_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdi return hres; } -HRESULT create_number(script_ctx_t *ctx, VARIANT *num, jsdisp_t **ret) +HRESULT create_number(script_ctx_t *ctx, double value, jsdisp_t **ret) { NumberInstance *number; HRESULT hres; @@ -364,7 +359,7 @@ HRESULT create_number(script_ctx_t *ctx, VARIANT *num, jsdisp_t **ret) if(FAILED(hres)) return hres; - number->num = *num; + number->value = value; *ret = &number->dispex; return S_OK;