11py_object = object
22import pixie .vm .object as object
33from pixie .vm .object import affirm
4- from pixie .vm .primitives import nil , true , false
4+ from pixie .vm .primitives import nil , false
55from rpython .rlib .rarithmetic import r_uint
6- from rpython .rlib .jit import elidable , elidable_promote , promote
6+ from rpython .rlib .jit import elidable_promote , promote
77import rpython .rlib .jit as jit
88import pixie .vm .rt as rt
99
@@ -48,6 +48,7 @@ def resize_list(lst, new_size):
4848 i += 1
4949 return new_list
5050
51+
5152@jit .unroll_safe
5253def list_copy (from_lst , from_loc , to_list , to_loc , count ):
5354 from_loc = r_uint (from_loc )
@@ -56,10 +57,11 @@ def list_copy(from_lst, from_loc, to_list, to_loc, count):
5657
5758 i = r_uint (0 )
5859 while i < count :
59- to_list [to_loc + i ] = from_lst [from_loc + i ]
60+ to_list [to_loc + i ] = from_lst [from_loc + i ]
6061 i += 1
6162 return to_list
6263
64+
6365@jit .unroll_safe
6466def slice_to_end (from_list , start_pos ):
6567 start_pos = r_uint (start_pos )
@@ -68,12 +70,14 @@ def slice_to_end(from_list, start_pos):
6870 list_copy (from_list , start_pos , new_lst , 0 , items_to_copy )
6971 return new_lst
7072
73+
7174@jit .unroll_safe
7275def slice_from_start (from_list , count , extra = r_uint (0 )):
7376 new_lst = [None ] * (count + extra )
7477 list_copy (from_list , 0 , new_lst , 0 , count )
7578 return new_lst
7679
80+
7781# class TailCall(object.Object):
7882# _type = object.Type("TailCall")
7983# __immutable_fields_ = ["_f", "_args"]
@@ -159,8 +163,6 @@ def invoke_with(self, args, self_fn):
159163 return self .get_fn (len (args )).invoke_with (args , self_fn )
160164
161165
162-
163-
164166class NativeFn (BaseCode ):
165167 """Wrapper for a native function"""
166168 _type = object .Type (u"pixie.stdlib.NativeFn" )
@@ -231,7 +233,6 @@ def get_base_code(self):
231233 return self
232234
233235
234-
235236class VariadicCode (BaseCode ):
236237 __immutable_fields__ = ["_required_arity" , "_code" , "_meta" ]
237238 _type = object .Type (u"pixie.stdlib.VariadicCode" )
@@ -267,9 +268,11 @@ def invoke_with(self, args, self_fn):
267268 return self ._code .invoke_with (start , self_fn )
268269 affirm (False , u"Got " + unicode (str (argc )) + u" arg(s) need at least " + unicode (str (self ._required_arity )))
269270
271+
270272class Closure (BaseCode ):
271273 _type = object .Type (u"pixie.stdlib.Closure" )
272274 __immutable_fields__ = ["_closed_overs[*]" , "_code" , "_meta" ]
275+
273276 def type (self ):
274277 return Closure ._type
275278
@@ -314,6 +317,7 @@ def get_base_code(self):
314317 def get_debug_points (self ):
315318 return self ._code .get_debug_points ()
316319
320+
317321class Undefined (object .Object ):
318322 _type = object .Type (u"pixie.stdlib.Undefined" )
319323
@@ -322,6 +326,7 @@ def type(self):
322326
323327undefined = Undefined ()
324328
329+
325330class DynamicVars (py_object ):
326331 def __init__ (self ):
327332 self ._vars = [{}]
@@ -340,6 +345,7 @@ def set_var_value(self, var, val):
340345
341346_dynamic_vars = DynamicVars ()
342347
348+
343349class Var (BaseCode ):
344350 _type = object .Type (u"pixie.stdlib.Var" )
345351 _immutable_fields_ = ["_rev?" ]
@@ -365,7 +371,6 @@ def set_value(self, val):
365371 _dynamic_vars .set_var_value (self , val )
366372 return self
367373
368-
369374 def set_dynamic (self ):
370375 self ._dynamic = True
371376 self ._rev += 1
@@ -381,7 +386,6 @@ def is_dynamic(self, rev):
381386 def get_root (self , rev ):
382387 return self ._root
383388
384-
385389 def deref (self ):
386390 if self .is_dynamic (self ._rev ):
387391 return self .get_dynamic_value ()
@@ -399,9 +403,10 @@ def invoke_with(self, args, this_fn):
399403 def invoke (self , args ):
400404 return self .deref ().invoke (args )
401405
406+
402407class bindings (py_object ):
403408 def __init__ (self , * args ):
404- self ._args = list (args )
409+ self ._args = list (args )
405410
406411 def __enter__ (self ):
407412 _dynamic_vars .push_binding_frame ()
@@ -493,11 +498,10 @@ def resolve(self, s, use_refers=True):
493498 return None
494499 return var
495500
496-
497-
498501 def get (self , name , default ):
499502 return self ._registry .get (name , default )
500503
504+
501505class NamespaceRegistry (py_object ):
502506 def __init__ (self ):
503507 self ._registry = {}
@@ -510,7 +514,6 @@ def find_or_make(self, name):
510514 self ._registry [name ] = v
511515 return v
512516
513-
514517 def get (self , name , default ):
515518 return self ._registry .get (name , default )
516519
@@ -524,20 +527,19 @@ def intern_var(ns, name=None):
524527
525528 return _ns_registry .find_or_make (ns ).intern_or_make (name )
526529
530+
527531def get_var_if_defined (ns , name , els = None ):
528532 w_ns = _ns_registry .get (ns , None )
529533 if w_ns is None :
530534 return els
531535 return w_ns .get (name , els )
532536
533537
534-
535538class DefaultProtocolFn (NativeFn ):
536539 def __init__ (self , pfn ):
537540 self ._pfn = pfn
538541
539542 def invoke (self , args ):
540- from pixie .vm .string import String
541543 tp = args [0 ].type ()._name
542544 affirm (False , u"No override for " + tp + u" on " + self ._pfn ._name + u" in protocol " + self ._pfn ._protocol ._name )
543545
@@ -546,6 +548,7 @@ class Protocol(object.Object):
546548 _type = object .Type (u"pixie.stdlib.Protocol" )
547549
548550 __immutable_fields__ = ["_rev?" ]
551+
549552 def type (self ):
550553 return Protocol ._type
551554
@@ -555,7 +558,6 @@ def __init__(self, name):
555558 self ._satisfies = {}
556559 self ._rev = 0
557560
558-
559561 def add_method (self , pfn ):
560562 self ._polyfns [pfn ] = pfn
561563
@@ -573,10 +575,12 @@ def satisfies(self, tp):
573575
574576class PolymorphicFn (BaseCode ):
575577 _type = object .Type (u"pixie.stdlib.PolymorphicFn" )
578+
576579 def type (self ):
577580 return PolymorphicFn ._type
578581
579582 __immutable_fields__ = ["_rev?" ]
583+
580584 def __init__ (self , name , protocol ):
581585 BaseCode .__init__ (self )
582586 self ._name = name
@@ -617,7 +621,6 @@ def _find_parent_fn(self, tp):
617621
618622 return self ._default_fn
619623
620-
621624 def set_default_fn (self , fn ):
622625 self ._default_fn = fn
623626 self ._rev += 1
@@ -642,6 +645,7 @@ def invoke(self, args):
642645 ex ._ex ._trace .append (object .PolymorphicCodeInfo (self ._name , args [0 ].type ()))
643646 raise
644647
648+
645649class DoublePolymorphicFn (BaseCode ):
646650 """A function that is polymorphic on the first two arguments"""
647651 _type = object .Type (u"pixie.stdlib.DoublePolymorphicFn" )
@@ -650,6 +654,7 @@ def type(self):
650654 return DefaultProtocolFn ._type
651655
652656 __immutable_fields__ = ["_rev?" ]
657+
653658 def __init__ (self , name , protocol ):
654659 BaseCode .__init__ (self )
655660 self ._name = name
@@ -688,7 +693,6 @@ def invoke(self, args):
688693 return fn .invoke (args )
689694
690695
691-
692696# class ElidableFn(object.Object):
693697# _type = object.Type(u"pixie.stdlib.ElidableFn")
694698# __immutable_fields__ = ["_boxed_fn"]
@@ -722,10 +726,14 @@ def invoke(self, args):
722726# return self._elidable_invoke_2(fn, args[0].promote(), args[1].promote()).promote()
723727# affirm(False, u"Too many args to Elidable Fn")
724728
729+
725730def munge (s ):
726731 return s .replace ("-" , "_" ).replace ("?" , "_QMARK_" ).replace ("!" , "_BANG_" )
727732
733+
728734import inspect
735+
736+
729737def defprotocol (ns , name , methods ):
730738 """Define a protocol in the given namespace with the given name and methods, vars will
731739 be created in the namespace for the protocol and methods. This function will dump
@@ -734,28 +742,31 @@ def defprotocol(ns, name, methods):
734742 name = unicode (name )
735743 methods = map (unicode , methods )
736744 gbls = inspect .currentframe ().f_back .f_globals
737- proto = Protocol (name )
745+ proto = Protocol (name )
738746 intern_var (ns , name ).set_root (proto )
739747 gbls [munge (name )] = proto
740748 for method in methods :
741- poly = PolymorphicFn (method , proto )
749+ poly = PolymorphicFn (method , proto )
742750 intern_var (ns , method ).set_root (poly )
743751 gbls [munge (method )] = poly
744752
753+
745754def assert_type (x , tp ):
746755 affirm (isinstance (x , tp ), u"Fatal Error, this should never happen" )
747756 return x
748757
749758
750759## PYTHON FLAGS
751760CO_VARARGS = 0x4
761+
762+
752763def wrap_fn (fn , tp = object .Object ):
753764 """Converts a native Python function into a pixie function."""
754765 def as_native_fn (f ):
755- return type ("W" + fn .__name__ , (NativeFn ,), {"inner_invoke" : f })()
766+ return type ("W" + fn .__name__ , (NativeFn ,), {"inner_invoke" : f })()
756767
757768 def as_variadic_fn (f ):
758- return type ("W" + fn .__name__ [:len ("__args" )], (NativeFn ,), {"inner_invoke" : f })()
769+ return type ("W" + fn .__name__ [:len ("__args" )], (NativeFn ,), {"inner_invoke" : f })()
759770
760771 code = fn .func_code
761772 if fn .__name__ .endswith ("__args" ):
@@ -841,7 +852,6 @@ def extend_inner(fn):
841852 return extend_inner
842853
843854
844-
845855def as_var (ns , name = None ):
846856 """Locates a var with the given name (defaulting to the namespace pixie.stdlib), sets
847857 the root to the decorated function. If the function is not an instance of BaseCode it will
@@ -854,6 +864,7 @@ def as_var(ns, name=None):
854864 ns = ns if isinstance (ns , unicode ) else unicode (ns )
855865
856866 var = intern_var (ns , name )
867+
857868 def with_fn (fn ):
858869 fn .__real_name__ = name
859870 if not isinstance (fn , object .Object ):
0 commit comments