Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 41
Expand file tree
/
Copy pathinterp_Cproxy.py
More file actions
Latest commit
119 lines (111 loc) · 4.17 KB
/
Copy pathinterp_Cproxy.py
File metadata and controls
119 lines (111 loc) · 4.17 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
fromastimport*
frominterp_LdynimportTagged
frominterp_LlambdaimportClosureTuple
frominterp_CanyimportInterpCany
fromutilsimport*
classInterpCproxy(InterpCany):
defapply_fun(self, fun, args, e):
matchfun:
caseClosureTuple(elts, arity):
returnself.apply_fun(elts[0], [elts] +args, e)
case _:
returnsuper().apply_fun(fun, args, e)
deftype_to_tag(self, typ):
matchtyp:
caseProxyOrTupleType(elt_types):
return'tuple'
case _:
returnsuper().type_to_tag(typ)
definterp_getitem(self, aggregate, index):
matchaggregate:
caseProxiedTuple(tup, reads):
returnself.apply_fun(reads[index],
[self.interp_getitem(tup, index)], None)
caseProxiedList(lst, read, write):
returnself.apply_fun(read, [self.interp_getitem(lst, index)], None)
case _:
returnsuper().interp_getitem(aggregate, index)
definterp_setitem(self, aggregate, index, value):
matchaggregate:
caseProxiedList(lst, read, write):
value2=self.apply_fun(write, [value], None)
self.interp_setitem(lst, index, value2)
caseTagged(agg, tag):
self.interp_setitem(agg, index, value)
case _:
super().interp_setitem(aggregate, index, value)
definterp_len(self, aggregate):
matchaggregate:
caseProxiedTuple(tup, reads):
returnself.interp_len(tup)
caseProxiedList(lst, read, write):
returnself.interp_len(lst)
case _:
returnsuper().interp_len(aggregate)
definterp_exp(self, e, env):
matche:
caseTupleProxy(tup, reads, source, target):
reads_=self.interp_exp(reads, env)
returnProxiedTuple(self.interp_exp(tup, env), reads__)
caseListProxy(lst, read, write, source, target):
read_=self.interp_exp(read, env)
write_=self.interp_exp(write, env)
returnProxiedList(self.interp_exp(lst, env), read_, write_)
caseSubscript(tup, index, Load()):
t=self.interp_exp(tup, env)
n=self.interp_exp(index, env)
returnself.interp_getitem(t, n)
caseInjectTupleProxy(proxy, typ):
p=self.interp_exp(proxy, env)
returnProxiedTuple(p[0], p[1])
caseInjectTuple(tup):
returnself.interp_exp(tup, env)
caseInjectListProxy(proxy, typ):
p=self.interp_exp(proxy, env)
returnProxiedList(p[0], p[1], p[2])
caseInjectList(tup):
returnself.interp_exp(tup, env)
caseCall(Name('is_tuple_proxy'), [arg]):
p=self.interp_exp(arg, env)
matchp:
caseProxiedTuple(tup, reads):
returnTrue
case _:
returnFalse
caseCall(Name('is_array_proxy'), [arg]):
p=self.interp_exp(arg, env)
matchp:
caseProxiedList(tup, reads, writes):
returnTrue
case _:
returnFalse
caseCall(Name('proxy_array_get'), [arr, index]):
a=self.interp_exp(arr, env)
i=self.interp_exp(index, env)
returnself.interp_getitem(a, i)
caseCall(Name('proxy_tuple_load'), [tup, index]):
p=self.interp_exp(tup, env)
i=self.interp_exp(index, env)
returnself.interp_getitem(p, i)
caseCall(Name('proxy_array_load'), [tup, index]):
p=self.interp_exp(tup, env)
i=self.interp_exp(index, env)
returnself.interp_getitem(p, i)
caseCall(Name('proxy_array_store'), [tup, index, value]):
p=self.interp_exp(tup, env)
i=self.interp_exp(index, env)
v=self.interp_exp(value, env)
self.interp_setitem(p, i, v)
returnNone
caseCall(Name('project_array'), [array]):
returnself.interp_exp(array, env)
caseCall(Name('proxy_array_len'), [tup]):
t=self.interp_exp(tup, env)
returnself.interp_len(t)
caseCall(Name('proxy_tuple_len'), [tup]):
t=self.interp_exp(tup, env)
returnself.interp_len(t)
caseCall(Name('project_tuple'), [tup]):
returnself.interp_exp(tup, env)
case _:
returnsuper().interp_exp(e, env)