mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-29 20:50:58 +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 WSTRING2(s) L ## s
|
||||||
#define WSTRING(s) WSTRING2 (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__
|
#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
|
// 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
|
// 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
|
// 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
|
/* OLD HACK
|
||||||
// check first linedef to figure which of its sectors owns this sector->lines pointer
|
// 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.");
|
return luaL_error(L, "accessed sector_t.lines doesn't exist anymore.");
|
||||||
|
|
||||||
// see comments in the _get function above
|
// 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);
|
lua_pushinteger(L, numoflines);
|
||||||
return 1;
|
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)
|
if (!numofverts)
|
||||||
return luaL_error(L, "no vertices found!");
|
return luaL_error(L, "no vertices found!");
|
||||||
|
@ -120,7 +120,7 @@ static int polyobjvertices_num(lua_State *L)
|
||||||
if (!polyverts || !(*polyverts))
|
if (!polyverts || !(*polyverts))
|
||||||
return luaL_error(L, "accessed polyobj_t.vertices doesn't exist anymore.");
|
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);
|
lua_pushinteger(L, numofverts);
|
||||||
return 1;
|
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)
|
if (!numoflines)
|
||||||
return luaL_error(L, "no lines found!");
|
return luaL_error(L, "no lines found!");
|
||||||
|
@ -177,7 +177,7 @@ static int polyobjlines_num(lua_State *L)
|
||||||
if (!polylines || !(*polylines))
|
if (!polylines || !(*polylines))
|
||||||
return luaL_error(L, "accessed polyobj_t.lines doesn't exist anymore.");
|
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);
|
lua_pushinteger(L, numoflines);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue