compiler.llvm_ir_generator: fix string quoting.

This commit is contained in:
whitequark 2017-02-28 20:59:15 +00:00
parent 3f556a3f58
commit 252cda6e7f
1 changed files with 17 additions and 6 deletions

View File

@ -1412,6 +1412,7 @@ class LLVMIRGenerator:
llglobal.linkage = "private" llglobal.linkage = "private"
return llglobal return llglobal
fail_msg = "at " + ".".join(path())
if types.is_constructor(typ) or types.is_instance(typ): if types.is_constructor(typ) or types.is_instance(typ):
if types.is_instance(typ): if types.is_instance(typ):
# Make sure the class functions are quoted, as this has the side effect of # Make sure the class functions are quoted, as this has the side effect of
@ -1422,19 +1423,29 @@ class LLVMIRGenerator:
elif types.is_module(typ): elif types.is_module(typ):
return _quote_attributes() return _quote_attributes()
elif builtins.is_none(typ): elif builtins.is_none(typ):
assert value is None assert value is None, fail_msg
return ll.Constant.literal_struct([]) return ll.Constant.literal_struct([])
elif builtins.is_bool(typ): elif builtins.is_bool(typ):
assert value in (True, False) assert value in (True, False), fail_msg
return ll.Constant(llty, value) return ll.Constant(llty, value)
elif builtins.is_int(typ): elif builtins.is_int(typ):
assert isinstance(value, (int, numpy.int32, numpy.int64)) assert isinstance(value, (int, numpy.int32, numpy.int64)), fail_msg
return ll.Constant(llty, int(value)) return ll.Constant(llty, int(value))
elif builtins.is_float(typ): elif builtins.is_float(typ):
assert isinstance(value, float) assert isinstance(value, float), fail_msg
return ll.Constant(llty, value) return ll.Constant(llty, value)
elif builtins.is_str(typ):
assert isinstance(value, (str, bytes)), fail_msg
if isinstance(value, str):
as_bytes = value.encode("utf-8")
else:
as_bytes = value
llstr = self.llstr_of_str(as_bytes)
llconst = ll.Constant(llty, [llstr, ll.Constant(lli32, len(as_bytes))])
return llconst
elif builtins.is_listish(typ): elif builtins.is_listish(typ):
assert isinstance(value, (str, bytes, list, numpy.ndarray)) assert isinstance(value, (list, numpy.ndarray)), fail_msg
elt_type = builtins.get_iterable_elt(typ) elt_type = builtins.get_iterable_elt(typ)
llelts = [self._quote(value[i], elt_type, lambda: path() + [str(i)]) llelts = [self._quote(value[i], elt_type, lambda: path() + [str(i)])
for i in range(len(value))] for i in range(len(value))]
@ -1463,7 +1474,7 @@ class LLVMIRGenerator:
return ll.Constant(llty, [llclosure, llself]) return ll.Constant(llty, [llclosure, llself])
else: else:
print(typ) print(typ)
assert False assert False, fail_msg
def process_Quote(self, insn): def process_Quote(self, insn):
assert self.embedding_map is not None assert self.embedding_map is not None