Skip to content

Commit 2549228

Browse files
at
1 parent 31c3d0e commit 2549228

File tree

6 files changed

+116
-20
lines changed

6 files changed

+116
-20
lines changed

LuaCEmbed.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24418,13 +24418,22 @@ void LuaCEmbedTable_set_method(LuaCEmbedTable *self , const char *name, LuaCEmbe
2441824418
is_meta = true;
2441924419
}
2442024420
}
24421-
bool is_normal = !is_meta;
24421+
lua_getglobal(self->main_object->state,self->global_name);
2442224422

2442324423
if(is_meta){
24424-
luaL_newmetatable(self->main_object->state,PRIVATE_LUA_CEMBED_TABLE_META_NAME);
24425-
}
24426-
if(is_normal){
24427-
lua_getglobal(self->main_object->state,self->global_name);
24424+
24425+
24426+
int found =lua_getmetatable(self->main_object->state,-1);
24427+
if(!found){
24428+
24429+
//equivalent of meta ={} ;setmetatable(table,meta)
24430+
lua_getglobal(self->main_object->state,self->global_name);
24431+
lua_newtable(self->main_object->state);
24432+
lua_setmetatable(self->main_object->state,-2);
24433+
24434+
lua_getglobal(self->main_object->state,self->global_name);
24435+
lua_getmetatable(self->main_object->state,-1);
24436+
}
2442824437
}
2442924438

2443024439

@@ -24443,8 +24452,10 @@ void LuaCEmbedTable_set_method(LuaCEmbedTable *self , const char *name, LuaCEmbe
2444324452
lua_settable(self->main_object->state,-3);
2444424453

2444524454
if(is_meta){
24455+
//equivalent of meta ={} ;setmetatable(table,meta)
2444624456
lua_getglobal(self->main_object->state,self->global_name);
24447-
luaL_setmetatable(self->main_object->state,PRIVATE_LUA_CEMBED_TABLE_META_NAME);
24457+
lua_getmetatable(self->main_object->state,-1);
24458+
lua_setmetatable(self->main_object->state,-2);
2444824459
}
2444924460

2445024461
}

main

320 KB
Binary file not shown.

main.c

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,58 @@
11
#include "src/one.c"
22

3-
int main(){
43

5-
}
4+
LuaCEmbedNamespace lua_n;
5+
6+
7+
8+
LuaCEmbedResponse * index_callback(LuaCEmbedTable *self, LuaCEmbed *args){
9+
10+
11+
12+
13+
int value_type = lua_n.args.get_type(args,1);
14+
15+
if(value_type == lua_n.types.NUMBER){
16+
printf("index-value: %lf\n",lua_n.args.get_double(args,1));
17+
}
18+
19+
else if(value_type == lua_n.types.STRING){
20+
printf("index-value: %s\n",lua_n.args.get_str(args,1));
21+
}
22+
23+
24+
return NULL;
25+
}
26+
27+
LuaCEmbedResponse * deletion_callback(LuaCEmbedTable *self, LuaCEmbed *args){
28+
29+
printf("called the delete function\n");
30+
return NULL;
31+
}
32+
33+
LuaCEmbedResponse * create_table(LuaCEmbed *args){
34+
35+
LuaCEmbedTable *custom_table = lua_n.tables.new_anonymous_table(args);
36+
lua_n.tables.set_method(custom_table,"__gc",deletion_callback);
37+
lua_n.tables.set_method(custom_table,"__index",index_callback);
38+
return lua_n.response.send_table(custom_table);
39+
40+
}
41+
42+
int main(int argc, char *argv[]){
43+
44+
lua_n = newLuaCEmbedNamespace();
45+
LuaCEmbed * l = lua_n.newLuaEvaluation();
46+
lua_n.add_callback(l,"create_object", create_table);
47+
lua_n.evaluate(l,"r = create_object()");
48+
lua_n.evaluate(l,"v = r[10]");
49+
lua_n.evaluate(l,"v = r['sss']");
50+
51+
if(lua_n.has_errors(l)){
52+
printf("error: %s\n",lua_n.get_error_message(l));
53+
}
54+
55+
lua_n.free(l);
56+
57+
return 0;
58+
}

src/LuaCEmbed/table/table/setters/keys/keys.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,22 @@ void LuaCEmbedTable_set_method(LuaCEmbedTable *self , const char *name, LuaCEmbe
1414
is_meta = true;
1515
}
1616
}
17-
bool is_normal = !is_meta;
17+
lua_getglobal(self->main_object->state,self->global_name);
1818

1919
if(is_meta){
20-
luaL_newmetatable(self->main_object->state,PRIVATE_LUA_CEMBED_TABLE_META_NAME);
21-
}
22-
if(is_normal){
23-
lua_getglobal(self->main_object->state,self->global_name);
20+
21+
22+
int found =lua_getmetatable(self->main_object->state,-1);
23+
if(!found){
24+
25+
//equivalent of meta ={} ;setmetatable(table,meta)
26+
lua_getglobal(self->main_object->state,self->global_name);
27+
lua_newtable(self->main_object->state);
28+
lua_setmetatable(self->main_object->state,-2);
29+
30+
lua_getglobal(self->main_object->state,self->global_name);
31+
lua_getmetatable(self->main_object->state,-1);
32+
}
2433
}
2534

2635

@@ -39,8 +48,10 @@ void LuaCEmbedTable_set_method(LuaCEmbedTable *self , const char *name, LuaCEmbe
3948
lua_settable(self->main_object->state,-3);
4049

4150
if(is_meta){
51+
//equivalent of meta ={} ;setmetatable(table,meta)
4252
lua_getglobal(self->main_object->state,self->global_name);
43-
luaL_setmetatable(self->main_object->state,PRIVATE_LUA_CEMBED_TABLE_META_NAME);
53+
lua_getmetatable(self->main_object->state,-1);
54+
lua_setmetatable(self->main_object->state,-2);
4455
}
4556

4657
}

teste.lua

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
3+
local meta = {}
4+
local normal = {}
5+
setmetatable(normal,meta)
6+
7+
8+
meta.__gc = function (t1,t2)
9+
print("chamou")
10+
end

tests/LuaCEmbed.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24418,13 +24418,22 @@ void LuaCEmbedTable_set_method(LuaCEmbedTable *self , const char *name, LuaCEmbe
2441824418
is_meta = true;
2441924419
}
2442024420
}
24421-
bool is_normal = !is_meta;
24421+
lua_getglobal(self->main_object->state,self->global_name);
2442224422

2442324423
if(is_meta){
24424-
luaL_newmetatable(self->main_object->state,PRIVATE_LUA_CEMBED_TABLE_META_NAME);
24425-
}
24426-
if(is_normal){
24427-
lua_getglobal(self->main_object->state,self->global_name);
24424+
24425+
24426+
int found =lua_getmetatable(self->main_object->state,-1);
24427+
if(!found){
24428+
24429+
//equivalent of meta ={} ;setmetatable(table,meta)
24430+
lua_getglobal(self->main_object->state,self->global_name);
24431+
lua_newtable(self->main_object->state);
24432+
lua_setmetatable(self->main_object->state,-2);
24433+
24434+
lua_getglobal(self->main_object->state,self->global_name);
24435+
lua_getmetatable(self->main_object->state,-1);
24436+
}
2442824437
}
2442924438

2443024439

@@ -24443,8 +24452,10 @@ void LuaCEmbedTable_set_method(LuaCEmbedTable *self , const char *name, LuaCEmbe
2444324452
lua_settable(self->main_object->state,-3);
2444424453

2444524454
if(is_meta){
24455+
//equivalent of meta ={} ;setmetatable(table,meta)
2444624456
lua_getglobal(self->main_object->state,self->global_name);
24447-
luaL_setmetatable(self->main_object->state,PRIVATE_LUA_CEMBED_TABLE_META_NAME);
24457+
lua_getmetatable(self->main_object->state,-1);
24458+
lua_setmetatable(self->main_object->state,-2);
2444824459
}
2444924460

2445024461
}

0 commit comments

Comments
 (0)