# Compile an intern method using Java primitives
fun compile_intern_to_java(v: JavaCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable]): Bool do
var pname = mpropdef.mproperty.name
var cname = mpropdef.mclassdef.mclass.name
var ret = mpropdef.msignature.as(not null).return_mtype
if cname == "Int" then
if pname == "output" then
v.add("System.out.println({arguments[0]});")
v.ret(v.null_instance)
return true
else if pname == "object_id" then
v.ret(arguments.first)
return true
else if pname == "+" then
v.ret(v.new_expr("{arguments[0]} + {arguments[1]}", ret.as(not null)))
return true
else if pname == "-" then
v.ret(v.new_expr("{arguments[0]} - {arguments[1]}", ret.as(not null)))
return true
else if pname == "unary -" then
v.ret(v.new_expr("-{arguments[0]}", ret.as(not null)))
return true
else if pname == "unary +" then
v.ret(arguments[0])
return true
else if pname == "*" then
v.ret(v.new_expr("{arguments[0]} * {arguments[1]}", ret.as(not null)))
return true
else if pname == "/" then
v.ret(v.new_expr("{arguments[0]} / {arguments[1]}", ret.as(not null)))
return true
else if pname == "%" then
v.ret(v.new_expr("{arguments[0]} % {arguments[1]}", ret.as(not null)))
return true
else if pname == "<<" then
v.ret(v.new_expr("{arguments[0]} << {arguments[1]}", ret.as(not null)))
return true
else if pname == ">>" then
v.ret(v.new_expr("{arguments[0]} >> {arguments[1]}", ret.as(not null)))
return true
else if pname == "==" then
v.ret(v.equal_test(arguments[0], arguments[1]))
return true
else if pname == "!=" then
var res = v.equal_test(arguments[0], arguments[1])
v.ret(v.new_expr("!{res}", ret.as(not null)))
return true
else if pname == "<" then
v.ret(v.new_expr("{arguments[0]} < {arguments[1]}", ret.as(not null)))
return true
else if pname == ">" then
v.ret(v.new_expr("{arguments[0]} > {arguments[1]}", ret.as(not null)))
return true
else if pname == "<=" then
v.ret(v.new_expr("{arguments[0]} <= {arguments[1]}", ret.as(not null)))
return true
else if pname == ">=" then
v.ret(v.new_expr("{arguments[0]} >= {arguments[1]}", ret.as(not null)))
return true
else if pname == "to_f" then
v.ret(v.new_expr("(double){arguments[0]}", ret.as(not null)))
return true
else if pname == "to_b" then
v.ret(v.new_expr("(byte){arguments[0]}", ret.as(not null)))
return true
else if pname == "ascii" then
v.ret(v.new_expr("(char){arguments[0]}", ret.as(not null)))
return true
end
else if cname == "Char" then
if pname == "output" then
v.add("System.out.print({arguments[0]});")
v.ret(v.null_instance)
return true
else if pname == "object_id" then
v.ret(v.new_expr("(int){arguments[0]}", ret.as(not null)))
return true
else if pname == "successor" then
v.ret(v.new_expr("(char)({arguments[0]} + {arguments[1]})", ret.as(not null)))
return true
else if pname == "predecessor" then
v.ret(v.new_expr("(char)({arguments[0]} - {arguments[1]})", ret.as(not null)))
return true
else if pname == "==" then
v.ret(v.equal_test(arguments[0], arguments[1]))
return true
else if pname == "!=" then
var res = v.equal_test(arguments[0], arguments[1])
v.ret(v.new_expr("!{res}", ret.as(not null)))
return true
else if pname == "<" then
v.ret(v.new_expr("{arguments[0]} < {arguments[1]}", ret.as(not null)))
return true
else if pname == ">" then
v.ret(v.new_expr("{arguments[0]} > {arguments[1]}", ret.as(not null)))
return true
else if pname == "<=" then
v.ret(v.new_expr("{arguments[0]} <= {arguments[1]}", ret.as(not null)))
return true
else if pname == ">=" then
v.ret(v.new_expr("{arguments[0]} >= {arguments[1]}", ret.as(not null)))
return true
else if pname == "to_i" then
v.ret(v.new_expr("(int){arguments[0]}", ret.as(not null)))
return true
else if pname == "ascii" then
v.ret(v.new_expr("(int){arguments[0]}", ret.as(not null)))
return true
end
else if cname == "Byte" then
if pname == "output" then
v.add("System.out.println({arguments[0]});")
v.ret(v.null_instance)
return true
else if pname == "object_id" then
v.ret(v.new_expr("(int){arguments[0]}", ret.as(not null)))
return true
else if pname == "+" then
v.ret(v.new_expr("(byte)({arguments[0]} + {arguments[1]})", ret.as(not null)))
return true
else if pname == "-" then
v.ret(v.new_expr("(byte)({arguments[0]} - {arguments[1]})", ret.as(not null)))
return true
else if pname == "unary -" then
v.ret(v.new_expr("(byte)(-{arguments[0]})", ret.as(not null)))
return true
else if pname == "unary +" then
v.ret(arguments[0])
return true
else if pname == "*" then
v.ret(v.new_expr("(byte)({arguments[0]} * {arguments[1]})", ret.as(not null)))
return true
else if pname == "/" then
v.ret(v.new_expr("(byte)({arguments[0]} / {arguments[1]})", ret.as(not null)))
return true
else if pname == "%" then
v.ret(v.new_expr("(byte)({arguments[0]} % {arguments[1]})", ret.as(not null)))
return true
else if pname == "<<" then
v.ret(v.new_expr("(byte)({arguments[0]} << {arguments[1]})", ret.as(not null)))
return true
else if pname == ">>" then
v.ret(v.new_expr("(byte)({arguments[0]} >> {arguments[1]})", ret.as(not null)))
return true
else if pname == "==" then
v.ret(v.equal_test(arguments[0], arguments[1]))
return true
else if pname == "!=" then
var res = v.equal_test(arguments[0], arguments[1])
v.ret(v.new_expr("!{res}", ret.as(not null)))
return true
else if pname == "<" then
v.ret(v.new_expr("{arguments[0]} < {arguments[1]}", ret.as(not null)))
return true
else if pname == ">" then
v.ret(v.new_expr("{arguments[0]} > {arguments[1]}", ret.as(not null)))
return true
else if pname == "<=" then
v.ret(v.new_expr("{arguments[0]} <= {arguments[1]}", ret.as(not null)))
return true
else if pname == ">=" then
v.ret(v.new_expr("{arguments[0]} >= {arguments[1]}", ret.as(not null)))
return true
else if pname == "to_i" then
v.ret(v.new_expr("(int){arguments[0]}", ret.as(not null)))
return true
else if pname == "to_f" then
v.ret(v.new_expr("(double){arguments[0]}", ret.as(not null)))
return true
else if pname == "ascii" then
v.ret(v.new_expr("{arguments[0]}", ret.as(not null)))
return true
end
else if cname == "Bool" then
if pname == "output" then
v.add("System.out.println({arguments[0]});")
v.ret(v.null_instance)
return true
else if pname == "object_id" then
v.ret(v.new_expr("{arguments[0]}?1:0", ret.as(not null)))
return true
else if pname == "==" then
v.ret(v.equal_test(arguments[0], arguments[1]))
return true
else if pname == "!=" then
var res = v.equal_test(arguments[0], arguments[1])
v.ret(v.new_expr("!{res}", ret.as(not null)))
return true
end
else if cname == "Float" then
if pname == "output" then
v.add "if({arguments[0]} == Double.POSITIVE_INFINITY) \{"
v.add "System.out.println(\"inf\");"
v.add "\} else if({arguments[0]} == Double.POSITIVE_INFINITY) \{"
v.add "System.out.println(\"-inf\");"
v.add "\} else \{"
var df = v.get_name("df")
v.add "java.text.DecimalFormat {df} = new java.text.DecimalFormat(\"0.000000\");"
v.add "System.out.println({df}.format({arguments[0]}));"
v.add "\}"
v.ret(v.null_instance)
return true
else if pname == "object_id" then
v.ret(v.new_expr("(int){arguments[0]}", ret.as(not null)))
return true
else if pname == "+" then
v.ret(v.new_expr("{arguments[0]} + {arguments[1]}", ret.as(not null)))
return true
else if pname == "-" then
v.ret(v.new_expr("{arguments[0]} - {arguments[1]}", ret.as(not null)))
return true
else if pname == "unary -" then
v.ret(v.new_expr("-{arguments[0]}", ret.as(not null)))
return true
else if pname == "unary +" then
v.ret(arguments[0])
return true
else if pname == "succ" then
v.ret(v.new_expr("{arguments[0]} + 1", ret.as(not null)))
return true
else if pname == "prec" then
v.ret(v.new_expr("{arguments[0]} - 1", ret.as(not null)))
return true
else if pname == "*" then
v.ret(v.new_expr("{arguments[0]} * {arguments[1]}", ret.as(not null)))
return true
else if pname == "/" then
v.ret(v.new_expr("{arguments[0]} / {arguments[1]}", ret.as(not null)))
return true
else if pname == "==" then
v.ret(v.equal_test(arguments[0], arguments[1]))
return true
else if pname == "!=" then
var res = v.equal_test(arguments[0], arguments[1])
v.ret(v.new_expr("!{res}", ret.as(not null)))
return true
else if pname == "<" then
v.ret(v.new_expr("{arguments[0]} < {arguments[1]}", ret.as(not null)))
return true
else if pname == ">" then
v.ret(v.new_expr("{arguments[0]} > {arguments[1]}", ret.as(not null)))
return true
else if pname == "<=" then
v.ret(v.new_expr("{arguments[0]} <= {arguments[1]}", ret.as(not null)))
return true
else if pname == ">=" then
v.ret(v.new_expr("{arguments[0]} >= {arguments[1]}", ret.as(not null)))
return true
else if pname == "to_i" then
v.ret(v.new_expr("(int){arguments[0]}", ret.as(not null)))
return true
else if pname == "to_b" then
v.ret(v.new_expr("(byte){arguments[0]}", ret.as(not null)))
return true
end
end
if pname == "exit" then
v.add("System.exit({arguments[1]});")
v.ret(v.null_instance)
return true
else if pname == "sys" then
# TODO singleton
var main_type = v.compiler.mainmodule.sys_type.as(not null)
var sys = main_type.mclass
v.ret(v.new_expr("new RTVal({sys.rt_name}.get{sys.rt_name}())", main_type))
return true
else if pname == "object_id" then
v.ret(v.new_expr("{arguments[0]}.hashCode()", ret.as(not null)))
return true
else if pname == "is_same_type" then
v.ret(v.is_same_type_test(arguments[0], arguments[1]))
return true
else if pname == "is_same_instance" then
v.ret(v.equal_test(arguments[0], arguments[1]))
return true
else if pname == "output_class_name" then
v.add("System.out.println({arguments[0]}.rtclass.class_name);")
v.ret(v.null_instance)
return true
end
return false
end
src/compiler/java_compiler.nit:1556,2--1837,4