Remove the metatable api alternatives

pull/159/head
Dibyendu Majumdar 6 years ago
parent d4d679bb3c
commit 04ca32e8f5

@ -271,24 +271,10 @@ LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname,
#endif
/* }============================================================ */
/*
The normal Lua metatable functions in C use string
keys - these are expensive as the key needs to be
converted to Lua string, hash code computed etc.
Following implementations are taken from a post in
Lua mailing list (http://lua-users.org/lists/lua-l/2010-11/msg00151.html)
meta_key is the key assigned to the meta table of the userdata
IMPORTANT: Caller must ensure that supplied meta_key points to somewhere in
static storage as otherwise memory fault will occur.
*/
LUALIB_API int (luaL_newmetatable)(lua_State *L, const char *tname);
LUALIB_API void (luaL_setmetatable)(lua_State *L, const char *tname);
LUALIB_API void *(luaL_testudata)(lua_State *L, int ud, const char *tname);
LUALIB_API void *(luaL_checkudata)(lua_State *L, int ud, const char *tname);
#define raviL_newmetatable(L, meta_key, tname) luaL_newmetatable(L, meta_key)
#define raviL_getmetatable(L, meta_key) luaL_getmetatable(L, meta_key)
#define raviL_testudata(L, arg_index, meta_key) luaL_testudata(L, arg_index, meta_key)
#define raviL_checkudata(L, arg_index, meta_key) luaL_checkudata(L, arg_index, meta_key)
LUALIB_API int (raviL_build_ast_from_buffer) (lua_State *L, const char *buff, size_t size,
const char *name, const char *mode);

@ -75,7 +75,14 @@
*/
typedef struct GCObject GCObject;
/* Extended to 16-bits so that we can hold more info */
/*
** Value type extended to 16-bits so that we can hold more info.
** The actual type code is still 1 byte (least significant byte)
** and in particular all GC-able type codes must fit into 1 byte because
** the GC CommonHeader only allows 1 byte for the type code.
** The extra byte is for use by the type FCF (fast C function) to
** encode the C function's parameter and return types.
*/
typedef uint16_t LuaType;
/*

@ -2166,9 +2166,9 @@ static int build_ast(lua_State *L) {
static const char *AST_type = "Ravi.AST";
#define test_Ravi_AST(L, idx) \
((struct ast_container *)raviL_testudata(L, idx, AST_type))
((struct ast_container *)luaL_testudata(L, idx, AST_type))
#define check_Ravi_AST(L, idx) \
((struct ast_container *)raviL_checkudata(L, idx, AST_type))
((struct ast_container *)luaL_checkudata(L, idx, AST_type))
/* Converts the AST to a string representation */
static int ast_container_to_string(lua_State *L) {
@ -2191,7 +2191,7 @@ static struct ast_container *new_ast_container(lua_State *L) {
container->main_function = NULL;
container->external_symbols = NULL;
container->killed = false;
raviL_getmetatable(L, AST_type);
luaL_getmetatable(L, AST_type);
lua_setmetatable(L, -2);
return container;
}
@ -2221,7 +2221,7 @@ static const luaL_Reg astlib[] = {
{ NULL, NULL } };
LUAMOD_API int raviopen_ast_library(lua_State *L) {
raviL_newmetatable(L, AST_type, AST_type);
luaL_newmetatable(L, AST_type);
lua_pushcfunction(L, collect_ast_container);
lua_setfield(L, -2, "__gc");
lua_pushvalue(L, -1); /* push metatable */

@ -70,74 +70,74 @@ static const char *LLVM_instruction = "LLVMinstruction";
static const char *LLVM_phinode = "LLVMphinode";
#define test_LLVM_irbuilder(L, idx) \
((IRBuilderHolder *)raviL_testudata(L, idx, LLVM_irbuilder))
((IRBuilderHolder *)luaL_testudata(L, idx, LLVM_irbuilder))
#define check_LLVM_irbuilder(L, idx) \
((IRBuilderHolder *)raviL_checkudata(L, idx, LLVM_irbuilder))
((IRBuilderHolder *)luaL_checkudata(L, idx, LLVM_irbuilder))
#define test_LLVM_type(L, idx) \
((TypeHolder *)raviL_testudata(L, idx, LLVM_type))
((TypeHolder *)luaL_testudata(L, idx, LLVM_type))
#define check_LLVM_type(L, idx) \
((TypeHolder *)raviL_checkudata(L, idx, LLVM_type))
((TypeHolder *)luaL_checkudata(L, idx, LLVM_type))
#define test_LLVM_context(L, idx) \
((ContextHolder *)raviL_testudata(L, idx, LLVM_context))
((ContextHolder *)luaL_testudata(L, idx, LLVM_context))
#define check_LLVM_context(L, idx) \
((ContextHolder *)raviL_checkudata(L, idx, LLVM_context))
((ContextHolder *)luaL_checkudata(L, idx, LLVM_context))
#define test_LLVM_structtype(L, idx) \
((StructTypeHolder *)raviL_testudata(L, idx, LLVM_structtype))
((StructTypeHolder *)luaL_testudata(L, idx, LLVM_structtype))
#define check_LLVM_structtype(L, idx) \
((StructTypeHolder *)raviL_checkudata(L, idx, LLVM_structtype))
((StructTypeHolder *)luaL_checkudata(L, idx, LLVM_structtype))
#define test_LLVM_pointertype(L, idx) \
((PointerTypeHolder *)raviL_testudata(L, idx, LLVM_pointertype))
((PointerTypeHolder *)luaL_testudata(L, idx, LLVM_pointertype))
#define check_LLVM_pointertype(L, idx) \
((PointerTypeHolder *)raviL_checkudata(L, idx, LLVM_pointertype))
((PointerTypeHolder *)luaL_checkudata(L, idx, LLVM_pointertype))
#define test_LLVM_functiontype(L, idx) \
((FunctionTypeHolder *)raviL_testudata(L, idx, LLVM_functiontype))
((FunctionTypeHolder *)luaL_testudata(L, idx, LLVM_functiontype))
#define check_LLVM_functiontype(L, idx) \
((FunctionTypeHolder *)raviL_checkudata(L, idx, LLVM_functiontype))
((FunctionTypeHolder *)luaL_checkudata(L, idx, LLVM_functiontype))
#define test_LLVM_mainfunction(L, idx) \
((MainFunctionHolder *)raviL_testudata(L, idx, LLVM_mainfunction))
((MainFunctionHolder *)luaL_testudata(L, idx, LLVM_mainfunction))
#define check_LLVM_mainfunction(L, idx) \
((MainFunctionHolder *)raviL_checkudata(L, idx, LLVM_mainfunction))
((MainFunctionHolder *)luaL_checkudata(L, idx, LLVM_mainfunction))
#define test_LLVM_function(L, idx) \
((FunctionHolder *)raviL_testudata(L, idx, LLVM_function))
((FunctionHolder *)luaL_testudata(L, idx, LLVM_function))
#define check_LLVM_function(L, idx) \
((FunctionHolder *)raviL_checkudata(L, idx, LLVM_function))
((FunctionHolder *)luaL_checkudata(L, idx, LLVM_function))
#define test_LLVM_basicblock(L, idx) \
((BasicBlockHolder *)raviL_testudata(L, idx, LLVM_basicblock))
((BasicBlockHolder *)luaL_testudata(L, idx, LLVM_basicblock))
#define check_LLVM_basicblock(L, idx) \
((BasicBlockHolder *)raviL_checkudata(L, idx, LLVM_basicblock))
((BasicBlockHolder *)luaL_checkudata(L, idx, LLVM_basicblock))
#define test_LLVM_value(L, idx) \
((ValueHolder *)raviL_testudata(L, idx, LLVM_value))
((ValueHolder *)luaL_testudata(L, idx, LLVM_value))
#define check_LLVM_value(L, idx) \
((ValueHolder *)raviL_checkudata(L, idx, LLVM_value))
((ValueHolder *)luaL_checkudata(L, idx, LLVM_value))
#define test_LLVM_constant(L, idx) \
((ConstantHolder *)raviL_testudata(L, idx, LLVM_constant))
((ConstantHolder *)luaL_testudata(L, idx, LLVM_constant))
#define check_LLVM_constant(L, idx) \
((ConstantHolder *)raviL_checkudata(L, idx, LLVM_constant))
((ConstantHolder *)luaL_checkudata(L, idx, LLVM_constant))
#define test_LLVM_instruction(L, idx) \
((InstructionHolder *)raviL_testudata(L, idx, LLVM_instruction))
((InstructionHolder *)luaL_testudata(L, idx, LLVM_instruction))
#define check_LLVM_instruction(L, idx) \
((InstructionHolder *)raviL_checkudata(L, idx, LLVM_instruction))
((InstructionHolder *)luaL_checkudata(L, idx, LLVM_instruction))
#define test_LLVM_module(L, idx) \
((ModuleHolder *)raviL_testudata(L, idx, LLVM_module))
((ModuleHolder *)luaL_testudata(L, idx, LLVM_module))
#define check_LLVM_module(L, idx) \
((ModuleHolder *)raviL_checkudata(L, idx, LLVM_module))
((ModuleHolder *)luaL_checkudata(L, idx, LLVM_module))
#define test_LLVM_phinode(L, idx) \
((PhiNodeHolder *)raviL_testudata(L, idx, LLVM_phinode))
((PhiNodeHolder *)luaL_testudata(L, idx, LLVM_phinode))
#define check_LLVM_phinode(L, idx) \
((PhiNodeHolder *)raviL_checkudata(L, idx, LLVM_phinode))
((PhiNodeHolder *)luaL_checkudata(L, idx, LLVM_phinode))
struct ContextHolder {
/* Each Ravi instance (Lua instance) has its own
@ -218,7 +218,7 @@ static int context_new_LLVM_irbuilder(lua_State *L) {
IRBuilderHolder *builder =
(IRBuilderHolder *)lua_newuserdata(L, sizeof(IRBuilderHolder));
builder->builder = new llvm::IRBuilder<>(context->jitState->context());
raviL_getmetatable(L, LLVM_irbuilder);
luaL_getmetatable(L, LLVM_irbuilder);
lua_setmetatable(L, -2);
return 1;
}
@ -236,7 +236,7 @@ static int collect_LLVM_irbuilder(lua_State *L) {
static void alloc_LLVM_module(lua_State *L,
const std::shared_ptr<ravi::RaviJITModule> &M) {
ModuleHolder *mh = (ModuleHolder *)lua_newuserdata(L, sizeof(ModuleHolder));
raviL_getmetatable(L, LLVM_module);
luaL_getmetatable(L, LLVM_module);
lua_setmetatable(L, -2);
new (mh) ModuleHolder(M);
}
@ -251,21 +251,21 @@ static int collect_LLVM_module(lua_State *L) {
static void alloc_LLVM_type(lua_State *L, llvm::Type *t) {
TypeHolder *tt = (TypeHolder *)lua_newuserdata(L, sizeof(TypeHolder));
raviL_getmetatable(L, LLVM_type);
luaL_getmetatable(L, LLVM_type);
lua_setmetatable(L, -2);
tt->type = t;
}
static void alloc_LLVM_context(lua_State *L, ravi::RaviJITState *jit) {
ContextHolder *h = (ContextHolder *)lua_newuserdata(L, sizeof(ContextHolder));
raviL_getmetatable(L, LLVM_context);
luaL_getmetatable(L, LLVM_context);
lua_setmetatable(L, -2);
h->jitState = jit;
}
static void alloc_LLVM_value(lua_State *L, llvm::Value *v) {
ValueHolder *h = (ValueHolder *)lua_newuserdata(L, sizeof(ValueHolder));
raviL_getmetatable(L, LLVM_value);
luaL_getmetatable(L, LLVM_value);
lua_setmetatable(L, -2);
h->value = v;
}
@ -273,7 +273,7 @@ static void alloc_LLVM_value(lua_State *L, llvm::Value *v) {
static void alloc_LLVM_structtype(lua_State *L, llvm::StructType *type) {
StructTypeHolder *h =
(StructTypeHolder *)lua_newuserdata(L, sizeof(StructTypeHolder));
raviL_getmetatable(L, LLVM_structtype);
luaL_getmetatable(L, LLVM_structtype);
lua_setmetatable(L, -2);
h->type = type;
}
@ -281,7 +281,7 @@ static void alloc_LLVM_structtype(lua_State *L, llvm::StructType *type) {
static void alloc_LLVM_pointertype(lua_State *L, llvm::PointerType *type) {
PointerTypeHolder *h =
(PointerTypeHolder *)lua_newuserdata(L, sizeof(PointerTypeHolder));
raviL_getmetatable(L, LLVM_pointertype);
luaL_getmetatable(L, LLVM_pointertype);
lua_setmetatable(L, -2);
h->type = type;
}
@ -289,7 +289,7 @@ static void alloc_LLVM_pointertype(lua_State *L, llvm::PointerType *type) {
static void alloc_LLVM_functiontype(lua_State *L, llvm::FunctionType *type) {
FunctionTypeHolder *h =
(FunctionTypeHolder *)lua_newuserdata(L, sizeof(FunctionTypeHolder));
raviL_getmetatable(L, LLVM_functiontype);
luaL_getmetatable(L, LLVM_functiontype);
lua_setmetatable(L, -2);
h->type = type;
}
@ -297,7 +297,7 @@ static void alloc_LLVM_functiontype(lua_State *L, llvm::FunctionType *type) {
static void alloc_LLVM_function(lua_State *L, llvm::Function *f) {
FunctionHolder *h =
(FunctionHolder *)lua_newuserdata(L, sizeof(FunctionHolder));
raviL_getmetatable(L, LLVM_function);
luaL_getmetatable(L, LLVM_function);
lua_setmetatable(L, -2);
h->function = f;
}
@ -305,7 +305,7 @@ static void alloc_LLVM_function(lua_State *L, llvm::Function *f) {
static void alloc_LLVM_constant(lua_State *L, llvm::Constant *f) {
ConstantHolder *h =
(ConstantHolder *)lua_newuserdata(L, sizeof(ConstantHolder));
raviL_getmetatable(L, LLVM_constant);
luaL_getmetatable(L, LLVM_constant);
lua_setmetatable(L, -2);
h->constant = f;
}
@ -313,14 +313,14 @@ static void alloc_LLVM_constant(lua_State *L, llvm::Constant *f) {
static void alloc_LLVM_instruction(lua_State *L, llvm::Instruction *i) {
InstructionHolder *h =
(InstructionHolder *)lua_newuserdata(L, sizeof(InstructionHolder));
raviL_getmetatable(L, LLVM_instruction);
luaL_getmetatable(L, LLVM_instruction);
lua_setmetatable(L, -2);
h->i = i;
}
static void alloc_LLVM_phinode(lua_State *L, llvm::PHINode *phi) {
PhiNodeHolder *h = (PhiNodeHolder *)lua_newuserdata(L, sizeof(PhiNodeHolder));
raviL_getmetatable(L, LLVM_phinode);
luaL_getmetatable(L, LLVM_phinode);
lua_setmetatable(L, -2);
h->phi = phi;
}
@ -335,7 +335,7 @@ static MainFunctionHolder *alloc_LLVM_mainfunction(lua_State *L,
h->func = nullptr;
h->compiled_func = nullptr;
h->arg1 = nullptr;
raviL_getmetatable(L, LLVM_mainfunction);
luaL_getmetatable(L, LLVM_mainfunction);
lua_setmetatable(L, -2);
auto module = std::make_shared<ravi::RaviJITModule>(G(L)->ravi_state->jit);
h->func = new ravi::RaviJITFunction(&h->compiled_func, module, type,
@ -404,7 +404,7 @@ static MainFunctionHolder *alloc_LLVM_luaCfunction(
h->func = nullptr;
h->compiled_func = nullptr;
h->arg1 = nullptr;
raviL_getmetatable(L, LLVM_mainfunction);
luaL_getmetatable(L, LLVM_mainfunction);
lua_setmetatable(L, -2);
h->func = new ravi::RaviJITFunction(&h->compiled_func, module, name);
h->is_valid = validate_has_luaCFunction_signature(h, error_message, sizeof error_message);
@ -428,7 +428,7 @@ static int collect_LLVM_mainfunction(lua_State *L) {
static void alloc_LLVM_basicblock(lua_State *L, llvm::BasicBlock *b) {
BasicBlockHolder *h =
(BasicBlockHolder *)lua_newuserdata(L, sizeof(BasicBlockHolder));
raviL_getmetatable(L, LLVM_basicblock);
luaL_getmetatable(L, LLVM_basicblock);
lua_setmetatable(L, -2);
h->b = b;
}
@ -1512,7 +1512,7 @@ static const luaL_Reg irbuilder_methods[] = {
{NULL, NULL}};
LUAMOD_API int raviopen_llvmluaapi(lua_State *L) {
raviL_newmetatable(L, LLVM_context, LLVM_context);
luaL_newmetatable(L, LLVM_context);
lua_pushstring(L, LLVM_context);
lua_setfield(L, -2, "type");
lua_pushvalue(L, -1); /* push metatable */
@ -1520,7 +1520,7 @@ LUAMOD_API int raviopen_llvmluaapi(lua_State *L) {
luaL_setfuncs(L, context_methods, 0);
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_module, LLVM_module);
luaL_newmetatable(L, LLVM_module);
lua_pushstring(L, LLVM_module);
lua_setfield(L, -2, "type");
lua_pushcfunction(L, collect_LLVM_module);
@ -1530,7 +1530,7 @@ LUAMOD_API int raviopen_llvmluaapi(lua_State *L) {
luaL_setfuncs(L, module_methods, 0);
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_irbuilder, LLVM_irbuilder);
luaL_newmetatable(L, LLVM_irbuilder);
lua_pushstring(L, LLVM_irbuilder);
lua_setfield(L, -2, "type");
lua_pushcfunction(L, collect_LLVM_irbuilder);
@ -1540,7 +1540,7 @@ LUAMOD_API int raviopen_llvmluaapi(lua_State *L) {
luaL_setfuncs(L, irbuilder_methods, 0);
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_mainfunction, LLVM_mainfunction);
luaL_newmetatable(L, LLVM_mainfunction);
lua_pushstring(L, LLVM_mainfunction);
lua_setfield(L, -2, "type");
lua_pushcfunction(L, collect_LLVM_mainfunction);
@ -1550,7 +1550,7 @@ LUAMOD_API int raviopen_llvmluaapi(lua_State *L) {
luaL_setfuncs(L, main_function_methods, 0);
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_function, LLVM_function);
luaL_newmetatable(L, LLVM_function);
lua_pushstring(L, LLVM_function);
lua_setfield(L, -2, "type");
lua_pushvalue(L, -1); /* push metatable */
@ -1558,17 +1558,17 @@ LUAMOD_API int raviopen_llvmluaapi(lua_State *L) {
luaL_setfuncs(L, function_methods, 0);
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_type, LLVM_type);
luaL_newmetatable(L, LLVM_type);
lua_pushstring(L, LLVM_type);
lua_setfield(L, -2, "type");
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_value, LLVM_value);
luaL_newmetatable(L, LLVM_value);
lua_pushstring(L, LLVM_value);
lua_setfield(L, -2, "type");
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_structtype, LLVM_structtype);
luaL_newmetatable(L, LLVM_structtype);
lua_pushstring(L, LLVM_structtype);
lua_setfield(L, -2, "type");
lua_pushvalue(L, -1); /* push metatable */
@ -1576,32 +1576,32 @@ LUAMOD_API int raviopen_llvmluaapi(lua_State *L) {
luaL_setfuncs(L, structtype_methods, 0);
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_pointertype, LLVM_pointertype);
luaL_newmetatable(L, LLVM_pointertype);
lua_pushstring(L, LLVM_pointertype);
lua_setfield(L, -2, "type");
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_functiontype, LLVM_functiontype);
luaL_newmetatable(L, LLVM_functiontype);
lua_pushstring(L, LLVM_functiontype);
lua_setfield(L, -2, "type");
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_basicblock, LLVM_basicblock);
luaL_newmetatable(L, LLVM_basicblock);
lua_pushstring(L, LLVM_basicblock);
lua_setfield(L, -2, "type");
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_constant, LLVM_constant);
luaL_newmetatable(L, LLVM_constant);
lua_pushstring(L, LLVM_constant);
lua_setfield(L, -2, "type");
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_instruction, LLVM_instruction);
luaL_newmetatable(L, LLVM_instruction);
lua_pushstring(L, LLVM_instruction);
lua_setfield(L, -2, "type");
lua_pop(L, 1);
raviL_newmetatable(L, LLVM_phinode, LLVM_phinode);
luaL_newmetatable(L, LLVM_phinode);
lua_pushstring(L, LLVM_phinode);
lua_setfield(L, -2, "type");
lua_pushvalue(L, -1); /* push metatable */

Loading…
Cancel
Save