X-Git-Url: http://nitlanguage.org diff --git a/src/compiler/abstract_compiler.nit b/src/compiler/abstract_compiler.nit index f310fe2..9602fa7 100644 --- a/src/compiler/abstract_compiler.nit +++ b/src/compiler/abstract_compiler.nit @@ -1149,25 +1149,41 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref ) { fun finalize_ffi_for_module(mmodule: MModule) do mmodule.finalize_ffi(self) end -# A file unit (may be more than one file if -# A file unit aim to be autonomous and is made or one or more `CodeWriter`s +# C code file generated from the `writers` and the `required_declarations` +# +# A file unit aims to be autonomous and is made or one or more `CodeWriter`s. class CodeFile + # Basename of the file, will be appended by `.h` and `.c` var name: String + + # `CodeWriter` used in sequence to fill the top of the body, then the bottom var writers = new Array[CodeWriter] + + # Required declarations keys + # + # See: `provide_declaration` var required_declarations = new HashSet[String] end -# Where to store generated lines +# Store generated lines +# +# Instances are added to `file.writers` at construction. class CodeWriter + # Parent `CodeFile` var file: CodeFile + + # Main lines of code (written at the bottom of the body) var lines = new Array[String] + + # Lines of code for declarations (written at the top of the body) var decl_lines = new Array[String] - # Add a line in the main part of the generated C + # Add a line in the main lines of code (to `lines`) fun add(s: String) do self.lines.add(s) - # Add a line in the - # (used for local or global declaration) + # Add a declaration line (to `decl_lines`) + # + # Used for local and global declaration. fun add_decl(s: String) do self.decl_lines.add(s) init @@ -1475,7 +1491,7 @@ abstract class AbstractCompilerVisitor end # Return a "const char*" variable associated to the classname of the dynamic type of an object - # NOTE: we do not return a `RuntimeVariable` "NativeString" as the class may not exist in the module/program + # NOTE: we do not return a `RuntimeVariable` "CString" as the class may not exist in the module/program fun class_name_string(value: RuntimeVariable): String is abstract # Variables handling @@ -1668,8 +1684,8 @@ abstract class AbstractCompilerVisitor return res end - # Generates a NativeString instance fully escaped in C-style \xHH fashion - fun native_string_instance(ns: NativeString, len: Int): RuntimeVariable do + # Generates a CString instance fully escaped in C-style \xHH fashion + fun native_string_instance(ns: CString, len: Int): RuntimeVariable do var mtype = mmodule.native_string_type var nat = new_var(mtype) var byte_esc = new Buffer.with_cap(len * 4) @@ -2057,7 +2073,7 @@ redef class MClassType return "int32_t" else if mclass.name == "UInt32" then return "uint32_t" - else if mclass.name == "NativeString" then + else if mclass.name == "CString" then return "char*" else if mclass.name == "NativeArray" then return "val*" @@ -2099,7 +2115,7 @@ redef class MClassType return "i32" else if mclass.name == "UInt32" then return "u32" - else if mclass.name == "NativeString" then + else if mclass.name == "CString" then return "str" else if mclass.name == "NativeArray" then #return "{self.arguments.first.ctype}*" @@ -2568,7 +2584,7 @@ redef class AMethPropdef v.ret(v.new_expr("(uint32_t){arguments[0]}", ret.as(not null))) return true end - else if cname == "NativeString" then + else if cname == "CString" then if pname == "[]" then v.ret(v.new_expr("(unsigned char)((int){arguments[0]}[{arguments[1]}])", ret.as(not null))) return true @@ -2592,7 +2608,7 @@ redef class AMethPropdef v.ret(v.new_expr("!{res}", ret.as(not null))) return true else if pname == "new" then - var alloc = v.nit_alloc(arguments[1].to_s, "NativeString") + var alloc = v.nit_alloc(arguments[1].to_s, "CString") v.ret(v.new_expr("(char*){alloc}", ret.as(not null))) return true else if pname == "fetch_4_chars" then