mirror of
https://github.com/lua/lua.git
synced 2025-01-14 05:43:00 +08:00
9e6807c3c9
Open upvalues are kept alive together with their corresponding stack. This change makes a simpler and safer fix to the issue in commit 440a5ee78c8, about upvalues in the list of open upvalues being collected while others are being created. (That previous fix may not be correct.)
70 lines
1.7 KiB
C
70 lines
1.7 KiB
C
/*
|
|
** $Id: lfunc.h $
|
|
** Auxiliary functions to manipulate prototypes and closures
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
#ifndef lfunc_h
|
|
#define lfunc_h
|
|
|
|
|
|
#include "lobject.h"
|
|
|
|
|
|
#define sizeCclosure(n) (cast_int(offsetof(CClosure, upvalue)) + \
|
|
cast_int(sizeof(TValue)) * (n))
|
|
|
|
#define sizeLclosure(n) (cast_int(offsetof(LClosure, upvals)) + \
|
|
cast_int(sizeof(TValue *)) * (n))
|
|
|
|
|
|
/* test whether thread is in 'twups' list */
|
|
#define isintwups(L) (L->twups != L)
|
|
|
|
|
|
/*
|
|
** maximum number of upvalues in a closure (both C and Lua). (Value
|
|
** must fit in a VM register.)
|
|
*/
|
|
#define MAXUPVAL 255
|
|
|
|
|
|
#define upisopen(up) ((up)->v != &(up)->u.value)
|
|
|
|
|
|
#define uplevel(up) check_exp(upisopen(up), cast(StkId, (up)->v))
|
|
|
|
|
|
/*
|
|
** maximum number of misses before giving up the cache of closures
|
|
** in prototypes
|
|
*/
|
|
#define MAXMISS 10
|
|
|
|
|
|
/*
|
|
** Special "status" for 'luaF_close'
|
|
*/
|
|
|
|
/* close upvalues without running their closing methods */
|
|
#define NOCLOSINGMETH (-1)
|
|
|
|
/* close upvalues running all closing methods in protected mode */
|
|
#define CLOSEPROTECT (-2)
|
|
|
|
|
|
LUAI_FUNC Proto *luaF_newproto (lua_State *L);
|
|
LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems);
|
|
LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nelems);
|
|
LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl);
|
|
LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);
|
|
LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level);
|
|
LUAI_FUNC int luaF_close (lua_State *L, StkId level, int status);
|
|
LUAI_FUNC void luaF_unlinkupval (UpVal *uv);
|
|
LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f);
|
|
LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,
|
|
int pc);
|
|
|
|
|
|
#endif
|