Lib/compiler/misc.py (47 lines of code) (raw):
# Portions copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
# pyre-unsafe
class Set:
def __init__(self):
self.elts = {}
def __len__(self):
return len(self.elts)
def __contains__(self, elt):
return elt in self.elts
def add(self, elt):
self.elts[elt] = elt
def elements(self):
return self.elts.keys()
def has_elt(self, elt):
return elt in self.elts
def remove(self, elt):
del self.elts[elt]
def copy(self):
c = Set()
c.elts.update(self.elts)
return c
class Stack(list):
def push(self, elt):
self.append(elt)
def top(self):
return self[-1]
MANGLE_LEN = 256 # magic constant from compile.c
def mangle(name, klass):
if klass is None:
return name
if not name.startswith("__"):
return name
if len(name) + 2 >= MANGLE_LEN:
return name
# TODO: Probably need to split and mangle recursively?
if "." in name:
return name
if name.endswith("__"):
return name
try:
i = 0
while klass[i] == "_":
i = i + 1
except IndexError:
return name
klass = klass[i:]
tlen = len(klass) + len(name)
if tlen > MANGLE_LEN:
klass = klass[: MANGLE_LEN - tlen]
return "_%s%s" % (klass, name)