11py_object = object
22import pixie .vm .object as object
3- from pixie .vm .object import affirm
3+ from pixie .vm .object import affirm , runtime_error
44from pixie .vm .primitives import nil , false
55from rpython .rlib .rarithmetic import r_uint
66from rpython .rlib .jit import elidable_promote , promote
@@ -101,6 +101,9 @@ def meta(self):
101101 def with_meta (self , meta ):
102102 assert false , "not implemented"
103103
104+ def name (self ):
105+ return self ._name
106+
104107 def set_macro (self ):
105108 self ._is_macro = True
106109
@@ -130,15 +133,16 @@ class MultiArityFn(BaseCode):
130133 def type (self ):
131134 return MultiArityFn ._type
132135
133- def __init__ (self , arities , required_arity = 0 , rest_fn = None , meta = nil ):
136+ def __init__ (self , name , arities , required_arity = 0 , rest_fn = None , meta = nil ):
134137 BaseCode .__init__ (self )
138+ self ._name = name
135139 self ._arities = arities
136140 self ._required_arity = required_arity
137141 self ._rest_fn = rest_fn
138142 self ._meta = meta
139143
140144 def with_meta (self , meta ):
141- return MultiArityFn (self ._arities , self ._required_arity , self ._rest_fn , meta )
145+ return MultiArityFn (self ._name , self . _arities , self ._required_arity , self ._rest_fn , meta )
142146
143147 @elidable_promote ()
144148 def get_fn (self , arity ):
@@ -153,9 +157,9 @@ def get_fn(self, arity):
153157 acc .append (unicode (str (x )))
154158
155159 if self ._rest_fn :
156- acc .append (u" or more" )
160+ acc .append (unicode ( str ( self . _rest_fn . required_arity ())) + u" or more" )
157161
158- affirm ( False , u"Wrong number of args to fn: got " + unicode (str (arity )) + u" expected " + u"," .join (acc ))
162+ runtime_error ( u"Wrong number of arguments " + unicode (str (arity )) + u" for function '" + unicode ( self . _name ) + u"'. Expected " + u"," .join (acc ))
159163
160164 def invoke (self , args ):
161165 return self .invoke_with (args , self )
@@ -209,7 +213,12 @@ def get_debug_points(self):
209213 return self ._debug_points
210214
211215 def invoke (self , args ):
212- return self .invoke_with (args , self )
216+ if len (args ) == self .get_arity ():
217+ return self .invoke_with (args , self )
218+ else :
219+ runtime_error (u"Invalid number of arguments " + unicode (str (len (args )))
220+ + u" for function '" + unicode (str (self ._name )) + u"'. Expected "
221+ + unicode (str (self .get_arity ())))
213222
214223 def invoke_with (self , args , this_fn ):
215224 try :
@@ -254,6 +263,12 @@ def __init__(self, code, required_arity, meta=nil):
254263
255264 def with_meta (self , meta ):
256265 return VariadicCode (self ._code , self ._required_arity , meta )
266+
267+ def name (self ):
268+ return None
269+
270+ def required_arity (self ):
271+ return self ._required_arity
257272
258273 def invoke (self , args ):
259274 return self .invoke_with (args , self )
@@ -292,6 +307,10 @@ def __init__(self, code, closed_overs, meta=nil):
292307 def with_meta (self , meta ):
293308 return Closure (self ._code , self ._closed_overs , meta )
294309
310+
311+ def name (self ):
312+ return None
313+
295314 def invoke (self , args ):
296315 return self .invoke_with (args , self )
297316
0 commit comments