diff options
author | Peter Wu <lekensteyn@gmail.com> | 2011-11-30 21:14:48 +0000 |
---|---|---|
committer | Peter Wu <lekensteyn@gmail.com> | 2011-11-30 21:14:48 +0000 |
commit | f8c1ccfac7fc22ba7d316a5b25ee58cd4d26a031 (patch) | |
tree | 7c4d17114218fc143eb0b80d0a25554f49c15662 /pp2cc.py | |
parent | 4ac454608da0616f4727c10e19161e47570b54db (diff) | |
download | pp2cc-f8c1ccfac7fc22ba7d316a5b25ee58cd4d26a031.tar.gz |
Support for array reference (both assignment and rvalue), update README
Diffstat (limited to 'pp2cc.py')
-rwxr-xr-x | pp2cc.py | 30 |
1 files changed, 24 insertions, 6 deletions
@@ -1131,8 +1131,12 @@ class Parse(object): linked_lval = LinkedNode(node.lvalue, linked_node) # this lvalue may be an expression if there is an indirection - if isinstance(node.lvalue, c_ast.UnaryOp) and node.lvalue.op == "*": - lvalue = self.parseExpression(linked_lval.node.expr, linked_lval) + if (linked_lval.type == "UnaryOp" and node.lvalue.op == "*" or + linked_lval.type == "ArrayRef"): + if linked_lval.type == "UnaryOp": + lvalue = self.parseExpression(linked_lval.node.expr, linked_lval) + else: + lvalue = self.parseExpression(linked_lval.node, linked_node) lvalue_result_reg = self.registers.find_register(lvalue) for line in lvalue: # if the right value register is modified, we need to pull @@ -1186,14 +1190,24 @@ class Parse(object): linked_type = LinkedNode(linked_node.node.type, linked_node) var_name = linked_node.variables.declName(linked_node.node.name, 1) if linked_type.type == "ArrayDecl": - size = self.determineConstValue(LinkedNode(linked_type.node.dim, + if linked_type.node.dim is not None: + size = self.determineConstValue(LinkedNode(linked_type.node.dim, linked_node)) + else: + size = None node_init = linked_node.node.init + # determine the array dimension based on the initializer if node_init and isinstance(node_init, c_ast.ExprList): real_size = len(node_init.exprs) - if real_size > size: + if size is None: + size = real_size + elif real_size > size: self.logger.warning("excess elements in array initializer", linked_node=linked_node) + # it's an error if the array dimension is unavailable, e.g.: + # int a[]; + if size is None: + raise RuntimeError("Array size missing in '{}'".format(var_name)) var_array = linked_node.variables.declName(var_name, size, prefix="arr") elif linked_type.type == "PtrDecl": @@ -1332,8 +1346,12 @@ class Parse(object): else: lines += index_expr - lines.append(self.asm.binary_op("LOAD", name_reg, - "[" + name_reg + "+" + index_reg + "]")) + if (linked_node.parent and linked_node.parent.type == "Assignment" and + linked_node.parent.node.lvalue is linked_node.node): + lines.append(self.asm.binary_op("ADD", name_reg, index_reg)) + else: + lines.append(self.asm.binary_op("LOAD", name_reg, + "[" + name_reg + "+" + index_reg + "]")) return lines def parseLabel(self, linked_node): lines = [] |