1
""" JavaScript type system
4
from pypy.rpython.ootypesystem import ootype
5
from pypy.rpython.lltypesystem import lltype
6
from pypy.translator.cli import oopspec
8
from pypy.rpython.lltypesystem.lltype import Signed, Unsigned, Void, Bool, Float
9
from pypy.rpython.lltypesystem.lltype import SignedLongLong, UnsignedLongLong, Primitive
10
from pypy.rpython.lltypesystem.lltype import Char, UniChar
11
from pypy.rpython.ootypesystem.ootype import String, _string, List, StaticMethod
12
from pypy.rlib.objectmodel import Symbolic
14
from pypy.translator.js.log import log
16
from types import FunctionType
17
from pypy.rpython.extfunc import is_external
22
from sets import Set as set
25
""" Class implementing JavaScript type system
26
calls with mapping similiar to cts
28
def __init__(self, db):
31
#def __class(self, name):
32
# return name.replace(".", "_")
34
def escape_name(self, name):
35
return name.replace('.', '_')
37
def llvar_to_cts(self, var):
38
return 'var ', var.name
40
def lltype_to_cts(self, t):
41
if isinstance(t, ootype.Instance):
42
self.db.pending_class(t)
43
return self.escape_name(t._name)
44
elif isinstance(t, ootype.List):
46
elif isinstance(t, lltype.Primitive):
48
elif isinstance(t, ootype.Record):
50
elif isinstance(t, ootype.String.__class__):
52
elif isinstance(t, ootype.Dict):
54
elif isinstance(t, ootype.DictItemsIterator):
56
elif t is ootype.StringBuilder:
57
return "StringBuilder"
59
raise NotImplementedError("Type %r" % (t,))
61
def graph_to_signature(self, graph, is_method = False, func_name = None):
62
func_name = func_name or self.db.get_uniquename(graph,graph.name)
64
args = [arg for arg in graph.getargs() if
65
arg.concretetype is not ootype.Void]
71
def method_signature(self, obj, name):
72
# TODO: use callvirt only when strictly necessary
73
if isinstance(obj, ootype.Instance):
74
owner, meth = obj._lookup(name)
76
return obj._name, METH.ARGS
77
elif isinstance(obj, ootype.BuiltinType):
78
meth = oopspec.get_method(obj, name)
79
class_name = self.lltype_to_cts(obj)
80
return class_name,meth.ARGS
84
def obj_name(self, obj):
85
return self.lltype_to_cts(obj)
87
def primitive_repr(self, _type, v):
95
elif isinstance(_type,String.__class__):
97
elif isinstance(_type,List):
98
# FIXME: It's not ok to use always empty list
100
elif isinstance(_type,StaticMethod):
101
if hasattr(v, 'graph') and not is_external(v):
102
self.db.pending_function(v.graph)
104
self.db.pending_abstract_function(v)
106
val = val.replace('.', '_')
109
elif _type is UniChar or _type is Char:
110
#log("Constant %r"%v)
112
if s.startswith('u'):
117
elif isinstance(v, Symbolic):
119
elif isinstance(_type, Primitive):
120
#log("Type: %r"%_type)
123
assert False, "Unknown constant %r"%_type
127
#def lltype_to_cts(self, t, include_class=True):
129
## if isinstance(t, ootype.Instance):
130
## self.db.pending_class(t)
131
## return self.__class(t._name, include_class)
132
## elif isinstance(t, ootype.Record):
133
## name = self.db.pending_record(t)
134
## return self.__class(name, include_class)
135
## elif isinstance(t, ootype.StaticMethod):
136
## return 'void' # TODO: is it correct to ignore StaticMethod?
137
## elif isinstance(t, ootype.List):
138
## item_type = self.lltype_to_cts(t._ITEMTYPE)
139
## return self.__class(PYPY_LIST % item_type, include_class)
140
## elif isinstance(t, ootype.Dict):
141
## key_type = self.lltype_to_cts(t._KEYTYPE)
142
## value_type = self.lltype_to_cts(t._VALUETYPE)
143
## return self.__class(PYPY_DICT % (key_type, value_type), include_class)
144
## elif isinstance(t, ootype.DictItemsIterator):
145
## key_type = self.lltype_to_cts(t._KEYTYPE)
146
## value_type = self.lltype_to_cts(t._VALUETYPE)
147
## return self.__class(PYPY_DICT_ITEMS_ITERATOR % (key_type, value_type), include_class)
149
## return _get_from_dict(_lltype_to_cts, t, 'Unknown type %s' % t)