Răsfoiți Sursa

[eval] change TBlock handling

slightly faster like this
Simon Krajewski 7 ani în urmă
părinte
comite
d5e95b33af
2 a modificat fișierele cu 21 adăugiri și 9 ștergeri
  1. 4 0
      src/macro/eval/evalEmitter.ml
  2. 17 9
      src/macro/eval/evalJit.ml

+ 4 - 0
src/macro/eval/evalEmitter.ml

@@ -182,6 +182,10 @@ let emit_block execs l env =
 let emit_value exec env =
 	exec env
 
+let emit_seq exec1 exec2 env =
+	ignore(exec1 env);
+	exec2 env
+
 let emit_return_null _ = raise (Return vnull)
 
 let emit_return_value exec env = raise (Return (exec env))

+ 17 - 9
src/macro/eval/evalJit.ml

@@ -254,18 +254,26 @@ and jit_expr jit return e =
 	(* control flow *)
 	| TBlock [] ->
 		emit_null
-	| TBlock el ->
-		let e1,el = match List.rev el with
-			| e1 :: el -> e1,List.rev el
-			| [] -> assert false
+	| TBlock [e1] ->
+		jit_expr jit return e1
+	| TBlock (e1 :: el) ->
+		let rec loop f el =
+			match el with
+				| [e] ->
+					let f' = jit_expr jit return e in
+					emit_seq f f'
+				| e1 :: el ->
+					let f' = jit_expr jit false e1 in
+					let f = emit_seq f f' in
+					loop f el
+				| [] ->
+					assert false
 		in
 		push_scope jit e.epos;
-		let execs = List.map (jit_expr jit false) el in
-		let exec1 = jit_expr jit return e1 in
+		let f0 = jit_expr jit false e1 in
+		let f = loop f0 el in
 		pop_scope jit;
-		let execs = (Array.of_list (execs @ [exec1])) in
-		let l = Array.length execs in
-		emit_block execs l
+		f
 	| TReturn None ->
 		if return then emit_null
 		else begin