[gjs/callargs] Port to CallReceiver/CallArgs



commit ab9f2e90e64ce9bbd4b1aa3260bc56ba67648dd5
Author: Tim Lunn <tim feathertop org>
Date:   Sat Jan 3 12:38:05 2015 +1100

    Port to CallReceiver/CallArgs
    
    JS_ARGV, JS_SET_RVAL are gone in spidermonkey 31, and JS_THIS will be going away in the future
    
    https://bugzilla.gnome.org/show_bug.cgi?id=742249

 gi/boxed.cpp                      |   10 ++-
 gi/function.cpp                   |   21 +++--
 gi/fundamental.cpp                |    8 +-
 gi/gerror.cpp                     |   10 ++-
 gi/gtype.cpp                      |   11 ++-
 gi/object.cpp                     |   53 +++++++-----
 gi/union.cpp                      |    6 +-
 gjs/byteArray.cpp                 |   27 +++---
 gjs/compat.h                      |    6 +-
 gjs/context.cpp                   |   27 +++---
 gjs/coverage.cpp                  |    4 +-
 modules/cairo-context.cpp         |  167 +++++++++++++++++++++----------------
 modules/cairo-gradient.cpp        |   18 ++--
 modules/cairo-image-surface.cpp   |   32 +++++---
 modules/cairo-linear-gradient.cpp |    2 +-
 modules/cairo-pattern.cpp         |    6 +-
 modules/cairo-pdf-surface.cpp     |    2 +-
 modules/cairo-ps-surface.cpp      |    2 +-
 modules/cairo-radial-gradient.cpp |    2 +-
 modules/cairo-region.cpp          |   23 +++---
 modules/cairo-solid-pattern.cpp   |   12 ++--
 modules/cairo-surface-pattern.cpp |   32 ++++---
 modules/cairo-surface.cpp         |   15 ++--
 modules/cairo-svg-surface.cpp     |    2 +-
 modules/console.cpp               |    3 +-
 modules/system.cpp                |   31 ++++----
 26 files changed, 298 insertions(+), 234 deletions(-)
---
diff --git a/gi/boxed.cpp b/gi/boxed.cpp
index aeb5702..7584525 100644
--- a/gi/boxed.cpp
+++ b/gi/boxed.cpp
@@ -489,11 +489,11 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(boxed)
     actual_rval = JSVAL_VOID;
     JS_AddValueRoot(context, &actual_rval);
 
-    retval = boxed_new(context, object, priv, argc, argv, &actual_rval);
+    retval = boxed_new(context, object, priv, argc, argv.array(), &actual_rval);
 
     if (retval) {
         if (!JSVAL_IS_VOID (actual_rval))
-            JS_SET_RVAL(context, vp, actual_rval);
+            argv.rval().set(actual_rval);
         else
             GJS_NATIVE_CONSTRUCTOR_FINISH(boxed);
     }
@@ -894,7 +894,9 @@ to_string_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     Boxed *priv;
     JSBool ret = JS_FALSE;
     jsval retval;
@@ -907,7 +909,7 @@ to_string_func(JSContext *context,
         goto out;
 
     ret = JS_TRUE;
-    JS_SET_RVAL(context, vp, retval);
+    rec.rval().set(retval);
  out:
     return ret;
 }
diff --git a/gi/function.cpp b/gi/function.cpp
index 686aaee..304dcdb 100644
--- a/gi/function.cpp
+++ b/gi/function.cpp
@@ -1300,9 +1300,10 @@ function_call(JSContext *context,
               unsigned   js_argc,
               jsval     *vp)
 {
-    jsval *js_argv = JS_ARGV(context, vp);
-    JSObject *object = JS_THIS_OBJECT(context, vp);
-    JSObject *callee = JSVAL_TO_OBJECT(JS_CALLEE(context, vp));
+    JS::CallArgs js_argv = JS::CallArgsFromVp (js_argc, vp);
+    JSObject *object = JSVAL_TO_OBJECT(js_argv.thisv());
+    JSObject *callee = &js_argv.callee();
+
     JSBool success;
     Function *priv;
     jsval retval;
@@ -1316,9 +1317,9 @@ function_call(JSContext *context,
         return JS_TRUE; /* we are the prototype, or have the wrong class */
 
 
-    success = gjs_invoke_c_function(context, priv, object, js_argc, js_argv, &retval, NULL);
+    success = gjs_invoke_c_function(context, priv, object, js_argc, js_argv.array(), &retval, NULL);
     if (success)
-        JS_SET_RVAL(context, vp, retval);
+        js_argv.rval().set(retval);
 
     return success;
 }
@@ -1367,6 +1368,8 @@ get_num_arguments (JSContext *context,
     jsval retval;
     Function *priv;
 
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp.address());
+
     priv = priv_from_js(context, obj);
 
     if (priv == NULL)
@@ -1387,7 +1390,7 @@ get_num_arguments (JSContext *context,
     }
 
     retval = INT_TO_JSVAL(n_jsargs);
-    JS_SET_RVAL(context, vp.address(), retval);
+    rec.rval().set(retval);
     return JS_TRUE;
 }
 
@@ -1406,7 +1409,9 @@ function_to_string (JSContext *context,
     GString *arg_names_str;
     gchar *arg_names;
 
-    self = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    self = JSVAL_TO_OBJECT(rec.thisv());
+
     if (!self) {
         gjs_throw(context, "this cannot be null");
         return JS_FALSE;
@@ -1458,7 +1463,7 @@ function_to_string (JSContext *context,
 
  out:
     if (gjs_string_from_utf8(context, string, -1, &retval)) {
-        JS_SET_RVAL(context, vp, retval);
+        rec.rval().set(retval);
         ret = JS_TRUE;
     }
 
diff --git a/gi/fundamental.cpp b/gi/fundamental.cpp
index 9ca8003..0e1908f 100644
--- a/gi/fundamental.cpp
+++ b/gi/fundamental.cpp
@@ -444,7 +444,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(fundamental_instance)
                         "fundamental constructor, obj %p priv %p",
                         object, priv);
 
-    if (!fundamental_invoke_constructor(priv, context, object, argc, argv, &ret_value))
+    if (!fundamental_invoke_constructor(priv, context, object, argc, argv.array(), &ret_value))
         return JS_FALSE;
 
     associate_js_instance_to_fundamental(context, object, ret_value.v_pointer, FALSE);
@@ -504,7 +504,9 @@ to_string_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     FundamentalInstance *priv;
     JSBool ret = JS_FALSE;
     jsval retval;
@@ -531,7 +533,7 @@ to_string_func(JSContext *context,
     }
 
     ret = JS_TRUE;
-    JS_SET_RVAL(context, vp, retval);
+    rec.rval().set(retval);
  out:
     return ret;
 }
diff --git a/gi/gerror.cpp b/gi/gerror.cpp
index 2384cd5..f183ca3 100644
--- a/gi/gerror.cpp
+++ b/gi/gerror.cpp
@@ -215,7 +215,8 @@ error_to_string(JSContext *context, unsigned argc, jsval *vp)
     gchar *descr;
     JSBool retval;
 
-    v_self = JS_THIS(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    v_self = rec.thisv();
     if (!JSVAL_IS_OBJECT(v_self)) {
         /* Lie a bit here... */
         gjs_throw(context, "GLib.Error.prototype.toString() called on a non object");
@@ -251,7 +252,7 @@ error_to_string(JSContext *context, unsigned argc, jsval *vp)
             goto out;
     }
 
-    JS_SET_RVAL(context, vp, v_out);
+    rec.rval().set(v_out);
     retval = JS_TRUE;
 
  out:
@@ -267,7 +268,8 @@ error_constructor_value_of(JSContext *context, unsigned argc, jsval *vp)
     jsval v_out;
     jsid prototype_name;
 
-    v_self = JS_THIS(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    v_self = rec.thisv();
     if (!JSVAL_IS_OBJECT(v_self)) {
         /* Lie a bit here... */
         gjs_throw(context, "GLib.Error.valueOf() called on a non object");
@@ -295,7 +297,7 @@ error_constructor_value_of(JSContext *context, unsigned argc, jsval *vp)
 
     v_out = INT_TO_JSVAL(priv->domain);
 
-    JS_SET_RVAL(context, vp, v_out);
+    rec.rval().set(v_out);
     return TRUE;
 }
 
diff --git a/gi/gtype.cpp b/gi/gtype.cpp
index 7ac2a38..ea2b496 100644
--- a/gi/gtype.cpp
+++ b/gi/gtype.cpp
@@ -66,7 +66,9 @@ to_string_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     GType gtype;
     gchar *strval;
     JSBool ret;
@@ -81,7 +83,7 @@ to_string_func(JSContext *context,
                                  g_type_name(gtype));
     ret = gjs_string_from_utf8(context, strval, -1, &retval);
     if (ret)
-        JS_SET_RVAL(context, vp, retval);
+        rec.rval().set(retval);
     g_free(strval);
     return ret;
 }
@@ -95,16 +97,17 @@ get_name_func (JSContext *context,
     GType gtype;
     JSBool ret;
     jsval retval;
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp.address());
 
     gtype = GPOINTER_TO_SIZE(priv_from_js(context, obj));
 
     if (gtype == 0) {
-        JS_SET_RVAL(context, vp.address(), JSVAL_NULL);
+        rec.rval().set(JSVAL_NULL);
         return TRUE;
     } else {
         ret = gjs_string_from_utf8(context, g_type_name(gtype), -1, &retval);
         if (ret)
-            JS_SET_RVAL(context, vp.address(), retval);
+            rec.rval().set(retval);
         return ret;
     }
 }
diff --git a/gi/object.cpp b/gi/object.cpp
index cdc7775..5e07378 100644
--- a/gi/object.cpp
+++ b/gi/object.cpp
@@ -1348,12 +1348,12 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(object_instance)
         return JS_FALSE;
 
     rval = JSVAL_VOID;
-    ret = gjs_call_function_value(context, object, initer, argc, argv, &rval);
+    ret = gjs_call_function_value(context, object, initer, argc, argv.array(), &rval);
 
     if (JSVAL_IS_VOID(rval))
         rval = OBJECT_TO_JSVAL(object);
 
-    JS_SET_RVAL(context, vp, rval);
+    argv.rval().set(rval);
     return ret;
 }
 
@@ -1560,8 +1560,9 @@ real_connect_func(JSContext *context,
                   jsval     *vp,
                   gboolean  after)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     ObjectInstance *priv;
     GClosure *closure;
     gulong id;
@@ -1640,7 +1641,7 @@ real_connect_func(JSContext *context,
         goto out;
     }
     
-    JS_SET_RVAL(context, vp, retval);
+    argv.rval().set(retval);
 
     ret = JS_TRUE;
  out:
@@ -1669,8 +1670,9 @@ emit_func(JSContext *context,
           unsigned   argc,
           jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     ObjectInstance *priv;
     guint signal_id;
     GQuark signal_detail;
@@ -1779,7 +1781,7 @@ emit_func(JSContext *context,
     }
 
     if (!failed)
-        JS_SET_RVAL(context, vp, retval);
+        argv.rval().set(retval);
 
     ret = !failed;
  out:
@@ -1792,7 +1794,9 @@ to_string_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     ObjectInstance *priv;
     JSBool ret = JS_FALSE;
     jsval retval;
@@ -1812,7 +1816,7 @@ to_string_func(JSContext *context,
         goto out;
 
     ret = JS_TRUE;
-    JS_SET_RVAL(context, vp, retval);
+    rec.rval().set(retval);
  out:
     return ret;
 }
@@ -1842,17 +1846,18 @@ init_func (JSContext *context,
            unsigned   argc,
            jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     JSBool ret;
 
     if (!do_base_typecheck(context, obj, TRUE))
         return FALSE;
 
-    ret = object_instance_init(context, &obj, argc, argv);
+    ret = object_instance_init(context, &obj, argc, argv.array());
 
     if (ret)
-        JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(obj));
+        argv.rval().set(OBJECT_TO_JSVAL(obj));
 
     return ret;
 }
@@ -2274,7 +2279,7 @@ gjs_hook_up_vfunc(JSContext *cx,
                   unsigned   argc,
                   jsval     *vp)
 {
-    jsval *argv = JS_ARGV(cx, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     gchar *name;
     JSObject *object;
     JSObject *function;
@@ -2285,8 +2290,8 @@ gjs_hook_up_vfunc(JSContext *cx,
     gpointer implementor_vtable;
     GIFieldInfo *field_info;
 
-    if (!gjs_parse_args(cx, "hook_up_vfunc",
-                        "oso", argc, argv,
+    if (!gjs_parse_call_args(cx, "hook_up_vfunc",
+                        "oso", argv,
                         "object", &object,
                         "name", &name,
                         "function", &function))
@@ -2311,7 +2316,7 @@ gjs_hook_up_vfunc(JSContext *cx,
      * This is awful, so abort now. */
     g_assert(info != NULL);
 
-    JS_SET_RVAL(cx, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
 
     vfunc = find_vfunc_on_parents(info, name, NULL);
 
@@ -2527,7 +2532,7 @@ gjs_register_type(JSContext *cx,
                   unsigned   argc,
                   jsval     *vp)
 {
-    jsval *argv = JS_ARGV(cx, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     gchar *name;
     JSObject *parent, *constructor, *interfaces, *properties, *module;
     GType instance_type, parent_type;
@@ -2555,8 +2560,8 @@ gjs_register_type(JSContext *cx,
 
     JS_BeginRequest(cx);
 
-    if (!gjs_parse_args(cx, "register_type",
-                        "osoo", argc, argv,
+    if (!gjs_parse_call_args(cx, "register_type",
+                        "osoo", argv,
                         "parent", &parent,
                         "name", &name,
                         "interfaces", &interfaces,
@@ -2667,7 +2672,7 @@ gjs_register_type(JSContext *cx,
     module = gjs_lookup_private_namespace(cx);
     gjs_define_object_class(cx, module, NULL, instance_type, &constructor);
 
-    JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(constructor));
+    argv.rval().set(OBJECT_TO_JSVAL(constructor));
 
     retval = JS_TRUE;
 
@@ -2683,7 +2688,7 @@ gjs_signal_new(JSContext *cx,
                unsigned   argc,
                jsval     *vp)
 {
-    jsval *argv = JS_ARGV(cx, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     JSObject *obj;
     GType gtype;
     gchar *signal_name = NULL;
@@ -2758,7 +2763,7 @@ gjs_signal_new(JSContext *cx,
                               n_parameters,
                               params);
 
-    JS_SET_RVAL(cx, vp, INT_TO_JSVAL(signal_id));
+    argv.rval().set(INT_TO_JSVAL(signal_id));
     ret = JS_TRUE;
 
  out:
diff --git a/gi/union.cpp b/gi/union.cpp
index 718b991..23ca458 100644
--- a/gi/union.cpp
+++ b/gi/union.cpp
@@ -283,7 +283,9 @@ to_string_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     Union *priv;
     JSBool ret = JS_FALSE;
     jsval retval;
@@ -296,7 +298,7 @@ to_string_func(JSContext *context,
         goto out;
 
     ret = JS_TRUE;
-    JS_SET_RVAL(context, vp, retval);
+    rec.rval().set(retval);
  out:
     return ret;
 }
diff --git a/gjs/byteArray.cpp b/gjs/byteArray.cpp
index 8f99f42..b543fa5 100644
--- a/gjs/byteArray.cpp
+++ b/gjs/byteArray.cpp
@@ -416,8 +416,8 @@ to_string_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *object = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *object = JSVAL_TO_OBJECT(argv.thisv());
     ByteArrayInstance *priv;
     char *encoding;
     gboolean encoding_is_utf8;
@@ -468,7 +468,7 @@ to_string_func(JSContext *context,
                                   priv->array->len,
                                   &retval);
         if (ok)
-            JS_SET_RVAL(context, vp, retval);
+            argv.rval().set(retval);
         return ok;
     } else {
         JSBool ok = JS_FALSE;
@@ -502,7 +502,7 @@ to_string_func(JSContext *context,
                                 bytes_written / 2);
         if (s != NULL) {
             ok = JS_TRUE;
-            JS_SET_RVAL(context, vp, STRING_TO_JSVAL(s));
+            argv.rval().set(STRING_TO_JSVAL(s));
         }
 
         g_free(u16_str);
@@ -515,7 +515,8 @@ to_gbytes_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *object = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *object = JSVAL_TO_OBJECT(rec.thisv());
     ByteArrayInstance *priv;
     JSObject *ret_bytes_obj;
     GIBaseInfo *gbytes_info;
@@ -530,7 +531,7 @@ to_gbytes_func(JSContext *context,
     ret_bytes_obj = gjs_boxed_from_c_struct(context, (GIStructInfo*)gbytes_info,
                                             priv->bytes, GJS_BOXED_CREATION_NONE);
 
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(ret_bytes_obj));
+    rec.rval().set(OBJECT_TO_JSVAL(ret_bytes_obj));
     return JS_TRUE;
 }
 
@@ -577,7 +578,7 @@ from_string_func(JSContext *context,
                  unsigned   argc,
                  jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     ByteArrayInstance *priv;
     char *encoding;
     gboolean encoding_is_utf8;
@@ -668,7 +669,7 @@ from_string_func(JSContext *context,
         g_free(encoded);
     }
 
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(obj));
+    argv.rval().set(OBJECT_TO_JSVAL(obj));
 
     retval = JS_TRUE;
  out:
@@ -682,7 +683,7 @@ from_array_func(JSContext *context,
                 unsigned   argc,
                 jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     ByteArrayInstance *priv;
     guint32 len;
     guint32 i;
@@ -738,7 +739,7 @@ from_array_func(JSContext *context,
     }
 
     ret = JS_TRUE;
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(obj));
+    argv.rval().set(OBJECT_TO_JSVAL(obj));
  out:
     JS_RemoveObjectRoot(context, &obj);
     return ret;
@@ -749,14 +750,14 @@ from_gbytes_func(JSContext *context,
                  unsigned   argc,
                  jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     JSObject *bytes_obj;
     GBytes *gbytes;
     ByteArrayInstance *priv;
     JSObject *obj;
     JSBool ret = JS_FALSE;
 
-    if (!gjs_parse_args(context, "overrides_gbytes_to_array", "o", argc, argv,
+    if (!gjs_parse_call_args(context, "overrides_gbytes_to_array", "o", argv,
                         "bytes", &bytes_obj))
         return JS_FALSE;
 
@@ -774,7 +775,7 @@ from_gbytes_func(JSContext *context,
     priv->bytes = g_bytes_ref(gbytes);
 
     ret = JS_TRUE;
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(obj));
+    argv.rval().set(OBJECT_TO_JSVAL(obj));
     return ret;
 }
 
diff --git a/gjs/compat.h b/gjs/compat.h
index b5b617f..236ce60 100644
--- a/gjs/compat.h
+++ b/gjs/compat.h
@@ -77,8 +77,8 @@ gjs_##name##_constructor(JSContext  *context,           \
  * be at the very top.
  */
 #define GJS_NATIVE_CONSTRUCTOR_VARIABLES(name)          \
-    JSObject *object = NULL;                            \
-    jsval *argv G_GNUC_UNUSED = JS_ARGV(context, vp);
+    JSObject *object = NULL;                                            \
+    JS::CallArgs argv G_GNUC_UNUSED = JS::CallArgsFromVp(argc, vp);
 
 /**
  * GJS_NATIVE_CONSTRUCTOR_PRELUDE:
@@ -101,7 +101,7 @@ gjs_##name##_constructor(JSContext  *context,           \
  * successfully.
  */
 #define GJS_NATIVE_CONSTRUCTOR_FINISH(name)             \
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(object));
+    argv.rval().set(OBJECT_TO_JSVAL(object));
 
 /**
  * GJS_NATIVE_CONSTRUCTOR_DEFINE_ABSTRACT:
diff --git a/gjs/context.cpp b/gjs/context.cpp
index 39c852a..19120c4 100644
--- a/gjs/context.cpp
+++ b/gjs/context.cpp
@@ -107,7 +107,7 @@ gjs_log(JSContext *context,
         unsigned   argc,
         jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     char *s;
     JSExceptionState *exc_state;
     JSString *jstr;
@@ -142,7 +142,7 @@ gjs_log(JSContext *context,
     g_free(s);
 
     JS_EndRequest(context);
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -151,7 +151,7 @@ gjs_log_error(JSContext *context,
               unsigned   argc,
               jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     JSExceptionState *exc_state;
     JSString *jstr;
 
@@ -178,14 +178,13 @@ gjs_log_error(JSContext *context,
     gjs_log_exception_full(context, argv[0], jstr);
 
     JS_EndRequest(context);
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
 static JSBool
 gjs_print_parse_args(JSContext *context,
-                     unsigned   argc,
-                     jsval     *argv,
+                     JS::CallArgs &argv,
                      char     **buffer)
 {
     GString *str;
@@ -195,7 +194,7 @@ gjs_print_parse_args(JSContext *context,
     JS_BeginRequest(context);
 
     str = g_string_new("");
-    for (n = 0; n < argc; ++n) {
+    for (n = 0; n < argv.length(); ++n) {
         JSExceptionState *exc_state;
         JSString *jstr;
 
@@ -218,7 +217,7 @@ gjs_print_parse_args(JSContext *context,
 
             g_string_append(str, s);
             g_free(s);
-            if (n < (argc-1))
+            if (n < (argv.length()-1))
                 g_string_append_c(str, ' ');
         } else {
             JS_EndRequest(context);
@@ -240,17 +239,17 @@ gjs_print(JSContext *context,
           unsigned   argc,
           jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     char *buffer;
 
-    if (!gjs_print_parse_args(context, argc, argv, &buffer)) {
+    if (!gjs_print_parse_args(context, argv, &buffer)) {
         return FALSE;
     }
 
     g_print("%s\n", buffer);
     g_free(buffer);
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -259,17 +258,17 @@ gjs_printerr(JSContext *context,
              unsigned   argc,
              jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     char *buffer;
 
-    if (!gjs_print_parse_args(context, argc, argv, &buffer)) {
+    if (!gjs_print_parse_args(context, argv, &buffer)) {
         return FALSE;
     }
 
     g_printerr("%s\n", buffer);
     g_free(buffer);
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
diff --git a/gjs/coverage.cpp b/gjs/coverage.cpp
index 73ed9e8..a9b982d 100644
--- a/gjs/coverage.cpp
+++ b/gjs/coverage.cpp
@@ -979,7 +979,7 @@ coverage_warning(JSContext *context,
                  unsigned   argc,
                  jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     char *s;
     JSExceptionState *exc_state;
     JSString *jstr;
@@ -1014,7 +1014,7 @@ coverage_warning(JSContext *context,
     g_free(s);
 
     JS_EndRequest(context);
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
diff --git a/modules/cairo-context.cpp b/modules/cairo-context.cpp
index 0bf6489..8e06d16 100644
--- a/modules/cairo-context.cpp
+++ b/modules/cairo-context.cpp
@@ -36,7 +36,8 @@ mname##_func(JSContext *context,                    \
               unsigned   argc,                      \
               jsval     *vp)                    \
 {                                                   \
-    JSObject *obj = JS_THIS_OBJECT(context, vp);        \
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);             \
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());                  \
     cairo_t *cr;
 
 #define _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END                             \
@@ -55,7 +56,7 @@ mname##_func(JSContext *context,                    \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
     cr = gjs_cairo_context_get_context(context, obj);                      \
     cfunc(cr);                                                             \
-    JS_SET_RVAL(context, vp, JSVAL_VOID);                                  \
+    argv.rval().set(JSVAL_VOID);                                           \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
 #define _GJS_CAIRO_CONTEXT_DEFINE_FUNC0I(method, cfunc)                    \
@@ -64,7 +65,7 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
    _GJS_CAIRO_CONTEXT_CHECK_NO_ARGS(method)                                \
     cr = gjs_cairo_context_get_context(context, obj);                      \
     ret = (int)cfunc(cr);                                                  \
-    JS_SET_RVAL(context, vp, INT_TO_JSVAL(ret));                           \
+    argv.rval().setInt32(ret);                                             \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
 #define _GJS_CAIRO_CONTEXT_DEFINE_FUNC0B(method, cfunc)                    \
@@ -73,13 +74,13 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
    _GJS_CAIRO_CONTEXT_CHECK_NO_ARGS(method)                                \
     cr = gjs_cairo_context_get_context(context, obj);                      \
     ret = cfunc(cr);                                                       \
-    JS_SET_RVAL(context, vp, BOOLEAN_TO_JSVAL(ret));                       \
+    argv.rval().set(BOOLEAN_TO_JSVAL(ret));                                \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
 #define _GJS_CAIRO_CONTEXT_DEFINE_FUNC2FFAFF(method, cfunc, n1, n2)        \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
     double arg1, arg2;                                                     \
-    if (!gjs_parse_args(context, #method, "ff", argc, JS_ARGV(context, vp), \
+    if (!gjs_parse_call_args(context, #method, "ff", argv,                 \
                         #n1, &arg1, #n2, &arg2))                           \
         return JS_FALSE;                                                   \
     cr = gjs_cairo_context_get_context(context, obj);                      \
@@ -93,7 +94,7 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
       if (!JS_SetElement(context, array, 0, &r)) return JS_FALSE;          \
       if (!JS_NewNumberValue(context, arg2, &r)) return JS_FALSE;          \
       if (!JS_SetElement(context, array, 1, &r)) return JS_FALSE;          \
-      JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(array));                    \
+      argv.rval().set(OBJECT_TO_JSVAL(array));                    \
     }                                                                      \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
@@ -112,7 +113,7 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
       if (!JS_SetElement(context, array, 0, &r)) return JS_FALSE;          \
       if (!JS_NewNumberValue(context, arg2, &r)) return JS_FALSE;          \
       if (!JS_SetElement(context, array, 1, &r)) return JS_FALSE;          \
-      JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(array));                    \
+      argv.rval().set(OBJECT_TO_JSVAL(array));                    \
     }                                                                      \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
@@ -135,7 +136,7 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
       if (!JS_SetElement(context, array, 2, &r)) return JS_FALSE;          \
       if (!JS_NewNumberValue(context, arg4, &r)) return JS_FALSE;          \
       if (!JS_SetElement(context, array, 3, &r)) return JS_FALSE;          \
-      JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(array));                    \
+      argv.rval().set(OBJECT_TO_JSVAL(array));                    \
     }                                                                      \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
@@ -148,30 +149,30 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
     ret = cfunc(cr);                                                       \
     if (!JS_NewNumberValue(context, ret, &retval))                         \
         return JS_FALSE;                                                   \
-    JS_SET_RVAL(context, vp, retval);                                      \
+    argv.rval().set(retval);                                      \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
 #define _GJS_CAIRO_CONTEXT_DEFINE_FUNC1(method, cfunc, fmt, t1, n1)        \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
     t1 arg1;                                                               \
-    if (!gjs_parse_args(context, #method, fmt, argc, JS_ARGV(context, vp), \
+    if (!gjs_parse_call_args(context, #method, fmt, argv,                  \
                         #n1, &arg1))                                       \
         return JS_FALSE;                                                   \
     cr = gjs_cairo_context_get_context(context, obj);                      \
     cfunc(cr, arg1);                                                       \
-    JS_SET_RVAL(context, vp, JSVAL_VOID);                                  \
+    argv.rval().set(JSVAL_VOID);                                  \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
 #define _GJS_CAIRO_CONTEXT_DEFINE_FUNC2(method, cfunc, fmt, t1, n1, t2, n2) \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
     t1 arg1;                                                               \
     t2 arg2;                                                               \
-    if (!gjs_parse_args(context, #method, fmt, argc, JS_ARGV(context, vp),                 \
+    if (!gjs_parse_call_args(context, #method, fmt, argv,                  \
                         #n1, &arg1, #n2, &arg2))                           \
         return JS_FALSE;                                                   \
     cr = gjs_cairo_context_get_context(context, obj);                      \
     cfunc(cr, arg1, arg2);                                                 \
-    JS_SET_RVAL(context, vp, JSVAL_VOID);                                  \
+    argv.rval().set(JSVAL_VOID);                                  \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
 #define _GJS_CAIRO_CONTEXT_DEFINE_FUNC2B(method, cfunc, fmt, t1, n1, t2, n2) \
@@ -179,12 +180,12 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
     t1 arg1;                                                               \
     t2 arg2;                                                               \
     cairo_bool_t ret;                                                      \
-    if (!gjs_parse_args(context, #method, fmt, argc, JS_ARGV(context, vp),                 \
+    if (!gjs_parse_call_args(context, #method, fmt, argv,                 \
                         #n1, &arg1, #n2, &arg2))                           \
         return JS_FALSE;                                                   \
     cr = gjs_cairo_context_get_context(context, obj);                      \
     ret = cfunc(cr, arg1, arg2);                                           \
-    JS_SET_RVAL(context, vp, BOOLEAN_TO_JSVAL(ret));                       \
+    argv.rval().set(BOOLEAN_TO_JSVAL(ret));                       \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
 #define _GJS_CAIRO_CONTEXT_DEFINE_FUNC3(method, cfunc, fmt, t1, n1, t2, n2, t3, n3) \
@@ -192,12 +193,12 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
     t1 arg1;                                                               \
     t2 arg2;                                                               \
     t3 arg3;                                                               \
-    if (!gjs_parse_args(context, #method, fmt, argc, JS_ARGV(context, vp),                 \
+    if (!gjs_parse_call_args(context, #method, fmt, argv,                  \
                         #n1, &arg1, #n2, &arg2, #n3, &arg3))               \
         return JS_FALSE;                                                   \
     cr = gjs_cairo_context_get_context(context, obj);                      \
     cfunc(cr, arg1, arg2, arg3);                                           \
-    JS_SET_RVAL(context, vp, JSVAL_VOID);                                  \
+    argv.rval().set(JSVAL_VOID);                                  \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
 #define _GJS_CAIRO_CONTEXT_DEFINE_FUNC4(method, cfunc, fmt, t1, n1, t2, n2, t3, n3, t4, n4) \
@@ -206,7 +207,7 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
     t2 arg2;                                                               \
     t3 arg3;                                                               \
     t4 arg4;                                                               \
-    if (!gjs_parse_args(context, #method, fmt, argc, JS_ARGV(context, vp),                 \
+    if (!gjs_parse_call_args(context, #method, fmt, argv,                  \
                         #n1, &arg1, #n2, &arg2, #n3, &arg3, #n4, &arg4))   \
         return JS_FALSE;                                                   \
     cr = gjs_cairo_context_get_context(context, obj);                      \
@@ -220,13 +221,13 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
     t3 arg3;                                                               \
     t4 arg4;                                                               \
     t5 arg5;                                                               \
-    if (!gjs_parse_args(context, #method, fmt, argc, JS_ARGV(context, vp),                 \
+    if (!gjs_parse_call_args(context, #method, fmt, argv,                  \
                         #n1, &arg1, #n2, &arg2, #n3, &arg3,                \
                         #n4, &arg4, #n5, &arg5))                           \
         return JS_FALSE;                                                   \
     cr = gjs_cairo_context_get_context(context, obj);                      \
     cfunc(cr, arg1, arg2, arg3, arg4, arg5);                               \
-    JS_SET_RVAL(context, vp, JSVAL_VOID);                                  \
+    argv.rval().set(JSVAL_VOID);                                  \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
 #define _GJS_CAIRO_CONTEXT_DEFINE_FUNC6(method, cfunc, fmt, t1, n1, t2, n2, t3, n3, t4, n4, t5, n5, t6, n6) \
@@ -237,13 +238,13 @@ _GJS_CAIRO_CONTEXT_DEFINE_FUNC_BEGIN(method)                               \
     t4 arg4;                                                               \
     t5 arg5;                                                               \
     t6 arg6;                                                               \
-    if (!gjs_parse_args(context, #method, fmt, argc, JS_ARGV(context, vp),                 \
+    if (!gjs_parse_call_args(context, #method, fmt, argv,                  \
                         #n1, &arg1, #n2, &arg2, #n3, &arg3,                \
                         #n4, &arg4, #n5, &arg5, #n6, &arg6))               \
         return JS_FALSE;                                                   \
     cr = gjs_cairo_context_get_context(context, obj);                      \
     cfunc(cr, arg1, arg2, arg3, arg4, arg5, arg6);                         \
-    JS_SET_RVAL(context, vp, JSVAL_VOID);                                  \
+    argv.rval().set(JSVAL_VOID);                                  \
 _GJS_CAIRO_CONTEXT_DEFINE_FUNC_END
 
 typedef struct {
@@ -282,7 +283,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(cairo_context)
 
     GJS_NATIVE_CONSTRUCTOR_PRELUDE(cairo_context);
 
-    if (!gjs_parse_args(context, "Context", "o", argc, argv,
+    if (!gjs_parse_call_args(context, "Context", "o", argv,
                         "surface", &surface_wrapper))
         return JS_FALSE;
 
@@ -410,7 +411,9 @@ dispose_func(JSContext *context,
              unsigned   argc,
              jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     GjsCairoContext *priv;
 
     priv = priv_from_js(context, obj);
@@ -418,7 +421,7 @@ dispose_func(JSContext *context,
         cairo_destroy(priv->cr);
         priv->cr = NULL;
     }
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    rec.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -427,13 +430,14 @@ appendPath_func(JSContext *context,
                 unsigned   argc,
                 jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     JSObject *path_wrapper;
     cairo_path_t *path;
     cairo_t *cr;
 
-    if (!gjs_parse_args(context, "path", "o", argc, argv,
+    if (!gjs_parse_call_args(context, "path", "o", argv,
                         "path", &path_wrapper))
         return JS_FALSE;
 
@@ -445,7 +449,7 @@ appendPath_func(JSContext *context,
 
     cr = gjs_cairo_context_get_context(context, obj);
     cairo_append_path(cr, path);
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -454,17 +458,18 @@ copyPath_func(JSContext *context,
               unsigned   argc,
               jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     cairo_path_t *path;
     cairo_t *cr;
 
-    if (!gjs_parse_args(context, "", "", argc, argv))
+    if (!gjs_parse_call_args(context, "", "", argv))
         return JS_FALSE;
 
     cr = gjs_cairo_context_get_context(context, obj);
     path = cairo_copy_path(cr);
-    JS_SET_RVAL(context, vp,
+    argv.rval().set(
                 OBJECT_TO_JSVAL(gjs_cairo_path_from_path(context, path)));
     return JS_TRUE;
 }
@@ -474,17 +479,18 @@ copyPathFlat_func(JSContext *context,
                   unsigned   argc,
                   jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     cairo_path_t *path;
     cairo_t *cr;
 
-    if (!gjs_parse_args(context, "", "", argc, argv))
+    if (!gjs_parse_call_args(context, "", "", argv))
         return JS_FALSE;
 
     cr = gjs_cairo_context_get_context(context, obj);
     path = cairo_copy_path_flat(cr);
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(gjs_cairo_path_from_path(context, path)));
+    argv.rval().set(OBJECT_TO_JSVAL(gjs_cairo_path_from_path(context, path)));
     return JS_TRUE;
 }
 
@@ -493,13 +499,14 @@ mask_func(JSContext *context,
           unsigned   argc,
           jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     JSObject *pattern_wrapper;
     cairo_pattern_t *pattern;
     cairo_t *cr;
 
-    if (!gjs_parse_args(context, "mask", "o", argc, argv,
+    if (!gjs_parse_call_args(context, "mask", "o", argv,
                         "pattern", &pattern_wrapper))
         return JS_FALSE;
 
@@ -515,7 +522,7 @@ mask_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_status(cr), "context"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -524,14 +531,15 @@ maskSurface_func(JSContext *context,
                  unsigned   argc,
                  jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     JSObject *surface_wrapper;
     double x, y;
     cairo_surface_t *surface;
     cairo_t *cr;
 
-    if (!gjs_parse_args(context, "maskSurface", "off", argc, argv,
+    if (!gjs_parse_call_args(context, "maskSurface", "off", argv,
                         "surface", &surface_wrapper,
                         "x", &x,
                         "y", &y))
@@ -550,7 +558,7 @@ maskSurface_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_status(cr), "context"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -559,8 +567,9 @@ setDash_func(JSContext *context,
              unsigned   argc,
              jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     guint i;
     cairo_t *cr;
     JSObject *dashes;
@@ -569,7 +578,7 @@ setDash_func(JSContext *context,
     guint len;
     GArray *dashes_c = NULL;
 
-    if (!gjs_parse_args(context, "setDash", "of", argc, argv,
+    if (!gjs_parse_call_args(context, "setDash", "of", argv,
                         "dashes", &dashes, "offset", &offset))
         return JS_FALSE;
 
@@ -609,7 +618,7 @@ setDash_func(JSContext *context,
 
     cr = gjs_cairo_context_get_context(context, obj);
     cairo_set_dash(cr, (double*)dashes_c->data, dashes_c->len, offset);
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     retval = JS_TRUE;
  out:
     if (dashes_c != NULL)
@@ -623,13 +632,14 @@ setSource_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     JSObject *pattern_wrapper;
     cairo_pattern_t *pattern;
     cairo_t *cr;
 
-    if (!gjs_parse_args(context, "setSource", "o", argc, argv,
+    if (!gjs_parse_call_args(context, "setSource", "o", argv,
                         "pattern", &pattern_wrapper))
         return JS_FALSE;
 
@@ -646,7 +656,7 @@ setSource_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_status(cr), "context"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
 
     return JS_TRUE;
 }
@@ -656,14 +666,15 @@ setSourceSurface_func(JSContext *context,
                       unsigned   argc,
                       jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     JSObject *surface_wrapper;
     double x, y;
     cairo_surface_t *surface;
     cairo_t *cr;
 
-    if (!gjs_parse_args(context, "setSourceSurface", "off", argc, argv,
+    if (!gjs_parse_call_args(context, "setSourceSurface", "off", argv,
                         "surface", &surface_wrapper,
                         "x", &x,
                         "y", &y))
@@ -682,7 +693,7 @@ setSourceSurface_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_status(cr), "context"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
 
     return JS_TRUE;
 }
@@ -692,12 +703,13 @@ showText_func(JSContext *context,
               unsigned   argc,
               jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     char *utf8;
     cairo_t *cr;
 
-    if (!gjs_parse_args(context, "showText", "s", argc, argv,
+    if (!gjs_parse_call_args(context, "showText", "s", argv,
                         "utf8", &utf8))
         return JS_FALSE;
 
@@ -709,7 +721,7 @@ showText_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_status(cr), "context"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
 
     return JS_TRUE;
 }
@@ -719,14 +731,15 @@ selectFontFace_func(JSContext *context,
                     unsigned   argc,
                     jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     char *family;
     cairo_font_slant_t slant;
     cairo_font_weight_t weight;
     cairo_t *cr;
 
-    if (!gjs_parse_args(context, "selectFontFace", "sii", argc, argv,
+    if (!gjs_parse_call_args(context, "selectFontFace", "sii", argv,
                         "family", &family,
                         "slang", &slant,
                         "weight", &weight))
@@ -739,7 +752,7 @@ selectFontFace_func(JSContext *context,
 
     if (!gjs_cairo_check_status(context, cairo_status(cr), "context"))
         return JS_FALSE;
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
 
     return JS_TRUE;
 }
@@ -749,7 +762,9 @@ popGroup_func(JSContext *context,
               unsigned   argc,
               jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_t *cr;
     cairo_pattern_t *pattern;
     JSObject *pattern_wrapper;
@@ -771,7 +786,7 @@ popGroup_func(JSContext *context,
         return JS_FALSE;
     }
 
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(pattern_wrapper));
+    rec.rval().set(OBJECT_TO_JSVAL(pattern_wrapper));
 
     return JS_TRUE;
 }
@@ -780,7 +795,9 @@ getSource_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_t *cr;
     cairo_pattern_t *pattern;
     JSObject *pattern_wrapper;
@@ -802,7 +819,7 @@ getSource_func(JSContext *context,
         return JS_FALSE;
     }
 
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(pattern_wrapper));
+    rec.rval().set(OBJECT_TO_JSVAL(pattern_wrapper));
 
     return JS_TRUE;
 }
@@ -812,7 +829,9 @@ getTarget_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_t *cr;
     cairo_surface_t *surface;
     JSObject *surface_wrapper;
@@ -834,7 +853,7 @@ getTarget_func(JSContext *context,
         return JS_FALSE;
     }
 
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(surface_wrapper));
+    rec.rval().set(OBJECT_TO_JSVAL(surface_wrapper));
 
     return JS_TRUE;
 }
@@ -844,7 +863,9 @@ getGroupTarget_func(JSContext *context,
                     unsigned   argc,
                     jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_t *cr;
     cairo_surface_t *surface;
     JSObject *surface_wrapper;
@@ -866,7 +887,7 @@ getGroupTarget_func(JSContext *context,
         return JS_FALSE;
     }
 
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(surface_wrapper));
+    rec.rval().set(OBJECT_TO_JSVAL(surface_wrapper));
 
     return JS_TRUE;
 }
diff --git a/modules/cairo-gradient.cpp b/modules/cairo-gradient.cpp
index 51e4b2b..1b5c40f 100644
--- a/modules/cairo-gradient.cpp
+++ b/modules/cairo-gradient.cpp
@@ -48,12 +48,13 @@ addColorStopRGB_func(JSContext *context,
                      unsigned   argc,
                      jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     double offset, red, green, blue;
     cairo_pattern_t *pattern;
 
-    if (!gjs_parse_args(context, "addColorStopRGB", "ffff", argc, argv,
+    if (!gjs_parse_call_args(context, "addColorStopRGB", "ffff", argv,
                         "offset", &offset,
                         "red", &red,
                         "green", &green,
@@ -67,7 +68,7 @@ addColorStopRGB_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -76,12 +77,13 @@ addColorStopRGBA_func(JSContext *context,
                       unsigned   argc,
                       jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     double offset, red, green, blue, alpha;
     cairo_pattern_t *pattern;
 
-    if (!gjs_parse_args(context, "addColorStopRGBA", "fffff", argc, argv,
+    if (!gjs_parse_call_args(context, "addColorStopRGBA", "fffff", argv,
                         "offset", &offset,
                         "red", &red,
                         "green", &green,
@@ -95,7 +97,7 @@ addColorStopRGBA_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
diff --git a/modules/cairo-image-surface.cpp b/modules/cairo-image-surface.cpp
index 81811f1..8f4bc9d 100644
--- a/modules/cairo-image-surface.cpp
+++ b/modules/cairo-image-surface.cpp
@@ -38,7 +38,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(cairo_image_surface)
     GJS_NATIVE_CONSTRUCTOR_PRELUDE(cairo_image_surface);
 
     // create_for_data optional parameter
-    if (!gjs_parse_args(context, "ImageSurface", "iii", argc, argv,
+    if (!gjs_parse_call_args(context, "ImageSurface", "iii", argv,
                         "format", &format,
                         "width", &width,
                         "height", &height))
@@ -73,12 +73,12 @@ createFromPNG_func(JSContext *context,
                    unsigned   argc,
                    jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     char *filename;
     cairo_surface_t *surface;
     JSObject *surface_wrapper;
 
-    if (!gjs_parse_args(context, "createFromPNG", "s", argc, argv,
+    if (!gjs_parse_call_args(context, "createFromPNG", "s", argv,
                         "filename", &filename))
         return JS_FALSE;
 
@@ -95,7 +95,7 @@ createFromPNG_func(JSContext *context,
     gjs_cairo_surface_construct(context, surface_wrapper, surface);
     cairo_surface_destroy(surface);
 
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(surface_wrapper));
+    argv.rval().set(OBJECT_TO_JSVAL(surface_wrapper));
     return JS_TRUE;
 }
 
@@ -104,7 +104,9 @@ getFormat_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_surface_t *surface;
     cairo_format_t format;
 
@@ -119,7 +121,7 @@ getFormat_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, INT_TO_JSVAL(format));
+    rec.rval().setInt32(format);
     return JS_TRUE;
 }
 
@@ -128,7 +130,9 @@ getWidth_func(JSContext *context,
               unsigned   argc,
               jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_surface_t *surface;
     int width;
 
@@ -143,7 +147,7 @@ getWidth_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, INT_TO_JSVAL(width));
+    rec.rval().setInt32(width);
     return JS_TRUE;
 }
 
@@ -152,7 +156,9 @@ getHeight_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_surface_t *surface;
     int height;
 
@@ -167,7 +173,7 @@ getHeight_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, INT_TO_JSVAL(height));
+    rec.rval().setInt32(height);
     return JS_TRUE;
 }
 
@@ -176,7 +182,9 @@ getStride_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_surface_t *surface;
     int stride;
 
@@ -191,7 +199,7 @@ getStride_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, INT_TO_JSVAL(stride));
+    rec.rval().setInt32(stride);
     return JS_TRUE;
 }
 
diff --git a/modules/cairo-linear-gradient.cpp b/modules/cairo-linear-gradient.cpp
index 7d20aed..89c70a6 100644
--- a/modules/cairo-linear-gradient.cpp
+++ b/modules/cairo-linear-gradient.cpp
@@ -37,7 +37,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(cairo_linear_gradient)
 
     GJS_NATIVE_CONSTRUCTOR_PRELUDE(cairo_linear_gradient);
 
-    if (!gjs_parse_args(context, "LinearGradient", "ffff", argc, argv,
+    if (!gjs_parse_call_args(context, "LinearGradient", "ffff", argv,
                         "x0", &x0,
                         "y0", &y0,
                         "x1", &x1,
diff --git a/modules/cairo-pattern.cpp b/modules/cairo-pattern.cpp
index b394346..2102e4e 100644
--- a/modules/cairo-pattern.cpp
+++ b/modules/cairo-pattern.cpp
@@ -62,7 +62,9 @@ getType_func(JSContext *context,
              unsigned   argc,
              jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_pattern_t *pattern;
     cairo_pattern_type_t type;
 
@@ -77,7 +79,7 @@ getType_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, INT_TO_JSVAL(type));
+    rec.rval().setInt32(type);
     return JS_TRUE;
 }
 
diff --git a/modules/cairo-pdf-surface.cpp b/modules/cairo-pdf-surface.cpp
index 8f1f082..22644c4 100644
--- a/modules/cairo-pdf-surface.cpp
+++ b/modules/cairo-pdf-surface.cpp
@@ -41,7 +41,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(cairo_pdf_surface)
 
     GJS_NATIVE_CONSTRUCTOR_PRELUDE(cairo_pdf_surface);
 
-    if (!gjs_parse_args(context, "PDFSurface", "sff", argc, argv,
+    if (!gjs_parse_call_args(context, "PDFSurface", "sff", argv,
                         "filename", &filename,
                         "width", &width,
                         "height", &height))
diff --git a/modules/cairo-ps-surface.cpp b/modules/cairo-ps-surface.cpp
index 8a5a510..3a963ad 100644
--- a/modules/cairo-ps-surface.cpp
+++ b/modules/cairo-ps-surface.cpp
@@ -41,7 +41,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(cairo_ps_surface)
 
     GJS_NATIVE_CONSTRUCTOR_PRELUDE(cairo_ps_surface);
 
-    if (!gjs_parse_args(context, "PSSurface", "sff", argc, argv,
+    if (!gjs_parse_call_args(context, "PSSurface", "sff", argv,
                         "filename", &filename,
                         "width", &width,
                         "height", &height))
diff --git a/modules/cairo-radial-gradient.cpp b/modules/cairo-radial-gradient.cpp
index 506b1c8..57ab3f5 100644
--- a/modules/cairo-radial-gradient.cpp
+++ b/modules/cairo-radial-gradient.cpp
@@ -37,7 +37,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(cairo_radial_gradient)
 
     GJS_NATIVE_CONSTRUCTOR_PRELUDE(cairo_radial_gradient);
 
-    if (!gjs_parse_args(context, "RadialGradient", "ffffff", argc, argv,
+    if (!gjs_parse_call_args(context, "RadialGradient", "ffffff", argv,
                         "cx0", &cx0,
                         "cy0", &cy0,
                         "radius0", &radius0,
diff --git a/modules/cairo-region.cpp b/modules/cairo-region.cpp
index 06af3a1..dfe99d7 100644
--- a/modules/cairo-region.cpp
+++ b/modules/cairo-region.cpp
@@ -54,7 +54,8 @@ fill_rectangle(JSContext *context, JSObject *obj,
                cairo_rectangle_int_t *rect);
 
 #define PRELUDE                                                 \
-    JSObject *obj = JS_THIS_OBJECT(context, vp);                \
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);          \
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());              \
     cairo_region_t *this_region = get_region(context, obj);
 
 #define RETURN_STATUS                                           \
@@ -69,8 +70,7 @@ fill_rectangle(JSContext *context, JSObject *obj,
         PRELUDE;                                                \
         JSObject *other_obj;                                    \
         cairo_region_t *other_region;                           \
-        if (!gjs_parse_args(context, #method, "o", argc,        \
-                            JS_ARGV(context, vp),               \
+        if (!gjs_parse_call_args(context, #method, "o", argv,   \
                             "other_region", &other_obj))        \
             return JS_FALSE;                                    \
                                                                 \
@@ -78,7 +78,7 @@ fill_rectangle(JSContext *context, JSObject *obj,
         other_region = get_region(context, other_obj);          \
                                                                 \
         cairo_region_##method(this_region, other_region);       \
-            JS_SET_RVAL(context, vp, JSVAL_VOID);               \
+            argv.rval().set(JSVAL_VOID);               \
             RETURN_STATUS;                                      \
     }
 
@@ -91,8 +91,7 @@ fill_rectangle(JSContext *context, JSObject *obj,
         PRELUDE;                                                \
         JSObject *rect_obj;                                     \
         cairo_rectangle_int_t rect;                             \
-        if (!gjs_parse_args(context, #method, "o", argc,        \
-                            JS_ARGV(context, vp),               \
+        if (!gjs_parse_call_args(context, #method, "o", argv,   \
                             "rect", &rect_obj))                 \
             return JS_FALSE;                                    \
                                                                 \
@@ -100,7 +99,7 @@ fill_rectangle(JSContext *context, JSObject *obj,
             return JS_FALSE;                                    \
                                                                 \
         cairo_region_##method##_rectangle(this_region, &rect);  \
-            JS_SET_RVAL(context, vp, JSVAL_VOID);               \
+            argv.rval().set(JSVAL_VOID);               \
             RETURN_STATUS;                                      \
     }
 
@@ -174,12 +173,12 @@ num_rectangles_func(JSContext *context,
     int n_rects;
     jsval retval;
 
-    if (!gjs_parse_args(context, "num_rectangles", "", argc, JS_ARGV(context, vp)))
+    if (!gjs_parse_call_args(context, "num_rectangles", "", argv))
         return JS_FALSE;
 
     n_rects = cairo_region_num_rectangles(this_region);
     retval = INT_TO_JSVAL(n_rects);
-    JS_SET_RVAL (context, vp, retval);
+    argv.rval().set(retval);
     RETURN_STATUS;
 }
 
@@ -194,14 +193,14 @@ get_rectangle_func(JSContext *context,
     cairo_rectangle_int_t rect;
     jsval retval;
 
-    if (!gjs_parse_args(context, "get_rectangle", "i", argc, JS_ARGV(context, vp), "rect", &i))
+    if (!gjs_parse_call_args(context, "get_rectangle", "i", argv, "rect", &i))
         return JS_FALSE;
 
     cairo_region_get_rectangle(this_region, i, &rect);
     rect_obj = make_rectangle(context, &rect);
 
     retval = OBJECT_TO_JSVAL(rect_obj);
-    JS_SET_RVAL (context, vp, retval);
+    argv.rval().set(retval);
     RETURN_STATUS;
 }
 
@@ -249,7 +248,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(cairo_region)
 
     GJS_NATIVE_CONSTRUCTOR_PRELUDE(cairo_region);
 
-    if (!gjs_parse_args(context, "Region", "", argc, argv))
+    if (!gjs_parse_call_args(context, "Region", "", argv))
         return JS_FALSE;
 
     region = cairo_region_create();
diff --git a/modules/cairo-solid-pattern.cpp b/modules/cairo-solid-pattern.cpp
index 583da0e..12ad155 100644
--- a/modules/cairo-solid-pattern.cpp
+++ b/modules/cairo-solid-pattern.cpp
@@ -45,12 +45,12 @@ createRGB_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     double red, green, blue;
     cairo_pattern_t *pattern;
     JSObject *pattern_wrapper;
 
-    if (!gjs_parse_args(context, "createRGB", "fff", argc, argv,
+    if (!gjs_parse_call_args(context, "createRGB", "fff", argv,
                         "red", &red,
                         "green", &green,
                         "blue", &blue))
@@ -63,7 +63,7 @@ createRGB_func(JSContext *context,
     pattern_wrapper = gjs_cairo_solid_pattern_from_pattern(context, pattern);
     cairo_pattern_destroy(pattern);
 
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(pattern_wrapper));
+    argv.rval().set(OBJECT_TO_JSVAL(pattern_wrapper));
 
     return JS_TRUE;
 }
@@ -73,12 +73,12 @@ createRGBA_func(JSContext *context,
                 unsigned   argc,
                 jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     double red, green, blue, alpha;
     cairo_pattern_t *pattern;
     JSObject *pattern_wrapper;
 
-    if (!gjs_parse_args(context, "createRGBA", "ffff", argc, argv,
+    if (!gjs_parse_call_args(context, "createRGBA", "ffff", argv,
                         "red", &red,
                         "green", &green,
                         "blue", &blue,
@@ -92,7 +92,7 @@ createRGBA_func(JSContext *context,
     pattern_wrapper = gjs_cairo_solid_pattern_from_pattern(context, pattern);
     cairo_pattern_destroy(pattern);
 
-    JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(pattern_wrapper));
+    argv.rval().set(OBJECT_TO_JSVAL(pattern_wrapper));
 
     return JS_TRUE;
 }
diff --git a/modules/cairo-surface-pattern.cpp b/modules/cairo-surface-pattern.cpp
index 2efbf77..7ffebb2 100644
--- a/modules/cairo-surface-pattern.cpp
+++ b/modules/cairo-surface-pattern.cpp
@@ -38,7 +38,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(cairo_surface_pattern)
 
     GJS_NATIVE_CONSTRUCTOR_PRELUDE(cairo_surface_pattern);
 
-    if (!gjs_parse_args(context, "SurfacePattern", "o", argc, argv,
+    if (!gjs_parse_call_args(context, "SurfacePattern", "o", argv,
                         "surface", &surface_wrapper))
         return JS_FALSE;
 
@@ -79,12 +79,13 @@ setExtend_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     cairo_extend_t extend;
     cairo_pattern_t *pattern;
 
-    if (!gjs_parse_args(context, "setExtend", "i", argc, argv,
+    if (!gjs_parse_call_args(context, "setExtend", "i", argv,
                         "extend", &extend))
         return JS_FALSE;
 
@@ -94,7 +95,7 @@ setExtend_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -103,7 +104,9 @@ getExtend_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_extend_t extend;
     cairo_pattern_t *pattern;
 
@@ -118,7 +121,7 @@ getExtend_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, INT_TO_JSVAL(extend));
+    rec.rval().setInt32(extend);
 
     return JS_TRUE;
 }
@@ -128,12 +131,13 @@ setFilter_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     cairo_filter_t filter;
     cairo_pattern_t *pattern;
 
-    if (!gjs_parse_args(context, "setFilter", "i", argc, argv,
+    if (!gjs_parse_call_args(context, "setFilter", "i", argv,
                         "filter", &filter))
         return JS_FALSE;
 
@@ -143,7 +147,7 @@ setFilter_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -152,7 +156,9 @@ getFilter_func(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_filter_t filter;
     cairo_pattern_t *pattern;
 
@@ -167,7 +173,7 @@ getFilter_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, INT_TO_JSVAL(filter));
+    rec.rval().setInt32(filter);
 
     return JS_TRUE;
 }
diff --git a/modules/cairo-surface.cpp b/modules/cairo-surface.cpp
index f883322..47b081d 100644
--- a/modules/cairo-surface.cpp
+++ b/modules/cairo-surface.cpp
@@ -62,12 +62,13 @@ writeToPNG_func(JSContext *context,
                 unsigned   argc,
                 jsval     *vp)
 {
-    jsval *argv = JS_ARGV(context, vp);
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    JSObject *obj = JSVAL_TO_OBJECT(argv.thisv());
+
     char *filename;
     cairo_surface_t *surface;
 
-    if (!gjs_parse_args(context, "writeToPNG", "s", argc, argv,
+    if (!gjs_parse_call_args(context, "writeToPNG", "s", argv,
                         "filename", &filename))
         return JS_FALSE;
 
@@ -81,7 +82,7 @@ writeToPNG_func(JSContext *context,
     if (!gjs_cairo_check_status(context, cairo_surface_status(surface),
                                 "surface"))
         return JS_FALSE;
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -90,7 +91,9 @@ getType_func(JSContext *context,
              unsigned   argc,
              jsval     *vp)
 {
-    JSObject *obj = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *obj = JSVAL_TO_OBJECT(rec.thisv());
+
     cairo_surface_t *surface;
     cairo_surface_type_t type;
 
@@ -105,7 +108,7 @@ getType_func(JSContext *context,
                                 "surface"))
         return JS_FALSE;
 
-    JS_SET_RVAL(context, vp, INT_TO_JSVAL(type));
+    rec.rval().setInt32(type);
     return JS_TRUE;
 }
 
diff --git a/modules/cairo-svg-surface.cpp b/modules/cairo-svg-surface.cpp
index 0f53f23..45b1dc2 100644
--- a/modules/cairo-svg-surface.cpp
+++ b/modules/cairo-svg-surface.cpp
@@ -41,7 +41,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(cairo_svg_surface)
 
     GJS_NATIVE_CONSTRUCTOR_PRELUDE(cairo_svg_surface);
 
-    if (!gjs_parse_args(context, "SVGSurface", "sff", argc, argv,
+    if (!gjs_parse_call_args(context, "SVGSurface", "sff", argv,
                         "filename", &filename,
                         "width", &width,
                         "height", &height))
diff --git a/modules/console.cpp b/modules/console.cpp
index b3d71ff..9a00070 100644
--- a/modules/console.cpp
+++ b/modules/console.cpp
@@ -159,7 +159,8 @@ gjs_console_interact(JSContext *context,
                      unsigned   argc,
                      jsval     *vp)
 {
-    JSObject *object = JS_THIS_OBJECT(context, vp);
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
+    JSObject *object = JSVAL_TO_OBJECT(rec.thisv());
     gboolean eof = FALSE;
     jsval result;
     JSString *str;
diff --git a/modules/system.cpp b/modules/system.cpp
index 92c5640..81bd9df 100644
--- a/modules/system.cpp
+++ b/modules/system.cpp
@@ -37,13 +37,13 @@ gjs_address_of(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    jsval *argv = JS_ARGV(cx, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     JSObject *target_obj;
     JSBool ret;
     char *pointer_string;
     jsval retval;
 
-    if (!gjs_parse_args(context, "addressOf", "o", argc, argv, "object", &target_obj))
+    if (!gjs_parse_call_args(context, "addressOf", "o", argv, "object", &target_obj))
         return JS_FALSE;
 
     pointer_string = g_strdup_printf("%p", target_obj);
@@ -52,7 +52,7 @@ gjs_address_of(JSContext *context,
     g_free(pointer_string);
 
     if (ret)
-        JS_SET_RVAL(context, vp, retval);
+        argv.rval().set(retval);
 
     return ret;
 }
@@ -62,12 +62,12 @@ gjs_refcount(JSContext *context,
              unsigned   argc,
              jsval     *vp)
 {
-    jsval *argv = JS_ARGV(cx, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     jsval retval;
     JSObject *target_obj;
     GObject *obj;
 
-    if (!gjs_parse_args(context, "refcount", "o", argc, argv, "object", &target_obj))
+    if (!gjs_parse_call_args(context, "refcount", "o", argv, "object", &target_obj))
         return JS_FALSE;
 
     if (!gjs_typecheck_object(context, target_obj,
@@ -79,7 +79,7 @@ gjs_refcount(JSContext *context,
         return JS_FALSE;
 
     retval = INT_TO_JSVAL(obj->ref_count);
-    JS_SET_RVAL(context, vp, retval);
+    argv.rval().set(retval);
     return JS_TRUE;
 }
 
@@ -88,11 +88,11 @@ gjs_breakpoint(JSContext *context,
                unsigned   argc,
                jsval     *vp)
 {
-    jsval *argv = JS_ARGV(cx, vp);
-    if (!gjs_parse_args(context, "breakpoint", "", argc, argv))
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    if (!gjs_parse_call_args(context, "breakpoint", "", argv))
         return JS_FALSE;
     G_BREAKPOINT();
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -101,11 +101,11 @@ gjs_gc(JSContext *context,
        unsigned   argc,
        jsval     *vp)
 {
-    jsval *argv = JS_ARGV(cx, vp);
-    if (!gjs_parse_args(context, "gc", "", argc, argv))
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
+    if (!gjs_parse_call_args(context, "gc", "", argv))
         return JS_FALSE;
     JS_GC(JS_GetRuntime(context));
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    argv.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 
@@ -114,9 +114,9 @@ gjs_exit(JSContext *context,
          unsigned   argc,
          jsval     *vp)
 {
-    jsval *argv = JS_ARGV(cx, vp);
+    JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     gint32 ecode;
-    if (!gjs_parse_args(context, "exit", "i", argc, argv, "ecode", &ecode))
+    if (!gjs_parse_call_args(context, "exit", "i", argv, "ecode", &ecode))
         return JS_FALSE;
     exit(ecode);
     return JS_TRUE;
@@ -127,6 +127,7 @@ gjs_clear_date_caches(JSContext *context,
              unsigned   argc,
              jsval     *vp)
 {
+    JS::CallReceiver rec = JS::CallReceiverFromVp(vp);
     JS_BeginRequest(context);
 
     // Workaround for a bug in SpiderMonkey where tzset is not called before
@@ -136,7 +137,7 @@ gjs_clear_date_caches(JSContext *context,
     JS_ClearDateCaches(context);
     JS_EndRequest(context);
 
-    JS_SET_RVAL(context, vp, JSVAL_VOID);
+    rec.rval().set(JSVAL_VOID);
     return JS_TRUE;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]