[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 {
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() {
return _unVal.pString;
}
@ -219,9 +237,6 @@ namespace rabbit {
#define _stringval(obj) (obj)._unVal.pString->_val
#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)
{
rabbit::ObjectType tOldType = a._type;

View File

@ -77,7 +77,7 @@ void rabbit::VirtualMachine::release() {
switch(tmask) { \
case rabbit::OT_INTEGER: trg = o1.toInteger() op o2.toInteger();break; \
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;\
} \
}
@ -88,7 +88,7 @@ void rabbit::VirtualMachine::release() {
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_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;\
} \
}
@ -117,14 +117,14 @@ bool rabbit::VirtualMachine::ARITH_OP(uint64_t op,rabbit::ObjectPtr &trg,const r
break;
case (rabbit::OT_FLOAT|OT_INTEGER):
case (rabbit::OT_FLOAT):{
float_t res, f1 = tofloat(o1), f2 = tofloat(o2);
float_t res, f1 = o1.toFloatValue(), f2 = o2.toFloatValue();
switch(op) {
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;
default: res = 0x0f;
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;
default: res = 0x0f;
}
trg = res; }
break;
@ -692,7 +692,7 @@ bool rabbit::VirtualMachine::isEqual(const rabbit::ObjectPtr &o1,const rabbit::O
} else {
if( o1.isNumeric() == true
&& o2.isNumeric() == true) {
res = (tofloat(o1) == tofloat(o2));
res = o1.toFloatValue() == o2.toFloatValue();
} else {
res = false;
}
@ -1305,7 +1305,7 @@ bool rabbit::VirtualMachine::get(const rabbit::ObjectPtr &self, const rabbit::Ob
break;
case rabbit::OT_ARRAY:
if (key.isNumeric() == true) {
if (self.toArray()->get(tointeger(key), dest)) {
if (self.toArray()->get(key.toIntegerValue(), dest)) {
return true;
}
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;
case rabbit::OT_STRING:
if(key.isNumeric()){
int64_t n = tointeger(key);
int64_t n = key.toIntegerValue();
int64_t len = self.toString()->_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;
case rabbit::OT_ARRAY:
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);
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)
{
if(o->isNumeric() == true) {
return tointeger(*o);
return o->toIntegerValue();
}
return 0;
}
@ -225,7 +225,7 @@ int64_t rabbit::sq_objtointeger(const rabbit::Object *o)
float_t rabbit::sq_objtofloat(const rabbit::Object *o)
{
if(o->isNumeric() == true) {
return tofloat(*o);
return o->toFloatValue();
}
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);
if(o.isNumeric() == true) {
*i = tointeger(o);
*i = o.toIntegerValue();
return SQ_OK;
}
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);
if(o.isNumeric() == true) {
*f = tofloat(o);
*f = o.toFloatValue();
return SQ_OK;
}
return SQ_ERROR;
@ -1131,7 +1131,7 @@ rabbit::Result rabbit::sq_rawget(rabbit::VirtualMachine* v,int64_t idx) {
break;
case rabbit::OT_ARRAY:
if(obj.isNumeric() == true) {
if(self.toArray()->get(tointeger(obj), obj)) {
if(self.toArray()->get(obj.toIntegerValue(), obj)) {
return SQ_OK;
}
} 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);
if( start.isNull() == false
&& start.isNumeric() == true){
sidx=tointeger(start);
sidx=start.toIntegerValue();
}
}
if(top>2){
rabbit::ObjectPtr &end=stack_get(v,3);
if(end.isNumeric() == true){
eidx=tointeger(end);
eidx=end.toIntegerValue();
}
}
else {
@ -255,10 +255,10 @@ static int64_t base_array(rabbit::VirtualMachine* v)
rabbit::Object &size = stack_get(v,2);
if(sq_gettop(v) > 2) {
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 {
a = rabbit::Array::create(_get_shared_state(v),tointeger(size));
a = rabbit::Array::create(_get_shared_state(v),size.toIntegerValue());
}
v->push(a);
return 1;
@ -348,14 +348,14 @@ static int64_t default_delegate_tofloat(rabbit::VirtualMachine* v)
case rabbit::OT_STRING:{
rabbit::ObjectPtr res;
if(str2num(_stringval(o),res,10)){
v->push(rabbit::ObjectPtr(tofloat(res)));
v->push(rabbit::ObjectPtr(res.toFloatValue()));
break;
}}
return sq_throwerror(v, "cannot convert the string");
break;
case rabbit::OT_INTEGER:
case rabbit::OT_FLOAT:
v->push(rabbit::ObjectPtr(tofloat(o)));
v->push(rabbit::ObjectPtr(o.toFloatValue()));
break;
case rabbit::OT_BOOL:
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:{
rabbit::ObjectPtr res;
if(str2num(_stringval(o),res,base)){
v->push(rabbit::ObjectPtr(tointeger(res)));
v->push(rabbit::ObjectPtr(res.toIntegerValue()));
break;
}}
return sq_throwerror(v, "cannot convert the string");
break;
case rabbit::OT_INTEGER:
case rabbit::OT_FLOAT:
v->push(rabbit::ObjectPtr(tointeger(o)));
v->push(rabbit::ObjectPtr(o.toIntegerValue()));
break;
case rabbit::OT_BOOL:
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)
{
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));
return 1;
}
@ -553,7 +553,7 @@ static int64_t array_insert(rabbit::VirtualMachine* v)
rabbit::Object &o=stack_get(v,1);
rabbit::Object &idx=stack_get(v,2);
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");
sq_pop(v,2);
return 1;
@ -567,8 +567,8 @@ static int64_t array_remove(rabbit::VirtualMachine* v)
return sq_throwerror(v, "wrong type");
}
rabbit::ObjectPtr val;
if(o.toArray()->get(tointeger(idx), val)) {
o.toArray()->remove(tointeger(idx));
if(o.toArray()->get(idx.toIntegerValue(), val)) {
o.toArray()->remove(idx.toIntegerValue());
v->push(val);
return 1;
}
@ -581,7 +581,7 @@ static int64_t array_resize(rabbit::VirtualMachine* v)
rabbit::Object &nsize = stack_get(v, 2);
rabbit::ObjectPtr fill;
if (nsize.isNumeric() == true) {
int64_t sz = tointeger(nsize);
int64_t sz = nsize.toIntegerValue();
if (sz<0)
return sq_throwerror(v, "resizing to negative length");