mrp_lua_class_member_t *m;
mrp_lua_value_t *vptr;
void **itemsp;
- size_t *nitemp;
+ union {
+ void *ptr;
+ size_t *size;
+ uint32_t *u32;
+ } nitemp;
+ size_t nitem;
mrp_lua_checkstack(L, -1);
case MRP_LUA_BOOLEAN_ARRAY:
case MRP_LUA_INTEGER_ARRAY:
case MRP_LUA_DOUBLE_ARRAY:
- itemsp = data + m->offs;
- nitemp = data + m->size;
- *itemsp = NULL;
- *nitemp = 0;
+ itemsp = data + m->offs;
+ nitemp.ptr = data + m->size;
+ *itemsp = NULL;
+ if (m->sizew == 8)
+ *nitemp.size = 0;
+ else
+ *nitemp.u32 = 0;
goto ok;
case MRP_LUA_OBJECT:
if (m->type_id == MRP_LUA_NONE)
case MRP_LUA_BOOLEAN_ARRAY:
case MRP_LUA_INTEGER_ARRAY:
case MRP_LUA_DOUBLE_ARRAY:
- itemsp = data + m->offs;
- nitemp = data + m->size;
- mrp_lua_object_free_array(itemsp, nitemp, m->type);
+ itemsp = data + m->offs;
+ nitemp.ptr = data + m->size;
+ if (m->sizew == 8)
+ nitem = *nitemp.size;
+ else
+ nitem = *nitemp.u32;
+ mrp_lua_object_free_array(itemsp, &nitem, m->type);
*itemsp = *v->array.items;
- *nitemp = *v->array.nitem;
+ if (m->sizew == 8)
+ *nitemp.size = *v->array.nitem64;
+ else
+ *nitemp.u32 = (uint32_t)*v->array.nitem64;
goto ok;
case MRP_LUA_OBJECT:
}
}
+ if (MRP_LUA_BOOLEAN_ARRAY <= members[i].type &&
+ members[i].type <= MRP_LUA_DOUBLE_ARRAY) {
+ if (members[i].sizew != 8 && members[i].sizew != 4) {
+ mrp_log_error("array member '%s': size must be 32- or 64-bit",
+ members[i].name);
+ goto fail;
+ }
+ }
+
if ((m->name = mrp_strdup(members[i].name)) == NULL)
goto fail;
err, esize) < 0)
return -1;
else {
- v.array.items = data + m->offs;
- v.array.nitem = data + m->size;
+ v.array.items = data + m->offs;
+ v.array.nitem64 = data + m->size;
+
*v.array.items = items;
- *v.array.nitem = nitem;
+ if (m->sizew == 8)
+ *v.array.nitem64 = nitem;
+ else
+ *v.array.nitem32 = (uint32_t)nitem;
}
goto ok;
int any; /* Lua reference */
struct { /* array value */
void **items; /* array items */
- size_t *nitem; /* number of items */
+ union {
+ size_t *nitem64; /* number of items */
+ int *nitem32; /* number of items */
+ };
} array;
struct {
int ref; /* object reference */
struct mrp_lua_class_member_s {
char *name; /* member name */
- mrp_lua_type_t type; /* memebr type */
+ mrp_lua_type_t type; /* member type */
size_t offs; /* offset within type buffer */
size_t size; /* offset to size within type buffer */
+ size_t sizew; /* width of size within type buffer */
const char *type_name; /* object type name */
mrp_lua_type_t type_id; /* object type id */
mrp_lua_setter_t setter; /* setter if any */
{MRP_LUA_CLASS_MEMBER(MRP_LUA_ANY, _name, _offs, _set, _get, _flags)},
/** Declare an automatic array and size member of the given type. */
-#define MRP_LUA_CLASS_ARRAY(_name, _type, _poffs, _noffs, _set, _get, _flags) \
+#define MRP_LUA_CLASS_ARRAY(_name, _type, _ctype, _p, _n, _set, _get, _flags) \
{MRP_LUA_CLASS_MEMBER(MRP_LUA_##_type##_ARRAY, _name, \
- _poffs, _set, _get, _flags) \
- .size = _noffs },
+ MRP_OFFSET(_ctype, _p), _set, _set, _flags) \
+ .size = MRP_OFFSET(_ctype, _n), \
+ .sizew = sizeof(((_ctype *)NULL)->_n) },
/** Declare an automatic object and reference member of the given type. */
#define MRP_LUA_CLASS_OBJECT(_name, _type, _poffs, _roffs, _set, _get, _flags) \