summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2011-12-19 17:03:42 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2011-12-19 17:03:42 (GMT)
commita523dcab798722f569f801ee7190bbff1d104770 (patch)
tree26b96861d9b96d9353345a5aff0285457539c9ee /src
parent5e0bec261c621246170f356285851601e603ba9a (diff)
downloadpowder-a523dcab798722f569f801ee7190bbff1d104770.zip
powder-a523dcab798722f569f801ee7190bbff1d104770.tar.gz
Attempt to speed up tpt.parts without using billions of memory
Diffstat (limited to 'src')
-rw-r--r--src/luaconsole.c110
1 files changed, 43 insertions, 67 deletions
diff --git a/src/luaconsole.c b/src/luaconsole.c
index 4bfeb4d..360fef7 100644
--- a/src/luaconsole.c
+++ b/src/luaconsole.c
@@ -14,7 +14,7 @@ int *mouseclick_functions = NULL;
int tptProperties; //Table for some TPT properties
int tptPropertiesVersion;
int tptElements; //Table for TPT element names
-int tptParts, tptPartsMeta, tptElementTransitions;
+int tptParts, tptPartsMeta, tptElementTransitions, tptPartsCData, tptPartMeta, tptPart, cIndex;
void luacon_open(){
int i = 0, j;
char tmpname[12];
@@ -116,33 +116,11 @@ tpt.parts = ffi.cast(\"particle *\", tpt.partsdata)\n\
ffi = nil\n\
tpt.partsdata = nil");
//Since ffi is REALLY REALLY dangrous, we'll remove it from the environment completely (TODO)
-
+ //lua_pushstring(l, "parts");
+ //tptPartsCData = lua_gettable(l, tptProperties);
#else
- //This uses a lot of memory (60MB+), but very good performance
lua_newtable(l);
tptParts = lua_gettop(l);
- for(i = 0; i < NPART; i++)
- {
- int currentPart, currentPartMeta;
- lua_newtable(l);
- currentPart = lua_gettop(l);
- lua_newtable(l);
- currentPartMeta = lua_gettop(l);
- lua_pushinteger(l, i);
- lua_setfield(l, currentPart, "id");
- lua_pushcfunction(l, luacon_partwrite);
- lua_setfield(l, currentPartMeta, "__newindex");
- lua_pushcfunction(l, luacon_partread);
- lua_setfield(l, currentPartMeta, "__index");
- lua_setmetatable(l, currentPart);
-
- lua_rawseti (l, tptParts, i);
- }
- lua_setfield(l, tptProperties, "parts");
-
- //Poor performance (nested metatabled created on get/set) but good little memory usage
- /*lua_newtable(l);
- tptParts = lua_gettop(l);
lua_newtable(l);
tptPartsMeta = lua_gettop(l);
lua_pushcfunction(l, luacon_partswrite);
@@ -150,7 +128,19 @@ tpt.partsdata = nil");
lua_pushcfunction(l, luacon_partsread);
lua_setfield(l, tptPartsMeta, "__index");
lua_setmetatable(l, tptParts);
- lua_setfield(l, tptProperties, "parts");*/
+ lua_setfield(l, tptProperties, "parts");
+
+ lua_newtable(l);
+ tptPart = lua_gettop(l);
+ lua_newtable(l);
+ tptPartMeta = lua_gettop(l);
+ lua_pushcfunction(l, luacon_partwrite);
+ lua_setfield(l, tptPartMeta, "__newindex");
+ lua_pushcfunction(l, luacon_partread);
+ lua_setfield(l, tptPartMeta, "__index");
+ lua_setmetatable(l, tptPart);
+
+ tptPart = luaL_ref(l, LUA_REGISTRYINDEX);
#endif
lua_newtable(l);
@@ -211,30 +201,29 @@ tpt.partsdata = nil");
}
#ifndef FFI
int luacon_partread(lua_State* l){
- int format, offset;
- char * tempstring;
- int tempinteger;
+ int format, offset, tempinteger;
float tempfloat;
int i;
char * key = mystrdup(luaL_optstring(l, 2, ""));
offset = luacon_particle_getproperty(key, &format);
- free(key);
-
- //Get Raw Index value for particle
- lua_pushstring(l, "id");
- lua_rawget(l, 1);
-
- i = lua_tointeger (l, lua_gettop(l));
-
- lua_pop(l, 1);
+
+ i = cIndex;
if(i < 0 || i >= NPART || offset==-1)
{
- if(i < 0 || i >= NPART)
+ if(i < 0 || i >= NPART) {
+ free(key);
return luaL_error(l, "Out of range");
- else
+ } else if(strcmp(key, "id")==0) {
+ free(key);
+ lua_pushnumber(l, i);
+ return 1;
+ } else {
+ free(key);
return luaL_error(l, "Invalid property");
+ }
}
+ free(key);
switch(format)
{
case 0:
@@ -250,29 +239,23 @@ int luacon_partread(lua_State* l){
}
int luacon_partwrite(lua_State* l){
int format, offset;
- char * tempstring;
- int tempinteger;
- float tempfloat;
int i;
char * key = mystrdup(luaL_optstring(l, 2, ""));
offset = luacon_particle_getproperty(key, &format);
- free(key);
-
- //Get Raw Index value for particle
- lua_pushstring(l, "id");
- lua_rawget(l, 1);
- i = lua_tointeger (l, lua_gettop(l));
-
- lua_pop(l, 1);
+ i = cIndex;
if(i < 0 || i >= NPART || offset==-1)
{
- if(i < 0 || i >= NPART)
- return luaL_error(l, "Out of range");
- else
+ if(i < 0 || i >= NPART) {
+ free(key);
+ return luaL_error(l, "array index out of bounds");
+ } else {
+ free(key);
return luaL_error(l, "Invalid property");
+ }
}
+ free(key);
switch(format)
{
case 0:
@@ -294,23 +277,16 @@ int luacon_partsread(lua_State* l){
i = luaL_optinteger(l, 2, 0);
if(i<0 || i>=NPART)
- return luaL_error(l, "Out of range");
+ {
+ return luaL_error(l, "array index out of bounds");
+ }
- lua_newtable(l);
- currentPart = lua_gettop(l);
- lua_newtable(l);
- currentPartMeta = lua_gettop(l);
- lua_pushinteger(l, i);
- lua_setfield(l, currentPart, "id");
- lua_pushcfunction(l, luacon_partwrite);
- lua_setfield(l, currentPartMeta, "__newindex");
- lua_pushcfunction(l, luacon_partread);
- lua_setfield(l, currentPartMeta, "__index");
- lua_setmetatable(l, currentPart);
+ lua_rawgeti(l, LUA_REGISTRYINDEX, tptPart);
+ cIndex = i;
return 1;
}
int luacon_partswrite(lua_State* l){
- return luaL_error(l, "Not writable");
+ return luaL_error(l, "table readonly");
}
#endif
int luacon_particle_getproperty(char * key, int * format)