this repo has no description
1# Portions copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
2# pyre-unsafe
3
4
5class Set:
6 def __init__(self):
7 self.elts = {}
8
9 def __len__(self):
10 return len(self.elts)
11
12 def __contains__(self, elt):
13 return elt in self.elts
14
15 def add(self, elt):
16 self.elts[elt] = elt
17
18 def elements(self):
19 return self.elts.keys()
20
21 def has_elt(self, elt):
22 return elt in self.elts
23
24 def remove(self, elt):
25 del self.elts[elt]
26
27 def copy(self):
28 c = Set()
29 c.elts.update(self.elts)
30 return c
31
32
33class Stack(list):
34 def push(self, elt):
35 self.append(elt)
36
37 def top(self):
38 return self[-1]
39
40
41MANGLE_LEN = 256 # magic constant from compile.c
42
43
44def mangle(name, klass):
45 if klass is None:
46 return name
47 if not name.startswith("__"):
48 return name
49 if len(name) + 2 >= MANGLE_LEN:
50 return name
51 # TODO: Probably need to split and mangle recursively?
52 if "." in name:
53 return name
54 if name.endswith("__"):
55 return name
56 try:
57 i = 0
58 while klass[i] == "_":
59 i = i + 1
60 except IndexError:
61 return name
62 klass = klass[i:]
63
64 tlen = len(klass) + len(name)
65 if tlen > MANGLE_LEN:
66 klass = klass[: MANGLE_LEN - tlen]
67
68 return "_%s%s" % (klass, name)