summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ld-library.c34
-rw-r--r--src/ld-lua.c37
-rw-r--r--src/ld-lua.h14
3 files changed, 55 insertions, 30 deletions
diff --git a/src/ld-library.c b/src/ld-library.c
index 66d8709..8fe3a41 100644
--- a/src/ld-library.c
+++ b/src/ld-library.c
@@ -43,19 +43,17 @@ G_DEFINE_TYPE (LdLibrary, ld_library, G_TYPE_OBJECT);
static void
ld_library_finalize (GObject *gobject);
-static LdSymbolCategory *
-load_category (LdLibrary *self, const char *path, const char *name);
+static LdSymbolCategory *load_category
+ (LdLibrary *self, const char *path, const char *name);
-static gboolean
-foreach_dir (const gchar *path,
+static gboolean foreach_dir (const gchar *path,
gboolean (*callback) (const gchar *, const gchar *, gpointer),
gpointer userdata, GError **error);
-static gboolean
-load_category_cb (const gchar *base,
- const gchar *filename, gpointer userdata);
-static gboolean
-ld_library_load_cb (const gchar *base,
+static gboolean load_category_cb (const gchar *base,
const gchar *filename, gpointer userdata);
+static void load_category_symbol_cb (LdSymbol *symbol, gpointer user_data);
+static gboolean ld_library_load_cb
+ (const gchar *base, const gchar *filename, gpointer userdata);
static void
@@ -227,13 +225,25 @@ load_category_cb (const gchar *base, const gchar *filename, gpointer userdata)
data = (LoadCategoryData *) userdata;
if (ld_lua_check_file (data->self->priv->lua, filename))
- ld_lua_load_file_to_category
- (data->self->priv->lua, filename, data->cat);
-
+ ld_lua_load_file (data->self->priv->lua, filename,
+ load_category_symbol_cb, data->cat);
return TRUE;
}
/*
+ * load_category_symbol_cb:
+ *
+ * Insert newly registered symbols into the category.
+ */
+static void
+load_category_symbol_cb (LdSymbol *symbol, gpointer user_data)
+{
+ /* TODO: Don't just add blindly, also check for name collisions. */
+ ld_symbol_category_insert_child
+ (LD_SYMBOL_CATEGORY (user_data), G_OBJECT (symbol), -1);
+}
+
+/*
* LibraryLoadData:
*
* Data shared between ld_library_load() and ld_library_load_cb().
diff --git a/src/ld-lua.c b/src/ld-lua.c
index 0874d10..de30a6d 100644
--- a/src/ld-lua.c
+++ b/src/ld-lua.c
@@ -16,7 +16,6 @@
#include "config.h"
#include "ld-symbol.h"
-#include "ld-symbol-category.h"
#include "ld-library.h"
#include "ld-lua.h"
@@ -62,14 +61,16 @@ static void *ld_lua_alloc (void *ud, void *ptr, size_t osize, size_t nsize);
/*
* LdLuaData:
* @self: A reference to self.
- * @category: A reference to parent category of the currently processed file.
+ * @load_callback: A callback for newly registered symbols.
+ * @load_user_data: User data to be passed to the callback.
*
* Full user data to be stored in Lua registry.
*/
typedef struct
{
LdLua *self;
- LdSymbolCategory *category;
+ LdLuaLoadCallback load_callback;
+ gpointer load_user_data;
}
LdLuaData;
@@ -164,7 +165,8 @@ ld_lua_init (LdLua *self)
/* Store user data to the registry. */
ud = lua_newuserdata (L, sizeof (LdLuaData));
ud->self = self;
- ud->category = NULL;
+ ud->load_callback = NULL;
+ ud->load_user_data = NULL;
lua_setfield (L, LUA_REGISTRYINDEX, LD_LUA_DATA_INDEX);
@@ -224,25 +226,26 @@ ld_lua_check_file (LdLua *self, const gchar *filename)
}
/**
- * ld_lua_load_file_to_category:
+ * ld_lua_load_file:
* @self: An #LdLua object.
* @filename: The file to be loaded.
- * @category: An #LdSymbolCategory object.
+ * @callback: A callback for newly registered symbols.
+ * @user_data: User data to be passed to the callback.
*
- * Loads a file and appends contained symbols into the category.
+ * Loads a file and creates #LdLuaSymbol objects for contained symbols.
*
* Returns: TRUE if no error has occured, FALSE otherwise.
*/
gboolean
-ld_lua_load_file_to_category (LdLua *self, const gchar *filename,
- LdSymbolCategory *category)
+ld_lua_load_file (LdLua *self, const gchar *filename,
+ LdLuaLoadCallback callback, gpointer user_data)
{
gint retval;
LdLuaData *ud;
g_return_val_if_fail (LD_IS_LUA (self), FALSE);
g_return_val_if_fail (filename != NULL, FALSE);
- g_return_val_if_fail (LD_IS_SYMBOL_CATEGORY (category), FALSE);
+ g_return_val_if_fail (callback != NULL, FALSE);
/* XXX: If something from the following fails, Lua will call exit(). */
lua_getfield (self->priv->L, LUA_REGISTRYINDEX, LD_LUA_DATA_INDEX);
@@ -250,7 +253,8 @@ ld_lua_load_file_to_category (LdLua *self, const gchar *filename,
lua_pop (self->priv->L, 1);
g_return_val_if_fail (ud != NULL, FALSE);
- ud->category = category;
+ ud->load_callback = callback;
+ ud->load_user_data = user_data;
retval = luaL_loadfile (self->priv->L, filename);
if (retval)
@@ -260,14 +264,16 @@ ld_lua_load_file_to_category (LdLua *self, const gchar *filename,
if (retval)
goto ld_lua_lftc_fail;
- ud->category = NULL;
+ ud->load_callback = NULL;
+ ud->load_user_data = NULL;
return TRUE;
ld_lua_lftc_fail:
g_warning ("Lua error: %s", lua_tostring (self->priv->L, -1));
lua_remove (self->priv->L, -1);
- ud->category = NULL;
+ ud->load_callback = NULL;
+ ud->load_user_data = NULL;
return FALSE;
}
@@ -409,9 +415,8 @@ ld_lua_logdiag_register (lua_State *L)
lua_settable (L, -3);
- /* Insert the symbol into the category. */
- /* TODO: Don't just add blindly, also check for name collisions. */
- ld_symbol_category_insert_child (ud->category, G_OBJECT (symbol), -1);
+ /* The caller is responsible for referencing the symbol. */
+ ud->load_callback (LD_SYMBOL (symbol), ud->load_user_data);
g_object_unref (symbol);
return 0;
diff --git a/src/ld-lua.h b/src/ld-lua.h
index ea00863..b207d66 100644
--- a/src/ld-lua.h
+++ b/src/ld-lua.h
@@ -46,12 +46,22 @@ struct _LdLuaClass
};
+/**
+ * LdLuaLoadCallback:
+ * @symbol: The symbol that has been created.
+ * @user_data: User data passed to ld_lua_load_file().
+ *
+ * A callback function that is called when a symbol is created.
+ */
+typedef void (*LdLuaLoadCallback) (LdSymbol *symbol, gpointer user_data);
+
+
GType ld_lua_get_type (void) G_GNUC_CONST;
LdLua *ld_lua_new (void);
gboolean ld_lua_check_file (LdLua *self, const gchar *filename);
-gboolean ld_lua_load_file_to_category (LdLua *self, const gchar *filename,
- LdSymbolCategory *category);
+gboolean ld_lua_load_file (LdLua *self, const gchar *filename,
+ LdLuaLoadCallback callback, gpointer user_data);
G_END_DECLS