From 9645a86fbcb16ca83c5f4ff0dae0925ac71bb46b Mon Sep 17 00:00:00 2001 From: Benoit Germain Date: Thu, 25 Oct 2018 14:03:32 +0200 Subject: Fix Lanes build by reorganizing types around a bit --- src/deep.h | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src/deep.h') diff --git a/src/deep.h b/src/deep.h index 8e999d6..366c5a8 100644 --- a/src/deep.h +++ b/src/deep.h @@ -6,14 +6,19 @@ * said modules will have to link against lanes (it is not really possible to separate the 'deep userdata' implementation from the rest of Lanes) */ - #include "lua.h" +// forwards +struct s_Universe; +typedef struct s_Universe Universe; + +#if !defined LANES_API // when deep is compiled standalone outside Lanes #if (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC) #define LANES_API __declspec(dllexport) #else #define LANES_API #endif // (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC) +#endif // LANES_API enum eDeepOp { @@ -25,6 +30,21 @@ enum eDeepOp typedef void* (*luaG_IdFunction)( lua_State* L, enum eDeepOp op_); +// ################################################################################################ + +// this is pointed to by full userdata proxies, and allocated with malloc() to survive any lua_State lifetime +struct s_DeepPrelude +{ + volatile int refcount; + void* deep; + // when stored in a keeper state, the full userdata doesn't have a metatable, so we need direct access to the idfunc + luaG_IdFunction idfunc; +}; +typedef struct s_DeepPrelude DeepPrelude; + +char const* push_deep_proxy( Universe* U, lua_State* L, DeepPrelude* prelude, enum eLookupMode mode_); +void free_deep_prelude( lua_State* L, DeepPrelude* prelude_); + extern LANES_API int luaG_newdeepuserdata( lua_State* L, luaG_IdFunction idfunc); extern LANES_API void* luaG_todeep( lua_State* L, luaG_IdFunction idfunc, int index); extern LANES_API void luaG_pushdeepversion( lua_State* L); -- cgit v1.2.3-55-g6feb From 0ba99f2ffa8b8d6a865a7fae8fb8d0a3a5d85e06 Mon Sep 17 00:00:00 2001 From: Benoit Germain Date: Thu, 25 Oct 2018 14:32:48 +0200 Subject: More MinGW buildfixes (I hope) --- src/deep.c | 6 +++--- src/deep.h | 4 +++- src/keeper.c | 2 +- src/keeper.h | 4 +++- src/tools.c | 26 +++++++++++++------------- src/tools.h | 9 +++++---- 6 files changed, 28 insertions(+), 23 deletions(-) (limited to 'src/deep.h') diff --git a/src/deep.c b/src/deep.c index e9b7db5..82350f4 100644 --- a/src/deep.c +++ b/src/deep.c @@ -174,7 +174,7 @@ static void get_deep_lookup( lua_State* L) * Return the registered ID function for 'index' (deep userdata proxy), * or NULL if 'index' is not a deep userdata proxy. */ -static inline luaG_IdFunction get_idfunc( lua_State* L, int index, enum eLookupMode mode_) +static inline luaG_IdFunction get_idfunc( lua_State* L, int index, LookupMode mode_) { // when looking inside a keeper, we are 100% sure the object is a deep userdata if( mode_ == eLM_FromKeeper) @@ -270,7 +270,7 @@ static int deep_userdata_gc( lua_State* L) * used in this Lua state (metatable, registring it). Otherwise, increments the * reference count. */ -char const* push_deep_proxy( Universe* U, lua_State* L, DeepPrelude* prelude, enum eLookupMode mode_) +char const* push_deep_proxy( Universe* U, lua_State* L, DeepPrelude* prelude, LookupMode mode_) { DeepPrelude** proxy; @@ -519,7 +519,7 @@ void* luaG_todeep( lua_State* L, luaG_IdFunction idfunc, int index) * the id function of the copied value, or NULL for non-deep userdata * (not copied) */ -luaG_IdFunction copydeep( Universe* U, lua_State* L, lua_State* L2, int index, enum eLookupMode mode_) +luaG_IdFunction copydeep( Universe* U, lua_State* L, lua_State* L2, int index, LookupMode mode_) { char const* errmsg; luaG_IdFunction idfunc = get_idfunc( L, index, mode_); diff --git a/src/deep.h b/src/deep.h index 366c5a8..54b0c32 100644 --- a/src/deep.h +++ b/src/deep.h @@ -11,6 +11,8 @@ // forwards struct s_Universe; typedef struct s_Universe Universe; +enum eLookupMode; +typedef enum eLookupMode LookupMode; #if !defined LANES_API // when deep is compiled standalone outside Lanes #if (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC) @@ -42,7 +44,7 @@ struct s_DeepPrelude }; typedef struct s_DeepPrelude DeepPrelude; -char const* push_deep_proxy( Universe* U, lua_State* L, DeepPrelude* prelude, enum eLookupMode mode_); +char const* push_deep_proxy( Universe* U, lua_State* L, DeepPrelude* prelude, LookupMode mode_); void free_deep_prelude( lua_State* L, DeepPrelude* prelude_); extern LANES_API int luaG_newdeepuserdata( lua_State* L, luaG_IdFunction idfunc); diff --git a/src/keeper.c b/src/keeper.c index 94cf8d6..907334f 100644 --- a/src/keeper.c +++ b/src/keeper.c @@ -745,7 +745,7 @@ void keeper_release( Keeper* K) if( K) MUTEX_UNLOCK( &K->keeper_cs); } -void keeper_toggle_nil_sentinels( lua_State* L, int val_i_, enum eLookupMode mode_) +void keeper_toggle_nil_sentinels( lua_State* L, int val_i_, LookupMode mode_) { int i, n = lua_gettop( L); for( i = val_i_; i <= n; ++ i) diff --git a/src/keeper.h b/src/keeper.h index ac275c1..06cf3be 100644 --- a/src/keeper.h +++ b/src/keeper.h @@ -7,6 +7,8 @@ // forwards struct s_Universe; typedef struct s_Universe Universe; +enum eLookupMode; +typedef enum eLookupMode LookupMode; struct s_Keeper { @@ -29,7 +31,7 @@ void close_keepers( Universe* U, lua_State* L); Keeper* keeper_acquire( Keepers* keepers_, ptrdiff_t magic_); #define KEEPER_MAGIC_SHIFT 3 void keeper_release( Keeper* K); -void keeper_toggle_nil_sentinels( lua_State* L, int val_i_, enum eLookupMode const mode_); +void keeper_toggle_nil_sentinels( lua_State* L, int val_i_, LookupMode const mode_); int keeper_push_linda_storage( Universe* U, lua_State* L, void* ptr_, ptrdiff_t magic_); #define NIL_SENTINEL ((void*)keeper_toggle_nil_sentinels) diff --git a/src/tools.c b/src/tools.c index 3e3efeb..ddc879e 100644 --- a/src/tools.c +++ b/src/tools.c @@ -46,7 +46,7 @@ THE SOFTWARE. #include "lanes.h" // functions implemented in deep.c -extern luaG_IdFunction copydeep( Universe* U, lua_State* L, lua_State* L2, int index, enum eLookupMode mode_); +extern luaG_IdFunction copydeep( Universe* U, lua_State* L, lua_State* L2, int index, LookupMode mode_); extern void push_registry_subtable( lua_State* L, void* key_); char const* const CONFIG_REGKEY = "ee932492-a654-4506-9da8-f16540bdb5d4"; @@ -585,7 +585,7 @@ void populate_func_lookup_table( lua_State* L, int _i, char const* name_) DEBUGSPEW_CODE( -- U->debugspew_indent_depth); } -void call_on_state_create( Universe* U, lua_State* L, lua_State* from_, enum eLookupMode mode_) +void call_on_state_create( Universe* U, lua_State* L, lua_State* from_, LookupMode mode_) { if( U->on_state_create_func != NULL) { @@ -828,7 +828,7 @@ static int table_lookup_sentinel( lua_State* L) /* * retrieve the name of a function/table in the lookup database */ -static char const* find_lookup_name( lua_State* L, uint_t i, enum eLookupMode mode_, char const* upName_, size_t* len_) +static char const* find_lookup_name( lua_State* L, uint_t i, LookupMode mode_, char const* upName_, size_t* len_) { DEBUGSPEW_CODE( Universe* const U = universe_get( L)); char const* fqn; @@ -899,7 +899,7 @@ static char const* find_lookup_name( lua_State* L, uint_t i, enum eLookupMode mo /* * Push a looked-up table, or nothing if we found nothing */ -static bool_t lookup_table( lua_State* L2, lua_State* L, uint_t i, enum eLookupMode mode_, char const* upName_) +static bool_t lookup_table( lua_State* L2, lua_State* L, uint_t i, LookupMode mode_, char const* upName_) { // get the name of the table we want to send size_t len; @@ -1195,7 +1195,7 @@ int luaG_nameof( lua_State* L) /* * Push a looked-up native/LuaJIT function. */ -static void lookup_native_func( lua_State* L2, lua_State* L, uint_t i, enum eLookupMode mode_, char const* upName_) +static void lookup_native_func( lua_State* L2, lua_State* L, uint_t i, LookupMode mode_, char const* upName_) { // get the name of the function we want to send size_t len; @@ -1276,9 +1276,9 @@ enum e_vt VT_KEY, VT_METATABLE }; -static bool_t inter_copy_one_( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, uint_t i, enum e_vt value_type, enum eLookupMode mode_, char const* upName_); +static bool_t inter_copy_one_( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, uint_t i, enum e_vt value_type, LookupMode mode_, char const* upName_); -static void inter_copy_func( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, uint_t i, enum eLookupMode mode_, char const* upName_) +static void inter_copy_func( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, uint_t i, LookupMode mode_, char const* upName_) { int n, needToPush; luaL_Buffer b; @@ -1427,7 +1427,7 @@ static void inter_copy_func( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_ * * Always pushes a function to 'L2'. */ -static void push_cached_func( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, uint_t i, enum eLookupMode mode_, char const* upName_) +static void push_cached_func( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, uint_t i, LookupMode mode_, char const* upName_) { FuncSubType funcSubType; /*lua_CFunction cfunc =*/ luaG_tocfunction( L, i, &funcSubType); // NULL for LuaJIT-fast && bytecode functions @@ -1480,7 +1480,7 @@ static void push_cached_func( Universe* U, lua_State* L2, uint_t L2_cache_i, lua } } -static void inter_copy_keyvaluepair( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, enum e_vt vt, enum eLookupMode mode_, char const* upName_) +static void inter_copy_keyvaluepair( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, enum e_vt vt, LookupMode mode_, char const* upName_) { uint_t val_i = lua_gettop( L); uint_t key_i = val_i - 1; @@ -1542,7 +1542,7 @@ static void inter_copy_keyvaluepair( Universe* U, lua_State* L2, uint_t L2_cache * * Returns TRUE if value was pushed, FALSE if its type is non-supported. */ -static bool_t inter_copy_one_( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, uint_t i, enum e_vt vt, enum eLookupMode mode_, char const* upName_) +static bool_t inter_copy_one_( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, uint_t i, enum e_vt vt, LookupMode mode_, char const* upName_) { bool_t ret = TRUE; bool_t ignore = FALSE; @@ -1809,7 +1809,7 @@ static bool_t inter_copy_one_( Universe* U, lua_State* L2, uint_t L2_cache_i, lu * * Note: Parameters are in this order ('L' = from first) to be same as 'lua_xmove'. */ -int luaG_inter_copy( Universe* U, lua_State* L, lua_State* L2, uint_t n, enum eLookupMode mode_) +int luaG_inter_copy( Universe* U, lua_State* L, lua_State* L2, uint_t n, LookupMode mode_) { uint_t top_L = lua_gettop( L); uint_t top_L2 = lua_gettop( L2); @@ -1867,14 +1867,14 @@ int luaG_inter_copy( Universe* U, lua_State* L, lua_State* L2, uint_t n, enum eL } -int luaG_inter_move( Universe* U, lua_State* L, lua_State* L2, uint_t n, enum eLookupMode mode_) +int luaG_inter_move( Universe* U, lua_State* L, lua_State* L2, uint_t n, LookupMode mode_) { int ret = luaG_inter_copy( U, L, L2, n, mode_); lua_pop( L, (int) n); return ret; } -int luaG_inter_copy_package( Universe* U, lua_State* L, lua_State* L2, int package_idx_, enum eLookupMode mode_) +int luaG_inter_copy_package( Universe* U, lua_State* L, lua_State* L2, int package_idx_, LookupMode mode_) { DEBUGSPEW_CODE( fprintf( stderr, INDENT_BEGIN "luaG_inter_copy_package()\n" INDENT_END)); DEBUGSPEW_CODE( ++ U->debugspew_indent_depth); diff --git a/src/tools.h b/src/tools.h index ac69074..df429f7 100644 --- a/src/tools.h +++ b/src/tools.h @@ -31,11 +31,12 @@ enum eLookupMode eLM_ToKeeper, // send a function from a lane to a keeper state eLM_FromKeeper // send a function from a keeper state to a lane }; +typedef enum eLookupMode LookupMode; -int luaG_inter_copy_package( Universe* U, lua_State* L, lua_State* L2, int package_idx_, enum eLookupMode mode_); +int luaG_inter_copy_package( Universe* U, lua_State* L, lua_State* L2, int package_idx_, LookupMode mode_); -int luaG_inter_copy( Universe* U, lua_State* L, lua_State* L2, uint_t n, enum eLookupMode mode_); -int luaG_inter_move( Universe* U, lua_State* L, lua_State* L2, uint_t n, enum eLookupMode mode_); +int luaG_inter_copy( Universe* U, lua_State* L, lua_State* L2, uint_t n, LookupMode mode_); +int luaG_inter_move( Universe* U, lua_State* L, lua_State* L2, uint_t n, LookupMode mode_); int luaG_nameof( lua_State* L); int luaG_new_require( lua_State* L); @@ -43,7 +44,7 @@ int luaG_new_require( lua_State* L); void populate_func_lookup_table( lua_State* L, int _i, char const* _name); void serialize_require( Universe* U, lua_State *L); void initialize_on_state_create( Universe* U, lua_State* L); -void call_on_state_create( Universe* U, lua_State* L, lua_State* from_, enum eLookupMode mode_); +void call_on_state_create( Universe* U, lua_State* L, lua_State* from_, LookupMode mode_); // ################################################################################################ -- cgit v1.2.3-55-g6feb From 611599ad979eee1364519fc9c3fb6103fd9fa9c6 Mon Sep 17 00:00:00 2001 From: Benoit Germain Date: Thu, 25 Oct 2018 18:38:22 +0200 Subject: Fix DLL exports --- src/deep.h | 1 + src/lanes.h | 1 + src/platform.h | 24 ++++++++++++++++++++++++ src/threading.h | 22 ++-------------------- 4 files changed, 28 insertions(+), 20 deletions(-) create mode 100644 src/platform.h (limited to 'src/deep.h') diff --git a/src/deep.h b/src/deep.h index 54b0c32..aeeb828 100644 --- a/src/deep.h +++ b/src/deep.h @@ -7,6 +7,7 @@ */ #include "lua.h" +#include "platform.h" // forwards struct s_Universe; diff --git a/src/lanes.h b/src/lanes.h index d07750a..23fa711 100644 --- a/src/lanes.h +++ b/src/lanes.h @@ -2,6 +2,7 @@ #define __lanes_h__ 1 #include "lua.h" +#include "platform.h" #if (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC) #define LANES_API __declspec(dllexport) diff --git a/src/platform.h b/src/platform.h new file mode 100644 index 0000000..da5264e --- /dev/null +++ b/src/platform.h @@ -0,0 +1,24 @@ +#ifndef __LANES_PLATFORM_H__ +#define __LANES_PLATFORM_H__ 1 + +#ifdef _WIN32_WCE + #define PLATFORM_POCKETPC +#elif defined(_XBOX) + #define PLATFORM_XBOX +#elif (defined _WIN32) + #define PLATFORM_WIN32 +#elif (defined __linux__) + #define PLATFORM_LINUX +#elif (defined __APPLE__) && (defined __MACH__) + #define PLATFORM_OSX +#elif (defined __NetBSD__) || (defined __FreeBSD__) || (defined BSD) + #define PLATFORM_BSD +#elif (defined __QNX__) + #define PLATFORM_QNX +#elif (defined __CYGWIN__) + #define PLATFORM_CYGWIN +#else + #error "Unknown platform!" +#endif + +#endif // __LANES_PLATFORM_H__ diff --git a/src/threading.h b/src/threading.h index bfa9ab8..4114dba 100644 --- a/src/threading.h +++ b/src/threading.h @@ -4,30 +4,12 @@ #ifndef __threading_h__ #define __threading_h__ 1 -/* Platform detection +/* * win32-pthread: * define HAVE_WIN32_PTHREAD and PTW32_INCLUDE_WINDOWS_H in your project configuration when building for win32-pthread. * link against pthreadVC2.lib, and of course have pthreadVC2.dll somewhere in your path. */ -#ifdef _WIN32_WCE - #define PLATFORM_POCKETPC -#elif defined(_XBOX) - #define PLATFORM_XBOX -#elif (defined _WIN32) - #define PLATFORM_WIN32 -#elif (defined __linux__) - #define PLATFORM_LINUX -#elif (defined __APPLE__) && (defined __MACH__) - #define PLATFORM_OSX -#elif (defined __NetBSD__) || (defined __FreeBSD__) || (defined BSD) - #define PLATFORM_BSD -#elif (defined __QNX__) - #define PLATFORM_QNX -#elif (defined __CYGWIN__) - #define PLATFORM_CYGWIN -#else - #error "Unknown platform!" -#endif +#include "platform.h" typedef int bool_t; #ifndef FALSE -- cgit v1.2.3-55-g6feb