From 68c9eb2e1ed39d43d52219f29c1a24ca45b634b9 Mon Sep 17 00:00:00 2001 From: Lucas Bajolet Date: Mon, 28 Dec 2015 23:42:02 -0500 Subject: [PATCH] src: Improve speed of interpreter when working with Strings Signed-off-by: Lucas Bajolet --- lib/core/text/native.nit | 2 +- src/interpreter/naive_interpreter.nit | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/core/text/native.nit b/lib/core/text/native.nit index 1c9e262..051cefb 100644 --- a/lib/core/text/native.nit +++ b/lib/core/text/native.nit @@ -253,7 +253,7 @@ extern class NativeString `{ char* `} end # Number of UTF-8 characters in `self` starting at `from`, for a length of `bytelen` - fun utf8_length(from, bytelen: Int): Int do + fun utf8_length(from, bytelen: Int): Int is intern do var st = from var ln = 0 while bytelen > 0 do diff --git a/src/interpreter/naive_interpreter.nit b/src/interpreter/naive_interpreter.nit index 161ded2..e1ca2df 100644 --- a/src/interpreter/naive_interpreter.nit +++ b/src/interpreter/naive_interpreter.nit @@ -980,6 +980,10 @@ redef class AMethPropdef return v.bool_instance(recvval >= args[1].to_i) else if pname == "<=>" then return v.int_instance(recvval <=> args[1].to_i) + else if pname == "&" then + return v.int_instance(recvval & args[1].to_i) + else if pname == "|" then + return v.int_instance(recvval | args[1].to_i) else if pname == "to_f" then return v.float_instance(recvval.to_f) else if pname == "to_b" then @@ -1028,6 +1032,10 @@ redef class AMethPropdef return v.bool_instance(recvval >= args[1].to_b) else if pname == "<=>" then return v.int_instance(recvval <=> args[1].to_b) + else if pname == "&" then + return v.byte_instance(recvval & args[1].to_b) + else if pname == "|" then + return v.byte_instance(recvval | args[1].to_b) else if pname == "to_f" then return v.float_instance(recvval.to_f) else if pname == "to_i" then @@ -1160,6 +1168,12 @@ redef class AMethPropdef else if pname == "fast_cstring" then var ns = recvval.fast_cstring(args[1].to_i) return v.native_string_instance(ns.to_s) + else if pname == "fetch_4_chars" then + return v.int_instance(args[0].val.as(NativeString).fetch_4_chars(args[1].to_i)) + else if pname == "fetch_4_hchars" then + return v.int_instance(args[0].val.as(NativeString).fetch_4_hchars(args[1].to_i)) + else if pname == "utf8_length" then + return v.int_instance(args[0].val.as(NativeString).utf8_length(args[1].to_i, args[2].to_i)) end else if pname == "calloc_string" then return v.native_string_instance_len(args[1].to_i) -- 1.7.9.5