mirror of
https://github.com/lua/lua
synced 2024-11-22 04:41:23 +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.
70 lines
2.4 KiB
C
70 lines
2.4 KiB
C
/*
|
|
** $Id: lmem.h,v 1.43.1.1 2017/04/19 17:20:42 roberto Exp $
|
|
** Interface to Memory Manager
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
#ifndef lmem_h
|
|
#define lmem_h
|
|
|
|
|
|
#include <stddef.h>
|
|
|
|
#include "llimits.h"
|
|
#include "lua.h"
|
|
|
|
|
|
/*
|
|
** This macro reallocs a vector 'b' from 'on' to 'n' elements, where
|
|
** each element has size 'e'. In case of arithmetic overflow of the
|
|
** product 'n'*'e', it raises an error (calling 'luaM_toobig'). Because
|
|
** 'e' is always constant, it avoids the runtime division MAX_SIZET/(e).
|
|
**
|
|
** (The macro is somewhat complex to avoid warnings: The 'sizeof'
|
|
** comparison avoids a runtime comparison when overflow cannot occur.
|
|
** The compiler should be able to optimize the real test by itself, but
|
|
** when it does it, it may give a warning about "comparison is always
|
|
** false due to limited range of data type"; the +1 tricks the compiler,
|
|
** avoiding this warning but also this optimization.)
|
|
*/
|
|
#define luaM_reallocv(L,b,on,n,e) \
|
|
(((sizeof(n) >= sizeof(size_t) && cast(size_t, (n)) + 1 > MAX_SIZET/(e)) \
|
|
? luaM_toobig(L) : cast_void(0)) , \
|
|
luaM_realloc_(L, (b), (on)*(e), (n)*(e)))
|
|
|
|
/*
|
|
** Arrays of chars do not need any test
|
|
*/
|
|
#define luaM_reallocvchar(L,b,on,n) \
|
|
cast(char *, luaM_realloc_(L, (b), (on)*sizeof(char), (n)*sizeof(char)))
|
|
|
|
#define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0)
|
|
#define luaM_free(L, b) luaM_realloc_(L, (b), sizeof(*(b)), 0)
|
|
#define luaM_freearray(L, b, n) luaM_realloc_(L, (b), (n)*sizeof(*(b)), 0)
|
|
|
|
#define luaM_malloc(L,s) luaM_realloc_(L, NULL, 0, (s))
|
|
#define luaM_new(L,t) cast(t *, luaM_malloc(L, sizeof(t)))
|
|
#define luaM_newvector(L,n,t) \
|
|
cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t)))
|
|
|
|
#define luaM_newobject(L,tag,s) luaM_realloc_(L, NULL, tag, (s))
|
|
|
|
#define luaM_growvector(L,v,nelems,size,t,limit,e) \
|
|
if ((nelems)+1 > (size)) \
|
|
((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))
|
|
|
|
#define luaM_reallocvector(L, v,oldn,n,t) \
|
|
((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t))))
|
|
|
|
LUAI_FUNC l_noret luaM_toobig (lua_State *L);
|
|
|
|
/* not to be called directly */
|
|
LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,
|
|
size_t size);
|
|
LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size,
|
|
size_t size_elem, int limit,
|
|
const char *what);
|
|
|
|
#endif
|
|
|