Browse Source

[eval] use some partials instead of closures

Gives better profiling information
Simon Krajewski 7 years ago
parent
commit
e408b35540
2 changed files with 30 additions and 31 deletions
  1. 25 26
      src/macro/eval/evalEmitter.ml
  2. 5 5
      src/macro/eval/evalJit.ml

+ 25 - 26
src/macro/eval/evalEmitter.ml

@@ -173,8 +173,7 @@ let emit_try exec catches env =
 
 (* Control flow *)
 
-let emit_block execs env =
-	let l = Array.length execs in
+let emit_block execs l env =
 	for i = 0 to l - 2 do
 		ignore((Array.unsafe_get execs i) env)
 	done;
@@ -638,20 +637,15 @@ let handle_capture_arguments exec varaccs env =
 	) varaccs;
 	exec env
 
-let run_function ctx exec env =
-	let v = try
+let run_function exec env =
+	try
 		exec env
 	with
 		| Return v -> v
-	in
-	pop_environment ctx env;
-	v
 [@@inline]
 
-let run_function_noret ctx exec env =
-	let v = exec env in
-	pop_environment ctx env;
-	v
+let run_function_noret exec env =
+	exec env
 [@@inline]
 
 let get_normal_env ctx info num_locals num_captures _ =
@@ -662,23 +656,28 @@ let get_closure_env ctx info num_locals num_captures refs =
 	Array.iteri (fun i vr -> env.env_captures.(i) <- vr) refs;
 	env
 
-let create_function ctx num_args get_env hasret refs exec =
-	if hasret || ctx.debug.support_debugger then (fun vl ->
-		let env = get_env refs in
-		List.iteri (fun i v ->
+let execute_set_local env i v =
 			env.env_locals.(i) <- v
-		) vl;
-		run_function ctx exec env
-	)
-	else (fun vl ->
+
+let emit_function_ret ctx get_env refs exec vl =
 		let env = get_env refs in
-		List.iteri (fun i v ->
-			env.env_locals.(i) <- v
-		) vl;
-		run_function_noret ctx exec env
-	)
+	List.iteri (execute_set_local env) vl;
+	let v = run_function exec env in
+	pop_environment ctx env;
+	v
+
+let emit_function_noret ctx get_env refs exec vl =
+	let env = get_env refs in
+	List.iteri (execute_set_local env) vl;
+	let v = run_function_noret exec env in
+	pop_environment ctx env;
+	v
+
+let create_function ctx get_env hasret refs exec =
+	if hasret || ctx.debug.support_debugger then (emit_function_ret ctx get_env refs exec)
+	else (emit_function_noret ctx get_env refs exec)
 
-let emit_closure ctx num_captures num_args get_env hasret exec env =
+let emit_closure ctx num_captures get_env hasret exec env =
 	let refs = Array.sub env.env_captures 0 num_captures in
-	let f = create_function ctx num_args get_env hasret refs exec in
+	let f = create_function ctx get_env hasret refs exec in
 	vstatic_function f

+ 5 - 5
src/macro/eval/evalJit.ml

@@ -201,8 +201,7 @@ and jit_expr jit return e =
 		let num_captures = Hashtbl.length jit.captures in
 		let hasret = jit_closure.has_nonfinal_return in
 		let get_env = get_env jit_closure false (file_hash tf.tf_expr.epos.pfile) (EKLocalFunction jit.num_closures) in
-		let num_args = List.length tf.tf_args in
-		emit_closure ctx num_captures num_args get_env hasret exec
+		emit_closure ctx num_captures get_env hasret exec
 	(* branching *)
 	| TIf(e1,e2,eo) ->
 		let exec_cond = jit_expr jit false e1 in
@@ -264,7 +263,9 @@ and jit_expr jit return e =
 		let execs = List.map (jit_expr jit false) el in
 		let exec1 = jit_expr jit return e1 in
 		pop_scope jit;
-		emit_block (Array.of_list (execs @ [exec1]))
+		let execs = (Array.of_list (execs @ [exec1])) in
+		let l = Array.length execs in
+		emit_block execs l
 	| TReturn None ->
 		if return then emit_null
 		else begin
@@ -565,8 +566,7 @@ let jit_tfunction ctx key_type key_field tf static pos =
 	(* Create the [vfunc] instance depending on the number of arguments. *)
 	let hasret = jit.has_nonfinal_return in
 	let get_env = get_env jit static (file_hash tf.tf_expr.epos.pfile) (EKMethod(key_type,key_field)) in
-	let num_args = List.length tf.tf_args + (if not static then 1 else 0) in
-	let f = create_function ctx num_args get_env hasret empty_array exec in
+	let f = create_function ctx get_env hasret empty_array exec in
 	t();
 	f