Compiles under RPython, which apparently doesn't do getitem/setitem. At least, not for me.
Chris Pressey
7 years ago
8 | 8 | import sys |
9 | 9 | |
10 | 10 | |
11 | def input(): | |
12 | try: | |
13 | c = sys.stdin.read(1) | |
14 | if len(c) == 0: | |
15 | x = 0 | |
16 | else: | |
17 | x = ord(c) | |
18 | except EOFError: | |
19 | x = 0 | |
20 | return x | |
21 | ||
22 | ||
23 | def output(code): | |
24 | try: | |
25 | sys.stdout.write(unichr(code)) | |
26 | except UnicodeEncodeError: | |
27 | sys.stdout.write("&#%d;" % code) | |
28 | ||
29 | ||
11 | 30 | # check if running under Skulpt, and if so, apply appropriate modifications |
12 | 31 | if getattr(sys, 'resetTimeout', None) is not None: |
13 | 32 | __name__ = '__skulpt__' |
21 | 40 | class UnicodeEncodeError: |
22 | 41 | pass |
23 | 42 | |
24 | def output(code): | |
43 | def skulpt_output(code): | |
25 | 44 | print "&#%d;" % code |
26 | else: | |
27 | def output(code): | |
28 | try: | |
29 | sys.stdout.write(unichr(code)) | |
30 | except UnicodeEncodeError: | |
31 | sys.stdout.write("&#%d;" % code) | |
45 | ||
46 | output = skulpt_output | |
32 | 47 | |
33 | 48 | |
34 | 49 | def copy_dict(d): |
51 | 66 | pass |
52 | 67 | |
53 | 68 | def read(self): |
54 | try: | |
55 | c = sys.stdin.read(1) | |
56 | if len(c) == 0: | |
57 | x = 0 | |
58 | else: | |
59 | x = ord(c) | |
60 | except EOFError: | |
61 | x = 0 | |
62 | return x | |
69 | return input() | |
63 | 70 | |
64 | 71 | def write(self, payload): |
65 | 72 | output(payload) |
112 | 119 | return 4 |
113 | 120 | |
114 | 121 | def write(self, payload): |
115 | self.state[8] = self.state[8] + payload | |
122 | self.state.__setitem__(8, self.state.__getitem__(8) + payload) | |
116 | 123 | |
117 | 124 | |
118 | 125 | class SubtractionRegister(MappedRegister): |
123 | 130 | return 5 |
124 | 131 | |
125 | 132 | def write(self, payload): |
126 | result = self.state[8] - payload | |
133 | result = self.state.__getitem__(8) - payload | |
127 | 134 | if result < 0: |
128 | 135 | result = 0 |
129 | self.state[8] = result | |
136 | self.state.__setitem__(8, result) | |
130 | 137 | |
131 | 138 | |
132 | 139 | class MultiplicationRegister(MappedRegister): |
137 | 144 | return 6 |
138 | 145 | |
139 | 146 | def write(self, payload): |
140 | self.state[8] = self.state[8] * payload | |
147 | self.state.__setitem__(8, self.state.__getitem__(8) * payload) | |
141 | 148 | |
142 | 149 | |
143 | 150 | class NegationRegister(MappedRegister): |
149 | 156 | |
150 | 157 | def write(self, payload): |
151 | 158 | if payload == 0: |
152 | self.state[8] = 1 | |
159 | self.state.__setitem__(8, 1) | |
153 | 160 | else: |
154 | self.state[8] = 0 | |
161 | self.state.__setitem__(8, 0) | |
155 | 162 | |
156 | 163 | |
157 | 164 | class MachineState(object): |
176 | 183 | return other |
177 | 184 | |
178 | 185 | def __getitem__(self, key): |
186 | assert isinstance(key, int) | |
179 | 187 | if key in self.mmap_register: |
180 | 188 | return self.mmap_register[key].read() |
181 | 189 | if key not in self.storage_register: |
183 | 191 | return self.storage_register[key] |
184 | 192 | |
185 | 193 | def __setitem__(self, key, value): |
194 | assert isinstance(key, int) | |
195 | assert isinstance(value, int) | |
186 | 196 | if key in self.mmap_register: |
187 | 197 | self.mmap_register[key].write(value) |
188 | 198 | self.storage_register[key] = value |
212 | 222 | self.index = index |
213 | 223 | |
214 | 224 | def get_value(self, state): |
215 | return state[self.index] | |
225 | return state.__getitem__(self.index) | |
216 | 226 | |
217 | 227 | def set_value(self, state, value): |
218 | state[self.index] = value | |
228 | state.__setitem__(self.index, value) | |
219 | 229 | |
220 | 230 | def __str__(self): |
221 | 231 | return "R%d" % self.number |
227 | 237 | self.ref = ref |
228 | 238 | |
229 | 239 | def get_value(self, state): |
230 | return state[self.ref.get_value(state)] | |
240 | return state.__getitem__(self.ref.get_value(state)) | |
231 | 241 | |
232 | 242 | def set_value(self, state, value): |
233 | state[self.ref.get_value(state)] = value | |
243 | state.__setitem__(self.ref.get_value(state), value) | |
234 | 244 | |
235 | 245 | def __str__(self): |
236 | 246 | return "R[%s]" % self.ref |
367 | 377 | for filename in argv[1:]: |
368 | 378 | p.load(filename) |
369 | 379 | p.run() |
380 | ||
381 | ||
382 | def rpython_input(): | |
383 | return 0 | |
384 | ||
385 | def rpython_output(code): | |
386 | print "&#%d;" % code | |
370 | 387 | |
371 | 388 | |
372 | 389 | def rpython_main(argv): |
389 | 406 | |
390 | 407 | |
391 | 408 | def target(*args): |
409 | global input, output | |
410 | input = rpython_input | |
411 | output = rpython_output | |
392 | 412 | return rpython_main, None |
393 | 413 | |
394 | 414 |