X-Git-Url: http://nitlanguage.org diff --git a/src/compiling/compiling_icode.nit b/src/compiling/compiling_icode.nit index a805219..da6e273 100644 --- a/src/compiling/compiling_icode.nit +++ b/src/compiling/compiling_icode.nit @@ -168,7 +168,7 @@ class I2CCompilerVisitor if l != null then visitor.add_indent(w) w.add("/* ") - w.add(l.file) + w.add(l.file.filename) w.add(":") w.add(l.line_start.to_s) w.add(" */\n") @@ -864,7 +864,14 @@ redef class INative s = "NEW_NativeArray(UNTAG_Int({regs[1]}), sizeof(val_t))" else if n == once "calloc_string".to_symbol then s = "BOX_NativeString((char*)raw_alloc((UNTAG_Int({regs[1]}) * sizeof(char))))" + # Add output_class_name native implementation + else if n == once "output_class_name".to_symbol then + s = "printf(\"%s\\n\", VAL2VFT({regs[0]})[2].cname);" + # Add class_name implementation + else if n == once "native_class_name".to_symbol then + s = "BOX_NativeString(VAL2VFT({regs[0]})[2].cname);" end + if s == null then var ll = location if ll != null then v.add_instr("fprintf(stderr, \"{ll.to_s}: \");") @@ -1016,18 +1023,16 @@ redef class ITypeCheck redef fun compile_to_c(v) do if not need_result then return - # FIXME handle formaltypes v.add_location(location) - var g = stype.local_class.global - var recv = v.register(expr) + var recv = v.register(expr2) var w = new_result(v) w.add("TAG_Bool(") - if expr.stype.is_nullable then + if expr2.stype.is_nullable then if stype.is_nullable then w.add("(") w.add(recv) w.add("==NIT_NULL) || ") - else if stype.as_nullable == expr.stype then + else if stype.as_nullable == expr2.stype then w.add(recv) w.add("!=NIT_NULL)") return @@ -1037,15 +1042,38 @@ redef class ITypeCheck w.add("!=NIT_NULL) && ") end end - w.add("VAL_ISA(") - w.add(recv) - w.add(", ") - w.add(g.color_id) - w.add(", ") - w.add(g.id_id) - w.add(")) /*cast ") - w.add(stype.to_s) - w.add("*/") + # FIXME handle formaltypes + var t = stype + if t isa MMVirtualType then + var slf = v.register(expr1) + var g = t.property.global + w.add("VAL_ISA(") + w.add(recv) + w.add(", ") + w.add(g.vt_class_color) + w.add("(") + w.add(slf) + w.add(")") + w.add(", ") + w.add(g.vt_class_id) + w.add("(") + w.add(slf) + w.add(")") + w.add(")) /*cast ") + w.add(t.to_s) + w.add("*/") + else + var g = t.local_class.global + w.add("VAL_ISA(") + w.add(recv) + w.add(", ") + w.add(g.color_id) + w.add(", ") + w.add(g.id_id) + w.add(")) /*cast ") + w.add(t.to_s) + w.add("*/") + end end end