mirror of
https://github.com/lua/lua
synced 2024-11-22 12:51:30 +03:00
063d4e4543
This is the first commit for the branch Lua 5.3. All source files were copied from the official distribution of 5.3.5 in the Lua site. The test files are the same of 5.3.4. The manual came from the previous RCS repository, revision 1.167.1.2.
324 lines
7.5 KiB
C
324 lines
7.5 KiB
C
/*
|
|
** $Id: llimits.h,v 1.141.1.1 2017/04/19 17:20:42 roberto Exp $
|
|
** Limits, basic types, and some other 'installation-dependent' definitions
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
#ifndef llimits_h
|
|
#define llimits_h
|
|
|
|
|
|
#include <limits.h>
|
|
#include <stddef.h>
|
|
|
|
|
|
#include "lua.h"
|
|
|
|
/*
|
|
** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count
|
|
** the total memory used by Lua (in bytes). Usually, 'size_t' and
|
|
** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines.
|
|
*/
|
|
#if defined(LUAI_MEM) /* { external definitions? */
|
|
typedef LUAI_UMEM lu_mem;
|
|
typedef LUAI_MEM l_mem;
|
|
#elif LUAI_BITSINT >= 32 /* }{ */
|
|
typedef size_t lu_mem;
|
|
typedef ptrdiff_t l_mem;
|
|
#else /* 16-bit ints */ /* }{ */
|
|
typedef unsigned long lu_mem;
|
|
typedef long l_mem;
|
|
#endif /* } */
|
|
|
|
|
|
/* chars used as small naturals (so that 'char' is reserved for characters) */
|
|
typedef unsigned char lu_byte;
|
|
|
|
|
|
/* maximum value for size_t */
|
|
#define MAX_SIZET ((size_t)(~(size_t)0))
|
|
|
|
/* maximum size visible for Lua (must be representable in a lua_Integer */
|
|
#define MAX_SIZE (sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \
|
|
: (size_t)(LUA_MAXINTEGER))
|
|
|
|
|
|
#define MAX_LUMEM ((lu_mem)(~(lu_mem)0))
|
|
|
|
#define MAX_LMEM ((l_mem)(MAX_LUMEM >> 1))
|
|
|
|
|
|
#define MAX_INT INT_MAX /* maximum value of an int */
|
|
|
|
|
|
/*
|
|
** conversion of pointer to unsigned integer:
|
|
** this is for hashing only; there is no problem if the integer
|
|
** cannot hold the whole pointer value
|
|
*/
|
|
#define point2uint(p) ((unsigned int)((size_t)(p) & UINT_MAX))
|
|
|
|
|
|
|
|
/* type to ensure maximum alignment */
|
|
#if defined(LUAI_USER_ALIGNMENT_T)
|
|
typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;
|
|
#else
|
|
typedef union {
|
|
lua_Number n;
|
|
double u;
|
|
void *s;
|
|
lua_Integer i;
|
|
long l;
|
|
} L_Umaxalign;
|
|
#endif
|
|
|
|
|
|
|
|
/* types of 'usual argument conversions' for lua_Number and lua_Integer */
|
|
typedef LUAI_UACNUMBER l_uacNumber;
|
|
typedef LUAI_UACINT l_uacInt;
|
|
|
|
|
|
/* internal assertions for in-house debugging */
|
|
#if defined(lua_assert)
|
|
#define check_exp(c,e) (lua_assert(c), (e))
|
|
/* to avoid problems with conditions too long */
|
|
#define lua_longassert(c) ((c) ? (void)0 : lua_assert(0))
|
|
#else
|
|
#define lua_assert(c) ((void)0)
|
|
#define check_exp(c,e) (e)
|
|
#define lua_longassert(c) ((void)0)
|
|
#endif
|
|
|
|
/*
|
|
** assertion for checking API calls
|
|
*/
|
|
#if !defined(luai_apicheck)
|
|
#define luai_apicheck(l,e) lua_assert(e)
|
|
#endif
|
|
|
|
#define api_check(l,e,msg) luai_apicheck(l,(e) && msg)
|
|
|
|
|
|
/* macro to avoid warnings about unused variables */
|
|
#if !defined(UNUSED)
|
|
#define UNUSED(x) ((void)(x))
|
|
#endif
|
|
|
|
|
|
/* type casts (a macro highlights casts in the code) */
|
|
#define cast(t, exp) ((t)(exp))
|
|
|
|
#define cast_void(i) cast(void, (i))
|
|
#define cast_byte(i) cast(lu_byte, (i))
|
|
#define cast_num(i) cast(lua_Number, (i))
|
|
#define cast_int(i) cast(int, (i))
|
|
#define cast_uchar(i) cast(unsigned char, (i))
|
|
|
|
|
|
/* cast a signed lua_Integer to lua_Unsigned */
|
|
#if !defined(l_castS2U)
|
|
#define l_castS2U(i) ((lua_Unsigned)(i))
|
|
#endif
|
|
|
|
/*
|
|
** cast a lua_Unsigned to a signed lua_Integer; this cast is
|
|
** not strict ISO C, but two-complement architectures should
|
|
** work fine.
|
|
*/
|
|
#if !defined(l_castU2S)
|
|
#define l_castU2S(i) ((lua_Integer)(i))
|
|
#endif
|
|
|
|
|
|
/*
|
|
** non-return type
|
|
*/
|
|
#if defined(__GNUC__)
|
|
#define l_noret void __attribute__((noreturn))
|
|
#elif defined(_MSC_VER) && _MSC_VER >= 1200
|
|
#define l_noret void __declspec(noreturn)
|
|
#else
|
|
#define l_noret void
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
** maximum depth for nested C calls and syntactical nested non-terminals
|
|
** in a program. (Value must fit in an unsigned short int.)
|
|
*/
|
|
#if !defined(LUAI_MAXCCALLS)
|
|
#define LUAI_MAXCCALLS 200
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
** type for virtual-machine instructions;
|
|
** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h)
|
|
*/
|
|
#if LUAI_BITSINT >= 32
|
|
typedef unsigned int Instruction;
|
|
#else
|
|
typedef unsigned long Instruction;
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
** Maximum length for short strings, that is, strings that are
|
|
** internalized. (Cannot be smaller than reserved words or tags for
|
|
** metamethods, as these strings must be internalized;
|
|
** #("function") = 8, #("__newindex") = 10.)
|
|
*/
|
|
#if !defined(LUAI_MAXSHORTLEN)
|
|
#define LUAI_MAXSHORTLEN 40
|
|
#endif
|
|
|
|
|
|
/*
|
|
** Initial size for the string table (must be power of 2).
|
|
** The Lua core alone registers ~50 strings (reserved words +
|
|
** metaevent keys + a few others). Libraries would typically add
|
|
** a few dozens more.
|
|
*/
|
|
#if !defined(MINSTRTABSIZE)
|
|
#define MINSTRTABSIZE 128
|
|
#endif
|
|
|
|
|
|
/*
|
|
** Size of cache for strings in the API. 'N' is the number of
|
|
** sets (better be a prime) and "M" is the size of each set (M == 1
|
|
** makes a direct cache.)
|
|
*/
|
|
#if !defined(STRCACHE_N)
|
|
#define STRCACHE_N 53
|
|
#define STRCACHE_M 2
|
|
#endif
|
|
|
|
|
|
/* minimum size for string buffer */
|
|
#if !defined(LUA_MINBUFFER)
|
|
#define LUA_MINBUFFER 32
|
|
#endif
|
|
|
|
|
|
/*
|
|
** macros that are executed whenever program enters the Lua core
|
|
** ('lua_lock') and leaves the core ('lua_unlock')
|
|
*/
|
|
#if !defined(lua_lock)
|
|
#define lua_lock(L) ((void) 0)
|
|
#define lua_unlock(L) ((void) 0)
|
|
#endif
|
|
|
|
/*
|
|
** macro executed during Lua functions at points where the
|
|
** function can yield.
|
|
*/
|
|
#if !defined(luai_threadyield)
|
|
#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);}
|
|
#endif
|
|
|
|
|
|
/*
|
|
** these macros allow user-specific actions on threads when you defined
|
|
** LUAI_EXTRASPACE and need to do something extra when a thread is
|
|
** created/deleted/resumed/yielded.
|
|
*/
|
|
#if !defined(luai_userstateopen)
|
|
#define luai_userstateopen(L) ((void)L)
|
|
#endif
|
|
|
|
#if !defined(luai_userstateclose)
|
|
#define luai_userstateclose(L) ((void)L)
|
|
#endif
|
|
|
|
#if !defined(luai_userstatethread)
|
|
#define luai_userstatethread(L,L1) ((void)L)
|
|
#endif
|
|
|
|
#if !defined(luai_userstatefree)
|
|
#define luai_userstatefree(L,L1) ((void)L)
|
|
#endif
|
|
|
|
#if !defined(luai_userstateresume)
|
|
#define luai_userstateresume(L,n) ((void)L)
|
|
#endif
|
|
|
|
#if !defined(luai_userstateyield)
|
|
#define luai_userstateyield(L,n) ((void)L)
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
** The luai_num* macros define the primitive operations over numbers.
|
|
*/
|
|
|
|
/* floor division (defined as 'floor(a/b)') */
|
|
#if !defined(luai_numidiv)
|
|
#define luai_numidiv(L,a,b) ((void)L, l_floor(luai_numdiv(L,a,b)))
|
|
#endif
|
|
|
|
/* float division */
|
|
#if !defined(luai_numdiv)
|
|
#define luai_numdiv(L,a,b) ((a)/(b))
|
|
#endif
|
|
|
|
/*
|
|
** modulo: defined as 'a - floor(a/b)*b'; this definition gives NaN when
|
|
** 'b' is huge, but the result should be 'a'. 'fmod' gives the result of
|
|
** 'a - trunc(a/b)*b', and therefore must be corrected when 'trunc(a/b)
|
|
** ~= floor(a/b)'. That happens when the division has a non-integer
|
|
** negative result, which is equivalent to the test below.
|
|
*/
|
|
#if !defined(luai_nummod)
|
|
#define luai_nummod(L,a,b,m) \
|
|
{ (m) = l_mathop(fmod)(a,b); if ((m)*(b) < 0) (m) += (b); }
|
|
#endif
|
|
|
|
/* exponentiation */
|
|
#if !defined(luai_numpow)
|
|
#define luai_numpow(L,a,b) ((void)L, l_mathop(pow)(a,b))
|
|
#endif
|
|
|
|
/* the others are quite standard operations */
|
|
#if !defined(luai_numadd)
|
|
#define luai_numadd(L,a,b) ((a)+(b))
|
|
#define luai_numsub(L,a,b) ((a)-(b))
|
|
#define luai_nummul(L,a,b) ((a)*(b))
|
|
#define luai_numunm(L,a) (-(a))
|
|
#define luai_numeq(a,b) ((a)==(b))
|
|
#define luai_numlt(a,b) ((a)<(b))
|
|
#define luai_numle(a,b) ((a)<=(b))
|
|
#define luai_numisnan(a) (!luai_numeq((a), (a)))
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
** macro to control inclusion of some hard tests on stack reallocation
|
|
*/
|
|
#if !defined(HARDSTACKTESTS)
|
|
#define condmovestack(L,pre,pos) ((void)0)
|
|
#else
|
|
/* realloc stack keeping its size */
|
|
#define condmovestack(L,pre,pos) \
|
|
{ int sz_ = (L)->stacksize; pre; luaD_reallocstack((L), sz_); pos; }
|
|
#endif
|
|
|
|
#if !defined(HARDMEMTESTS)
|
|
#define condchangemem(L,pre,pos) ((void)0)
|
|
#else
|
|
#define condchangemem(L,pre,pos) \
|
|
{ if (G(L)->gcrunning) { pre; luaC_fullgc(L, 0); pos; } }
|
|
#endif
|
|
|
|
#endif
|