[DEV] remove sqVector and use etk::Vector (safer)

This commit is contained in:
Edouard DUPIN 2018-06-27 02:35:56 +02:00
parent 5e372fdbfa
commit 5377f4b891
18 changed files with 117 additions and 209 deletions

View File

@ -63,7 +63,7 @@ namespace rabbit {
}
Array* clone() {
Array *anew = create(NULL,0);
anew->m_data.copy(m_data);
anew->m_data = m_data;
return anew;
}
int64_t size() const {
@ -82,14 +82,14 @@ namespace rabbit {
m_data.reserve(_size);
}
void append(const SQObject& _o) {
m_data.push_back(_o);
m_data.pushBack(_o);
}
void extend(const Array* _a);
SQObjectPtr &top(){
return m_data.top();
return m_data.back();
}
void pop() {
m_data.pop_back();
m_data.popBack();
shrinkIfNeeded();
}
bool insert(int64_t _idx,const SQObject& _val) {
@ -101,10 +101,13 @@ namespace rabbit {
return true;
}
void shrinkIfNeeded() {
// TODO: Check this. No real need with etk ==> automatic ...
/*
if(m_data.size() <= m_data.capacity()>>2) {
//shrink the array
m_data.shrinktofit();
}
*/
}
bool remove(int64_t _idx) {
if( _idx < 0

View File

@ -431,7 +431,7 @@ SQRESULT sq_setparamscheck(HRABBITVM v,int64_t nparamscheck,const SQChar *typema
SQIntVec res;
if(!compileTypemask(res, typemask))
return sq_throwerror(v, _SC("invalid typemask"));
nc->_typecheck.copy(res);
nc->_typecheck = res;
}
else {
nc->_typecheck.resize(0);

View File

@ -25,8 +25,8 @@ SQClass::SQClass(SQSharedState *ss,SQClass *base)
if(_base) {
_constructoridx = _base->_constructoridx;
_udsize = _base->_udsize;
_defaultvalues.copy(base->_defaultvalues);
_methods.copy(base->_methods);
_defaultvalues = base->_defaultvalues;
_methods = base->_methods;
_COPY_VECTOR(_metamethods,base->_metamethods,MT_LAST);
__ObjaddRef(_base);
}
@ -83,7 +83,7 @@ bool SQClass::newSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr
SQClassMember m;
m.val = theval;
_members->newSlot(key,SQObjectPtr(_make_method_idx(_methods.size())));
_methods.push_back(m);
_methods.pushBack(m);
}
else {
_methods[_member_idx(temp)].val = theval;
@ -94,7 +94,7 @@ bool SQClass::newSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr
SQClassMember m;
m.val = val;
_members->newSlot(key,SQObjectPtr(_make_field_idx(_defaultvalues.size())));
_defaultvalues.push_back(m);
_defaultvalues.pushBack(m);
return true;
}

View File

@ -18,7 +18,7 @@ struct SQClassMember {
}
};
typedef sqvector<SQClassMember> SQClassMemberVec;
typedef etk::Vector<SQClassMember> SQClassMemberVec;
#define MEMBER_TYPE_METHOD 0x01000000
#define MEMBER_TYPE_FIELD 0x02000000

View File

@ -167,7 +167,7 @@ public:
if(ret->_env) __ObjaddRef(ret->_env);
ret->_name = _name;
_COPY_VECTOR(ret->_outervalues,_outervalues,_noutervalues);
ret->_typecheck.copy(_typecheck);
ret->_typecheck = _typecheck;
ret->_nparamscheck = _nparamscheck;
return ret;
}

View File

@ -65,13 +65,13 @@ struct SQScope {
#define BEGIN_BREAKBLE_BLOCK() int64_t __nbreaks__=_fs->_unresolvedbreaks.size(); \
int64_t __ncontinues__=_fs->_unresolvedcontinues.size(); \
_fs->_breaktargets.push_back(0);_fs->_continuetargets.push_back(0);
_fs->_breaktargets.pushBack(0);_fs->_continuetargets.pushBack(0);
#define END_BREAKBLE_BLOCK(continue_target) {__nbreaks__=_fs->_unresolvedbreaks.size()-__nbreaks__; \
__ncontinues__=_fs->_unresolvedcontinues.size()-__ncontinues__; \
if(__ncontinues__>0)ResolveContinues(_fs,__ncontinues__,continue_target); \
if(__nbreaks__>0)ResolveBreaks(_fs,__nbreaks__); \
_fs->_breaktargets.pop_back();_fs->_continuetargets.pop_back();}
_fs->_breaktargets.popBack();_fs->_continuetargets.popBack();}
class SQcompiler
{
@ -250,22 +250,22 @@ public:
break;}
case TK_BREAK:
if(_fs->_breaktargets.size() <= 0)error(_SC("'break' has to be in a loop block"));
if(_fs->_breaktargets.top() > 0){
_fs->addInstruction(_OP_POPTRAP, _fs->_breaktargets.top(), 0);
if(_fs->_breaktargets.back() > 0){
_fs->addInstruction(_OP_POPTRAP, _fs->_breaktargets.back(), 0);
}
RESOLVE_OUTERS();
_fs->addInstruction(_OP_JMP, 0, -1234);
_fs->_unresolvedbreaks.push_back(_fs->getCurrentPos());
_fs->_unresolvedbreaks.pushBack(_fs->getCurrentPos());
Lex();
break;
case TK_CONTINUE:
if(_fs->_continuetargets.size() <= 0)error(_SC("'continue' has to be in a loop block"));
if(_fs->_continuetargets.top() > 0) {
_fs->addInstruction(_OP_POPTRAP, _fs->_continuetargets.top(), 0);
if(_fs->_continuetargets.back() > 0) {
_fs->addInstruction(_OP_POPTRAP, _fs->_continuetargets.back(), 0);
}
RESOLVE_OUTERS();
_fs->addInstruction(_OP_JMP, 0, -1234);
_fs->_unresolvedcontinues.push_back(_fs->getCurrentPos());
_fs->_unresolvedcontinues.pushBack(_fs->getCurrentPos());
Lex();
break;
case TK_FUNCTION:
@ -1163,7 +1163,7 @@ public:
SQInstructionVec exp;
if(expsize > 0) {
for(int64_t i = 0; i < expsize; i++)
exp.push_back(_fs->getInstruction(expstart + i));
exp.pushBack(_fs->getInstruction(expstart + i));
_fs->popInstructions(expsize);
}
BEGIN_BREAKBLE_BLOCK()
@ -1231,7 +1231,7 @@ public:
int64_t tonextcondjmp = -1;
int64_t skipcondjmp = -1;
int64_t __nbreaks__ = _fs->_unresolvedbreaks.size();
_fs->_breaktargets.push_back(0);
_fs->_breaktargets.pushBack(0);
while(_token == TK_CASE) {
if(!bfirst) {
_fs->addInstruction(_OP_JMP, 0, 0);
@ -1274,7 +1274,7 @@ public:
_fs->popTarget();
__nbreaks__ = _fs->_unresolvedbreaks.size() - __nbreaks__;
if(__nbreaks__ > 0)ResolveBreaks(_fs, __nbreaks__);
_fs->_breaktargets.pop_back();
_fs->_breaktargets.popBack();
}
void FunctionStatement()
{
@ -1393,8 +1393,8 @@ public:
Lex();
_fs->addInstruction(_OP_PUSHTRAP,0,0);
_fs->_traps++;
if(_fs->_breaktargets.size()) _fs->_breaktargets.top()++;
if(_fs->_continuetargets.size()) _fs->_continuetargets.top()++;
if(_fs->_breaktargets.size()) _fs->_breaktargets.back()++;
if(_fs->_continuetargets.size()) _fs->_continuetargets.back()++;
int64_t trappos = _fs->getCurrentPos();
{
BEGIN_SCOPE();
@ -1403,8 +1403,8 @@ public:
}
_fs->_traps--;
_fs->addInstruction(_OP_POPTRAP, 1, 0);
if(_fs->_breaktargets.size()) _fs->_breaktargets.top()--;
if(_fs->_continuetargets.size()) _fs->_continuetargets.top()--;
if(_fs->_breaktargets.size()) _fs->_breaktargets.back()--;
if(_fs->_continuetargets.size()) _fs->_continuetargets.back()--;
_fs->addInstruction(_OP_JMP, 0, 0);
int64_t jmppos = _fs->getCurrentPos();
_fs->setIntructionParam(trappos, 1, (_fs->getCurrentPos() - trappos));
@ -1543,14 +1543,14 @@ public:
funcstate->dump(func);
#endif
_fs = currchunk;
_fs->_functions.push_back(func);
_fs->_functions.pushBack(func);
_fs->popChildState();
}
void ResolveBreaks(SQFuncState *funcstate, int64_t ntoresolve)
{
while(ntoresolve > 0) {
int64_t pos = funcstate->_unresolvedbreaks.back();
funcstate->_unresolvedbreaks.pop_back();
funcstate->_unresolvedbreaks.popBack();
//set the jmp instruction
funcstate->setIntructionParams(pos, 0, funcstate->getCurrentPos() - pos, 0);
ntoresolve--;
@ -1560,7 +1560,7 @@ public:
{
while(ntoresolve > 0) {
int64_t pos = funcstate->_unresolvedcontinues.back();
funcstate->_unresolvedcontinues.pop_back();
funcstate->_unresolvedcontinues.popBack();
//set the jmp instruction
funcstate->setIntructionParams(pos, 0, targetpos - pos, 0);
ntoresolve--;

View File

@ -53,9 +53,9 @@ struct SQLocalVarInfo
struct SQLineInfo { int64_t _line;int64_t _op; };
typedef sqvector<SQOuterVar> SQOuterVarVec;
typedef sqvector<SQLocalVarInfo> SQLocalVarInfoVec;
typedef sqvector<SQLineInfo> SQLineInfoVec;
typedef etk::Vector<SQOuterVar> SQOuterVarVec;
typedef etk::Vector<SQLocalVarInfo> SQLocalVarInfoVec;
typedef etk::Vector<SQLineInfo> SQLineInfoVec;
#define _FUNC_SIZE(ni,nl,nparams,nfuncs,nouters,nlineinf,localinf,defparams) (sizeof(SQFunctionProto) \
+((ni-1)*sizeof(SQInstruction))+(nl*sizeof(SQObjectPtr)) \

View File

@ -264,7 +264,7 @@ void SQFuncState::setIntructionParam(int64_t pos,int64_t arg,int64_t val)
int64_t SQFuncState::allocStackPos()
{
int64_t npos=_vlocals.size();
_vlocals.push_back(SQLocalVarInfo());
_vlocals.pushBack(SQLocalVarInfo());
if(_vlocals.size()>((uint64_t)_stacksize)) {
if(_stacksize>MAX_FUNC_STACKSIZE) error(_SC("internal compiler error: too many locals"));
_stacksize=_vlocals.size();
@ -275,11 +275,11 @@ int64_t SQFuncState::allocStackPos()
int64_t SQFuncState::pushTarget(int64_t n)
{
if(n!=-1){
_targetstack.push_back(n);
_targetstack.pushBack(n);
return n;
}
n=allocStackPos();
_targetstack.push_back(n);
_targetstack.pushBack(n);
return n;
}
@ -296,9 +296,9 @@ int64_t SQFuncState::popTarget()
assert(npos < _vlocals.size());
SQLocalVarInfo &t = _vlocals[npos];
if(sq_type(t._name)==OT_NULL){
_vlocals.pop_back();
_vlocals.popBack();
}
_targetstack.pop_back();
_targetstack.popBack();
return npos;
}
@ -332,9 +332,9 @@ void SQFuncState::setStacksize(int64_t n)
_outers--;
}
lvi._end_op = getCurrentPos();
_localvarinfos.push_back(lvi);
_localvarinfos.pushBack(lvi);
}
_vlocals.pop_back();
_vlocals.popBack();
}
}
@ -362,7 +362,7 @@ int64_t SQFuncState::pushLocalVariable(const SQObject &name)
lvi._name=name;
lvi._start_op=getCurrentPos()+1;
lvi._pos=_vlocals.size();
_vlocals.push_back(lvi);
_vlocals.pushBack(lvi);
if(_vlocals.size()>((uint64_t)_stacksize))_stacksize=_vlocals.size();
return pos;
}
@ -402,13 +402,13 @@ int64_t SQFuncState::getOuterVariable(const SQObject &name)
if(pos == -1) {
pos = _parent->getOuterVariable(name);
if(pos != -1) {
_outervalues.push_back(SQOuterVar(name,SQObjectPtr(int64_t(pos)),otOUTER)); //local
_outervalues.pushBack(SQOuterVar(name,SQObjectPtr(int64_t(pos)),otOUTER)); //local
return _outervalues.size() - 1;
}
}
else {
_parent->markLocalAsOuter(pos);
_outervalues.push_back(SQOuterVar(name,SQObjectPtr(int64_t(pos)),otLOCAL)); //local
_outervalues.pushBack(SQOuterVar(name,SQObjectPtr(int64_t(pos)),otLOCAL)); //local
return _outervalues.size() - 1;
@ -420,7 +420,7 @@ int64_t SQFuncState::getOuterVariable(const SQObject &name)
void SQFuncState::addParameter(const SQObject &name)
{
pushLocalVariable(name);
_parameters.push_back(name);
_parameters.pushBack(name);
}
void SQFuncState::addLineInfos(int64_t line,bool lineop,bool force)
@ -430,7 +430,7 @@ void SQFuncState::addLineInfos(int64_t line,bool lineop,bool force)
li._line=line;li._op=(getCurrentPos()+1);
if(lineop)addInstruction(_OP_LINE,0,line);
if(_lastline!=line) {
_lineinfos.push_back(li);
_lineinfos.pushBack(li);
}
_lastline=line;
}
@ -574,14 +574,14 @@ void SQFuncState::addInstruction(SQInstruction &i)
break;
case _OP_LINE:
if(pi.op == _OP_LINE) {
_instructions.pop_back();
_lineinfos.pop_back();
_instructions.popBack();
_lineinfos.popBack();
}
break;
}
}
_optimization = true;
_instructions.push_back(i);
_instructions.pushBack(i);
}
SQObject SQFuncState::createString(const SQChar *s,int64_t len)
@ -636,7 +636,7 @@ SQFuncState *SQFuncState::pushChildState(SQSharedState *ss)
{
SQFuncState *child = (SQFuncState *)sq_malloc(sizeof(SQFuncState));
new (child) SQFuncState(ss,this,_errfunc,_errtarget);
_childstates.push_back(child);
_childstates.pushBack(child);
return child;
}
@ -644,7 +644,7 @@ void SQFuncState::popChildState()
{
SQFuncState *child = _childstates.back();
sq_delete(child,SQFuncState);
_childstates.pop_back();
_childstates.popBack();
}
SQFuncState::~SQFuncState()

View File

@ -24,11 +24,11 @@ struct SQFuncState
void setIntructionParams(int64_t pos,int64_t arg0,int64_t arg1,int64_t arg2=0,int64_t arg3=0);
void setIntructionParam(int64_t pos,int64_t arg,int64_t val);
SQInstruction &getInstruction(int64_t pos){return _instructions[pos];}
void popInstructions(int64_t size){for(int64_t i=0;i<size;i++)_instructions.pop_back();}
void popInstructions(int64_t size){for(int64_t i=0;i<size;i++)_instructions.popBack();}
void setStacksize(int64_t n);
int64_t CountOuters(int64_t stacksize);
void snoozeOpt(){_optimization=false;}
void addDefaultParam(int64_t trg) { _defaultparams.push_back(trg); }
void addDefaultParam(int64_t trg) { _defaultparams.pushBack(trg); }
int64_t getDefaultParamCount() { return _defaultparams.size(); }
int64_t getCurrentPos(){return _instructions.size()-1;}
int64_t getNumericConstant(const int64_t cons);
@ -83,7 +83,7 @@ struct SQFuncState
int64_t _outers;
bool _optimization;
SQSharedState *_sharedstate;
sqvector<SQFuncState*> _childstates;
etk::Vector<SQFuncState*> _childstates;
int64_t getConstant(const SQObject &cons);
private:
compilererrorFunc _errfunc;

View File

@ -19,8 +19,8 @@
#define IS_EOB() (CUR_CHAR <= RABBIT_EOB)
#define NEXT() {next();_currentcolumn++;}
#define INIT_TEMP_STRING() { _longstr.resize(0);}
#define APPEND_CHAR(c) { _longstr.push_back(c);}
#define TERMINATE_BUFFER() {_longstr.push_back(_SC('\0'));}
#define APPEND_CHAR(c) { _longstr.pushBack(c);}
#define TERMINATE_BUFFER() {_longstr.pushBack(_SC('\0'));}
#define ADD_KEYWORD(key,id) _keywords->newSlot( SQString::create(ss, _SC(#key)) ,int64_t(id))
SQLexer::SQLexer(){}

View File

@ -52,7 +52,7 @@ public:
SQUserPointer _up;
LexChar _currdata;
SQSharedState *_sharedstate;
sqvector<SQChar> _longstr;
etk::Vector<SQChar> _longstr;
compilererrorFunc _errfunc;
void *_errtarget;
};

View File

@ -117,9 +117,9 @@ bool SQGenerator::yield(SQVM *v,int64_t target)
_stack.resize(size);
SQObject _this = v->_stack[v->_stackbase];
_stack._vals[0] = ISREFCOUNTED(sq_type(_this)) ? SQObjectPtr(_refcounted(_this)->getWeakRef(sq_type(_this))) : _this;
_stack[0] = ISREFCOUNTED(sq_type(_this)) ? SQObjectPtr(_refcounted(_this)->getWeakRef(sq_type(_this))) : _this;
for(int64_t n =1; n<target; n++) {
_stack._vals[n] = v->_stack[v->_stackbase+n];
_stack[n] = v->_stack[v->_stackbase+n];
}
for(int64_t j =0; j < size; j++)
{
@ -129,8 +129,8 @@ bool SQGenerator::yield(SQVM *v,int64_t target)
_ci = *v->ci;
_ci._generator=NULL;
for(int64_t i=0;i<_ci._etraps;i++) {
_etraps.push_back(v->_etraps.top());
v->_etraps.pop_back();
_etraps.pushBack(v->_etraps.back());
v->_etraps.popBack();
// store relative stack base and size in case of resume to other _top
SQExceptionTrap &et = _etraps.back();
et._stackbase -= v->_stackbase;
@ -145,7 +145,7 @@ bool SQGenerator::resume(SQVM *v,SQObjectPtr &dest)
if(_state==eDead){ v->raise_error(_SC("resuming dead generator")); return false; }
if(_state==eRunning){ v->raise_error(_SC("resuming active generator")); return false; }
int64_t size = _stack.size();
int64_t target = &dest - &(v->_stack._vals[v->_stackbase]);
int64_t target = &dest - &(v->_stack[v->_stackbase]);
assert(target>=0 && target<=255);
int64_t newbase = v->_top;
if(!v->enterFrame(v->_top, v->_top + size, false))
@ -161,19 +161,19 @@ bool SQGenerator::resume(SQVM *v,SQObjectPtr &dest)
for(int64_t i=0;i<_ci._etraps;i++) {
v->_etraps.push_back(_etraps.top());
_etraps.pop_back();
v->_etraps.pushBack(_etraps.back());
_etraps.popBack();
SQExceptionTrap &et = v->_etraps.back();
// restore absolute stack base and size
et._stackbase += newbase;
et._stacksize += newbase;
}
SQObject _this = _stack._vals[0];
SQObject _this = _stack[0];
v->_stack[v->_stackbase] = sq_type(_this) == OT_WEAKREF ? _weakref(_this)->_obj : _this;
for(int64_t n = 1; n<size; n++) {
v->_stack[v->_stackbase+n] = _stack._vals[n];
_stack._vals[n].Null();
v->_stack[v->_stackbase+n] = _stack[n];
_stack[n].Null();
}
_state=eRunning;

View File

@ -307,8 +307,8 @@ struct SQDelegable : public rabbit::RefCounted {
};
uint64_t translateIndex(const SQObjectPtr &idx);
typedef sqvector<SQObjectPtr> SQObjectPtrVec;
typedef sqvector<int64_t> SQIntVec;
typedef etk::Vector<SQObjectPtr> SQObjectPtrVec;
typedef etk::Vector<int64_t> SQIntVec;
const SQChar *getTypeName(const SQObjectPtr &obj1);
const SQChar *IdType2Name(SQObjectType type);

View File

@ -129,7 +129,7 @@ struct SQInstruction
};
#include <rabbit/squtils.hpp>
typedef sqvector<SQInstruction> SQInstructionVec;
typedef etk::Vector<SQInstruction> SQInstructionVec;
#define NEW_SLOT_ATTRIBUTES_FLAG 0x01
#define NEW_SLOT_STATIC_FLAG 0x02

View File

@ -28,11 +28,11 @@ SQSharedState::SQSharedState()
}
#define newsysstring(s) { \
_systemstrings->push_back(SQString::create(this,s)); \
_systemstrings->pushBack(SQString::create(this,s)); \
}
#define newmetamethod(s) { \
_metamethods->push_back(SQString::create(this,s)); \
_metamethods->pushBack(SQString::create(this,s)); \
_table(_metamethodsmap)->newSlot(_metamethods->back(),(int64_t)(_metamethods->size()-1)); \
}
@ -58,7 +58,7 @@ bool compileTypemask(SQIntVec &res,const SQChar *typemask)
case 'x': mask |= _RT_INSTANCE; break;
case 'y': mask |= _RT_CLASS; break;
case 'r': mask |= _RT_WEAKREF; break;
case '.': mask = -1; res.push_back(mask); i++; mask = 0; continue;
case '.': mask = -1; res.pushBack(mask); i++; mask = 0; continue;
case ' ': i++; continue; //ignores spaces
default:
return false;
@ -70,7 +70,7 @@ bool compileTypemask(SQIntVec &res,const SQChar *typemask)
return false;
continue;
}
res.push_back(mask);
res.pushBack(mask);
mask = 0;
}
@ -167,7 +167,7 @@ SQSharedState::~SQSharedState()
_metamethodsmap.Null();
while(!_systemstrings->empty()) {
_systemstrings->back().Null();
_systemstrings->pop_back();
_systemstrings->popBack();
}
_thread(_root_vm)->finalize();
_root_vm.Null();

View File

@ -20,102 +20,6 @@ void sq_vm_free(void *p,uint64_t size);
#define sq_aligning(v) (((size_t)(v) + (SQ_ALIGNMENT-1)) & (~(SQ_ALIGNMENT-1)))
//sqvector mini vector class, supports objects by value
template<typename T> class sqvector
{
public:
sqvector()
{
_vals = NULL;
_size = 0;
_allocated = 0;
}
sqvector(const sqvector<T>& v)
{
copy(v);
}
void copy(const sqvector<T>& v)
{
if(_size) {
resize(0); //destroys all previous stuff
}
//resize(v._size);
if(v._size > _allocated) {
_realloc(v._size);
}
for(uint64_t i = 0; i < v._size; i++) {
new ((void *)&_vals[i]) T(v._vals[i]);
}
_size = v._size;
}
~sqvector()
{
if(_allocated) {
for(uint64_t i = 0; i < _size; i++)
_vals[i].~T();
SQ_FREE(_vals, (_allocated * sizeof(T)));
}
}
void reserve(uint64_t newsize) { _realloc(newsize); }
void resize(uint64_t newsize, const T& fill = T())
{
if(newsize > _allocated)
_realloc(newsize);
if(newsize > _size) {
while(_size < newsize) {
new ((void *)&_vals[_size]) T(fill);
_size++;
}
}
else{
for(uint64_t i = newsize; i < _size; i++) {
_vals[i].~T();
}
_size = newsize;
}
}
void shrinktofit() { if(_size > 4) { _realloc(_size); } }
T& top() const { return _vals[_size - 1]; }
inline uint64_t size() const { return _size; }
bool empty() const { return (_size <= 0); }
inline T &push_back(const T& val = T())
{
if(_allocated <= _size)
_realloc(_size * 2);
return *(new ((void *)&_vals[_size++]) T(val));
}
inline void pop_back()
{
_size--; _vals[_size].~T();
}
void insert(uint64_t idx, const T& val)
{
resize(_size + 1);
for(uint64_t i = _size - 1; i > idx; i--) {
_vals[i] = _vals[i - 1];
}
_vals[idx] = val;
}
void remove(uint64_t idx)
{
_vals[idx].~T();
if(idx < (_size - 1)) {
memmove(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - idx - 1));
}
_size--;
}
uint64_t capacity() { return _allocated; }
inline T &back() const { return _vals[_size - 1]; }
inline T& operator[](uint64_t pos) const{ return _vals[pos]; }
T* _vals;
private:
void _realloc(uint64_t newsize)
{
newsize = (newsize > 0)?newsize:4;
_vals = (T*)SQ_REALLOC(_vals, _allocated * sizeof(T), newsize * sizeof(T));
_allocated = newsize;
}
uint64_t _size;
uint64_t _allocated;
};
#include <etk/Vector.hpp>

View File

@ -18,9 +18,9 @@
#include <rabbit/Array.hpp>
#include <rabbit/sqclass.hpp>
#define TOP() (_stack._vals[_top-1])
#define TARGET _stack._vals[_stackbase+arg0]
#define STK(a) _stack._vals[_stackbase+(a)]
#define TOP() (_stack[_top-1])
#define TARGET _stack[_stackbase+arg0]
#define STK(a) _stack[_stackbase+(a)]
bool SQVM::BW_OP(uint64_t op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2)
{
@ -134,7 +134,7 @@ SQVM::SQVM(SQSharedState *ss)
void SQVM::finalize()
{
if(_releasehook) { _releasehook(_foreignptr,0); _releasehook = NULL; }
if(_openouters) closeOuters(&_stack._vals[0]);
if(_openouters) closeOuters(&_stack[0]);
_roottable.Null();
_lasterror.Null();
_errorhandler.Null();
@ -395,12 +395,12 @@ bool SQVM::startcall(SQClosure *closure,int64_t target,int64_t args,int64_t stac
rabbit::Array *arr = rabbit::Array::create(_ss(this),nvargs);
int64_t pbase = stackbase+paramssize;
for(int64_t n = 0; n < nvargs; n++) {
(*arr)[n] = _stack._vals[pbase];
_stack._vals[pbase].Null();
(*arr)[n] = _stack[pbase];
_stack[pbase].Null();
pbase++;
}
_stack._vals[stackbase+paramssize] = arr;
_stack[stackbase+paramssize] = arr;
//dumpstack(stackbase);
}
else if (paramssize != nargs) {
@ -408,7 +408,7 @@ bool SQVM::startcall(SQClosure *closure,int64_t target,int64_t args,int64_t stac
int64_t diff;
if(ndef && nargs < paramssize && (diff = paramssize - nargs) <= ndef) {
for(int64_t n = ndef - diff; n < ndef; n++) {
_stack._vals[stackbase + (nargs++)] = closure->_defaultparams[n];
_stack[stackbase + (nargs++)] = closure->_defaultparams[n];
}
}
else {
@ -418,7 +418,7 @@ bool SQVM::startcall(SQClosure *closure,int64_t target,int64_t args,int64_t stac
}
if(closure->_env) {
_stack._vals[stackbase] = closure->_env->_obj;
_stack[stackbase] = closure->_env->_obj;
}
if(!enterFrame(stackbase, newtop, tailcall)) return false;
@ -463,16 +463,16 @@ bool SQVM::Return(int64_t _arg0, int64_t _arg1, SQObjectPtr &retval)
} else if (ci->_target == -1) {
dest = NULL;
} else {
dest = &_stack._vals[callerbase + ci->_target];
dest = &_stack[callerbase + ci->_target];
}
if (dest) {
if(_arg0 != 0xFF) {
*dest = _stack._vals[_stackbase+_arg1];
*dest = _stack[_stackbase+_arg1];
}
else {
dest->Null();
}
//*dest = (_arg0 != 0xFF) ? _stack._vals[_stackbase+_arg1] : _null_;
//*dest = (_arg0 != 0xFF) ? _stack[_stackbase+_arg1] : _null_;
}
leaveFrame();
return _isroot ? true : false;
@ -605,7 +605,7 @@ bool SQVM::CLOSURE_OP(SQObjectPtr &target, SQFunctionProto *func)
if((ndefparams = func->_ndefaultparams)) {
for(int64_t i = 0; i < ndefparams; i++) {
int64_t spos = func->_defaultparams[i];
closure->_defaultparams[i] = _stack._vals[_stackbase + spos];
closure->_defaultparams[i] = _stack[_stackbase + spos];
}
}
target = closure;
@ -619,11 +619,11 @@ bool SQVM::CLASS_OP(SQObjectPtr &target,int64_t baseclass,int64_t attributes)
SQClass *base = NULL;
SQObjectPtr attrs;
if(baseclass != -1) {
if(sq_type(_stack._vals[_stackbase+baseclass]) != OT_CLASS) { raise_error(_SC("trying to inherit from a %s"),getTypeName(_stack._vals[_stackbase+baseclass])); return false; }
base = _class(_stack._vals[_stackbase + baseclass]);
if(sq_type(_stack[_stackbase+baseclass]) != OT_CLASS) { raise_error(_SC("trying to inherit from a %s"),getTypeName(_stack[_stackbase+baseclass])); return false; }
base = _class(_stack[_stackbase + baseclass]);
}
if(attributes != MAX_FUNC_STACKSIZE) {
attrs = _stack._vals[_stackbase+attributes];
attrs = _stack[_stackbase+attributes];
}
target = SQClass::create(_ss(this),base);
if(sq_type(_class(target)->_metamethods[MT_INHERITED]) != OT_NULL) {
@ -730,7 +730,7 @@ exception_restore:
&& (!_closure(t)->_function->_bgenerator)){
SQObjectPtr clo = t;
int64_t last_top = _top;
if(_openouters) closeOuters(&(_stack._vals[_stackbase]));
if(_openouters) closeOuters(&(_stack[_stackbase]));
for (int64_t i = 0; i < arg3; i++) STK(i) = STK(arg2 + i);
_GUARD(startcall(_closure(clo), ci->_target, arg3, _stackbase, true));
if (last_top >= _top) {
@ -772,13 +772,13 @@ exception_restore:
switch(sq_type(clo)) {
case OT_CLOSURE:
stkbase = _stackbase+arg2;
_stack._vals[stkbase] = inst;
_stack[stkbase] = inst;
_GUARD(startcall(_closure(clo), -1, arg3, stkbase, false));
break;
case OT_NATIVECLOSURE:
bool dummy;
stkbase = _stackbase+arg2;
_stack._vals[stkbase] = inst;
_stack[stkbase] = inst;
_GUARD(callNative(_nativeclosure(clo), arg3, stkbase, clo, -1, dummy, dummy));
break;
default: break; //shutup GCC 4.x
@ -1032,13 +1032,13 @@ exception_restore:
case _OP_TYPEOF: _GUARD(typeOf(STK(arg1), TARGET)) continue;
case _OP_PUSHTRAP:{
SQInstruction *_iv = _closure(ci->_closure)->_function->_instructions;
_etraps.push_back(SQExceptionTrap(_top,_stackbase, &_iv[(ci->_ip-_iv)+arg1], arg0)); traps++;
_etraps.pushBack(SQExceptionTrap(_top,_stackbase, &_iv[(ci->_ip-_iv)+arg1], arg0)); traps++;
ci->_etraps++;
}
continue;
case _OP_POPTRAP: {
for(int64_t i = 0; i < arg0; i++) {
_etraps.pop_back(); traps--;
_etraps.popBack(); traps--;
ci->_etraps--;
}
}
@ -1075,13 +1075,13 @@ exception_trap:
while( ci ) {
if(ci->_etraps > 0) {
SQExceptionTrap &et = _etraps.top();
SQExceptionTrap &et = _etraps.back();
ci->_ip = et._ip;
_top = et._stacksize;
_stackbase = et._stackbase;
_stack._vals[_stackbase + et._extarget] = currerror;
_etraps.pop_back(); traps--; ci->_etraps--;
while(last_top >= _top) _stack._vals[last_top--].Null();
_stack[_stackbase + et._extarget] = currerror;
_etraps.popBack(); traps--; ci->_etraps--;
while(last_top >= _top) _stack[last_top--].Null();
goto exception_restore;
}
else if (_debughook) {
@ -1168,8 +1168,8 @@ bool SQVM::callNative(SQNativeClosure *nclosure, int64_t nargs, int64_t newbase,
SQIntVec &tc = nclosure->_typecheck;
if((tcs = tc.size())) {
for(int64_t i = 0; i < nargs && i < tcs; i++) {
if((tc._vals[i] != -1) && !(sq_type(_stack._vals[newbase+i]) & tc._vals[i])) {
raise_ParamTypeerror(i,tc._vals[i], sq_type(_stack._vals[newbase+i]));
if((tc[i] != -1) && !(sq_type(_stack[newbase+i]) & tc[i])) {
raise_ParamTypeerror(i,tc[i], sq_type(_stack[newbase+i]));
return false;
}
}
@ -1181,10 +1181,10 @@ bool SQVM::callNative(SQNativeClosure *nclosure, int64_t nargs, int64_t newbase,
int64_t outers = nclosure->_noutervalues;
for (int64_t i = 0; i < outers; i++) {
_stack._vals[newbase+nargs+i] = nclosure->_outervalues[i];
_stack[newbase+nargs+i] = nclosure->_outervalues[i];
}
if(nclosure->_env) {
_stack._vals[newbase] = nclosure->_env->_obj;
_stack[newbase] = nclosure->_env->_obj;
}
_nnativecalls++;
@ -1206,12 +1206,12 @@ bool SQVM::callNative(SQNativeClosure *nclosure, int64_t nargs, int64_t newbase,
return false;
}
if(ret) {
retval = _stack._vals[_top-1];
retval = _stack[_top-1];
}
else {
retval.Null();
}
//retval = ret ? _stack._vals[_top-1] : _null_;
//retval = ret ? _stack[_top-1] : _null_;
leaveFrame();
return true;
}
@ -1641,7 +1641,8 @@ void SQVM::findOuter(SQObjectPtr &target, SQObjectPtr *stackindex)
}
otr = SQOuter::create(_ss(this), stackindex);
otr->_next = *pp;
otr->_idx = (stackindex - _stack._vals);
// TODO: rework this, this is absolutly not safe...
otr->_idx = (stackindex - &_stack[0]);
__ObjaddRef(otr);
*pp = otr;
target = SQObjectPtr(otr);
@ -1689,9 +1690,9 @@ void SQVM::leaveFrame() {
_top = _stackbase + ci->_prevtop;
ci = (css) ? &_callsstack[css-1] : NULL;
if(_openouters) closeOuters(&(_stack._vals[last_stackbase]));
if(_openouters) closeOuters(&(_stack[last_stackbase]));
while (last_top >= _top) {
_stack._vals[last_top--].Null();
_stack[last_top--].Null();
}
}
@ -1699,7 +1700,7 @@ void SQVM::relocateOuters()
{
SQOuter *p = _openouters;
while (p) {
p->_valptr = _stack._vals + p->_idx;
p->_valptr = &_stack[p->_idx];
p = p->_next;
}
}

View File

@ -35,7 +35,7 @@ struct SQExceptionTrap{
#define _INLINE
typedef sqvector<SQExceptionTrap> ExceptionsTraps;
typedef etk::Vector<SQExceptionTrap> ExceptionsTraps;
struct SQVM : public rabbit::RefCounted
{
@ -53,7 +53,7 @@ struct SQVM : public rabbit::RefCounted
SQBool _root;
};
typedef sqvector<callInfo> callInfoVec;
typedef etk::Vector<callInfo> callInfoVec;
public:
void DebugHookProxy(int64_t type, const SQChar * sourcename, int64_t line, const SQChar * funcname);
static void _DebugHookProxy(HRABBITVM v, int64_t type, const SQChar * sourcename, int64_t line, const SQChar * funcname);
@ -164,7 +164,7 @@ public:
callInfo* _callsstack;
int64_t _callsstacksize;
int64_t _alloccallsstacksize;
sqvector<callInfo> _callstackdata;
etk::Vector<callInfo> _callstackdata;
ExceptionsTraps _etraps;
callInfo *ci;