diff --git a/ChangeLog b/ChangeLog index ea9cf447b5..88ca037305 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,7 @@ RAK5010: switch to 1.8v internal voltage (was 3.3v) to make GSM comms reliable, upgrade BG96 module RAK5010: Compile in TLS/HTTPS support Bangle.js: Fix issue where if non-fullscreen notification was visible and Bangle.js reset, screen was off-center + Fix for issue with pretokenised code not creating correct text string for reserved words, eg {undefined:1} 2v10 : Bangle.js: Improved HRM calculations - swapped autocorrelation for bandpass filter Bangle.js: Significantly improved step counting algorithm using bandpass filter (fix #1846) diff --git a/src/jslex.c b/src/jslex.c index 44b231402d..cd4bba77a9 100644 --- a/src/jslex.c +++ b/src/jslex.c @@ -733,6 +733,83 @@ void jslFunctionCharAsString(unsigned char ch, char *str, size_t len) { } } +const char* jslReservedWordAsString(int token) { + static const char tokenNames[] = + /* LEX_EQUAL : */ "==\0" + /* LEX_TYPEEQUAL : */ "===\0" + /* LEX_NEQUAL : */ "!=\0" + /* LEX_NTYPEEQUAL : */ "!==\0" + /* LEX_LEQUAL : */ "<=\0" + /* LEX_LSHIFT : */ "<<\0" + /* LEX_LSHIFTEQUAL : */ "<<=\0" + /* LEX_GEQUAL : */ ">=\0" + /* LEX_RSHIFT : */ ">>\0" + /* LEX_RSHIFTUNSIGNED */ ">>>\0" + /* LEX_RSHIFTEQUAL : */ ">>=\0" + /* LEX_RSHIFTUNSIGNEDEQUAL */ ">>>=\0" + /* LEX_PLUSEQUAL : */ "+=\0" + /* LEX_MINUSEQUAL : */ "-=\0" + /* LEX_PLUSPLUS : */ "++\0" + /* LEX_MINUSMINUS */ "--\0" + /* LEX_MULEQUAL : */ "*=\0" + /* LEX_DIVEQUAL : */ "/=\0" + /* LEX_MODEQUAL : */ "%=\0" + /* LEX_ANDEQUAL : */ "&=\0" + /* LEX_ANDAND : */ "&&\0" + /* LEX_OREQUAL : */ "|=\0" + /* LEX_OROR : */ "||\0" + /* LEX_XOREQUAL : */ "^=\0" + /* LEX_ARROW_FUNCTION */ "=>\0" + + // reserved words + /*LEX_R_IF : */ "if\0" + /*LEX_R_ELSE : */ "else\0" + /*LEX_R_DO : */ "do\0" + /*LEX_R_WHILE : */ "while\0" + /*LEX_R_FOR : */ "for\0" + /*LEX_R_BREAK : */ "break\0" + /*LEX_R_CONTINUE */ "continue\0" + /*LEX_R_FUNCTION */ "function\0" + /*LEX_R_RETURN */ "return\0" + /*LEX_R_VAR : */ "var\0" + /*LEX_R_LET : */ "let\0" + /*LEX_R_CONST : */ "const\0" + /*LEX_R_THIS : */ "this\0" + /*LEX_R_THROW : */ "throw\0" + /*LEX_R_TRY : */ "try\0" + /*LEX_R_CATCH : */ "catch\0" + /*LEX_R_FINALLY : */ "finally\0" + /*LEX_R_TRUE : */ "true\0" + /*LEX_R_FALSE : */ "false\0" + /*LEX_R_NULL : */ "null\0" + /*LEX_R_UNDEFINED */ "undefined\0" + /*LEX_R_NEW : */ "new\0" + /*LEX_R_IN : */ "in\0" + /*LEX_R_INSTANCEOF */ "instanceof\0" + /*LEX_R_SWITCH */ "switch\0" + /*LEX_R_CASE */ "case\0" + /*LEX_R_DEFAULT */ "default\0" + /*LEX_R_DELETE */ "delete\0" + /*LEX_R_TYPEOF : */ "typeof\0" + /*LEX_R_VOID : */ "void\0" + /*LEX_R_DEBUGGER : */ "debugger\0" + /*LEX_R_CLASS : */ "class\0" + /*LEX_R_EXTENDS : */ "extends\0" + /*LEX_R_SUPER : */ "super\0" + /*LEX_R_STATIC : */ "static\0" + /*LEX_R_OF : */ "of\0" + ; + unsigned int p = 0; + int n = token-_LEX_OPERATOR_START; + while (n>0 && p28); // size of largest string // see JS_ERROR_TOKEN_BUF_SIZE @@ -761,80 +838,7 @@ void jslTokenAsString(int token, char *str, size_t len) { case 255 : strcpy(str, "[ERASED]"); return; } if (token>=_LEX_OPERATOR_START && token<=_LEX_R_LIST_END) { - const char tokenNames[] = - /* LEX_EQUAL : */ "==\0" - /* LEX_TYPEEQUAL : */ "===\0" - /* LEX_NEQUAL : */ "!=\0" - /* LEX_NTYPEEQUAL : */ "!==\0" - /* LEX_LEQUAL : */ "<=\0" - /* LEX_LSHIFT : */ "<<\0" - /* LEX_LSHIFTEQUAL : */ "<<=\0" - /* LEX_GEQUAL : */ ">=\0" - /* LEX_RSHIFT : */ ">>\0" - /* LEX_RSHIFTUNSIGNED */ ">>>\0" - /* LEX_RSHIFTEQUAL : */ ">>=\0" - /* LEX_RSHIFTUNSIGNEDEQUAL */ ">>>=\0" - /* LEX_PLUSEQUAL : */ "+=\0" - /* LEX_MINUSEQUAL : */ "-=\0" - /* LEX_PLUSPLUS : */ "++\0" - /* LEX_MINUSMINUS */ "--\0" - /* LEX_MULEQUAL : */ "*=\0" - /* LEX_DIVEQUAL : */ "/=\0" - /* LEX_MODEQUAL : */ "%=\0" - /* LEX_ANDEQUAL : */ "&=\0" - /* LEX_ANDAND : */ "&&\0" - /* LEX_OREQUAL : */ "|=\0" - /* LEX_OROR : */ "||\0" - /* LEX_XOREQUAL : */ "^=\0" - /* LEX_ARROW_FUNCTION */ "=>\0" - - // reserved words - /*LEX_R_IF : */ "if\0" - /*LEX_R_ELSE : */ "else\0" - /*LEX_R_DO : */ "do\0" - /*LEX_R_WHILE : */ "while\0" - /*LEX_R_FOR : */ "for\0" - /*LEX_R_BREAK : */ "break\0" - /*LEX_R_CONTINUE */ "continue\0" - /*LEX_R_FUNCTION */ "function\0" - /*LEX_R_RETURN */ "return\0" - /*LEX_R_VAR : */ "var\0" - /*LEX_R_LET : */ "let\0" - /*LEX_R_CONST : */ "const\0" - /*LEX_R_THIS : */ "this\0" - /*LEX_R_THROW : */ "throw\0" - /*LEX_R_TRY : */ "try\0" - /*LEX_R_CATCH : */ "catch\0" - /*LEX_R_FINALLY : */ "finally\0" - /*LEX_R_TRUE : */ "true\0" - /*LEX_R_FALSE : */ "false\0" - /*LEX_R_NULL : */ "null\0" - /*LEX_R_UNDEFINED */ "undefined\0" - /*LEX_R_NEW : */ "new\0" - /*LEX_R_IN : */ "in\0" - /*LEX_R_INSTANCEOF */ "instanceof\0" - /*LEX_R_SWITCH */ "switch\0" - /*LEX_R_CASE */ "case\0" - /*LEX_R_DEFAULT */ "default\0" - /*LEX_R_DELETE */ "delete\0" - /*LEX_R_TYPEOF : */ "typeof\0" - /*LEX_R_VOID : */ "void\0" - /*LEX_R_DEBUGGER : */ "debugger\0" - /*LEX_R_CLASS : */ "class\0" - /*LEX_R_EXTENDS : */ "extends\0" - /*LEX_R_SUPER : */ "super\0" - /*LEX_R_STATIC : */ "static\0" - /*LEX_R_OF : */ "of\0" - ; - unsigned int p = 0; - int n = token-_LEX_OPERATOR_START; - while (n>0 && ptk, lex->token, sizeof(lex->token)); + strcpy(lex->token, jslReservedWordAsString(lex->tk)); lex->tokenl = (unsigned char)strlen(lex->token); } return lex->token; @@ -869,6 +874,9 @@ int jslGetTokenLength() { JsVar *jslGetTokenValueAsVar() { if (lex->tokenValue) { return jsvLockAgain(lex->tokenValue); + } else if (lex->tk >= _LEX_R_LIST_START && lex->tk <= _LEX_R_LIST_END) { + // in pretokenised code, we must make this up + return jsvNewFromString(jslReservedWordAsString(lex->tk)); } else { assert(lex->tokenl < JSLEX_MAX_TOKEN_LENGTH); lex->token[lex->tokenl] = 0; // add final null