- if cname == "Int" then
- if pname == "output" then
- v.add("printf(\"%ld\\n\", {arguments.first});")
- return
- else if pname == "object_id" then
- v.ret(arguments.first)
- return
- else if pname == "+" then
- v.ret(v.new_expr("{arguments[0]} + {arguments[1]}", ret.as(not null)))
- return
- else if pname == "-" then
- v.ret(v.new_expr("{arguments[0]} - {arguments[1]}", ret.as(not null)))
- return
- else if pname == "unary -" then
- v.ret(v.new_expr("-{arguments[0]}", ret.as(not null)))
- return
- else if pname == "succ" then
- v.ret(v.new_expr("{arguments[0]}+1", ret.as(not null)))
- return
- else if pname == "prec" then
- v.ret(v.new_expr("{arguments[0]}-1", ret.as(not null)))
- return
- else if pname == "*" then
- v.ret(v.new_expr("{arguments[0]} * {arguments[1]}", ret.as(not null)))
- return
- else if pname == "/" then
- v.ret(v.new_expr("{arguments[0]} / {arguments[1]}", ret.as(not null)))
- return
- else if pname == "%" then
- v.ret(v.new_expr("{arguments[0]} % {arguments[1]}", ret.as(not null)))
- return
- else if pname == "lshift" then
- v.ret(v.new_expr("{arguments[0]} << {arguments[1]}", ret.as(not null)))
- return
- else if pname == "rshift" then
- v.ret(v.new_expr("{arguments[0]} >> {arguments[1]}", ret.as(not null)))
- return
- else if pname == "==" then
- v.ret(v.equal_test(arguments[0], arguments[1]))
- return
- else if pname == "!=" then
- var res = v.equal_test(arguments[0], arguments[1])
- v.ret(v.new_expr("!{res}", ret.as(not null)))
- return
- else if pname == "<" then
- v.ret(v.new_expr("{arguments[0]} < {arguments[1]}", ret.as(not null)))
- return
- else if pname == ">" then
- v.ret(v.new_expr("{arguments[0]} > {arguments[1]}", ret.as(not null)))
- return
- else if pname == "<=" then
- v.ret(v.new_expr("{arguments[0]} <= {arguments[1]}", ret.as(not null)))
- return
- else if pname == ">=" then
- v.ret(v.new_expr("{arguments[0]} >= {arguments[1]}", ret.as(not null)))
- return
- else if pname == "to_f" then
- v.ret(v.new_expr("(double){arguments[0]}", ret.as(not null)))
- return
- else if pname == "ascii" then
- v.ret(v.new_expr("{arguments[0]}", ret.as(not null)))
- return
- end
- else if cname == "Char" then
- if pname == "output" then
- v.add("printf(\"%c\", {arguments.first});")
- return
- else if pname == "object_id" then
- v.ret(arguments.first)
- return
- else if pname == "==" then
- v.ret(v.equal_test(arguments[0], arguments[1]))
- return
- else if pname == "!=" then
- var res = v.equal_test(arguments[0], arguments[1])
- v.ret(v.new_expr("!{res}", ret.as(not null)))
- return
- else if pname == "succ" then
- v.ret(v.new_expr("{arguments[0]}+1", ret.as(not null)))
- return
- else if pname == "prec" then
- v.ret(v.new_expr("{arguments[0]}-1", ret.as(not null)))
- return
- else if pname == "<" then
- v.ret(v.new_expr("{arguments[0]} < {arguments[1]}", ret.as(not null)))
- return
- else if pname == ">" then
- v.ret(v.new_expr("{arguments[0]} > {arguments[1]}", ret.as(not null)))
- return
- else if pname == "<=" then
- v.ret(v.new_expr("{arguments[0]} <= {arguments[1]}", ret.as(not null)))
- return
- else if pname == ">=" then
- v.ret(v.new_expr("{arguments[0]} >= {arguments[1]}", ret.as(not null)))
- return
- else if pname == "to_i" then
- v.ret(v.new_expr("{arguments[0]}-'0'", ret.as(not null)))
- return
- else if pname == "ascii" then
- v.ret(v.new_expr("(unsigned char){arguments[0]}", ret.as(not null)))
- return
- end
- else if cname == "Bool" then
- if pname == "output" then
- v.add("printf({arguments.first}?\"true\\n\":\"false\\n\");")
- return
- else if pname == "object_id" then
- v.ret(arguments.first)
- return
- else if pname == "==" then
- v.ret(v.equal_test(arguments[0], arguments[1]))
- return
- else if pname == "!=" then
- var res = v.equal_test(arguments[0], arguments[1])
- v.ret(v.new_expr("!{res}", ret.as(not null)))
- return
- end
- else if cname == "Float" then
- if pname == "output" then
- v.add("printf(\"%f\\n\", {arguments.first});")
- return
- else if pname == "object_id" then
- v.ret(v.new_expr("(double){arguments.first}", ret.as(not null)))
- return
- else if pname == "+" then
- v.ret(v.new_expr("{arguments[0]} + {arguments[1]}", ret.as(not null)))
- return
- else if pname == "-" then
- v.ret(v.new_expr("{arguments[0]} - {arguments[1]}", ret.as(not null)))
- return
- else if pname == "unary -" then
- v.ret(v.new_expr("-{arguments[0]}", ret.as(not null)))
- return
- else if pname == "succ" then
- v.ret(v.new_expr("{arguments[0]}+1", ret.as(not null)))
- return
- else if pname == "prec" then
- v.ret(v.new_expr("{arguments[0]}-1", ret.as(not null)))
- return
- else if pname == "*" then
- v.ret(v.new_expr("{arguments[0]} * {arguments[1]}", ret.as(not null)))
- return
- else if pname == "/" then
- v.ret(v.new_expr("{arguments[0]} / {arguments[1]}", ret.as(not null)))
- return
- else if pname == "==" then
- v.ret(v.equal_test(arguments[0], arguments[1]))
- return
- else if pname == "!=" then
- var res = v.equal_test(arguments[0], arguments[1])
- v.ret(v.new_expr("!{res}", ret.as(not null)))
- return
- else if pname == "<" then
- v.ret(v.new_expr("{arguments[0]} < {arguments[1]}", ret.as(not null)))
- return
- else if pname == ">" then
- v.ret(v.new_expr("{arguments[0]} > {arguments[1]}", ret.as(not null)))
- return
- else if pname == "<=" then
- v.ret(v.new_expr("{arguments[0]} <= {arguments[1]}", ret.as(not null)))
- return
- else if pname == ">=" then
- v.ret(v.new_expr("{arguments[0]} >= {arguments[1]}", ret.as(not null)))
- return
- else if pname == "to_i" then
- v.ret(v.new_expr("(long){arguments[0]}", ret.as(not null)))
- return
- end
- else if cname == "Char" then
- if pname == "output" then
- v.add("printf(\"%c\", {arguments.first});")
- return
- else if pname == "object_id" then
- v.ret(arguments.first)
- return
- else if pname == "==" then
- v.ret(v.equal_test(arguments[0], arguments[1]))
- return
- else if pname == "!=" then
- var res = v.equal_test(arguments[0], arguments[1])
- v.ret(v.new_expr("!{res}", ret.as(not null)))
- return
- else if pname == "ascii" then
- v.ret(v.new_expr("{arguments[0]}", ret.as(not null)))
- return
- end
- else if cname == "NativeString" then
- if pname == "[]" then
- v.ret(v.new_expr("{arguments[0]}[{arguments[1]}]", ret.as(not null)))
- return
- else if pname == "[]=" then
- v.add("{arguments[0]}[{arguments[1]}]={arguments[2]};")
- return
- else if pname == "copy_to" then
- v.add("memcpy({arguments[1]}+{arguments[4]},{arguments[0]}+{arguments[3]},{arguments[2]});")
- return
- else if pname == "atoi" then
- v.ret(v.new_expr("atoi({arguments[0]});", ret.as(not null)))
- return
- end
- else if cname == "NativeArray" then
- var elttype = arguments.first.mtype
- if pname == "[]" then
- v.ret(v.new_expr("{arguments[0]}[{arguments[1]}]", ret.as(not null)))
- return
- else if pname == "[]=" then
- v.add("{arguments[0]}[{arguments[1]}]={arguments[2]};")
- return
- else if pname == "copy_to" then
- v.add("memcpy({arguments[1]},{arguments[0]},{arguments[2]}*sizeof({elttype.ctype}));")
- return
- end
- end
- if pname == "exit" then
- v.add("exit({arguments[1]});")
- return
- else if pname == "sys" then
- v.ret(v.new_expr("glob_sys", ret.as(not null)))
- return
- else if pname == "calloc_string" then
- v.ret(v.new_expr("(char*)GC_MALLOC({arguments[1]})", ret.as(not null)))
- return
- else if pname == "calloc_array" then
- var elttype = arguments.first.mtype.supertype_to(v.compiler.mainmodule,arguments.first.mtype.as(MClassType),v.get_class("ArrayCapable")).as(MGenericType).arguments.first
- v.ret(v.new_expr("({elttype.ctype}*)GC_MALLOC({arguments[1]} * sizeof({elttype.ctype}))", ret.as(not null)))
- return
- else if pname == "object_id" then
- v.ret(v.new_expr("(long){arguments.first}", ret.as(not null)))
- return
- else if pname == "is_same_type" then
- if arguments[0].mtype.ctype == "val*" then
- v.ret(v.new_expr("{arguments[0]}->classid == {arguments[1]}->classid", ret.as(not null)))
- else
- v.ret(v.new_expr("{v.compiler.classid(arguments[0].mtype.as(MClassType))} == {arguments[1]}->classid", ret.as(not null)))
- end
- return
- else if pname == "output_class_name" then
- if arguments[0].mtype.ctype == "val*" then
- v.add("printf(\"%s\\n\", class_names[{arguments.first}->classid]);")
- else
- v.add("printf(\"%s\\n\", class_names[{v.compiler.classid(arguments.first.mtype.as(MClassType))}]);")
- end
- return
- else if pname == "native_class_name" then
- if arguments[0].mtype.ctype == "val*" then
- v.ret(v.new_expr("(char*)(void*)class_names[{arguments.first}->classid]", ret.as(not null)))
- else
- v.ret(v.new_expr("(char*)(void*)class_names[{v.compiler.classid(arguments.first.mtype.as(MClassType))}]", ret.as(not null)))