コード例 #1
0
 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)
コード例 #2
0
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
コード例 #3
0
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