[gjs: 9/15] gi: Rename "proxy" to "wrapper"



commit 7c8f0e6e01fd71efe1c1b0bb9bbb9280263a9e21
Author: Philip Chimento <philip chimento gmail com>
Date:   Wed Dec 5 22:45:00 2018 -0800

    gi: Rename "proxy" to "wrapper"
    
    "Proxy" has a specific meaning in modern JS that it didn't have at the
    time this terminology was added to GJS. Let's speak of "wrappers" for
    C pointers instead. It's confusing because these JSClasses that are used
    to implement the wrappers, are not JS Proxies, but they do something
    similar.
    
    In addition, we can remove the underscores while we are renaming these
    functions anyway. They are not exported from the GJS shared library
    anyway, so there is no need to add the underscores.

 gi/boxed.cpp                                       |  7 +--
 gi/function.cpp                                    | 14 ++---
 gi/fundamental.cpp                                 | 24 ++++----
 gi/gjs_gi_probes.d                                 |  4 +-
 gi/object.cpp                                      | 68 ++++++++++++----------
 gi/union.cpp                                       | 18 +++---
 gi/{proxyutils.cpp => wrapperutils.cpp}            | 33 ++++-------
 gi/{proxyutils.h => wrapperutils.h}                | 31 +++++-----
 gjs-srcs.mk                                        |  4 +-
 gjs/gjs.stp.in                                     | 12 ++--
 installed-tests/debugger/print.debugger.output     |  2 +-
 installed-tests/js/testGObjectDestructionAccess.js |  6 +-
 12 files changed, 103 insertions(+), 120 deletions(-)
---
diff --git a/gi/boxed.cpp b/gi/boxed.cpp
index 50c51008..d3fd4ca0 100644
--- a/gi/boxed.cpp
+++ b/gi/boxed.cpp
@@ -32,11 +32,11 @@
 #include "boxed.h"
 #include "function.h"
 #include "gi/gerror.h"
+#include "gi/wrapperutils.h"
 #include "gjs/jsapi-class.h"
 #include "gjs/mem-private.h"
 #include "gtype.h"
 #include "object.h"
-#include "proxyutils.h"
 #include "repo.h"
 
 #include <util/log.h>
@@ -876,9 +876,8 @@ to_string_func(JSContext *context,
                JS::Value *vp)
 {
     GJS_GET_PRIV(context, argc, vp, rec, obj, Boxed, priv);
-    return _gjs_proxy_to_string_func(context, obj, "boxed",
-                                     (GIBaseInfo*)priv->info, priv->gtype,
-                                     priv->gboxed, rec.rval());
+    return gjs_wrapper_to_string_func(context, obj, "boxed", priv->info,
+                                      priv->gtype, priv->gboxed, rec.rval());
 }
 
 static void
diff --git a/gi/function.cpp b/gi/function.cpp
index 220aa198..ce5f97b9 100644
--- a/gi/function.cpp
+++ b/gi/function.cpp
@@ -1529,14 +1529,14 @@ function_to_string (JSContext *context,
     arg_names = g_string_free(arg_names_str, false);
 
     if (g_base_info_get_type(priv->info) == GI_INFO_TYPE_FUNCTION) {
-        string = g_strdup_printf("function %s(%s) {\n\t/* proxy for native symbol %s(); */\n}",
-                                 g_base_info_get_name ((GIBaseInfo *) priv->info),
-                                 arg_names,
-                                 g_function_info_get_symbol ((GIFunctionInfo *) priv->info));
+        string = g_strdup_printf(
+            "function %s(%s) {\n\t/* wrapper for native symbol %s(); */\n}",
+            g_base_info_get_name(priv->info), arg_names,
+            g_function_info_get_symbol(priv->info));
     } else {
-        string = g_strdup_printf("function %s(%s) {\n\t/* proxy for native symbol */\n}",
-                                 g_base_info_get_name ((GIBaseInfo *) priv->info),
-                                 arg_names);
+        string = g_strdup_printf(
+            "function %s(%s) {\n\t/* wrapper for native symbol */\n}",
+            g_base_info_get_name(priv->info), arg_names);
     }
 
     g_free(arg_names);
diff --git a/gi/fundamental.cpp b/gi/fundamental.cpp
index adca834d..49da7240 100644
--- a/gi/fundamental.cpp
+++ b/gi/fundamental.cpp
@@ -27,12 +27,12 @@
 #include "fundamental.h"
 
 #include "arg.h"
-#include "object.h"
 #include "boxed.h"
 #include "function.h"
-#include "gtype.h"
-#include "proxyutils.h"
-#include "repo.h"
+#include "gi/gtype.h"
+#include "gi/object.h"
+#include "gi/repo.h"
+#include "gi/wrapperutils.h"
 #include "gjs/jsapi-class.h"
 #include "gjs/jsapi-wrapper.h"
 #include "gjs/mem-private.h"
@@ -485,18 +485,14 @@ to_string_func(JSContext *context,
     if (fundamental_is_prototype(priv)) {
         Fundamental *proto_priv = (Fundamental *) priv;
 
-        if (!_gjs_proxy_to_string_func(context, obj, "fundamental",
-                                       (GIBaseInfo *) proto_priv->info,
-                                       proto_priv->gtype,
-                                       proto_priv->gfundamental,
-                                       rec.rval()))
+        if (!gjs_wrapper_to_string_func(context, obj, "fundamental",
+                                        proto_priv->info, proto_priv->gtype,
+                                        proto_priv->gfundamental, rec.rval()))
             return false;
     } else {
-        if (!_gjs_proxy_to_string_func(context, obj, "fundamental",
-                                       (GIBaseInfo *) priv->prototype->info,
-                                       priv->prototype->gtype,
-                                       priv->gfundamental,
-                                       rec.rval()))
+        if (!gjs_wrapper_to_string_func(
+                context, obj, "fundamental", priv->prototype->info,
+                priv->prototype->gtype, priv->gfundamental, rec.rval()))
             return false;
     }
 
diff --git a/gi/gjs_gi_probes.d b/gi/gjs_gi_probes.d
index 20e8ad30..79fd125b 100644
--- a/gi/gjs_gi_probes.d
+++ b/gi/gjs_gi_probes.d
@@ -1,4 +1,4 @@
 provider gjs {
-       probe object__proxy__new(void*, void*, char *, char *);
-       probe object__proxy__finalize(void*, void*, char *, char *);
+       probe object__wrapper__new(void*, void*, char *, char *);
+       probe object__wrapper__finalize(void*, void*, char *, char *);
 };
diff --git a/gi/object.cpp b/gi/object.cpp
index 5a5e7b86..f9d90f15 100644
--- a/gi/object.cpp
+++ b/gi/object.cpp
@@ -30,24 +30,24 @@
 #include <unordered_map>
 #include <vector>
 
-#include "object.h"
+#include "gi/arg.h"
+#include "gi/closure.h"
+#include "gi/function.h"
+#include "gi/gjs_gi_trace.h"
+#include "gi/object.h"
+#include "gi/param.h"
+#include "gi/wrapperutils.h"
+#include "gjs/context-private.h"
+#include "gjs/jsapi-class.h"
+#include "gjs/jsapi-util-args.h"
+#include "gjs/jsapi-util-root.h"
+#include "gjs/jsapi-wrapper.h"
+#include "gjs/mem-private.h"
 #include "gtype.h"
 #include "interface.h"
-#include "gjs/jsapi-util-args.h"
-#include "arg.h"
 #include "repo.h"
-#include "function.h"
-#include "proxyutils.h"
-#include "param.h"
 #include "toggle.h"
 #include "value.h"
-#include "closure.h"
-#include "gjs_gi_trace.h"
-#include "gjs/jsapi-class.h"
-#include "gjs/jsapi-util-root.h"
-#include "gjs/jsapi-wrapper.h"
-#include "gjs/context-private.h"
-#include "gjs/mem-private.h"
 
 #include <util/log.h>
 #include <girepository.h>
@@ -289,7 +289,7 @@ GParamSpec* ObjectPrototype::find_param_spec_from_id(JSContext* cx,
     GjsAutoParam param_spec(pspec, GjsAutoTakeOwnership());
 
     if (!param_spec) {
-        _gjs_proxy_throw_nonexistent_field(cx, m_gtype, js_prop_name.get());
+        gjs_wrapper_throw_nonexistent_field(cx, m_gtype, js_prop_name.get());
         return nullptr;
     }
 
@@ -434,7 +434,7 @@ GIFieldInfo* ObjectPrototype::find_field_info_from_id(JSContext* cx,
     GjsAutoFieldInfo field = lookup_field_info(m_info, js_prop_name.get());
 
     if (!field) {
-        _gjs_proxy_throw_nonexistent_field(cx, m_gtype, js_prop_name.get());
+        gjs_wrapper_throw_nonexistent_field(cx, m_gtype, js_prop_name.get());
         return nullptr;
     }
 
@@ -541,7 +541,7 @@ bool ObjectInstance::prop_setter_impl(JSContext* cx, JS::HandleString name,
 
     if (!(param_spec->flags & G_PARAM_WRITABLE))
         /* prevent setting the prop even in JS */
-        return _gjs_proxy_throw_readonly_field(cx, gtype(), param_spec->name);
+        return gjs_wrapper_throw_readonly_field(cx, gtype(), param_spec->name);
 
     gjs_debug_jsprop(GJS_DEBUG_GOBJECT, "Setting GObject prop %s",
                      param_spec->name);
@@ -599,8 +599,8 @@ bool ObjectInstance::field_setter_impl(JSContext* cx, JS::HandleString name,
         return true;
     }
 
-    return _gjs_proxy_throw_readonly_field(cx, gtype(),
-                                           g_base_info_get_name(field));
+    return gjs_wrapper_throw_readonly_field(cx, gtype(),
+                                            g_base_info_get_name(field));
 }
 
 bool ObjectPrototype::is_vfunc_unchanged(GIVFuncInfo* info) {
@@ -1116,8 +1116,8 @@ bool ObjectPrototype::props_to_g_parameters(JSContext* context,
         prop_id = ids[ix];
 
         if (!JSID_IS_STRING(prop_id))
-            return _gjs_proxy_throw_nonexistent_field(context, m_gtype,
-                                                      gjs_debug_id(prop_id).c_str());
+            return gjs_wrapper_throw_nonexistent_field(
+                context, m_gtype, gjs_debug_id(prop_id).c_str());
 
         JS::RootedString js_prop_name(context, JSID_TO_STRING(prop_id));
         GParamSpec *param_spec = find_param_spec_from_id(context, js_prop_name);
@@ -1133,8 +1133,8 @@ bool ObjectPrototype::props_to_g_parameters(JSContext* context,
         }
 
         if (!(param_spec->flags & G_PARAM_WRITABLE))
-            return _gjs_proxy_throw_readonly_field(context, m_gtype,
-                                                   param_spec->name);
+            return gjs_wrapper_throw_readonly_field(context, m_gtype,
+                                                    param_spec->name);
             /* prevent setting the prop even in JS */
 
         g_value_init(&gvalue, G_PARAM_SPEC_VALUE_TYPE(param_spec));
@@ -1231,7 +1231,7 @@ ObjectInstance::toggle_down(void)
          *
          * GObjects, however, don't work like that, there's only a
          * reference count but no notion of who owns the reference so,
-         * a JS object that's proxying a GObject is unconditionally held
+         * a JS object that's wrapping a GObject is unconditionally held
          * alive as long as the GObject has >1 references.
          *
          * Since we cannot know how many more wrapped GObjects are going
@@ -1653,7 +1653,7 @@ ObjectInstance::init_impl(JSContext              *context,
 
     debug_lifecycle("JSObject created");
 
-    TRACE(GJS_OBJECT_PROXY_NEW(this, m_gobj, ns(), name()));
+    TRACE(GJS_OBJECT_WRAPPER_NEW(this, m_gobj, ns(), name()));
 
     args.rval().setObject(*object);
     return true;
@@ -1727,7 +1727,7 @@ void ObjectBase::finalize(JSFreeOp* fop, JSObject* obj) {
 ObjectInstance::~ObjectInstance() {
     debug_lifecycle("Finalize");
 
-    TRACE(GJS_OBJECT_PROXY_FINALIZE(this, m_gobj, ns(), name()));
+    TRACE(GJS_OBJECT_WRAPPER_FINALIZE(this, m_gobj, ns(), name()));
 
     invalidate_all_closures();
 
@@ -1737,16 +1737,20 @@ ObjectInstance::~ObjectInstance() {
         bool had_toggle_down;
 
         if (G_UNLIKELY (m_gobj->ref_count <= 0)) {
-            g_error("Finalizing proxy for an already freed object of type: %s.%s\n",
-                    ns(), name());
+            g_error(
+                "Finalizing wrapper for an already freed object of type: "
+                "%s.%s\n",
+                ns(), name());
         }
 
         auto& toggle_queue = ToggleQueue::get_default();
         std::tie(had_toggle_down, had_toggle_up) = toggle_queue.cancel(m_gobj);
 
         if (!had_toggle_up && had_toggle_down) {
-            g_error("Finalizing proxy for an object that's scheduled to be unrooted: %s.%s\n",
-                    ns(), name());
+            g_error(
+                "Finalizing wrapper for an object that's scheduled to be "
+                "unrooted: %s.%s\n",
+                ns(), name());
         }
 
         if (!m_gobj_disposed)
@@ -2054,14 +2058,14 @@ bool
 ObjectInstance::to_string_impl(JSContext          *cx,
                                const JS::CallArgs& args)
 {
-    return _gjs_proxy_to_string_func(
+    return gjs_wrapper_to_string_func(
         cx, m_wrapper, m_gobj_disposed ? "object (FINALIZED)" : "object",
         info(), gtype(), m_gobj, args.rval());
 }
 
 bool ObjectPrototype::to_string_impl(JSContext* cx, const JS::CallArgs& args) {
-    return _gjs_proxy_to_string_func(cx, nullptr, "object prototype", info(),
-                                     gtype(), nullptr, args.rval());
+    return gjs_wrapper_to_string_func(cx, nullptr, "object prototype", info(),
+                                      gtype(), nullptr, args.rval());
 }
 
 static const struct JSClassOps gjs_object_class_ops = {
diff --git a/gi/union.cpp b/gi/union.cpp
index 52256418..6860d643 100644
--- a/gi/union.cpp
+++ b/gi/union.cpp
@@ -25,20 +25,21 @@
 
 #include <string.h>
 
+#include <girepository.h>
+
 /* include first for logging related #define used in repo.h */
 #include <util/log.h>
 
-#include "union.h"
 #include "arg.h"
-#include "object.h"
+#include "gi/function.h"
+#include "gi/gtype.h"
+#include "gi/object.h"
+#include "gi/union.h"
+#include "gi/wrapperutils.h"
 #include "gjs/jsapi-class.h"
 #include "gjs/jsapi-wrapper.h"
 #include "gjs/mem-private.h"
 #include "repo.h"
-#include "proxyutils.h"
-#include "function.h"
-#include "gtype.h"
-#include <girepository.h>
 
 typedef struct {
     GIUnionInfo *info;
@@ -272,9 +273,8 @@ to_string_func(JSContext *context,
                JS::Value *vp)
 {
     GJS_GET_PRIV(context, argc, vp, rec, obj, Union, priv);
-    return _gjs_proxy_to_string_func(context, obj, "union",
-                                     (GIBaseInfo*)priv->info, priv->gtype,
-                                     priv->gboxed, rec.rval());
+    return gjs_wrapper_to_string_func(context, obj, "union", priv->info,
+                                      priv->gtype, priv->gboxed, rec.rval());
 }
 
 /* The bizarre thing about this vtable is that it applies to both
diff --git a/gi/proxyutils.cpp b/gi/wrapperutils.cpp
similarity index 74%
rename from gi/proxyutils.cpp
rename to gi/wrapperutils.cpp
index 6a3295f3..4881a8e5 100644
--- a/gi/proxyutils.cpp
+++ b/gi/wrapperutils.cpp
@@ -25,21 +25,16 @@
 
 #include <string.h>
 
-#include "proxyutils.h"
+#include "gi/wrapperutils.h"
 
 /* Default spidermonkey toString is worthless.  Replace it
  * with something that gives us both the introspection name
  * and a memory address.
  */
-bool
-_gjs_proxy_to_string_func(JSContext             *context,
-                          JSObject              *this_obj,
-                          const char            *objtype,
-                          GIBaseInfo            *info,
-                          GType                  gtype,
-                          gpointer               native_address,
-                          JS::MutableHandleValue rval)
-{
+bool gjs_wrapper_to_string_func(JSContext* context, JSObject* this_obj,
+                                const char* objtype, GIBaseInfo* info,
+                                GType gtype, void* native_address,
+                                JS::MutableHandleValue rval) {
     GString *buf;
     bool ret = false;
 
@@ -49,7 +44,7 @@ _gjs_proxy_to_string_func(JSContext             *context,
     if (native_address == NULL)
         g_string_append(buf, " prototype of");
     else
-        g_string_append(buf, " instance proxy");
+        g_string_append(buf, " instance wrapper");
 
     if (info != NULL) {
         g_string_append_printf(buf, " GIName:%s.%s",
@@ -71,24 +66,18 @@ _gjs_proxy_to_string_func(JSContext             *context,
 
     ret = true;
  out:
-    g_string_free (buf, true);
+    g_string_free(buf, true);
     return ret;
 }
 
-bool
-_gjs_proxy_throw_nonexistent_field(JSContext  *cx,
-                                   GType       gtype,
-                                   const char *field_name)
-{
+bool gjs_wrapper_throw_nonexistent_field(JSContext* cx, GType gtype,
+                                         const char* field_name) {
     gjs_throw(cx, "No property %s on %s", field_name, g_type_name(gtype));
     return false;
 }
 
-bool
-_gjs_proxy_throw_readonly_field(JSContext  *cx,
-                                GType       gtype,
-                                const char *field_name)
-{
+bool gjs_wrapper_throw_readonly_field(JSContext* cx, GType gtype,
+                                      const char* field_name) {
     gjs_throw(cx, "Property %s.%s is not writable", g_type_name(gtype),
               field_name);
     return false;
diff --git a/gi/proxyutils.h b/gi/wrapperutils.h
similarity index 59%
rename from gi/proxyutils.h
rename to gi/wrapperutils.h
index a2fa0489..b3ad5789 100644
--- a/gi/proxyutils.h
+++ b/gi/wrapperutils.h
@@ -21,8 +21,8 @@
  * IN THE SOFTWARE.
  */
 
-#ifndef __GJS_PROXYUTILS_H__
-#define __GJS_PROXYUTILS_H__
+#ifndef GI_WRAPPERUTILS_H_
+#define GI_WRAPPERUTILS_H_
 
 #include "gjs/jsapi-util.h"
 #include "gjs/macros.h"
@@ -30,22 +30,17 @@
 G_BEGIN_DECLS
 
 GJS_JSAPI_RETURN_CONVENTION
-bool _gjs_proxy_to_string_func(JSContext             *context,
-                               JSObject              *this_obj,
-                               const char            *objtype,
-                               GIBaseInfo            *info,
-                               GType                  gtype,
-                               gpointer               native_address,
-                               JS::MutableHandleValue ret);
-
-bool _gjs_proxy_throw_nonexistent_field(JSContext  *cx,
-                                        GType       gtype,
-                                        const char *field_name);
-
-bool _gjs_proxy_throw_readonly_field(JSContext  *cx,
-                                     GType       gtype,
-                                     const char *field_name);
+bool gjs_wrapper_to_string_func(JSContext* cx, JSObject* this_obj,
+                                const char* objtype, GIBaseInfo* info,
+                                GType gtype, void* native_address,
+                                JS::MutableHandleValue ret);
+
+bool gjs_wrapper_throw_nonexistent_field(JSContext* cx, GType gtype,
+                                         const char* field_name);
+
+bool gjs_wrapper_throw_readonly_field(JSContext* cx, GType gtype,
+                                      const char* field_name);
 
 G_END_DECLS
 
-#endif  /* __GJS_OBJECT_H__ */
+#endif  // GI_WRAPPERUTILS_H_
diff --git a/gjs-srcs.mk b/gjs-srcs.mk
index 4a285590..bc2e8a22 100644
--- a/gjs-srcs.mk
+++ b/gjs-srcs.mk
@@ -44,8 +44,6 @@ gjs_srcs =                            \
        gi/param.h                      \
        gi/private.cpp                  \
        gi/private.h                    \
-       gi/proxyutils.cpp               \
-       gi/proxyutils.h                 \
        gi/repo.cpp                     \
        gi/repo.h                       \
        gi/toggle.cpp                   \
@@ -54,6 +52,8 @@ gjs_srcs =                            \
        gi/union.h                      \
        gi/value.cpp                    \
        gi/value.h                      \
+       gi/wrapperutils.cpp             \
+       gi/wrapperutils.h               \
        gjs/atoms.cpp                   \
        gjs/atoms.h                     \
        gjs/byteArray.cpp               \
diff --git a/gjs/gjs.stp.in b/gjs/gjs.stp.in
index 4170f23e..ae7f8951 100644
--- a/gjs/gjs.stp.in
+++ b/gjs/gjs.stp.in
@@ -1,18 +1,18 @@
 
-probe gjs.object_proxy_new = process("@EXPANDED_LIBDIR@/libgjs-gi.so.0.0.0").mark("object__proxy__new")
+probe gjs.object_wrapper_new = process("@EXPANDED_LIBDIR@/libgjs-gi.so.0.0.0").mark("object__wrapper__new")
 {
-  proxy_address = $arg1;
+  wrapper_address = $arg1;
   gobject_address = $arg2;
   gi_namespace = user_string($arg3);
   gi_name = user_string($arg4);
-  probestr = sprintf("gjs.object_proxy_new(%p, %s, %s)", proxy_address, gi_namespace, gi_name);
+  probestr = sprintf("gjs.object_wrapper_new(%p, %s, %s)", wrapper_address, gi_namespace, gi_name);
 }
 
-probe gjs.object_proxy_finalize = 
process("@EXPANDED_LIBDIR@/libgjs-gi.so.0.0.0").mark("object__proxy__finalize")
+probe gjs.object_wrapper_finalize = 
process("@EXPANDED_LIBDIR@/libgjs-gi.so.0.0.0").mark("object__wrapper__finalize")
 {
-  proxy_address = $arg1;
+  wrapper_address = $arg1;
   gobject_address = $arg2;
   gi_namespace = user_string($arg3);
   gi_name = user_string($arg4);
-  probestr = sprintf("gjs.object_proxy_finalize(%p, %s, %s)", proxy_address, gi_namespace, gi_name);
+  probestr = sprintf("gjs.object_wrapper_finalize(%p, %s, %s)", wrapper_address, gi_namespace, gi_name);
 }
diff --git a/installed-tests/debugger/print.debugger.output b/installed-tests/debugger/print.debugger.output
index 2c128fbe..36614f45 100644
--- a/installed-tests/debugger/print.debugger.output
+++ b/installed-tests/debugger/print.debugger.output
@@ -77,7 +77,7 @@ $15 = [object Function]
 }
 db> p l
 $16 = [object GObject_Object]
-[object instance proxy GIName:GObject.Object jsobj@0xADDR native@0xADDR]
+[object instance wrapper GIName:GObject.Object jsobj@0xADDR native@0xADDR]
 db> p m
 $17 = [object Error]
 Error: message
diff --git a/installed-tests/js/testGObjectDestructionAccess.js 
b/installed-tests/js/testGObjectDestructionAccess.js
index e479ff9a..79fb1834 100644
--- a/installed-tests/js/testGObjectDestructionAccess.js
+++ b/installed-tests/js/testGObjectDestructionAccess.js
@@ -88,18 +88,18 @@ describe('Access to destroyed GObject', () => {
 
     it('Proto function toString', () => {
         expect(destroyedWindow.toString()).toMatch(
-            /\[object \(FINALIZED\) instance proxy GIName:Gtk.Window jsobj@0x[a-f0-9]+ 
native@0x[a-f0-9]+\]/);
+            /\[object \(FINALIZED\) instance wrapper GIName:Gtk.Window jsobj@0x[a-f0-9]+ 
native@0x[a-f0-9]+\]/);
     });
 
     it('Porto function toString before/after', () => {
         var validWindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL});
 
         expect(validWindow.toString()).toMatch(
-            /\[object instance proxy GIName:Gtk.Window jsobj@0x[a-f0-9]+ native@0x[a-f0-9]+\]/);
+            /\[object instance wrapper GIName:Gtk.Window jsobj@0x[a-f0-9]+ native@0x[a-f0-9]+\]/);
 
         validWindow.destroy();
 
         expect(validWindow.toString()).toMatch(
-            /\[object \(FINALIZED\) instance proxy GIName:Gtk.Window jsobj@0x[a-f0-9]+ 
native@0x[a-f0-9]+\]/);
+            /\[object \(FINALIZED\) instance wrapper GIName:Gtk.Window jsobj@0x[a-f0-9]+ 
native@0x[a-f0-9]+\]/);
     });
 });


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