[PATCH 2/8] jscript: Implement VBArray constructor

Jacek Caban jacek at codeweavers.com
Mon Oct 18 13:35:43 CDT 2010


  Hi Piotr,

+(tmp = new VBArray(createArray())).f = Object.prototype.toString;
+ok(tmp.f() === "[object Object]", "tmp.f() = " + tmp.f());


We have Function.call implemented now, you can use 
String.prototype.toString.call(new VBArray ...).

+    case DISPATCH_METHOD:
+        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);

Please add error handling. Also a test would be nice, at least something like getVT(createArray()).

+    case DISPATCH_CONSTRUCT:
+        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);
+
+        hres = alloc_vbarray(ctx, NULL,&vbarray);
+        if(FAILED(hres))
+            return hres;
+        SafeArrayCopy(V_ARRAY(arg),&vbarray->safearray);


Error handling.

(From 'PATCH 4/8] jscript: Added VBArray.ubound() implementation'):

+    if(retv)
+        num_set_val(retv, dim);


num_set_val is for DOUBLE and eventually abused for integers out of VT_I4 
range. You can set value directly here to avoid conversions. It might be a 
good idea to introduce something like var_set_int helper given that we 
could use it in quite a few places.

(From '[PATCH 6/8] jscript: Added VBArray.getItem() implementation'):

+    size = arg_cnt(dp);
+    if(size<  SafeArrayGetDim(vbarray->safearray))
+        return throw_range_error(ctx, ei, IDS_SUBSCRIPT_OUT_OF_RANGE, NULL);
+
+    indexes = heap_alloc(sizeof(int)*size);


Error handling.

(From '[PATCH 8/8] jscript: Added VBArray handling to to_object()'):

-exception_test(function() {(new VBArray(createArray())).lbound("aaa");}, "RangeError", -2146828279);
-exception_test(function() {(new VBArray(createArray())).lbound(3);}, "RangeError", -2146828279);
+exception_test(function() {createArray().lbound("aaa");}, "RangeError", -2146828279);
+exception_test(function() {createArray().lbound(3);}, "RangeError", -2146828279);

There is no reason to change these tests, esp. that they were better before 
the change. Please add proper to_object tests, for example by calling 
Object() function or doing proper call on explicitly converted object.

+    SafeArrayCopy(sa,&vbarray->safearray);


Error handling.


Jacek



More information about the wine-devel mailing list