jscript: Return double instead of VARIANT from to_number.
This commit is contained in:
parent
f1c9bd444c
commit
451169fb93
|
@ -127,20 +127,15 @@ static HRESULT Array_length(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
|
|||
V_I4(retv) = This->length;
|
||||
break;
|
||||
case DISPATCH_PROPERTYPUT: {
|
||||
VARIANT num;
|
||||
DOUBLE len = -1;
|
||||
DWORD i;
|
||||
HRESULT hres;
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &num);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &len);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&num) == VT_I4)
|
||||
len = V_I4(&num);
|
||||
else
|
||||
len = floor(V_R8(&num));
|
||||
|
||||
len = floor(len);
|
||||
if(len!=(DWORD)len)
|
||||
return throw_range_error(ctx, ei, JS_E_INVALID_LENGTH, NULL);
|
||||
|
||||
|
@ -573,7 +568,6 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPA
|
|||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
jsdisp_t *arr, *jsthis;
|
||||
VARIANT v;
|
||||
DOUBLE range;
|
||||
DWORD length, start, end, idx;
|
||||
HRESULT hres;
|
||||
|
@ -585,15 +579,11 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPA
|
|||
return hres;
|
||||
|
||||
if(arg_cnt(dp)) {
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &range);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&v) == VT_I4)
|
||||
range = V_I4(&v);
|
||||
else
|
||||
range = floor(V_R8(&v));
|
||||
|
||||
range = floor(range);
|
||||
if(-range>length || isnan(range)) start = 0;
|
||||
else if(range < 0) start = range+length;
|
||||
else if(range <= length) start = range;
|
||||
|
@ -602,15 +592,11 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPA
|
|||
else start = 0;
|
||||
|
||||
if(arg_cnt(dp)>1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &range);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&v) == VT_I4)
|
||||
range = V_I4(&v);
|
||||
else
|
||||
range = floor(V_R8(&v));
|
||||
|
||||
range = floor(range);
|
||||
if(-range>length) end = 0;
|
||||
else if(range < 0) end = range+length;
|
||||
else if(range <= length) end = range;
|
||||
|
@ -623,6 +609,8 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPA
|
|||
return hres;
|
||||
|
||||
for(idx=start; idx<end; idx++) {
|
||||
VARIANT v;
|
||||
|
||||
hres = jsdisp_get_idx(jsthis, idx, &v, ei);
|
||||
if(hres == DISP_E_UNKNOWNNAME)
|
||||
continue;
|
||||
|
@ -653,7 +641,7 @@ static HRESULT sort_cmp(script_ctx_t *ctx, jsdisp_t *cmp_func, VARIANT *v1, VARI
|
|||
if(cmp_func) {
|
||||
VARIANTARG args[2];
|
||||
DISPPARAMS dp = {args, NULL, 2, 0};
|
||||
VARIANT tmp;
|
||||
double n;
|
||||
VARIANT res;
|
||||
|
||||
args[0] = *v2;
|
||||
|
@ -663,15 +651,14 @@ static HRESULT sort_cmp(script_ctx_t *ctx, jsdisp_t *cmp_func, VARIANT *v1, VARI
|
|||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
hres = to_number(ctx, &res, ei, &tmp);
|
||||
hres = to_number(ctx, &res, ei, &n);
|
||||
VariantClear(&res);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&tmp) == VT_I4)
|
||||
*cmp = V_I4(&tmp);
|
||||
else
|
||||
*cmp = V_R8(&tmp) > 0.0 ? 1 : -1;
|
||||
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) {
|
||||
|
|
|
@ -1366,7 +1366,7 @@ static HRESULT Date_getTimezoneOffset(script_ctx_t *ctx, vdisp_t *jsthis, WORD f
|
|||
static HRESULT Date_setTime(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
|
||||
|
@ -1378,11 +1378,11 @@ static HRESULT Date_setTime(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
|
|||
if(!arg_cnt(dp))
|
||||
return throw_type_error(ctx, ei, JS_E_MISSING_ARG, NULL);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
date->time = time_clip(num_val(&v));
|
||||
date->time = time_clip(n);
|
||||
|
||||
if(retv)
|
||||
num_set_val(retv, date->time);
|
||||
|
@ -1394,10 +1394,9 @@ static HRESULT Date_setTime(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
|
|||
static HRESULT Date_setMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t;
|
||||
double n, t;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1407,13 +1406,13 @@ static HRESULT Date_setMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla
|
|||
if(!arg_cnt(dp))
|
||||
return throw_type_error(ctx, ei, JS_E_MISSING_ARG, NULL);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
t = local_time(date->time, date);
|
||||
t = make_date(day(t), make_time(hour_from_time(t), min_from_time(t),
|
||||
sec_from_time(t), num_val(&v)));
|
||||
sec_from_time(t), n));
|
||||
date->time = time_clip(utc(t, date));
|
||||
|
||||
if(retv)
|
||||
|
@ -1426,10 +1425,9 @@ static HRESULT Date_setMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla
|
|||
static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t;
|
||||
double n, t;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1439,13 +1437,13 @@ static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD
|
|||
if(!arg_cnt(dp))
|
||||
return throw_type_error(ctx, ei, JS_E_MISSING_ARG, NULL);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
t = date->time;
|
||||
t = make_date(day(t), make_time(hour_from_time(t), min_from_time(t),
|
||||
sec_from_time(t), num_val(&v)));
|
||||
sec_from_time(t), n));
|
||||
date->time = time_clip(t);
|
||||
|
||||
if(retv)
|
||||
|
@ -1458,10 +1456,9 @@ static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD
|
|||
static HRESULT Date_setSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t, sec, ms;
|
||||
double t, sec, ms;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1473,18 +1470,17 @@ static HRESULT Date_setSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
|
|||
|
||||
t = local_time(date->time, date);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &sec);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
sec = num_val(&v);
|
||||
|
||||
if(arg_cnt(dp) > 1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &ms);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
ms = num_val(&v);
|
||||
}else {
|
||||
ms = ms_from_time(t);
|
||||
}
|
||||
else ms = ms_from_time(t);
|
||||
|
||||
t = make_date(day(t), make_time(hour_from_time(t),
|
||||
min_from_time(t), sec, ms));
|
||||
|
@ -1500,10 +1496,9 @@ static HRESULT Date_setSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
|
|||
static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t, sec, ms;
|
||||
double t, sec, ms;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1515,18 +1510,17 @@ static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
|
|||
|
||||
t = date->time;
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &sec);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
sec = num_val(&v);
|
||||
|
||||
if(arg_cnt(dp) > 1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &ms);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
ms = num_val(&v);
|
||||
}else {
|
||||
ms = ms_from_time(t);
|
||||
}
|
||||
else ms = ms_from_time(t);
|
||||
|
||||
t = make_date(day(t), make_time(hour_from_time(t),
|
||||
min_from_time(t), sec, ms));
|
||||
|
@ -1542,10 +1536,9 @@ static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
|
|||
static HRESULT Date_setMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t, min, sec, ms;
|
||||
double t, min, sec, ms;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1557,26 +1550,25 @@ static HRESULT Date_setMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
|
|||
|
||||
t = local_time(date->time, date);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &min);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
min = num_val(&v);
|
||||
|
||||
if(arg_cnt(dp) > 1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &sec);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
sec = num_val(&v);
|
||||
}else {
|
||||
sec = sec_from_time(t);
|
||||
}
|
||||
else sec = sec_from_time(t);
|
||||
|
||||
if(arg_cnt(dp) > 2) {
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &ms);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
ms = num_val(&v);
|
||||
}else {
|
||||
ms = ms_from_time(t);
|
||||
}
|
||||
else ms = ms_from_time(t);
|
||||
|
||||
t = make_date(day(t), make_time(hour_from_time(t),
|
||||
min, sec, ms));
|
||||
|
@ -1592,10 +1584,9 @@ static HRESULT Date_setMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
|
|||
static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t, min, sec, ms;
|
||||
double t, min, sec, ms;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1607,26 +1598,25 @@ static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
|
|||
|
||||
t = date->time;
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &min);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
min = num_val(&v);
|
||||
|
||||
if(arg_cnt(dp) > 1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &sec);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
sec = num_val(&v);
|
||||
}else {
|
||||
sec = sec_from_time(t);
|
||||
}
|
||||
else sec = sec_from_time(t);
|
||||
|
||||
if(arg_cnt(dp) > 2) {
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &ms);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
ms = num_val(&v);
|
||||
}else {
|
||||
ms = ms_from_time(t);
|
||||
}
|
||||
else ms = ms_from_time(t);
|
||||
|
||||
t = make_date(day(t), make_time(hour_from_time(t),
|
||||
min, sec, ms));
|
||||
|
@ -1642,10 +1632,9 @@ static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
|
|||
static HRESULT Date_setHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t, hour, min, sec, ms;
|
||||
double t, hour, min, sec, ms;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1657,34 +1646,33 @@ static HRESULT Date_setHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DIS
|
|||
|
||||
t = local_time(date->time, date);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &hour);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
hour = num_val(&v);
|
||||
|
||||
if(arg_cnt(dp) > 1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &min);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
min = num_val(&v);
|
||||
}else {
|
||||
min = min_from_time(t);
|
||||
}
|
||||
else min = min_from_time(t);
|
||||
|
||||
if(arg_cnt(dp) > 2) {
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &sec);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
sec = num_val(&v);
|
||||
}else {
|
||||
sec = sec_from_time(t);
|
||||
}
|
||||
else sec = sec_from_time(t);
|
||||
|
||||
if(arg_cnt(dp) > 3) {
|
||||
hres = to_number(ctx, get_arg(dp, 3), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 3), ei, &ms);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
ms = num_val(&v);
|
||||
}else {
|
||||
ms = ms_from_time(t);
|
||||
}
|
||||
else ms = ms_from_time(t);
|
||||
|
||||
t = make_date(day(t), make_time(hour, min, sec, ms));
|
||||
date->time = time_clip(utc(t, date));
|
||||
|
@ -1700,9 +1688,8 @@ static HRESULT Date_setUTCHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
DateInstance *date;
|
||||
VARIANT v;
|
||||
double t, hour, min, sec, ms;
|
||||
HRESULT hres;
|
||||
DOUBLE t, hour, min, sec, ms;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1714,34 +1701,33 @@ static HRESULT Date_setUTCHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
|
||||
t = date->time;
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &hour);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
hour = num_val(&v);
|
||||
|
||||
if(arg_cnt(dp) > 1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &min);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
min = num_val(&v);
|
||||
}else {
|
||||
min = min_from_time(t);
|
||||
}
|
||||
else min = min_from_time(t);
|
||||
|
||||
if(arg_cnt(dp) > 2) {
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &sec);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
sec = num_val(&v);
|
||||
}else {
|
||||
sec = sec_from_time(t);
|
||||
}
|
||||
else sec = sec_from_time(t);
|
||||
|
||||
if(arg_cnt(dp) > 3) {
|
||||
hres = to_number(ctx, get_arg(dp, 3), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 3), ei, &ms);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
ms = num_val(&v);
|
||||
}else {
|
||||
ms = ms_from_time(t);
|
||||
}
|
||||
else ms = ms_from_time(t);
|
||||
|
||||
t = make_date(day(t), make_time(hour, min, sec, ms));
|
||||
date->time = time_clip(t);
|
||||
|
@ -1756,10 +1742,9 @@ static HRESULT Date_setUTCHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
static HRESULT Date_setDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t;
|
||||
double t, n;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1769,13 +1754,12 @@ static HRESULT Date_setDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
|
|||
if(!arg_cnt(dp))
|
||||
return throw_type_error(ctx, ei, JS_E_MISSING_ARG, NULL);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
t = local_time(date->time, date);
|
||||
t = make_date(make_day(year_from_time(t), month_from_time(t),
|
||||
num_val(&v)), time_within_day(t));
|
||||
t = make_date(make_day(year_from_time(t), month_from_time(t), n), time_within_day(t));
|
||||
date->time = time_clip(utc(t, date));
|
||||
|
||||
if(retv)
|
||||
|
@ -1788,10 +1772,9 @@ static HRESULT Date_setDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
|
|||
static HRESULT Date_setUTCDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t;
|
||||
double t, n;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1801,13 +1784,12 @@ static HRESULT Date_setUTCDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
|
|||
if(!arg_cnt(dp))
|
||||
return throw_type_error(ctx, ei, JS_E_MISSING_ARG, NULL);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
t = date->time;
|
||||
t = make_date(make_day(year_from_time(t), month_from_time(t),
|
||||
num_val(&v)), time_within_day(t));
|
||||
t = make_date(make_day(year_from_time(t), month_from_time(t), n), time_within_day(t));
|
||||
date->time = time_clip(t);
|
||||
|
||||
if(retv)
|
||||
|
@ -1820,10 +1802,9 @@ static HRESULT Date_setUTCDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
|
|||
static HRESULT Date_setMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t, month, ddate;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1835,18 +1816,17 @@ static HRESULT Date_setMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DIS
|
|||
|
||||
t = local_time(date->time, date);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &month);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
month = num_val(&v);
|
||||
|
||||
if(arg_cnt(dp) > 1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &ddate);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
ddate = num_val(&v);
|
||||
}else {
|
||||
ddate = date_from_time(t);
|
||||
}
|
||||
else ddate = date_from_time(t);
|
||||
|
||||
t = make_date(make_day(year_from_time(t), month, ddate),
|
||||
time_within_day(t));
|
||||
|
@ -1862,10 +1842,9 @@ static HRESULT Date_setMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DIS
|
|||
static HRESULT Date_setUTCMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t, month, ddate;
|
||||
double t, month, ddate;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1877,18 +1856,17 @@ static HRESULT Date_setUTCMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
|
||||
t = date->time;
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &month);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
month = num_val(&v);
|
||||
|
||||
if(arg_cnt(dp) > 1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &ddate);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
ddate = num_val(&v);
|
||||
}else {
|
||||
ddate = date_from_time(t);
|
||||
}
|
||||
else ddate = date_from_time(t);
|
||||
|
||||
t = make_date(make_day(year_from_time(t), month, ddate),
|
||||
time_within_day(t));
|
||||
|
@ -1904,10 +1882,9 @@ static HRESULT Date_setUTCMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
static HRESULT Date_setFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t, year, month, ddate;
|
||||
double t, year, month, ddate;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1919,26 +1896,25 @@ static HRESULT Date_setFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
|
||||
t = local_time(date->time, date);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &year);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
year = num_val(&v);
|
||||
|
||||
if(arg_cnt(dp) > 1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &month);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
month = num_val(&v);
|
||||
}else {
|
||||
month = month_from_time(t);
|
||||
}
|
||||
else month = month_from_time(t);
|
||||
|
||||
if(arg_cnt(dp) > 2) {
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &ddate);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
ddate = num_val(&v);
|
||||
}else {
|
||||
ddate = date_from_time(t);
|
||||
}
|
||||
else ddate = date_from_time(t);
|
||||
|
||||
t = make_date(make_day(year, month, ddate), time_within_day(t));
|
||||
date->time = time_clip(utc(t, date));
|
||||
|
@ -1953,10 +1929,9 @@ static HRESULT Date_setFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
static HRESULT Date_setUTCFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
DateInstance *date;
|
||||
DOUBLE t, year, month, ddate;
|
||||
double t, year, month, ddate;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -1968,26 +1943,25 @@ static HRESULT Date_setUTCFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
|
|||
|
||||
t = date->time;
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &year);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
year = num_val(&v);
|
||||
|
||||
if(arg_cnt(dp) > 1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &month);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
month = num_val(&v);
|
||||
}else {
|
||||
month = month_from_time(t);
|
||||
}
|
||||
else month = month_from_time(t);
|
||||
|
||||
if(arg_cnt(dp) > 2) {
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &ddate);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
ddate = num_val(&v);
|
||||
}else {
|
||||
ddate = date_from_time(t);
|
||||
}
|
||||
else ddate = date_from_time(t);
|
||||
|
||||
t = make_date(make_day(year, month, ddate), time_within_day(t));
|
||||
date->time = time_clip(t);
|
||||
|
@ -2030,7 +2004,6 @@ static HRESULT Date_setYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
|
|||
{
|
||||
DateInstance *date;
|
||||
DOUBLE t, year;
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -2043,11 +2016,10 @@ static HRESULT Date_setYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
|
|||
|
||||
t = local_time(date->time, date);
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &year);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
year = num_val(&v);
|
||||
if(isnan(year)) {
|
||||
date->time = year;
|
||||
if(retv)
|
||||
|
@ -2170,7 +2142,7 @@ static HRESULT create_date(script_ctx_t *ctx, jsdisp_t *object_prototype, DOUBLE
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
static inline HRESULT date_parse(BSTR input, VARIANT *retv) {
|
||||
static inline HRESULT date_parse(BSTR input, double *ret) {
|
||||
static const DWORD string_ids[] = { LOCALE_SMONTHNAME12, LOCALE_SMONTHNAME11,
|
||||
LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME9, LOCALE_SMONTHNAME8,
|
||||
LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME6, LOCALE_SMONTHNAME5,
|
||||
|
@ -2191,15 +2163,15 @@ static inline HRESULT date_parse(BSTR input, VARIANT *retv) {
|
|||
DateInstance di;
|
||||
DWORD lcid_en;
|
||||
|
||||
if(retv) num_set_nan(retv);
|
||||
|
||||
input_len = SysStringLen(input);
|
||||
for(i=0; i<input_len; i++) {
|
||||
if(input[i] == '(') nest_level++;
|
||||
else if(input[i] == ')') {
|
||||
nest_level--;
|
||||
if(nest_level<0)
|
||||
if(nest_level<0) {
|
||||
*ret = ret_nan();
|
||||
return S_OK;
|
||||
}
|
||||
}
|
||||
else if(!nest_level) parse_len++;
|
||||
}
|
||||
|
@ -2406,8 +2378,7 @@ static inline HRESULT date_parse(BSTR input, VARIANT *retv) {
|
|||
}
|
||||
}
|
||||
|
||||
if(retv && i==parse_len && set_year && set_month
|
||||
&& set_day && (!set_am || hour<13)) {
|
||||
if(i == parse_len && set_year && set_month && set_day && (!set_am || hour<13)) {
|
||||
if(set_am) {
|
||||
if(hour == 12) hour = 0;
|
||||
if(!am) hour += 12;
|
||||
|
@ -2416,11 +2387,13 @@ static inline HRESULT date_parse(BSTR input, VARIANT *retv) {
|
|||
if(!ad) year = -year+1;
|
||||
else if(year<100) year += 1900;
|
||||
|
||||
V_VT(retv) = VT_R8;
|
||||
V_R8(retv) = time_clip(make_date(make_day(year, month, day),
|
||||
*ret = time_clip(make_date(make_day(year, month, day),
|
||||
make_time(hour+hour_adjust, min, sec, ms)) + offset*MS_PER_MINUTE);
|
||||
|
||||
if(set_hour_adjust) V_R8(retv) = utc(V_R8(retv), &di);
|
||||
if(set_hour_adjust)
|
||||
*ret = utc(*ret, &di);
|
||||
}else {
|
||||
*ret = ret_nan();
|
||||
}
|
||||
|
||||
for(i=0; i<sizeof(string_ids)/sizeof(DWORD); i++)
|
||||
|
@ -2434,6 +2407,7 @@ static HRESULT DateConstr_parse(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
BSTR parse_str;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -2448,16 +2422,18 @@ static HRESULT DateConstr_parse(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
hres = date_parse(parse_str, retv);
|
||||
|
||||
hres = date_parse(parse_str, &n);
|
||||
SysFreeString(parse_str);
|
||||
return hres;
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
num_set_val(retv, n);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT date_utc(script_ctx_t *ctx, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT year, month, vdate, hours, minutes, seconds, ms;
|
||||
DOUBLE y;
|
||||
double year, month, vdate, hours, minutes, seconds, ms;
|
||||
int arg_no = arg_cnt(dp);
|
||||
HRESULT hres;
|
||||
|
||||
|
@ -2467,78 +2443,65 @@ static HRESULT date_utc(script_ctx_t *ctx, DISPPARAMS *dp, VARIANT *retv, jsexce
|
|||
hres = to_number(ctx, get_arg(dp, 0), ei, &year);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
y = num_val(&year);
|
||||
if(0<=y && y<=99)
|
||||
y += 1900;
|
||||
if(0 <= year && year <= 99)
|
||||
year += 1900;
|
||||
}else {
|
||||
year = 1900;
|
||||
}
|
||||
else y = 1900;
|
||||
|
||||
if(arg_no>1) {
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &month);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
}
|
||||
else {
|
||||
V_VT(&month) = VT_R8;
|
||||
V_R8(&month) = 0;
|
||||
}else {
|
||||
month = 0;
|
||||
}
|
||||
|
||||
if(arg_no>2) {
|
||||
hres = to_number(ctx, get_arg(dp, 2), ei, &vdate);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
}
|
||||
else {
|
||||
V_VT(&vdate) = VT_R8;
|
||||
V_R8(&vdate) = 1;
|
||||
}else {
|
||||
vdate = 1;
|
||||
}
|
||||
|
||||
if(arg_no>3) {
|
||||
hres = to_number(ctx, get_arg(dp, 3), ei, &hours);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
}
|
||||
else {
|
||||
V_VT(&hours) = VT_R8;
|
||||
V_R8(&hours) = 0;
|
||||
}else {
|
||||
hours = 0;
|
||||
}
|
||||
|
||||
if(arg_no>4) {
|
||||
hres = to_number(ctx, get_arg(dp, 4), ei, &minutes);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
}
|
||||
else {
|
||||
V_VT(&minutes) = VT_R8;
|
||||
V_R8(&minutes) = 0;
|
||||
}else {
|
||||
minutes = 0;
|
||||
}
|
||||
|
||||
if(arg_no>5) {
|
||||
hres = to_number(ctx, get_arg(dp, 5), ei, &seconds);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
}
|
||||
else {
|
||||
V_VT(&seconds) = VT_R8;
|
||||
V_R8(&seconds) = 0;
|
||||
}else {
|
||||
seconds = 0;
|
||||
}
|
||||
|
||||
if(arg_no>6) {
|
||||
hres = to_number(ctx, get_arg(dp, 6), ei, &ms);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
}
|
||||
else {
|
||||
V_VT(&ms) = VT_R8;
|
||||
V_R8(&ms) = 0;
|
||||
} else {
|
||||
ms = 0;
|
||||
}
|
||||
|
||||
if(retv) {
|
||||
V_VT(retv) = VT_R8;
|
||||
V_R8(retv) = time_clip(make_date(
|
||||
make_day(y, num_val(&month), num_val(&vdate)),
|
||||
make_time(num_val(&hours), num_val(&minutes),
|
||||
num_val(&seconds), num_val(&ms))));
|
||||
make_day(year, month, vdate),
|
||||
make_time(hours, minutes,seconds, ms)));
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
|
@ -2580,22 +2543,23 @@ static HRESULT DateConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
|
||||
/* ECMA-262 3rd Edition 15.9.3.2 */
|
||||
case 1: {
|
||||
VARIANT prim, num;
|
||||
VARIANT prim;
|
||||
double n;
|
||||
|
||||
hres = to_primitive(ctx, get_arg(dp,0), ei, &prim, NO_HINT);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&prim) == VT_BSTR)
|
||||
hres = date_parse(V_BSTR(&prim), &num);
|
||||
hres = date_parse(V_BSTR(&prim), &n);
|
||||
else
|
||||
hres = to_number(ctx, &prim, ei, &num);
|
||||
hres = to_number(ctx, &prim, ei, &n);
|
||||
|
||||
VariantClear(&prim);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
hres = create_date(ctx, NULL, time_clip(num_val(&num)), &date);
|
||||
hres = create_date(ctx, NULL, time_clip(n), &date);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
break;
|
||||
|
|
|
@ -148,12 +148,17 @@ static void stack_popn(exec_ctx_t *ctx, unsigned n)
|
|||
static HRESULT stack_pop_number(exec_ctx_t *ctx, VARIANT *r)
|
||||
{
|
||||
VARIANT *v;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
v = stack_pop(ctx);
|
||||
hres = to_number(ctx->script, v, ctx->ei, r);
|
||||
hres = to_number(ctx->script, v, ctx->ei, &n);
|
||||
VariantClear(v);
|
||||
return hres;
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
num_set_val(r, n);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT stack_pop_object(exec_ctx_t *ctx, IDispatch **r)
|
||||
|
@ -1526,13 +1531,13 @@ static HRESULT add_eval(script_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcep
|
|||
if(V_VT(&r) != VT_BSTR)
|
||||
SysFreeString(rstr);
|
||||
}else {
|
||||
VARIANT nl, nr;
|
||||
double nl, nr;
|
||||
|
||||
hres = to_number(ctx, &l, ei, &nl);
|
||||
if(SUCCEEDED(hres)) {
|
||||
hres = to_number(ctx, &r, ei, &nr);
|
||||
if(SUCCEEDED(hres))
|
||||
num_set_val(retv, num_val(&nl) + num_val(&nr));
|
||||
num_set_val(retv, nl + nr);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1872,18 +1877,19 @@ static HRESULT interp_minus(exec_ctx_t *ctx)
|
|||
/* ECMA-262 3rd Edition 11.4.6 */
|
||||
static HRESULT interp_tonum(exec_ctx_t *ctx)
|
||||
{
|
||||
VARIANT *v, num;
|
||||
VARIANT *v;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
v = stack_pop(ctx);
|
||||
hres = to_number(ctx->script, v, ctx->ei, &num);
|
||||
hres = to_number(ctx->script, v, ctx->ei, &n);
|
||||
VariantClear(v);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
return stack_push(ctx, &num);
|
||||
return stack_push_number(ctx, n);
|
||||
}
|
||||
|
||||
/* ECMA-262 3rd Edition 11.3.1 */
|
||||
|
@ -1903,11 +1909,12 @@ static HRESULT interp_postinc(exec_ctx_t *ctx)
|
|||
|
||||
hres = disp_propget(ctx->script, obj, id, &v, ctx->ei);
|
||||
if(SUCCEEDED(hres)) {
|
||||
VARIANT n, inc;
|
||||
VARIANT inc;
|
||||
double n;
|
||||
|
||||
hres = to_number(ctx->script, &v, ctx->ei, &n);
|
||||
if(SUCCEEDED(hres)) {
|
||||
num_set_val(&inc, num_val(&n)+(double)arg);
|
||||
num_set_val(&inc, n+(double)arg);
|
||||
hres = disp_propput(ctx->script, obj, id, &inc, ctx->ei);
|
||||
}
|
||||
if(FAILED(hres))
|
||||
|
@ -1937,12 +1944,12 @@ static HRESULT interp_preinc(exec_ctx_t *ctx)
|
|||
|
||||
hres = disp_propget(ctx->script, obj, id, &v, ctx->ei);
|
||||
if(SUCCEEDED(hres)) {
|
||||
VARIANT n;
|
||||
double n;
|
||||
|
||||
hres = to_number(ctx->script, &v, ctx->ei, &n);
|
||||
VariantClear(&v);
|
||||
if(SUCCEEDED(hres)) {
|
||||
num_set_val(&v, num_val(&n)+(double)arg);
|
||||
num_set_val(&v, n+(double)arg);
|
||||
hres = disp_propput(ctx->script, obj, id, &v, ctx->ei);
|
||||
}
|
||||
}
|
||||
|
@ -1980,23 +1987,31 @@ static HRESULT equal_values(script_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jse
|
|||
|
||||
if(V_VT(lval) == VT_BSTR && is_num_vt(V_VT(rval))) {
|
||||
VARIANT v;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
hres = to_number(ctx, lval, ei, &v);
|
||||
hres = to_number(ctx, lval, ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
/* FIXME: optimize */
|
||||
num_set_val(&v, n);
|
||||
|
||||
return equal_values(ctx, &v, rval, ei, ret);
|
||||
}
|
||||
|
||||
if(V_VT(rval) == VT_BSTR && is_num_vt(V_VT(lval))) {
|
||||
VARIANT v;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
hres = to_number(ctx, rval, ei, &v);
|
||||
hres = to_number(ctx, rval, ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
/* FIXME: optimize */
|
||||
num_set_val(&v, n);
|
||||
|
||||
return equal_values(ctx, lval, &v, ei, ret);
|
||||
}
|
||||
|
||||
|
@ -2138,7 +2153,8 @@ static HRESULT interp_neq2(exec_ctx_t *ctx)
|
|||
/* ECMA-262 3rd Edition 11.8.5 */
|
||||
static HRESULT less_eval(script_ctx_t *ctx, VARIANT *lval, VARIANT *rval, BOOL greater, jsexcept_t *ei, BOOL *ret)
|
||||
{
|
||||
VARIANT l, r, ln, rn;
|
||||
double ln, rn;
|
||||
VARIANT l, r;
|
||||
HRESULT hres;
|
||||
|
||||
hres = to_primitive(ctx, lval, ei, &l, NO_HINT);
|
||||
|
@ -2166,15 +2182,7 @@ static HRESULT less_eval(script_ctx_t *ctx, VARIANT *lval, VARIANT *rval, BOOL g
|
|||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&ln) == VT_I4 && V_VT(&rn) == VT_I4) {
|
||||
*ret = (V_I4(&ln) < V_I4(&rn)) ^ greater;
|
||||
}else {
|
||||
DOUBLE ld = num_val(&ln);
|
||||
DOUBLE rd = num_val(&rn);
|
||||
|
||||
*ret = !isnan(ld) && !isnan(rd) && ((ld < rd) ^ greater);
|
||||
}
|
||||
|
||||
*ret = !isnan(ln) && !isnan(rn) && ((ln < rn) ^ greater);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -234,18 +234,16 @@ static HRESULT error_constr(script_ctx_t *ctx, WORD flags, DISPPARAMS *dp,
|
|||
HRESULT hres;
|
||||
|
||||
if(arg_cnt(dp)) {
|
||||
VARIANT numv;
|
||||
double n;
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &numv);
|
||||
if(FAILED(hres) || (V_VT(&numv)==VT_R8 && isnan(V_R8(&numv))))
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &n);
|
||||
if(FAILED(hres)) /* FIXME: really? */
|
||||
n = ret_nan();
|
||||
if(isnan(n))
|
||||
hres = to_string(ctx, get_arg(dp, 0), ei, &msg);
|
||||
else if(V_VT(&numv) == VT_I4)
|
||||
num = V_I4(&numv);
|
||||
else
|
||||
num = V_R8(&numv);
|
||||
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
num = n;
|
||||
}
|
||||
|
||||
if(arg_cnt(dp)>1 && !msg) {
|
||||
|
|
|
@ -386,21 +386,19 @@ static HRESULT JSGlobal_eval(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DIS
|
|||
static HRESULT JSGlobal_isNaN(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT_BOOL ret = VARIANT_FALSE;
|
||||
VARIANT num;
|
||||
VARIANT_BOOL ret = VARIANT_TRUE;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
if(arg_cnt(dp)) {
|
||||
hres = to_number(ctx, get_arg(dp,0), ei, &num);
|
||||
hres = to_number(ctx, get_arg(dp,0), ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&num) == VT_R8 && isnan(V_R8(&num)))
|
||||
ret = VARIANT_TRUE;
|
||||
}else {
|
||||
ret = VARIANT_TRUE;
|
||||
if(!isnan(n))
|
||||
ret = VARIANT_FALSE;
|
||||
}
|
||||
|
||||
if(retv) {
|
||||
|
@ -419,13 +417,13 @@ static HRESULT JSGlobal_isFinite(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
TRACE("\n");
|
||||
|
||||
if(arg_cnt(dp)) {
|
||||
VARIANT num;
|
||||
double n;
|
||||
|
||||
hres = to_number(ctx, get_arg(dp,0), ei, &num);
|
||||
hres = to_number(ctx, get_arg(dp,0), ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&num) != VT_R8 || (!isinf(V_R8(&num)) && !isnan(V_R8(&num))))
|
||||
if(!isinf(n) && !isnan(n))
|
||||
ret = VARIANT_TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -253,7 +253,7 @@ typedef enum {
|
|||
|
||||
HRESULT to_primitive(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*, hint_t) DECLSPEC_HIDDEN;
|
||||
HRESULT to_boolean(VARIANT*,VARIANT_BOOL*) DECLSPEC_HIDDEN;
|
||||
HRESULT to_number(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*) DECLSPEC_HIDDEN;
|
||||
HRESULT to_number(script_ctx_t*,VARIANT*,jsexcept_t*,double*) DECLSPEC_HIDDEN;
|
||||
HRESULT to_integer(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*) DECLSPEC_HIDDEN;
|
||||
HRESULT to_int32(script_ctx_t*,VARIANT*,jsexcept_t*,INT*) DECLSPEC_HIDDEN;
|
||||
HRESULT to_uint32(script_ctx_t*,VARIANT*,jsexcept_t*,DWORD*) DECLSPEC_HIDDEN;
|
||||
|
@ -451,6 +451,13 @@ static inline void num_set_inf(VARIANT *v, BOOL positive)
|
|||
#endif
|
||||
}
|
||||
|
||||
static inline DOUBLE ret_inf(void)
|
||||
{
|
||||
VARIANT v;
|
||||
num_set_inf(&v, TRUE);
|
||||
return V_R8(&v);
|
||||
}
|
||||
|
||||
static inline void var_set_jsdisp(VARIANT *v, jsdisp_t *jsdisp)
|
||||
{
|
||||
V_VT(v) = VT_DISPATCH;
|
||||
|
|
|
@ -312,7 +312,7 @@ static int hex_to_int(WCHAR c)
|
|||
}
|
||||
|
||||
/* ECMA-262 3rd Edition 9.3.1 */
|
||||
static HRESULT str_to_number(BSTR str, VARIANT *ret)
|
||||
static HRESULT str_to_number(BSTR str, double *ret)
|
||||
{
|
||||
const WCHAR *ptr = str;
|
||||
BOOL neg = FALSE;
|
||||
|
@ -336,9 +336,9 @@ static HRESULT str_to_number(BSTR str, VARIANT *ret)
|
|||
ptr++;
|
||||
|
||||
if(*ptr)
|
||||
num_set_nan(ret);
|
||||
*ret = ret_nan();
|
||||
else
|
||||
num_set_inf(ret, !neg);
|
||||
*ret = neg ? -ret_inf() : ret_inf();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -351,7 +351,7 @@ static HRESULT str_to_number(BSTR str, VARIANT *ret)
|
|||
ptr++;
|
||||
}
|
||||
|
||||
num_set_val(ret, d);
|
||||
*ret = d;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -390,31 +390,32 @@ static HRESULT str_to_number(BSTR str, VARIANT *ret)
|
|||
ptr++;
|
||||
|
||||
if(*ptr) {
|
||||
num_set_nan(ret);
|
||||
*ret = ret_nan();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
if(neg)
|
||||
d = -d;
|
||||
|
||||
num_set_val(ret, d);
|
||||
*ret = d;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/* ECMA-262 3rd Edition 9.3 */
|
||||
HRESULT to_number(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret)
|
||||
HRESULT to_number(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, double *ret)
|
||||
{
|
||||
switch(V_VT(v)) {
|
||||
case VT_EMPTY:
|
||||
num_set_nan(ret);
|
||||
*ret = ret_nan();
|
||||
break;
|
||||
case VT_NULL:
|
||||
V_VT(ret) = VT_I4;
|
||||
V_I4(ret) = 0;
|
||||
*ret = 0;
|
||||
break;
|
||||
case VT_I4:
|
||||
*ret = V_I4(v);
|
||||
break;
|
||||
case VT_R8:
|
||||
*ret = *v;
|
||||
*ret = V_R8(v);
|
||||
break;
|
||||
case VT_BSTR:
|
||||
return str_to_number(V_BSTR(v), ret);
|
||||
|
@ -431,8 +432,7 @@ HRESULT to_number(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret)
|
|||
return hres;
|
||||
}
|
||||
case VT_BOOL:
|
||||
V_VT(ret) = VT_I4;
|
||||
V_I4(ret) = V_BOOL(v) ? 1 : 0;
|
||||
*ret = V_BOOL(v) ? 1 : 0;
|
||||
break;
|
||||
default:
|
||||
FIXME("unimplemented for vt %d\n", V_VT(v));
|
||||
|
@ -445,20 +445,23 @@ HRESULT to_number(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret)
|
|||
/* ECMA-262 3rd Edition 9.4 */
|
||||
HRESULT to_integer(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret)
|
||||
{
|
||||
VARIANT num;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
hres = to_number(ctx, v, ei, &num);
|
||||
if(V_VT(v) == VT_I4) {
|
||||
*ret = *v;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, v, ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&num) == VT_I4) {
|
||||
*ret = num;
|
||||
}else if(isnan(V_R8(&num))) {
|
||||
if(isnan(n)) {
|
||||
V_VT(ret) = VT_I4;
|
||||
V_I4(ret) = 0;
|
||||
}else {
|
||||
num_set_val(ret, V_R8(&num) >= 0.0 ? floor(V_R8(&num)) : -floor(-V_R8(&num)));
|
||||
num_set_val(ret, n >= 0.0 ? floor(n) : -floor(-n));
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
|
@ -467,34 +470,38 @@ HRESULT to_integer(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret)
|
|||
/* ECMA-262 3rd Edition 9.5 */
|
||||
HRESULT to_int32(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, INT *ret)
|
||||
{
|
||||
VARIANT num;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
hres = to_number(ctx, v, ei, &num);
|
||||
if(V_VT(v) == VT_I4) {
|
||||
*ret = V_I4(v);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, v, ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&num) == VT_I4)
|
||||
*ret = V_I4(&num);
|
||||
else
|
||||
*ret = isnan(V_R8(&num)) || isinf(V_R8(&num)) ? 0 : (INT)V_R8(&num);
|
||||
*ret = isnan(n) || isinf(n) ? 0 : n;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/* ECMA-262 3rd Edition 9.6 */
|
||||
HRESULT to_uint32(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, DWORD *ret)
|
||||
{
|
||||
VARIANT num;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
hres = to_number(ctx, v, ei, &num);
|
||||
if(V_VT(v) == VT_I4) {
|
||||
*ret = V_I4(v);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, v, ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(V_VT(&num) == VT_I4)
|
||||
*ret = V_I4(&num);
|
||||
else
|
||||
*ret = isnan(V_R8(&num)) || isinf(V_R8(&num)) ? 0 : (DWORD)V_R8(&num);
|
||||
*ret = isnan(n) || isinf(n) ? 0 : n;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -679,17 +686,19 @@ HRESULT variant_change_type(script_ctx_t *ctx, VARIANT *dst, VARIANT *src, VARTY
|
|||
}
|
||||
break;
|
||||
}
|
||||
case VT_R8:
|
||||
hres = to_number(ctx, src, &ei, dst);
|
||||
if(SUCCEEDED(hres) && V_VT(dst) == VT_I4)
|
||||
V_R8(dst) = V_I4(dst);
|
||||
case VT_R8: {
|
||||
double n;
|
||||
hres = to_number(ctx, src, &ei, &n);
|
||||
if(SUCCEEDED(hres))
|
||||
V_R8(dst) = n;
|
||||
break;
|
||||
}
|
||||
case VT_R4: {
|
||||
VARIANT n;
|
||||
double n;
|
||||
|
||||
hres = to_number(ctx, src, &ei, &n);
|
||||
if(SUCCEEDED(hres))
|
||||
V_R4(dst) = num_val(&n);
|
||||
V_R4(dst) = n;
|
||||
break;
|
||||
}
|
||||
case VT_BOOL: {
|
||||
|
|
|
@ -61,8 +61,7 @@ static const WCHAR tanW[] = {'t','a','n',0};
|
|||
static HRESULT Math_abs(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
DOUBLE d;
|
||||
double d;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -73,11 +72,10 @@ static HRESULT Math_abs(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &d);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
d = num_val(&v);
|
||||
if(retv)
|
||||
num_set_val(retv, d < 0.0 ? -d : d);
|
||||
return S_OK;
|
||||
|
@ -86,7 +84,7 @@ static HRESULT Math_abs(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
static HRESULT Math_acos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -96,12 +94,11 @@ static HRESULT Math_acos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPAR
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) {
|
||||
DOUBLE x = num_val(&v);
|
||||
if(x < -1.0 || x > 1.0)
|
||||
num_set_nan(retv);
|
||||
else
|
||||
|
@ -113,7 +110,7 @@ static HRESULT Math_acos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPAR
|
|||
static HRESULT Math_asin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -123,12 +120,11 @@ static HRESULT Math_asin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPAR
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) {
|
||||
DOUBLE x = num_val(&v);
|
||||
if(x < -1.0 || x > 1.0)
|
||||
num_set_nan(retv);
|
||||
else
|
||||
|
@ -140,7 +136,7 @@ static HRESULT Math_asin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPAR
|
|||
static HRESULT Math_atan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -150,18 +146,18 @@ static HRESULT Math_atan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPAR
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) num_set_val(retv, atan(num_val(&v)));
|
||||
if(retv) num_set_val(retv, atan(x));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT Math_atan2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v1, v2;
|
||||
double x, y;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -171,15 +167,15 @@ static HRESULT Math_atan2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v1);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &y);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &v2);
|
||||
hres = to_number(ctx, get_arg(dp, 1), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) num_set_val(retv, atan2(num_val(&v1), num_val(&v2)));
|
||||
if(retv) num_set_val(retv, atan2(y, x));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -187,7 +183,7 @@ static HRESULT Math_atan2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPA
|
|||
static HRESULT Math_ceil(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -198,19 +194,19 @@ static HRESULT Math_ceil(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPAR
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv)
|
||||
num_set_val(retv, ceil(num_val(&v)));
|
||||
num_set_val(retv, ceil(x));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT Math_cos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -220,18 +216,18 @@ static HRESULT Math_cos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) num_set_val(retv, cos(num_val(&v)));
|
||||
if(retv) num_set_val(retv, cos(x));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT Math_exp(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -241,18 +237,18 @@ static HRESULT Math_exp(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) num_set_val(retv, exp(num_val(&v)));
|
||||
if(retv) num_set_val(retv, exp(x));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT Math_floor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -263,19 +259,19 @@ static HRESULT Math_floor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv)
|
||||
num_set_val(retv, floor(num_val(&v)));
|
||||
num_set_val(retv, floor(x));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT Math_log(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -286,12 +282,11 @@ static HRESULT Math_log(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) {
|
||||
DOUBLE x = num_val(&v);
|
||||
if(x < -0.0)
|
||||
num_set_nan(retv);
|
||||
else
|
||||
|
@ -305,7 +300,6 @@ static HRESULT Math_max(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
DOUBLE max, d;
|
||||
VARIANT v;
|
||||
DWORD i;
|
||||
HRESULT hres;
|
||||
|
||||
|
@ -317,17 +311,15 @@ static HRESULT Math_max(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &max);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
max = num_val(&v);
|
||||
for(i=1; i < arg_cnt(dp); i++) {
|
||||
hres = to_number(ctx, get_arg(dp, i), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, i), ei, &d);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
d = num_val(&v);
|
||||
if(d > max || isnan(d))
|
||||
max = d;
|
||||
}
|
||||
|
@ -342,7 +334,6 @@ static HRESULT Math_min(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
DOUBLE min, d;
|
||||
VARIANT v;
|
||||
DWORD i;
|
||||
HRESULT hres;
|
||||
|
||||
|
@ -354,17 +345,15 @@ static HRESULT Math_min(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &min);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
min = num_val(&v);
|
||||
for(i=1; i < arg_cnt(dp); i++) {
|
||||
hres = to_number(ctx, get_arg(dp, i), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, i), ei, &d);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
d = num_val(&v);
|
||||
if(d < min || isnan(d))
|
||||
min = d;
|
||||
}
|
||||
|
@ -378,7 +367,7 @@ static HRESULT Math_min(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
static HRESULT Math_pow(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT x, y;
|
||||
double x, y;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -397,7 +386,7 @@ static HRESULT Math_pow(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
return hres;
|
||||
|
||||
if(retv)
|
||||
num_set_val(retv, pow(num_val(&x), num_val(&y)));
|
||||
num_set_val(retv, pow(x, y));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -422,7 +411,7 @@ static HRESULT Math_random(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPP
|
|||
static HRESULT Math_round(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -432,19 +421,19 @@ static HRESULT Math_round(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv)
|
||||
num_set_val(retv, floor(num_val(&v)+0.5));
|
||||
num_set_val(retv, floor(x+0.5));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT Math_sin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -454,18 +443,18 @@ static HRESULT Math_sin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) num_set_val(retv, sin(num_val(&v)));
|
||||
if(retv) num_set_val(retv, sin(x));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT Math_sqrt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -475,18 +464,18 @@ static HRESULT Math_sqrt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPAR
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) num_set_val(retv, sqrt(num_val(&v)));
|
||||
if(retv) num_set_val(retv, sqrt(x));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT Math_tan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT v;
|
||||
double x;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -496,11 +485,11 @@ static HRESULT Math_tan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARA
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) num_set_val(retv, tan(num_val(&v)));
|
||||
if(retv) num_set_val(retv, tan(x));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -263,7 +263,7 @@ static const builtin_info_t Number_info = {
|
|||
static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
VARIANT num;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
@ -278,27 +278,30 @@ static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &num);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv)
|
||||
*retv = num;
|
||||
num_set_val(retv, n);
|
||||
break;
|
||||
|
||||
case DISPATCH_CONSTRUCT: {
|
||||
jsdisp_t *obj;
|
||||
VARIANT v;
|
||||
|
||||
if(arg_cnt(dp)) {
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &num);
|
||||
hres = to_number(ctx, get_arg(dp, 0), ei, &n);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
num_set_val(&v, n);
|
||||
}else {
|
||||
V_VT(&num) = VT_I4;
|
||||
V_I4(&num) = 0;
|
||||
V_VT(&v) = VT_I4;
|
||||
V_I4(&v) = 0;
|
||||
}
|
||||
|
||||
hres = create_number(ctx, &num, &obj);
|
||||
hres = create_number(ctx, &v, &obj);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
|
|
|
@ -3522,22 +3522,18 @@ static HRESULT RegExp_multiline(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
|
|||
static INT index_from_var(script_ctx_t *ctx, VARIANT *v)
|
||||
{
|
||||
jsexcept_t ei;
|
||||
VARIANT num;
|
||||
double n;
|
||||
HRESULT hres;
|
||||
|
||||
memset(&ei, 0, sizeof(ei));
|
||||
hres = to_number(ctx, v, &ei, &num);
|
||||
hres = to_number(ctx, v, &ei, &n);
|
||||
if(FAILED(hres)) { /* FIXME: Move ignoring exceptions to to_primitive */
|
||||
VariantClear(&ei.var);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(V_VT(&num) == VT_R8) {
|
||||
DOUBLE d = floor(V_R8(&num));
|
||||
return (DOUBLE)(INT)d == d ? d : 0;
|
||||
}
|
||||
|
||||
return V_I4(&num);
|
||||
n = floor(n);
|
||||
return (double)(INT)n == n ? n : 0;
|
||||
}
|
||||
|
||||
static HRESULT RegExp_lastIndex(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
|
|
Loading…
Reference in New Issue