[gjs: 4/6] js: Remove context from GjsAutoJSChar



commit 9355181392d0290cdaa8944a9dbbc4b6e1ca3b77
Author: Philip Chimento <philip chimento gmail com>
Date:   Sun Jan 21 16:08:58 2018 -0800

    js: Remove context from GjsAutoJSChar
    
    SpiderMonkey now clarifies in the comments in their header file, that
    it's OK to pass a null JSContext to JS_free(cx, ptr). This allows us to
    stop tracking the JSContext in GjsAutoJSChar, which was a big pain.

 gi/arg.cpp                  | 13 ++++++------
 gi/boxed.cpp                |  4 ++--
 gi/fundamental.cpp          |  2 +-
 gi/gerror.cpp               |  6 +++---
 gi/interface.cpp            |  2 +-
 gi/ns.cpp                   |  2 +-
 gi/object.cpp               | 22 ++++++++++-----------
 gi/param.cpp                |  2 +-
 gi/repo.cpp                 |  6 +++---
 gi/union.cpp                |  2 +-
 gi/value.cpp                |  2 +-
 gjs/byteArray.cpp           | 10 +++++-----
 gjs/engine.cpp              |  8 ++++----
 gjs/global.cpp              |  4 ++--
 gjs/importer.cpp            | 12 ++++++------
 gjs/jsapi-util-args.h       |  2 +-
 gjs/jsapi-util-error.cpp    |  4 ++--
 gjs/jsapi-util-string.cpp   |  8 ++++----
 gjs/jsapi-util.cpp          | 20 +++++++++----------
 gjs/jsapi-util.h            | 48 ++++++++-------------------------------------
 gjs/module.cpp              |  2 +-
 modules/cairo-context.cpp   |  4 ++--
 modules/console.cpp         |  2 +-
 test/gjs-test-call-args.cpp | 26 ++++++++++--------------
 test/gjs-tests.cpp          |  6 +++---
 25 files changed, 90 insertions(+), 129 deletions(-)
---
diff --git a/gi/arg.cpp b/gi/arg.cpp
index adcfb53..cec0e9a 100644
--- a/gi/arg.cpp
+++ b/gi/arg.cpp
@@ -434,7 +434,7 @@ value_to_ghashtable_key(JSContext      *cx,
         else
             str = value.toString();
 
-        GjsAutoJSChar cstr(cx, JS_EncodeStringToUTF8(cx, str));
+        GjsAutoJSChar cstr = JS_EncodeStringToUTF8(cx, str);
         if (!cstr)
             return false;
         *pointer_out = cstr.copy();
@@ -620,8 +620,6 @@ gjs_array_to_strv(JSContext   *context,
     result = g_new0(char *, length+1);
 
     for (i = 0; i < length; ++i) {
-        GjsAutoJSChar tmp_result(context);
-
         elem = JS::UndefinedValue();
         if (!JS_GetElement(context, array, i, &elem)) {
             g_free(result);
@@ -631,6 +629,7 @@ gjs_array_to_strv(JSContext   *context,
             return false;
         }
 
+        GjsAutoJSChar tmp_result;
         if (!gjs_string_to_utf8(context, elem, &tmp_result)) {
             g_strfreev(result);
             return false;
@@ -656,7 +655,7 @@ gjs_string_to_intarray(JSContext       *context,
     element_type = g_type_info_get_tag(param_info);
 
     if (element_type == GI_TYPE_TAG_INT8 || element_type == GI_TYPE_TAG_UINT8) {
-        GjsAutoJSChar result(context, JS_EncodeStringToUTF8(context, str));
+        GjsAutoJSChar result = JS_EncodeStringToUTF8(context, str);
         if (!result)
             return false;
         *length = strlen(result);
@@ -1518,7 +1517,7 @@ gjs_value_to_g_argument(JSContext      *context,
             arg->v_pointer = NULL;
         } else if (value.isString()) {
             JS::RootedString str(context, value.toString());
-            GjsAutoJSChar utf8_str(context, JS_EncodeStringToUTF8(context, str));
+            GjsAutoJSChar utf8_str = JS_EncodeStringToUTF8(context, str);
             if (utf8_str)
                 arg->v_pointer = utf8_str.copy();
             else
@@ -1620,7 +1619,7 @@ gjs_value_to_g_argument(JSContext      *context,
                     intern_gdk_atom("NONE", arg);
                 } else {
                     JS::RootedString str(context, value.toString());
-                    GjsAutoJSChar atom_name(context, JS_EncodeStringToUTF8(context, str));
+                    GjsAutoJSChar atom_name = JS_EncodeStringToUTF8(context, str);
 
                     if (!atom_name) {
                         wrong = true;
@@ -2612,7 +2611,7 @@ gjs_object_from_g_hash (JSContext             *context,
         if (!keystr)
             return false;
 
-        GjsAutoJSChar keyutf8(context, JS_EncodeStringToUTF8(context, keystr));
+        GjsAutoJSChar keyutf8 = JS_EncodeStringToUTF8(context, keystr);
         if (!keyutf8)
             return false;
 
diff --git a/gi/boxed.cpp b/gi/boxed.cpp
index a52972c..231bd0f 100644
--- a/gi/boxed.cpp
+++ b/gi/boxed.cpp
@@ -119,7 +119,7 @@ boxed_resolve(JSContext       *context,
               bool            *resolved)
 {
     Boxed *priv;
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
 
     if (!gjs_get_string_id(context, id, &name)) {
         *resolved = false;
@@ -275,7 +275,7 @@ boxed_init_from_props(JSContext   *context,
     JS::RootedId prop_id(context);
     for (ix = 0, length = ids.length(); ix < length; ix++) {
         GIFieldInfo *field_info;
-        GjsAutoJSChar name(context);
+        GjsAutoJSChar name;
 
         if (!gjs_get_string_id(context, ids[ix], &name))
             return false;
diff --git a/gi/fundamental.cpp b/gi/fundamental.cpp
index 9379330..282394b 100644
--- a/gi/fundamental.cpp
+++ b/gi/fundamental.cpp
@@ -301,7 +301,7 @@ fundamental_instance_resolve(JSContext       *context,
                              bool            *resolved)
 {
     FundamentalInstance *priv;
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
 
     if (!gjs_get_string_id(context, id, &name)) {
         *resolved = false;
diff --git a/gi/gerror.cpp b/gi/gerror.cpp
index 686cdda..3ceb192 100644
--- a/gi/gerror.cpp
+++ b/gi/gerror.cpp
@@ -97,7 +97,7 @@ GJS_NATIVE_CONSTRUCTOR_DECLARE(error)
     priv->domain = proto_priv->domain;
 
     JS::RootedObject params_obj(context, &argv[0].toObject());
-    GjsAutoJSChar message(context);
+    GjsAutoJSChar message;
     if (!gjs_object_require_property(context, params_obj,
                                      "GError constructor",
                                      GJS_STRING_MESSAGE, &message))
@@ -571,7 +571,7 @@ gjs_gerror_make_from_error(JSContext       *cx,
     if (!gjs_object_get_property(cx, obj, GJS_STRING_NAME, &v_name))
         return nullptr;
 
-    GjsAutoJSChar name(cx);
+    GjsAutoJSChar name;
     if (!gjs_string_to_utf8(cx, v_name, &name))
         return nullptr;
 
@@ -579,7 +579,7 @@ gjs_gerror_make_from_error(JSContext       *cx,
     if (!gjs_object_get_property(cx, obj, GJS_STRING_MESSAGE, &v_message))
         return nullptr;
 
-    GjsAutoJSChar message(cx);
+    GjsAutoJSChar message;
     if (!gjs_string_to_utf8(cx, v_message, &message))
         return nullptr;
 
diff --git a/gi/interface.cpp b/gi/interface.cpp
index 44ef12b..6394f95 100644
--- a/gi/interface.cpp
+++ b/gi/interface.cpp
@@ -113,7 +113,7 @@ interface_resolve(JSContext       *context,
                   bool            *resolved)
 {
     Interface *priv;
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
     GIFunctionInfo *method_info;
 
     if (!gjs_get_string_id(context, id, &name)) {
diff --git a/gi/ns.cpp b/gi/ns.cpp
index edf2b42..99ee4ee 100644
--- a/gi/ns.cpp
+++ b/gi/ns.cpp
@@ -69,7 +69,7 @@ ns_resolve(JSContext       *context,
         return true;
     }
 
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
     if (!gjs_get_string_id(context, id, &name)) {
         *resolved = false;
         return true;  /* not resolved, but no error */
diff --git a/gi/object.cpp b/gi/object.cpp
index 0b24cc4..18f9cbe 100644
--- a/gi/object.cpp
+++ b/gi/object.cpp
@@ -372,7 +372,7 @@ object_instance_get_prop(JSContext              *context,
                          JS::MutableHandleValue  value_p)
 {
     ObjectInstance *priv;
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
 
     if (!gjs_get_string_id(context, id, &name))
         return true; /* not resolved, but no error */
@@ -492,7 +492,7 @@ object_instance_set_prop(JSContext              *context,
                          JS::ObjectOpResult&     result)
 {
     ObjectInstance *priv;
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
     bool ret = true;
     bool g_param_was_set = false;
 
@@ -718,7 +718,7 @@ object_instance_resolve(JSContext       *context,
 {
     GIFunctionInfo *method_info;
     ObjectInstance *priv;
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
 
     if (!gjs_get_string_id(context, id, &name)) {
         *resolved = false;
@@ -910,7 +910,7 @@ object_instance_props_to_g_parameters(JSContext                  *context,
     }
 
     for (ix = 0, length = ids.length(); ix < length; ix++) {
-        GjsAutoJSChar name(context);
+        GjsAutoJSChar name;
         GParameter gparam = { NULL, { 0, }};
 
         /* ids[ix] is reachable because props is rooted, but require_property
@@ -1682,7 +1682,7 @@ real_connect_func(JSContext *context,
     }
 
     JS::RootedString signal_str(context, argv[0].toString());
-    GjsAutoJSChar signal_name(context, JS_EncodeStringToUTF8(context, signal_str));
+    GjsAutoJSChar signal_name = JS_EncodeStringToUTF8(context, signal_str);
     if (!signal_name)
         return false;
 
@@ -1775,7 +1775,7 @@ emit_func(JSContext *context,
     }
 
     JS::RootedString signal_str(context, argv[0].toString());
-    GjsAutoJSChar signal_name(context, JS_EncodeStringToUTF8(context, signal_str));
+    GjsAutoJSChar signal_name = JS_EncodeStringToUTF8(context, signal_str);
     if (!signal_name)
         return false;
 
@@ -2300,7 +2300,7 @@ gjs_hook_up_vfunc(JSContext *cx,
                   JS::Value *vp)
 {
     JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
-    GjsAutoJSChar name(cx);
+    GjsAutoJSChar name;
     JS::RootedObject object(cx), function(cx);
     ObjectInstance *priv;
     GType gtype, info_gtype;
@@ -2534,7 +2534,7 @@ gjs_override_property(JSContext *cx,
                       JS::Value *vp)
 {
     JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    GjsAutoJSChar name(cx);
+    GjsAutoJSChar name;
     JS::RootedObject type(cx);
     GParamSpec *pspec;
     GParamSpec *new_pspec;
@@ -2781,7 +2781,7 @@ gjs_register_interface(JSContext *cx,
                        JS::Value *vp)
 {
     JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    GjsAutoJSChar name(cx);
+    GjsAutoJSChar name;
     guint32 i, n_interfaces, n_properties;
     GType *iface_types;
     GType interface_type;
@@ -2876,7 +2876,7 @@ gjs_register_type(JSContext *cx,
                   JS::Value *vp)
 {
     JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
-    GjsAutoJSChar name(cx);
+    GjsAutoJSChar name;
     GType instance_type, parent_type;
     GTypeQuery query;
     ObjectInstance *parent_priv;
@@ -2977,7 +2977,7 @@ gjs_signal_new(JSContext *cx,
 {
     JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     GType gtype;
-    GjsAutoJSChar signal_name(cx);
+    GjsAutoJSChar signal_name;
     GSignalAccumulator accumulator;
     gint signal_id;
     guint i, n_parameters;
diff --git a/gi/param.cpp b/gi/param.cpp
index 51fea89..8f3f31e 100644
--- a/gi/param.cpp
+++ b/gi/param.cpp
@@ -58,7 +58,7 @@ param_resolve(JSContext       *context,
     GIObjectInfo *info = NULL;
     GIFunctionInfo *method_info;
     Param *priv;
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
     bool ret = false;
 
     if (!gjs_get_string_id(context, id, &name)) {
diff --git a/gi/repo.cpp b/gi/repo.cpp
index f89e7e2..4714f62 100644
--- a/gi/repo.cpp
+++ b/gi/repo.cpp
@@ -91,7 +91,7 @@ resolve_namespace_object(JSContext       *context,
 
     JSAutoRequest ar(context);
 
-    GjsAutoJSChar version(context);
+    GjsAutoJSChar version;
     if (!get_version_for_ns(context, repo_obj, ns_id, &version))
         return false;
 
@@ -113,7 +113,7 @@ resolve_namespace_object(JSContext       *context,
     if (error != NULL) {
         gjs_throw(context,
                   "Requiring %s, version %s: %s",
-                  ns_name, version?version:"none", error->message);
+                  ns_name, version ? version.get() : "none", error->message);
 
         g_error_free(error);
         return false;
@@ -175,7 +175,7 @@ repo_resolve(JSContext       *context,
         return true;
     }
 
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
     if (!gjs_get_string_id(context, id, &name)) {
         *resolved = false;
         return true;
diff --git a/gi/union.cpp b/gi/union.cpp
index 0168914..9896cc2 100644
--- a/gi/union.cpp
+++ b/gi/union.cpp
@@ -61,7 +61,7 @@ union_resolve(JSContext       *context,
               bool            *resolved)
 {
     Union *priv;
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
 
     if (!gjs_get_string_id(context, id, &name)) {
         *resolved = false;
diff --git a/gi/value.cpp b/gi/value.cpp
index 09972fc..b264cc7 100644
--- a/gi/value.cpp
+++ b/gi/value.cpp
@@ -380,7 +380,7 @@ gjs_value_to_g_value_internal(JSContext      *context,
             g_value_set_string(gvalue, NULL);
         } else if (value.isString()) {
             JS::RootedString str(context, value.toString());
-            GjsAutoJSChar utf8_string(context, JS_EncodeStringToUTF8(context, str));
+            GjsAutoJSChar utf8_string = JS_EncodeStringToUTF8(context, str);
             if (!utf8_string)
                 return false;
 
diff --git a/gjs/byteArray.cpp b/gjs/byteArray.cpp
index 8dc0cd6..930850f 100644
--- a/gjs/byteArray.cpp
+++ b/gjs/byteArray.cpp
@@ -408,7 +408,7 @@ to_string_func(JSContext *context,
                JS::Value *vp)
 {
     GJS_GET_PRIV(context, argc, vp, argv, to, ByteArrayInstance, priv);
-    GjsAutoJSChar encoding(context);
+    GjsAutoJSChar encoding;
     bool encoding_is_utf8;
     gchar *data;
 
@@ -419,7 +419,7 @@ to_string_func(JSContext *context,
 
     if (argc >= 1 && argv[0].isString()) {
         JS::RootedString str(context, argv[0].toString());
-        encoding.reset(context, JS_EncodeStringToUTF8(context, str));
+        encoding = JS_EncodeStringToUTF8(context, str);
         if (!encoding)
             return false;
 
@@ -531,7 +531,7 @@ from_string_func(JSContext *context,
 {
     JS::CallArgs argv = JS::CallArgsFromVp (argc, vp);
     ByteArrayInstance *priv;
-    GjsAutoJSChar encoding(context);
+    GjsAutoJSChar encoding;
     bool encoding_is_utf8;
     JS::RootedObject obj(context, byte_array_new(context));
 
@@ -553,7 +553,7 @@ from_string_func(JSContext *context,
 
     if (argc > 1 && argv[1].isString()) {
         JS::RootedString str(context, argv[1].toString());
-        encoding.reset(context, JS_EncodeStringToUTF8(context, str));
+        encoding = JS_EncodeStringToUTF8(context, str);
         if (!encoding)
             return false;
 
@@ -571,7 +571,7 @@ from_string_func(JSContext *context,
          * libmozjs hardwired utf16-to-utf8.
          */
         JS::RootedString str(context, argv[0].toString());
-        GjsAutoJSChar utf8(context, JS_EncodeStringToUTF8(context, str));
+        GjsAutoJSChar utf8 = JS_EncodeStringToUTF8(context, str);
         if (!utf8)
             return false;
 
diff --git a/gjs/engine.cpp b/gjs/engine.cpp
index 92a1558..67911ee 100644
--- a/gjs/engine.cpp
+++ b/gjs/engine.cpp
@@ -48,7 +48,7 @@ gjs_locale_to_upper_case (JSContext *context,
                           JS::HandleString src,
                           JS::MutableHandleValue retval)
 {
-    GjsAutoJSChar utf8(context, JS_EncodeStringToUTF8(context, src));
+    GjsAutoJSChar utf8 = JS_EncodeStringToUTF8(context, src);
     if (!utf8)
         return false;
 
@@ -61,7 +61,7 @@ gjs_locale_to_lower_case (JSContext *context,
                           JS::HandleString src,
                           JS::MutableHandleValue retval)
 {
-    GjsAutoJSChar utf8(context, JS_EncodeStringToUTF8(context, src));
+    GjsAutoJSChar utf8 = JS_EncodeStringToUTF8(context, src);
     if (!utf8)
         return false;
 
@@ -75,11 +75,11 @@ gjs_locale_compare (JSContext *context,
                     JS::HandleString src_2,
                     JS::MutableHandleValue retval)
 {
-    GjsAutoJSChar utf8_1(context, JS_EncodeStringToUTF8(context, src_1));
+    GjsAutoJSChar utf8_1 = JS_EncodeStringToUTF8(context, src_1);
     if (!utf8_1)
         return false;
 
-    GjsAutoJSChar utf8_2(context, JS_EncodeStringToUTF8(context, src_2));
+    GjsAutoJSChar utf8_2 = JS_EncodeStringToUTF8(context, src_2);
     if (!utf8_2)
         return false;
 
diff --git a/gjs/global.cpp b/gjs/global.cpp
index f36e4d1..e6d25b2 100644
--- a/gjs/global.cpp
+++ b/gjs/global.cpp
@@ -90,7 +90,7 @@ gjs_log(JSContext *cx,
         return true;
     }
 
-    GjsAutoJSChar s(cx, JS_EncodeStringToUTF8(cx, jstr));
+    GjsAutoJSChar s = JS_EncodeStringToUTF8(cx, jstr);
     if (!s)
         return false;
 
@@ -149,7 +149,7 @@ gjs_print_parse_args(JSContext    *cx,
         exc_state.restore();
 
         if (jstr) {
-            GjsAutoJSChar s(cx, JS_EncodeStringToUTF8(cx, jstr));
+            GjsAutoJSChar s = JS_EncodeStringToUTF8(cx, jstr);
             if (!s) {
                 g_string_free(str, true);
                 return false;
diff --git a/gjs/importer.cpp b/gjs/importer.cpp
index 7060007..70f214a 100644
--- a/gjs/importer.cpp
+++ b/gjs/importer.cpp
@@ -79,12 +79,12 @@ importer_to_string(JSContext *cx,
                                  &module_path))
         return false;
 
-    GjsAutoJSChar path(cx);
     GjsAutoChar output;
 
     if (module_path.isNull()) {
         output = g_strdup_printf("[%s root]", klass->name);
     } else {
+        GjsAutoJSChar path;
         if (!gjs_string_to_utf8(cx, module_path, &path))
             return false;
         output = g_strdup_printf("[%s %s]", klass->name, path.get());
@@ -145,7 +145,7 @@ define_meta_properties(JSContext       *context,
         if (parent_module_path.isNull()) {
             module_path_buf = g_strdup(module_name);
         } else {
-            GjsAutoJSChar parent_path(context);
+            GjsAutoJSChar parent_path;
             if (!gjs_string_to_utf8(context, parent_module_path, &parent_path))
                 return false;
             module_path_buf = g_strdup_printf("%s.%s", parent_path.get(), module_name);
@@ -502,7 +502,7 @@ do_import(JSContext       *context,
     }
 
     for (i = 0; i < search_path_len; ++i) {
-        GjsAutoJSChar dirname(context);
+        GjsAutoJSChar dirname;
 
         elem.setUndefined();
         if (!JS_GetElement(context, search_path, i, &elem)) {
@@ -521,7 +521,7 @@ do_import(JSContext       *context,
         }
 
         str = elem.toString();
-        dirname.reset(context, JS_EncodeStringToUTF8(context, str));
+        dirname = JS_EncodeStringToUTF8(context, str);
         if (!dirname)
             goto out;
 
@@ -697,7 +697,7 @@ importer_enumerate(JSContext        *context,
         }
 
         str = elem.toString();
-        GjsAutoJSChar dirname(context, JS_EncodeStringToUTF8(context, str));
+        GjsAutoJSChar dirname = JS_EncodeStringToUTF8(context, str);
         if (!dirname)
             return false;
 
@@ -777,7 +777,7 @@ importer_resolve(JSContext        *context,
         return true;
     }
 
-    GjsAutoJSChar name(context);
+    GjsAutoJSChar name;
     if (!gjs_get_string_id(context, id, &name)) {
         *resolved = false;
         return true;
diff --git a/gjs/jsapi-util-args.h b/gjs/jsapi-util-args.h
index 76003d7..e723919 100644
--- a/gjs/jsapi-util-args.h
+++ b/gjs/jsapi-util-args.h
@@ -96,7 +96,7 @@ assign(JSContext      *cx,
     if (c != 's')
         throw g_strdup_printf("Wrong type for %c, got GjsAutoJSChar*", c);
     if (nullable && value.isNull()) {
-        ref->reset(cx, nullptr);
+        ref->reset();
         return;
     }
     if (!gjs_string_to_utf8(cx, value, ref))
diff --git a/gjs/jsapi-util-error.cpp b/gjs/jsapi-util-error.cpp
index 132e1e4..f4f6714 100644
--- a/gjs/jsapi-util-error.cpp
+++ b/gjs/jsapi-util-error.cpp
@@ -222,9 +222,9 @@ gjs_format_stack_trace(JSContext       *cx,
     JS::AutoSaveExceptionState saved_exc(cx);
 
     JS::RootedString stack_trace(cx);
-    GjsAutoJSChar stack_utf8(cx);
+    GjsAutoJSChar stack_utf8;
     if (JS::BuildStackString(cx, saved_frame, &stack_trace, 2))
-        stack_utf8.reset(cx, JS_EncodeStringToUTF8(cx, stack_trace));
+        stack_utf8 = JS_EncodeStringToUTF8(cx, stack_trace);
 
     saved_exc.restore();
 
diff --git a/gjs/jsapi-util-string.cpp b/gjs/jsapi-util-string.cpp
index e13e0d3..db43b4d 100644
--- a/gjs/jsapi-util-string.cpp
+++ b/gjs/jsapi-util-string.cpp
@@ -55,7 +55,7 @@ gjs_string_to_utf8(JSContext      *cx,
     }
 
     JS::RootedString str(cx, value.toString());
-    utf8_string_p->reset(cx, JS_EncodeStringToUTF8(cx, str));
+    utf8_string_p->reset(JS_EncodeStringToUTF8(cx, str));
     return !!*utf8_string_p;
 }
 
@@ -97,7 +97,7 @@ gjs_string_to_filename(JSContext      *context,
                        GjsAutoChar    *filename_string)
 {
     GError *error;
-    GjsAutoJSChar tmp(context);
+    GjsAutoJSChar tmp;
 
     /* gjs_string_to_filename verifies that filename_val is a string */
 
@@ -324,7 +324,7 @@ gjs_get_string_id (JSContext       *context,
 
     if (id_val.isString()) {
         JS::RootedString str(context, id_val.toString());
-        name_p->reset(context, JS_EncodeStringToUTF8(context, str));
+        name_p->reset(JS_EncodeStringToUTF8(context, str));
         return !!name_p;
     } else {
         return false;
@@ -348,7 +348,7 @@ gjs_unichar_from_string (JSContext *context,
                          JS::Value  value,
                          gunichar  *result)
 {
-    GjsAutoJSChar utf8_str(context);
+    GjsAutoJSChar utf8_str;
     if (gjs_string_to_utf8(context, value, &utf8_str)) {
         *result = g_utf8_get_char(utf8_str);
         return true;
diff --git a/gjs/jsapi-util.cpp b/gjs/jsapi-util.cpp
index 816715b..322a41b 100644
--- a/gjs/jsapi-util.cpp
+++ b/gjs/jsapi-util.cpp
@@ -138,7 +138,7 @@ throw_property_lookup_error(JSContext       *cx,
     /* remember gjs_throw() is a no-op if JS_GetProperty()
      * already set an exception
      */
-    GjsAutoJSChar name(cx);
+    GjsAutoJSChar name;
     gjs_get_string_id(cx, property_name, &name);
 
     if (description)
@@ -363,7 +363,7 @@ gjs_string_readable(JSContext       *context,
 
     g_string_append_c(buf, '"');
 
-    GjsAutoJSChar chars(context, JS_EncodeStringToUTF8(context, string));
+    GjsAutoJSChar chars = JS_EncodeStringToUTF8(context, string);
     if (!chars) {
         /* I'm not sure this code will actually ever be reached except in the
          * case of OOM, since JS_EncodeStringToUTF8() seems to happily output
@@ -494,7 +494,7 @@ utf8_exception_from_non_gerror_value(JSContext      *cx,
     if (!exc_str)
         return nullptr;
 
-    GjsAutoJSChar utf8_exception(cx, JS_EncodeStringToUTF8(cx, exc_str));
+    GjsAutoJSChar utf8_exception = JS_EncodeStringToUTF8(cx, exc_str);
     return utf8_exception.copy();
 }
 
@@ -504,7 +504,6 @@ gjs_log_exception_full(JSContext       *context,
                        JS::HandleString message)
 {
     char *utf8_exception;
-    GjsAutoJSChar utf8_message(context);
     bool is_syntax;
 
     JS_BeginRequest(context);
@@ -530,8 +529,9 @@ gjs_log_exception_full(JSContext       *context,
         }
     }
 
+    GjsAutoJSChar utf8_message;
     if (message)
-        utf8_message.reset(context, JS_EncodeStringToUTF8(context, message));
+        utf8_message = JS_EncodeStringToUTF8(context, message);
 
     /* We log syntax errors differently, because the stack for those includes
        only the referencing module, but we want to print out the filename and
@@ -541,19 +541,19 @@ gjs_log_exception_full(JSContext       *context,
     if (is_syntax) {
         JS::RootedValue js_lineNumber(context), js_fileName(context);
         unsigned lineNumber;
-        GjsAutoJSChar utf8_filename(context);
 
         gjs_object_get_property(context, exc_obj, GJS_STRING_LINE_NUMBER,
                                 &js_lineNumber);
         gjs_object_get_property(context, exc_obj, GJS_STRING_FILENAME,
                                 &js_fileName);
 
+        GjsAutoJSChar utf8_filename;
         if (js_fileName.isString()) {
             JS::RootedString str(context, js_fileName.toString());
-            utf8_filename.reset(context, JS_EncodeStringToUTF8(context, str));
+            utf8_filename = JS_EncodeStringToUTF8(context, str);
         }
         if (!utf8_filename)
-            utf8_filename.reset(context, JS_strdup(context, "unknown"));
+            utf8_filename = JS_strdup(context, "unknown");
 
         lineNumber = js_lineNumber.toInt32();
 
@@ -566,7 +566,7 @@ gjs_log_exception_full(JSContext       *context,
         }
 
     } else {
-        GjsAutoJSChar utf8_stack(context);
+        GjsAutoJSChar utf8_stack;
         JS::RootedValue stack(context);
 
         if (exc.isObject() &&
@@ -574,7 +574,7 @@ gjs_log_exception_full(JSContext       *context,
                                     &stack) &&
             stack.isString()) {
             JS::RootedString str(context, stack.toString());
-            utf8_stack.reset(context, JS_EncodeStringToUTF8(context, str));
+            utf8_stack = JS_EncodeStringToUTF8(context, str);
         }
 
         if (message) {
diff --git a/gjs/jsapi-util.h b/gjs/jsapi-util.h
index e2d31f6..8c54ee0 100644
--- a/gjs/jsapi-util.h
+++ b/gjs/jsapi-util.h
@@ -65,58 +65,27 @@ public:
     }
 };
 
-class GjsJSFreeArgs {
-private:
-    JSContext *m_cx;
-
-public:
-    explicit GjsJSFreeArgs(JSContext *cx) : m_cx(cx)
-    {}
-
+struct GjsJSFreeArgs {
     void operator() (char *str) {
-        JS_free(m_cx, str);
-    }
-
-    JSContext* get_context() {
-        return m_cx;
-    }
-
-    void set_context(JSContext *cx) {
-        m_cx = cx;
+        JS_free(nullptr, str);
     }
 };
 
-class GjsAutoJSChar {
-private:
-    std::unique_ptr<char, GjsJSFreeArgs> m_ptr;
-
+class GjsAutoJSChar : public std::unique_ptr<char, GjsJSFreeArgs> {
 public:
-    GjsAutoJSChar(JSContext *cx, char *str = nullptr)
-    : m_ptr (str, GjsJSFreeArgs(cx)) {
-        g_assert(cx != nullptr);
-    }
+    GjsAutoJSChar(char *str = nullptr) : unique_ptr(str, GjsJSFreeArgs()) { }
 
     operator const char*() {
-        return m_ptr.get();
+        return get();
     }
 
-    const char* get() {
-        return m_ptr.get();
+    void operator=(char *str) {
+        reset(str);
     }
 
     char* copy() {
         /* Strings acquired by this should be g_free()'ed */
-        return g_strdup(m_ptr.get());
-    }
-
-    char* js_copy() {
-        /* Strings acquired by this should be JS_free()'ed */
-        return JS_strdup(m_ptr.get_deleter().get_context(), m_ptr.get());
-    }
-
-    void reset(JSContext *cx, char *str) {
-        m_ptr.get_deleter().set_context(cx);
-        m_ptr.reset(str);
+        return g_strdup(get());
     }
 };
 
@@ -137,7 +106,6 @@ typedef struct GjsRootedArray GjsRootedArray;
 /* Flags that should be set on properties exported from native code modules.
  * Basically set these on API, but do NOT set them on data.
  *
- * READONLY:  forbid setting prop to another value
  * PERMANENT: forbid deleting the prop
  * ENUMERATE: allows copyProperties to work among other reasons to have it
  */
diff --git a/gjs/module.cpp b/gjs/module.cpp
index f25507b..cc6657a 100644
--- a/gjs/module.cpp
+++ b/gjs/module.cpp
@@ -163,7 +163,7 @@ class GjsModule {
          * be supported according to ES6. For compatibility with earlier GJS,
          * we treat it as if it were a real property, but warn about it. */
 
-        GjsAutoJSChar prop_name(cx);
+        GjsAutoJSChar prop_name;
         if (!gjs_get_string_id(cx, id, &prop_name))
             return false;
 
diff --git a/modules/cairo-context.cpp b/modules/cairo-context.cpp
index d3e81f4..e77bde1 100644
--- a/modules/cairo-context.cpp
+++ b/modules/cairo-context.cpp
@@ -656,7 +656,7 @@ showText_func(JSContext *context,
               JS::Value *vp)
 {
     GJS_GET_PRIV(context, argc, vp, argv, obj, GjsCairoContext, priv);
-    GjsAutoJSChar utf8(context);
+    GjsAutoJSChar utf8;
     cairo_t *cr = priv ? priv->cr : NULL;
 
     if (!gjs_parse_call_args(context, "showText", argv, "s",
@@ -679,7 +679,7 @@ selectFontFace_func(JSContext *context,
                     JS::Value *vp)
 {
     GJS_GET_PRIV(context, argc, vp, argv, obj, GjsCairoContext, priv);
-    GjsAutoJSChar family(context);
+    GjsAutoJSChar family;
     cairo_font_slant_t slant;
     cairo_font_weight_t weight;
     cairo_t *cr = priv ? priv->cr : NULL;
diff --git a/modules/console.cpp b/modules/console.cpp
index 5d7da29..dcbe208 100644
--- a/modules/console.cpp
+++ b/modules/console.cpp
@@ -163,7 +163,7 @@ public:
             if (!message) {
                 g_printerr("(could not convert thrown exception to string)\n");
             } else {
-                GjsAutoJSChar message_utf8(m_cx, JS_EncodeStringToUTF8(m_cx, message));
+                GjsAutoJSChar message_utf8 = JS_EncodeStringToUTF8(m_cx, message);
                 g_printerr("%s\n", message_utf8.get());
             }
         }
diff --git a/test/gjs-test-call-args.cpp b/test/gjs-test-call-args.cpp
index e1806e2..bec9139 100644
--- a/test/gjs-test-call-args.cpp
+++ b/test/gjs-test-call-args.cpp
@@ -85,7 +85,7 @@ JSNATIVE_TEST_FUNC_END
 
 JSNATIVE_TEST_FUNC_BEGIN(one_of_each_type)
     bool boolval;
-    GjsAutoJSChar strval(cx);
+    GjsAutoJSChar strval;
     GjsAutoChar fileval;
     int intval;
     unsigned uintval;
@@ -155,7 +155,7 @@ JSNATIVE_TEST_FUNC_BEGIN(signed_enum_arg)
 JSNATIVE_TEST_FUNC_END
 
 JSNATIVE_TEST_FUNC_BEGIN(one_of_each_nullable_type)
-    GjsAutoJSChar strval(cx);
+    GjsAutoJSChar strval;
     GjsAutoChar fileval;
     JS::RootedObject objval(cx);
     retval = gjs_parse_call_args(cx, "oneOfEachNullableType", args, "?s?F?o",
@@ -207,21 +207,15 @@ JSNATIVE_BAD_TYPE_TEST_FUNC(unsigned, "t");
 JSNATIVE_BAD_TYPE_TEST_FUNC(int64_t, "f");
 JSNATIVE_BAD_TYPE_TEST_FUNC(double, "b");
 JSNATIVE_BAD_TYPE_TEST_FUNC(GjsAutoChar, "i");
+JSNATIVE_BAD_TYPE_TEST_FUNC(GjsAutoJSChar, "i");
 
 #undef JSNATIVE_BAD_TYPE_TEST_FUNC
 
-#define JSNATIVE_CONSTRUCTED_BAD_TYPE_TEST_FUNC(type, ch)                \
-    JSNATIVE_TEST_FUNC_BEGIN(type##_invalid_type)                        \
-        type val(cx);                                                    \
-        retval = gjs_parse_call_args(cx, #type "InvalidType", args, ch,  \
-                                     "val", &val);                       \
-    JSNATIVE_TEST_FUNC_END
-
-using JS::RootedObject;
-JSNATIVE_CONSTRUCTED_BAD_TYPE_TEST_FUNC(GjsAutoJSChar, "i");
-JSNATIVE_CONSTRUCTED_BAD_TYPE_TEST_FUNC(RootedObject, "i");
-
-#undef JSNATIVE_CONSTRUCTED_BAD_TYPE_TEST_FUNC
+JSNATIVE_TEST_FUNC_BEGIN(object_invalid_type)
+    JS::RootedObject val(cx);
+    retval = gjs_parse_call_args(cx, "objectInvalidType", args, "i",
+                                 "val", &val);
+JSNATIVE_TEST_FUNC_END
 
 static JSFunctionSpec native_test_funcs[] = {
     JS_FS("noArgs", no_args, 0, 0),
@@ -251,7 +245,7 @@ static JSFunctionSpec native_test_funcs[] = {
     JS_FS("doubleInvalidType", double_invalid_type, 0, 0),
     JS_FS("GjsAutoCharInvalidType", GjsAutoChar_invalid_type, 0, 0),
     JS_FS("GjsAutoJSCharInvalidType", GjsAutoJSChar_invalid_type, 0, 0),
-    JS_FS("RootedObjectInvalidType", RootedObject_invalid_type, 0, 0),
+    JS_FS("objectInvalidType", object_invalid_type, 0, 0),
     JS_FS_END
 };
 
@@ -389,7 +383,7 @@ gjs_test_add_tests_for_parse_call_args(void)
                              "GjsAutoJSCharInvalidType(1)"
                              "//*Wrong type for i, got GjsAutoJSChar?");
     ADD_CALL_ARGS_TEST_XFAIL("invalid-object-type",
-                             "RootedObjectInvalidType(1)"
+                             "objectInvalidType(1)"
                              "//*Wrong type for i, got JS::MutableHandleObject");
     ADD_CALL_ARGS_TEST_XFAIL("invalid-boolean",
                              "boolArgNoAssert({})//*Not a boolean");
diff --git a/test/gjs-tests.cpp b/test/gjs-tests.cpp
index 03f34d3..c172d1b 100644
--- a/test/gjs-tests.cpp
+++ b/test/gjs-tests.cpp
@@ -119,11 +119,11 @@ static void
 gjstest_test_func_gjs_jsapi_util_string_js_string_utf8(GjsUnitTestFixture *fx,
                                                        gconstpointer       unused)
 {
-    GjsAutoJSChar utf8_result(fx->cx);
     JS::RootedValue js_string(fx->cx);
-
     g_assert_true(gjs_string_from_utf8(fx->cx, VALID_UTF8_STRING, &js_string));
     g_assert(js_string.isString());
+
+    GjsAutoJSChar utf8_result;
     g_assert(gjs_string_to_utf8(fx->cx, js_string, &utf8_result));
     g_assert_cmpstr(VALID_UTF8_STRING, ==, utf8_result);
 }
@@ -133,7 +133,6 @@ gjstest_test_func_gjs_jsapi_util_error_throw(GjsUnitTestFixture *fx,
                                              gconstpointer       unused)
 {
     JS::RootedValue exc(fx->cx), value(fx->cx);
-    GjsAutoJSChar s(fx->cx);
 
     /* Test that we can throw */
 
@@ -149,6 +148,7 @@ gjstest_test_func_gjs_jsapi_util_error_throw(GjsUnitTestFixture *fx,
 
     g_assert(value.isString());
 
+    GjsAutoJSChar s;
     gjs_string_to_utf8(fx->cx, value, &s);
     g_assert_nonnull(s);
     g_assert_cmpstr(s, ==, "This is an exception 42");


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