[DEV] remove to_integer() and to_float()

This commit is contained in:
Edouard DUPIN 2018-07-04 21:32:01 +02:00
parent 74d6af9ac4
commit fa37b1fedb
4 changed files with 49 additions and 34 deletions

View File

@ -30,6 +30,24 @@ namespace rabbit {
float_t toFloat() const { float_t toFloat() const {
return _unVal.fFloat; return _unVal.fFloat;
} }
int64_t toIntegerValue() const {
if (isInteger() == true){
return _unVal.nInteger;
}
if (isFloat() == true){
return _unVal.fFloat;
}
return 0;
}
float_t toFloatValue() const {
if (isFloat() == true){
return _unVal.fFloat;
}
if (isInteger() == true){
return _unVal.nInteger;
}
return 0.0f;
}
rabbit::String*& toString() { rabbit::String*& toString() {
return _unVal.pString; return _unVal.pString;
} }
@ -219,9 +237,6 @@ namespace rabbit {
#define _stringval(obj) (obj)._unVal.pString->_val #define _stringval(obj) (obj)._unVal.pString->_val
#define _userdataval(obj) ((rabbit::UserPointer)sq_aligning((obj)._unVal.pUserData + 1)) #define _userdataval(obj) ((rabbit::UserPointer)sq_aligning((obj)._unVal.pUserData + 1))
#define tofloat(num) (((num).isInteger()==true)?(float_t)(num).toInteger():(num).toFloat())
#define tointeger(num) (((num).isFloat()==true)?(int64_t)(num).toFloat():(num).toInteger())
inline void _Swap(rabbit::Object &a,rabbit::Object &b) inline void _Swap(rabbit::Object &a,rabbit::Object &b)
{ {
rabbit::ObjectType tOldType = a._type; rabbit::ObjectType tOldType = a._type;

View File

@ -77,7 +77,7 @@ void rabbit::VirtualMachine::release() {
switch(tmask) { \ switch(tmask) { \
case rabbit::OT_INTEGER: trg = o1.toInteger() op o2.toInteger();break; \ case rabbit::OT_INTEGER: trg = o1.toInteger() op o2.toInteger();break; \
case (rabbit::OT_FLOAT|OT_INTEGER): \ case (rabbit::OT_FLOAT|OT_INTEGER): \
case (rabbit::OT_FLOAT): trg = tofloat(o1) op tofloat(o2); break;\ case (rabbit::OT_FLOAT): trg = o1.toFloatValue() op o2.toFloatValue(); break;\
default: _GUARD(ARITH_OP((#op)[0],trg,o1,o2)); break;\ default: _GUARD(ARITH_OP((#op)[0],trg,o1,o2)); break;\
} \ } \
} }
@ -88,7 +88,7 @@ void rabbit::VirtualMachine::release() {
switch(tmask) { \ switch(tmask) { \
case rabbit::OT_INTEGER: { int64_t i2 = o2.toInteger(); if(i2 == 0) { raise_error(err); SQ_THROW(); } trg = o1.toInteger() op i2; } break;\ case rabbit::OT_INTEGER: { int64_t i2 = o2.toInteger(); if(i2 == 0) { raise_error(err); SQ_THROW(); } trg = o1.toInteger() op i2; } break;\
case (rabbit::OT_FLOAT|OT_INTEGER): \ case (rabbit::OT_FLOAT|OT_INTEGER): \
case (rabbit::OT_FLOAT): trg = tofloat(o1) op tofloat(o2); break;\ case (rabbit::OT_FLOAT): trg = o1.toFloatValue() op o2.toFloatValue(); break;\
default: _GUARD(ARITH_OP((#op)[0],trg,o1,o2)); break;\ default: _GUARD(ARITH_OP((#op)[0],trg,o1,o2)); break;\
} \ } \
} }
@ -117,14 +117,14 @@ bool rabbit::VirtualMachine::ARITH_OP(uint64_t op,rabbit::ObjectPtr &trg,const r
break; break;
case (rabbit::OT_FLOAT|OT_INTEGER): case (rabbit::OT_FLOAT|OT_INTEGER):
case (rabbit::OT_FLOAT):{ case (rabbit::OT_FLOAT):{
float_t res, f1 = tofloat(o1), f2 = tofloat(o2); float_t res, f1 = o1.toFloatValue(), f2 = o2.toFloatValue();
switch(op) { switch(op) {
case '+': res = f1 + f2; break; case '+': res = f1 + f2; break;
case '-': res = f1 - f2; break; case '-': res = f1 - f2; break;
case '/': res = f1 / f2; break; case '/': res = f1 / f2; break;
case '*': res = f1 * f2; break; case '*': res = f1 * f2; break;
case '%': res = float_t(fmod((double)f1,(double)f2)); break; case '%': res = float_t(fmod((double)f1,(double)f2)); break;
default: res = 0x0f; default: res = 0x0f;
} }
trg = res; } trg = res; }
break; break;
@ -692,7 +692,7 @@ bool rabbit::VirtualMachine::isEqual(const rabbit::ObjectPtr &o1,const rabbit::O
} else { } else {
if( o1.isNumeric() == true if( o1.isNumeric() == true
&& o2.isNumeric() == true) { && o2.isNumeric() == true) {
res = (tofloat(o1) == tofloat(o2)); res = o1.toFloatValue() == o2.toFloatValue();
} else { } else {
res = false; res = false;
} }
@ -1305,7 +1305,7 @@ bool rabbit::VirtualMachine::get(const rabbit::ObjectPtr &self, const rabbit::Ob
break; break;
case rabbit::OT_ARRAY: case rabbit::OT_ARRAY:
if (key.isNumeric() == true) { if (key.isNumeric() == true) {
if (self.toArray()->get(tointeger(key), dest)) { if (self.toArray()->get(key.toIntegerValue(), dest)) {
return true; return true;
} }
if ((getflags & GET_FLAG_DO_NOT_RAISE_ERROR) == 0) { if ((getflags & GET_FLAG_DO_NOT_RAISE_ERROR) == 0) {
@ -1326,7 +1326,7 @@ bool rabbit::VirtualMachine::get(const rabbit::ObjectPtr &self, const rabbit::Ob
break; break;
case rabbit::OT_STRING: case rabbit::OT_STRING:
if(key.isNumeric()){ if(key.isNumeric()){
int64_t n = tointeger(key); int64_t n = key.toIntegerValue();
int64_t len = self.toString()->_len; int64_t len = self.toString()->_len;
if (n < 0) { n += len; } if (n < 0) { n += len; }
if (n >= 0 && n < len) { if (n >= 0 && n < len) {
@ -1437,7 +1437,7 @@ bool rabbit::VirtualMachine::set(const rabbit::ObjectPtr &self,const rabbit::Obj
break; break;
case rabbit::OT_ARRAY: case rabbit::OT_ARRAY:
if(key.isNumeric() == false) { raise_error("indexing %s with %s",getTypeName(self),getTypeName(key)); return false; } if(key.isNumeric() == false) { raise_error("indexing %s with %s",getTypeName(self),getTypeName(key)); return false; }
if(!self.toArray()->set(tointeger(key),val)) { if(!self.toArray()->set(key.toIntegerValue(),val)) {
raise_Idxerror(key); raise_Idxerror(key);
return false; return false;
} }

View File

@ -217,7 +217,7 @@ const char * rabbit::sq_objtostring(const rabbit::Object *o)
int64_t rabbit::sq_objtointeger(const rabbit::Object *o) int64_t rabbit::sq_objtointeger(const rabbit::Object *o)
{ {
if(o->isNumeric() == true) { if(o->isNumeric() == true) {
return tointeger(*o); return o->toIntegerValue();
} }
return 0; return 0;
} }
@ -225,7 +225,7 @@ int64_t rabbit::sq_objtointeger(const rabbit::Object *o)
float_t rabbit::sq_objtofloat(const rabbit::Object *o) float_t rabbit::sq_objtofloat(const rabbit::Object *o)
{ {
if(o->isNumeric() == true) { if(o->isNumeric() == true) {
return tofloat(*o); return o->toFloatValue();
} }
return 0; return 0;
} }
@ -684,7 +684,7 @@ rabbit::Result rabbit::sq_getinteger(rabbit::VirtualMachine* v,int64_t idx,int64
{ {
rabbit::ObjectPtr &o = stack_get(v, idx); rabbit::ObjectPtr &o = stack_get(v, idx);
if(o.isNumeric() == true) { if(o.isNumeric() == true) {
*i = tointeger(o); *i = o.toIntegerValue();
return SQ_OK; return SQ_OK;
} }
if(o.isBoolean() == true) { if(o.isBoolean() == true) {
@ -698,7 +698,7 @@ rabbit::Result rabbit::sq_getfloat(rabbit::VirtualMachine* v,int64_t idx,float_t
{ {
rabbit::ObjectPtr &o = stack_get(v, idx); rabbit::ObjectPtr &o = stack_get(v, idx);
if(o.isNumeric() == true) { if(o.isNumeric() == true) {
*f = tofloat(o); *f = o.toFloatValue();
return SQ_OK; return SQ_OK;
} }
return SQ_ERROR; return SQ_ERROR;
@ -1131,7 +1131,7 @@ rabbit::Result rabbit::sq_rawget(rabbit::VirtualMachine* v,int64_t idx) {
break; break;
case rabbit::OT_ARRAY: case rabbit::OT_ARRAY:
if(obj.isNumeric() == true) { if(obj.isNumeric() == true) {
if(self.toArray()->get(tointeger(obj), obj)) { if(self.toArray()->get(obj.toIntegerValue(), obj)) {
return SQ_OK; return SQ_OK;
} }
} else { } else {

View File

@ -178,13 +178,13 @@ static int64_t get_slice_params(rabbit::VirtualMachine* v,int64_t &sidx,int64_t
rabbit::ObjectPtr &start=stack_get(v,2); rabbit::ObjectPtr &start=stack_get(v,2);
if( start.isNull() == false if( start.isNull() == false
&& start.isNumeric() == true){ && start.isNumeric() == true){
sidx=tointeger(start); sidx=start.toIntegerValue();
} }
} }
if(top>2){ if(top>2){
rabbit::ObjectPtr &end=stack_get(v,3); rabbit::ObjectPtr &end=stack_get(v,3);
if(end.isNumeric() == true){ if(end.isNumeric() == true){
eidx=tointeger(end); eidx=end.toIntegerValue();
} }
} }
else { else {
@ -255,10 +255,10 @@ static int64_t base_array(rabbit::VirtualMachine* v)
rabbit::Object &size = stack_get(v,2); rabbit::Object &size = stack_get(v,2);
if(sq_gettop(v) > 2) { if(sq_gettop(v) > 2) {
a = rabbit::Array::create(_get_shared_state(v),0); a = rabbit::Array::create(_get_shared_state(v),0);
a->resize(tointeger(size),stack_get(v,3)); a->resize(size.toIntegerValue(),stack_get(v,3));
} }
else { else {
a = rabbit::Array::create(_get_shared_state(v),tointeger(size)); a = rabbit::Array::create(_get_shared_state(v),size.toIntegerValue());
} }
v->push(a); v->push(a);
return 1; return 1;
@ -348,14 +348,14 @@ static int64_t default_delegate_tofloat(rabbit::VirtualMachine* v)
case rabbit::OT_STRING:{ case rabbit::OT_STRING:{
rabbit::ObjectPtr res; rabbit::ObjectPtr res;
if(str2num(_stringval(o),res,10)){ if(str2num(_stringval(o),res,10)){
v->push(rabbit::ObjectPtr(tofloat(res))); v->push(rabbit::ObjectPtr(res.toFloatValue()));
break; break;
}} }}
return sq_throwerror(v, "cannot convert the string"); return sq_throwerror(v, "cannot convert the string");
break; break;
case rabbit::OT_INTEGER: case rabbit::OT_INTEGER:
case rabbit::OT_FLOAT: case rabbit::OT_FLOAT:
v->push(rabbit::ObjectPtr(tofloat(o))); v->push(rabbit::ObjectPtr(o.toFloatValue()));
break; break;
case rabbit::OT_BOOL: case rabbit::OT_BOOL:
v->push(rabbit::ObjectPtr((float_t)(o.toInteger()?1:0))); v->push(rabbit::ObjectPtr((float_t)(o.toInteger()?1:0)));
@ -378,14 +378,14 @@ static int64_t default_delegate_tointeger(rabbit::VirtualMachine* v)
case rabbit::OT_STRING:{ case rabbit::OT_STRING:{
rabbit::ObjectPtr res; rabbit::ObjectPtr res;
if(str2num(_stringval(o),res,base)){ if(str2num(_stringval(o),res,base)){
v->push(rabbit::ObjectPtr(tointeger(res))); v->push(rabbit::ObjectPtr(res.toIntegerValue()));
break; break;
}} }}
return sq_throwerror(v, "cannot convert the string"); return sq_throwerror(v, "cannot convert the string");
break; break;
case rabbit::OT_INTEGER: case rabbit::OT_INTEGER:
case rabbit::OT_FLOAT: case rabbit::OT_FLOAT:
v->push(rabbit::ObjectPtr(tointeger(o))); v->push(rabbit::ObjectPtr(o.toIntegerValue()));
break; break;
case rabbit::OT_BOOL: case rabbit::OT_BOOL:
v->push(rabbit::ObjectPtr(o.toInteger()?(int64_t)1:(int64_t)0)); v->push(rabbit::ObjectPtr(o.toInteger()?(int64_t)1:(int64_t)0));
@ -419,7 +419,7 @@ static int64_t obj_clear(rabbit::VirtualMachine* v)
static int64_t number_delegate_tochar(rabbit::VirtualMachine* v) static int64_t number_delegate_tochar(rabbit::VirtualMachine* v)
{ {
rabbit::Object &o=stack_get(v,1); rabbit::Object &o=stack_get(v,1);
char c = (char)tointeger(o); char c = (char)o.toIntegerValue();
v->push(rabbit::String::create(_get_shared_state(v),(const char *)&c,1)); v->push(rabbit::String::create(_get_shared_state(v),(const char *)&c,1));
return 1; return 1;
} }
@ -553,7 +553,7 @@ static int64_t array_insert(rabbit::VirtualMachine* v)
rabbit::Object &o=stack_get(v,1); rabbit::Object &o=stack_get(v,1);
rabbit::Object &idx=stack_get(v,2); rabbit::Object &idx=stack_get(v,2);
rabbit::Object &val=stack_get(v,3); rabbit::Object &val=stack_get(v,3);
if(!o.toArray()->insert(tointeger(idx),val)) if(!o.toArray()->insert(idx.toIntegerValue(),val))
return sq_throwerror(v,"index out of range"); return sq_throwerror(v,"index out of range");
sq_pop(v,2); sq_pop(v,2);
return 1; return 1;
@ -567,8 +567,8 @@ static int64_t array_remove(rabbit::VirtualMachine* v)
return sq_throwerror(v, "wrong type"); return sq_throwerror(v, "wrong type");
} }
rabbit::ObjectPtr val; rabbit::ObjectPtr val;
if(o.toArray()->get(tointeger(idx), val)) { if(o.toArray()->get(idx.toIntegerValue(), val)) {
o.toArray()->remove(tointeger(idx)); o.toArray()->remove(idx.toIntegerValue());
v->push(val); v->push(val);
return 1; return 1;
} }
@ -581,7 +581,7 @@ static int64_t array_resize(rabbit::VirtualMachine* v)
rabbit::Object &nsize = stack_get(v, 2); rabbit::Object &nsize = stack_get(v, 2);
rabbit::ObjectPtr fill; rabbit::ObjectPtr fill;
if (nsize.isNumeric() == true) { if (nsize.isNumeric() == true) {
int64_t sz = tointeger(nsize); int64_t sz = nsize.toIntegerValue();
if (sz<0) if (sz<0)
return sq_throwerror(v, "resizing to negative length"); return sq_throwerror(v, "resizing to negative length");