def BinOpNode(self, node, scope, t, tlevel): if node.op == "=": self.AssignNode(node, scope, t, tlevel) return if node.op == ".": t1 = resolve_type(self.typespace, node[0], scope) t2 = resolve_type(self.typespace, node[1], scope) base = node[0] while type(base) not in [VarDeclNode, IdentNode]: base = base[0] if type(t1) == TypedClassNode and type(node[1]) == IdentNode: scope = dict(scope) scope[node[1].val] = t1.childmap[node[1].val] node.parent.replace(node, self.var_transform(t1, base, node[1].val)) return t(node[0], scope, tlevel) t(node[1], scope, tlevel)
def type_size(node, typespace): size = 0 basesize = 0 t = resolve_type(typespace, node, {}) print(t, "s") if type(t) == StaticArrNode: n = t size = 1 while type(n) == StaticArrNode: size *= n.size n = n[0] size2, basesize = type_size(n, typespace) if basesize > 4: basesize = 8 size *= size2 elif type(t) == BuiltinTypeNode: if t.type in ["float", "int"]: size = 4 elif t.type in ["double", "long long"]: size = 8 elif t.type in ["char", "byte"]: size = 1 else: typespace.error("Invalid builtin type " + t.type, node) basesize = size elif type(t) == TypedClassNode: if t.size == None: layout_class(t, typespace) size = t.size #typed classes are four-byte-aligned *if* #their size is four bytes or less, otherwise #they are eight byte aligned. basesize = 4 if size <= 4 else 8 return size, basesize