-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathargument.py
More file actions
126 lines (104 loc) · 3.79 KB
/
argument.py
File metadata and controls
126 lines (104 loc) · 3.79 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
"""
Arguments objects.
"""
from rpython.flowspace.model import const
class Signature(object):
_immutable_ = True
_immutable_fields_ = ["argnames[*]"]
__slots__ = ("argnames", "varargname", "kwargname")
def __init__(self, argnames, varargname=None, kwargname=None):
self.argnames = argnames
self.varargname = varargname
self.kwargname = kwargname
def find_argname(self, name):
try:
return self.argnames.index(name)
except ValueError:
return -1
def num_argnames(self):
return len(self.argnames)
def has_vararg(self):
return self.varargname is not None
def has_kwarg(self):
return self.kwargname is not None
def scope_length(self):
scopelen = len(self.argnames)
scopelen += self.has_vararg()
scopelen += self.has_kwarg()
return scopelen
def getallvarnames(self):
argnames = self.argnames
if self.varargname is not None:
argnames = argnames + [self.varargname]
if self.kwargname is not None:
argnames = argnames + [self.kwargname]
return argnames
def __repr__(self):
return "Signature(%r, %r, %r)" % (
self.argnames, self.varargname, self.kwargname)
def __eq__(self, other):
if not isinstance(other, Signature):
return NotImplemented
return (self.argnames == other.argnames and
self.varargname == other.varargname and
self.kwargname == other.kwargname)
def __ne__(self, other):
if not isinstance(other, Signature):
return NotImplemented
return not self == other
# make it look tuply for its use in the annotator
def __len__(self):
return 3
def __getitem__(self, i):
if i == 0:
return self.argnames
if i == 1:
return self.varargname
if i == 2:
return self.kwargname
raise IndexError
class CallSpec(object):
"""Represents the arguments passed into a function call, i.e. the
`a, b, *c, **d` part in `return func(a, b, *c, **d)`.
"""
def __init__(self, args_w, keywords=None, w_stararg=None):
self.w_stararg = w_stararg
assert isinstance(args_w, list)
self.arguments_w = args_w
self.keywords = keywords or {}
def __repr__(self):
""" NOT_RPYTHON """
name = self.__class__.__name__
if not self.keywords:
return '%s(%s)' % (name, self.arguments_w,)
else:
return '%s(%s, %s)' % (name, self.arguments_w, self.keywords)
def flatten(self):
""" Argument <-> list of w_objects together with "shape" information """
shape_cnt, shape_keys, shape_star = self._rawshape()
data_w = self.arguments_w + [self.keywords[key] for key in shape_keys]
if shape_star:
data_w.append(self.w_stararg)
return (shape_cnt, shape_keys, shape_star), data_w
def _rawshape(self):
shape_cnt = len(self.arguments_w)
shape_keys = tuple(sorted(self.keywords))
shape_star = self.w_stararg is not None # Flag: presence of *arg
return shape_cnt, shape_keys, shape_star
def as_list(self):
assert not self.keywords
if self.w_stararg is None:
return self.arguments_w
else:
return self.arguments_w + [const(x) for x in self.w_stararg.value]
@classmethod
def fromshape(cls, (shape_cnt, shape_keys, shape_star), data_w):
args_w = data_w[:shape_cnt]
p = end_keys = shape_cnt + len(shape_keys)
if shape_star:
w_star = data_w[p]
p += 1
else:
w_star = None
return cls(args_w, dict(zip(shape_keys, data_w[shape_cnt:end_keys])),
w_star)