# Return a new native string initialized with `txt`
fun native_string_instance(txt: String): Instance
do
- var val = new FlatBuffer.from(txt)
- val.add('\0')
+ var instance = native_string_instance_len(txt.bytelen+1)
+ var val = instance.val
+ val[txt.bytelen] = 0u8
+ txt.to_cstring.copy_to(val, txt.bytelen, 0, 0)
+
+ return instance
+ end
+
+ # Return a new native string initialized of `length`
+ fun native_string_instance_len(length: Int): PrimitiveInstance[NativeString]
+ do
+ var val = new NativeString(length)
+
var t = mainmodule.native_string_type
- var instance = new PrimitiveInstance[Buffer](t, val)
+ var instance = new PrimitiveInstance[NativeString](t, val)
init_instance_primitive(instance)
return instance
end
fun string_instance(txt: String): Instance
do
var nat = native_string_instance(txt)
- var res = self.send(self.force_get_primitive_method("to_s_with_length", nat.mtype), [nat, self.int_instance(txt.length)])
+ var res = self.send(self.force_get_primitive_method("to_s_with_length", nat.mtype), [nat, self.int_instance(txt.bytelen)])
assert res != null
return res
end
end
else if cname == "NativeString" then
if pname == "new" then
- return v.native_string_instance("!" * args[1].to_i)
+ return v.native_string_instance_len(args[1].to_i)
end
- var recvval = args.first.val.as(Buffer)
+ var recvval = args.first.val.as(NativeString)
if pname == "[]" then
var arg1 = args[1].to_i
- if arg1 >= recvval.length or arg1 < 0 then
- debug("Illegal access on {recvval} for element {arg1}/{recvval.length}")
- end
- return v.char_instance(recvval.chars[arg1])
+ return v.byte_instance(recvval[arg1])
else if pname == "[]=" then
var arg1 = args[1].to_i
- if arg1 >= recvval.length or arg1 < 0 then
- debug("Illegal access on {recvval} for element {arg1}/{recvval.length}")
- end
- recvval.chars[arg1] = args[2].val.as(Char)
+ recvval[arg1] = args[2].val.as(Byte)
return null
else if pname == "copy_to" then
# sig= copy_to(dest: NativeString, length: Int, from: Int, to: Int)
- var destval = args[1].val.as(FlatBuffer)
+ var destval = args[1].val.as(NativeString)
var lenval = args[2].to_i
var fromval = args[3].to_i
var toval = args[4].to_i
- if fromval < 0 then
- debug("Illegal access on {recvval} for element {fromval}/{recvval.length}")
- end
- if fromval + lenval > recvval.length then
- debug("Illegal access on {recvval} for element {fromval}+{lenval}/{recvval.length}")
- end
- if toval < 0 then
- debug("Illegal access on {destval} for element {toval}/{destval.length}")
- end
- if toval + lenval > destval.length then
- debug("Illegal access on {destval} for element {toval}+{lenval}/{destval.length}")
- end
- recvval.as(FlatBuffer).copy(fromval, lenval, destval, toval)
+ recvval.copy_to(destval, lenval, fromval, toval)
return null
else if pname == "atoi" then
- return v.int_instance(recvval.to_i)
+ return v.int_instance(recvval.atoi)
else if pname == "fast_cstring" then
- var ns = recvval.to_cstring.to_s.substring_from(args[1].to_i)
+ var ns = recvval.to_s.substring_from(args[1].to_i)
return v.native_string_instance(ns)
end
else if pname == "calloc_string" then
- return v.native_string_instance("!" * args[1].to_i)
+ return v.native_string_instance_len(args[1].to_i)
else if cname == "NativeArray" then
if pname == "new" then
var val = new Array[Instance].filled_with(v.null_instance, args[1].to_i)
end
var recvval = args.first.val.as(Array[Instance])
if pname == "[]" then
- if args[1].to_i >= recvval.length or args[1].to_i < 0 then
- debug("Illegal access on {recvval} for element {args[1].to_i}/{recvval.length}")
- end
return recvval[args[1].to_i]
else if pname == "[]=" then
recvval[args[1].to_i] = args[2]
recvval.copy_to(0, args[2].to_i, args[1].val.as(Array[Instance]), 0)
return null
end
- else if cname == "NativeFile" then
- if pname == "native_stdout" then
- var inst = new PrimitiveNativeFile.native_stdout
- var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
- v.init_instance_primitive(instance)
- return instance
- else if pname == "native_stdin" then
- var inst = new PrimitiveNativeFile.native_stdin
- var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
- v.init_instance_primitive(instance)
- return instance
- else if pname == "native_stderr" then
- var inst = new PrimitiveNativeFile.native_stderr
- var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
- v.init_instance_primitive(instance)
- return instance
- else if pname == "io_open_read" then
- var a1 = args[1].val.as(Buffer)
- var inst = new PrimitiveNativeFile.io_open_read(a1.to_s)
- var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
- v.init_instance_primitive(instance)
- return instance
- else if pname == "io_open_write" then
- var a1 = args[1].val.as(Buffer)
- var inst = new PrimitiveNativeFile.io_open_write(a1.to_s)
- var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
- v.init_instance_primitive(instance)
- return instance
- end
- var recvval = args.first.val
- if pname == "io_write" then
- var a1 = args[1].val.as(Buffer)
- return v.int_instance(recvval.as(PrimitiveNativeFile).io_write(a1.to_cstring, args[2].to_i))
- else if pname == "io_read" then
- var a1 = args[1].val.as(Buffer)
- var ns = new NativeString(a1.length)
- var len = recvval.as(PrimitiveNativeFile).io_read(ns, args[2].to_i)
- a1.clear
- a1.append(ns.to_s_with_length(len))
- return v.int_instance(len)
- else if pname == "flush" then
- recvval.as(PrimitiveNativeFile).flush
- return null
- else if pname == "io_close" then
- return v.int_instance(recvval.as(PrimitiveNativeFile).io_close)
- else if pname == "set_buffering_type" then
- return v.int_instance(recvval.as(PrimitiveNativeFile).set_buffering_type(args[1].to_i, args[2].to_i))
- end
else if pname == "native_argc" then
return v.int_instance(v.arguments.length)
else if pname == "native_argv" then
end
end
-redef class AIntExpr
- redef fun expr(v)
- do
- return v.int_instance(self.value.as(not null))
- end
-end
-
-redef class AByteExpr
+redef class AIntegerExpr
redef fun expr(v)
do
- return v.byte_instance(self.value.as(not null))
+ if value isa Int then return v.int_instance(value.as(Int))
+ if value isa Byte then return v.byte_instance(value.as(Byte))
+ return null
end
end