1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2012 Alexis Laferrière <alexis.laf@xymus.net>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Native interface related services (used underneath the FFI)
19 # All nitni properties may not be visible to the user but they are
20 # shared between engines
24 import modelbuilder
# builder only for externcalls
27 # Short name of this method in C (without the class name)
28 fun short_cname
: String do
31 if nit_name
== "+" then return "_plus"
32 if nit_name
== "-" then return "_minus"
33 if nit_name
== "unary -" then return "_unary_minus"
34 if nit_name
== "unary +" then return "_unary_plus"
35 if nit_name
== "unary ~" then return "_unary_tilde"
36 if nit_name
== "*" then return "_star"
37 if nit_name
== "/" then return "_slash"
38 if nit_name
== "%" then return "_percent"
39 if nit_name
== "[]" then return "_index"
40 if nit_name
== "[]=" then return "_index_assign"
41 if nit_name
== "==" then return "_equal"
42 if nit_name
== "<" then return "_less"
43 if nit_name
== ">" then return "_greater"
44 if nit_name
== "<=" then return "_less_or_equal"
45 if nit_name
== ">=" then return "_greater_or_equal"
46 if nit_name
== "!=" then return "_not_equal"
47 if nit_name
== "<<" then return "_left"
48 if nit_name
== ">>" then return "_right"
49 if nit_name
== "<=>" then return "_starship"
50 if nit_name
== "|" then return "_pipe"
51 if nit_name
== "^" then return "_caret"
52 if nit_name
== "&" then return "_amp"
53 if nit_name
== "~" then return "_tilde"
55 if nit_name
.chars
.last
== '=' then return "{nit_name.substring(0, nit_name.length-1)}__assign"
60 redef class MMethodDef
61 # Name of the function to callback this method from C,
62 # also used in other functions names used for this method.
63 fun cname
: String do return "{mclassdef.mclass.name}_{mproperty.short_cname}"
67 # Representation of this type in pure C on the FFI extern side
70 fun cname
: String is abstract
72 # Representation of this type in C for the internal of the system
74 fun cname_blind
: String do return "struct nitni_instance *"
76 # Representation of this type in mangled C
79 fun mangled_cname
: String is abstract
81 # Does this type have a primitive representation?
83 # type Object is_primitive? false
84 # type Pointer is_primitive? true
85 fun is_cprimitive
: Bool do return false
88 redef class MClassType
91 var name
= mclass
.name
92 if name
== "Bool" then return "int"
93 if name
== "Char" then return "uint32_t"
94 if name
== "Float" then return "double"
95 if name
== "Int" then return "long"
96 if name
== "Byte" then return "unsigned char"
97 if name
== "NativeString" then return "char*"
98 if mclass
.kind
== extern_kind
then
99 var ctype
= mclass
.ctype
103 return cname_normal_class
106 redef fun cname_blind
do
107 var name
= mclass
.name
108 if name
== "Bool" then return "int"
109 if name
== "Char" then return "uint32_t"
110 if name
== "Float" then return "double"
111 if name
== "Int" then return "long"
112 if name
== "Byte" then return "unsigned char"
113 if name
== "NativeString" then return "char*"
114 if mclass
.kind
== extern_kind
then return "void*"
118 # Name of this type in C for normal classes (not extern and not primitive)
119 protected fun cname_normal_class
: String do return mangled_cname
121 redef fun mangled_cname
do return mclass
.name
123 redef fun is_cprimitive
do return mclass
.kind
== extern_kind
or
124 (once
["Bool", "Char", "Float", "Int", "NativeString", "Byte"]).has
(mclass
.name
)
127 redef class MNullableType
128 redef fun cname
do return mangled_cname
129 redef fun mangled_cname
do return "nullable_{mtype.mangled_cname}"
132 redef class MVirtualType
133 redef fun mangled_cname
do return to_s
136 redef class MGenericType
137 redef fun cname
do return mangled_cname
138 redef fun mangled_cname
142 var params
= new Array[String]
143 for arg
in arguments
do params
.add
(arg
.mangled_cname
)
145 return "{base}_of_{params.join("_")}"
150 fun ctype
: nullable String
152 assert kind
== extern_kind