@ -921,6 +921,7 @@ static int llthread_move_values(lua_State *from_L, lua_State *to_L, int idx, int
size_t str_len ;
size_t str_len ;
int nvalues = 0 ;
int nvalues = 0 ;
int n ;
int n ;
int key , value ;
for ( n = idx ; n < = top ; n + + ) {
for ( n = idx ; n < = top ; n + + ) {
/* only support string/number/boolean/nil/lightuserdata. */
/* only support string/number/boolean/nil/lightuserdata. */
@ -942,12 +943,26 @@ static int llthread_move_values(lua_State *from_L, lua_State *to_L, int idx, int
lua_pushlightuserdata ( to_L , lua_touserdata ( from_L , n ) ) ;
lua_pushlightuserdata ( to_L , lua_touserdata ( from_L , n ) ) ;
break ;
break ;
case LUA_TTABLE :
case LUA_TTABLE :
lua_newtable ( to_L ) ;
lua_pushnil ( from_L ) ;
while ( lua_next ( from_L , n ) ! = 0 ) {
/* key is at -2, value at -1, but we need to normalize these
* to positive indices */
key = lua_gettop ( from_L ) - 1 ;
value = lua_gettop ( from_L ) ;
llthread_move_values ( from_L , to_L , key , value , is_arg ) ;
/* Copied key and value are now at -2 and -1 in to_L. */
lua_settable ( to_L , - 3 ) ;
/* Pop value for next iteration */
lua_pop ( from_L , 1 ) ;
}
break ;
case LUA_TFUNCTION :
case LUA_TFUNCTION :
case LUA_TUSERDATA :
case LUA_TUSERDATA :
case LUA_TTHREAD :
case LUA_TTHREAD :
default :
default :
if ( is_arg ) {
if ( is_arg ) {
return luaL_argerror ( from_L , n , " table/function/userdata/thread types un-supported. " ) ;
return luaL_argerror ( from_L , n , " function/userdata/thread types un-supported." ) ;
} else {
} else {
/* convert un-supported types to an error string. */
/* convert un-supported types to an error string. */
lua_pushfstring ( to_L , " Un-supported value: %s: %p " ,
lua_pushfstring ( to_L , " Un-supported value: %s: %p " ,