jscript: Pass script_ctx_t to builtin functions.
diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index ee499a5..3a79d5f 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -84,7 +84,7 @@
     return ptr+1;
 }
 
-static HRESULT Array_length(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_length(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     ArrayInstance *This = (ArrayInstance*)dispex;
@@ -173,7 +173,7 @@
     return jsdisp_propput_idx(array, (*len)++, &var, ei, caller);
 }
 
-static HRESULT Array_concat(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_concat(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DispatchEx *ret;
@@ -312,7 +312,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.5 */
-static HRESULT Array_join(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_join(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DWORD length;
@@ -344,7 +344,7 @@
     return hres;
 }
 
-static HRESULT Array_pop(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_pop(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT val;
@@ -406,7 +406,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.7 */
-static HRESULT Array_push(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_push(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DWORD length = 0;
@@ -443,7 +443,7 @@
     return S_OK;
 }
 
-static HRESULT Array_reverse(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_reverse(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
@@ -451,7 +451,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.9 */
-static HRESULT Array_shift(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_shift(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DWORD length = 0, i;
@@ -504,7 +504,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.10 */
-static HRESULT Array_slice(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_slice(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DispatchEx *arr;
@@ -641,7 +641,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.11 */
-static HRESULT Array_sort(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_sort(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DispatchEx *cmp_func = NULL;
@@ -798,7 +798,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.12 */
-static HRESULT Array_splice(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_splice(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DWORD length, start=0, delete_cnt=0, argc, i, add_args = 0;
@@ -912,7 +912,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.2 */
-static HRESULT Array_toString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -925,7 +925,7 @@
     return array_join(dispex, ((ArrayInstance*)dispex)->length, default_separatorW, retv, ei, sp);
 }
 
-static HRESULT Array_toLocaleString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_toLocaleString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
@@ -933,7 +933,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.4.4.13 */
-static HRESULT Array_unshift(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_unshift(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     WCHAR buf[14], *buf_end, *str;
@@ -999,7 +999,7 @@
     return S_OK;
 }
 
-static HRESULT Array_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Array_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -1068,7 +1068,7 @@
     Array_on_put
 };
 
-static HRESULT ArrayConstr_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT ArrayConstr_value(script_ctx_t *ctx, DispatchEx *dispex, 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 c7d8c63..76747bd 100644
--- a/dlls/jscript/bool.c
+++ b/dlls/jscript/bool.c
@@ -33,7 +33,7 @@
 static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
 
 /* ECMA-262 3rd Edition    15.6.4.2 */
-static HRESULT Bool_toString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Bool_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR trueW[] = {'t','r','u','e',0};
@@ -62,7 +62,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.6.4.3 */
-static HRESULT Bool_valueOf(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Bool_valueOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -80,7 +80,7 @@
     return S_OK;
 }
 
-static HRESULT Bool_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Bool_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -111,7 +111,7 @@
     NULL
 };
 
-static HRESULT BoolConstr_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT BoolConstr_value(script_ctx_t *ctx, DispatchEx *dispex, 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 871bb32..677ccc7 100644
--- a/dlls/jscript/date.c
+++ b/dlls/jscript/date.c
@@ -583,7 +583,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.1.2 */
-static HRESULT Date_toString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DateInstance *date;
@@ -604,7 +604,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.1.5 */
-static HRESULT Date_toLocaleString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toLocaleString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -633,7 +633,7 @@
     st = create_systemtime(local_time(date->time, date));
 
     if(st.wYear<1601 || st.wYear>9999)
-        return Date_toString(dispex, flags, dp, retv, ei, caller);
+        return Date_toString(ctx, dispex, flags, dp, retv, ei, caller);
 
     if(retv) {
         date_len = GetDateFormatW(dispex->ctx->lcid, DATE_LONGDATE, &st, NULL, NULL, 0);
@@ -651,7 +651,7 @@
     return S_OK;
 }
 
-static HRESULT Date_valueOf(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_valueOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -667,7 +667,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.42 */
-static HRESULT Date_toUTCString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toUTCString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -775,7 +775,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.3 */
-static HRESULT Date_toDateString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toDateString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -882,7 +882,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.4 */
-static HRESULT Date_toTimeString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toTimeString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -944,7 +944,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.6 */
-static HRESULT Date_toLocaleDateString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toLocaleDateString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -973,7 +973,7 @@
     st = create_systemtime(local_time(date->time, date));
 
     if(st.wYear<1601 || st.wYear>9999)
-        return Date_toDateString(dispex, flags, dp, retv, ei, caller);
+        return Date_toDateString(ctx, dispex, flags, dp, retv, ei, caller);
 
     if(retv) {
         len = GetDateFormatW(dispex->ctx->lcid, DATE_LONGDATE, &st, NULL, NULL, 0);
@@ -989,7 +989,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.7 */
-static HRESULT Date_toLocaleTimeString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_toLocaleTimeString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -1018,7 +1018,7 @@
     st = create_systemtime(local_time(date->time, date));
 
     if(st.wYear<1601 || st.wYear>9999)
-        return Date_toTimeString(dispex, flags, dp, retv, ei, caller);
+        return Date_toTimeString(ctx, dispex, flags, dp, retv, ei, caller);
 
     if(retv) {
         len = GetTimeFormatW(dispex->ctx->lcid, 0, &st, NULL, NULL, 0);
@@ -1034,7 +1034,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.9 */
-static HRESULT Date_getTime(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getTime(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1050,7 +1050,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.10 */
-static HRESULT Date_getFullYear(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getFullYear(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1068,7 +1068,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.11 */
-static HRESULT Date_getUTCFullYear(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCFullYear(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1084,7 +1084,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.12 */
-static HRESULT Date_getMonth(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getMonth(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1102,7 +1102,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.13 */
-static HRESULT Date_getUTCMonth(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCMonth(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1118,7 +1118,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.14 */
-static HRESULT Date_getDate(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getDate(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1136,7 +1136,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.15 */
-static HRESULT Date_getUTCDate(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCDate(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1152,7 +1152,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.16 */
-static HRESULT Date_getDay(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getDay(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1170,7 +1170,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.17 */
-static HRESULT Date_getUTCDay(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCDay(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1186,7 +1186,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.18 */
-static HRESULT Date_getHours(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getHours(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1204,7 +1204,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.19 */
-static HRESULT Date_getUTCHours(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCHours(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1220,7 +1220,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.20 */
-static HRESULT Date_getMinutes(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getMinutes(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1238,7 +1238,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.21 */
-static HRESULT Date_getUTCMinutes(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCMinutes(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1254,7 +1254,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.22 */
-static HRESULT Date_getSeconds(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getSeconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1272,7 +1272,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.23 */
-static HRESULT Date_getUTCSeconds(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCSeconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1288,7 +1288,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.24 */
-static HRESULT Date_getMilliseconds(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getMilliseconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1306,7 +1306,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.25 */
-static HRESULT Date_getUTCMilliseconds(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getUTCMilliseconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1322,7 +1322,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.26 */
-static HRESULT Date_getTimezoneOffset(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getTimezoneOffset(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -1339,7 +1339,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.27 */
-static HRESULT Date_setTime(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setTime(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1368,7 +1368,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.28 */
-static HRESULT Date_setMilliseconds(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setMilliseconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1401,7 +1401,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.29 */
-static HRESULT Date_setUTCMilliseconds(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1434,7 +1434,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.30 */
-static HRESULT Date_setSeconds(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setSeconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1477,7 +1477,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.31 */
-static HRESULT Date_setUTCSeconds(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1520,7 +1520,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.33 */
-static HRESULT Date_setMinutes(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setMinutes(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1571,7 +1571,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.34 */
-static HRESULT Date_setUTCMinutes(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1622,7 +1622,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.35 */
-static HRESULT Date_setHours(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setHours(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1680,7 +1680,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.36 */
-static HRESULT Date_setUTCHours(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCHours(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1738,7 +1738,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.36 */
-static HRESULT Date_setDate(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setDate(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1771,7 +1771,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.37 */
-static HRESULT Date_setUTCDate(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCDate(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1804,7 +1804,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.38 */
-static HRESULT Date_setMonth(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setMonth(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1847,7 +1847,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.39 */
-static HRESULT Date_setUTCMonth(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCMonth(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1890,7 +1890,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.40 */
-static HRESULT Date_setFullYear(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setFullYear(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1940,7 +1940,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.9.5.41 */
-static HRESULT Date_setUTCFullYear(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_setUTCFullYear(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     VARIANT v;
@@ -1990,7 +1990,7 @@
 }
 
 /* ECMA-262 3rd Edition    B2.4 */
-static HRESULT Date_getYear(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_getYear(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     DateInstance *date;
@@ -2018,7 +2018,7 @@
     return S_OK;
 }
 
-static HRESULT Date_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Date_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     TRACE("\n");
@@ -2380,7 +2380,7 @@
     return S_OK;
 }
 
-static HRESULT DateConstr_parse(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT DateConstr_parse(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     BSTR parse_str;
@@ -2404,7 +2404,7 @@
     return hres;
 }
 
-static HRESULT DateConstr_UTC(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT DateConstr_UTC(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT year, month, vdate, hours, minutes, seconds, ms;
@@ -2495,7 +2495,7 @@
     return S_OK;
 }
 
-static HRESULT DateConstr_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT DateConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DispatchEx *date;
@@ -2549,7 +2549,7 @@
             VARIANT ret_date;
             DateInstance *di;
 
-            DateConstr_UTC(dispex, flags, dp, &ret_date, ei, sp);
+            DateConstr_UTC(ctx, dispex, flags, dp, &ret_date, ei, sp);
 
             hres = create_date(dispex->ctx, NULL, num_val(&ret_date), &date);
             if(FAILED(hres))
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 54d0b3a..921b4ad 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -250,7 +250,7 @@
             WARN("%s is not a constructor\n", debugstr_w(prop->name));
             return E_INVALIDARG;
         }
-        return prop->u.p->invoke(jsthis, flags, dp, retv, ei, caller);
+        return prop->u.p->invoke(This->ctx, jsthis, flags, dp, retv, ei, caller);
     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 +304,7 @@
 
             hres = VariantCopy(retv, &prop->u.var);
         }else {
-            hres = prop->u.p->invoke(This, DISPATCH_PROPERTYGET, dp, retv, ei, caller);
+            hres = prop->u.p->invoke(This->ctx, This, DISPATCH_PROPERTYGET, dp, retv, ei, caller);
         }
         break;
     case PROP_PROTREF:
@@ -336,7 +336,7 @@
     switch(prop->type) {
     case PROP_BUILTIN:
         if(!(prop->flags & PROPF_METHOD))
-            return prop->u.p->invoke(This, DISPATCH_PROPERTYPUT, dp, NULL, ei, caller);
+            return prop->u.p->invoke(This->ctx, This, DISPATCH_PROPERTYPUT, dp, NULL, ei, caller);
     case PROP_PROTREF:
         prop->type = PROP_VARIANT;
         prop->flags = PROPF_ENUM;
@@ -826,7 +826,7 @@
 HRESULT jsdisp_call_value(DispatchEx *disp, WORD flags, DISPPARAMS *dp, VARIANT *retv,
         jsexcept_t *ei, IServiceProvider *caller)
 {
-    return disp->builtin_info->value_prop.invoke(disp, flags, dp, retv, ei, caller);
+    return disp->builtin_info->value_prop.invoke(disp->ctx, disp, flags, dp, retv, ei, caller);
 }
 
 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 e7f7263..c749f2b 100644
--- a/dlls/jscript/error.c
+++ b/dlls/jscript/error.c
@@ -39,7 +39,7 @@
 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(DispatchEx *dispex, WORD flags,
+static HRESULT Error_number(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     ErrorInstance *This = (ErrorInstance*)dispex;
@@ -57,7 +57,7 @@
     }
 }
 
-static HRESULT Error_description(DispatchEx *dispex, WORD flags,
+static HRESULT Error_description(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     ErrorInstance *This = (ErrorInstance*)dispex;
@@ -76,7 +76,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.11.4.3 */
-static HRESULT Error_message(DispatchEx *dispex, WORD flags,
+static HRESULT Error_message(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     ErrorInstance *This = (ErrorInstance*)dispex;
@@ -95,7 +95,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.11.4.4 */
-static HRESULT Error_toString(DispatchEx *dispex, WORD flags,
+static HRESULT Error_toString(script_ctx_t *ctx, DispatchEx *dispex, 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 +112,7 @@
     return S_OK;
 }
 
-static HRESULT Error_value(DispatchEx *dispex, WORD flags,
+static HRESULT Error_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -278,7 +278,7 @@
     }
 }
 
-static HRESULT ErrorConstr_value(DispatchEx *dispex, WORD flags,
+static HRESULT ErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -286,7 +286,7 @@
             dispex->ctx->error_constr);
 }
 
-static HRESULT EvalErrorConstr_value(DispatchEx *dispex, WORD flags,
+static HRESULT EvalErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -294,7 +294,7 @@
             dispex->ctx->eval_error_constr);
 }
 
-static HRESULT RangeErrorConstr_value(DispatchEx *dispex, WORD flags,
+static HRESULT RangeErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -302,7 +302,7 @@
             dispex->ctx->range_error_constr);
 }
 
-static HRESULT ReferenceErrorConstr_value(DispatchEx *dispex, WORD flags,
+static HRESULT ReferenceErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -310,7 +310,7 @@
             dispex->ctx->reference_error_constr);
 }
 
-static HRESULT RegExpErrorConstr_value(DispatchEx *dispex, WORD flags,
+static HRESULT RegExpErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -318,7 +318,7 @@
             dispex->ctx->regexp_error_constr);
 }
 
-static HRESULT SyntaxErrorConstr_value(DispatchEx *dispex, WORD flags,
+static HRESULT SyntaxErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -326,7 +326,7 @@
             dispex->ctx->syntax_error_constr);
 }
 
-static HRESULT TypeErrorConstr_value(DispatchEx *dispex, WORD flags,
+static HRESULT TypeErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -334,7 +334,7 @@
             dispex->ctx->type_error_constr);
 }
 
-static HRESULT URIErrorConstr_value(DispatchEx *dispex, WORD flags,
+static HRESULT URIErrorConstr_value(script_ctx_t *ctx, DispatchEx *dispex, 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 b0c260b..7d4be89 100644
--- a/dlls/jscript/function.c
+++ b/dlls/jscript/function.c
@@ -85,7 +85,7 @@
     return S_OK;
 }
 
-static HRESULT Arguments_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Arguments_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     FIXME("\n");
@@ -255,8 +255,8 @@
     if(this_disp)
         this_obj = iface_to_jsdisp((IUnknown*)this_disp);
 
-    hres = function->value_proc(this_obj ? this_obj : function->dispex.ctx->script_disp,
-                                flags, dp, retv, ei, caller);
+    hres = function->value_proc(function->dispex.ctx, this_obj ? this_obj : function->dispex.ctx->script_disp,
+            flags, dp, retv, ei, caller);
 
     if(this_obj)
         jsdisp_release(this_obj);
@@ -277,7 +277,7 @@
                 FIXME("this_obj is not DispatchEx\n");
         }
 
-        hres = function->value_proc(jsthis ? jsthis : function->dispex.ctx->script_disp,
+        hres = function->value_proc(function->dispex.ctx, jsthis ? jsthis : function->dispex.ctx->script_disp,
                 DISPATCH_METHOD, args, retv, ei, caller);
 
         if(jsthis)
@@ -320,7 +320,7 @@
     return S_OK;
 }
 
-static HRESULT Function_length(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Function_length(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FunctionInstance *This = (FunctionInstance*)dispex;
@@ -340,7 +340,7 @@
     return S_OK;
 }
 
-static HRESULT Function_toString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Function_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FunctionInstance *function;
@@ -402,7 +402,7 @@
     return S_OK;
 }
 
-static HRESULT Function_apply(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Function_apply(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     FunctionInstance *function;
@@ -458,7 +458,7 @@
     return hres;
 }
 
-static HRESULT Function_call(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Function_call(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     FunctionInstance *function;
@@ -494,7 +494,7 @@
     return hres;
 }
 
-HRESULT Function_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+HRESULT Function_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     FunctionInstance *function;
@@ -569,14 +569,14 @@
     NULL
 };
 
-static HRESULT FunctionConstr_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT FunctionConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT FunctionProt_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT FunctionProt_value(script_ctx_t *ctx, DispatchEx *dispex, 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 3c4438d..2264986 100644
--- a/dlls/jscript/global.c
+++ b/dlls/jscript/global.c
@@ -115,7 +115,7 @@
     return S_OK;
 }
 
-static HRESULT JSGlobal_NaN(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_NaN(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -133,7 +133,7 @@
     return S_OK;
 }
 
-static HRESULT JSGlobal_Infinity(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Infinity(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -151,7 +151,7 @@
     return S_OK;
 }
 
-static HRESULT JSGlobal_Array(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Array(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -159,7 +159,7 @@
     return constructor_call(dispex->ctx->array_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Boolean(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Boolean(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -167,7 +167,7 @@
     return constructor_call(dispex->ctx->bool_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Date(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Date(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -175,7 +175,7 @@
     return constructor_call(dispex->ctx->date_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Error(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Error(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -183,7 +183,7 @@
     return constructor_call(dispex->ctx->error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_EvalError(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_EvalError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -191,7 +191,7 @@
     return constructor_call(dispex->ctx->eval_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_RangeError(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_RangeError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -199,7 +199,7 @@
     return constructor_call(dispex->ctx->range_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_ReferenceError(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ReferenceError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -207,7 +207,7 @@
     return constructor_call(dispex->ctx->reference_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_SyntaxError(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_SyntaxError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -215,7 +215,7 @@
     return constructor_call(dispex->ctx->syntax_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_TypeError(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_TypeError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -223,7 +223,7 @@
     return constructor_call(dispex->ctx->type_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_URIError(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_URIError(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -231,7 +231,7 @@
     return constructor_call(dispex->ctx->uri_error_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Function(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Function(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -239,7 +239,7 @@
     return constructor_call(dispex->ctx->function_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Number(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Number(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -247,7 +247,7 @@
     return constructor_call(dispex->ctx->number_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_Object(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Object(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -255,7 +255,7 @@
     return constructor_call(dispex->ctx->object_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_String(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_String(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -263,7 +263,7 @@
     return constructor_call(dispex->ctx->string_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_RegExp(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_RegExp(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -271,28 +271,28 @@
     return constructor_call(dispex->ctx->regexp_constr, flags, dp, retv, ei, sp);
 }
 
-static HRESULT JSGlobal_ActiveXObject(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ActiveXObject(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_VBArray(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_VBArray(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_Enumerator(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_Enumerator(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_escape(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_escape(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_eval(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_isNaN(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_isFinite(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_parseInt(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_parseFloat(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_unescape(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_GetObject(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_ScriptEngine(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ScriptEngine(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_ScriptEngineMajorVersion(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ScriptEngineMajorVersion(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_ScriptEngineMinorVersion(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ScriptEngineMinorVersion(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_ScriptEngineBuildVersion(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_ScriptEngineBuildVersion(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_CollectGarbage(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_CollectGarbage(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT JSGlobal_encodeURI(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT JSGlobal_encodeURI(script_ctx_t *ctx, DispatchEx *dispex, 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 699850b..9365ce9 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -86,7 +86,7 @@
     JSCLASS_ARGUMENTS
 } jsclass_t;
 
-typedef HRESULT (*builtin_invoke_t)(DispatchEx*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
+typedef HRESULT (*builtin_invoke_t)(script_ctx_t*,DispatchEx*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
 
 typedef struct {
     const WCHAR *name;
@@ -146,7 +146,7 @@
 
 HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const WCHAR*,const builtin_info_t*,DWORD,
         DispatchEx*,DispatchEx**);
-HRESULT Function_value(DispatchEx*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
+HRESULT Function_value(script_ctx_t*,DispatchEx*,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*);
diff --git a/dlls/jscript/math.c b/dlls/jscript/math.c
index d00c7d5..e89f08b 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_E(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_LOG2E(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_LOG10E(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return math_constant(M_LOG10E, flags, retv);
 }
 
-static HRESULT Math_LN2(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_LN2(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return math_constant(M_LN2, flags, retv);
 }
 
-static HRESULT Math_LN10(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_LN10(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_PI(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
     return math_constant(M_PI, flags, retv);
 }
 
-static HRESULT Math_SQRT2(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_SQRT2(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_SQRT1_2(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_abs(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -158,7 +158,7 @@
     return S_OK;
 }
 
-static HRESULT Math_acos(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_acos(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -179,7 +179,7 @@
     return S_OK;
 }
 
-static HRESULT Math_asin(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_asin(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -200,7 +200,7 @@
     return S_OK;
 }
 
-static HRESULT Math_atan(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_atan(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -221,7 +221,7 @@
     return S_OK;
 }
 
-static HRESULT Math_atan2(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_atan2(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_ceil(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -270,7 +270,7 @@
     return S_OK;
 }
 
-static HRESULT Math_cos(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_cos(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -291,7 +291,7 @@
     return S_OK;
 }
 
-static HRESULT Math_exp(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_exp(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -312,7 +312,7 @@
     return S_OK;
 }
 
-static HRESULT Math_floor(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_floor(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -335,7 +335,7 @@
     return S_OK;
 }
 
-static HRESULT Math_log(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_log(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_max(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_min(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_pow(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_random(script_ctx_t *ctx, DispatchEx *dispex, 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_round(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -499,7 +499,7 @@
     return S_OK;
 }
 
-static HRESULT Math_sin(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_sin(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -520,7 +520,7 @@
     return S_OK;
 }
 
-static HRESULT Math_sqrt(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_sqrt(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     VARIANT v;
@@ -541,7 +541,7 @@
     return S_OK;
 }
 
-static HRESULT Math_tan(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Math_tan(script_ctx_t *ctx, DispatchEx *dispex, 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 af14690..45c1320 100644
--- a/dlls/jscript/number.c
+++ b/dlls/jscript/number.c
@@ -42,7 +42,7 @@
 
 #define NUMBER_TOSTRING_BUF_SIZE 64
 /* ECMA-262 3rd Edition    15.7.4.2 */
-static HRESULT Number_toString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     NumberInstance *number;
@@ -170,35 +170,35 @@
     return S_OK;
 }
 
-static HRESULT Number_toLocaleString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_toLocaleString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Number_toFixed(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_toFixed(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Number_toExponential(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_toExponential(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Number_toPrecision(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_toPrecision(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Number_valueOf(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_valueOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -213,7 +213,7 @@
     return S_OK;
 }
 
-static HRESULT Number_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Number_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     NumberInstance *number = (NumberInstance*)dispex;
@@ -251,7 +251,7 @@
     NULL
 };
 
-static HRESULT NumberConstr_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT NumberConstr_value(script_ctx_t *ctx, DispatchEx *dispex, 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 c028116..993a89f 100644
--- a/dlls/jscript/object.c
+++ b/dlls/jscript/object.c
@@ -32,7 +32,7 @@
 
 static const WCHAR default_valueW[] = {'[','o','b','j','e','c','t',' ','O','b','j','e','c','t',']',0};
 
-static HRESULT Object_toString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR formatW[] = {'[','o','b','j','e','c','t',' ','%','s',']',0};
@@ -71,7 +71,7 @@
     return S_OK;
 }
 
-static HRESULT Object_toLocaleString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_toLocaleString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DISPPARAMS params = {NULL, NULL, 0, 0};
@@ -81,7 +81,7 @@
     return jsdisp_call_name(dispex, toStringW, DISPATCH_METHOD, &params, retv, ei, sp);
 }
 
-static HRESULT Object_valueOf(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_valueOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -96,28 +96,28 @@
     return S_OK;
 }
 
-static HRESULT Object_hasOwnProperty(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Object_propertyIsEnumerable(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_propertyIsEnumerable(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Object_isPrototypeOf(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT Object_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT Object_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -162,7 +162,7 @@
     NULL
 };
 
-static HRESULT ObjectConstr_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT ObjectConstr_value(script_ctx_t *ctx, DispatchEx *dispex, 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 1236327..2b99e78 100644
--- a/dlls/jscript/regexp.c
+++ b/dlls/jscript/regexp.c
@@ -3425,7 +3425,7 @@
     return S_OK;
 }
 
-static HRESULT RegExp_source(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_source(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -3448,28 +3448,28 @@
     return S_OK;
 }
 
-static HRESULT RegExp_global(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_global(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT RegExp_ignoreCase(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_ignoreCase(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT RegExp_multiline(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_multiline(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT RegExp_lastIndex(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_lastIndex(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -3489,7 +3489,7 @@
     return S_OK;
 }
 
-static HRESULT RegExp_toString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
@@ -3609,7 +3609,7 @@
     return S_OK;
 }
 
-static HRESULT RegExp_exec(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_exec(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     match_result_t *parens = NULL, match;
@@ -3643,7 +3643,7 @@
     return hres;
 }
 
-static HRESULT RegExp_test(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_test(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     match_result_t match;
@@ -3663,7 +3663,7 @@
     return S_OK;
 }
 
-static HRESULT RegExp_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExp_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
@@ -3828,7 +3828,7 @@
     return S_OK;
 }
 
-static HRESULT RegExpConstr_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT RegExpConstr_value(script_ctx_t *ctx, DispatchEx *dispex, 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 1e7cde3..b44cbfd 100644
--- a/dlls/jscript/string.c
+++ b/dlls/jscript/string.c
@@ -64,7 +64,7 @@
 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(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_length(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("%p\n", dispex);
@@ -86,7 +86,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.2 */
-static HRESULT String_toString(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_toString(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     StringInstance *string;
@@ -112,12 +112,12 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.2 */
-static HRESULT String_valueOf(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_valueOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     TRACE("\n");
 
-    return String_toString(dispex, flags, dp, retv, ei, sp);
+    return String_toString(ctx, dispex, flags, dp, retv, ei, sp);
 }
 
 static HRESULT do_attributeless_tag_format(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
@@ -234,7 +234,7 @@
     return S_OK;
 }
 
-static HRESULT String_anchor(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_anchor(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR fontW[] = {'A',0};
@@ -243,21 +243,21 @@
     return do_attribute_tag_format(dispex, flags, dp, retv, ei, sp, fontW, colorW);
 }
 
-static HRESULT String_big(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_big(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR bigtagW[] = {'B','I','G',0};
     return do_attributeless_tag_format(dispex, flags, dp, retv, ei, sp, bigtagW);
 }
 
-static HRESULT String_blink(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_blink(script_ctx_t *ctx, DispatchEx *dispex, 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(dispex, flags, dp, retv, ei, sp, blinktagW);
 }
 
-static HRESULT String_bold(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_bold(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR boldtagW[] = {'B',0};
@@ -265,7 +265,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.5 */
-static HRESULT String_charAt(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_charAt(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *str;
@@ -333,7 +333,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.5 */
-static HRESULT String_charCodeAt(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_charCodeAt(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *str;
@@ -391,7 +391,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.6 */
-static HRESULT String_concat(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_concat(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     BSTR *strs = NULL, ret = NULL;
@@ -448,14 +448,14 @@
     return S_OK;
 }
 
-static HRESULT String_fixed(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_fixed(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR fixedtagW[] = {'T','T',0};
     return do_attributeless_tag_format(dispex, flags, dp, retv, ei, sp, fixedtagW);
 }
 
-static HRESULT String_fontcolor(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_fontcolor(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR fontW[] = {'F','O','N','T',0};
@@ -464,7 +464,7 @@
     return do_attribute_tag_format(dispex, flags, dp, retv, ei, sp, fontW, colorW);
 }
 
-static HRESULT String_fontsize(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_fontsize(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR fontW[] = {'F','O','N','T',0};
@@ -473,7 +473,7 @@
     return do_attribute_tag_format(dispex, flags, dp, retv, ei, sp, fontW, colorW);
 }
 
-static HRESULT String_indexOf(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_indexOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DWORD length, pos = 0;
@@ -555,7 +555,7 @@
     return S_OK;
 }
 
-static HRESULT String_italics(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_italics(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR italicstagW[] = {'I',0};
@@ -563,7 +563,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.8 */
-static HRESULT String_lastIndexOf(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_lastIndexOf(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     BSTR search_str, val_str = NULL;
@@ -649,7 +649,7 @@
     return S_OK;
 }
 
-static HRESULT String_link(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_link(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR fontW[] = {'A',0};
@@ -659,7 +659,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.10 */
-static HRESULT String_match(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_match(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *str;
@@ -871,7 +871,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.11 */
-static HRESULT String_replace(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_replace(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
     const WCHAR *str;
@@ -1105,7 +1105,7 @@
     return hres;
 }
 
-static HRESULT String_search(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_search(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
@@ -1113,7 +1113,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.13 */
-static HRESULT String_slice(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_slice(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *str;
@@ -1209,14 +1209,14 @@
     return S_OK;
 }
 
-static HRESULT String_small(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_small(script_ctx_t *ctx, DispatchEx *dispex, 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(dispex, flags, dp, retv, ei, sp, smalltagW);
 }
 
-static HRESULT String_split(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_split(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     match_result_t *match_result = NULL;
@@ -1357,14 +1357,14 @@
     return hres;
 }
 
-static HRESULT String_strike(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_strike(script_ctx_t *ctx, DispatchEx *dispex, 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(dispex, flags, dp, retv, ei, sp, striketagW);
 }
 
-static HRESULT String_sub(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_sub(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR subtagW[] = {'S','U','B',0};
@@ -1372,7 +1372,7 @@
 }
 
 /* ECMA-262 3rd Edition    15.5.4.15 */
-static HRESULT String_substring(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_substring(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR *str;
@@ -1461,7 +1461,7 @@
 }
 
 /* ECMA-262 3rd Edition    B.2.3 */
-static HRESULT String_substr(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_substr(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     BSTR val_str = NULL;
@@ -1541,14 +1541,14 @@
     return hres;
 }
 
-static HRESULT String_sup(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_sup(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     static const WCHAR suptagW[] = {'S','U','P',0};
     return do_attributeless_tag_format(dispex, flags, dp, retv, ei, sp, suptagW);
 }
 
-static HRESULT String_toLowerCase(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_toLowerCase(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR* str;
@@ -1594,7 +1594,7 @@
     return S_OK;
 }
 
-static HRESULT String_toUpperCase(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_toUpperCase(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     const WCHAR* str;
@@ -1640,28 +1640,28 @@
     return S_OK;
 }
 
-static HRESULT String_toLocaleLowerCase(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_toLocaleLowerCase(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT String_toLocaleUpperCase(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_toLocaleUpperCase(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT String_localeCompare(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_localeCompare(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
-static HRESULT String_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT String_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     StringInstance *This = (StringInstance*)dispex;
@@ -1742,7 +1742,7 @@
 };
 
 /* ECMA-262 3rd Edition    15.5.3.2 */
-static HRESULT StringConstr_fromCharCode(DispatchEx *dispex, WORD flags,
+static HRESULT StringConstr_fromCharCode(script_ctx_t *ctx, DispatchEx *dispex, WORD flags,
         DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     DWORD i, code;
@@ -1772,7 +1772,7 @@
     return S_OK;
 }
 
-static HRESULT StringConstr_value(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+static HRESULT StringConstr_value(script_ctx_t *ctx, DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
     HRESULT hres;