refactor and add couple of api functions

pull/81/head
Dibyendu Majumdar 9 years ago
parent 6543367bfc
commit 9843f4fdc2

@ -129,6 +129,8 @@ LUAI_FUNC const TValue *raviH_slice_parent(lua_State *L, TValue *slice);
raviH_set_float(L, t, ukey, (value)); \
}
LUAI_FUNC void raviH_get_number_array_rawdata(lua_State *L, Table *t, lua_Number **startp, lua_Number **endp);
#if defined(LUA_DEBUG)
LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);
LUAI_FUNC int luaH_isdummy (Node *n);

@ -468,6 +468,8 @@ LUA_API void ravi_createnumberarray(lua_State *L, int narray,
lua_Number initial_value);
LUA_API void ravi_create_slice(lua_State *L, int idx, unsigned int start,
unsigned int len);
LUA_API int ravi_is_numberarray(lua_State *L, int stackpos);
LUA_API void ravi_get_numberarray_rawdata(lua_State *l, int stackpos, lua_Number **startp, lua_Number **endp);
LUA_API void ravi_dump_stack(lua_State *L, const char *s);
struct Proto;

@ -766,6 +766,17 @@ LUA_API void ravi_createnumberarray(lua_State *L, int narray,
lua_unlock(L);
}
LUA_API int ravi_is_numberarray(lua_State *L, int idx) {
StkId o = index2addr(L, idx);
return (ttistable(o) && hvalue(o)->ravi_array.array_type == RAVI_TARRAYFLT ? 1 : 0);
}
LUA_API void ravi_get_numberarray_rawdata(lua_State *L, int idx, lua_Number **startp, lua_Number **endp) {
StkId o = index2addr(L, idx);
lua_assert(ttistable(o) && hvalue(o)->ravi_array.array_type == RAVI_TARRAYFLT);
raviH_get_number_array_rawdata(L, hvalue(o), startp, endp);
}
/* Create a slice of an existing array
* The original table containing the array is inserted into the
* the slice as a value against special key so that
@ -778,33 +789,31 @@ LUA_API void ravi_createnumberarray(lua_State *L, int narray,
* and in fact may point to garbage from a memory allocater's point of view.
*/
LUA_API void ravi_create_slice(lua_State *L, int idx, unsigned int start,
unsigned int len) {
unsigned int len) {
TValue *parent;
Table *slice;
lua_lock(L);
const char *errmsg = NULL;
/* The do-while loop here is just for error handling */
do {
parent = index2addr(L, idx);
if (!ttistable(parent)) {
errmsg = "integer[] or number[] expected";
break;
}
Table *orig = hvalue(parent);
if (orig->ravi_array.array_type == RAVI_TTABLE) {
errmsg =
"cannot create a slice of a table, integer[] or number[] expected";
break;
}
if (start < 1 || start + len > orig->ravi_array.len) {
errmsg = "cannot create a slice of given bounds";
break;
}
luaC_checkGC(L);
slice = raviH_new_slice(L, parent, start, len);
sethvalue(L, L->top, slice);
api_incr_top(L);
} while (0);
parent = index2addr(L, idx);
if (!ttistable(parent)) {
errmsg = "integer[] or number[] expected";
goto done;
}
Table *orig = hvalue(parent);
if (orig->ravi_array.array_type == RAVI_TTABLE) {
errmsg = "cannot create a slice of a table, integer[] or number[] expected";
goto done;
}
if (start < 1 || start + len > orig->ravi_array.len) {
errmsg = "cannot create a slice of given bounds";
goto done;
}
luaC_checkGC(L);
slice = raviH_new_slice(L, parent, start, len);
sethvalue(L, L->top, slice);
api_incr_top(L);
done:
lua_unlock(L);
if (errmsg)
luaG_runerror(L, errmsg);

@ -806,6 +806,13 @@ Table *raviH_new_number_array(lua_State *L, unsigned int len,
return t;
}
void raviH_get_number_array_rawdata(lua_State *L, Table *t, lua_Number **startp, lua_Number **endp) {
lua_assert(t->ravi_array.array_type == RAVI_TARRAYFLT);
lua_Number *data = (lua_Number *)t->ravi_array.data;
*startp = data;
*endp = data + t->ravi_array.len + 1;
}
static const char *key_orig_table = "Originaltable";
/* Create a slice of an existing array

Loading…
Cancel
Save