Esempio n. 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)
Esempio n. 2
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)
Esempio n. 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
Esempio n. 4
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