Browse Source

Several Math related fixes.

Marco Bambini 8 years ago
parent
commit
f44a6f06b3

+ 0 - 1
src/cli/gravity.c

@@ -263,7 +263,6 @@ cleanup:
 	if (compiler) gravity_compiler_free(compiler);
 	if (vm) gravity_vm_free(vm);
 	gravity_core_free();
-    gravity_optionals_free();
 	
 	#if GRAVITY_MEMORY_DEBUG
 	size_t current_memory = mem_leaks();

+ 1 - 4
src/compiler/gravity_compiler.c

@@ -96,10 +96,7 @@ static void gravity_compiler_reset (gravity_compiler_t *compiler, bool free_core
 	}
 	
 	// feel free to free core if someone requires it
-    if (free_core) {
-        gravity_core_free();
-        gravity_optionals_free();
-    }
+    if (free_core) gravity_core_free();
 	
 	// reset internal pointers
 	compiler->vm = NULL;

+ 22 - 22
src/optionals/gravity_math.c

@@ -59,7 +59,7 @@ static uint32_t                     refcount = 0;
 // returns the absolute value of x
 static bool math_abs (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -92,7 +92,7 @@ static bool math_abs (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uin
 // returns the arccosine of x, in radians
 static bool math_acos (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -115,7 +115,7 @@ static bool math_acos (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
 // returns the arcsine of x, in radians
 static bool math_asin (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -138,7 +138,7 @@ static bool math_asin (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
 // returns the arctangent of x as a numeric value between -PI/2 and PI/2 radians
 static bool math_atan (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -162,10 +162,10 @@ static bool math_atan (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
 static bool math_atan2 (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm)
     
-    if (nargs != 2) RETURN_VALUE(VALUE_FROM_UNDEFINED, rindex);
+    if (nargs != 3) RETURN_VALUE(VALUE_FROM_UNDEFINED, rindex);
     
-    gravity_value_t value = GET_VALUE(0);
-    gravity_value_t value2 = GET_VALUE(1);
+    gravity_value_t value = GET_VALUE(1);
+    gravity_value_t value2 = GET_VALUE(2);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -193,7 +193,7 @@ static bool math_atan2 (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, u
 // returns x, rounded upwards to the nearest integer
 static bool math_ceil (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -216,7 +216,7 @@ static bool math_ceil (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
 // returns the cosine of x (x is in radians)
 static bool math_cos (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -239,7 +239,7 @@ static bool math_cos (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uin
 // returns the value of Ex
 static bool math_exp (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -262,7 +262,7 @@ static bool math_exp (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uin
 // returns x, rounded downwards to the nearest integer
 static bool math_floor (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -285,7 +285,7 @@ static bool math_floor (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, u
 // returns the natural logarithm (base E) of x
 static bool math_log (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -310,7 +310,7 @@ static bool math_max (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uin
     gravity_float_t n = FLOAT_MIN;
     gravity_value_t result = VALUE_FROM_UNDEFINED;
     
-    for (uint16_t i = 0; i<nargs; ++i) {
+    for (uint16_t i = 1; i<nargs; ++i) {
         gravity_value_t value = GET_VALUE(i);
         if (VALUE_ISA_INT(value)) {
             if ((gravity_float_t)value.n > n) result = value;
@@ -327,7 +327,7 @@ static bool math_min (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uin
     gravity_float_t n = FLOAT_MAX;
     gravity_value_t result = VALUE_FROM_UNDEFINED;
     
-    for (uint16_t i = 0; i<nargs; ++i) {
+    for (uint16_t i = 1; i<nargs; ++i) {
         gravity_value_t value = GET_VALUE(i);
         if (VALUE_ISA_INT(value)) {
             if ((gravity_float_t)value.n < n) result = value;
@@ -343,10 +343,10 @@ static bool math_min (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uin
 static bool math_pow (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm)
     
-    if (nargs != 2) RETURN_VALUE(VALUE_FROM_UNDEFINED, rindex);
+    if (nargs != 3) RETURN_VALUE(VALUE_FROM_UNDEFINED, rindex);
     
-    gravity_value_t value = GET_VALUE(0);
-    gravity_value_t value2 = GET_VALUE(1);
+    gravity_value_t value = GET_VALUE(1);
+    gravity_value_t value2 = GET_VALUE(2);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -389,7 +389,7 @@ static bool math_random (gravity_vm *vm, gravity_value_t *args, uint16_t nargs,
 // rounds x to the nearest integer
 static bool math_round (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -412,7 +412,7 @@ static bool math_round (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, u
 // returns the sine of x (x is in radians)
 static bool math_sin (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -435,7 +435,7 @@ static bool math_sin (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uin
 // returns the square root of x
 static bool math_sqrt (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -458,7 +458,7 @@ static bool math_sqrt (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
 // returns the tangent of an angle
 static bool math_tan (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
-    gravity_value_t value = GET_VALUE(0);
+    gravity_value_t value = GET_VALUE(1);
     
     if (VALUE_ISA_NULL(value)) {
         RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -587,7 +587,7 @@ void gravity_math_register (gravity_vm *vm) {
     if (!gravity_class_math) create_optional_class();
     ++refcount;
     
-    if (gravity_vm_ismini(vm)) return;
+    if (!vm || gravity_vm_ismini(vm)) return;
     gravity_vm_setvalue(vm, MATH_CLASS_NAME, VALUE_FROM_OBJECT(gravity_class_math));
 }
 

+ 4 - 0
src/runtime/gravity_core.c

@@ -2580,6 +2580,9 @@ static void gravity_core_init (void) {
 }
 
 void gravity_core_free (void) {
+    // free optionals first
+    gravity_opt_free();
+    
 	if (!core_inited) return;
 	
 	// check if others VM are still running
@@ -2667,6 +2670,7 @@ const char **gravity_core_identifiers (void) {
 
 void gravity_core_register (gravity_vm *vm) {
 	gravity_core_init();
+    gravity_opt_register(vm);
 	++refcount;
 	if (!vm) return;
 	

+ 3 - 4
src/runtime/gravity_vm.c

@@ -295,15 +295,15 @@ static void gravity_vm_loadclass (gravity_vm *vm, gravity_class_t *c) {
 
 // MARK: Internals -
 
-static void gravity_optionals_register (gravity_vm *vm) {
+void gravity_opt_register (gravity_vm *vm) {
     GRAVITY_MATH_REGISTER(vm);
 }
 
-void gravity_optionals_free() {
+void gravity_opt_free() {
     GRAVITY_MATH_FREE();
 }
 
-bool gravity_isoptional_class (gravity_class_t *c) {
+bool gravity_isopt_class (gravity_class_t *c) {
     return GRAVITY_ISMATH_CLASS(c);
 }
 
@@ -1331,7 +1331,6 @@ gravity_vm *gravity_vm_new (gravity_delegate_t *delegate/*, uint32_t context_siz
 	
 	// init base and core
 	gravity_core_register(vm);
-    gravity_optionals_register(vm);
 	gravity_cache_setup();
 	
 	RESET_STATS(vm);

+ 3 - 2
src/runtime/gravity_vm.h

@@ -71,8 +71,9 @@ GRAVITY_API gravity_value_t		gravity_vm_get (gravity_vm *vm, const char *key);
 GRAVITY_API bool				gravity_vm_set (gravity_vm *vm, const char *key, gravity_value_t value);
 GRAVITY_API char				*gravity_vm_anonymous (gravity_vm *vm);
 
-GRAVITY_API bool                gravity_isoptional_class (gravity_class_t *c);
-GRAVITY_API void                gravity_optionals_free (void);
+GRAVITY_API bool                gravity_isopt_class (gravity_class_t *c);
+GRAVITY_API void                gravity_opt_register (gravity_vm *vm);
+GRAVITY_API void                gravity_opt_free (void);
 
 #ifdef __cplusplus
 }

+ 1 - 1
src/shared/gravity_value.c

@@ -358,7 +358,7 @@ abort_load:
 }
 
 static void gravity_class_free_internal (gravity_vm *vm, gravity_class_t *c, bool skip_base) {
-	if (skip_base && (gravity_iscore_class(c) || gravity_isoptional_class(c))) return;
+	if (skip_base && (gravity_iscore_class(c) || gravity_isopt_class(c))) return;
 	
 	DEBUG_FREE("FREE %s", gravity_object_debug((gravity_object_t *)c));