@@ -102,9 +102,6 @@ def set_macro(self):
102102 def is_macro (self ):
103103 return self ._is_macro
104104
105- def _invoke (self , args ):
106- raise NotImplementedError ()
107-
108105 def get_consts (self ):
109106 raise NotImplementedError ()
110107
@@ -116,9 +113,12 @@ def stack_size(self):
116113 return 0
117114
118115 def invoke (self , args ):
119- result = self ._invoke (args )
116+ result = self .invoke (args )
120117 return result
121118
119+ def invoke_with (self , args , this_fn ):
120+ return self .invoke (args )
121+
122122
123123class MultiArityFn (BaseCode ):
124124 _type = object .Type (u"pixie.stdlib.MultiArityFn" )
@@ -155,8 +155,11 @@ def get_fn(self, arity):
155155
156156 affirm (False , u"Wrong number of args to fn: got " + unicode (str (arity )) + u" expected " + u"," .join (acc ))
157157
158- def _invoke (self , args ):
159- return self .get_fn (len (args )).invoke (args )
158+ def invoke (self , args ):
159+ return self .invoke_with (args , self )
160+
161+ def invoke_with (self , args , self_fn ):
162+ return self .get_fn (len (args )).invoke_with (args , self_fn )
160163
161164
162165
@@ -171,12 +174,15 @@ def __init__(self):
171174 def type (self ):
172175 return NativeFn ._type
173176
174- def _invoke (self , args ):
177+ def invoke (self , args ):
175178 return self .inner_invoke (args )
176179
177180 def inner_invoke (self , args ):
178181 raise NotImplementedError ()
179182
183+ def invoke_with (self , args , this_fn ):
184+ return self .invoke (args )
185+
180186
181187class Code (BaseCode ):
182188 """Interpreted code block. Contains consts and """
@@ -201,9 +207,12 @@ def with_meta(self, meta):
201207 def get_debug_points (self ):
202208 return self ._debug_points
203209
204- def _invoke (self , args ):
210+ def invoke (self , args ):
211+ return self .invoke_with (args , self )
212+
213+ def invoke_with (self , args , this_fn ):
205214 try :
206- return interpret (self , args )
215+ return interpret (self , args , self_obj = this_fn )
207216 except object .WrappedException as ex :
208217 ex ._ex ._trace .append (object .PixieCodeInfo (self ._name ))
209218 raise
@@ -242,20 +251,23 @@ def __init__(self, code, required_arity, meta=nil):
242251 def with_meta (self , meta ):
243252 return VariadicCode (self ._code , self ._required_arity , meta )
244253
245- def _invoke (self , args ):
254+ def invoke (self , args ):
255+ return self .invoke_with (args , self )
256+
257+ def invoke_with (self , args , self_fn ):
246258 from pixie .vm .array import array
247259 argc = len (args )
248260 if self ._required_arity == 0 :
249- return self ._code .invoke ([array (args )])
261+ return self ._code .invoke_with ([array (args )], self_fn )
250262 if argc == self ._required_arity :
251263 new_args = resize_list (args , len (args ) + 1 )
252264 new_args [len (args )] = array ([])
253- return self ._code .invoke (new_args )
265+ return self ._code .invoke_with (new_args , self_fn )
254266 elif argc > self ._required_arity :
255267 start = slice_from_start (args , self ._required_arity , 1 )
256268 rest = slice_to_end (args , self ._required_arity )
257269 start [self ._required_arity ] = array (rest )
258- return self ._code .invoke (start )
270+ return self ._code .invoke_with (start , self_fn )
259271 affirm (False , u"Got " + unicode (str (argc )) + u" arg(s) need at least " + unicode (str (self ._required_arity )))
260272
261273class Closure (BaseCode ):
@@ -274,9 +286,12 @@ def __init__(self, code, closed_overs, meta=nil):
274286 def with_meta (self , meta ):
275287 return Closure (self ._code , self ._closed_overs , meta )
276288
277- def _invoke (self , args ):
289+ def invoke (self , args ):
290+ return self .invoke_with (args , self )
291+
292+ def invoke_with (self , args , self_fn ):
278293 try :
279- return interpret (self , args )
294+ return interpret (self , args , self_obj = self_fn )
280295 except object .WrappedException as ex :
281296 ex ._ex ._trace .append (object .PixieCodeInfo (self ._code ._name ))
282297 raise
@@ -381,7 +396,10 @@ def deref(self):
381396 def is_defined (self ):
382397 return self ._root is not undefined
383398
384- def _invoke (self , args ):
399+ def invoke_with (self , args , this_fn ):
400+ return self .invoke (args )
401+
402+ def invoke (self , args ):
385403 return self .deref ().invoke (args )
386404
387405class bindings (py_object ):
@@ -510,7 +528,7 @@ class DefaultProtocolFn(NativeFn):
510528 def __init__ (self , pfn ):
511529 self ._pfn = pfn
512530
513- def _invoke (self , args ):
531+ def invoke (self , args ):
514532 from pixie .vm .string import String
515533 tp = args [0 ].type ()._name
516534 affirm (False , u"No override for " + tp + u" on " + self ._pfn ._name + u" in protocol " + self ._pfn ._protocol ._name )
@@ -574,7 +592,7 @@ def get_protocol_fn(self, tp, rev):
574592 fn = self ._dict .get (tp , self ._default_fn )
575593 return promote (fn )
576594
577- def _invoke (self , args ):
595+ def invoke (self , args ):
578596 a = args [0 ].type ()
579597 fn = self .get_protocol_fn (a , self ._rev )
580598 try :
@@ -621,7 +639,7 @@ def get_fn(self, tp1, tp2, _rev):
621639 fn = d1 .get (tp2 , self ._default_fn )
622640 return promote (fn )
623641
624- def _invoke (self , args ):
642+ def invoke (self , args ):
625643 affirm (len (args ) >= 2 , u"DoublePolymorphicFunctions take at least two args" )
626644 a = args [0 ].type ()
627645 b = args [1 ].type ()
0 commit comments