X-Git-Url: http://nitlanguage.org diff --git a/src/primitive_info.nit b/src/primitive_info.nit index f597e4b..44bf63a 100644 --- a/src/primitive_info.nit +++ b/src/primitive_info.nit @@ -17,7 +17,7 @@ # Common things for NIT compilation and C generation package primitive_info -#FIXME Split this package into 2: one in metamodel and one in compiling +#FIXME Split this module into 2: one in metamodel and one in compiling import metamodel @@ -30,7 +30,6 @@ redef class MMLocalClass # Return the primitive information of the class. # Return null if the class is not primitive - # FIXME: Only here since there is no universal type yet fun primitive_info: nullable PrimitiveInfo do if _primitive_info_b == true then return _primitive_info_cache @@ -44,8 +43,8 @@ redef class MMLocalClass var i = ctypes.iterator while i.is_ok do var n = i.key - if module.has_global_class_named(n) then - var c = module.class_by_name(n) + if mmmodule.has_global_class_named(n) then + var c = mmmodule.class_by_name(n) if cshe < c then _primitive_info_cache = i.item _primitive_info_b = true @@ -62,9 +61,9 @@ redef class MMLocalClass private fun primitive_ctypes: HashMap[Symbol, PrimitiveInfo] do var res = new HashMap[Symbol, PrimitiveInfo] - var pnames = ["Int", "Char", "Bool", "Float", "NativeString", "NativeArray", "Pointer"] - var tagged = [true, true, true, false, false, false, false] - var cnames = ["bigint", "char", "int", "float", "char *", "val_t *", "void *"] + var pnames = ["Int", "Char", "Bool", "Float", "NativeString", "Pointer"] + var tagged = [true, true, true, false, false, false] + var cnames = ["bigint", "char", "int", "float", "char *", "void *"] for i in [0..pnames.length[ do var n = pnames[i].to_symbol var pi = new PrimitiveInfo(n, tagged[i], cnames[i]) @@ -105,6 +104,14 @@ redef class MMType end end + # Is the type tagged? + fun is_tagged: Bool + do + if is_nullable then return false + var pi = local_class.primitive_info + return pi != null and pi.tagged + end + # The default c value for uninitialized types. # Return "null" for non primitive types and something more specific for primitive types fun default_cvalue: String @@ -122,7 +129,7 @@ redef class MMType fun boxtype(s: String): String do var pi = local_class.primitive_info - if pi == null then + if pi == null or is_nullable then return s else if pi.tagged then return "TAG_{local_class.name}({s})" @@ -136,7 +143,7 @@ redef class MMType fun unboxtype(s: String): String do var pi = local_class.primitive_info - if pi == null then + if pi == null or is_nullable then return s else if pi.tagged then return "UNTAG_{local_class.name}({s})" @@ -146,3 +153,65 @@ redef class MMType end end +redef class MMMethod + fun default_extern_name : String + do + return "{friendly_extern_name(local_class)}___impl" + end + + # Friendly name for this method. Is mainly the class name followed by the + # function name. It is prefixed with "new" for a constructor. + fun friendly_extern_name( local_class : MMLocalClass ) : String + do + if not global.is_init then + var native_fun_name : String + var method_name = name.to_s + if method_name == "+" then + native_fun_name = "_plus" # add + else if method_name == "-" then + native_fun_name = "_minus" # sub + else if method_name == "*" then + native_fun_name = "_star" # multi + else if method_name == "/" then + native_fun_name = "_slash" # div + else if method_name == "%" then + native_fun_name = "_percent" # mod + else if method_name == "[]" then + native_fun_name = "_index" # brackets + else if method_name == "[]=" then + native_fun_name = "_index_assign" # brackets + else if method_name == "==" then + native_fun_name = "_equal" # eq + else if method_name == "<" then + native_fun_name = "_less" # lt + else if method_name == ">" then + native_fun_name = "_greater" # gt + else if method_name == "<=" then + native_fun_name = "_less_or_equal" # greater_or_equal + else if method_name == ">=" then + native_fun_name = "_ge" # smaller_or_equal + else if method_name == "!=" then + native_fun_name = "_not_equal" # bang + else if method_name == ">>" then + native_fun_name = "_right" + else if method_name == "<<" then + native_fun_name = "_left" + else if method_name == "<=>" then + native_fun_name = "_starship" + else if method_name[ method_name.length-1 ] == '=' then + native_fun_name = "{method_name.substring(0,method_name.length-1)}__assign" + else + native_fun_name = method_name + end + + return "{local_class.name}_{native_fun_name}" + else + if name == once "init".to_symbol then + return "new_{local_class.name}" + else + return "new_{local_class.name}_{name}" + end + end + end +end +