diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index 71b526d..b3dc780 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -46,24 +46,56 @@
 
 static const WCHAR default_separatorW[] = {',',0};
 
-static HRESULT get_jsdisp_length(script_ctx_t *ctx, DispatchEx *obj, jsexcept_t *ei, DWORD *ret)
+static inline ArrayInstance *array_from_vdisp(vdisp_t *vdisp)
 {
+    return (ArrayInstance*)vdisp->u.jsdisp;
+}
+
+static inline ArrayInstance *array_this(vdisp_t *jsthis)
+{
+    return is_vclass(jsthis, JSCLASS_ARRAY) ? array_from_vdisp(jsthis) : NULL;
+}
+
+static HRESULT get_length(script_ctx_t *ctx, vdisp_t *vdisp, jsexcept_t *ei, DispatchEx **jsthis, DWORD *ret)
+{
+    ArrayInstance *array;
     VARIANT var;
     HRESULT hres;
 
-    hres = jsdisp_propget_name(obj, lengthW, &var, ei, NULL/*FIXME*/);
+    array = array_this(vdisp);
+    if(array) {
+        *jsthis = &array->dispex;
+        *ret = array->length;
+        return S_OK;
+    }
+
+    if(!is_jsdisp(vdisp)) {
+        FIXME("Not JScript object\n");
+        return E_FAIL;
+    }
+
+    hres = jsdisp_propget_name(vdisp->u.jsdisp, lengthW, &var, ei, NULL/*FIXME*/);
     if(FAILED(hres))
         return hres;
 
     hres = to_uint32(ctx, &var, ei, ret);
     VariantClear(&var);
-    return hres;
+    if(FAILED(hres))
+        return hres;
+
+    *jsthis = vdisp->u.jsdisp;
+    return S_OK;
 }
 
-static HRESULT set_jsdisp_length(DispatchEx *obj, jsexcept_t *ei, DWORD length)
+static HRESULT set_length(DispatchEx *obj, jsexcept_t *ei, DWORD length)
 {
     VARIANT var;
 
+    if(is_class(obj, JSCLASS_ARRAY)) {
+        ((ArrayInstance*)obj)->length = length;
+        return S_OK;
+    }
+
     V_VT(&var) = VT_I4;
     V_I4(&var) = length;
     return jsdisp_propput_name(obj, lengthW, &var, ei, NULL/*FIXME*/);
@@ -84,10 +116,10 @@
     return ptr+1;
 }
 
-static HRESULT Array_length(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_length(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    ArrayInstance *This = (ArrayInstance*)dispex;
+    ArrayInstance *This = array_from_vdisp(jsthis);
 
     TRACE("%p %d\n", This, This->length);
 
@@ -112,7 +144,7 @@
             return throw_range_error(ctx, ei, IDS_INVALID_LENGTH, NULL);
 
         for(i=len; i<This->length; i++) {
-            hres = jsdisp_delete_idx(dispex, i);
+            hres = jsdisp_delete_idx(&This->dispex, i);
             if(FAILED(hres))
                 return hres;
         }
@@ -173,7 +205,7 @@
     return jsdisp_propput_idx(array, (*len)++, &var, ei, caller);
 }
 
-static HRESULT Array_concat(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DispatchEx *ret;
@@ -186,7 +218,7 @@
     if(FAILED(hres))
         return hres;
 
-    hres = concat_obj(ret, (IDispatch*)_IDispatchEx_(dispex), &len, ei, caller);
+    hres = concat_obj(ret, jsthis->u.disp, &len, ei, caller);
     if(SUCCEEDED(hres)) {
         VARIANT *arg;
         DWORD i;
@@ -312,7 +344,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.5 */
-static HRESULT Array_join(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_join(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DWORD length;
@@ -320,8 +352,8 @@
 
     TRACE("\n");
 
-    if(is_class(dispex, JSCLASS_ARRAY)) {
-        length = ((ArrayInstance*)dispex)->length;
+    if(is_vclass(jsthis, JSCLASS_ARRAY)) {
+        length = array_from_vdisp(jsthis)->length;
     }else {
         FIXME("dispid is not Array\n");
         return E_NOTIMPL;
@@ -334,17 +366,17 @@
         if(FAILED(hres))
             return hres;
 
-        hres = array_join(ctx, dispex, length, sep, retv, ei, caller);
+        hres = array_join(ctx, jsthis->u.jsdisp, length, sep, retv, ei, caller);
 
         SysFreeString(sep);
     }else {
-        hres = array_join(ctx, dispex, length, default_separatorW, retv, ei, caller);
+        hres = array_join(ctx, jsthis->u.jsdisp, length, default_separatorW, retv, ei, caller);
     }
 
     return hres;
 }
 
-static HRESULT Array_pop(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_pop(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT val;
@@ -357,8 +389,8 @@
 
     TRACE("\n");
 
-    if(is_class(dispex, JSCLASS_ARRAY)) {
-        ArrayInstance *array = (ArrayInstance*)dispex;
+    if(is_vclass(jsthis, JSCLASS_ARRAY)) {
+        ArrayInstance *array = array_from_vdisp(jsthis);
         length = array->length;
     }else {
         FIXME("not Array this\n");
@@ -372,13 +404,13 @@
     }
 
     sprintfW(buf, formatW, --length);
-    hres = jsdisp_get_id(dispex, buf, 0, &id);
+    hres = jsdisp_get_id(jsthis->u.jsdisp, buf, 0, &id);
     if(SUCCEEDED(hres)) {
-        hres = jsdisp_propget(dispex, id, &val, ei, caller);
+        hres = jsdisp_propget(jsthis->u.jsdisp, id, &val, ei, caller);
         if(FAILED(hres))
             return hres;
 
-        hres = IDispatchEx_DeleteMemberByDispID(_IDispatchEx_(dispex), id);
+        hres = IDispatchEx_DeleteMemberByDispID(jsthis->u.dispex, id);
     }else if(hres == DISP_E_UNKNOWNNAME) {
         V_VT(&val) = VT_EMPTY;
         hres = S_OK;
@@ -387,10 +419,8 @@
     }
 
     if(SUCCEEDED(hres)) {
-        if(is_class(dispex, JSCLASS_ARRAY)) {
-            ArrayInstance *array = (ArrayInstance*)dispex;
-            array->length = length;
-        }
+        ArrayInstance *array = array_from_vdisp(jsthis);
+        array->length = length;
     }
 
     if(FAILED(hres)) {
@@ -406,35 +436,30 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.7 */
-static HRESULT Array_push(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_push(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
+    DispatchEx *jsthis;
     DWORD length = 0;
     int i, n;
     HRESULT hres;
 
     TRACE("\n");
 
-    if(dispex->builtin_info->class == JSCLASS_ARRAY) {
-        length = ((ArrayInstance*)dispex)->length;
-    }else {
-        hres = get_jsdisp_length(ctx, dispex, ei, &length);
-        if(FAILED(hres))
-            return hres;
-    }
+    hres = get_length(ctx, vthis, ei, &jsthis, &length);
+    if(FAILED(hres))
+        return hres;
 
     n = arg_cnt(dp);
     for(i=0; i < n; i++) {
-        hres = jsdisp_propput_idx(dispex, length+i, get_arg(dp, i), ei, sp);
+        hres = jsdisp_propput_idx(jsthis, length+i, get_arg(dp, i), ei, sp);
         if(FAILED(hres))
             return hres;
     }
 
-    if(!is_class(dispex, JSCLASS_ARRAY)) {
-        hres = set_jsdisp_length(dispex, ei, length+n);
-        if(FAILED(hres))
-            return hres;
-    }
+    hres = set_length(jsthis, ei, length+n);
+    if(FAILED(hres))
+        return hres;
 
     if(retv) {
         V_VT(retv) = VT_I4;
@@ -443,7 +468,7 @@
     return S_OK;
 }
 
-static HRESULT Array_reverse(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_reverse(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
@@ -451,21 +476,22 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.9 */
-static HRESULT Array_shift(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_shift(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DispatchEx *jsthis;
     DWORD length = 0, i;
     VARIANT v, ret;
     HRESULT hres;
 
     TRACE("\n");
 
-    if(is_class(dispex, JSCLASS_ARRAY)) {
-        length = ((ArrayInstance*)dispex)->length;
-    }else {
-        hres = get_jsdisp_length(ctx, dispex, ei, &length);
-        if(SUCCEEDED(hres) && !length)
-            hres = set_jsdisp_length(dispex, ei, 0);
+    hres = get_length(ctx, vthis, ei, &jsthis, &length);
+    if(FAILED(hres))
+        return hres;
+
+    if(!length) {
+        hres = set_length(jsthis, ei, 0);
         if(FAILED(hres))
             return hres;
     }
@@ -476,24 +502,24 @@
         return S_OK;
     }
 
-    hres = jsdisp_propget_idx(dispex, 0, &ret, ei, caller);
+    hres = jsdisp_propget_idx(jsthis, 0, &ret, ei, caller);
     if(hres == DISP_E_UNKNOWNNAME) {
         V_VT(&ret) = VT_EMPTY;
         hres = S_OK;
     }
 
     for(i=1; SUCCEEDED(hres) && i<length; i++) {
-        hres = jsdisp_propget_idx(dispex, i, &v, ei, caller);
+        hres = jsdisp_propget_idx(jsthis, i, &v, ei, caller);
         if(hres == DISP_E_UNKNOWNNAME)
-            hres = jsdisp_delete_idx(dispex, i-1);
+            hres = jsdisp_delete_idx(jsthis, i-1);
         else if(SUCCEEDED(hres))
-            hres = jsdisp_propput_idx(dispex, i-1, &v, ei, caller);
+            hres = jsdisp_propput_idx(jsthis, i-1, &v, ei, caller);
     }
 
     if(SUCCEEDED(hres)) {
-        hres = jsdisp_delete_idx(dispex, length-1);
+        hres = jsdisp_delete_idx(jsthis, length-1);
         if(SUCCEEDED(hres))
-            hres = set_jsdisp_length(dispex, ei, length-1);
+            hres = set_length(jsthis, ei, length-1);
     }
 
     if(SUCCEEDED(hres) && retv)
@@ -504,10 +530,10 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.10 */
-static HRESULT Array_slice(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    DispatchEx *arr;
+    DispatchEx *arr, *jsthis;
     VARIANT v;
     DOUBLE range;
     DWORD length, start, end, idx;
@@ -515,13 +541,9 @@
 
     TRACE("\n");
 
-    if(is_class(dispex, JSCLASS_ARRAY)) {
-        length = ((ArrayInstance*)dispex)->length;
-    }else {
-        hres = get_jsdisp_length(ctx, dispex, ei, &length);
-        if(FAILED(hres))
-            return hres;
-    }
+    hres = get_length(ctx, vthis, ei, &jsthis, &length);
+    if(FAILED(hres))
+        return hres;
 
     if(arg_cnt(dp)) {
         hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -562,7 +584,7 @@
         return hres;
 
     for(idx=start; idx<end; idx++) {
-        hres = jsdisp_propget_idx(dispex, idx, &v, ei, sp);
+        hres = jsdisp_propget_idx(jsthis, idx, &v, ei, sp);
         if(hres == DISP_E_UNKNOWNNAME)
             continue;
 
@@ -641,7 +663,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.11 */
-static HRESULT Array_sort(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DispatchEx *cmp_func = NULL;
@@ -652,8 +674,8 @@
 
     TRACE("\n");
 
-    if(is_class(dispex, JSCLASS_ARRAY)) {
-        length = ((ArrayInstance*)dispex)->length;
+    if(is_vclass(jsthis, JSCLASS_ARRAY)) {
+        length = array_from_vdisp(jsthis)->length;
     }else {
         FIXME("unsupported this not array\n");
         return E_NOTIMPL;
@@ -687,8 +709,8 @@
             jsdisp_release(cmp_func);
         if(retv) {
             V_VT(retv) = VT_DISPATCH;
-            V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(dispex);
-	    IDispatchEx_AddRef(_IDispatchEx_(dispex));
+            V_DISPATCH(retv) = jsthis->u.disp;
+	    IDispatch_AddRef(jsthis->u.disp);
         }
         return S_OK;
     }
@@ -696,7 +718,7 @@
     vtab = heap_alloc_zero(length * sizeof(VARIANT));
     if(vtab) {
         for(i=0; i<length; i++) {
-            hres = jsdisp_propget_idx(dispex, i, vtab+i, ei, caller);
+            hres = jsdisp_propget_idx(jsthis->u.jsdisp, i, vtab+i, ei, caller);
             if(FAILED(hres) && hres != DISP_E_UNKNOWNNAME) {
                 WARN("Could not get elem %d: %08x\n", i, hres);
                 break;
@@ -773,7 +795,7 @@
         }
 
         for(i=0; SUCCEEDED(hres) && i < length; i++)
-            hres = jsdisp_propput_idx(dispex, i, sorttab[i], ei, caller);
+            hres = jsdisp_propput_idx(jsthis->u.jsdisp, i, sorttab[i], ei, caller);
     }
 
     if(vtab) {
@@ -790,31 +812,27 @@
 
     if(retv) {
         V_VT(retv) = VT_DISPATCH;
-        V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(dispex);
-        IDispatch_AddRef(_IDispatchEx_(dispex));
+        V_DISPATCH(retv) = jsthis->u.disp;
+        IDispatch_AddRef(jsthis->u.disp);
     }
 
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.4.4.12 */
-static HRESULT Array_splice(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DWORD length, start=0, delete_cnt=0, argc, i, add_args = 0;
-    DispatchEx *ret_array = NULL;
+    DispatchEx *ret_array = NULL, *jsthis;
     VARIANT v;
     HRESULT hres = S_OK;
 
     TRACE("\n");
 
-    if(is_class(dispex, JSCLASS_ARRAY)) {
-        length = ((ArrayInstance*)dispex)->length;
-    }else {
-        hres = get_jsdisp_length(ctx, dispex, ei, &length);
-        if(FAILED(hres))
-            return hres;
-    }
+    hres = get_length(ctx, vthis, ei, &jsthis, &length);
+    if(FAILED(hres))
+        return hres;
 
     argc = arg_cnt(dp);
     if(argc >= 1) {
@@ -853,7 +871,7 @@
             return hres;
 
         for(i=0; SUCCEEDED(hres) && i < delete_cnt; i++) {
-            hres = jsdisp_propget_idx(dispex, start+i, &v, ei, caller);
+            hres = jsdisp_propget_idx(jsthis, start+i, &v, ei, caller);
             if(hres == DISP_E_UNKNOWNNAME)
                 hres = S_OK;
             else if(SUCCEEDED(hres))
@@ -870,32 +888,32 @@
 
     if(add_args < delete_cnt) {
         for(i = start; SUCCEEDED(hres) && i < length-delete_cnt; i++) {
-            hres = jsdisp_propget_idx(dispex, i+delete_cnt, &v, ei, caller);
+            hres = jsdisp_propget_idx(jsthis, i+delete_cnt, &v, ei, caller);
             if(hres == DISP_E_UNKNOWNNAME)
-                hres = jsdisp_delete_idx(dispex, i+add_args);
+                hres = jsdisp_delete_idx(jsthis, i+add_args);
             else if(SUCCEEDED(hres))
-                hres = jsdisp_propput_idx(dispex, i+add_args, &v, ei, caller);
+                hres = jsdisp_propput_idx(jsthis, i+add_args, &v, ei, caller);
         }
 
         for(i=length; SUCCEEDED(hres) && i != length-delete_cnt+add_args; i--)
-            hres = jsdisp_delete_idx(dispex, i-1);
+            hres = jsdisp_delete_idx(jsthis, i-1);
     }else if(add_args > delete_cnt) {
         for(i=length-delete_cnt; SUCCEEDED(hres) && i != start; i--) {
-            hres = jsdisp_propget_idx(dispex, i+delete_cnt-1, &v, ei, caller);
+            hres = jsdisp_propget_idx(jsthis, i+delete_cnt-1, &v, ei, caller);
             if(hres == DISP_E_UNKNOWNNAME)
-                hres = jsdisp_delete_idx(dispex, i+add_args-1);
+                hres = jsdisp_delete_idx(jsthis, i+add_args-1);
             else if(SUCCEEDED(hres))
-                hres = jsdisp_propput_idx(dispex, i+add_args-1, &v, ei, caller);
+                hres = jsdisp_propput_idx(jsthis, i+add_args-1, &v, ei, caller);
         }
     }
 
     for(i=0; SUCCEEDED(hres) && i < add_args; i++)
-        hres = jsdisp_propput_idx(dispex, start+i, get_arg(dp,i+2), ei, caller);
+        hres = jsdisp_propput_idx(jsthis, start+i, get_arg(dp,i+2), ei, caller);
 
     if(SUCCEEDED(hres)) {
         V_VT(&v) = VT_I4;
         V_I4(&v) = length-delete_cnt+add_args;
-        hres = jsdisp_propput_name(dispex, lengthW, &v, ei, caller);
+        hres = jsdisp_propput_name(jsthis, lengthW, &v, ei, caller);
     }
 
     if(FAILED(hres)) {
@@ -912,20 +930,23 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.2 */
-static HRESULT Array_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
+    ArrayInstance *array;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_ARRAY)) {
-        WARN("not Array object\n");
+    array = array_this(jsthis);
+    if(!array) {
+        FIXME("not Array object\n");
         return E_FAIL;
     }
 
-    return array_join(ctx, dispex, ((ArrayInstance*)dispex)->length, default_separatorW, retv, ei, sp);
+    return array_join(ctx, &array->dispex, array->length, default_separatorW, retv, ei, sp);
 }
 
-static HRESULT Array_toLocaleString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_toLocaleString(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
@@ -933,9 +954,10 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.13 */
-static HRESULT Array_unshift(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_unshift(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DispatchEx *jsthis;
     WCHAR buf[14], *buf_end, *str;
     DWORD argc, i, length;
     VARIANT var;
@@ -944,13 +966,9 @@
 
     TRACE("\n");
 
-    if(is_class(dispex, JSCLASS_ARRAY)) {
-        length = ((ArrayInstance*)dispex)->length;
-    }else {
-        hres = get_jsdisp_length(ctx, dispex, ei, &length);
-        if(FAILED(hres))
-            return hres;
-    }
+    hres = get_length(ctx, vthis, ei, &jsthis, &length);
+    if(FAILED(hres))
+        return hres;
 
     argc = arg_cnt(dp);
     if(!argc) {
@@ -966,16 +984,16 @@
     while(i--) {
         str = idx_to_str(i, buf_end);
 
-        hres = jsdisp_get_id(dispex, str, 0, &id);
+        hres = jsdisp_get_id(jsthis, str, 0, &id);
         if(SUCCEEDED(hres)) {
-            hres = jsdisp_propget(dispex, id, &var, ei, caller);
+            hres = jsdisp_propget(jsthis, id, &var, ei, caller);
             if(FAILED(hres))
                 return hres;
 
-            hres = jsdisp_propput_idx(dispex, i+argc, &var, ei, caller);
+            hres = jsdisp_propput_idx(jsthis, i+argc, &var, ei, caller);
             VariantClear(&var);
         }else if(hres == DISP_E_UNKNOWNNAME) {
-            hres = IDispatchEx_DeleteMemberByDispID(_IDispatchEx_(dispex), id);
+            hres = IDispatchEx_DeleteMemberByDispID(vthis->u.dispex, id);
         }
 
         if(FAILED(hres))
@@ -983,23 +1001,21 @@
     }
 
     for(i=0; i<argc; i++) {
-        hres = jsdisp_propput_idx(dispex, i, get_arg(dp,i), ei, caller);
+        hres = jsdisp_propput_idx(jsthis, i, get_arg(dp,i), ei, caller);
         if(FAILED(hres))
             return hres;
     }
 
-    if(!is_class(dispex, JSCLASS_ARRAY)) {
-        hres = set_jsdisp_length(dispex, ei, length+argc);
-        if(FAILED(hres))
-            return hres;
-    }
+    hres = set_length(jsthis, ei, length+argc);
+    if(FAILED(hres))
+        return hres;
 
     if(retv)
         V_VT(retv) = VT_EMPTY;
     return S_OK;
 }
 
-static HRESULT Array_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -1008,7 +1024,7 @@
     case INVOKE_FUNC:
         return throw_type_error(ctx, ei, IDS_NOT_FUNC, NULL);
     case INVOKE_PROPERTYGET:
-        return array_join(ctx, dispex, ((ArrayInstance*)dispex)->length, default_separatorW, retv, ei, sp);
+        return array_join(ctx, jsthis->u.jsdisp, array_from_vdisp(jsthis)->length, default_separatorW, retv, ei, sp);
     default:
         FIXME("unimplemented flags %x\n", flags);
         return E_NOTIMPL;
@@ -1068,7 +1084,7 @@
     Array_on_put
 };
 
-static HRESULT ArrayConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT ArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DispatchEx *obj;
diff --git a/dlls/jscript/bool.c b/dlls/jscript/bool.c
index 998c5d2..1fca406 100644
--- a/dlls/jscript/bool.c
+++ b/dlls/jscript/bool.c
@@ -32,20 +32,26 @@
 static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
 static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
 
+static inline BoolInstance *bool_this(vdisp_t *jsthis)
+{
+    return is_vclass(jsthis, JSCLASS_BOOLEAN) ? (BoolInstance*)jsthis->u.jsdisp : NULL;
+}
+
 /* ECMA-262 3rd Edition    15.6.4.2 */
-static HRESULT Bool_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Bool_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
+    BoolInstance *bool;
+
     static const WCHAR trueW[] = {'t','r','u','e',0};
     static const WCHAR falseW[] = {'f','a','l','s','e',0};
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_BOOLEAN))
+    if(!(bool = bool_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_BOOL, NULL);
 
     if(retv) {
-        BoolInstance *bool = (BoolInstance*)dispex;
         BSTR val;
 
         if(bool->val) val = SysAllocString(trueW);
@@ -62,17 +68,17 @@
 }
 
 /* ECMA-262 3rd Edition    15.6.4.3 */
-static HRESULT Bool_valueOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Bool_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
+    BoolInstance *bool;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_BOOLEAN))
+    if(!(bool = bool_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_BOOL, NULL);
 
     if(retv) {
-        BoolInstance *bool = (BoolInstance*)dispex;
-
         V_VT(retv) = VT_BOOL;
         V_BOOL(retv) = bool->val;
     }
@@ -80,7 +86,7 @@
     return S_OK;
 }
 
-static HRESULT Bool_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Bool_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -111,7 +117,7 @@
     NULL
 };
 
-static HRESULT BoolConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT BoolConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     HRESULT hres;
diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c
index 7da320b..213d994 100644
--- a/dlls/jscript/date.c
+++ b/dlls/jscript/date.c
@@ -94,6 +94,11 @@
 static const WCHAR UTCW[] = {'U','T','C',0};
 static const WCHAR parseW[] = {'p','a','r','s','e',0};
 
+static inline DateInstance *date_this(vdisp_t *jsthis)
+{
+    return is_vclass(jsthis, JSCLASS_DATE) ? (DateInstance*)jsthis->u.jsdisp : NULL;
+}
+
 /*ECMA-262 3rd Edition    15.9.1.2 */
 #define MS_PER_DAY 86400000
 #define MS_PER_HOUR 3600000
@@ -595,19 +600,21 @@
     return date_to_string(time, TRUE, offset, retv);
 }
 
-static HRESULT Date_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    return dateobj_to_string((DateInstance*)dispex, retv);
+    return dateobj_to_string(date, retv);
 }
 
 /* ECMA-262 3rd Edition    15.9.1.5 */
-static HRESULT Date_toLocaleString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -618,11 +625,9 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    date = (DateInstance*)dispex;
-
     if(isnan(date->time)) {
         if(retv) {
             V_VT(retv) = VT_BSTR;
@@ -654,23 +659,23 @@
     return S_OK;
 }
 
-static HRESULT Date_valueOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, date->time);
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.42 */
-static HRESULT Date_toUTCString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toUTCString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -698,11 +703,9 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    date = (DateInstance*)dispex;
-
     if(isnan(date->time)) {
         if(retv) {
             V_VT(retv) = VT_BSTR;
@@ -875,17 +878,19 @@
     return S_OK;
 }
 
-static HRESULT Date_toDateString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toDateString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
-    if(!is_class(dispex, JSCLASS_DATE))
+    DateInstance *date;
+
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    return dateobj_to_date_string((DateInstance*)dispex, retv);
+    return dateobj_to_date_string(date, retv);
 }
 
 /* ECMA-262 3rd Edition    15.9.5.4 */
-static HRESULT Date_toTimeString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toTimeString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -901,11 +906,9 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    date = (DateInstance*)dispex;
-
     if(isnan(date->time)) {
         if(retv) {
             V_VT(retv) = VT_BSTR;
@@ -947,7 +950,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.6 */
-static HRESULT Date_toLocaleDateString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toLocaleDateString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -958,11 +961,9 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    date = (DateInstance*)dispex;
-
     if(isnan(date->time)) {
         if(retv) {
             V_VT(retv) = VT_BSTR;
@@ -992,7 +993,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.7 */
-static HRESULT Date_toLocaleTimeString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toLocaleTimeString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -1003,11 +1004,9 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    date = (DateInstance*)dispex;
-
     if(isnan(date->time)) {
         if(retv) {
             V_VT(retv) = VT_BSTR;
@@ -1021,7 +1020,7 @@
     st = create_systemtime(local_time(date->time, date));
 
     if(st.wYear<1601 || st.wYear>9999)
-        return Date_toTimeString(ctx, dispex, flags, dp, retv, ei, caller);
+        return Date_toTimeString(ctx, jsthis, flags, dp, retv, ei, caller);
 
     if(retv) {
         len = GetTimeFormatW(ctx->lcid, 0, &st, NULL, NULL, 0);
@@ -1037,32 +1036,33 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.9 */
-static HRESULT Date_getTime(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getTime(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, date->time);
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.10 */
-static HRESULT Date_getFullYear(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
         DOUBLE time = local_time(date->time, date);
 
         num_set_val(retv, year_from_time(time));
@@ -1071,32 +1071,33 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.11 */
-static HRESULT Date_getUTCFullYear(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, year_from_time(date->time));
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.12 */
-static HRESULT Date_getMonth(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
         DOUBLE time = local_time(date->time, date);
 
         num_set_val(retv, month_from_time(time));
@@ -1105,32 +1106,33 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.13 */
-static HRESULT Date_getUTCMonth(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, month_from_time(date->time));
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.14 */
-static HRESULT Date_getDate(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
         DOUBLE time = local_time(date->time, date);
 
         num_set_val(retv, date_from_time(time));
@@ -1139,32 +1141,33 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.15 */
-static HRESULT Date_getUTCDate(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, date_from_time(date->time));
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.16 */
-static HRESULT Date_getDay(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getDay(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
         DOUBLE time = local_time(date->time, date);
 
         num_set_val(retv, week_day(time));
@@ -1173,32 +1176,33 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.17 */
-static HRESULT Date_getUTCDay(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCDay(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, week_day(date->time));
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.18 */
-static HRESULT Date_getHours(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
         DOUBLE time = local_time(date->time, date);
 
         num_set_val(retv, hour_from_time(time));
@@ -1207,32 +1211,33 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.19 */
-static HRESULT Date_getUTCHours(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, hour_from_time(date->time));
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.20 */
-static HRESULT Date_getMinutes(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
         DOUBLE time = local_time(date->time, date);
 
         num_set_val(retv, min_from_time(time));
@@ -1241,32 +1246,33 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.21 */
-static HRESULT Date_getUTCMinutes(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, min_from_time(date->time));
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.22 */
-static HRESULT Date_getSeconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
         DOUBLE time = local_time(date->time, date);
 
         num_set_val(retv, sec_from_time(time));
@@ -1275,32 +1281,33 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.23 */
-static HRESULT Date_getUTCSeconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, sec_from_time(date->time));
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.24 */
-static HRESULT Date_getMilliseconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
         DOUBLE time = local_time(date->time, date);
 
         num_set_val(retv, ms_from_time(time));
@@ -1309,40 +1316,40 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.25 */
-static HRESULT Date_getUTCMilliseconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, ms_from_time(date->time));
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.26 */
-static HRESULT Date_getTimezoneOffset(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getTimezoneOffset(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    if(retv) {
-        DateInstance *date = (DateInstance*)dispex;
+    if(retv)
         num_set_val(retv, floor(
                     (date->time-local_time(date->time, date))/MS_PER_MINUTE));
-    }
     return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.5.27 */
-static HRESULT Date_setTime(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setTime(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1351,7 +1358,7 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
@@ -1361,7 +1368,6 @@
     if(FAILED(hres))
         return hres;
 
-    date = (DateInstance*)dispex;
     date->time = time_clip(num_val(&v));
 
     if(retv)
@@ -1371,7 +1377,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.28 */
-static HRESULT Date_setMilliseconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1381,7 +1387,7 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
@@ -1391,7 +1397,6 @@
     if(FAILED(hres))
         return hres;
 
-    date = (DateInstance*)dispex;
     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)));
@@ -1404,7 +1409,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.29 */
-static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1414,7 +1419,7 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
@@ -1424,7 +1429,6 @@
     if(FAILED(hres))
         return hres;
 
-    date = (DateInstance*)dispex;
     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)));
@@ -1437,7 +1441,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.30 */
-static HRESULT Date_setSeconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1447,13 +1451,12 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
         return throw_type_error(ctx, ei, IDS_ARG_NOT_OPT, NULL);
 
-    date = (DateInstance*)dispex;
     t = local_time(date->time, date);
 
     hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -1480,7 +1483,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.31 */
-static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1490,13 +1493,12 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
         return throw_type_error(ctx, ei, IDS_ARG_NOT_OPT, NULL);
 
-    date = (DateInstance*)dispex;
     t = date->time;
 
     hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -1523,7 +1525,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.33 */
-static HRESULT Date_setMinutes(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1533,13 +1535,12 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
         return throw_type_error(ctx, ei, IDS_ARG_NOT_OPT, NULL);
 
-    date = (DateInstance*)dispex;
     t = local_time(date->time, date);
 
     hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -1574,7 +1575,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.34 */
-static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1584,13 +1585,12 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
         return throw_type_error(ctx, ei, IDS_ARG_NOT_OPT, NULL);
 
-    date = (DateInstance*)dispex;
     t = date->time;
 
     hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -1625,7 +1625,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.35 */
-static HRESULT Date_setHours(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1635,13 +1635,12 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
         return throw_type_error(ctx, ei, IDS_ARG_NOT_OPT, NULL);
 
-    date = (DateInstance*)dispex;
     t = local_time(date->time, date);
 
     hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -1683,23 +1682,22 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.36 */
-static HRESULT Date_setUTCHours(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
+    DateInstance *date;
     VARIANT v;
     HRESULT hres;
-    DateInstance *date;
     DOUBLE t, hour, min, sec, ms;
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
         return throw_type_error(ctx, ei, IDS_ARG_NOT_OPT, NULL);
 
-    date = (DateInstance*)dispex;
     t = date->time;
 
     hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -1741,7 +1739,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.36 */
-static HRESULT Date_setDate(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1751,7 +1749,7 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
@@ -1761,7 +1759,6 @@
     if(FAILED(hres))
         return hres;
 
-    date = (DateInstance*)dispex;
     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));
@@ -1774,7 +1771,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.37 */
-static HRESULT Date_setUTCDate(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1784,7 +1781,7 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
@@ -1794,7 +1791,6 @@
     if(FAILED(hres))
         return hres;
 
-    date = (DateInstance*)dispex;
     t = date->time;
     t = make_date(make_day(year_from_time(t), month_from_time(t),
                 num_val(&v)), time_within_day(t));
@@ -1807,7 +1803,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.38 */
-static HRESULT Date_setMonth(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1817,13 +1813,12 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
         return throw_type_error(ctx, ei, IDS_ARG_NOT_OPT, NULL);
 
-    date = (DateInstance*)dispex;
     t = local_time(date->time, date);
 
     hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -1850,7 +1845,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.39 */
-static HRESULT Date_setUTCMonth(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1860,13 +1855,12 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
         return throw_type_error(ctx, ei, IDS_ARG_NOT_OPT, NULL);
 
-    date = (DateInstance*)dispex;
     t = date->time;
 
     hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -1893,7 +1887,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.40 */
-static HRESULT Date_setFullYear(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1903,13 +1897,12 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
         return throw_type_error(ctx, ei, IDS_ARG_NOT_OPT, NULL);
 
-    date = (DateInstance*)dispex;
     t = local_time(date->time, date);
 
     hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -1943,7 +1936,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.41 */
-static HRESULT Date_setUTCFullYear(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1953,13 +1946,12 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
     if(!arg_cnt(dp))
         return throw_type_error(ctx, ei, IDS_ARG_NOT_OPT, NULL);
 
-    date = (DateInstance*)dispex;
     t = date->time;
 
     hres = to_number(ctx, get_arg(dp, 0), ei, &v);
@@ -1993,7 +1985,7 @@
 }
 
 /* ECMA-262 3rd Edition    B2.4 */
-static HRESULT Date_getYear(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DateInstance *date;
@@ -2001,13 +1993,10 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_DATE))
+    if(!(date = date_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_DATE, NULL);
 
-    date = (DateInstance*)dispex;
     t = local_time(date->time, date);
-
-
     if(isnan(t)) {
         if(retv)
             num_set_nan(retv);
@@ -2021,7 +2010,7 @@
     return S_OK;
 }
 
-static HRESULT Date_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -2383,7 +2372,7 @@
     return S_OK;
 }
 
-static HRESULT DateConstr_parse(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT DateConstr_parse(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     BSTR parse_str;
@@ -2497,7 +2486,7 @@
     return S_OK;
 }
 
-static HRESULT DateConstr_UTC(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT DateConstr_UTC(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -2505,7 +2494,7 @@
     return date_utc(ctx, dp, retv, ei);
 }
 
-static HRESULT DateConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT DateConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DispatchEx *date;
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 921b4ad..307efd9 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -245,12 +245,19 @@
     HRESULT hres;
 
     switch(prop->type) {
-    case PROP_BUILTIN:
+    case PROP_BUILTIN: {
+        vdisp_t vthis;
+
         if(flags == DISPATCH_CONSTRUCT && (prop->flags & DISPATCH_METHOD)) {
             WARN("%s is not a constructor\n", debugstr_w(prop->name));
             return E_INVALIDARG;
         }
-        return prop->u.p->invoke(This->ctx, jsthis, flags, dp, retv, ei, caller);
+
+        set_jsdisp(&vthis, jsthis);
+        hres = prop->u.p->invoke(This->ctx, &vthis, flags, dp, retv, ei, caller);
+        vdisp_release(&vthis);
+        return hres;
+    }
     case PROP_PROTREF:
         return invoke_prop_func(This->prototype, jsthis, This->prototype->props+prop->u.ref, flags, dp, retv, ei, caller);
     case PROP_VARIANT: {
@@ -304,7 +311,11 @@
 
             hres = VariantCopy(retv, &prop->u.var);
         }else {
-            hres = prop->u.p->invoke(This->ctx, This, DISPATCH_PROPERTYGET, dp, retv, ei, caller);
+            vdisp_t vthis;
+
+            set_jsdisp(&vthis, This);
+            hres = prop->u.p->invoke(This->ctx, &vthis, DISPATCH_PROPERTYGET, dp, retv, ei, caller);
+            vdisp_release(&vthis);
         }
         break;
     case PROP_PROTREF:
@@ -335,8 +346,14 @@
 
     switch(prop->type) {
     case PROP_BUILTIN:
-        if(!(prop->flags & PROPF_METHOD))
-            return prop->u.p->invoke(This->ctx, This, DISPATCH_PROPERTYPUT, dp, NULL, ei, caller);
+        if(!(prop->flags & PROPF_METHOD)) {
+            vdisp_t vthis;
+
+            set_jsdisp(&vthis, This);
+            hres = prop->u.p->invoke(This->ctx, &vthis, DISPATCH_PROPERTYPUT, dp, NULL, ei, caller);
+            vdisp_release(&vthis);
+            return hres;
+        }
     case PROP_PROTREF:
         prop->type = PROP_VARIANT;
         prop->flags = PROPF_ENUM;
@@ -823,10 +840,16 @@
     return DISP_E_UNKNOWNNAME;
 }
 
-HRESULT jsdisp_call_value(DispatchEx *disp, WORD flags, DISPPARAMS *dp, VARIANT *retv,
+HRESULT jsdisp_call_value(DispatchEx *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv,
         jsexcept_t *ei, IServiceProvider *caller)
 {
-    return disp->builtin_info->value_prop.invoke(disp->ctx, disp, flags, dp, retv, ei, caller);
+    vdisp_t vdisp;
+    HRESULT hres;
+
+    set_jsdisp(&vdisp, jsthis);
+    hres = jsthis->builtin_info->value_prop.invoke(jsthis->ctx, &vdisp, flags, dp, retv, ei, caller);
+    vdisp_release(&vdisp);
+    return hres;
 }
 
 HRESULT jsdisp_call(DispatchEx *disp, DISPID id, WORD flags, DISPPARAMS *dp, VARIANT *retv,
diff --git a/dlls/jscript/error.c b/dlls/jscript/error.c
index 5932611..91bc95a 100644
--- a/dlls/jscript/error.c
+++ b/dlls/jscript/error.c
@@ -39,10 +39,15 @@
 static const WCHAR numberW[] = {'n','u','m','b','e','r',0};
 static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
 
-static HRESULT Error_number(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static inline ErrorInstance *error_from_vdisp(vdisp_t *vdisp)
+{
+    return (ErrorInstance*)vdisp->u.jsdisp;
+}
+
+static HRESULT Error_number(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    ErrorInstance *This = (ErrorInstance*)dispex;
+    ErrorInstance *This = error_from_vdisp(jsthis);
 
     TRACE("\n");
 
@@ -57,10 +62,10 @@
     }
 }
 
-static HRESULT Error_description(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT Error_description(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    ErrorInstance *This = (ErrorInstance*)dispex;
+    ErrorInstance *This = error_from_vdisp(jsthis);
 
     TRACE("\n");
 
@@ -76,10 +81,10 @@
 }
 
 /* ECMA-262 3rd Edition    15.11.4.3 */
-static HRESULT Error_message(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT Error_message(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    ErrorInstance *This = (ErrorInstance*)dispex;
+    ErrorInstance *This = error_from_vdisp(jsthis);
 
     TRACE("\n");
 
@@ -95,7 +100,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.11.4.4 */
-static HRESULT Error_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT Error_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR str[] = {'[','o','b','j','e','c','t',' ','E','r','r','o','r',']',0};
@@ -112,7 +117,7 @@
     return S_OK;
 }
 
-static HRESULT Error_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT Error_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -278,56 +283,56 @@
     }
 }
 
-static HRESULT ErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT ErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return error_constr(ctx, flags, dp, retv, ei, ctx->error_constr);
 }
 
-static HRESULT EvalErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT EvalErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return error_constr(ctx, flags, dp, retv, ei, ctx->eval_error_constr);
 }
 
-static HRESULT RangeErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT RangeErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return error_constr(ctx, flags, dp, retv, ei, ctx->range_error_constr);
 }
 
-static HRESULT ReferenceErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT ReferenceErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return error_constr(ctx, flags, dp, retv, ei, ctx->reference_error_constr);
 }
 
-static HRESULT RegExpErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT RegExpErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return error_constr(ctx, flags, dp, retv, ei, ctx->regexp_error_constr);
 }
 
-static HRESULT SyntaxErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT SyntaxErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return error_constr(ctx, flags, dp, retv, ei, ctx->syntax_error_constr);
 }
 
-static HRESULT TypeErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT TypeErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return error_constr(ctx, flags, dp, retv, ei, ctx->type_error_constr);
 }
 
-static HRESULT URIErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT URIErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c
index bd7c99b..e68222b 100644
--- a/dlls/jscript/function.c
+++ b/dlls/jscript/function.c
@@ -37,6 +37,16 @@
     DWORD length;
 } FunctionInstance;
 
+static inline FunctionInstance *function_from_vdisp(vdisp_t *vdisp)
+{
+    return (FunctionInstance*)vdisp->u.jsdisp;
+}
+
+static inline FunctionInstance *function_this(vdisp_t *jsthis)
+{
+    return is_vclass(jsthis, JSCLASS_FUNCTION) ? function_from_vdisp(jsthis) : NULL;
+}
+
 static const WCHAR prototypeW[] = {'p','r','o','t','o','t', 'y', 'p','e',0};
 
 static const WCHAR lengthW[] = {'l','e','n','g','t','h',0};
@@ -85,7 +95,7 @@
     return S_OK;
 }
 
-static HRESULT Arguments_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Arguments_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     FIXME("\n");
@@ -249,14 +259,16 @@
 {
     DispatchEx *this_obj = NULL;
     IDispatch *this_disp;
+    vdisp_t vthis;
     HRESULT hres;
 
     this_disp = get_this(dp);
     if(this_disp)
         this_obj = iface_to_jsdisp((IUnknown*)this_disp);
 
-    hres = function->value_proc(ctx, this_obj ? this_obj : ctx->script_disp,
-            flags, dp, retv, ei, caller);
+    set_jsdisp(&vthis, this_obj ? this_obj : ctx->script_disp);
+    hres = function->value_proc(ctx, &vthis, flags, dp, retv, ei, caller);
+    vdisp_release(&vthis);
 
     if(this_obj)
         jsdisp_release(this_obj);
@@ -270,6 +282,7 @@
 
     if(function->value_proc) {
         DispatchEx *jsthis = NULL;
+        vdisp_t vthis;
 
         if(this_obj) {
             jsthis = iface_to_jsdisp((IUnknown*)this_obj);
@@ -277,8 +290,9 @@
                 FIXME("this_obj is not DispatchEx\n");
         }
 
-        hres = function->value_proc(ctx, jsthis ? jsthis : ctx->script_disp,
-                DISPATCH_METHOD, args, retv, ei, caller);
+        set_jsdisp(&vthis, jsthis ? jsthis : ctx->script_disp);
+        hres = function->value_proc(ctx, &vthis, DISPATCH_METHOD, args, retv, ei, caller);
+        vdisp_release(&vthis);
 
         if(jsthis)
             jsdisp_release(jsthis);
@@ -319,10 +333,10 @@
     return S_OK;
 }
 
-static HRESULT Function_length(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Function_length(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    FunctionInstance *This = (FunctionInstance*)dispex;
+    FunctionInstance *This = function_from_vdisp(jsthis);
 
     TRACE("%p %d\n", This, This->length);
 
@@ -339,7 +353,7 @@
     return S_OK;
 }
 
-static HRESULT Function_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Function_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FunctionInstance *function;
@@ -348,11 +362,9 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_FUNCTION))
+    if(!(function = function_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_FUNC, NULL);
 
-    function = (FunctionInstance*)dispex;
-
     hres = function_to_string(function, &str);
     if(FAILED(hres))
         return hres;
@@ -401,7 +413,7 @@
     return S_OK;
 }
 
-static HRESULT Function_apply(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Function_apply(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     FunctionInstance *function;
@@ -412,12 +424,11 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_FUNCTION)) {
+    if(!(function = function_from_vdisp(jsthis))) {
         FIXME("dispex is not a function\n");
         return E_FAIL;
     }
 
-    function = (FunctionInstance*)dispex;
     argc = arg_cnt(dp);
 
     if(argc) {
@@ -457,7 +468,7 @@
     return hres;
 }
 
-static HRESULT Function_call(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Function_call(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     FunctionInstance *function;
@@ -468,14 +479,12 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_FUNCTION)) {
+    if(!(function = function_from_vdisp(jsthis))) {
         FIXME("dispex is not a function\n");
         return E_FAIL;
     }
 
-    function = (FunctionInstance*)dispex;
     argc = arg_cnt(dp);
-
     if(argc) {
         hres = to_object(ctx, get_arg(dp,0), &this_obj);
         if(FAILED(hres))
@@ -493,19 +502,19 @@
     return hres;
 }
 
-HRESULT Function_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+HRESULT Function_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     FunctionInstance *function;
 
     TRACE("\n");
 
-    if(dispex->builtin_info->class != JSCLASS_FUNCTION) {
+    if(!is_vclass(jsthis, JSCLASS_FUNCTION)) {
         ERR("dispex is not a function\n");
         return E_FAIL;
     }
 
-    function = (FunctionInstance*)dispex;
+    function = (FunctionInstance*)jsthis->u.jsdisp;
 
     switch(flags) {
     case DISPATCH_METHOD:
@@ -568,14 +577,14 @@
     NULL
 };
 
-static HRESULT FunctionConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT FunctionConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT FunctionProt_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT FunctionProt_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c
index 9c9deea..d9c54db 100644
--- a/dlls/jscript/global.c
+++ b/dlls/jscript/global.c
@@ -115,7 +115,7 @@
     return S_OK;
 }
 
-static HRESULT JSGlobal_NaN(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_NaN(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -133,7 +133,7 @@
     return S_OK;
 }
 
-static HRESULT JSGlobal_Infinity(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Infinity(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -151,7 +151,7 @@
     return S_OK;
 }
 
-static HRESULT JSGlobal_Array(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Array(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -159,7 +159,7 @@
     return constructor_call(ctx->array_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Boolean(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Boolean(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -167,7 +167,7 @@
     return constructor_call(ctx->bool_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Date(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Date(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -175,7 +175,7 @@
     return constructor_call(ctx->date_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Error(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Error(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -183,7 +183,7 @@
     return constructor_call(ctx->error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_EvalError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_EvalError(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -191,7 +191,7 @@
     return constructor_call(ctx->eval_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_RangeError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_RangeError(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -199,7 +199,7 @@
     return constructor_call(ctx->range_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_ReferenceError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ReferenceError(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -207,7 +207,7 @@
     return constructor_call(ctx->reference_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_SyntaxError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_SyntaxError(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -215,7 +215,7 @@
     return constructor_call(ctx->syntax_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_TypeError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_TypeError(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -223,7 +223,7 @@
     return constructor_call(ctx->type_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_URIError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_URIError(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -231,7 +231,7 @@
     return constructor_call(ctx->uri_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Function(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Function(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -239,7 +239,7 @@
     return constructor_call(ctx->function_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Number(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Number(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -247,7 +247,7 @@
     return constructor_call(ctx->number_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Object(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Object(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -255,7 +255,7 @@
     return constructor_call(ctx->object_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_String(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_String(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -263,7 +263,7 @@
     return constructor_call(ctx->string_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_RegExp(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_RegExp(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -271,28 +271,28 @@
     return constructor_call(ctx->regexp_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_ActiveXObject(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ActiveXObject(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_VBArray(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_VBArray(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_Enumerator(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Enumerator(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_escape(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_escape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
@@ -300,7 +300,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.1.2.1 */
-static HRESULT JSGlobal_eval(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_eval(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     parser_ctx_t *parser_ctx;
@@ -342,7 +342,7 @@
     return hres;
 }
 
-static HRESULT JSGlobal_isNaN(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_isNaN(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT_BOOL ret = VARIANT_FALSE;
@@ -369,7 +369,7 @@
     return S_OK;
 }
 
-static HRESULT JSGlobal_isFinite(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_isFinite(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT_BOOL ret = VARIANT_FALSE;
@@ -406,7 +406,7 @@
     return 100;
 }
 
-static HRESULT JSGlobal_parseInt(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_parseInt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DOUBLE ret = 0.0;
@@ -474,7 +474,7 @@
     return S_OK;
 }
 
-static HRESULT JSGlobal_parseFloat(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_parseFloat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     LONGLONG d = 0, hlp;
@@ -582,7 +582,7 @@
     return -1;
 }
 
-static HRESULT JSGlobal_unescape(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_unescape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     BSTR ret, str;
@@ -657,49 +657,49 @@
     return S_OK;
 }
 
-static HRESULT JSGlobal_GetObject(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_GetObject(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_ScriptEngine(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ScriptEngine(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_ScriptEngineMajorVersion(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ScriptEngineMajorVersion(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_ScriptEngineMinorVersion(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ScriptEngineMinorVersion(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_ScriptEngineBuildVersion(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ScriptEngineBuildVersion(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_CollectGarbage(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_CollectGarbage(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_encodeURI(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_encodeURI(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *ptr;
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index c817821..8f9873c 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008 Jacek Caban for CodeWeavers
+ * Copyright 2008-2009 Jacek Caban for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -86,7 +86,73 @@
     JSCLASS_ARGUMENTS
 } jsclass_t;
 
-typedef HRESULT (*builtin_invoke_t)(script_ctx_t*,DispatchEx*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
+DispatchEx *iface_to_jsdisp(IUnknown*);
+
+typedef struct {
+    union {
+        IDispatch *disp;
+        IDispatchEx *dispex;
+        DispatchEx *jsdisp;
+    } u;
+    DWORD flags;
+} vdisp_t;
+
+#define VDISP_DISPEX  0x0001
+#define VDISP_JSDISP  0x0002
+
+static inline void vdisp_release(vdisp_t *vdisp)
+{
+    IDispatch_Release(vdisp->u.disp);
+}
+
+static inline BOOL is_jsdisp(vdisp_t *vdisp)
+{
+    return (vdisp->flags & VDISP_JSDISP) != 0;
+}
+
+static inline BOOL is_dispex(vdisp_t *vdisp)
+{
+    return (vdisp->flags & VDISP_DISPEX) != 0;
+}
+
+static inline void set_jsdisp(vdisp_t *vdisp, DispatchEx *jsdisp)
+{
+    vdisp->u.jsdisp = jsdisp;
+    vdisp->flags = VDISP_JSDISP | VDISP_DISPEX;
+    IDispatch_AddRef(vdisp->u.disp);
+}
+
+static inline void set_disp(vdisp_t *vdisp, IDispatch *disp)
+{
+    IDispatchEx *dispex;
+    DispatchEx *jsdisp;
+    HRESULT hres;
+
+    jsdisp = iface_to_jsdisp((IUnknown*)disp);
+    if(jsdisp) {
+        vdisp->u.jsdisp = jsdisp;
+        vdisp->flags = VDISP_JSDISP | VDISP_DISPEX;
+        return;
+    }
+
+    hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
+    if(SUCCEEDED(hres)) {
+        vdisp->u.dispex = dispex;
+        vdisp->flags = VDISP_DISPEX;
+        return;
+    }
+
+    IDispatch_AddRef(disp);
+    vdisp->u.disp = disp;
+    vdisp->flags = 0;
+}
+
+static inline DispatchEx *get_jsdisp(vdisp_t *vdisp)
+{
+    return is_jsdisp(vdisp) ? vdisp->u.jsdisp : NULL;
+}
+
+typedef HRESULT (*builtin_invoke_t)(script_ctx_t*,vdisp_t*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
 
 typedef struct {
     const WCHAR *name;
@@ -128,7 +194,6 @@
 HRESULT create_dispex(script_ctx_t*,const builtin_info_t*,DispatchEx*,DispatchEx**);
 HRESULT init_dispex(DispatchEx*,script_ctx_t*,const builtin_info_t*,DispatchEx*);
 HRESULT init_dispex_from_constr(DispatchEx*,script_ctx_t*,const builtin_info_t*,DispatchEx*);
-DispatchEx *iface_to_jsdisp(IUnknown*);
 
 HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
 HRESULT jsdisp_call_value(DispatchEx*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
@@ -146,7 +211,7 @@
 
 HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const WCHAR*,const builtin_info_t*,DWORD,
         DispatchEx*,DispatchEx**);
-HRESULT Function_value(script_ctx_t*,DispatchEx*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
+HRESULT Function_value(script_ctx_t*,vdisp_t*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
 
 HRESULT throw_eval_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
 HRESULT throw_range_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
@@ -263,6 +328,11 @@
     return jsdisp->builtin_info->class == class;
 }
 
+static inline BOOL is_vclass(vdisp_t *vdisp, jsclass_t class)
+{
+    return is_jsdisp(vdisp) && is_class(vdisp->u.jsdisp, class);
+}
+
 static inline BOOL is_num_vt(enum VARENUM vt)
 {
     return vt == VT_I4 || vt == VT_R8;
diff --git a/dlls/jscript/math.c b/dlls/jscript/math.c
index a0a75af..8de9df9 100644
--- a/dlls/jscript/math.c
+++ b/dlls/jscript/math.c
@@ -73,7 +73,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.1.1 */
-static HRESULT Math_E(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_E(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -81,7 +81,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.1.4 */
-static HRESULT Math_LOG2E(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_LOG2E(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -89,21 +89,21 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.1.4 */
-static HRESULT Math_LOG10E(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_LOG10E(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return math_constant(M_LOG10E, flags, retv);
 }
 
-static HRESULT Math_LN2(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_LN2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return math_constant(M_LN2, flags, retv);
 }
 
-static HRESULT Math_LN10(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_LN10(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -111,21 +111,21 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.1.6 */
-static HRESULT Math_PI(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_PI(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return math_constant(M_PI, flags, retv);
 }
 
-static HRESULT Math_SQRT2(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_SQRT2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return math_constant(M_SQRT2, flags, retv);
 }
 
-static HRESULT Math_SQRT1_2(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_SQRT1_2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -133,7 +133,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.2.12 */
-static HRESULT Math_abs(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_abs(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -158,7 +158,7 @@
     return S_OK;
 }
 
-static HRESULT Math_acos(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_acos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -179,7 +179,7 @@
     return S_OK;
 }
 
-static HRESULT Math_asin(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_asin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -200,7 +200,7 @@
     return S_OK;
 }
 
-static HRESULT Math_atan(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_atan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -221,7 +221,7 @@
     return S_OK;
 }
 
-static HRESULT Math_atan2(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_atan2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v1, v2;
@@ -247,7 +247,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.2.6 */
-static HRESULT Math_ceil(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_ceil(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -270,7 +270,7 @@
     return S_OK;
 }
 
-static HRESULT Math_cos(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_cos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -291,7 +291,7 @@
     return S_OK;
 }
 
-static HRESULT Math_exp(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_exp(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -312,7 +312,7 @@
     return S_OK;
 }
 
-static HRESULT Math_floor(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_floor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -335,7 +335,7 @@
     return S_OK;
 }
 
-static HRESULT Math_log(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_log(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -359,7 +359,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.2.11 */
-static HRESULT Math_max(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_max(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DOUBLE max, d;
@@ -396,7 +396,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.2.12 */
-static HRESULT Math_min(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_min(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DOUBLE min, d;
@@ -433,7 +433,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.2.13 */
-static HRESULT Math_pow(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_pow(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT x, y;
@@ -460,7 +460,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.2.14 */
-static HRESULT Math_random(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_random(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     UINT r;
@@ -477,7 +477,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.8.2.15 */
-static HRESULT Math_round(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_round(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -499,7 +499,7 @@
     return S_OK;
 }
 
-static HRESULT Math_sin(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_sin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -520,7 +520,7 @@
     return S_OK;
 }
 
-static HRESULT Math_sqrt(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_sqrt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -541,7 +541,7 @@
     return S_OK;
 }
 
-static HRESULT Math_tan(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_tan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
diff --git a/dlls/jscript/number.c b/dlls/jscript/number.c
index 921b9e5..757316c 100644
--- a/dlls/jscript/number.c
+++ b/dlls/jscript/number.c
@@ -41,8 +41,19 @@
 static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
 
 #define NUMBER_TOSTRING_BUF_SIZE 64
+
+static inline NumberInstance *number_from_vdisp(vdisp_t *vdisp)
+{
+    return (NumberInstance*)vdisp->u.jsdisp;
+}
+
+static inline NumberInstance *number_this(vdisp_t *jsthis)
+{
+    return is_vclass(jsthis, JSCLASS_NUMBER) ? number_from_vdisp(jsthis) : NULL;
+}
+
 /* ECMA-262 3rd Edition    15.7.4.2 */
-static HRESULT Number_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     NumberInstance *number;
@@ -53,11 +64,9 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_NUMBER))
+    if(!(number = number_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_NUM, NULL);
 
-    number = (NumberInstance*)dispex;
-
     if(arg_cnt(dp)) {
         hres = to_int32(ctx, get_arg(dp, 0), ei, &radix);
         if(FAILED(hres))
@@ -170,53 +179,53 @@
     return S_OK;
 }
 
-static HRESULT Number_toLocaleString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Number_toFixed(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_toFixed(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Number_toExponential(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_toExponential(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Number_toPrecision(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_toPrecision(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Number_valueOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
+    NumberInstance *number;
+
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_NUMBER))
+    if(!(number = number_this(jsthis)))
         return throw_type_error(ctx, ei, IDS_NOT_NUM, NULL);
 
-    if(retv) {
-        NumberInstance *number = (NumberInstance*)dispex;
+    if(retv)
         *retv = number->num;
-    }
     return S_OK;
 }
 
-static HRESULT Number_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    NumberInstance *number = (NumberInstance*)dispex;
+    NumberInstance *number = number_from_vdisp(jsthis);
 
     switch(flags) {
     case INVOKE_FUNC:
@@ -251,7 +260,7 @@
     NULL
 };
 
-static HRESULT NumberConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT num;
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c
index 2ceaf09..7dffff7 100644
--- a/dlls/jscript/object.c
+++ b/dlls/jscript/object.c
@@ -32,9 +32,11 @@
 
 static const WCHAR default_valueW[] = {'[','o','b','j','e','c','t',' ','O','b','j','e','c','t',']',0};
 
-static HRESULT Object_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
+    DispatchEx *jsdisp;
+
     static const WCHAR formatW[] = {'[','o','b','j','e','c','t',' ','%','s',']',0};
 
     static const WCHAR arrayW[] = {'A','r','r','a','y',0};
@@ -53,71 +55,76 @@
 
     TRACE("\n");
 
-    if(names[dispex->builtin_info->class] == NULL) {
-        ERR("dispex->builtin_info->class = %d\n",
-                dispex->builtin_info->class);
+    jsdisp = get_jsdisp(jsthis);
+    if(!jsdisp || names[jsdisp->builtin_info->class] == NULL) {
+        FIXME("jdisp->builtin_info->class = %d\n", jsdisp->builtin_info->class);
         return E_FAIL;
     }
 
     if(retv) {
         V_VT(retv) = VT_BSTR;
-        V_BSTR(retv) = SysAllocStringLen(NULL, 9+strlenW(names[dispex->builtin_info->class]));
+        V_BSTR(retv) = SysAllocStringLen(NULL, 9+strlenW(names[jsdisp->builtin_info->class]));
         if(!V_BSTR(retv))
             return E_OUTOFMEMORY;
 
-        sprintfW(V_BSTR(retv), formatW, names[dispex->builtin_info->class]);
+        sprintfW(V_BSTR(retv), formatW, names[jsdisp->builtin_info->class]);
     }
 
     return S_OK;
 }
 
-static HRESULT Object_toLocaleString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DISPPARAMS params = {NULL, NULL, 0, 0};
 
     TRACE("\n");
 
-    return jsdisp_call_name(dispex, toStringW, DISPATCH_METHOD, &params, retv, ei, sp);
+    if(!is_jsdisp(jsthis)) {
+        FIXME("Host object this\n");
+        return E_FAIL;
+    }
+
+    return jsdisp_call_name(jsthis->u.jsdisp, toStringW, DISPATCH_METHOD, &params, retv, ei, sp);
 }
 
-static HRESULT Object_valueOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
 
     if(retv) {
-        IDispatchEx_AddRef(_IDispatchEx_(dispex));
+        IDispatch_AddRef(jsthis->u.disp);
 
         V_VT(retv) = VT_DISPATCH;
-        V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(dispex);
+        V_DISPATCH(retv) = jsthis->u.disp;
     }
 
     return S_OK;
 }
 
-static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Object_propertyIsEnumerable(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_propertyIsEnumerable(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Object_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -162,7 +169,7 @@
     NULL
 };
 
-static HRESULT ObjectConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT ObjectConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     HRESULT hres;
diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c
index 02470f7..e911d0f 100644
--- a/dlls/jscript/regexp.c
+++ b/dlls/jscript/regexp.c
@@ -3294,6 +3294,11 @@
     return re;
 }
 
+static inline RegExpInstance *regexp_from_vdisp(vdisp_t *vdisp)
+{
+    return (RegExpInstance*)vdisp->u.jsdisp;
+}
+
 static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, const WCHAR *str, DWORD len,
         const WCHAR **cp, match_result_t **parens, DWORD *parens_size, DWORD *parens_cnt, match_result_t *ret)
 {
@@ -3425,14 +3430,14 @@
     return S_OK;
 }
 
-static HRESULT RegExp_source(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_source(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
 
     switch(flags) {
     case DISPATCH_PROPERTYGET: {
-        RegExpInstance *This = (RegExpInstance*)dispex;
+        RegExpInstance *This = regexp_from_vdisp(jsthis);
 
         V_VT(retv) = VT_BSTR;
         V_BSTR(retv) = SysAllocString(This->str);
@@ -3448,35 +3453,35 @@
     return S_OK;
 }
 
-static HRESULT RegExp_global(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_global(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT RegExp_ignoreCase(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_ignoreCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT RegExp_multiline(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_multiline(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT RegExp_lastIndex(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_lastIndex(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
 
     switch(flags) {
     case DISPATCH_PROPERTYGET: {
-        RegExpInstance *regexp = (RegExpInstance*)dispex;
+        RegExpInstance *regexp = regexp_from_vdisp(jsthis);
         V_VT(retv) = VT_I4;
         V_I4(retv) = regexp->last_index;
         break;
@@ -3489,7 +3494,7 @@
     return S_OK;
 }
 
-static HRESULT RegExp_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
@@ -3558,7 +3563,7 @@
     return S_OK;
 }
 
-static HRESULT run_exec(script_ctx_t *ctx, DispatchEx *dispex, VARIANT *arg, jsexcept_t *ei, BSTR *input,
+static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, VARIANT *arg, jsexcept_t *ei, BSTR *input,
         match_result_t *match, match_result_t **parens, DWORD *parens_cnt, VARIANT_BOOL *ret)
 {
     RegExpInstance *regexp;
@@ -3567,12 +3572,12 @@
     BSTR string;
     HRESULT hres;
 
-    if(!is_class(dispex, JSCLASS_REGEXP)) {
+    if(!is_vclass(jsthis, JSCLASS_REGEXP)) {
         FIXME("Not a RegExp\n");
         return E_NOTIMPL;
     }
 
-    regexp = (RegExpInstance*)dispex;
+    regexp = regexp_from_vdisp(jsthis);
 
     if(arg) {
         hres = to_string(ctx, arg, ei, &string);
@@ -3609,7 +3614,7 @@
     return S_OK;
 }
 
-static HRESULT RegExp_exec(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_exec(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     match_result_t *parens = NULL, match;
@@ -3620,7 +3625,7 @@
 
     TRACE("\n");
 
-    hres = run_exec(ctx, dispex, arg_cnt(dp) ? get_arg(dp,0) : NULL, ei, &string, &match, &parens, &parens_cnt, &b);
+    hres = run_exec(ctx, jsthis, arg_cnt(dp) ? get_arg(dp,0) : NULL, ei, &string, &match, &parens, &parens_cnt, &b);
     if(FAILED(hres))
         return hres;
 
@@ -3643,7 +3648,7 @@
     return hres;
 }
 
-static HRESULT RegExp_test(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_test(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     match_result_t match;
@@ -3652,7 +3657,7 @@
 
     TRACE("\n");
 
-    hres = run_exec(ctx, dispex, arg_cnt(dp) ? get_arg(dp,0) : NULL, ei, NULL, &match, NULL, NULL, &b);
+    hres = run_exec(ctx, jsthis, arg_cnt(dp) ? get_arg(dp,0) : NULL, ei, NULL, &match, NULL, NULL, &b);
     if(FAILED(hres))
         return hres;
 
@@ -3663,7 +3668,7 @@
     return S_OK;
 }
 
-static HRESULT RegExp_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -3828,7 +3833,7 @@
     return S_OK;
 }
 
-static HRESULT RegExpConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c
index 7f12400..4bb8091 100644
--- a/dlls/jscript/string.c
+++ b/dlls/jscript/string.c
@@ -64,17 +64,52 @@
 static const WCHAR localeCompareW[] = {'l','o','c','a','l','e','C','o','m','p','a','r','e',0};
 static const WCHAR fromCharCodeW[] = {'f','r','o','m','C','h','a','r','C','o','d','e',0};
 
-static HRESULT String_length(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static inline StringInstance *string_from_vdisp(vdisp_t *vdisp)
+{
+    return (StringInstance*)vdisp->u.jsdisp;
+}
+
+static inline StringInstance *string_this(vdisp_t *jsthis)
+{
+    return is_vclass(jsthis, JSCLASS_STRING) ? string_from_vdisp(jsthis) : NULL;
+}
+
+static HRESULT get_string_val(script_ctx_t *ctx, vdisp_t *jsthis, jsexcept_t *ei,
+        const WCHAR **str, DWORD *len, BSTR *val_str)
+{
+    StringInstance *string;
+    VARIANT this_var;
+    HRESULT hres;
+
+    if((string = string_this(jsthis))) {
+        *str = string->str;
+        *len = string->length;
+        *val_str = NULL;
+        return S_OK;
+    }
+
+    V_VT(&this_var) = VT_DISPATCH;
+    V_DISPATCH(&this_var) = jsthis->u.disp;
+    hres = to_string(ctx, &this_var, ei, val_str);
+    if(FAILED(hres))
+        return hres;
+
+    *str = *val_str;
+    *len = SysStringLen(*val_str);
+    return S_OK;
+}
+
+static HRESULT String_length(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    TRACE("%p\n", dispex);
+    TRACE("%p\n", jsthis);
 
     switch(flags) {
     case DISPATCH_PROPERTYGET: {
-        StringInstance *jsthis = (StringInstance*)dispex;
+        StringInstance *string = string_from_vdisp(jsthis);
 
         V_VT(retv) = VT_I4;
-        V_I4(retv) = jsthis->length;
+        V_I4(retv) = string->length;
         break;
     }
     default:
@@ -85,17 +120,15 @@
     return S_OK;
 }
 
-static HRESULT stringobj_to_string(DispatchEx *dispex, VARIANT *retv)
+static HRESULT stringobj_to_string(vdisp_t *jsthis, VARIANT *retv)
 {
     StringInstance *string;
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
+    if(!(string = string_this(jsthis))) {
         WARN("this is not a string object\n");
         return E_FAIL;
     }
 
-    string = (StringInstance*)dispex;
-
     if(retv) {
         BSTR str = SysAllocString(string->str);
         if(!str)
@@ -108,51 +141,36 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.2 */
-static HRESULT String_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
 
-    return stringobj_to_string(dispex, retv);
+    return stringobj_to_string(jsthis, retv);
 }
 
 /* ECMA-262 3rd Edition    15.5.4.2 */
-static HRESULT String_valueOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
 
-    return stringobj_to_string(dispex, retv);
+    return stringobj_to_string(jsthis, retv);
 }
 
-static HRESULT do_attributeless_tag_format(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT do_attributeless_tag_format(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp, const WCHAR *tagname)
 {
-    static const WCHAR tagfmt[] = {'<','%','s','>','%','s','<','/','%','s','>',0};
     const WCHAR *str;
     DWORD length;
     BSTR val_str = NULL;
     HRESULT hres;
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
+    static const WCHAR tagfmt[] = {'<','%','s','>','%','s','<','/','%','s','>',0};
 
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(retv) {
         BSTR ret = SysAllocStringLen(NULL, length + 2*strlenW(tagname) + 5);
@@ -171,7 +189,7 @@
     return S_OK;
 }
 
-static HRESULT do_attribute_tag_format(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT do_attribute_tag_format(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp,
         const WCHAR *tagname, const WCHAR *attr)
 {
@@ -179,16 +197,17 @@
         = {'<','%','s',' ','%','s','=','\"','%','s','\"','>','%','s','<','/','%','s','>',0};
     static const WCHAR undefinedW[] = {'u','n','d','e','f','i','n','e','d',0};
 
+    StringInstance *string;
     const WCHAR *str;
     DWORD length;
-    BSTR attr_value, val_str = NULL;
+    BSTR attr_value, val_str;
     HRESULT hres;
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
+    if(!(string = string_this(jsthis))) {
         VARIANT this;
 
         V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+        V_DISPATCH(&this) = jsthis->u.disp;
 
         hres = to_string(ctx, &this, ei, &val_str);
         if(FAILED(hres))
@@ -198,10 +217,8 @@
         length = SysStringLen(val_str);
     }
     else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
+        str = string->str;
+        length = string->length;
     }
 
     if(arg_cnt(dp)) {
@@ -239,67 +256,51 @@
     return S_OK;
 }
 
-static HRESULT String_anchor(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_anchor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR fontW[] = {'A',0};
     static const WCHAR colorW[] = {'N','A','M','E',0};
 
-    return do_attribute_tag_format(ctx, dispex, flags, dp, retv, ei, sp, fontW, colorW);
+    return do_attribute_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, fontW, colorW);
 }
 
-static HRESULT String_big(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_big(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR bigtagW[] = {'B','I','G',0};
-    return do_attributeless_tag_format(ctx, dispex, flags, dp, retv, ei, sp, bigtagW);
+    return do_attributeless_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, bigtagW);
 }
 
-static HRESULT String_blink(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_blink(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR blinktagW[] = {'B','L','I','N','K',0};
-    return do_attributeless_tag_format(ctx, dispex, flags, dp, retv, ei, sp, blinktagW);
+    return do_attributeless_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, blinktagW);
 }
 
-static HRESULT String_bold(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_bold(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR boldtagW[] = {'B',0};
-    return do_attributeless_tag_format(ctx, dispex, flags, dp, retv, ei, sp, boldtagW);
+    return do_attributeless_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, boldtagW);
 }
 
 /* ECMA-262 3rd Edition    15.5.4.5 */
-static HRESULT String_charAt(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_charAt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *str;
     DWORD length;
-    BSTR ret, val_str = NULL;
+    BSTR ret, val_str;
     INT pos = 0;
     HRESULT hres;
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(arg_cnt(dp)) {
         VARIANT num;
@@ -338,35 +339,19 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.5 */
-static HRESULT String_charCodeAt(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_charCodeAt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *str;
-    BSTR val_str = NULL;
+    BSTR val_str;
     DWORD length, idx = 0;
     HRESULT hres;
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(arg_cnt(dp) > 0) {
         VARIANT v;
@@ -396,7 +381,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.6 */
-static HRESULT String_concat(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     BSTR *strs = NULL, ret = NULL;
@@ -413,7 +398,7 @@
         return E_OUTOFMEMORY;
 
     V_VT(&var) = VT_DISPATCH;
-    V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(dispex);
+    V_DISPATCH(&var) = jsthis->u.disp;
 
     hres = to_string(ctx, &var, ei, strs);
     if(SUCCEEDED(hres)) {
@@ -453,61 +438,45 @@
     return S_OK;
 }
 
-static HRESULT String_fixed(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_fixed(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR fixedtagW[] = {'T','T',0};
-    return do_attributeless_tag_format(ctx, dispex, flags, dp, retv, ei, sp, fixedtagW);
+    return do_attributeless_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, fixedtagW);
 }
 
-static HRESULT String_fontcolor(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_fontcolor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR fontW[] = {'F','O','N','T',0};
     static const WCHAR colorW[] = {'C','O','L','O','R',0};
 
-    return do_attribute_tag_format(ctx, dispex, flags, dp, retv, ei, sp, fontW, colorW);
+    return do_attribute_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, fontW, colorW);
 }
 
-static HRESULT String_fontsize(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_fontsize(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR fontW[] = {'F','O','N','T',0};
     static const WCHAR colorW[] = {'S','I','Z','E',0};
 
-    return do_attribute_tag_format(ctx, dispex, flags, dp, retv, ei, sp, fontW, colorW);
+    return do_attribute_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, fontW, colorW);
 }
 
-static HRESULT String_indexOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_indexOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DWORD length, pos = 0;
     const WCHAR *str;
-    BSTR search_str, val_str = NULL;
+    BSTR search_str, val_str;
     INT ret = -1;
     HRESULT hres;
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(!arg_cnt(dp)) {
         if(retv) {
@@ -560,18 +529,18 @@
     return S_OK;
 }
 
-static HRESULT String_italics(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_italics(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR italicstagW[] = {'I',0};
-    return do_attributeless_tag_format(ctx, dispex, flags, dp, retv, ei, sp, italicstagW);
+    return do_attributeless_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, italicstagW);
 }
 
 /* ECMA-262 3rd Edition    15.5.4.8 */
-static HRESULT String_lastIndexOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_lastIndexOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    BSTR search_str, val_str = NULL;
+    BSTR search_str, val_str;
     DWORD length, pos, search_len;
     const WCHAR *str;
     INT ret = -1;
@@ -579,24 +548,9 @@
 
     TRACE("\n");
 
-    if(is_class(dispex, JSCLASS_STRING)) {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }else {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(!arg_cnt(dp)) {
         if(retv) {
@@ -654,17 +608,17 @@
     return S_OK;
 }
 
-static HRESULT String_link(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_link(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR fontW[] = {'A',0};
     static const WCHAR colorW[] = {'H','R','E','F',0};
 
-    return do_attribute_tag_format(ctx, dispex, flags, dp, retv, ei, sp, fontW, colorW);
+    return do_attribute_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, fontW, colorW);
 }
 
 /* ECMA-262 3rd Edition    15.5.4.10 */
-static HRESULT String_match(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *str;
@@ -709,29 +663,9 @@
     }
     }
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres)) {
-            jsdisp_release(regexp);
-            return hres;
-        }
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
-
-    hres = regexp_match(ctx, regexp, str, length, FALSE, &match_result, &match_cnt);
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(SUCCEEDED(hres))
+        hres = regexp_match(ctx, regexp, str, length, FALSE, &match_result, &match_cnt);
     jsdisp_release(regexp);
     if(FAILED(hres)) {
         SysFreeString(val_str);
@@ -876,12 +810,12 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.11 */
-static HRESULT String_replace(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     const WCHAR *str;
     DWORD parens_cnt = 0, parens_size=0, rep_len=0, length;
-    BSTR rep_str = NULL, match_str = NULL, ret_str, val_str = NULL;
+    BSTR rep_str = NULL, match_str = NULL, ret_str, val_str;
     DispatchEx *rep_func = NULL, *regexp = NULL;
     match_result_t *parens = NULL, match, **parens_ptr = &parens;
     strbuf_t ret = {NULL,0,0};
@@ -891,25 +825,9 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(!arg_cnt(dp)) {
         if(retv) {
@@ -1110,7 +1028,7 @@
     return hres;
 }
 
-static HRESULT String_search(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_search(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
@@ -1118,11 +1036,11 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.13 */
-static HRESULT String_slice(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_slice(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *str;
-    BSTR val_str = NULL;
+    BSTR val_str;
     DWORD length;
     INT start=0, end;
     VARIANT v;
@@ -1130,25 +1048,9 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(arg_cnt(dp)) {
         hres = to_integer(ctx, get_arg(dp,0), ei, &v);
@@ -1214,14 +1116,14 @@
     return S_OK;
 }
 
-static HRESULT String_small(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_small(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR smalltagW[] = {'S','M','A','L','L',0};
-    return do_attributeless_tag_format(ctx, dispex, flags, dp, retv, ei, sp, smalltagW);
+    return do_attributeless_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, smalltagW);
 }
 
-static HRESULT String_split(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     match_result_t *match_result = NULL;
@@ -1229,7 +1131,7 @@
     const WCHAR *str, *ptr, *ptr2;
     VARIANT *arg, var;
     DispatchEx *array;
-    BSTR val_str = NULL, match_str = NULL;
+    BSTR val_str, match_str = NULL;
     HRESULT hres;
 
     TRACE("\n");
@@ -1239,25 +1141,9 @@
         return E_NOTIMPL;
     }
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     arg = get_arg(dp, 0);
     switch(V_VT(arg)) {
@@ -1362,26 +1248,26 @@
     return hres;
 }
 
-static HRESULT String_strike(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_strike(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR striketagW[] = {'S','T','R','I','K','E',0};
-    return do_attributeless_tag_format(ctx, dispex, flags, dp, retv, ei, sp, striketagW);
+    return do_attributeless_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, striketagW);
 }
 
-static HRESULT String_sub(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_sub(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR subtagW[] = {'S','U','B',0};
-    return do_attributeless_tag_format(ctx, dispex, flags, dp, retv, ei, sp, subtagW);
+    return do_attributeless_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, subtagW);
 }
 
 /* ECMA-262 3rd Edition    15.5.4.15 */
-static HRESULT String_substring(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_substring(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *str;
-    BSTR val_str = NULL;
+    BSTR val_str;
     INT start=0, end;
     DWORD length;
     VARIANT v;
@@ -1389,25 +1275,9 @@
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(arg_cnt(dp) >= 1) {
         hres = to_integer(ctx, get_arg(dp,0), ei, &v);
@@ -1466,10 +1336,10 @@
 }
 
 /* ECMA-262 3rd Edition    B.2.3 */
-static HRESULT String_substr(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_substr(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    BSTR val_str = NULL;
+    BSTR val_str;
     const WCHAR *str;
     INT start=0, len;
     DWORD length;
@@ -1478,23 +1348,9 @@
 
     TRACE("\n");
 
-    if(is_class(dispex, JSCLASS_STRING)) {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }else {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(arg_cnt(dp) >= 1) {
         hres = to_integer(ctx, get_arg(dp,0), ei, &v);
@@ -1546,42 +1402,26 @@
     return hres;
 }
 
-static HRESULT String_sup(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_sup(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR suptagW[] = {'S','U','P',0};
-    return do_attributeless_tag_format(ctx, dispex, flags, dp, retv, ei, sp, suptagW);
+    return do_attributeless_tag_format(ctx, jsthis, flags, dp, retv, ei, sp, suptagW);
 }
 
-static HRESULT String_toLowerCase(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_toLowerCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR* str;
     DWORD length;
-    BSTR val_str = NULL;
+    BSTR val_str;
     HRESULT  hres;
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(retv) {
         if(!val_str) {
@@ -1599,35 +1439,19 @@
     return S_OK;
 }
 
-static HRESULT String_toUpperCase(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_toUpperCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR* str;
     DWORD length;
-    BSTR val_str = NULL;
+    BSTR val_str;
     HRESULT hres;
 
     TRACE("\n");
 
-    if(!is_class(dispex, JSCLASS_STRING)) {
-        VARIANT this;
-
-        V_VT(&this) = VT_DISPATCH;
-        V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
-
-        hres = to_string(ctx, &this, ei, &val_str);
-        if(FAILED(hres))
-            return hres;
-
-        str = val_str;
-        length = SysStringLen(val_str);
-    }
-    else {
-        StringInstance *this = (StringInstance*)dispex;
-
-        str = this->str;
-        length = this->length;
-    }
+    hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+    if(FAILED(hres))
+        return hres;
 
     if(retv) {
         if(!val_str) {
@@ -1645,31 +1469,31 @@
     return S_OK;
 }
 
-static HRESULT String_toLocaleLowerCase(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_toLocaleLowerCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT String_toLocaleUpperCase(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_toLocaleUpperCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT String_localeCompare(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_localeCompare(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT String_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    StringInstance *This = (StringInstance*)dispex;
+    StringInstance *This = string_from_vdisp(jsthis);
 
     TRACE("\n");
 
@@ -1747,7 +1571,7 @@
 };
 
 /* ECMA-262 3rd Edition    15.5.3.2 */
-static HRESULT StringConstr_fromCharCode(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
+static HRESULT StringConstr_fromCharCode(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DWORD i, code;
@@ -1777,7 +1601,7 @@
     return S_OK;
 }
 
-static HRESULT StringConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT StringConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     HRESULT hres;
