Property definitions

nitc $ AbstractCompilerVisitor :: native_array_def
	fun native_array_def(pname: String, ret_type: nullable MType, arguments: Array[RuntimeVariable]): Bool do return false
src/compiler/abstract_compiler.nit:1361,2--119

nitc $ SeparateCompilerVisitor :: native_array_def
	redef fun native_array_def(pname, ret_type, arguments)
	do
		var elttype = arguments.first.mtype
		var nclass = mmodule.native_array_class
		var recv = "((struct instance_{nclass.c_name}*){arguments[0]})->values"
		if pname == "[]" then
			# Because the objects are boxed, return the box to avoid unnecessary (or broken) unboxing/reboxing
			var res = self.new_expr("{recv}[{arguments[1]}]", compiler.mainmodule.object_type)
			res.mcasttype = ret_type.as(not null)
			self.ret(res)
			return true
		else if pname == "[]=" then
			self.add("{recv}[{arguments[1]}]={arguments[2]};")
			return true
		else if pname == "length" then
			self.ret(self.new_expr("((struct instance_{nclass.c_name}*){arguments[0]})->length", ret_type.as(not null)))
			return true
		else if pname == "copy_to" then
			var recv1 = "((struct instance_{nclass.c_name}*){arguments[1]})->values"
			self.add("memmove({recv1}, {recv}, {arguments[2]}*sizeof({elttype.ctype}));")
			return true
		else if pname == "memmove" then
			# fun memmove(start: Int, length: Int, dest: NativeArray[E], dest_start: Int) is intern do
			var recv1 = "((struct instance_{nclass.c_name}*){arguments[3]})->values"
			self.add("memmove({recv1}+{arguments[4]}, {recv}+{arguments[1]}, {arguments[2]}*sizeof({elttype.ctype}));")
			return true
		end
		return false
	end
src/compiler/separate_compiler.nit:2187,2--2215,4

nitc $ GlobalCompilerVisitor :: native_array_def
	redef fun native_array_def(pname, ret_type, arguments)
	do
		var elttype = arguments.first.mtype
		var recv = "((struct {arguments[0].mcasttype.c_name}*){arguments[0]})->values"
		if pname == "[]" then
			self.ret(self.new_expr("{recv}[{arguments[1]}]", ret_type.as(not null)))
			return true
		else if pname == "[]=" then
			self.add("{recv}[{arguments[1]}]={arguments[2]};")
			return true
		else if pname == "length" then
			self.ret(self.new_expr("((struct {arguments[0].mcasttype.c_name}*){arguments[0]})->length", ret_type.as(not null)))
			return true
		else if pname == "copy_to" then
			var recv1 = "((struct {arguments[1].mcasttype.c_name}*){arguments[1]})->values"
			self.add("memmove({recv1},{recv},{arguments[2]}*sizeof({elttype.ctype}));")
			return true
		else if pname == "memmove" then
			# fun memmove(start: Int, length: Int, dest: NativeArray[E], dest_start: Int) is intern do
			var recv1 = "((struct {arguments[3].mcasttype.c_name}*){arguments[3]})->values"
			self.add("memmove({recv1}+{arguments[4]}, {recv}+{arguments[1]}, {arguments[2]}*sizeof({elttype.ctype}));")
			return true
		end
		return false
	end
src/compiler/global_compiler.nit:419,2--443,4