tools: add entrypoint information to the program
authorJean-Sebastien Gelinas <calestar@gmail.com>
Tue, 11 Aug 2009 18:45:33 +0000 (14:45 -0400)
committerJean Privat <jean@pryen.org>
Wed, 19 Aug 2009 17:13:40 +0000 (13:13 -0400)
Signed-off-by: Jean-Sebastien Gelinas <calestar@gmail.com>
Signed-off-by: Jean Privat <jean@pryen.org>

src/compiling/compiling_global.nit
src/nitc.nit
src/program.nit

index 66e670b..4e43f9a 100644 (file)
@@ -61,20 +61,12 @@ redef class Program
                v.indent
                v.add_instr("prepare_signals();")
                v.add_instr("glob_argc = argc; glob_argv = argv;")
-               var sysname = once "Sys".to_symbol
-               if not module.has_global_class_named(sysname) then
+               if v.program.main_method == null then
                        print("No main")
                else
-                       var sys = module.class_by_name(sysname)
-                       var name = once "main".to_symbol
-                       if not sys.has_global_property_by_name(name) then
-                               print("No main")
-                       else
-                               var mainm = sys.select_method(name)
-                               v.add_instr("G_sys = NEW_Sys();")
-                               v.add_instr("register_static_object(&G_sys);")
-                               v.add_instr("{mainm.cname}(G_sys);")
-                       end
+                       v.add_instr("G_sys = NEW_Sys();")
+                       v.add_instr("register_static_object(&G_sys);")
+                       v.add_instr("{v.program.main_method.cname}(G_sys);")
                end
                v.add_instr("return 0;")
                v.unindent
index c0d3133..a3ef6cf 100644 (file)
@@ -126,6 +126,7 @@ special AbstractCompiler
                end
                for mod in mods do
                        var p = new Program(mod)
+                       p.compute_main_method
                        p.do_table_computation(self)
                        p.generate_classes_init_to_icode
                        p.compile_prog_to_c(self)
index 6d9b2b6..686ff23 100644 (file)
@@ -25,6 +25,28 @@ class Program
        # This module is the 'main' module, the one where we find the 'main' method
        readable var _module: MMModule
 
+       # This method is the entry point of this program
+       # There might be no entry point (if in fact we are compiling a library)
+       readable var _main_method: nullable MMMethod = null
+
+       # This is the class that contains the main method.
+       # Would be null if there is no main method
+       readable var _main_class: nullable MMLocalClass = null
+
+       fun compute_main_method do
+               # Check for the 'Sys' class
+               var sysname = once "Sys".to_symbol
+               if not module.has_global_class_named(sysname) then return
+               var sys = module.class_by_name(sysname)
+
+               # Check for 'Sys::main' method
+               var entryname = once "main".to_symbol
+               if not sys.has_global_property_by_name(entryname) then return
+
+               _main_method = sys.select_method(entryname)
+               _main_class = sys
+       end
+
        init(m: MMModule) do
                _module = m
        end