Browse Source

[eval] optimize `this` field access a bit

Simon Krajewski 7 years ago
parent
commit
2b162e6e33
2 changed files with 8 additions and 1 deletions
  1. 4 0
      src/macro/eval/evalEmitter.ml
  2. 4 1
      src/macro/eval/evalJit.ml

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

@@ -323,6 +323,10 @@ let emit_instance_field_read exec i env = match exec env with
 	| VString s -> vint (s.slength)
 	| v -> unexpected_value v "instance"
 
+let emit_this_field_read iv i env = match env.env_locals.(iv) with
+	| VInstance vi -> vi.ifields.(i)
+	| v -> unexpected_value v "instance"
+
 let emit_field_closure exec name env =
 	let v = exec env in
 	dynamic_field v name

+ 4 - 1
src/macro/eval/evalJit.ml

@@ -419,7 +419,10 @@ and jit_expr jit return e =
 			| FInstance(c,_,_) when not c.cl_interface ->
 				let proto = get_instance_prototype ctx (path_hash c.cl_path) e1.epos in
 				let i = get_instance_field_index proto name e1.epos in
-				emit_instance_field_read (jit_expr jit false e1) i
+				begin match e1.eexpr with
+					| TConst TThis -> emit_this_field_read (get_slot jit 0 e.epos) i
+					| _ -> emit_instance_field_read (jit_expr jit false e1) i
+				end
 			| FAnon _ ->
 				begin match follow e1.etype with
 					| TAnon an ->