Track lvalues vs. rvalues.
diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index 2a7d66e..250f489 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -144,6 +144,20 @@
Type* pTail;
};
+ enum ExpressionType {
+ ET_RVALUE,
+ ET_LVALUE
+ };
+
+ struct ExpressionValue {
+ ExpressionValue() {
+ et = ET_RVALUE;
+ pType = NULL;
+ }
+ ExpressionType et;
+ Type* pType;
+ };
+
class CodeBuf {
char* ind; // Output code pointer
char* pProgramBase;
@@ -468,7 +482,7 @@
virtual size_t stackSizeOf(Type* pType) = 0;
virtual Type* getR0Type() {
- return mExpressionStack.back();
+ return mExpressionStack.back().pType;
}
protected:
@@ -510,15 +524,20 @@
}
void setR0Type(Type* pType) {
- mExpressionStack.back() = pType;
+ mExpressionStack.back().pType = pType;
}
Type* getTOSType() {
- return mExpressionStack[mExpressionStack.size()-2];
+ return mExpressionStack[mExpressionStack.size()-2].pType;
}
void pushType() {
- mExpressionStack.push_back(NULL);
+ if (mExpressionStack.size()) {
+ mExpressionStack.push_back(mExpressionStack.back());
+ } else {
+ mExpressionStack.push_back(ExpressionValue());
+ }
+
}
void popType() {
@@ -551,7 +570,7 @@
Type* mkpInt;
private:
- Vector<Type*> mExpressionStack;
+ Vector<ExpressionValue> mExpressionStack;
CodeBuf* pCodeBuf;
ErrorSink* mErrorSink;
};