aboutsummaryrefslogtreecommitdiffstats
path: root/libacc
diff options
context:
space:
mode:
authorJack Palevich <jackpal@google.com>2009-07-15 18:23:22 -0700
committerJack Palevich <jackpal@google.com>2009-07-15 18:23:22 -0700
commitd1f57e689b703faa46d26decb1758a6f0330e9ec (patch)
treeb0bbb3021a2a77ce7966439b903f9017902069c9 /libacc
parent2aaf21f1beefeaa91de8f21a96223c739f48cf88 (diff)
downloadsystem_core-d1f57e689b703faa46d26decb1758a6f0330e9ec.tar.gz
system_core-d1f57e689b703faa46d26decb1758a6f0330e9ec.tar.bz2
system_core-d1f57e689b703faa46d26decb1758a6f0330e9ec.zip
Improve error handling
Don't segfault if the right-hand operand of a binary operator is missing. Don't segfault if a semicolon is missing at the end of a forward declaration.
Diffstat (limited to 'libacc')
-rw-r--r--libacc/acc.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index a84bd910..c527a96f 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -3910,6 +3910,8 @@ class Compiler : public ErrorSink {
next();
} else if (t == EOF ) {
error("Unexpected EOF.");
+ } else if (t == ';') {
+ error("Unexpected ';'");
} else if (!checkSymbol(t)) {
// Don't have to do anything special here, the error
// message was printed by checkSymbol() above.
@@ -4038,7 +4040,12 @@ class Compiler : public ErrorSink {
} else {
pGen->pushR0();
binaryOp(level);
-
+ // Check for syntax error.
+ if (pGen->getR0Type() == NULL) {
+ // We failed to parse a right-hand argument.
+ // Push a dummy value so we don't fail
+ pGen->li(0, mkpInt);
+ }
if ((level == 4) | (level == 5)) {
pGen->gcmp(t, mkpInt);
} else {
@@ -4595,6 +4602,8 @@ class Compiler : public ErrorSink {
// Function declaration
if (accept(';')) {
// forward declaration.
+ } else if (tok != '{') {
+ error("expected '{'");
} else {
if (name) {
/* patch forward references (XXX: does not work for function