#include "nasal.h"
#include "data.h"
-static void realloc(struct naVec* v)
+static struct VecRec* newvecrec(struct VecRec* old)
{
- struct VecRec* old = v->rec;
int i, oldsz = old ? old->size : 0, newsz = 1 + ((oldsz*3)>>1);
struct VecRec* vr = naAlloc(sizeof(struct VecRec) + sizeof(naRef) * newsz);
if(oldsz > newsz) oldsz = newsz; // race protection
vr->size = oldsz;
for(i=0; i<oldsz; i++)
vr->array[i] = old->array[i];
+ return vr;
+}
+
+static void realloc(struct naVec* v)
+{
+ struct VecRec* vr = newvecrec(v->rec);
naGC_swapfree((void**)&(v->rec), vr);
}
{
if(IS_VEC(v)) {
struct VecRec* r = v.ref.ptr.vec->rec;
- if(r && i < r->size) return r->array[i];
+ if(r) {
+ if(i < 0) i += r->size;
+ if(i >= 0 && i < r->size) return r->array[i];
+ }
}
return naNil();
}
{
if(IS_VEC(vec)) {
struct VecRec* r = vec.ref.ptr.vec->rec;
- if(!r || r->size >= r->alloced) {
+ while(!r || r->size >= r->alloced) {
realloc(vec.ref.ptr.vec);
r = vec.ref.ptr.vec->rec;
}