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

Commit b1544cad authored by Jack Palevich's avatar Jack Palevich
Browse files

Detect assignments to undeclared variables.

Previously we only detected reading from undefined variables.
parent ce105a90
Loading
Loading
Loading
Loading
+27 −13
Original line number Original line Diff line number Diff line
@@ -3832,11 +3832,28 @@ class Compiler : public ErrorSink {
        return false;
        return false;
    }
    }


    void linkGlobal(tokenid_t t, bool isFunction) {
        VariableInfo* pVI = VI(t);
        void* n = NULL;
        if (mpSymbolLookupFn) {
            n = mpSymbolLookupFn(mpSymbolLookupContext, nameof(t));
        }
        if (pVI->pType == NULL) {
            if (isFunction) {
                pVI->pType = mkpIntFn;
            } else {
                pVI->pType = mkpInt;
            }
        }
        pVI->pAddress = n;
    }

    /* Parse and evaluate a unary expression.
    /* Parse and evaluate a unary expression.
     * allowAssignment is true if '=' parsing wanted (quick hack)
     * allowAssignment is true if '=' parsing wanted (quick hack)
     */
     */
    void unary(bool allowAssignment) {
    void unary(bool allowAssignment) {
        intptr_t n, t, a;
        tokenid_t t;
        intptr_t n, a;
        t = 0;
        t = 0;
        n = 1; /* type of expression 0 = forward, 1 = value, other = lvalue */
        n = 1; /* type of expression 0 = forward, 1 = value, other = lvalue */
        if (acceptStringLiteral()) {
        if (acceptStringLiteral()) {
@@ -3924,18 +3941,11 @@ class Compiler : public ErrorSink {
                n = (intptr_t) pVI->pAddress;
                n = (intptr_t) pVI->pAddress;
                /* forward reference: try our lookup function */
                /* forward reference: try our lookup function */
                if (!n) {
                if (!n) {
                    if (mpSymbolLookupFn) {
                    linkGlobal(t, tok == '(');
                        n = (intptr_t) mpSymbolLookupFn(
                    n = (intptr_t) pVI->pAddress;
                            mpSymbolLookupContext, nameof(t));
                    if (!n && tok != '(') {
                    }
                        error("Undeclared variable %s\n", nameof(t));
                    if (pVI->pType == NULL) {
                        if (tok == '(') {
                            pVI->pType = mkpIntFn;
                        } else {
                            pVI->pType = mkpInt;
                        }
                    }
                    }
                    pVI->pAddress = (void*) n;
                }
                }
                if ((tok == '=') & allowAssignment) {
                if ((tok == '=') & allowAssignment) {
                    /* assignment */
                    /* assignment */
@@ -3945,7 +3955,11 @@ class Compiler : public ErrorSink {
                } else if (tok != '(') {
                } else if (tok != '(') {
                    /* variable */
                    /* variable */
                    if (!n) {
                    if (!n) {
                        error("Undefined variable %s", nameof(t));
                        linkGlobal(t, false);
                        n = (intptr_t) pVI->pAddress;
                        if (!n) {
                            error("Undeclared variable %s\n", nameof(t));
                        }
                    }
                    }
                    pGen->loadR0(n, tokl == 11, tokc, pVI->pType);
                    pGen->loadR0(n, tokl == 11, tokc, pVI->pType);
                    if (tokl == 11) {
                    if (tokl == 11) {