Skip to content

Commit 1bfbc2e

Browse files
aat
1 parent a0f3c7b commit 1bfbc2e

File tree

14 files changed

+460
-64
lines changed

14 files changed

+460
-64
lines changed

LuaCEmbed.h

Lines changed: 153 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22980,6 +22980,8 @@ LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) {
2298022980
#define PRIVATE_LUA_CEMBED_TABLE_RETURN "private_lua_embed_table_return"
2298122981

2298222982
#define PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__ "private_lua_c_embed_main_lib_table_%d"
22983+
#define PRIVATE_LUA_CEMBED_MAIN_LIB_SUB_TABLE "private_lua_c_embed_main_lib_table_%d_%s"
22984+
2298322985
#define PRIVATE_LUA_CEMBED_MAIN_META_TABLE__ "private_lua_c_embed_main_meta_table_%d"
2298422986
#define PRIVATE_LUA_CEMBED_ANONYMOUS_TABLE_ "private_lua_c_embed_anononymous_table_%d_%d"
2298522987
#define PRIVATE_LUA_CEMBED_ANONYMOUS_FUNC_TABLE_ "private_lua_c_embed_anononymous_func_table_%d_%d"
@@ -23000,6 +23002,7 @@ LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) {
2300023002
#define PRIVATE_LUA_CEMBED_WRONG_TYPE_INDEX "index %d at object %s its %s instead of %s"
2300123003
#define PRIVATE_LUA_CEMBED_ELEMENT_DOES_NOT_HAVE_KEY "index %d at object %s not have a key"
2300223004
#define PRIVVATE_LUA_CEMBED_TIMEOUT_ERROR "timeout error"
23005+
#define PRIVATE_LUA_CEMBED_LIB_PROP_WRONG_TYPE "lib prop %s its %s insteadd of %s"
2300323006

2300423007
#ifndef LUA_CEMBED_INDEX_DIF
2300523008
#define LUA_CEMBED_INDEX_DIF 1
@@ -23084,6 +23087,7 @@ typedef struct LuaCEmbed{
2308423087
void *func_tables;
2308523088
int lib_identifier;
2308623089
int stack_leve;
23090+
char *main_lib_table;
2308723091
}LuaCEmbed;
2308823092

2308923093

@@ -23541,6 +23545,19 @@ void LuaCEmbed_set_string_lib_prop(LuaCEmbed *self,const char *name,const char *
2354123545

2354223546
void LuaCEmbed_set_table_lib_prop(LuaCEmbed *self,const char *name,LuaCEmbedTable *value);
2354323547

23548+
int private_LuaCEmbed_ensure_lib_prop_type(LuaCEmbed *self,const char *name,int expected_type);;
23549+
23550+
23551+
long long LuaCEmbed_get_long_lib_prop(LuaCEmbed *self,const char *name);
23552+
23553+
double LuaCEmbed_get_double_lib_prop(LuaCEmbed *self,const char *name);
23554+
23555+
bool LuaCEmbed_get_bool_lib_prop(LuaCEmbed *self,const char *name);
23556+
23557+
char * LuaCEmbed_get_string_lib_prop(LuaCEmbed *self,const char *name);
23558+
23559+
LuaCEmbedTable *LuaCEmbed_get_table_lib_prop(LuaCEmbed *self,const char *name);
23560+
2354423561

2354523562

2354623563

@@ -23753,6 +23770,11 @@ typedef struct{
2375323770
void (*set_string_lib_prop)(LuaCEmbed *self,const char *name,const char * value);
2375423771
void (*set_table_lib_prop)(LuaCEmbed *self,const char *name,LuaCEmbedTable *value);
2375523772

23773+
long long (*get_long_lib_prop)(LuaCEmbed *self,const char *name);
23774+
double (*get_double_lib_prop)(LuaCEmbed *self,const char *name);
23775+
bool (*get_bool_lib_prop)(LuaCEmbed *self,const char *name);
23776+
char * (*get_string_lib_prop)(LuaCEmbed *self,const char *name);
23777+
LuaCEmbedTable *(*get_table_lib_prop)(LuaCEmbed *self,const char *name);
2375623778

2375723779
int (*evaluete_file)(LuaCEmbed *self, const char *file);
2375823780
void (*add_callback)(LuaCEmbed *self, const char *callback_name, LuaCEmbedResponse* (*callback)(LuaCEmbed *args) );
@@ -23935,7 +23957,11 @@ LuaCEmbed * newLuaCEmbedLib(lua_State *state,bool public_functions){
2393523957
if(lua_type(self->state,-1) == LUA_CEMBED_NIL){
2393623958
self->lib_identifier = lua_tointeger(self->state,-1);
2393723959
}
23960+
2393823961
self->lib_identifier +=1;
23962+
23963+
self->main_lib_table = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__,self->lib_identifier);
23964+
2393923965
lua_pushinteger(self->state,self->lib_identifier);
2394023966
lua_setglobal(self->state,PRIVATE_LUA_CEMBED_TOTAL_LIBS);
2394123967

@@ -24100,7 +24126,9 @@ void LuaCEmbed_free(LuaCEmbed *self){
2410024126
if(self->error_msg){
2410124127
free(self->error_msg);
2410224128
}
24103-
24129+
if(self->main_lib_table){
24130+
free(self->main_lib_table);
24131+
}
2410424132
free(self);
2410524133
}
2410624134

@@ -24520,7 +24548,6 @@ LuaCEmbedTable * private_newLuaCembedTable(LuaCEmbed *main_embed, const char *fo
2452024548
if(previews_function){
2452124549
lua_getglobal(self->main_object->state,previews_function);
2452224550
}
24523-
2452424551
for(int i = 0; i < size; i++){
2452524552
char *formated = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MULTIRETURN_,self->main_object->stack_leve,i);
2452624553
lua_getglobal(self->main_object->state,formated);
@@ -24835,16 +24862,33 @@ bool LuaCEmbedTable_get_bool_by_index(LuaCEmbedTable *self, int index){
2483524862

2483624863
int LuaCEmbedTable_get_type_prop(LuaCEmbedTable *self, const char *name){
2483724864
PRIVATE_LUA_CEMBED_TABLE_PROTECT_NUM
24838-
lua_settop(self->main_object->state,0);
24839-
2484024865
private_lua_cembed_memory_limit = self->main_object->memory_limit;
24841-
2484224866
lua_getglobal(self->main_object->state,self->global_name);
24843-
lua_pushstring(self->main_object->state, name); // Empilha a chave "nome"
24844-
lua_gettable(self->main_object->state, -2);
24845-
int value = lua_type(self->main_object->state,-1);
24867+
int table_index = lua_gettop(self->main_object->state);
24868+
24869+
lua_pushnil(self->main_object->state);
24870+
while(lua_next(self->main_object->state,table_index)){
24871+
24872+
bool has_key =lua_type(self->main_object->state,-2) == LUA_CEMBED_STRING;
24873+
if(!has_key){
24874+
lua_pop(self->main_object->state,1);
24875+
continue;
24876+
}
24877+
char* key = (char*)lua_tostring(self->main_object->state,-2);
24878+
24879+
if(strcmp(key,name) != 0){
24880+
lua_pop(self->main_object->state,1);
24881+
continue;
24882+
}
24883+
24884+
int type = lua_type(self->main_object->state,-1);
24885+
lua_pop(self->main_object->state,1);
24886+
PRIVATE_LUA_CEMBED_CLEAR_STACK
24887+
return type;
24888+
}
24889+
2484624890
PRIVATE_LUA_CEMBED_CLEAR_STACK
24847-
return value;
24891+
return LUA_CEMBED_NIL;
2484824892
}
2484924893

2485024894
char* LuaCembedTable_get_string_prop(LuaCEmbedTable *self , const char *name){
@@ -26524,56 +26568,139 @@ void LuaCEmbed_set_long_lib_prop(LuaCEmbed *self,const char *name,long long valu
2652426568
}
2652526569

2652626570
void LuaCEmbed_set_double_lib_prop(LuaCEmbed *self,const char *name,double value){
26527-
char *main_lib_table = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__,self->lib_identifier);
2652826571

26529-
lua_getglobal(self->state,main_lib_table);
26572+
lua_getglobal(self->state,self->main_lib_table);
2653026573
lua_pushvalue(self->state,-1);
2653126574
//set the function name
2653226575
lua_pushstring(self->state,name);
2653326576
lua_pushnumber(self->state,value);
2653426577
lua_settable(self->state,-3);
26535-
free(main_lib_table);
2653626578

2653726579
}
2653826580

2653926581
void LuaCEmbed_set_bool_lib_prop(LuaCEmbed *self,const char *name,bool value){
26540-
char *main_lib_table = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__,self->lib_identifier);
2654126582

26542-
lua_getglobal(self->state,main_lib_table);
26583+
lua_getglobal(self->state,self->main_lib_table);
2654326584
lua_pushvalue(self->state,-1);
2654426585
//set the function name
2654526586
lua_pushstring(self->state,name);
2654626587
lua_pushboolean(self->state,value);
2654726588
lua_settable(self->state,-3);
26548-
free(main_lib_table);
2654926589

2655026590
}
2655126591

2655226592
void LuaCEmbed_set_string_lib_prop(LuaCEmbed *self,const char *name,const char * value){
26553-
char *main_lib_table = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__,self->lib_identifier);
2655426593

26555-
lua_getglobal(self->state,main_lib_table);
26594+
lua_getglobal(self->state,self->main_lib_table);
2655626595
lua_pushvalue(self->state,-1);
2655726596
//set the function name
2655826597
lua_pushstring(self->state,name);
2655926598
lua_pushstring(self->state,value);
2656026599
lua_settable(self->state,-3);
26561-
free(main_lib_table);
2656226600

2656326601
}
2656426602

2656526603
void LuaCEmbed_set_table_lib_prop(LuaCEmbed *self,const char *name,LuaCEmbedTable *value){
26566-
char *main_lib_table = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__,self->lib_identifier);
2656726604

26568-
lua_getglobal(self->state,main_lib_table);
26605+
lua_getglobal(self->state,self->main_lib_table);
2656926606
lua_pushvalue(self->state,-1);
2657026607
lua_pushstring(self->state,name);
2657126608
lua_getglobal(self->state,value->global_name);
2657226609
lua_settable(self->state,-3);
26573-
free(main_lib_table);
2657426610

2657526611
}
2657626612

26613+
int private_LuaCEmbed_ensure_lib_prop_type(LuaCEmbed *self,const char *name,int expected_type){
26614+
int type = lua_type(self->state,-1);
26615+
if(type!= expected_type){
26616+
privateLuaCEmbed_raise_error_not_jumping(
26617+
self,
26618+
PRIVATE_LUA_CEMBED_LIB_PROP_WRONG_TYPE,
26619+
name,
26620+
LuaCembed_convert_arg_code(type),
26621+
LuaCembed_convert_arg_code(expected_type)
26622+
);
26623+
return LUA_CEMBED_GENERIC_ERROR;
26624+
}
26625+
return LUA_CEMBED_OK;
26626+
}
26627+
26628+
long long LuaCEmbed_get_long_lib_prop(LuaCEmbed *self,const char *name){
26629+
lua_getglobal(self->state,self->main_lib_table);
26630+
lua_getfield(self->state, -1,name);
26631+
if(private_LuaCEmbed_ensure_lib_prop_type(self,name,LUA_CEMBED_NUMBER)){
26632+
return LUA_CEMBED_GENERIC_ERROR;
26633+
}
26634+
return lua_tointeger(self->state,-1);
26635+
26636+
}
26637+
26638+
double LuaCEmbed_get_double_lib_prop(LuaCEmbed *self,const char *name){
26639+
26640+
lua_getglobal(self->state,self->main_lib_table);
26641+
26642+
lua_getfield(self->state, -1,name);
26643+
if(private_LuaCEmbed_ensure_lib_prop_type(self,name,LUA_CEMBED_NUMBER)){
26644+
return LUA_CEMBED_GENERIC_ERROR;
26645+
}
26646+
return lua_tonumber(self->state,-1);
26647+
}
26648+
26649+
bool LuaCEmbed_get_bool_lib_prop(LuaCEmbed *self,const char *name){
26650+
26651+
lua_getglobal(self->state,self->main_lib_table);
26652+
26653+
lua_getfield(self->state, -1,name);
26654+
if(private_LuaCEmbed_ensure_lib_prop_type(self,name,LUA_CEMBED_BOOL)){
26655+
return LUA_CEMBED_GENERIC_ERROR;
26656+
}
26657+
return lua_toboolean(self->state,-1);
26658+
}
26659+
26660+
char * LuaCEmbed_get_string_lib_prop(LuaCEmbed *self,const char *name){
26661+
lua_getglobal(self->state,self->main_lib_table);
26662+
26663+
lua_getfield(self->state, -1,name);
26664+
if(private_LuaCEmbed_ensure_lib_prop_type(self,name,LUA_CEMBED_STRING)){
26665+
return NULL;
26666+
}
26667+
return (char*)lua_tostring(self->state,-1);
26668+
}
26669+
26670+
LuaCEmbedTable *LuaCEmbed_get_table_lib_prop(LuaCEmbed *self,const char *name){
26671+
;
26672+
lua_getglobal(self->state,self->main_lib_table);
26673+
26674+
lua_getfield(self->state, -1,name);
26675+
if(private_LuaCEmbed_ensure_lib_prop_type(self,name,LUA_CEMBED_TABLE)){
26676+
return NULL;
26677+
}
26678+
26679+
char *global_sub_table_name = private_LuaCembed_format(
26680+
PRIVATE_LUA_CEMBED_MAIN_LIB_SUB_TABLE,
26681+
self->lib_identifier,
26682+
name
26683+
);
26684+
lua_setglobal(self->state,global_sub_table_name);
26685+
26686+
privateLuaCEmbedTableArray *target = (privateLuaCEmbedTableArray*)privateLuaCEmbed_get_current_table_array(self);
26687+
26688+
LuaCEmbedTable *possible = privateLuaCEmbedTableArray_find_by_global_name(target,global_sub_table_name);
26689+
if(possible){
26690+
free(global_sub_table_name);
26691+
return possible;
26692+
}
26693+
26694+
LuaCEmbedTable *creaeted = private_newLuaCembedTable(self, "%s",global_sub_table_name);
26695+
free(global_sub_table_name);
26696+
26697+
privateLuaCEmbedTableArray_append(
26698+
target,
26699+
creaeted
26700+
);
26701+
return creaeted;
26702+
}
26703+
2657726704

2657826705

2657926706

@@ -26798,6 +26925,11 @@ LuaCEmbedNamespace newLuaCEmbedNamespace(){
2679826925
self.set_double_lib_prop = LuaCEmbed_set_double_lib_prop;
2679926926
self.set_string_lib_prop = LuaCEmbed_set_string_lib_prop;
2680026927
self.set_table_lib_prop = LuaCEmbed_set_table_lib_prop;
26928+
self.get_long_lib_prop = LuaCEmbed_get_long_lib_prop;
26929+
self.get_double_lib_prop = LuaCEmbed_get_double_lib_prop;
26930+
self.get_bool_lib_prop = LuaCEmbed_get_bool_lib_prop;
26931+
self.get_string_lib_prop = LuaCEmbed_get_string_lib_prop;
26932+
self.get_table_lib_prop = LuaCEmbed_get_table_lib_prop;
2680126933

2680226934
self.free = LuaCEmbed_free;
2680326935
return self;

main

4.73 KB
Binary file not shown.

src/LuaCEmbed/LuaCEmbed.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ typedef struct LuaCEmbed{
1414
void *func_tables;
1515
int lib_identifier;
1616
int stack_leve;
17+
char *main_lib_table;
1718
}LuaCEmbed;
1819

1920

src/LuaCEmbed/basic/basic.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ void LuaCEmbed_free(LuaCEmbed *self){
119119
if(self->error_msg){
120120
free(self->error_msg);
121121
}
122-
122+
if(self->main_lib_table){
123+
free(self->main_lib_table);
124+
}
123125
free(self);
124126
}

0 commit comments

Comments
 (0)