nitg-sep: signature adaptation is done on the declared signature
authorJean Privat <jean@pryen.org>
Sat, 1 Dec 2012 05:24:08 +0000 (00:24 -0500)
committerJean Privat <jean@pryen.org>
Sat, 1 Dec 2012 05:31:12 +0000 (00:31 -0500)
Signed-off-by: Jean Privat <jean@pryen.org>

src/separate_compiler.nit
tests/base_char_operators.nit [new file with mode: 0644]
tests/sav/base_char_operators.res [new file with mode: 0644]

index 5f095d3..cee2465 100644 (file)
@@ -531,11 +531,12 @@ class SeparateRuntimeFunction
                var frame = new Frame(v, mmethoddef, recv, arguments)
                v.frame = frame
 
+               var msignature = mmethoddef.msignature.resolve_for(mmethoddef.mclassdef.bound_mtype, mmethoddef.mclassdef.bound_mtype, mmethoddef.mclassdef.mmodule, true)
+
                var sig = new Buffer
                var comment = new Buffer
-               var ret = mmethoddef.msignature.return_mtype
+               var ret = msignature.return_mtype
                if ret != null then
-                       ret = v.resolve_for(ret, selfvar)
                        sig.append("{ret.ctype} ")
                else if mmethoddef.mproperty.is_new then
                        ret = recv
@@ -547,12 +548,11 @@ class SeparateRuntimeFunction
                sig.append("({selfvar.mtype.ctype} {selfvar}")
                comment.append("(self: {selfvar}")
                arguments.add(selfvar)
-               for i in [0..mmethoddef.msignature.arity[ do
-                       var mtype = mmethoddef.msignature.mparameters[i].mtype
-                       if i == mmethoddef.msignature.vararg_rank then
+               for i in [0..msignature.arity[ do
+                       var mtype = msignature.mparameters[i].mtype
+                       if i == msignature.vararg_rank then
                                mtype = v.get_class("Array").get_mtype([mtype])
                        end
-                       mtype = v.resolve_for(mtype, selfvar)
                        comment.append(", {mtype}")
                        sig.append(", {mtype.ctype} p{i}")
                        var argvar = new RuntimeVariable("p{i}", mtype, mtype)
@@ -676,16 +676,16 @@ class SeparateCompilerVisitor
 
        redef fun adapt_signature(m: MMethodDef, args: Array[RuntimeVariable])
        do
+               var msignature = m.msignature.resolve_for(m.mclassdef.bound_mtype, m.mclassdef.bound_mtype, m.mclassdef.mmodule, true)
                var recv = args.first
                if recv.mtype.ctype != m.mclassdef.mclass.mclass_type.ctype then
                        args.first = self.autobox(args.first, m.mclassdef.mclass.mclass_type)
                end
-               for i in [0..m.msignature.arity[ do
-                       var t = m.msignature.mparameters[i].mtype
-                       if i == m.msignature.vararg_rank then
+               for i in [0..msignature.arity[ do
+                       var t = msignature.mparameters[i].mtype
+                       if i == msignature.vararg_rank then
                                t = args[i+1].mtype
                        end
-                       t = self.resolve_for(t, recv)
                        args[i+1] = self.autobox(args[i+1], t)
                end
        end
@@ -735,7 +735,6 @@ class SeparateCompilerVisitor
                else if ret == null then
                        res = null
                else
-                       ret = self.resolve_for(ret, arguments.first)
                        res = self.new_var(ret)
                end
 
@@ -814,7 +813,7 @@ class SeparateCompilerVisitor
                else if ret == null then
                        res = null
                else
-                       ret = self.resolve_for(ret, arguments.first)
+                       ret = ret.resolve_for(mmethoddef.mclassdef.bound_mtype, mmethoddef.mclassdef.bound_mtype, mmethoddef.mclassdef.mmodule, true)
                        res = self.new_var(ret)
                end
 
diff --git a/tests/base_char_operators.nit b/tests/base_char_operators.nit
new file mode 100644 (file)
index 0000000..bbae613
--- /dev/null
@@ -0,0 +1,25 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+('a'+1).output
+('a'-1).output
+('a'<'b').output
+('a'>'b').output
+('a'<='b').output
+('a'>='b').output
+('a'=='b').output
+('a'!='b').output
+('a'<=>'b').output
diff --git a/tests/sav/base_char_operators.res b/tests/sav/base_char_operators.res
new file mode 100644 (file)
index 0000000..5630ad7
--- /dev/null
@@ -0,0 +1,7 @@
+b`true
+false
+true
+false
+false
+true
+-1