runtime: inform the dynamic type of self on `Abstract method called`
authorJean Privat <jean@pryen.org>
Tue, 26 Nov 2013 14:09:50 +0000 (09:09 -0500)
committerJean Privat <jean@pryen.org>
Tue, 26 Nov 2013 14:09:50 +0000 (09:09 -0500)
Signed-off-by: Jean Privat <jean@pryen.org>

src/abstract_compiler.nit
src/naive_interpreter.nit
tests/sav/base_abstract_fun_alt1.res

index a0d0148..529f3b9 100644 (file)
@@ -1718,7 +1718,11 @@ redef class AClassdef
 end
 
 redef class ADeferredMethPropdef
-       redef fun compile_to_c(v, mpropdef, arguments) do v.add_abort("Deferred method called")
+       redef fun compile_to_c(v, mpropdef, arguments) do
+               var cn = v.class_name_string(arguments.first)
+               v.add("fprintf(stderr, \"Runtime error: Abstract method `%s` called on `%s`\", \"{mpropdef.mproperty.name.escape_to_c}\", {cn});")
+               v.add_raw_abort
+       end
        redef fun can_inline do return true
 end
 
index 4449f87..28b5d41 100644 (file)
@@ -1033,7 +1033,7 @@ end
 redef class ADeferredMethPropdef
        redef fun call(v, mpropdef, args)
        do
-               fatal(v, "Deferred method called")
+               fatal(v, "Abstract method `{mpropdef.mproperty.name}` called on `{args.first.mtype}`")
                abort
        end
 end
index ec6936c..77290ae 100644 (file)
@@ -1,2 +1,2 @@
-Runtime error: Deferred method called (alt/base_abstract_fun_alt1.nit:18)
+Runtime error: Abstract method `foo` called on `A` (alt/base_abstract_fun_alt1.nit:18)
 1