PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/translator/cli/database.py

https://github.com/lalitjsraks/pypy
Python | 160 lines | 139 code | 19 blank | 2 comment | 30 complexity | 44012119ac0c955b5fdd00ce3293d1ec MD5 | raw file
  1. import operator
  2. import string
  3. from pypy.translator.cli.function import Function, log
  4. from pypy.translator.cli.class_ import Class
  5. from pypy.translator.cli.record import Record
  6. from pypy.translator.cli.delegate import Delegate
  7. from pypy.translator.cli.comparer import EqualityComparer
  8. from pypy.translator.cli.node import Node
  9. from pypy.translator.cli.support import string_literal, Counter
  10. from pypy.translator.cli.cts import types
  11. from pypy.rpython.ootypesystem import ootype
  12. from pypy.rpython.ootypesystem.module import ll_os, ll_math
  13. from pypy.rpython.ootypesystem.rtupletype import TUPLE_TYPE
  14. from pypy.translator.cli import dotnet
  15. from pypy.rlib.objectmodel import CDefinedIntSymbolic
  16. from pypy.translator.oosupport.database import Database as OODatabase
  17. try:
  18. set
  19. except NameError:
  20. from sets import Set as set
  21. BUILTIN_RECORDS = {
  22. TUPLE_TYPE([ootype.Signed, ootype.Signed]):
  23. '[pypylib]pypy.runtime.Record_Signed_Signed',
  24. TUPLE_TYPE([ootype.String, ootype.String]):
  25. '[pypylib]pypy.runtime.Record_String_String',
  26. ll_math.FREXP_RESULT: '[pypylib]pypy.runtime.Record_Float_Signed',
  27. ll_math.MODF_RESULT: '[pypylib]pypy.runtime.Record_Float_Float',
  28. ll_os.STAT_RESULT: '[pypylib]pypy.runtime.Record_Stat_Result',
  29. }
  30. class LowLevelDatabase(OODatabase):
  31. def __init__(self, genoo):
  32. OODatabase.__init__(self, genoo)
  33. self.classes = {} # INSTANCE --> class_name
  34. self.classnames = set() # (namespace, name)
  35. self.recordnames = {} # RECORD --> name
  36. self.functions = {} # graph --> function_name
  37. self.methods = {} # graph --> method_name
  38. self.consts = {} # value --> AbstractConst
  39. self.delegates = {} # StaticMethod --> type_name
  40. self.const_count = Counter() # store statistics about constants
  41. def next_count(self):
  42. return self.unique()
  43. def _default_record_name(self, RECORD):
  44. trans = string.maketrans('[]<>(), :', '_________')
  45. name = ['Record']
  46. # XXX: refactor this: we need a proper way to ensure unique names
  47. for f_name, (FIELD_TYPE, f_default) in RECORD._fields.iteritems():
  48. type_name = FIELD_TYPE._short_name().translate(trans)
  49. name.append(f_name)
  50. name.append(type_name)
  51. return '__'.join(name)
  52. def _default_class_name(self, INSTANCE):
  53. parts = INSTANCE._name.rsplit('.', 1)
  54. if len(parts) == 2:
  55. return parts
  56. else:
  57. return None, parts[0]
  58. def pending_function(self, graph, functype=None):
  59. if functype is None:
  60. function = self.genoo.Function(self, graph)
  61. else:
  62. function = functype(self, graph)
  63. self.pending_node(function)
  64. return function.get_name()
  65. def pending_class(self, INSTANCE):
  66. try:
  67. return self.classes[INSTANCE]
  68. except KeyError:
  69. pass
  70. if isinstance(INSTANCE, dotnet.NativeInstance):
  71. self.classes[INSTANCE] = INSTANCE._name
  72. return INSTANCE._name
  73. else:
  74. namespace, name = self._default_class_name(INSTANCE)
  75. name = self.get_unique_class_name(namespace, name)
  76. if namespace is None:
  77. full_name = name
  78. else:
  79. full_name = '%s.%s' % (namespace, name)
  80. self.classes[INSTANCE] = full_name
  81. cls = Class(self, INSTANCE, namespace, name)
  82. self.pending_node(cls)
  83. return full_name
  84. def pending_record(self, RECORD):
  85. try:
  86. return BUILTIN_RECORDS[RECORD]
  87. except KeyError:
  88. pass
  89. try:
  90. return self.recordnames[RECORD]
  91. except KeyError:
  92. pass
  93. name = self._default_record_name(RECORD)
  94. name = self.get_unique_class_name(None, name)
  95. self.recordnames[RECORD] = name
  96. r = Record(self, RECORD, name)
  97. self.pending_node(r)
  98. return name
  99. def record_function(self, graph, name):
  100. self.functions[graph] = name
  101. def graph_name(self, graph):
  102. # XXX: graph name are not guaranteed to be unique
  103. return self.functions.get(graph, None)
  104. def get_unique_class_name(self, namespace, name):
  105. base_name = name
  106. i = 0
  107. while (namespace, name) in self.classnames:
  108. name = '%s_%d' % (base_name, i)
  109. i+= 1
  110. self.classnames.add((namespace, name))
  111. return name
  112. def class_or_record_name(self, TYPE):
  113. if TYPE is not ootype.ROOT and isinstance(TYPE, ootype.Instance):
  114. return self.class_name(TYPE)
  115. elif isinstance(TYPE, ootype.Record):
  116. return self.get_record_name(TYPE)
  117. elif isinstance(TYPE, ootype.OOType):
  118. return self.cts.lltype_to_cts(TYPE)
  119. else:
  120. assert False
  121. def class_name(self, INSTANCE):
  122. if INSTANCE is ootype.ROOT:
  123. return types.object.classname()
  124. try:
  125. NATIVE_INSTANCE = INSTANCE._hints['NATIVE_INSTANCE']
  126. return NATIVE_INSTANCE._name
  127. except KeyError:
  128. return self.classes[INSTANCE]
  129. def get_record_name(self, RECORD):
  130. try:
  131. return BUILTIN_RECORDS[RECORD]
  132. except KeyError:
  133. return self.recordnames[RECORD]
  134. def record_delegate(self, TYPE):
  135. try:
  136. return self.delegates[TYPE]
  137. except KeyError:
  138. name = 'StaticMethod__%d' % len(self.delegates)
  139. self.delegates[TYPE] = name
  140. self.pending_node(Delegate(self, TYPE, name))
  141. return name