engines: handle initializers with an arity!=1
authorJean Privat <privat@pryen.org>
Mon, 29 Sep 2014 19:37:08 +0000 (15:37 -0400)
committerJean Privat <jean@pryen.org>
Mon, 29 Sep 2014 20:18:03 +0000 (16:18 -0400)
Signed-off-by: Jean Privat <privat@pryen.org>

src/compiler/abstract_compiler.nit
src/interpreter/naive_interpreter.nit

index 5251f34..cf1e0f2 100644 (file)
@@ -1053,16 +1053,21 @@ abstract class AbstractCompilerVisitor
                if not initializers.is_empty then
                        var recv = arguments.first
 
-                       assert initializers.length == arguments.length - 1 else debug("expected {initializers.length}, got {arguments.length - 1}")
                        var i = 1
                        for p in initializers do
                                if p isa MMethod then
-                                       self.send(p, [recv, arguments[i]])
+                                       var args = [recv]
+                                       for x in p.intro.msignature.mparameters do
+                                               args.add arguments[i]
+                                               i += 1
+                                       end
+                                       self.send(p, args)
                                else if p isa MAttribute then
                                        self.write_attribute(p, recv, arguments[i])
+                                       i += 1
                                else abort
-                               i += 1
                        end
+                       assert i == arguments.length
 
                        return self.send(callsite.mproperty, [recv])
                end
index d4c9173..5b79f0c 100644 (file)
@@ -407,18 +407,24 @@ private class NaiveInterpreter
        do
                var initializers = callsite.mpropdef.initializers
                if not initializers.is_empty then
-                       assert initializers.length == arguments.length - 1 else debug("expected {initializers.length} got {arguments.length - 1}")
                        var recv = arguments.first
                        var i = 1
                        for p in initializers do
                                if p isa MMethod then
-                                       self.send(p, [recv, arguments[i]])
+                                       var args = [recv]
+                                       for x in p.intro.msignature.mparameters do
+                                               args.add arguments[i]
+                                               i += 1
+                                       end
+                                       self.send(p, args)
                                else if p isa MAttribute then
                                        assert recv isa MutableInstance
                                        recv.attributes[p] = arguments[i]
+                                       i += 1
                                else abort
-                               i += 1
                        end
+                       assert i == arguments.length
+
                        return send(callsite.mproperty, [recv])
                end
                return send(callsite.mproperty, arguments)