[Pkg-mozext-commits] [firetray] 139/399: "Grab the latest iteration of ctypes-utils.jsm" from messagingmenu-extension

David Prévot taffit at alioth.debian.org
Tue Oct 29 18:23:29 UTC 2013


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch dfsg-clean
in repository firetray.

commit 6fc5ff1a0549b739c69e3a22908b945e48c472ec
Author: foudfou <foudil.newbie+git at gmail.com>
Date:   Sun Jan 15 21:26:46 2012 +0100

    "Grab the latest iteration of ctypes-utils.jsm" from messagingmenu-extension
---
 src/modules/commons.js                  |    3 +-
 src/modules/ctypes/cairo.jsm            |    4 +-
 src/modules/ctypes/ctypes-utils.jsm     |   91 +++++++++++++++++++++++++++----
 src/modules/ctypes/gdk.jsm              |    4 +-
 src/modules/ctypes/glib.jsm             |    4 +-
 src/modules/ctypes/gobject.jsm          |    4 +-
 src/modules/ctypes/gtk.jsm              |    4 +-
 src/modules/ctypes/libc.jsm             |    4 +-
 src/modules/ctypes/pango.jsm            |   15 +----
 src/modules/ctypes/x11.jsm              |    4 +-
 src/modules/gtk2/FiretrayStatusIcon.jsm |    3 +-
 11 files changed, 93 insertions(+), 47 deletions(-)

diff --git a/src/modules/commons.js b/src/modules/commons.js
index e9b08b8..6f6a890 100644
--- a/src/modules/commons.js
+++ b/src/modules/commons.js
@@ -174,7 +174,6 @@ firetray.Utils = {
   tryCloseLibs: function(libs) {
     try {
       libs.forEach(function(lib) {
-        LOG("try closing "+lib.name);
         if (lib.available())
           lib.close();
       });
@@ -183,6 +182,8 @@ firetray.Utils = {
 
 };
 
+////////////////////////// more fundamental helpers //////////////////////////
+
 // http://stackoverflow.com/questions/767486/how-do-you-check-if-a-variable-is-an-array-in-javascript
 function isArray(o) {
   return getType(o) === '[object Array]';
diff --git a/src/modules/ctypes/cairo.jsm b/src/modules/ctypes/cairo.jsm
index dee2069..7a3bccc 100644
--- a/src/modules/ctypes/cairo.jsm
+++ b/src/modules/ctypes/cairo.jsm
@@ -23,6 +23,4 @@ function cairo_defines(lib) {
 
 }
 
-if (!cairo) {
-  var cairo = new ctypes_library(CAIRO_LIBNAME, CAIRO_ABIS, cairo_defines);
-}
+new ctypes_library(CAIRO_LIBNAME, CAIRO_ABIS, cairo_defines, this);
diff --git a/src/modules/ctypes/ctypes-utils.jsm b/src/modules/ctypes/ctypes-utils.jsm
index 7cf8f7f..b8ab0b8 100644
--- a/src/modules/ctypes/ctypes-utils.jsm
+++ b/src/modules/ctypes/ctypes-utils.jsm
@@ -44,12 +44,72 @@ Cu.import("resource://firetray/logging.jsm");
 
 var EXPORTED_SYMBOLS  = [ "ctypes_library" ];
 
-function ctypes_library(name, abis, defines) {
+/**
+ * Loads a library using ctypes and exports an object on to the specified
+ * global object. The name of the exported object will be the first name
+ * specified in the global objects EXPORTED_SYMBOLS list.
+ *
+ * It is an error to call this function more than once in a JS module. This
+ * implies that you should have one JS module per ctypes library.
+ *
+ * In addition to native types and functions, the exported object will contain
+ * some additional utility functions:
+ *
+ * close      Close the library and unload the JS module
+ * available  Returns true if the library is available, false otherwise
+ * ABI        A property containing the library ABI loaded (or -1 if unavailable)
+ *
+ * @param  aName
+ *         The name of the library to load, without the "lib" prefix or any
+ *         file extension.
+ *
+ * @param  aABIs
+ *         An array of library ABI's to search for. The first one found will
+ *         be loaded and the loaded ABI will be saved on the exported object.
+ *
+ * @param  aDefines
+ *         A function which will be called to load library symbols and create
+ *         types. The function will be called with one parameter, which contains
+ *         several functions for binding symbols. The "this" object will be
+ *         the exported object, on to which you can should types and symbols.
+ *
+ * @param  aGlobal
+ *         The global object on to which we export an object. This must be a
+ *         a valid JSM global object.
+ *
+ */
+function ctypes_library(aName, aABIs, aDefines, aGlobal) {
   try {
-    LOG("Loading library: " + name);
+    LOG("Trying to load library: " + aName);
+
+    if (typeof(aName) != "string") {
+      throw Error("Invalid library name");
+    }
+
+    if (!aABIs || typeof(aABIs) != "object") {
+      throw Error("Invalid range of library ABI's");
+    }
+
+    if (typeof(aDefines) != "function") {
+      throw Error("Invalid defines function");
+    }
+
+    if (!aGlobal || typeof(aGlobal) != "object" || !aGlobal.EXPORTED_SYMBOLS ||
+        typeof(aGlobal.EXPORTED_SYMBOLS) != "object") {
+      throw Error("Must specify a valid global object from a loaded JS module");
+    }
+
+    if (!("__URI__" in aGlobal) || !aGlobal.__URI__) {
+      throw Error("This JS module has already been unloaded");
+    }
+
+    if (aGlobal[aGlobal.EXPORTED_SYMBOLS[0]]) {
+      throw Error("Was ctypes_library() called more than once for this module?");
+    }
+
     var library;
-    for each (let abi in abis) {
-      let soname = "lib" + name + ".so." + abi.toString();
+    for each (let abi in aABIs) {
+      let soname = "lib" + aName + ".so." + abi.toString();
       LOG("Trying " + soname);
       try {
         library = ctypes.open(soname);
@@ -61,11 +121,18 @@ function ctypes_library(name, abis, defines) {
       }
     }
 
-    this.name = name;
-
     this.close = function() {
+      LOG("Closing library " + aName);
       library.close();
       this.ABI = -1;
+
+      if (!("__URI__" in aGlobal) || !aGlobal.__URI__) {
+        // We could have already been unloaded by now
+        return;
+      }
+
+      LOG("Unloading JS module " + aGlobal.__URI__);
+      Cu.unload(aGlobal.__URI__);
     };
 
     this.available = function() {
@@ -73,7 +140,7 @@ function ctypes_library(name, abis, defines) {
     };
 
     if (!library) {
-      LOG("Failed to load library: " + name);
+      LOG("Failed to load library: " + aName);
       this.ABI = -1;
       return;
     }
@@ -91,7 +158,8 @@ function ctypes_library(name, abis, defines) {
 
           return library.declare.apply(library, args);
         } catch (ex) {
-          ERROR("Missing symbol " + arguments[0] + " in library " + name);
+          Cu.reportError(ex);
+          ERROR("Missing symbol " + arguments[0] + " in library " + aName);
           self.ABI = -1;
           return null;
         }
@@ -109,9 +177,12 @@ function ctypes_library(name, abis, defines) {
       }
     };
 
-    defines.call(this, lib);
+    aDefines.call(this, lib);
+
+    aGlobal[aGlobal.EXPORTED_SYMBOLS[0]] = this;
   } catch(e) {
-    ERROR(name+" definition error: "+e);
+    Cu.reportError(e);
+    ERROR(aName+" definition error: "+e);
     this.ABI = -1;
   }
 }
diff --git a/src/modules/ctypes/gdk.jsm b/src/modules/ctypes/gdk.jsm
index ebd8cef..940d9ba 100644
--- a/src/modules/ctypes/gdk.jsm
+++ b/src/modules/ctypes/gdk.jsm
@@ -235,6 +235,4 @@ function gdk_defines(lib) {
 
 }
 
-if (!gdk) {
-  var gdk = new ctypes_library(GDK_LIBNAME, GDK_ABIS, gdk_defines);
-}
+new ctypes_library(GDK_LIBNAME, GDK_ABIS, gdk_defines, this);
diff --git a/src/modules/ctypes/glib.jsm b/src/modules/ctypes/glib.jsm
index 67b2c50..a411d4a 100644
--- a/src/modules/ctypes/glib.jsm
+++ b/src/modules/ctypes/glib.jsm
@@ -18,6 +18,4 @@ function glib_defines(lib) {
   this.GError = ctypes.StructType("GError");
 };
 
-if (!glib) {
-  var glib = new ctypes_library(GLIB_LIBNAME, GLIB_ABIS, glib_defines);
-}
+new ctypes_library(GLIB_LIBNAME, GLIB_ABIS, glib_defines, this);
diff --git a/src/modules/ctypes/gobject.jsm b/src/modules/ctypes/gobject.jsm
index ac33fec..8d56d58 100644
--- a/src/modules/ctypes/gobject.jsm
+++ b/src/modules/ctypes/gobject.jsm
@@ -151,6 +151,4 @@ function gobject_defines(lib) {
 
 }
 
-if (!gobject) {
-  var gobject = new ctypes_library(GOBJECT_LIBNAME, GOBJECT_ABIS, gobject_defines);
-}
+new ctypes_library(GOBJECT_LIBNAME, GOBJECT_ABIS, gobject_defines, this);
diff --git a/src/modules/ctypes/gtk.jsm b/src/modules/ctypes/gtk.jsm
index e64cceb..875aac0 100644
--- a/src/modules/ctypes/gtk.jsm
+++ b/src/modules/ctypes/gtk.jsm
@@ -112,6 +112,4 @@ function gtk_defines(lib) {
 
 }
 
-if (!gtk) {
-  var gtk = new ctypes_library(GTK_LIBNAME, GTK_ABIS, gtk_defines);
-}
+new ctypes_library(GTK_LIBNAME, GTK_ABIS, gtk_defines, this);
diff --git a/src/modules/ctypes/libc.jsm b/src/modules/ctypes/libc.jsm
index 1f7315c..d3ae68a 100644
--- a/src/modules/ctypes/libc.jsm
+++ b/src/modules/ctypes/libc.jsm
@@ -25,6 +25,4 @@ function libc_defines(lib) {
   lib.lazy_bind("strcmp", ctypes.int, ctypes.char.ptr, ctypes.char.ptr);
 };
 
-if (!libc) {
-  var libc = new ctypes_library(LIBC_LIBNAME, LIBC_ABIS, libc_defines);
-}
+var libc = new ctypes_library(LIBC_LIBNAME, LIBC_ABIS, libc_defines, this);
diff --git a/src/modules/ctypes/pango.jsm b/src/modules/ctypes/pango.jsm
index da82217..0ed5622 100644
--- a/src/modules/ctypes/pango.jsm
+++ b/src/modules/ctypes/pango.jsm
@@ -4,8 +4,6 @@ var EXPORTED_SYMBOLS = [ "pango", "pangocairo" ];
 
 const PANGO_LIBNAME = "pango-1.0";
 const PANGO_ABIS    = [ 0 ];
-const PANGOCAIRO_LIBNAME = "pangocairo-1.0";
-const PANGOCAIRO_ABIS    = [ 0 ];
 
 const Cu = Components.utils;
 const Cc = Components.classes;
@@ -46,15 +44,4 @@ function pango_defines(lib) {
 
 }
 
-if (!pango) {
-  var pango = new ctypes_library(PANGO_LIBNAME, PANGO_ABIS, pango_defines);
-}
-
-
-function pangocairo_defines(lib) {
-  lib.lazy_bind("pango_cairo_show_layout", ctypes.void_t, cairo.cairo_t.ptr, pango.PangoLayout.ptr);
-}
-
-if (!pangocairo) {
-  var pangocairo = new ctypes_library(PANGOCAIRO_LIBNAME, PANGOCAIRO_ABIS, pangocairo_defines);
-}
+new ctypes_library(PANGO_LIBNAME, PANGO_ABIS, pango_defines, this);
diff --git a/src/modules/ctypes/x11.jsm b/src/modules/ctypes/x11.jsm
index 97c8a78..af41410 100644
--- a/src/modules/ctypes/x11.jsm
+++ b/src/modules/ctypes/x11.jsm
@@ -130,9 +130,7 @@ function x11_defines(lib) {
 
 }
 
-if (!x11) {
-  var x11 = new ctypes_library(X11_LIBNAME, X11_ABIS, x11_defines);
-}
+new ctypes_library(X11_LIBNAME, X11_ABIS, x11_defines, this);
 
 
 /* Xorg 1.10.4
diff --git a/src/modules/gtk2/FiretrayStatusIcon.jsm b/src/modules/gtk2/FiretrayStatusIcon.jsm
index 5dcbb1f..e798254 100644
--- a/src/modules/gtk2/FiretrayStatusIcon.jsm
+++ b/src/modules/gtk2/FiretrayStatusIcon.jsm
@@ -15,6 +15,7 @@ Cu.import("resource://firetray/ctypes/gdk.jsm");
 Cu.import("resource://firetray/ctypes/gtk.jsm");
 Cu.import("resource://firetray/ctypes/libc.jsm");
 Cu.import("resource://firetray/ctypes/pango.jsm");
+Cu.import("resource://firetray/ctypes/pangocairo.jsm");
 Cu.import("resource://firetray/commons.js");
 
 if ("undefined" == typeof(firetray.Handler))
@@ -55,7 +56,7 @@ firetray.StatusIcon = {
   },
 
   shutdown: function() {
-    firetray.Utils.tryCloseLibs([cairo, gobject, gdk, gtk, pango]);
+    firetray.Utils.tryCloseLibs([cairo, gobject, gdk, gtk, pango, pangocairo]);
     this.initialized = false;
   },
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/firetray.git



More information about the Pkg-mozext-commits mailing list