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

Commit ba4dea81 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge changes 4101,4102

* changes:
  Allow local variables to be declared anywhere in a block.
  Support variable initialization.
parents b96ebd7e a1804dde
Loading
Loading
Loading
Loading
+42 −18
Original line number Diff line number Diff line
@@ -2254,8 +2254,9 @@ class Compiler : public ErrorSink {
                next();
            } else if (t == EOF ) {
                error("Unexpected EOF.");
            } else if (t < TOK_UNDEFINED_SYMBOL) {
                error("Unexpected symbol or keyword");
            } else if (!checkSymbol(t, &tString)) {
                // Don't have to do anything special here, the error
                // message was printed by checkSymbol() above.
            } else {
                if (t == TOK_UNDEFINED_SYMBOL) {
                    t = (intptr_t) mSymbolTable.addGlobal(
@@ -2370,7 +2371,10 @@ class Compiler : public ErrorSink {
    void block(intptr_t l, bool outermostFunctionBlock) {
        intptr_t a, n, t;

        if (tok == TOK_IF) {
        if (tok == TOK_INT || tok == TOK_CHAR) {
            /* declarations */
            localDeclarations();
        } else if (tok == TOK_IF) {
            next();
            skip('(');
            a = test_expr();
@@ -2418,8 +2422,6 @@ class Compiler : public ErrorSink {
                mSymbolTable.pushLevel();
            }
            next();
            /* declarations */
            localDeclarations();
            while (tok != '}' && tok != EOF)
                block(l, false);
            skip('}');
@@ -2524,14 +2526,22 @@ class Compiler : public ErrorSink {
        while (acceptType(base)) {
            while (tok != ';' && tok != EOF) {
                Type t = acceptPointerDeclaration(t);
                int variableAddress = 0;
                if (checkSymbol()) {
                    addLocalSymbol();
                    if (tok) {
                        loc = loc + 4;
                        *(int *) tok = -loc;
                        variableAddress = -loc;
                        ((VariableInfo*) tok)->pAddress = (void*) variableAddress;
                    }
                }
                next();
                if (tok == '=') {
                    /* assignment */
                    next();
                    expr();
                    pGen->storeR0(variableAddress);
                }
                if (tok == ',')
                    next();
            }
@@ -2540,27 +2550,30 @@ class Compiler : public ErrorSink {
    }

    bool checkSymbol() {
        bool result = isSymbol();
        return checkSymbol(tok, &mTokenString);
    }

    bool checkSymbol(int token, String* pText) {
        bool result = token < EOF || token >= TOK_UNDEFINED_SYMBOL;
        if (!result) {
            String temp;
            if (tok >= 0 && tok < 256) {
                temp.printf("char \'%c\'", tok);
            } else if (tok >= TOK_KEYWORD && tok < TOK_UNSUPPORTED_KEYWORD) {
                temp.printf("keyword \"%s\"", mTokenString.getUnwrapped());
            if (token == EOF ) {
                temp.printf("EOF");
            } else if (token == TOK_NUM) {
                temp.printf("numeric constant");
            } else if (token >= 0 && token < 256) {
                temp.printf("char \'%c\'", token);
            } else if (token >= TOK_KEYWORD && token < TOK_UNSUPPORTED_KEYWORD) {
                temp.printf("keyword \"%s\"", pText->getUnwrapped());
            } else {
                temp.printf("reserved keyword \"%s\"",
                            mTokenString.getUnwrapped());
                            pText->getUnwrapped());
            }
            error("Expected symbol. Got %s", temp.getUnwrapped());
        }
        return result;
    }

    /* Is a possibly undefined symbol */
    bool isSymbol() {
        return tok < EOF || tok >= TOK_UNDEFINED_SYMBOL;
    }

    void globalDeclarations() {
        while (tok != EOF) {
            Type base;
@@ -2579,12 +2592,23 @@ class Compiler : public ErrorSink {
                      mTokenString.getUnwrapped());
            }
            next();
            if (tok == ',' || tok == ';') {
            if (tok == ',' || tok == ';' || tok == '=') {
                // it's a variable declaration
                for(;;) {
                    if (name) {
                        name->pAddress = (int*) allocGlobalSpace(4);
                    }
                    if (tok == '=') {
                        next();
                        if (tok == TOK_NUM) {
                            if (name) {
                                * (int*) name->pAddress = tokc;
                            }
                            next();
                        } else {
                            error("Expected an integer constant");
                        }
                    }
                    if (tok != ',') {
                        break;
                    }