Browse Source

[eval] bring back String optimization

Simon Krajewski 5 years ago
parent
commit
03399ed1d4
3 changed files with 11 additions and 1 deletions
  1. 5 0
      src/macro/eval/evalEmitter.ml
  2. 5 0
      src/macro/eval/evalJit.ml
  3. 1 1
      std/StringTools.hx

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

@@ -441,6 +441,11 @@ let emit_string_cca exec1 exec2 p env =
 	if index < 0 || index >= s.slength then vnull
 	if index < 0 || index >= s.slength then vnull
 	else vint (EvalString.char_at s index)
 	else vint (EvalString.char_at s index)
 
 
+let emit_string_cca_unsafe exec1 exec2 p env =
+	let s = decode_vstring (exec1 env) in
+	let index = decode_int_p (exec2 env) p in
+	vint (EvalString.char_at s index)
+
 (* Write *)
 (* Write *)
 
 
 let emit_bytes_length_write exec1 exec2 env =
 let emit_bytes_length_write exec1 exec2 env =

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

@@ -441,6 +441,11 @@ and jit_expr jit return e =
 						| [exec1;exec2] -> emit_string_cca exec1 exec2 e.epos
 						| [exec1;exec2] -> emit_string_cca exec1 exec2 e.epos
 						| _ -> die "" __LOC__
 						| _ -> die "" __LOC__
 					end
 					end
+				| FStatic({cl_path=[],"StringTools"},{cf_name="unsafeCodeAt"}) ->
+					begin match execs with
+						| [exec1;exec2] -> emit_string_cca_unsafe exec1 exec2 e.epos
+						| _ -> die "" __LOC__
+					end
 				| FEnum({e_path=path},ef) ->
 				| FEnum({e_path=path},ef) ->
 					let key = path_hash path in
 					let key = path_hash path in
 					let pos = Some e.epos in
 					let pos = Some e.epos in

+ 1 - 1
std/StringTools.hx

@@ -504,7 +504,7 @@ class StringTools {
 		This operation is not guaranteed to work if `s` contains the `\0`
 		This operation is not guaranteed to work if `s` contains the `\0`
 		character.
 		character.
 	**/
 	**/
-	public static inline function unsafeCodeAt(s:String, index:Int):Int {
+	public static #if !eval inline #end function unsafeCodeAt(s:String, index:Int):Int {
 		#if neko
 		#if neko
 		return untyped __dollar__sget(s.__s, index);
 		return untyped __dollar__sget(s.__s, index);
 		#elseif cpp
 		#elseif cpp