Browse Source

Improved float/double to string conversion. Improved some core methods.

Marco Bambini 6 years ago
parent
commit
02a3b01a19

+ 1 - 1
src/optionals/gravity_json.c

@@ -55,7 +55,7 @@ static bool JSON_stringify (gravity_vm *vm, gravity_value_t *args, uint16_t narg
     const char *v = NULL;
     
     if (VALUE_ISA_NULL(value) || (VALUE_ISA_UNDEFINED(value))) v = "null";
-    else if (VALUE_ISA_FLOAT(value)) {snprintf(vbuffer, sizeof(vbuffer), "%f", value.f); v = vbuffer;}
+    else if (VALUE_ISA_FLOAT(value)) {snprintf(vbuffer, sizeof(vbuffer), "%g", value.f); v = vbuffer;}
     else if (VALUE_ISA_BOOL(value)) v = (value.n) ? "true" : "false";
     else if (VALUE_ISA_INT(value)) {
         #if GRAVITY_ENABLE_INT64

+ 3 - 3
src/optionals/gravity_math.c

@@ -521,7 +521,7 @@ static bool math_logx (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
 static bool math_max (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     if (nargs == 1) RETURN_VALUE(VALUE_FROM_NULL, rindex);
 
-    gravity_float_t n = -FLOAT_MAX;
+    gravity_float_t n = -GRAVITY_FLOAT_MAX;
     uint16_t maxindex = 1;
     bool found = false;
 
@@ -553,7 +553,7 @@ static bool math_max (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uin
 static bool math_min (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     if (nargs == 1) RETURN_VALUE(VALUE_FROM_NULL, rindex);
 
-    gravity_float_t n = FLOAT_MAX;
+    gravity_float_t n = GRAVITY_FLOAT_MAX;
     uint16_t minindex = 1;
     bool found = false;
 
@@ -648,7 +648,7 @@ static bool math_round (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, u
             
             // convert f to string
             char buffer[512];
-            snprintf(buffer, sizeof(buffer), "%f", f);
+            snprintf(buffer, sizeof(buffer), "%g", f);
             
             // trunc c string to the requested ndigits
             char *p = buffer;

+ 30 - 5
src/runtime/gravity_core.c

@@ -390,7 +390,7 @@ inline gravity_value_t convert_value2string (gravity_vm *vm, gravity_value_t v)
     
     if (VALUE_ISA_FLOAT(v)) {
         char buffer[512];
-        snprintf(buffer, sizeof(buffer), "%f", v.f);
+        snprintf(buffer, sizeof(buffer), "%g", v.f);
         return VALUE_FROM_CSTRING(vm, buffer);
     }
 
@@ -564,16 +564,17 @@ static void collect_introspection_extended (gravity_hash_t *hashtable, gravity_v
 
 static bool object_real_introspection (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex, introspection_info_type mask) {
     bool extended = ((nargs >= 2) && (VALUE_ISA_BOOL(args[1]) && (VALUE_AS_BOOL(args[1]) == true)));
-    bool nosuper = ((nargs >= 3) && (VALUE_ISA_BOOL(args[2]) && (VALUE_AS_BOOL(args[2]) == true)));
+    bool scan_super = ((nargs >= 3) && (VALUE_ISA_BOOL(args[2]) && (VALUE_AS_BOOL(args[2]) == true)));
     
     gravity_hash_iterate3_fn callback = (extended) ? collect_introspection_extended : collect_introspection;
     gravity_object_t *data = (extended) ? (gravity_object_t *)gravity_map_new(vm, 256) : (gravity_object_t *)gravity_list_new(vm, 256);
     
-    gravity_class_t *c = gravity_value_getclass(GET_VALUE(0));
+    gravity_value_t value = GET_VALUE(0);
+    gravity_class_t *c = (VALUE_ISA_CLASS(value)) ? VALUE_AS_CLASS(value) : gravity_value_getclass(value);
     while (c) {
         gravity_hash_t *htable = c->htable;
         gravity_hash_iterate3(htable, callback, (void *)data, (void *)&mask, (void *)vm);
-        c = (nosuper) ? NULL : c->superclass;
+        c = (!scan_super) ? NULL : c->superclass;
     }
     
     RETURN_VALUE(VALUE_FROM_OBJECT(data), rindex);
@@ -1971,6 +1972,16 @@ static bool float_isclose (gravity_vm *vm, gravity_value_t *args, uint16_t nargs
     RETURN_VALUE(VALUE_FROM_BOOL(abs_diff <= result), rindex);
 }
 
+static bool float_min (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
+    #pragma unused(vm, args, nargs)
+    RETURN_VALUE(VALUE_FROM_FLOAT(GRAVITY_FLOAT_MIN), rindex);
+}
+
+static bool float_max (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
+    #pragma unused(vm, args, nargs)
+    RETURN_VALUE(VALUE_FROM_FLOAT(GRAVITY_FLOAT_MAX), rindex);
+}
+
 // MARK: - Int Class -
 
 // binary operators
@@ -2127,6 +2138,16 @@ static bool int_radians (gravity_vm *vm, gravity_value_t *args, uint16_t nargs,
     RETURN_VALUE(VALUE_FROM_FLOAT(GET_VALUE(0).n*3.141592653589793/180), rindex);
 }
 
+static bool int_min (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
+    #pragma unused(vm, args, nargs)
+    RETURN_VALUE(VALUE_FROM_INT(GRAVITY_INT_MIN), rindex);
+}
+
+static bool int_max (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
+    #pragma unused(vm, args, nargs)
+    RETURN_VALUE(VALUE_FROM_INT(GRAVITY_INT_MAX), rindex);
+}
+
 // MARK: - Bool Class -
 
 static bool operator_bool_add (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
@@ -3374,7 +3395,9 @@ void gravity_core_init (void) {
     gravity_class_t *int_meta = gravity_class_get_meta(gravity_class_int);
     gravity_class_bind(int_meta, "random", NEW_CLOSURE_VALUE(int_random));
     gravity_class_bind(int_meta, GRAVITY_INTERNAL_EXEC_NAME, NEW_CLOSURE_VALUE(int_exec));
-
+    gravity_class_bind(int_meta, "min", VALUE_FROM_OBJECT(computed_property_create(NULL, NEW_FUNCTION(int_min), NULL)));
+    gravity_class_bind(int_meta, "max", VALUE_FROM_OBJECT(computed_property_create(NULL, NEW_FUNCTION(int_max), NULL)));
+    
     // FLOAT CLASS
     gravity_class_bind(gravity_class_float, GRAVITY_OPERATOR_ADD_NAME, NEW_CLOSURE_VALUE(operator_float_add));
     gravity_class_bind(gravity_class_float, GRAVITY_OPERATOR_SUB_NAME, NEW_CLOSURE_VALUE(operator_float_sub));
@@ -3397,6 +3420,8 @@ void gravity_core_init (void) {
     // Meta
     gravity_class_t *float_meta = gravity_class_get_meta(gravity_class_float);
     gravity_class_bind(float_meta, GRAVITY_INTERNAL_EXEC_NAME, NEW_CLOSURE_VALUE(float_exec));
+    gravity_class_bind(float_meta, "min", VALUE_FROM_OBJECT(computed_property_create(NULL, NEW_FUNCTION(float_min), NULL)));
+    gravity_class_bind(float_meta, "max", VALUE_FROM_OBJECT(computed_property_create(NULL, NEW_FUNCTION(float_max), NULL)));
 
     // BOOL CLASS
     gravity_class_bind(gravity_class_bool, GRAVITY_OPERATOR_ADD_NAME, NEW_CLOSURE_VALUE(operator_bool_add));

+ 1 - 1
src/shared/gravity_hash.c

@@ -332,7 +332,7 @@ uint32_t gravity_hash_compute_int (gravity_int_t n) {
 
 uint32_t gravity_hash_compute_float (gravity_float_t f) {
     char buffer[24];
-    snprintf(buffer, sizeof(buffer), "%f", f);
+    snprintf(buffer, sizeof(buffer), "%g", f);
     return murmur3_32(buffer, (uint32_t)strlen(buffer), HASH_SEED_VALUE);
 }
 

+ 2 - 2
src/shared/gravity_value.c

@@ -626,7 +626,7 @@ static void gravity_function_array_dump (gravity_function_t *f, gravity_value_r
         }
         
         if (VALUE_ISA_FLOAT(v)) {
-            printf("%05zu\tFLOAT: %f\n", i, (double)v.f);
+            printf("%05zu\tFLOAT: %g\n", i, (double)v.f);
             continue;
         }
         
@@ -2047,7 +2047,7 @@ void gravity_value_dump (gravity_vm *vm, gravity_value_t v, char *buffer, uint16
         value = buffer;
     } else if (v.isa == gravity_class_float) {
         type = "FLOAT";
-        snprintf(buffer, len, "(%s) %f", type, v.f);
+        snprintf(buffer, len, "(%s) %g", type, v.f);
         value = buffer;
     } else if (v.isa == gravity_class_function) {
         type = "FUNCTION";

+ 6 - 6
src/shared/gravity_value.h

@@ -66,8 +66,8 @@
 extern "C" {
 #endif
 
-#define GRAVITY_VERSION						"0.7.4"     // git tag 0.7.4
-#define GRAVITY_VERSION_NUMBER				0x000704    // git push --tags
+#define GRAVITY_VERSION						"0.7.5"     // git tag 0.7.5
+#define GRAVITY_VERSION_NUMBER				0x000705    // git push --tags
 #define GRAVITY_BUILD_DATE                  __DATE__
 
 #ifndef GRAVITY_ENABLE_DOUBLE
@@ -161,14 +161,14 @@ extern "C" {
 // FLOAT_MAX_DECIMALS FROM https://stackoverflow.com/questions/13542944/how-many-significant-digits-have-floats-and-doubles-in-java
 #if GRAVITY_ENABLE_DOUBLE
 typedef double                              gravity_float_t;
-#define FLOAT_MAX                           DBL_MAX
-#define FLOAT_MIN                           DBL_MIN
+#define GRAVITY_FLOAT_MAX                   DBL_MAX
+#define GRAVITY_FLOAT_MIN                   DBL_MIN
 #define FLOAT_MAX_DECIMALS                  16
 #define FLOAT_EPSILON                       0.00001
 #else
 typedef float                               gravity_float_t;
-#define FLOAT_MAX                           FLT_MAX
-#define FLOAT_MIN                           FLT_MIN
+#define GRAVITY_FLOAT_MAX                   FLT_MAX
+#define GRAVITY_FLOAT_MIN                   FLT_MIN
 #define FLOAT_MAX_DECIMALS                  7
 #define FLOAT_EPSILON                       0.00001
 #endif

+ 1 - 1
src/utils/gravity_json.c

@@ -291,7 +291,7 @@ void json_add_double (json_t *json, const char *key, double value) {
     json_check_comma(json);
     
     char buffer[512];
-    size_t len = snprintf(buffer, sizeof(buffer), "%f", value);
+    size_t len = snprintf(buffer, sizeof(buffer), "%g", value);
 
     if (key) {
         json_write_raw (json, key, strlen(key), true, true);

+ 1 - 0
src/utils/gravity_utils.c

@@ -262,6 +262,7 @@ DIRREF directory_init (const char *dirpath) {
 }
 
 const char *directory_read (DIRREF ref, char *out) {
+    #pragma unused (out)
 	if (ref == NULL) return NULL;
 	
 	while (1) {