Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 43aaee31 authored by Jack Palevich's avatar Jack Palevich
Browse files

Support the comma operator.

parent 0c017748
Loading
Loading
Loading
Loading
+15 −6
Original line number Diff line number Diff line
@@ -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(';');
        }
    }
+35 −0
Original line number Diff line number Diff line
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;
}
+10 −0
Original line number Diff line number Diff line
@@ -352,6 +352,16 @@ result: 0""", """2 *= 5 10
17&= 1  1
17^= 1  16
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__':