| 19 | return _newSymbolTable(top, filename) |
| 20 | |
| 21 | class SymbolTableFactory: |
| 22 | def __init__(self): |
| 23 | self.__memo = weakref.WeakValueDictionary() |
| 24 | |
| 25 | def new(self, table, filename): |
| 26 | if table.type == _symtable.TYPE_FUNCTION: |
| 27 | return Function(table, filename) |
| 28 | if table.type == _symtable.TYPE_CLASS: |
| 29 | return Class(table, filename) |
| 30 | return SymbolTable(table, filename) |
| 31 | |
| 32 | def __call__(self, table, filename): |
| 33 | key = table, filename |
| 34 | obj = self.__memo.get(key, None) |
| 35 | if obj is None: |
| 36 | obj = self.__memo[key] = self.new(table, filename) |
| 37 | return obj |
| 38 | |
| 39 | _newSymbolTable = SymbolTableFactory() |
| 40 | |