Browse Source

added ++ / -- support for Dynamic, fix postfix float ++/-- evaluating to 1. instead of preincr value (close #6241)

Nicolas Cannasse 7 years ago
parent
commit
34fa1316a7
1 changed files with 17 additions and 0 deletions
  1. 17 0
      src/generators/genhl.ml

+ 17 - 0
src/generators/genhl.ml

@@ -2408,6 +2408,21 @@ and eval_expr ctx e =
 				op ctx (OSafeCast (tmp,r));
 				op ctx (OSafeCast (tmp,r));
 				unop tmp;
 				unop tmp;
 				op ctx (OToDyn (r,tmp));
 				op ctx (OToDyn (r,tmp));
+			| HDyn when uop = Increment ->
+				hold ctx r;
+				let tmp = alloc_tmp ctx HDyn in
+				free ctx r;
+				op ctx (OToDyn (tmp, reg_int ctx 1));
+				op ctx (OCall2 (r,alloc_fun_path ctx ([],"Std") "__add__",r,tmp))
+			| HDyn when uop = Decrement ->
+				let r2 = alloc_tmp ctx HF64 in
+				hold ctx r2;
+				let tmp = alloc_tmp ctx HF64 in
+				free ctx r2;
+				op ctx (OSafeCast (r2, r));
+				op ctx (OFloat (tmp, alloc_float ctx 1.));
+				op ctx (OSub (r2, r2, tmp));
+				op ctx (OSafeCast (r, r2));
 			| _ ->
 			| _ ->
 				assert false
 				assert false
 		in
 		in
@@ -2417,8 +2432,10 @@ and eval_expr ctx e =
 			r
 			r
 		| ALocal (v,r), Postfix ->
 		| ALocal (v,r), Postfix ->
 			let r2 = alloc_tmp ctx (rtype ctx r) in
 			let r2 = alloc_tmp ctx (rtype ctx r) in
+			hold ctx r2;
 			op ctx (OMov (r2,r));
 			op ctx (OMov (r2,r));
 			unop r;
 			unop r;
+			free ctx r2;
 			r2
 			r2
 		| acc, _ ->
 		| acc, _ ->
 			let ret = ref 0 in
 			let ret = ref 0 in