grammar: allows constructors in extern classes
[nit.git] / src / compiling / compiling_icode.nit
index 9c79e8b..754b43f 100644 (file)
@@ -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")
@@ -266,7 +266,7 @@ redef class IRoutine
                else
                        p = cparams.join(", ")
                end
-               if human_name != null then v.add_decl("#define LOCATE_{cname} \"{human_name}\"")
+               if human_name != null then v.add_decl("static const char * const LOCATE_{cname} = \"{human_name}\";")
                v.add_decl("{r} {cname}({p});")
                v.add_decl("typedef {r} (*{cname}_t)({p});")
                v.add_instr("{r} {cname}({p})\{")
@@ -289,7 +289,7 @@ redef class IRoutine
                        v.add_decl("struct \{struct stack_frame_t me;\} fra;")
                end
                v.add_instr("fra.me.prev = stack_frame_head; stack_frame_head = &fra.me;")
-               v.add_instr("fra.me.file = LOCATE_{v.visitor.module.name};")
+               v.add_instr("fra.me.file = LOCATE_{v.visitor.mmmodule.cname};")
                v.add_instr("fra.me.line = {ll};")
                v.add_instr("fra.me.meth = LOCATE_{v.basecname};")
                v.add_instr("fra.me.has_broke = 0;")
@@ -577,16 +577,10 @@ redef class ICall
                var w = new Writer
                var prop = property
                if prop.global.is_init then args.add("init_table")
-               if prop.name == (once ("add".to_symbol)) and prop.local_class.name == (once ("Array".to_symbol)) then
-                       w.add(prop.cname)
-                       w.add("(")
-               else
-                       w.add(prop.global.meth_call)
-                       w.add("(")
-                       w.add(args.first)
-                       w.add(")(")
-               end
-               var first = true
+               w.add(prop.global.meth_call)
+               w.add("(")
+               w.add(args.first)
+               w.add(")(")
                w.add_all(args, ", ")
                w.add(")")
                return w
@@ -630,7 +624,7 @@ redef class IAllocateInstance
                v.add_location(location)
                var w = new_result(v)
                w.add("NEW_")
-               w.add(stype.local_class.name.to_s)
+               w.add(stype.local_class.cname)
                w.add("()")
        end
 end
@@ -641,7 +635,7 @@ redef class ICheckInstance
                v.add_location(location)
                var w = new_result(v)
                w.add("CHECKNEW_")
-               w.add(stype.local_class.name.to_s)
+               w.add(stype.local_class.cname)
                w.add("(")
                w.add(v.register(expr))
                w.add(")")
@@ -654,7 +648,7 @@ redef class IInitAttributes
                v.add_location(location)
                var w = v.new_instr
                w.add("INIT_ATTRIBUTES__")
-               w.add(stype.local_class.name.to_s)
+               w.add(stype.local_class.cname)
                w.add("(")
                w.add(v.register(expr))
                w.add(");\n")
@@ -681,14 +675,15 @@ redef class INative
                v.add_location(location)
                if method.is_intern then
                        compile_intern_method_to_c(v)
-               else
+               else if not method.is_init then
                        compile_extern_method_to_c(v)
                end
        end
 
        fun compile_extern_method_to_c(v: I2CCompilerVisitor)
        do
-               var ename = method.extern_name.as(not null)#"{method.module.name}_{method.local_class.name}_{method.local_class.name}_{method.name}_{method.signature.arity}"
+               var ename = method.extern_name.as(not null)
+
                var sig = method.signature
                assert exprs.length == sig.arity + 1
 
@@ -870,7 +865,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}: \");")
@@ -949,7 +951,7 @@ redef class IAbort
                        w.add("\", NULL")
                end
                w.add(", LOCATE_")
-               w.add(module_location.name.to_s)
+               w.add(module_location.cname)
                var ll = location
                if ll != null then
                        w.add(", ")