Pārlūkot izejas kodu

Fixed new fuzzy test #156. Added new unit test.

Marco Bambini 8 gadi atpakaļ
vecāks
revīzija
b07ed8f76a
20 mainītis faili ar 300 papildinājumiem un 13 dzēšanām
  1. 52 13
      src/compiler/gravity_codegen.c
  2. 1 0
      src/runtime/gravity_core.c
  3. BIN
      test/fuzzy/2017-05-04/.DS_Store.gravity
  4. 11 0
      test/fuzzy/2017-05-04/id:000000,sig:11,src:001099,op:havoc,rep:2.gravity
  5. 18 0
      test/fuzzy/2017-05-04/id:000001,sig:11,src:000039,op:arith8,pos:214,val:+29.gravity
  6. 12 0
      test/fuzzy/2017-05-04/id:000001,sig:11,src:001094,op:havoc,rep:2.gravity
  7. 11 0
      test/fuzzy/2017-05-04/id:000001,sig:11,src:001099,op:havoc,rep:2.gravity
  8. 16 0
      test/fuzzy/2017-05-04/id:000002,sig:06,src:003564,op:havoc,rep:2.gravity
  9. 17 0
      test/fuzzy/2017-05-04/id:000002,sig:11,src:000039,op:arith8,pos:215,val:+34.gravity
  10. 17 0
      test/fuzzy/2017-05-04/id:000003,sig:06,src:003583,op:havoc,rep:2.gravity
  11. 12 0
      test/fuzzy/2017-05-04/id:000004,sig:11,src:001036,op:flip2,pos:95.gravity
  12. 12 0
      test/fuzzy/2017-05-04/id:000005,sig:11,src:001036,op:flip4,pos:95.gravity
  13. 12 0
      test/fuzzy/2017-05-04/id:000006,sig:11,src:001036,op:arith8,pos:95,val:+10.gravity
  14. 12 0
      test/fuzzy/2017-05-04/id:000007,sig:11,src:001036,op:arith8,pos:95,val:-20.gravity
  15. 17 0
      test/fuzzy/2017-05-04/id:000008,sig:06,src:001405,op:flip1,pos:177.gravity
  16. 17 0
      test/fuzzy/2017-05-04/id:000009,sig:06,src:001405,op:flip1,pos:177.gravity
  17. 17 0
      test/fuzzy/2017-05-04/id:000010,sig:06,src:001405,op:arith8,pos:177,val:-28.gravity
  18. 17 0
      test/fuzzy/2017-05-04/id:000011,sig:06,src:001405,op:ext_AO,pos:177.gravity
  19. 17 0
      test/fuzzy/2017-05-04/id:000012,sig:06,src:001405,op:ext_AO,pos:190.gravity
  20. 12 0
      test/fuzzy/2017-05-04/id:000013,sig:11,src:002525,op:ext_AO,pos:68.gravity

+ 52 - 13
src/compiler/gravity_codegen.c

@@ -1240,7 +1240,10 @@ static void visit_postfix_expr (gvisitor_t *self, gnode_postfix_expr_t *node) {
 	
 	// register that contains callable object
 	uint32_t target_register = ircode_register_pop_context_protect(code, true);
-	if (target_register == REGISTER_ERROR) report_error(self, (gnode_t *)node->id, "Invalid postfix expression.");
+    if (target_register == REGISTER_ERROR) {
+        report_error(self, (gnode_t *)node->id, "Invalid postfix expression.");
+        return;
+    }
 	
 	// register where to store final result
 	uint32_t dest_register = target_register;
@@ -1288,14 +1291,20 @@ static void visit_postfix_expr (gvisitor_t *self, gnode_postfix_expr_t *node) {
 			uint32_t temp_target_register = ircode_register_push_temp(code);
 			ircode_add(code, MOVE, temp_target_register, target_register, 0);
 			uint32_t treg = ircode_register_pop_context_protect(code, true);
-			DEBUG_ASSERT(treg != REGISTER_ERROR, "Unexpected register error.");
+            if (treg == REGISTER_ERROR) {
+                report_error(self, (gnode_t *)subnode, "Unexpected register error.");
+                return;
+            }
 			
 			// always add SELF parameter (must be temp+1)
 			uint32_t self_register = marray_pop(self_list);
 			uint32_t temp_self_register = ircode_register_push_temp(code);
 			ircode_add(code, MOVE, temp_self_register, self_register, 0);
 			treg = ircode_register_pop_context_protect(code, true);
-			DEBUG_ASSERT(treg != REGISTER_ERROR, "Unexpected register error.");
+            if (treg == REGISTER_ERROR) {
+                report_error(self, (gnode_t *)subnode, "Unexpected register error.");
+                return;
+            }
 			
 			// process each parameter (each must be temp+2 ... temp+n)
 			marray_decl_init(uint32_r, args);
@@ -1307,7 +1316,10 @@ static void visit_postfix_expr (gvisitor_t *self, gnode_postfix_expr_t *node) {
 				visit(arg);
 				ircode_pragma(code, PRAGMA_MOVE_OPTIMIZATION, 0);
 				uint32_t nreg = ircode_register_pop_context_protect(code, true);
-				if (nreg == REGISTER_ERROR) report_error(self, (gnode_t *)arg, "Invalid argument expression at index %d.", j+1);
+                if (nreg == REGISTER_ERROR) {
+                    report_error(self, (gnode_t *)arg, "Invalid argument expression at index %d.", j+1);
+                    return;
+                }
 				
 				// make sure args are in consecutive register locations (from temp_target_register + 1 to temp_target_register + n)
 				if (nreg != temp_target_register + j + 2) {
@@ -1316,9 +1328,15 @@ static void visit_postfix_expr (gvisitor_t *self, gnode_postfix_expr_t *node) {
 					ircode_add(code, MOVE, temp, nreg, 0);
 					ircode_register_clear(code, nreg);
 					nreg = ircode_register_pop_context_protect(code, true);
-					if (nreg == REGISTER_ERROR) report_error(self, (gnode_t *)arg, "Invalid argument expression");
+                    if (nreg == REGISTER_ERROR) {
+                        report_error(self, (gnode_t *)arg, "Invalid argument expression");
+                        return;
+                    }
+				}
+                if (nreg != temp_target_register + j + 2) {
+                    report_error(self, (gnode_t *)arg, "Invalid register computation in call expression.");
+                    return;
 				}
-				if (nreg != temp_target_register + j + 2) report_error(self, (gnode_t *)arg, "Invalid register computation in call expression.");
 				marray_push(uint32_t, args, nreg);
 			}
 			
@@ -1343,7 +1361,10 @@ static void visit_postfix_expr (gvisitor_t *self, gnode_postfix_expr_t *node) {
 					// code added in order to protect the extra register pushed in case
 					// of code like: f(20)(30)
 					uint32_t last_register = ircode_register_last(code);
-					if (last_register == REGISTER_ERROR) report_error(self, (gnode_t *)subnode, "Invalid call expression.");
+                    if (last_register == REGISTER_ERROR) {
+                        report_error(self, (gnode_t *)subnode, "Invalid call expression.");
+                        return;
+                    }
 					if (dest_is_temp && last_register == dest_register) dest_is_temp = false;
 				}
 				if (dest_is_temp) ircode_register_push(code, dest_register);
@@ -1360,17 +1381,26 @@ static void visit_postfix_expr (gvisitor_t *self, gnode_postfix_expr_t *node) {
 			uint32_t index_register = ircode_register_push_temp(code);
 			ircode_add(code, LOADK, index_register, index, 0);
 			uint32_t temp = ircode_register_pop(code);
-			if (temp == REGISTER_ERROR) report_error(self, (gnode_t *)expr, "Invalid access expression.");
+            if (temp == REGISTER_ERROR) {
+                report_error(self, (gnode_t *)expr, "Invalid access expression.");
+                return;
+            }
 			
 			// generate LOAD/STORE instruction
 			dest_register = (is_real_assigment) ? ircode_register_pop(code) : ircode_register_push_temp(code);
-			if (dest_register == REGISTER_ERROR) report_error(self, (gnode_t *)expr, "Invalid access expression.");
+            if (dest_register == REGISTER_ERROR) {
+                report_error(self, (gnode_t *)expr, "Invalid access expression.");
+                return;
+            }
 			
 			if (is_super) ircode_add(code, LOADS, dest_register, target_register, index_register);
 			else ircode_add(code, (is_real_assigment) ? STORE : LOAD, dest_register, target_register, index_register);
 			if ((!is_real_assigment) && (i+1<count)) {
 				uint32_t rtemp = ircode_register_pop_context_protect(code, true);
-				DEBUG_ASSERT(rtemp != REGISTER_ERROR, "Unexpected register error.");
+                if (rtemp == REGISTER_ERROR) {
+                    report_error(self, (gnode_t *)expr, "Unexpected register error.");
+                    return;
+                }
 			}
 			
 			// update self list (if latest instruction)
@@ -1386,15 +1416,24 @@ static void visit_postfix_expr (gvisitor_t *self, gnode_postfix_expr_t *node) {
 			visit(subnode->expr);
 			ircode_pragma(code, PRAGMA_MOVE_OPTIMIZATION, 0);
 			uint32_t index = ircode_register_pop(code);
-			if (index == REGISTER_ERROR) report_error(self, (gnode_t *)subnode->expr, "Invalid subscript expression.");
+            if (index == REGISTER_ERROR) {
+                report_error(self, (gnode_t *)subnode->expr, "Invalid subscript expression.");
+                return;
+            }
 			
 			// generate LOADAT/STOREAT instruction
 			dest_register = (is_real_assigment) ? ircode_register_pop(code) : ircode_register_push_temp(code);
-			if (dest_register == REGISTER_ERROR) report_error(self, (gnode_t *)subnode->expr, "Invalid subscript expression.");
+            if (dest_register == REGISTER_ERROR) {
+                report_error(self, (gnode_t *)subnode->expr, "Invalid subscript expression.");
+                return;
+            }
 			ircode_add(code, (is_assignment) ? STOREAT : LOADAT, dest_register, target_register, index);
 			if ((!is_real_assigment) && (i+1<count)) {
 				uint32_t rtemp = ircode_register_pop_context_protect(code, true);
-				DEBUG_ASSERT(rtemp != REGISTER_ERROR, "Unexpected register error.");
+                if (rtemp == REGISTER_ERROR) {
+                    report_error(self, (gnode_t *)subnode->expr, "Unexpected register error.");
+                    return;
+                }
 			}
 		}
 		

+ 1 - 0
src/runtime/gravity_core.c

@@ -923,6 +923,7 @@ static bool map_loadat (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, u
 	#pragma unused(vm, nargs)
 	gravity_map_t *map = VALUE_AS_MAP(GET_VALUE(0));
 	gravity_value_t key = GET_VALUE(1);
+	if (VALUE_ISA_NOTVALID(key)) RETURN_ERROR("Invalid map key.");
 	
 	gravity_value_t *value = gravity_hash_lookup(map->hash, key);
 	RETURN_VALUE((value) ? *value : VALUE_FROM_NULL, rindex);

BIN
test/fuzzy/2017-05-04/.DS_Store.gravity


+ 11 - 0
test/fuzzy/2017-05-04/id:000000,sig:11,src:001099,op:havoc,rep:2.gravity

@@ -0,0 +1,11 @@
+#unittest {
+	name: "Map)";
+	result: 60;
+};
+
+func main() {
+	var sum =self	var map = ["Ma":20, "Chiara":30]0
+	for (var key in map.keys()) { 		key && map[sum];
+	}
+	return sum;
+}

+ 18 - 0
test/fuzzy/2017-05-04/id:000001,sig:11,src:000039,op:arith8,pos:214,val:+29.gravity

@@ -0,0 +1,18 @@
+#unittest {
+	name: "_argn expression.";
+	error: NONE;
+	result: 640;
+};
+
+func sum() {
+	var tot = 0;
+	_args.loop(func (value) {tot +=value});
+	return tot;
+}
+
+func main() {
+	var a = 10;
+	var b = 20;
+	return sum(a, b, ~
+(a=b+9)(b-a), a, a*b)
+}

+ 12 - 0
test/fuzzy/2017-05-04/id:000001,sig:11,src:001094,op:havoc,rep:2.gravity

@@ -0,0 +1,12 @@
+#unittest {
+	name: "Map ";
+	result: 60;
+};
+
+func main() {
+	var sum =self	var map = ["MOrcï":10Andrea":20, "Chiara":30];
+	for (var key in map.keys()) {
+		key && map[sum]6
+	}
+	return sum;
+}

+ 11 - 0
test/fuzzy/2017-05-04/id:000001,sig:11,src:001099,op:havoc,rep:2.gravity

@@ -0,0 +1,11 @@
+#unittest {
+	name: "Map ";
+	result: 60;
+};
+
+func main() {
+	var sum =self	var map = ["Maèo":10,hiara":30]0
+	for (var key in map.keys()) { 		key && map[sum];
+	}
+	return sum;
+}

+ 16 - 0
test/fuzzy/2017-05-04/id:000002,sig:06,src:003564,op:havoc,rep:2.gravity

@@ -0,0 +1,16 @@
+#unittest {
+	name: "_argn expression.";
+	error: NONE;
+	result: 640;
+};
+
+func sum() {
+	var tot = 0;
+	_args.loop(func (value) {tot +=value});
+	return tot;
+}
+
+func main() {
+	var a = 10;
+	var b = 20;9	return sum(a< b, a*(a=b+9)(b-a), a, a*b)
+}

+ 17 - 0
test/fuzzy/2017-05-04/id:000002,sig:11,src:000039,op:arith8,pos:215,val:+34.gravity

@@ -0,0 +1,17 @@
+#unittest {
+	name: "_argn expression.";
+	error: NONE;
+	result: 640;
+};
+
+func sum() {
+	var tot = 0;
+	_args.loop(func (value) {tot +=value});
+	return tot;
+}
+
+func main() {
+	var a = 10;
+	var b = 20;
+	return sum(a, b, a,(a=b+9)(b-a), a, a*b)
+}

+ 17 - 0
test/fuzzy/2017-05-04/id:000003,sig:06,src:003583,op:havoc,rep:2.gravity

@@ -0,0 +1,17 @@
+#unittest {
+	name: "_argn efpression.";
+	error: NONE;
+	result: 640;
+};
+
+func sum() {
+	var tot = 0;
+	_args.loop(func (value) {tot +=value});
+	return tot;
+}
+
+func main() {
+	var a   10;
+	var b =self
+	return sum(a, b, a*(a=b+9)(b-a), a, a*b)
+}

+ 12 - 0
test/fuzzy/2017-05-04/id:000004,sig:11,src:001036,op:flip2,pos:95.gravity

@@ -0,0 +1,12 @@
+#unittest {
+	name: "Map ";
+	result: 60;
+};
+
+func main() {
+	var sum =self	var map = ["MOrco":10,-"Andrea":20, "Chiara":30];
+	for (var key in map.keys()) {
+		key && map[sum]6
+	}
+	return sum;
+}

+ 12 - 0
test/fuzzy/2017-05-04/id:000005,sig:11,src:001036,op:flip4,pos:95.gravity

@@ -0,0 +1,12 @@
+#unittest {
+	name: "Map ";
+	result: 60;
+};
+
+func main() {
+	var sum =self	var map = ["MOrco":10,"âAndrea":20, "Chiara":30];
+	for (var key in map.keys()) {
+		key && map[sum]6
+	}
+	return sum;
+}

+ 12 - 0
test/fuzzy/2017-05-04/id:000006,sig:11,src:001036,op:arith8,pos:95,val:+10.gravity

@@ -0,0 +1,12 @@
+#unittest {
+	name: "Map ";
+	result: 60;
+};
+
+func main() {
+	var sum =self	var map = ["MOrco":10,+"Andrea":20, "Chiara":30];
+	for (var key in map.keys()) {
+		key && map[sum]6
+	}
+	return sum;
+}

+ 12 - 0
test/fuzzy/2017-05-04/id:000007,sig:11,src:001036,op:arith8,pos:95,val:-20.gravity

@@ -0,0 +1,12 @@
+#unittest {
+	name: "Map ";
+	result: 60;
+};
+
+func main() {
+	var sum =self	var map = ["MOrco":10,
"Andrea":20, "Chiara":30];
+	for (var key in map.keys()) {
+		key && map[sum]6
+	}
+	return sum;
+}

+ 17 - 0
test/fuzzy/2017-05-04/id:000008,sig:06,src:001405,op:flip1,pos:177.gravity

@@ -0,0 +1,17 @@
+#unittest {
+	name: "_argn expression.";
+	error: NONE;
+	result: 640;
+};
+
+func sum() {
+	var tot = 0;
+	_args.loop(func (value) {tot +=value});
+	return tot;
+}
+
+func main() {
+	var a - 10;
+	var b = 20;
+	return sum(a, b, a*(a=b+9)(b-a), a, a*b)
+}

+ 17 - 0
test/fuzzy/2017-05-04/id:000009,sig:06,src:001405,op:flip1,pos:177.gravity

@@ -0,0 +1,17 @@
+#unittest {
+	name: "_argn expression.";
+	error: NONE;
+	result: 640;
+};
+
+func sum() {
+	var tot = 0;
+	_args.loop(func (value) {tot +=value});
+	return tot;
+}
+
+func main() {
+	var a 5 10;
+	var b = 20;
+	return sum(a, b, a*(a=b+9)(b-a), a, a*b)
+}

+ 17 - 0
test/fuzzy/2017-05-04/id:000010,sig:06,src:001405,op:arith8,pos:177,val:-28.gravity

@@ -0,0 +1,17 @@
+#unittest {
+	name: "_argn expression.";
+	error: NONE;
+	result: 640;
+};
+
+func sum() {
+	var tot = 0;
+	_args.loop(func (value) {tot +=value});
+	return tot;
+}
+
+func main() {
+	var a ! 10;
+	var b = 20;
+	return sum(a, b, a*(a=b+9)(b-a), a, a*b)
+}

+ 17 - 0
test/fuzzy/2017-05-04/id:000011,sig:06,src:001405,op:ext_AO,pos:177.gravity

@@ -0,0 +1,17 @@
+#unittest {
+	name: "_argn expression.";
+	error: NONE;
+	result: 640;
+};
+
+func sum() {
+	var tot = 0;
+	_args.loop(func (value) {tot +=value});
+	return tot;
+}
+
+func main() {
+	var a null;
+	var b = 20;
+	return sum(a, b, a*(a=b+9)(b-a), a, a*b)
+}

+ 17 - 0
test/fuzzy/2017-05-04/id:000012,sig:06,src:001405,op:ext_AO,pos:190.gravity

@@ -0,0 +1,17 @@
+#unittest {
+	name: "_argn expression.";
+	error: NONE;
+	result: 640;
+};
+
+func sum() {
+	var tot = 0;
+	_args.loop(func (value) {tot +=value});
+	return tot;
+}
+
+func main() {
+	var a = 10;
+	var b null;
+	return sum(a, b, a*(a=b+9)(b-a), a, a*b)
+}

+ 12 - 0
test/fuzzy/2017-05-04/id:000013,sig:11,src:002525,op:ext_AO,pos:68.gravity

@@ -0,0 +1,12 @@
+#unittest {
+	name: "Map ";
+	result: 60;
+};
+
+func main() {
+	var sum =self	var map = ["":30];
+	for (var key in map.keys()) {
+		sum &= map[sum];
+	}
+	return sum;
+}