forked from pixie-lang/pixie
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathobject.py
More file actions
155 lines (116 loc) · 3.92 KB
/
object.py
File metadata and controls
155 lines (116 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import rpython.rlib.jit as jit
class Object(object):
""" Base Object for all VM objects
"""
def type(self):
affirm(False, u".type isn't overloaded")
@jit.unroll_safe
def invoke(self, args):
import pixie.vm.stdlib as stdlib
return stdlib.invoke_other(self, args)
def promote(self):
return self
class TypeRegistry(object):
def __init__(self):
self._types = {}
self._ns_registry = None
def register_type(self, nm, tp):
if self._ns_registry is None:
self._types[nm] = tp
else:
self.var_for_type_and_name(nm, tp)
def var_for_type_and_name(self, nm, tp):
from pixie.vm.symbol import symbol
splits = nm.split(u".")
size = len(splits) - 1
assert size >= 0
ns = u".".join(splits[:size])
name = splits[size]
var = self._ns_registry.find_or_make(ns).intern_or_make(name)
var.set_root(tp)
return var
def set_registry(self, registry):
self._ns_registry = registry
for nm in self._types:
tp = self._types[nm]
self.var_for_type_and_name(nm, tp)
def get_by_name(self, nm, default=None):
return self._types.get(nm, default)
_type_registry = TypeRegistry()
class Type(Object):
def __init__(self, name):
#assert isinstance(name, unicode), u"Type names must be unicode"
_type_registry.register_type(name, self)
self._name = name
def type(self):
return Type._type
Type._type = Type(u"Type")
class RuntimeException(Object):
_type = Type(u"pixie.stdlib.RuntimeException")
def __init__(self, data):
self._data = data
self._trace = []
def type(self):
return RuntimeException._type
def __repr__(self):
import pixie.vm.rt as rt
s = []
trace = self._trace[:]
trace.reverse()
for x in trace:
s.append(x.__repr__())
s.append(u"\n")
s.extend([u"RuntimeException: " + rt.str(self._data)._str + u"\n"])
return u"".join(s)
class WrappedException(Exception):
def __init__(self, ex):
assert isinstance(ex, RuntimeException)
self._ex = ex
def __repr__(self):
return repr(self._ex)
def __str__(self):
return repr(self._ex)
def affirm(val, msg):
"""Works a lot like assert except it throws RuntimeExceptions"""
assert isinstance(msg, unicode)
if not val:
import pixie.vm.rt as rt
raise WrappedException(RuntimeException(rt.wrap(msg)))
class ErrorInfo(Object):
_type = Type(u"pixie.stdlib.ErrorInfo")
def type(self):
return ErrorInfo._type
def __init__(self):
pass
class InterpreterCodeInfo(ErrorInfo):
def __init__(self, line, line_number, column_number, file):
self._line = line
self._line_number = line_number
self._column_number = column_number
self._file = file
def pad_chars(self):
chrs = []
for x in range(self._column_number - 1):
chrs += u" "
return u"".join(chrs)
def __repr__(self):
return u"in " + self._file + u" at " + unicode(str(self._line_number)) \
+ u":" + unicode(str(self._column_number)) + u"\n" \
+ self._line.__repr__() + u"\n" \
+ self.pad_chars() + u"^"
class NativeCodeInfo(ErrorInfo):
def __init__(self, name):
self._name = name
def __repr__(self):
return u"in internal function " + self._name + u"\n"
class PolymorphicCodeInfo(ErrorInfo):
def __init__(self, name, tp):
self._name = name
self._tp = tp
def __repr__(self):
return u"in polymorphic function " + self._name + u" dispatching on " + self._tp._name + u"\n"
class PixieCodeInfo(ErrorInfo):
def __init__(self, name):
self._name = name
def __repr__(self):
return u"in pixie function " + self._name + u"\n"