diff options
author | Benoit Germain <bnt.germain@gmail.com> | 2018-11-23 17:42:49 +0100 |
---|---|---|
committer | Benoit Germain <bnt.germain@gmail.com> | 2018-11-23 17:42:49 +0100 |
commit | 60e5d94af372471c2a3bab91963588ca650bff7b (patch) | |
tree | 2543e07bd34b7fe48ce953039b4b76c6dcc6e1dc /src | |
parent | cb0f60d743fb4a5420d1e6cca0404507c4e50642 (diff) | |
download | lanes-60e5d94af372471c2a3bab91963588ca650bff7b.tar.gz lanes-60e5d94af372471c2a3bab91963588ca650bff7b.tar.bz2 lanes-60e5d94af372471c2a3bab91963588ca650bff7b.zip |
finish registry access revamp
Diffstat (limited to 'src')
-rw-r--r-- | src/lanes.c | 52 | ||||
-rw-r--r-- | src/tools.c | 12 |
2 files changed, 28 insertions, 36 deletions
diff --git a/src/lanes.c b/src/lanes.c index f32cf6e..c8e012c 100644 --- a/src/lanes.c +++ b/src/lanes.c | |||
@@ -154,8 +154,8 @@ static void cancel_hook( lua_State* L, lua_Debug* ar) | |||
154 | 154 | ||
155 | #if ERROR_FULL_STACK | 155 | #if ERROR_FULL_STACK |
156 | static int lane_error( lua_State* L); | 156 | static int lane_error( lua_State* L); |
157 | // crc64/we of string "STACK_TRACE_KEY" generated at http://www.nitrxgen.net/hashgen/ | 157 | // crc64/we of string "STACKTRACE_REGKEY" generated at http://www.nitrxgen.net/hashgen/ |
158 | static DECLARE_CONST_UNIQUE_KEY( STACK_TRACE_KEY, 0x024d5411677ce879); | 158 | static DECLARE_CONST_UNIQUE_KEY( STACKTRACE_REGKEY, 0x534af7d3226a429f); |
159 | #endif // ERROR_FULL_STACK | 159 | #endif // ERROR_FULL_STACK |
160 | 160 | ||
161 | /* | 161 | /* |
@@ -166,8 +166,8 @@ static DECLARE_CONST_UNIQUE_KEY( STACK_TRACE_KEY, 0x024d5411677ce879); | |||
166 | * error (and maybe stack trace) parameters to the finalizer functions would | 166 | * error (and maybe stack trace) parameters to the finalizer functions would |
167 | * anyways complicate that approach. | 167 | * anyways complicate that approach. |
168 | */ | 168 | */ |
169 | // crc64/we of string "STACK_TRACE_KEY" generated at http://www.nitrxgen.net/hashgen/ | 169 | // crc64/we of string "FINALIZER_REGKEY" generated at http://www.nitrxgen.net/hashgen/ |
170 | static DECLARE_CONST_UNIQUE_KEY( FINALIZER_REG_KEY, 0x7902972781c7e365); | 170 | static DECLARE_CONST_UNIQUE_KEY( FINALIZER_REGKEY, 0x188fccb8bf348e09); |
171 | 171 | ||
172 | struct s_Linda; | 172 | struct s_Linda; |
173 | 173 | ||
@@ -209,9 +209,7 @@ static bool_t push_registry_table( lua_State* L, UniqueKey key, bool_t create) | |||
209 | } | 209 | } |
210 | 210 | ||
211 | lua_newtable( L); // t | 211 | lua_newtable( L); // t |
212 | push_unique_key( L, key); // t key | 212 | REGISTRY_SET( L, key, lua_pushvalue( L, -2)); |
213 | lua_pushvalue( L, -2); // t key t | ||
214 | lua_rawset( L, LUA_REGISTRYINDEX); // t | ||
215 | } | 213 | } |
216 | STACK_END( L, 1); | 214 | STACK_END( L, 1); |
217 | return TRUE; // table pushed | 215 | return TRUE; // table pushed |
@@ -318,7 +316,7 @@ LUAG_FUNC( set_finalizer) | |||
318 | luaL_argcheck( L, lua_isfunction( L, 1), 1, "finalizer should be a function"); | 316 | luaL_argcheck( L, lua_isfunction( L, 1), 1, "finalizer should be a function"); |
319 | luaL_argcheck( L, lua_gettop( L) == 1, 1, "too many arguments"); | 317 | luaL_argcheck( L, lua_gettop( L) == 1, 1, "too many arguments"); |
320 | // Get the current finalizer table (if any) | 318 | // Get the current finalizer table (if any) |
321 | push_registry_table( L, FINALIZER_REG_KEY, TRUE /*do create if none*/); // finalizer {finalisers} | 319 | push_registry_table( L, FINALIZER_REGKEY, TRUE /*do create if none*/); // finalizer {finalisers} |
322 | STACK_GROW( L, 2); | 320 | STACK_GROW( L, 2); |
323 | lua_pushinteger( L, lua_rawlen( L, -1) + 1); // finalizer {finalisers} idx | 321 | lua_pushinteger( L, lua_rawlen( L, -1) + 1); // finalizer {finalisers} idx |
324 | lua_pushvalue( L, 1); // finalizer {finalisers} idx finalizer | 322 | lua_pushvalue( L, 1); // finalizer {finalisers} idx finalizer |
@@ -349,7 +347,7 @@ static int run_finalizers( lua_State* L, int lua_rc) | |||
349 | int n; | 347 | int n; |
350 | int err_handler_index = 0; | 348 | int err_handler_index = 0; |
351 | int rc = LUA_OK; // ... | 349 | int rc = LUA_OK; // ... |
352 | if( !push_registry_table( L, FINALIZER_REG_KEY, FALSE)) // ... finalizers? | 350 | if( !push_registry_table( L, FINALIZER_REGKEY, FALSE)) // ... finalizers? |
353 | { | 351 | { |
354 | return 0; // no finalizers | 352 | return 0; // no finalizers |
355 | } | 353 | } |
@@ -382,7 +380,7 @@ static int run_finalizers( lua_State* L, int lua_rc) | |||
382 | args = finalizers_index - 1; | 380 | args = finalizers_index - 1; |
383 | } | 381 | } |
384 | 382 | ||
385 | // if no error from the main body, finlizer doesn't receive any argument, else it gets the error message and optional stack trace | 383 | // if no error from the main body, finalizer doesn't receive any argument, else it gets the error message and optional stack trace |
386 | rc = lua_pcall( L, args, 0, err_handler_index); // ... finalizers lane_error err_msg2? | 384 | rc = lua_pcall( L, args, 0, err_handler_index); // ... finalizers lane_error err_msg2? |
387 | if( rc != LUA_OK) | 385 | if( rc != LUA_OK) |
388 | { | 386 | { |
@@ -832,8 +830,8 @@ LUAG_FUNC( set_singlethreaded) | |||
832 | */ | 830 | */ |
833 | #if ERROR_FULL_STACK | 831 | #if ERROR_FULL_STACK |
834 | 832 | ||
835 | // crc64/we of string "EXTENDED_STACK_TRACE_REGKEY" generated at http://www.nitrxgen.net/hashgen/ | 833 | // crc64/we of string "EXTENDED_STACKTRACE_REGKEY" generated at http://www.nitrxgen.net/hashgen/ |
836 | static DECLARE_CONST_UNIQUE_KEY( EXTENDED_STACK_TRACE_REGKEY, 0x7a59821071066e49); // used as registry key | 834 | static DECLARE_CONST_UNIQUE_KEY( EXTENDED_STACKTRACE_REGKEY, 0x2357c69a7c92c936); // used as registry key |
837 | 835 | ||
838 | LUAG_FUNC( set_error_reporting) | 836 | LUAG_FUNC( set_error_reporting) |
839 | { | 837 | { |
@@ -854,9 +852,7 @@ LUAG_FUNC( set_error_reporting) | |||
854 | return luaL_error( L, "unsupported error reporting model"); | 852 | return luaL_error( L, "unsupported error reporting model"); |
855 | } | 853 | } |
856 | done: | 854 | done: |
857 | push_unique_key( L, EXTENDED_STACK_TRACE_REGKEY); | 855 | REGISTRY_SET( L, EXTENDED_STACKTRACE_REGKEY, lua_pushboolean( L, equal)); |
858 | lua_pushboolean( L, equal); | ||
859 | lua_rawset( L, LUA_REGISTRYINDEX); | ||
860 | return 0; | 856 | return 0; |
861 | } | 857 | } |
862 | 858 | ||
@@ -867,7 +863,7 @@ static int lane_error( lua_State* L) | |||
867 | bool_t extended; | 863 | bool_t extended; |
868 | 864 | ||
869 | // error message (any type) | 865 | // error message (any type) |
870 | assert( lua_gettop( L) == 1); // some_error | 866 | STACK_CHECK_ABS( L, 1); // some_error |
871 | 867 | ||
872 | // Don't do stack survey for cancelled lanes. | 868 | // Don't do stack survey for cancelled lanes. |
873 | // | 869 | // |
@@ -877,8 +873,7 @@ static int lane_error( lua_State* L) | |||
877 | } | 873 | } |
878 | 874 | ||
879 | STACK_GROW( L, 3); | 875 | STACK_GROW( L, 3); |
880 | push_unique_key( L, EXTENDED_STACK_TRACE_REGKEY); // some_error estk | 876 | REGISTRY_GET( L, EXTENDED_STACKTRACE_REGKEY); // some_error basic|extended |
881 | lua_rawget( L, LUA_REGISTRYINDEX); // some_error basic|extended | ||
882 | extended = lua_toboolean( L, -1); | 877 | extended = lua_toboolean( L, -1); |
883 | lua_pop( L, 1); // some_error | 878 | lua_pop( L, 1); // some_error |
884 | 879 | ||
@@ -931,12 +926,9 @@ static int lane_error( lua_State* L) | |||
931 | lua_rawseti( L, -2, (lua_Integer) n); // some_error {} | 926 | lua_rawseti( L, -2, (lua_Integer) n); // some_error {} |
932 | } | 927 | } |
933 | 928 | ||
934 | push_unique_key( L, STACK_TRACE_KEY); // some_error {} stk | 929 | REGISTRY_SET( L, STACKTRACE_REGKEY, lua_insert( L, -2)); // some_error |
935 | lua_insert( L, -2); // some_error stk {} | ||
936 | lua_rawset( L, LUA_REGISTRYINDEX); // some_error | ||
937 | |||
938 | assert( lua_gettop( L) == 1); | ||
939 | 930 | ||
931 | STACK_END( L, 1); | ||
940 | return 1; // the untouched error value | 932 | return 1; // the untouched error value |
941 | } | 933 | } |
942 | #endif // ERROR_FULL_STACK | 934 | #endif // ERROR_FULL_STACK |
@@ -952,12 +944,12 @@ static void push_stack_trace( lua_State* L, int rc_, int stk_base_) | |||
952 | case LUA_ERRRUN: // cancellation or a runtime error | 944 | case LUA_ERRRUN: // cancellation or a runtime error |
953 | #if ERROR_FULL_STACK // when ERROR_FULL_STACK, we installed a handler | 945 | #if ERROR_FULL_STACK // when ERROR_FULL_STACK, we installed a handler |
954 | { | 946 | { |
947 | STACK_CHECK( L, 0); | ||
955 | // fetch the call stack table from the registry where the handler stored it | 948 | // fetch the call stack table from the registry where the handler stored it |
956 | STACK_GROW( L, 1); | 949 | STACK_GROW( L, 1); |
957 | push_unique_key( L, STACK_TRACE_KEY); // err STACK_TRACE_KEY | ||
958 | // yields nil if no stack was generated (in case of cancellation for example) | 950 | // yields nil if no stack was generated (in case of cancellation for example) |
959 | lua_rawget( L, LUA_REGISTRYINDEX); // err trace|nil | 951 | REGISTRY_GET( L, STACKTRACE_REGKEY); // err trace|nil |
960 | ASSERT_L( lua_gettop( L) == 1 + stk_base_); | 952 | STACK_END( L, 1); |
961 | 953 | ||
962 | // For cancellation the error message is CANCEL_ERROR, and a stack trace isn't placed | 954 | // For cancellation the error message is CANCEL_ERROR, and a stack trace isn't placed |
963 | // For other errors, the message can be whatever was thrown, and we should have a stack trace table | 955 | // For other errors, the message can be whatever was thrown, and we should have a stack trace table |
@@ -982,15 +974,17 @@ LUAG_FUNC( set_debug_threadname) | |||
982 | // C s_lane structure is a light userdata upvalue | 974 | // C s_lane structure is a light userdata upvalue |
983 | Lane* s = lua_touserdata( L, lua_upvalueindex( 1)); | 975 | Lane* s = lua_touserdata( L, lua_upvalueindex( 1)); |
984 | luaL_checktype( L, -1, LUA_TSTRING); // "name" | 976 | luaL_checktype( L, -1, LUA_TSTRING); // "name" |
977 | lua_settop( L, 1); | ||
978 | STACK_CHECK_ABS( L, 1); | ||
985 | // store a hidden reference in the registry to make sure the string is kept around even if a lane decides to manually change the "decoda_name" global... | 979 | // store a hidden reference in the registry to make sure the string is kept around even if a lane decides to manually change the "decoda_name" global... |
986 | push_unique_key( L, hidden_regkey); // "name" lud | 980 | REGISTRY_SET( L, hidden_regkey, lua_pushvalue( L, -2)); |
987 | lua_pushvalue( L, -2); // "name" lud "name" | 981 | STACK_MID( L, 1); |
988 | lua_rawset( L, LUA_REGISTRYINDEX); // "name" | ||
989 | s->debug_name = lua_tostring( L, -1); | 982 | s->debug_name = lua_tostring( L, -1); |
990 | // keep a direct pointer on the string | 983 | // keep a direct pointer on the string |
991 | THREAD_SETNAME( s->debug_name); | 984 | THREAD_SETNAME( s->debug_name); |
992 | // to see VM name in Decoda debugger Virtual Machine window | 985 | // to see VM name in Decoda debugger Virtual Machine window |
993 | lua_setglobal( L, "decoda_name"); // | 986 | lua_setglobal( L, "decoda_name"); // |
987 | STACK_END( L, 0); | ||
994 | return 0; | 988 | return 0; |
995 | } | 989 | } |
996 | 990 | ||
diff --git a/src/tools.c b/src/tools.c index ecd86b8..f8fc342 100644 --- a/src/tools.c +++ b/src/tools.c | |||
@@ -300,10 +300,8 @@ static lua_CFunction luaG_tocfunction( lua_State *L, int _i, FuncSubType *_out) | |||
300 | return p; | 300 | return p; |
301 | } | 301 | } |
302 | 302 | ||
303 | 303 | // crc64/we of string "LOOKUPCACHE_REGKEY" generated at http://www.nitrxgen.net/hashgen/ | |
304 | #define LOOKUP_KEY "ddea37aa-50c7-4d3f-8e0b-fb7a9d62bac5" | 304 | static DECLARE_CONST_UNIQUE_KEY( LOOKUPCACHE_REGKEY, 0x837a68dfc6fcb716); |
305 | #define LOOKUP_KEY_CACHE "d1059270-4976-4193-a55b-c952db5ab7cd" | ||
306 | |||
307 | 305 | ||
308 | // inspired from tconcat() in ltablib.c | 306 | // inspired from tconcat() in ltablib.c |
309 | static char const* luaG_pushFQN( lua_State* L, int t, int last, size_t* length) | 307 | static char const* luaG_pushFQN( lua_State* L, int t, int last, size_t* length) |
@@ -576,13 +574,13 @@ void populate_func_lookup_table( lua_State* L, int _i, char const* name_) | |||
576 | STACK_MID( L, 2); | 574 | STACK_MID( L, 2); |
577 | } | 575 | } |
578 | // retrieve the cache, create it if we haven't done it yet | 576 | // retrieve the cache, create it if we haven't done it yet |
579 | lua_getfield( L, LUA_REGISTRYINDEX, LOOKUP_KEY_CACHE); // {} {fqn} {cache}? | 577 | REGISTRY_GET( L, LOOKUPCACHE_REGKEY); // {} {fqn} {cache}? |
580 | if( lua_isnil( L, -1)) | 578 | if( lua_isnil( L, -1)) |
581 | { | 579 | { |
582 | lua_pop( L, 1); // {} {fqn} | 580 | lua_pop( L, 1); // {} {fqn} |
583 | lua_newtable( L); // {} {fqn} {cache} | 581 | lua_newtable( L); // {} {fqn} {cache} |
584 | lua_pushvalue( L, -1); // {} {fqn} {cache} {cache} | 582 | REGISTRY_SET( L, LOOKUPCACHE_REGKEY, lua_pushvalue( L, -2)); |
585 | lua_setfield( L, LUA_REGISTRYINDEX, LOOKUP_KEY_CACHE); // {} {fqn} {cache} | 583 | STACK_MID( L, 3); |
586 | } | 584 | } |
587 | // process everything we find in that table, filling in lookup data for all functions and tables we see there | 585 | // process everything we find in that table, filling in lookup data for all functions and tables we see there |
588 | populate_func_lookup_table_recur( DEBUGSPEW_PARAM_COMMA( U) L, ctx_base, in_base, start_depth); | 586 | populate_func_lookup_table_recur( DEBUGSPEW_PARAM_COMMA( U) L, ctx_base, in_base, start_depth); |