From ce05e8e3503b85a7a19a36fd8097568c6d95b07e Mon Sep 17 00:00:00 2001 From: Jean-Sebastien Gelinas Date: Tue, 11 Aug 2009 14:45:33 -0400 Subject: [PATCH] tools: add entrypoint information to the program Signed-off-by: Jean-Sebastien Gelinas Signed-off-by: Jean Privat --- src/compiling/compiling_global.nit | 16 ++++------------ src/nitc.nit | 1 + src/program.nit | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/compiling/compiling_global.nit b/src/compiling/compiling_global.nit index 66e670b..4e43f9a 100644 --- a/src/compiling/compiling_global.nit +++ b/src/compiling/compiling_global.nit @@ -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 diff --git a/src/nitc.nit b/src/nitc.nit index c0d3133..a3ef6cf 100644 --- a/src/nitc.nit +++ b/src/nitc.nit @@ -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) diff --git a/src/program.nit b/src/program.nit index 6d9b2b6..686ff23 100644 --- a/src/program.nit +++ b/src/program.nit @@ -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 -- 1.7.9.5