diff --git a/rabbit/Closure.cpp b/rabbit/Closure.cpp index 23db9c4..53ef1a4 100644 --- a/rabbit/Closure.cpp +++ b/rabbit/Closure.cpp @@ -66,7 +66,7 @@ bool rabbit::WriteObject(rabbit::VirtualMachine* v,rabbit::UserPointer up,SQWRIT switch(o.getType()){ case rabbit::OT_STRING: _CHECK_IO(SafeWrite(v,write,up,&o.toString()->_len,sizeof(int64_t))); - _CHECK_IO(SafeWrite(v,write,up,_stringval(o),sq_rsl(o.toString()->_len))); + _CHECK_IO(SafeWrite(v,write,up,o.getStringValue(),sq_rsl(o.toString()->_len))); break; case rabbit::OT_BOOL: case rabbit::OT_INTEGER: diff --git a/rabbit/Compiler.cpp b/rabbit/Compiler.cpp index b5a4920..fa418da 100644 --- a/rabbit/Compiler.cpp +++ b/rabbit/Compiler.cpp @@ -210,7 +210,7 @@ public: } else { if(_raiseerror && _get_shared_state(_vm)->_compilererrorhandler) { - _get_shared_state(_vm)->_compilererrorhandler(_vm, _compilererror, _sourcename.isString() == true?_stringval(_sourcename):"unknown", + _get_shared_state(_vm)->_compilererrorhandler(_vm, _compilererror, _sourcename.isString() == true?_sourcename.getStringValue():"unknown", _lex._currentline, _lex._currentcolumn); } _vm->_lasterror = rabbit::String::create(_get_shared_state(_vm), _compilererror, -1); @@ -789,7 +789,7 @@ public: constid = Expect(TK_IDENTIFIER); if(!constant.toTable()->get(constid, constval)) { constval.Null(); - error("invalid constant [%s.%s]", _stringval(id), _stringval(constid)); + error("invalid constant [%s.%s]", id.getStringValue(), constid.getStringValue()); } } else { diff --git a/rabbit/FuncState.cpp b/rabbit/FuncState.cpp index 541d54b..83d953d 100644 --- a/rabbit/FuncState.cpp +++ b/rabbit/FuncState.cpp @@ -101,7 +101,7 @@ void rabbit::FuncState::addInstruction(SQOpcode _op,int64_t arg0,int64_t arg1,in static void dumpLiteral(rabbit::ObjectPtr &o) { switch(o.getType()){ case rabbit::OT_STRING: - printf("\"%s\"",_stringval(o)); + printf("\"%s\"",o.getStringValue()); break; case rabbit::OT_FLOAT: printf("{%f}",o.toFloat()); @@ -152,7 +152,7 @@ void rabbit::FuncState::dump(rabbit::FunctionProto *func) printf("rabbit::Instruction sizeof %d\n",(int32_t)sizeof(rabbit::Instruction)); printf("rabbit::Object sizeof %d\n", (int32_t)sizeof(rabbit::Object)); printf("--------------------------------------------------------------------\n"); - printf("*****FUNCTION [%s]\n",func->_name.isString() == true?_stringval(func->_name):"unknown"); + printf("*****FUNCTION [%s]\n",func->_name.isString() == true?func->_name.getStringValue():"unknown"); printf("-----LITERALS\n"); rabbit::ObjectPtr refidx,key,val; int64_t idx; @@ -181,7 +181,7 @@ void rabbit::FuncState::dump(rabbit::FunctionProto *func) printf("-----LOCALS\n"); for(si=0;si_nlocalvarinfos;si++){ rabbit::LocalVarInfo lvi=func->_localvarinfos[si]; - printf("[%d] %s \t%d %d\n", (int32_t)lvi._pos,_stringval(lvi._name), (int32_t)lvi._start_op, (int32_t)lvi._end_op); + printf("[%d] %s \t%d %d\n", (int32_t)lvi._pos,lvi._name.getStringValue(), (int32_t)lvi._start_op, (int32_t)lvi._end_op); n++; } printf("-----LINE INFO\n"); diff --git a/rabbit/FunctionProto.cpp b/rabbit/FunctionProto.cpp index 6e336ff..9cfca53 100644 --- a/rabbit/FunctionProto.cpp +++ b/rabbit/FunctionProto.cpp @@ -75,7 +75,7 @@ const char* rabbit::FunctionProto::getLocal(rabbit::VirtualMachine *vm,uint64_t { if(nseq==0){ vm->push(vm->_stack[stackbase+_localvarinfos[i]._pos]); - res=_stringval(_localvarinfos[i]._name); + res=_localvarinfos[i]._name.getStringValue(); break; } nseq--; diff --git a/rabbit/Lexer.cpp b/rabbit/Lexer.cpp index 7419196..458d1c3 100644 --- a/rabbit/Lexer.cpp +++ b/rabbit/Lexer.cpp @@ -105,7 +105,7 @@ const char *rabbit::Lexer::tok2Str(int64_t tok) while((nitr = _keywords->next(false,itr, key, val)) != -1) { itr = (int64_t)nitr; if(((int64_t)val.toInteger()) == tok) - return _stringval(key); + return key.getStringValue(); } return NULL; } diff --git a/rabbit/Object.cpp b/rabbit/Object.cpp index 06ebfb3..dd3d9c1 100644 --- a/rabbit/Object.cpp +++ b/rabbit/Object.cpp @@ -7,3 +7,12 @@ */ #include +#include + +const char* rabbit::Object::getStringValue() const { + return (const char*)&_unVal.pString->_val[0]; +} + +char* rabbit::Object::getStringValue() { + return (char*)&_unVal.pString->_val[0]; +} \ No newline at end of file diff --git a/rabbit/Object.hpp b/rabbit/Object.hpp index 54b8779..db0a9b5 100644 --- a/rabbit/Object.hpp +++ b/rabbit/Object.hpp @@ -54,6 +54,8 @@ namespace rabbit { const rabbit::String* toString() const { return _unVal.pString; } + const char* getStringValue() const; + char* getStringValue(); rabbit::Table*& toTable() { return _unVal.pTable; } @@ -216,6 +218,9 @@ namespace rabbit { rabbit::ObjectType getType() const { return _type; } + rabbit::ObjectType getTypeRaw() const { + return rabbit::ObjectType(_type&_RT_MASK); + } }; #define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED) @@ -232,9 +237,6 @@ namespace rabbit { #define _realval(o) ((o).isWeakRef() == false?(rabbit::Object)o:(o).toWeakRef()->_obj) - #define raw_type(obj) _RAW_TYPE((obj)._type) - - #define _stringval(obj) (obj)._unVal.pString->_val #define _userdataval(obj) ((rabbit::UserPointer)sq_aligning((obj)._unVal.pUserData + 1)) inline void _Swap(rabbit::Object &a,rabbit::Object &b) diff --git a/rabbit/ObjectPtr.cpp b/rabbit/ObjectPtr.cpp index 7b67e8f..99aebae 100644 --- a/rabbit/ObjectPtr.cpp +++ b/rabbit/ObjectPtr.cpp @@ -155,7 +155,7 @@ uint64_t rabbit::translateIndex(const rabbit::ObjectPtr &idx) { const char* rabbit::IdType2Name(rabbit::ObjectType type) { - switch(_RAW_TYPE(type)) { + switch (type&_RT_MASK) { case _RT_NULL: return "null"; case _RT_INTEGER: diff --git a/rabbit/ObjectType.hpp b/rabbit/ObjectType.hpp index fddffba..6f22380 100644 --- a/rabbit/ObjectType.hpp +++ b/rabbit/ObjectType.hpp @@ -17,7 +17,6 @@ #define SQ_MATCHTYPEMASKSTRING (-99999) #define _RT_MASK 0x00FFFFFF -#define _RAW_TYPE(type) (type&_RT_MASK) #define _RT_NULL 0x00000001 #define _RT_INTEGER 0x00000002 diff --git a/rabbit/Table.cpp b/rabbit/Table.cpp index 4c07144..78d6908 100644 --- a/rabbit/Table.cpp +++ b/rabbit/Table.cpp @@ -276,7 +276,7 @@ bool rabbit::Table::getStr(const char* key,int64_t keylen,rabbit::ObjectPtr &val _HashNode *res = NULL; do { if ( n->key.isString() == true - && strcmp(_stringval(n->key), key) == 0) { + && strcmp(n->key.getStringValue(), key) == 0) { res = n; break; } diff --git a/rabbit/VirtualMachine.cpp b/rabbit/VirtualMachine.cpp index 3b4cb5b..6884a96 100644 --- a/rabbit/VirtualMachine.cpp +++ b/rabbit/VirtualMachine.cpp @@ -246,7 +246,7 @@ bool rabbit::VirtualMachine::objCmp(const rabbit::ObjectPtr &o1,const rabbit::Ob rabbit::ObjectPtr res; switch(t1){ case rabbit::OT_STRING: - _RET_SUCCEED(strcmp(_stringval(o1),_stringval(o2))); + _RET_SUCCEED(strcmp(o1.getStringValue(),o2.getStringValue())); case rabbit::OT_INTEGER: _RET_SUCCEED((o1.toInteger()_len , ol = b.toString()->_len; char *s = _sp(sq_rsl(l + ol + 1)); - memcpy(s, _stringval(a), sq_rsl(l)); - memcpy(s + l, _stringval(b), sq_rsl(ol)); + memcpy(s, a.getStringValue(), sq_rsl(l)); + memcpy(s + l, b.getStringValue(), sq_rsl(ol)); dest = rabbit::String::create(_get_shared_state(this), _spval, l + ol); return true; } @@ -1183,11 +1183,11 @@ void rabbit::VirtualMachine::callDebugHook(int64_t type,int64_t forcedline) if(_debughook_native) { const char* src = nullptr; if (func->_sourcename.isString() == true) { - src = _stringval(func->_sourcename); + src = func->_sourcename.getStringValue(); } const char* fname = nullptr; if (func->_name.isString() == true) { - fname = _stringval(func->_name); + fname = func->_name.getStringValue(); } int64_t line = forcedline?forcedline:func->getLine(ci->_ip); _debughook_native(this,type,src,line,fname); @@ -1330,7 +1330,7 @@ bool rabbit::VirtualMachine::get(const rabbit::ObjectPtr &self, const rabbit::Ob int64_t len = self.toString()->_len; if (n < 0) { n += len; } if (n >= 0 && n < len) { - dest = int64_t(_stringval(self)[n]); + dest = int64_t(self.getStringValue()[n]); return true; } if ((getflags & GET_FLAG_DO_NOT_RAISE_ERROR) == 0) raise_Idxerror(key); @@ -1605,7 +1605,7 @@ bool rabbit::VirtualMachine::newSlot(const rabbit::ObjectPtr &self,const rabbit: } else { rabbit::ObjectPtr oval = printObjVal(key); - raise_error("the property '%s' already exists",_stringval(oval)); + raise_error("the property '%s' already exists",oval.getStringValue()); return false; } } @@ -1849,7 +1849,7 @@ void rabbit::VirtualMachine::dumpstack(int64_t stackbase,bool dumpall) case rabbit::OT_FLOAT: printf("FLOAT %.3f",obj.toFloat());break; case rabbit::OT_INTEGER: printf("INTEGER " _PRINT_INT_FMT,obj.toInteger());break; case rabbit::OT_BOOL: printf("BOOL %s",obj.toInteger()?"true":"false");break; - case rabbit::OT_STRING: printf("STRING %s",_stringval(obj));break; + case rabbit::OT_STRING: printf("STRING %s",obj.getStringValue());break; case rabbit::OT_NULL: printf("NULL"); break; case rabbit::OT_TABLE: printf("TABLE %p[%p]",obj.toTable(),obj.toTable()->_delegate);break; case rabbit::OT_ARRAY: printf("ARRAY %p",obj.toArray());break; diff --git a/rabbit/sqapi.cpp b/rabbit/sqapi.cpp index e89fc55..80137e8 100644 --- a/rabbit/sqapi.cpp +++ b/rabbit/sqapi.cpp @@ -35,7 +35,7 @@ static bool sq_aux_gettypedarg(rabbit::VirtualMachine* v,int64_t idx,rabbit::Obj *o = &stack_get(v,idx); if((*o)->getType() != type){ rabbit::ObjectPtr oval = v->printObjVal(**o); - v->raise_error("wrong argument type, expected '%s' got '%.50s'",IdType2Name(type),_stringval(oval)); + v->raise_error("wrong argument type, expected '%s' got '%.50s'",IdType2Name(type),oval.getStringValue()); return false; } return true; @@ -209,7 +209,7 @@ uint64_t rabbit::sq_getvmrefcount(rabbit::VirtualMachine* SQ_UNUSED_ARG(v), cons const char * rabbit::sq_objtostring(const rabbit::Object *o) { if(o->isString() == true) { - return _stringval(*o); + return o->getStringValue(); } return NULL; } @@ -718,7 +718,7 @@ rabbit::Result rabbit::sq_getstringandsize(rabbit::VirtualMachine* v,int64_t idx { rabbit::ObjectPtr *o = NULL; _GETSAFE_OBJ(v, idx, rabbit::OT_STRING,o); - *c = _stringval(*o); + *c = o->getStringValue(); *size = o->toString()->_len; return SQ_OK; } @@ -727,7 +727,7 @@ rabbit::Result rabbit::sq_getstring(rabbit::VirtualMachine* v,int64_t idx,const { rabbit::ObjectPtr *o = NULL; _GETSAFE_OBJ(v, idx, rabbit::OT_STRING,o); - *c = _stringval(*o); + *c = o->getStringValue(); return SQ_OK; } @@ -1171,7 +1171,7 @@ const char * rabbit::sq_getlocal(rabbit::VirtualMachine* v,uint64_t level,uint64 rabbit::FunctionProto *func=c->_function; if(func->_noutervalues > (int64_t)idx) { v->push(*c->_outervalues[idx].toOuter()->_valptr); - return _stringval(func->_outervalues[idx]._name); + return func->_outervalues[idx]._name.getStringValue(); } idx -= func->_noutervalues; return func->getLocal(v,stackbase,idx,(int64_t)(ci._ip-func->_instructions)-1); @@ -1417,7 +1417,7 @@ const char * rabbit::sq_getfreevariable(rabbit::VirtualMachine* v,int64_t idx,ui if(((uint64_t)fp->_noutervalues) > nval) { v->push(*(clo->_outervalues[nval].toOuter()->_valptr)); rabbit::OuterVar &ov = fp->_outervalues[nval]; - name = _stringval(ov._name); + name = ov._name.getStringValue(); } } break; diff --git a/rabbit/sqbaselib.cpp b/rabbit/sqbaselib.cpp index 6a5d6ff..5664cf4 100644 --- a/rabbit/sqbaselib.cpp +++ b/rabbit/sqbaselib.cpp @@ -347,7 +347,7 @@ static int64_t default_delegate_tofloat(rabbit::VirtualMachine* v) switch(o.getType()){ case rabbit::OT_STRING:{ rabbit::ObjectPtr res; - if(str2num(_stringval(o),res,10)){ + if(str2num(o.getStringValue(),res,10)){ v->push(rabbit::ObjectPtr(res.toFloatValue())); break; }} @@ -377,7 +377,7 @@ static int64_t default_delegate_tointeger(rabbit::VirtualMachine* v) switch(o.getType()){ case rabbit::OT_STRING:{ rabbit::ObjectPtr res; - if(str2num(_stringval(o),res,base)){ + if(str2num(o.getStringValue(),res,base)){ v->push(rabbit::ObjectPtr(res.toIntegerValue())); break; }} @@ -856,7 +856,7 @@ static int64_t string_slice(rabbit::VirtualMachine* v) if(eidx < 0)eidx = slen + eidx; if(eidx < sidx) return sq_throwerror(v,"wrong indexes"); if(eidx > slen || sidx < 0) return sq_throwerror(v, "slice out of range"); - v->push(rabbit::String::create(_get_shared_state(v),&_stringval(o)[sidx],eidx-sidx)); + v->push(rabbit::String::create(_get_shared_state(v),&o.getStringValue()[sidx],eidx-sidx)); return 1; } @@ -889,7 +889,7 @@ static int64_t string_find(rabbit::VirtualMachine* v) if(eidx < sidx) return sq_throwerror(v,"wrong indexes"); \ if(eidx > slen || sidx < 0) return sq_throwerror(v,"slice out of range"); \ int64_t len=str.toString()->_len; \ - const char *sthis=_stringval(str); \ + const char *sthis=str.getStringValue(); \ char *snew=(_get_shared_state(v)->getScratchPad(sq_rsl(len))); \ memcpy(snew,sthis,sq_rsl(len));\ for(int64_t i=sidx;i_lasterror.isString() == true) { - sq_throwerror(v,_stringval(thread->_lasterror)); + sq_throwerror(v,thread->_lasterror.getStringValue()); } else { sq_throwerror(v,"unknown error"); diff --git a/rabbit/sqdebug.cpp b/rabbit/sqdebug.cpp index bb730a9..ee177bd 100644 --- a/rabbit/sqdebug.cpp +++ b/rabbit/sqdebug.cpp @@ -32,12 +32,12 @@ rabbit::Result rabbit::sq_getfunctioninfo(rabbit::VirtualMachine* v,int64_t leve rabbit::FunctionProto *proto = c->_function; fi->funcid = proto; if (proto->_name.isString() == true) { - fi->name = _stringval(proto->_name); + fi->name = proto->_name.getStringValue(); } else { fi->name = "unknown"; } if (proto->_sourcename.isString() == true) { - fi->source = _stringval(proto->_sourcename); + fi->source = proto->_sourcename.getStringValue(); } else { fi->source = "unknown"; } @@ -59,10 +59,10 @@ rabbit::Result rabbit::sq_stackinfos(rabbit::VirtualMachine* v, int64_t level, r { rabbit::FunctionProto *func = ci._closure.toClosure()->_function; if (func->_name.isString() == true) { - si->funcname = _stringval(func->_name); + si->funcname = func->_name.getStringValue(); } if (func->_sourcename.isString() == true) { - si->source = _stringval(func->_sourcename); + si->source = func->_sourcename.getStringValue(); } si->line = func->getLine(ci._ip); } @@ -71,7 +71,7 @@ rabbit::Result rabbit::sq_stackinfos(rabbit::VirtualMachine* v, int64_t level, r si->source = "NATIVE"; si->funcname = "unknown"; if(ci._closure.toNativeClosure()->_name.isString() == true) { - si->funcname = _stringval(ci._closure.toNativeClosure()->_name); + si->funcname = ci._closure.toNativeClosure()->_name.getStringValue(); } si->line = -1; break; @@ -119,13 +119,13 @@ rabbit::String *rabbit::VirtualMachine::printObjVal(const rabbit::ObjectPtr &o) void rabbit::VirtualMachine::raise_Idxerror(const rabbit::ObjectPtr &o) { rabbit::ObjectPtr oval = printObjVal(o); - raise_error("the index '%.50s' does not exist", _stringval(oval)); + raise_error("the index '%.50s' does not exist", oval.getStringValue()); } void rabbit::VirtualMachine::raise_Compareerror(const rabbit::Object &o1, const rabbit::Object &o2) { rabbit::ObjectPtr oval1 = printObjVal(o1), oval2 = printObjVal(o2); - raise_error("comparison between '%.50s' and '%.50s'", _stringval(oval1), _stringval(oval2)); + raise_error("comparison between '%.50s' and '%.50s'", oval1.getStringValue(), oval2.getStringValue()); } @@ -142,5 +142,5 @@ void rabbit::VirtualMachine::raise_ParamTypeerror(int64_t nparam,int64_t typemas stringCat(exptypes,rabbit::String::create(_get_shared_state(this), IdType2Name((rabbit::ObjectType)mask), -1), exptypes); } } - raise_error("parameter %d has an invalid type '%s' ; expected: '%s'", nparam, IdType2Name((rabbit::ObjectType)type), _stringval(exptypes)); + raise_error("parameter %d has an invalid type '%s' ; expected: '%s'", nparam, IdType2Name((rabbit::ObjectType)type), exptypes.getStringValue()); }