Explorar o código

[eval] bring back String optimization

Simon Krajewski %!s(int64=5) %!d(string=hai) anos
pai
achega
03399ed1d4
Modificáronse 3 ficheiros con 11 adicións e 1 borrados
  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
 	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 *)
 
 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
 						| _ -> die "" __LOC__
 					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) ->
 					let key = path_hash path 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`
 		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
 		return untyped __dollar__sget(s.__s, index);
 		#elseif cpp