From 6cc572439564a32f7e80b6cc8eba02b233976f62 Mon Sep 17 00:00:00 2001 From: "zik.saleeba" Date: Wed, 21 Jul 2010 05:45:44 +0000 Subject: [PATCH] Added fix from Duncan Forster for bug #85 git-svn-id: http://picoc.googlecode.com/svn/trunk@468 21eae674-98b7-11dd-bd71-f92a316d2d60 --- expression.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/expression.c b/expression.c index 54ec890..1ba2db9 100644 --- a/expression.c +++ b/expression.c @@ -771,6 +771,24 @@ void ExpressionInfixOperator(struct ParseState *Parser, struct ExpressionStack * ExpressionAssign(Parser, BottomValue, TopValue, FALSE, NULL, 0, FALSE); ExpressionStackPushValueNode(Parser, StackTop, BottomValue); } + else if (Op == TokenAddAssign || Op == TokenSubtractAssign) + { + /* pointer arithmetic */ + int Size = TypeSize(BottomValue->Typ->FromType, 0, TRUE); + + Pointer = BottomValue->Val->Pointer; + if (Pointer == NULL) + ProgramFail(Parser, "invalid use of a NULL pointer"); + + if (Op == TokenAddAssign) + Pointer = (void *)((char *)Pointer + TopInt * Size); + else + Pointer = (void *)((char *)Pointer - TopInt * Size); + + HeapUnpopStack(sizeof(struct Value)); /* XXX - possible bug if lvalue is a temp value and takes more than sizeof(struct Value) */ + BottomValue->Val->Pointer = Pointer; + ExpressionStackPushValueNode(Parser, StackTop, BottomValue); + } else ProgramFail(Parser, "invalid operation"); }