Improve USE_DECNUM check position

This commit is contained in:
itchyny authored and Nico Williams committed 2023-07-24 11:53:51 -05:00
1 parent 54fef09ac3
commit c4d5ba954d
1 file changed
+37 -30
+37 -30
View File
@@ -48,11 +48,6 @@
#include "jv_dtoa.h" #include "jv_dtoa.h"
#include "jv_dtoa_tsd.h" #include "jv_dtoa_tsd.h"
// this means that we will manage the space for the struct
#define DECNUMDIGITS 1
#include "decNumber/decNumber.h"
#include "jv_type_private.h" #include "jv_type_private.h"
/* /*
@@ -204,6 +199,11 @@ static void jvp_invalid_free(jv x) {
* Numbers * Numbers
*/ */
#ifdef USE_DECNUM
// we will manage the space for the struct
#define DECNUMDIGITS 1
#include "decNumber/decNumber.h"
enum { enum {
JVP_NUMBER_NATIVE = 0, JVP_NUMBER_NATIVE = 0,
JVP_NUMBER_DECIMAL = 1 JVP_NUMBER_DECIMAL = 1
@@ -213,7 +213,6 @@ enum {
#define JV_NUMBER_SIZE_CONVERTED (1) #define JV_NUMBER_SIZE_CONVERTED (1)
#define JVP_FLAGS_NUMBER_NATIVE JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_NATIVE, 0)) #define JVP_FLAGS_NUMBER_NATIVE JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_NATIVE, 0))
#define JVP_FLAGS_NUMBER_NATIVE_STR JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_NATIVE, 1))
#define JVP_FLAGS_NUMBER_LITERAL JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_DECIMAL, 1)) #define JVP_FLAGS_NUMBER_LITERAL JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_DECIMAL, 1))
// the decimal precision of binary double // the decimal precision of binary double
@@ -642,11 +641,6 @@ static double jvp_literal_number_to_double(jv j) {
return jvp_strtod(tsd_dtoa_context_get(), literal, &end); return jvp_strtod(tsd_dtoa_context_get(), literal, &end);
} }
static int jvp_number_equal(jv a, jv b) {
return jvp_number_cmp(a, b) == 0;
}
static const char* jvp_literal_number_literal(jv n) { static const char* jvp_literal_number_literal(jv n) {
assert(JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL)); assert(JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL));
decNumber *pdec = jvp_dec_number_ptr(n); decNumber *pdec = jvp_dec_number_ptr(n);
@@ -693,8 +687,26 @@ const char* jv_number_get_literal(jv n) {
} }
} }
jv jv_number_with_literal(const char * literal) {
return jvp_literal_number_new(literal);
}
#endif /* USE_DECNUM */
jv jv_number(double x) {
jv j = {
#ifdef USE_DECNUM
JVP_FLAGS_NUMBER_NATIVE,
#else
JV_KIND_NUMBER,
#endif
0, 0, 0, {.number = x}
};
return j;
}
static void jvp_number_free(jv j) { static void jvp_number_free(jv j) {
assert(JVP_HAS_KIND(j, JV_KIND_NUMBER)); assert(JVP_HAS_KIND(j, JV_KIND_NUMBER));
#ifdef USE_DECNUM
if (JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL) && jvp_refcnt_dec(j.u.ptr)) { if (JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL) && jvp_refcnt_dec(j.u.ptr)) {
jvp_literal_number* n = jvp_literal_number_ptr(j); jvp_literal_number* n = jvp_literal_number_ptr(j);
if (n->literal_data) { if (n->literal_data) {
@@ -702,15 +714,7 @@ static void jvp_number_free(jv j) {
} }
jv_mem_free(n); jv_mem_free(n);
} }
} #endif
jv jv_number_with_literal(const char * literal) {
return jvp_literal_number_new(literal);
}
jv jv_number(double x) {
jv j = {JVP_FLAGS_NUMBER_NATIVE, 0, 0, 0, {.number = x}};
return j;
} }
double jv_number_value(jv j) { double jv_number_value(jv j) {
@@ -725,16 +729,13 @@ double jv_number_value(jv j) {
} }
return n->num_double; return n->num_double;
} else {
#endif
return j.u.number;
#ifdef USE_DECNUM
} }
#endif #endif
return j.u.number;
} }
int jv_is_integer(jv j){ int jv_is_integer(jv j){
if(!JVP_HAS_KIND(j, JV_KIND_NUMBER)){ if (!JVP_HAS_KIND(j, JV_KIND_NUMBER)){
return 0; return 0;
} }
@@ -749,19 +750,21 @@ int jv_is_integer(jv j){
int jvp_number_is_nan(jv n) { int jvp_number_is_nan(jv n) {
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER)); assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
#ifdef USE_DECNUM
if (JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL)) { if (JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL)) {
decNumber *pdec = jvp_dec_number_ptr(n); decNumber *pdec = jvp_dec_number_ptr(n);
return decNumberIsNaN(pdec); return decNumberIsNaN(pdec);
} else {
return n.u.number != n.u.number;
} }
#endif
return n.u.number != n.u.number;
} }
int jvp_number_cmp(jv a, jv b) { int jvp_number_cmp(jv a, jv b) {
assert(JVP_HAS_KIND(a, JV_KIND_NUMBER)); assert(JVP_HAS_KIND(a, JV_KIND_NUMBER));
assert(JVP_HAS_KIND(b, JV_KIND_NUMBER)); assert(JVP_HAS_KIND(b, JV_KIND_NUMBER));
if(JVP_HAS_FLAGS(a, JVP_FLAGS_NUMBER_LITERAL) && JVP_HAS_FLAGS(b, JVP_FLAGS_NUMBER_LITERAL)) { #ifdef USE_DECNUM
if (JVP_HAS_FLAGS(a, JVP_FLAGS_NUMBER_LITERAL) && JVP_HAS_FLAGS(b, JVP_FLAGS_NUMBER_LITERAL)) {
decNumberSingle res; decNumberSingle res;
decNumberCompare(&res.number, decNumberCompare(&res.number,
jvp_dec_number_ptr(a), jvp_dec_number_ptr(a),
@@ -775,7 +778,8 @@ int jvp_number_cmp(jv a, jv b) {
} else { } else {
return 1; return 1;
} }
} else { }
#endif
double da = jv_number_value(a), db = jv_number_value(b); double da = jv_number_value(a), db = jv_number_value(b);
if (da < db) { if (da < db) {
return -1; return -1;
@@ -784,7 +788,10 @@ int jvp_number_cmp(jv a, jv b) {
} else { } else {
return 1; return 1;
} }
} }
static int jvp_number_equal(jv a, jv b) {
return jvp_number_cmp(a, b) == 0;
} }
/* /*