1280405Srpaulo/* 2344220Skevans** $Id: lfunc.h,v 2.15.1.1 2017/04/19 17:39:34 roberto Exp $ 3280405Srpaulo** Auxiliary functions to manipulate prototypes and closures 4280405Srpaulo** See Copyright Notice in lua.h 5280405Srpaulo*/ 6280405Srpaulo 7280405Srpaulo#ifndef lfunc_h 8280405Srpaulo#define lfunc_h 9280405Srpaulo 10280405Srpaulo 11280405Srpaulo#include "lobject.h" 12280405Srpaulo 13280405Srpaulo 14280405Srpaulo#define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \ 15280405Srpaulo cast(int, sizeof(TValue)*((n)-1))) 16280405Srpaulo 17280405Srpaulo#define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \ 18280405Srpaulo cast(int, sizeof(TValue *)*((n)-1))) 19280405Srpaulo 20280405Srpaulo 21280405Srpaulo/* test whether thread is in 'twups' list */ 22280405Srpaulo#define isintwups(L) (L->twups != L) 23280405Srpaulo 24280405Srpaulo 25280405Srpaulo/* 26326344Simp** maximum number of upvalues in a closure (both C and Lua). (Value 27326344Simp** must fit in a VM register.) 28326344Simp*/ 29326344Simp#define MAXUPVAL 255 30326344Simp 31326344Simp 32326344Simp/* 33280405Srpaulo** Upvalues for Lua closures 34280405Srpaulo*/ 35280405Srpaulostruct UpVal { 36280405Srpaulo TValue *v; /* points to stack or to its own value */ 37280405Srpaulo lu_mem refcount; /* reference counter */ 38280405Srpaulo union { 39280405Srpaulo struct { /* (when open) */ 40280405Srpaulo UpVal *next; /* linked list */ 41280405Srpaulo int touched; /* mark to avoid cycles with dead threads */ 42280405Srpaulo } open; 43280405Srpaulo TValue value; /* the value (when closed) */ 44280405Srpaulo } u; 45280405Srpaulo}; 46280405Srpaulo 47280405Srpaulo#define upisopen(up) ((up)->v != &(up)->u.value) 48280405Srpaulo 49280405Srpaulo 50280405SrpauloLUAI_FUNC Proto *luaF_newproto (lua_State *L); 51280405SrpauloLUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems); 52280405SrpauloLUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nelems); 53280405SrpauloLUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); 54280405SrpauloLUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); 55280405SrpauloLUAI_FUNC void luaF_close (lua_State *L, StkId level); 56280405SrpauloLUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); 57280405SrpauloLUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, 58280405Srpaulo int pc); 59280405Srpaulo 60280405Srpaulo 61280405Srpaulo#endif 62