Piotr Caban : jscript: Improved error handling in VBArray functions.
Alexandre Julliard
julliard at winehq.org
Tue Oct 19 13:03:47 CDT 2010
Module: wine
Branch: master
Commit: 185ef44d008b2541c09653d7b461d8eb435a4b16
URL: http://source.winehq.org/git/wine.git/?a=commit;h=185ef44d008b2541c09653d7b461d8eb435a4b16
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Oct 19 13:52:21 2010 +0200
jscript: Improved error handling in VBArray functions.
---
dlls/jscript/jscript.h | 6 ++++++
dlls/jscript/vbarray.c | 26 +++++++++++++++++++-------
2 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 70b3765..a14c2b4 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -377,6 +377,12 @@ static inline DOUBLE num_val(const VARIANT *v)
return V_VT(v) == VT_I4 ? V_I4(v) : V_R8(v);
}
+static inline void num_set_int(VARIANT *v, INT i)
+{
+ V_VT(v) = VT_I4;
+ V_I4(v) = i;
+}
+
static inline void num_set_val(VARIANT *v, DOUBLE d)
{
if(d == (DOUBLE)(INT)d) {
diff --git a/dlls/jscript/vbarray.c b/dlls/jscript/vbarray.c
index db56f81..8bdeb70 100644
--- a/dlls/jscript/vbarray.c
+++ b/dlls/jscript/vbarray.c
@@ -56,7 +56,7 @@ static HRESULT VBArray_dimensions(script_ctx_t *ctx, vdisp_t *vthis, WORD flags,
return throw_type_error(ctx, ei, IDS_NOT_VBARRAY, NULL);
if(retv)
- num_set_val(retv, SafeArrayGetDim(vbarray->safearray));
+ num_set_int(retv, SafeArrayGetDim(vbarray->safearray));
return S_OK;
}
@@ -79,6 +79,9 @@ static HRESULT VBArray_getItem(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DI
return throw_range_error(ctx, ei, IDS_SUBSCRIPT_OUT_OF_RANGE, NULL);
indexes = heap_alloc(sizeof(int)*size);
+ if(!indexes)
+ return E_OUTOFMEMORY;
+
for(i=0; i<size; i++) {
hres = to_int32(ctx, get_arg(dp, i), ei, indexes+i);
if(FAILED(hres)) {
@@ -127,7 +130,7 @@ static HRESULT VBArray_lbound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DIS
return hres;
if(retv)
- num_set_val(retv, dim);
+ num_set_int(retv, dim);
return S_OK;
}
@@ -206,7 +209,7 @@ static HRESULT VBArray_ubound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DIS
return hres;
if(retv)
- num_set_val(retv, dim);
+ num_set_int(retv, dim);
return S_OK;
}
@@ -286,8 +289,8 @@ static HRESULT VBArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags
if(arg_cnt(dp)<1 || V_VT((arg = get_arg(dp, 0)))!=(VT_ARRAY|VT_VARIANT))
return throw_type_error(ctx, ei, IDS_NOT_VBARRAY, NULL);
- VariantCopy(retv, arg);
- break;
+ hres = VariantCopy(retv, arg);
+ return hres;
case DISPATCH_CONSTRUCT:
if(arg_cnt(dp)<1 || V_VT((arg = get_arg(dp, 0)))!=(VT_ARRAY|VT_VARIANT))
@@ -296,7 +299,12 @@ static HRESULT VBArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags
hres = alloc_vbarray(ctx, NULL, &vbarray);
if(FAILED(hres))
return hres;
- SafeArrayCopy(V_ARRAY(arg), &vbarray->safearray);
+
+ hres = SafeArrayCopy(V_ARRAY(arg), &vbarray->safearray);
+ if(FAILED(hres)) {
+ jsdisp_release(&vbarray->dispex);
+ return hres;
+ }
var_set_jsdisp(retv, &vbarray->dispex);
break;
@@ -335,7 +343,11 @@ HRESULT create_vbarray(script_ctx_t *ctx, SAFEARRAY *sa, jsdisp_t **ret)
if(FAILED(hres))
return hres;
- SafeArrayCopy(sa, &vbarray->safearray);
+ hres = SafeArrayCopy(sa, &vbarray->safearray);
+ if(FAILED(hres)) {
+ jsdisp_release(&vbarray->dispex);
+ return hres;
+ }
*ret = &vbarray->dispex;
return S_OK;
More information about the wine-cvs
mailing list