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_Lproxy.py
More file actions
Latest commit
99 lines (94 loc) · 3.47 KB
/
Copy pathinterp_Lproxy.py
File metadata and controls
99 lines (94 loc) · 3.47 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
fromastimport*
frominterp_LfunimportFunction
frominterp_LlambdaimportInterpLlambda, ClosureTuple
frominterp_LdynimportTagged
frominterp_LcastimportInterpLcast
fromutilsimport*
classInterpLproxy(InterpLcast):
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'
caseProxyOrListType(elt_type):
return'tuple'# ?
caseListType(elt_type): # move to different file?
return'tuple'
case _:
returnsuper().type_to_tag(typ)
definterp_exp(self, e, env):
matche:
caseRawTuple(es):
return [self.interp_exp(e, env) foreines]
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_)
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(lst, read, write):
returnTrue
case _:
returnFalse
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_tuple_len'), [tup]):
t=self.interp_exp(tup, env)
returnself.interp_len(t)
caseCall(Name('proxy_array_len'), [tup]):
t=self.interp_exp(tup, env)
returnself.interp_len(t)
caseCall(Name('proxy_array_load'), [arr, index]):
a=self.interp_exp(arr, env)
i=self.interp_exp(index, env)
returnself.interp_getitem(a, i)
caseCall(Name('proxy_array_store'), [arr, index, value]):
a=self.interp_exp(arr, env)
i=self.interp_exp(index, env)
v=self.interp_exp(value, env)
self.interp_setitem(a, i, v)
returnNone
caseCall(Name('project_array'), [array]):
returnself.interp_exp(array, env)
caseCall(Name('project_tuple'), [tup]):
returnself.interp_exp(tup, env)
case _:
returnsuper().interp_exp(e, env)
definterp_stmt(self, s, env, cont):
matchs:
caseAssign([Call(Name('any_load'), [tup, index])], value):
t=self.interp_exp(tup, env)
i=self.interp_exp(index, env)
v=self.interp_exp(value, env)
self.interp_setitem(t, i, v)
returnself.interp_stmts(cont, env)
case _:
returnsuper().interp_stmt(s, env, cont)