X-Git-Url: http://nitlanguage.org diff --git a/src/nitni/nitni_base.nit b/src/nitni/nitni_base.nit index 4f31aaf..a43e1d7 100644 --- a/src/nitni/nitni_base.nit +++ b/src/nitni/nitni_base.nit @@ -22,7 +22,6 @@ module nitni_base import parser import modelbuilder # builder only for externcalls -private import compiler::abstract_compiler redef class MMethod # Short name of this method in C (without the class name) @@ -32,6 +31,8 @@ redef class MMethod if nit_name == "+" then return "_plus" if nit_name == "-" then return "_minus" if nit_name == "unary -" then return "_unary_minus" + if nit_name == "unary +" then return "_unary_plus" + if nit_name == "unary ~" then return "_unary_tilde" if nit_name == "*" then return "_star" if nit_name == "/" then return "_slash" if nit_name == "%" then return "_percent" @@ -39,25 +40,23 @@ redef class MMethod if nit_name == "[]=" then return "_index_assign" if nit_name == "==" then return "_equal" if nit_name == "<" then return "_less" - if nit_name == ">" then return "_geater" + if nit_name == ">" then return "_greater" if nit_name == "<=" then return "_less_or_equal" if nit_name == ">=" then return "_greater_or_equal" if nit_name == "!=" then return "_not_equal" if nit_name == "<<" then return "_left" if nit_name == ">>" then return "_right" if nit_name == "<=>" then return "_starship" + if nit_name == "|" then return "_pipe" + if nit_name == "^" then return "_caret" + if nit_name == "&" then return "_amp" + if nit_name == "~" then return "_tilde" if nit_name.chars.last == '=' then return "{nit_name.substring(0, nit_name.length-1)}__assign" return nit_name end end -redef class MModule - # Mangled name of this module in C - fun cname: String do return c_name # FIXME this is a hack to keep the internal FFI - # API independent of the compilers while still using the `MModule::c_name` service. -end - redef class MMethodDef # Name of the function to callback this method from C, # also used in other functions names used for this method. @@ -72,17 +71,18 @@ redef class MType # Representation of this type in C for the internal of the system # Hides extern types. - fun cname_blind: String is abstract + fun cname_blind: String do return "struct nitni_instance *" # Representation of this type in mangled C # Object -> Object # Pointer -> Pointer fun mangled_cname: String is abstract - # Does this types has a primitive reprensentation + # Does this type have a primitive representation? + # # type Object is_primitive? false # type Pointer is_primitive? true - fun is_cprimitive: Bool is abstract + fun is_cprimitive: Bool do return false end redef class MClassType @@ -90,44 +90,58 @@ redef class MClassType do var name = mclass.name if name == "Bool" then return "int" - if name == "Char" then return "char" + if name == "Char" then return "uint32_t" if name == "Float" then return "double" if name == "Int" then return "long" + if name == "Byte" then return "unsigned char" + if name == "Int8" then return "int8_t" + if name == "Int16" then return "int16_t" + if name == "UInt16" then return "uint16_t" + if name == "Int32" then return "int32_t" + if name == "UInt32" then return "uint32_t" if name == "NativeString" then return "char*" if mclass.kind == extern_kind then var ctype = mclass.ctype assert ctype != null return ctype end - return mangled_cname + return cname_normal_class end redef fun cname_blind do var name = mclass.name if name == "Bool" then return "int" - if name == "Char" then return "char" + if name == "Char" then return "uint32_t" if name == "Float" then return "double" if name == "Int" then return "long" + if name == "Byte" then return "unsigned char" + if name == "Int8" then return "int8_t" + if name == "Int16" then return "int16_t" + if name == "UInt16" then return "uint16_t" + if name == "Int32" then return "int32_t" + if name == "UInt32" then return "uint32_t" if name == "NativeString" then return "char*" if mclass.kind == extern_kind then return "void*" - return "struct nitni_instance *" + return super end + # Name of this type in C for normal classes (not extern and not primitive) + protected fun cname_normal_class: String do return mangled_cname + redef fun mangled_cname do return mclass.name redef fun is_cprimitive do return mclass.kind == extern_kind or - (once ["Bool", "Char", "Float", "Int", "NativeString"]).has(mclass.name) + (once ["Bool", "Char", "Float", "Int", "NativeString", + "Byte", "Int8", "Int16", "UInt16", "Int32", "UInt32"]).has(mclass.name) end redef class MNullableType redef fun cname do return mangled_cname - redef fun cname_blind do return "struct nitni_instance *" redef fun mangled_cname do return "nullable_{mtype.mangled_cname}" - redef fun is_cprimitive do return false end redef class MVirtualType - redef fun mangled_cname: String do return to_s + redef fun mangled_cname do return to_s end redef class MGenericType