diff --git a/rabbit/Array.hpp b/rabbit/Array.hpp index 00aa9fb..2538be1 100644 --- a/rabbit/Array.hpp +++ b/rabbit/Array.hpp @@ -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 diff --git a/rabbit/sqapi.cpp b/rabbit/sqapi.cpp index 86ffaaa..5ccfbc9 100644 --- a/rabbit/sqapi.cpp +++ b/rabbit/sqapi.cpp @@ -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); diff --git a/rabbit/sqclass.cpp b/rabbit/sqclass.cpp index 1aaccfd..9e65768 100644 --- a/rabbit/sqclass.cpp +++ b/rabbit/sqclass.cpp @@ -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; } diff --git a/rabbit/sqclass.hpp b/rabbit/sqclass.hpp index e1fea94..b215d41 100644 --- a/rabbit/sqclass.hpp +++ b/rabbit/sqclass.hpp @@ -18,7 +18,7 @@ struct SQClassMember { } }; -typedef sqvector SQClassMemberVec; +typedef etk::Vector SQClassMemberVec; #define MEMBER_TYPE_METHOD 0x01000000 #define MEMBER_TYPE_FIELD 0x02000000 diff --git a/rabbit/sqclosure.hpp b/rabbit/sqclosure.hpp index a789be2..8e1f70e 100644 --- a/rabbit/sqclosure.hpp +++ b/rabbit/sqclosure.hpp @@ -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; } diff --git a/rabbit/sqcompiler.cpp b/rabbit/sqcompiler.cpp index 6b8ff4e..25f50d7 100644 --- a/rabbit/sqcompiler.cpp +++ b/rabbit/sqcompiler.cpp @@ -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--; diff --git a/rabbit/sqfuncproto.hpp b/rabbit/sqfuncproto.hpp index 6f958af..606376d 100644 --- a/rabbit/sqfuncproto.hpp +++ b/rabbit/sqfuncproto.hpp @@ -53,9 +53,9 @@ struct SQLocalVarInfo struct SQLineInfo { int64_t _line;int64_t _op; }; -typedef sqvector SQOuterVarVec; -typedef sqvector SQLocalVarInfoVec; -typedef sqvector SQLineInfoVec; +typedef etk::Vector SQOuterVarVec; +typedef etk::Vector SQLocalVarInfoVec; +typedef etk::Vector SQLineInfoVec; #define _FUNC_SIZE(ni,nl,nparams,nfuncs,nouters,nlineinf,localinf,defparams) (sizeof(SQFunctionProto) \ +((ni-1)*sizeof(SQInstruction))+(nl*sizeof(SQObjectPtr)) \ diff --git a/rabbit/sqfuncstate.cpp b/rabbit/sqfuncstate.cpp index ba8f514..b7a9ac6 100644 --- a/rabbit/sqfuncstate.cpp +++ b/rabbit/sqfuncstate.cpp @@ -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() diff --git a/rabbit/sqfuncstate.hpp b/rabbit/sqfuncstate.hpp index 08ef24e..0f2136c 100644 --- a/rabbit/sqfuncstate.hpp +++ b/rabbit/sqfuncstate.hpp @@ -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 _childstates; + etk::Vector _childstates; int64_t getConstant(const SQObject &cons); private: compilererrorFunc _errfunc; diff --git a/rabbit/sqlexer.cpp b/rabbit/sqlexer.cpp index 6cb6b1e..e158c32 100644 --- a/rabbit/sqlexer.cpp +++ b/rabbit/sqlexer.cpp @@ -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(){} diff --git a/rabbit/sqlexer.hpp b/rabbit/sqlexer.hpp index 9d7cf48..1936aad 100644 --- a/rabbit/sqlexer.hpp +++ b/rabbit/sqlexer.hpp @@ -52,7 +52,7 @@ public: SQUserPointer _up; LexChar _currdata; SQSharedState *_sharedstate; - sqvector _longstr; + etk::Vector _longstr; compilererrorFunc _errfunc; void *_errtarget; }; diff --git a/rabbit/sqobject.cpp b/rabbit/sqobject.cpp index d4071f1..474396d 100644 --- a/rabbit/sqobject.cpp +++ b/rabbit/sqobject.cpp @@ -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_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_stack[v->_stackbase+n] = _stack._vals[n]; - _stack._vals[n].Null(); + v->_stack[v->_stackbase+n] = _stack[n]; + _stack[n].Null(); } _state=eRunning; diff --git a/rabbit/sqobject.hpp b/rabbit/sqobject.hpp index ec9942e..af83c02 100644 --- a/rabbit/sqobject.hpp +++ b/rabbit/sqobject.hpp @@ -307,8 +307,8 @@ struct SQDelegable : public rabbit::RefCounted { }; uint64_t translateIndex(const SQObjectPtr &idx); -typedef sqvector SQObjectPtrVec; -typedef sqvector SQIntVec; +typedef etk::Vector SQObjectPtrVec; +typedef etk::Vector SQIntVec; const SQChar *getTypeName(const SQObjectPtr &obj1); const SQChar *IdType2Name(SQObjectType type); diff --git a/rabbit/sqopcodes.hpp b/rabbit/sqopcodes.hpp index d3c0fdc..8c53026 100644 --- a/rabbit/sqopcodes.hpp +++ b/rabbit/sqopcodes.hpp @@ -129,7 +129,7 @@ struct SQInstruction }; #include -typedef sqvector SQInstructionVec; +typedef etk::Vector SQInstructionVec; #define NEW_SLOT_ATTRIBUTES_FLAG 0x01 #define NEW_SLOT_STATIC_FLAG 0x02 diff --git a/rabbit/sqstate.cpp b/rabbit/sqstate.cpp index 0eb8a0b..6385f25 100644 --- a/rabbit/sqstate.cpp +++ b/rabbit/sqstate.cpp @@ -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(); diff --git a/rabbit/squtils.hpp b/rabbit/squtils.hpp index e779d43..2cc880f 100644 --- a/rabbit/squtils.hpp +++ b/rabbit/squtils.hpp @@ -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 class sqvector -{ -public: - sqvector() - { - _vals = NULL; - _size = 0; - _allocated = 0; - } - sqvector(const sqvector& v) - { - copy(v); - } - void copy(const sqvector& 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 diff --git a/rabbit/sqvm.cpp b/rabbit/sqvm.cpp index a1ca856..1ea92c5 100644 --- a/rabbit/sqvm.cpp +++ b/rabbit/sqvm.cpp @@ -18,9 +18,9 @@ #include #include -#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; } } diff --git a/rabbit/sqvm.hpp b/rabbit/sqvm.hpp index 8be5f65..ecfdc51 100644 --- a/rabbit/sqvm.hpp +++ b/rabbit/sqvm.hpp @@ -35,7 +35,7 @@ struct SQExceptionTrap{ #define _INLINE -typedef sqvector ExceptionsTraps; +typedef etk::Vector ExceptionsTraps; struct SQVM : public rabbit::RefCounted { @@ -53,7 +53,7 @@ struct SQVM : public rabbit::RefCounted SQBool _root; }; -typedef sqvector callInfoVec; +typedef etk::Vector 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 _callstackdata; + etk::Vector _callstackdata; ExceptionsTraps _etraps; callInfo *ci;