VM: CELL_TO_FOO macro-magic in the same spirit as BIGNUM_TO_FOO
Now also factor_vm::to_cell doesn't piggyback on factor_vm::to_fixnum's (strict) conversion.db4
parent
c3f9c0a9a3
commit
d225bec128
74
vm/math.cpp
74
vm/math.cpp
|
@ -277,28 +277,28 @@ void factor_vm::primitive_bits_double() {
|
|||
ctx->push(allot_float(bits_double(to_unsigned_8(ctx->pop()))));
|
||||
}
|
||||
|
||||
/* Cannot allocate */
|
||||
fixnum factor_vm::to_fixnum(cell tagged) {
|
||||
switch (TAG(tagged)) {
|
||||
case FIXNUM_TYPE:
|
||||
return untag_fixnum(tagged);
|
||||
case BIGNUM_TYPE:
|
||||
return bignum_to_fixnum_strict(untag<bignum>(tagged));
|
||||
default:
|
||||
type_error(FIXNUM_TYPE, tagged);
|
||||
return 0; /* can't happen */
|
||||
/* Cannot allocate. */
|
||||
#define CELL_TO_FOO(name, type, converter) \
|
||||
type factor_vm::name(cell tagged) { \
|
||||
switch (TAG(tagged)) { \
|
||||
case FIXNUM_TYPE: \
|
||||
return (type)untag_fixnum(tagged); \
|
||||
case BIGNUM_TYPE: \
|
||||
return converter(untag<bignum>(tagged)); \
|
||||
default: \
|
||||
type_error(FIXNUM_TYPE, tagged); \
|
||||
return 0; /* can't happen */ \
|
||||
} \
|
||||
} \
|
||||
VM_C_API type name(cell tagged, factor_vm* parent) { \
|
||||
return parent->name(tagged); \
|
||||
}
|
||||
}
|
||||
|
||||
VM_C_API fixnum to_fixnum(cell tagged, factor_vm* parent) {
|
||||
return parent->to_fixnum(tagged);
|
||||
}
|
||||
|
||||
cell factor_vm::to_cell(cell tagged) { return (cell)to_fixnum(tagged); }
|
||||
|
||||
VM_C_API cell to_cell(cell tagged, factor_vm* parent) {
|
||||
return parent->to_cell(tagged);
|
||||
}
|
||||
/* Note that to_fixnum, unlike the others, is strict. */
|
||||
CELL_TO_FOO(to_fixnum, fixnum, bignum_to_fixnum_strict)
|
||||
CELL_TO_FOO(to_cell, cell, bignum_to_cell)
|
||||
CELL_TO_FOO(to_signed_8, int64_t, bignum_to_long_long)
|
||||
CELL_TO_FOO(to_unsigned_8, uint64_t, bignum_to_ulong_long)
|
||||
|
||||
/* Allocates memory */
|
||||
VM_C_API cell from_signed_cell(fixnum integer, factor_vm* parent) {
|
||||
|
@ -322,23 +322,6 @@ VM_C_API cell from_signed_8(int64_t n, factor_vm* parent) {
|
|||
return parent->from_signed_8(n);
|
||||
}
|
||||
|
||||
/* Cannot allocate */
|
||||
int64_t factor_vm::to_signed_8(cell obj) {
|
||||
switch (tagged<object>(obj).type()) {
|
||||
case FIXNUM_TYPE:
|
||||
return untag_fixnum(obj);
|
||||
case BIGNUM_TYPE:
|
||||
return bignum_to_long_long(untag<bignum>(obj));
|
||||
default:
|
||||
type_error(BIGNUM_TYPE, obj);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
VM_C_API int64_t to_signed_8(cell obj, factor_vm* parent) {
|
||||
return parent->to_signed_8(obj);
|
||||
}
|
||||
|
||||
/* Allocates memory */
|
||||
cell factor_vm::from_unsigned_8(uint64_t n) {
|
||||
if (n > (uint64_t)fixnum_max)
|
||||
|
@ -351,23 +334,6 @@ VM_C_API cell from_unsigned_8(uint64_t n, factor_vm* parent) {
|
|||
return parent->from_unsigned_8(n);
|
||||
}
|
||||
|
||||
/* Cannot allocate */
|
||||
uint64_t factor_vm::to_unsigned_8(cell obj) {
|
||||
switch (tagged<object>(obj).type()) {
|
||||
case FIXNUM_TYPE:
|
||||
return untag_fixnum(obj);
|
||||
case BIGNUM_TYPE:
|
||||
return bignum_to_ulong_long(untag<bignum>(obj));
|
||||
default:
|
||||
type_error(BIGNUM_TYPE, obj);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
VM_C_API uint64_t to_unsigned_8(cell obj, factor_vm* parent) {
|
||||
return parent->to_unsigned_8(obj);
|
||||
}
|
||||
|
||||
/* Cannot allocate */
|
||||
float factor_vm::to_float(cell value) {
|
||||
return (float)untag_float_check(value);
|
||||
|
|
Loading…
Reference in New Issue