mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-17 23:21:22 +00:00
Merge branch 'reverse-offsetof-macro' into 'next'
Turn the lua sector lines hack into a macro See merge request STJr/SRB2!1187
This commit is contained in:
commit
86c38e6d9a
3 changed files with 14 additions and 6 deletions
|
@ -371,4 +371,12 @@ typedef UINT32 tic_t;
|
|||
#define WSTRING2(s) L ## s
|
||||
#define WSTRING(s) WSTRING2 (s)
|
||||
|
||||
/*
|
||||
A hack by Monster Iestyn: Return a pointer to a field of
|
||||
a struct from a pointer to another field in the struct.
|
||||
Needed for some lua shenanigans.
|
||||
*/
|
||||
#define FIELDFROM( type, field, have, want ) \
|
||||
(void *)((intptr_t)(field) - offsetof (type, have) + offsetof (type, want))
|
||||
|
||||
#endif //__DOOMTYPE__
|
||||
|
|
|
@ -489,7 +489,7 @@ static int sectorlines_get(lua_State *L)
|
|||
// get the "linecount" by shifting our retrieved memory address of "lines" to where "linecount" is in the sector_t, then dereferencing the result
|
||||
// we need this to determine the array's actual size, and therefore also the maximum value allowed as an index
|
||||
// this only works if seclines is actually a pointer to a sector's lines member in memory, oh boy
|
||||
numoflines = (size_t)(*(size_t *)(((size_t)seclines) - (offsetof(sector_t, lines) - offsetof(sector_t, linecount))));
|
||||
numoflines = *(size_t *)FIELDFROM (sector_t, seclines, lines,/* -> */linecount);
|
||||
|
||||
/* OLD HACK
|
||||
// check first linedef to figure which of its sectors owns this sector->lines pointer
|
||||
|
@ -523,7 +523,7 @@ static int sectorlines_num(lua_State *L)
|
|||
return luaL_error(L, "accessed sector_t.lines doesn't exist anymore.");
|
||||
|
||||
// see comments in the _get function above
|
||||
numoflines = (size_t)(*(size_t *)(((size_t)seclines) - (offsetof(sector_t, lines) - offsetof(sector_t, linecount))));
|
||||
numoflines = *(size_t *)FIELDFROM (sector_t, seclines, lines,/* -> */linecount);
|
||||
lua_pushinteger(L, numoflines);
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ static int polyobjvertices_get(lua_State *L)
|
|||
}
|
||||
}
|
||||
|
||||
numofverts = (size_t)(*(size_t *)(((size_t)polyverts) - (offsetof(polyobj_t, vertices) - offsetof(polyobj_t, numVertices))));
|
||||
numofverts = *(size_t *)FIELDFROM (polyobj_t, polyverts, vertices,/* -> */numVertices);
|
||||
|
||||
if (!numofverts)
|
||||
return luaL_error(L, "no vertices found!");
|
||||
|
@ -120,7 +120,7 @@ static int polyobjvertices_num(lua_State *L)
|
|||
if (!polyverts || !(*polyverts))
|
||||
return luaL_error(L, "accessed polyobj_t.vertices doesn't exist anymore.");
|
||||
|
||||
numofverts = (size_t)(*(size_t *)(((size_t)polyverts) - (offsetof(polyobj_t, vertices) - offsetof(polyobj_t, numVertices))));
|
||||
numofverts = *(size_t *)FIELDFROM (polyobj_t, polyverts, vertices,/* -> */numVertices);
|
||||
lua_pushinteger(L, numofverts);
|
||||
return 1;
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ static int polyobjlines_get(lua_State *L)
|
|||
}
|
||||
}
|
||||
|
||||
numoflines = (size_t)(*(size_t *)(((size_t)polylines) - (offsetof(polyobj_t, lines) - offsetof(polyobj_t, numLines))));
|
||||
numoflines = *(size_t *)FIELDFROM (polyobj_t, polylines, lines,/* -> */numLines);
|
||||
|
||||
if (!numoflines)
|
||||
return luaL_error(L, "no lines found!");
|
||||
|
@ -177,7 +177,7 @@ static int polyobjlines_num(lua_State *L)
|
|||
if (!polylines || !(*polylines))
|
||||
return luaL_error(L, "accessed polyobj_t.lines doesn't exist anymore.");
|
||||
|
||||
numoflines = (size_t)(*(size_t *)(((size_t)polylines) - (offsetof(polyobj_t, lines) - offsetof(polyobj_t, numLines))));
|
||||
numoflines = *(size_t *)FIELDFROM (polyobj_t, polylines, lines,/* -> */numLines);
|
||||
lua_pushinteger(L, numoflines);
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue