summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndroid (Google) Code Review <android-gerrit@google.com>2009-07-31 15:29:42 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2009-07-31 15:29:42 -0700
commite62b6ea3e0094f244ea9756da0d094f2dbe50955 (patch)
treed6d458307d6992825a8b39c4f12ce9577562531e
parent95f2af6d232b192ffeaef2c0b5fe5678c348a7aa (diff)
parent43aaee31b9cedc059213396f1e7aa420ace0c797 (diff)
downloadsystem_core-e62b6ea3e0094f244ea9756da0d094f2dbe50955.zip
system_core-e62b6ea3e0094f244ea9756da0d094f2dbe50955.tar.gz
system_core-e62b6ea3e0094f244ea9756da0d094f2dbe50955.tar.bz2
Merge change 9399
* changes: Support the comma operator.
-rw-r--r--libacc/acc.cpp21
-rw-r--r--libacc/tests/data/comma.c35
-rw-r--r--libacc/tests/test.py10
3 files changed, 60 insertions, 6 deletions
diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index 823849c..da703a7 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -3868,7 +3868,7 @@ class Compiler : public ErrorSink {
pGen->forceR0RVal();
pGen->convertR0(pCast);
} else {
- expr();
+ commaExpr();
skip(')');
}
} else if (t == '*') {
@@ -4076,12 +4076,21 @@ class Compiler : public ErrorSink {
}
}
+ void commaExpr() {
+ for(;;) {
+ expr();
+ if (!accept(',')) {
+ break;
+ }
+ }
+ }
+
void expr() {
binaryOp(11);
}
int test_expr() {
- expr();
+ commaExpr();
pGen->forceR0RVal();
return pGen->gtst(0, 0);
}
@@ -4117,7 +4126,7 @@ class Compiler : public ErrorSink {
a = test_expr();
} else {
if (tok != ';')
- expr();
+ commaExpr();
skip(';');
n = codeBuf.getPC();
a = 0;
@@ -4126,7 +4135,7 @@ class Compiler : public ErrorSink {
skip(';');
if (tok != ')') {
t = pGen->gjmp(0);
- expr();
+ commaExpr();
pGen->gjmp(n - codeBuf.getPC() - pGen->jumpOffset());
pGen->gsym(t);
n = t + 4;
@@ -4150,7 +4159,7 @@ class Compiler : public ErrorSink {
} else {
if (accept(TOK_RETURN)) {
if (tok != ';') {
- expr();
+ commaExpr();
pGen->forceR0RVal();
if (pReturnType->tag == TY_VOID) {
error("Must not return a value from a void function");
@@ -4166,7 +4175,7 @@ class Compiler : public ErrorSink {
} else if (accept(TOK_BREAK)) {
*(int *) l = pGen->gjmp(*(int *) l);
} else if (tok != ';')
- expr();
+ commaExpr();
skip(';');
}
}
diff --git a/libacc/tests/data/comma.c b/libacc/tests/data/comma.c
new file mode 100644
index 0000000..496944c
--- /dev/null
+++ b/libacc/tests/data/comma.c
@@ -0,0 +1,35 @@
+int testReturn() {
+ return 10, 20, 30;
+}
+
+int testArg(int a) {
+ return a;
+}
+
+void testComma() {
+ int a;
+ 0, a = 10,20;
+ printf("statement: %d\n", a);
+ a = 1;
+ if (a = 0, 1) {
+ printf("if: a = %d\n", a);
+ }
+ int b = 0;
+ a = 10;
+ while(b++,a--) {}
+ printf("while: b = %d\n", b);
+ b = 0;
+ for(b++,a = 0;b++, a < 10; b++, a++) {}
+ printf("for: b = %d\n", b);
+ b = testReturn();
+ printf("return: %d\n", b);
+ b = testArg((a,12));
+ printf("arg: %d\n", b);
+}
+
+
+
+int main() {
+ testComma();
+ return 0;
+}
diff --git a/libacc/tests/test.py b/libacc/tests/test.py
index 239bb9b..5f9a71e 100644
--- a/libacc/tests/test.py
+++ b/libacc/tests/test.py
@@ -354,6 +354,16 @@ result: 0""", """2 *= 5 10
16|= 1 17
""")
+ def testcomma(self):
+ self.compileCheck(["-R", "data/comma.c"], """Executing compiled code:
+result: 0""", """statement: 10
+if: a = 0
+while: b = 11
+for: b = 22
+return: 30
+arg: 12
+""")
+
if __name__ == '__main__':
if not outputCanRun():
print "Many tests are expected to fail, because acc is not a 32-bit x86 Linux executable."