lua-utils: allow and handle 64- and 32-bit array size members.
authorKrisztian Litkey <kli@iki.fi>
Wed, 10 Dec 2014 22:11:21 +0000 (00:11 +0200)
committerKrisztian Litkey <krisztian.litkey@intel.com>
Fri, 12 Dec 2014 15:37:33 +0000 (17:37 +0200)
src/core/lua-utils/object.c
src/core/lua-utils/object.h

index 280f96d..c0bc029 100644 (file)
@@ -1160,7 +1160,12 @@ static int default_setter(void *data, lua_State *L, int member,
     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);
 
@@ -1187,10 +1192,13 @@ static int default_setter(void *data, lua_State *L, int member,
         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)
@@ -1251,11 +1259,18 @@ static int default_setter(void *data, lua_State *L, int member,
     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:
@@ -1479,6 +1494,15 @@ int mrp_lua_declare_members(mrp_lua_classdef_t *def, mrp_lua_class_flag_t flags,
             }
         }
 
+        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;
 
@@ -2230,10 +2254,14 @@ int mrp_lua_set_member(void *data, lua_State *L, char *err, size_t esize)
                                          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;
 
index 5be687e..3838e1b 100644 (file)
@@ -339,7 +339,10 @@ union mrp_lua_value_u {
     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 */
@@ -354,9 +357,10 @@ union mrp_lua_value_u {
 
 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 */
@@ -590,10 +594,11 @@ struct mrp_lua_class_member_s {
     {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) \