From: Francis De Brabandere <francisdb@gmail.com> Add lex_error() helper that sets both the error code and position. Return MAKE_VBSERROR with proper error codes instead of FIXME/return 0 for unterminated strings, invalid numbers, and invalid characters. --- dlls/vbscript/lex.c | 24 +++++++++++++----------- dlls/vbscript/tests/run.c | 10 +++++----- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/dlls/vbscript/lex.c b/dlls/vbscript/lex.c index 75838ac586a..7e571eaa31a 100644 --- a/dlls/vbscript/lex.c +++ b/dlls/vbscript/lex.c @@ -28,6 +28,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(vbscript); +static int lex_error(parser_ctx_t *ctx, HRESULT hres) +{ + ctx->hres = hres; + ctx->error_loc = ctx->ptr - ctx->code; + return 0; +} + static const struct { const WCHAR *word; int token; @@ -169,8 +176,7 @@ static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret) while(ctx->ptr < ctx->end) { if(*ctx->ptr == '\n' || *ctx->ptr == '\r') { - FIXME("newline inside string literal\n"); - return 0; + return lex_error(ctx, MAKE_VBSERROR(VBSE_UNTERMINATED_STRING)); } if(*ctx->ptr == '"') { @@ -183,8 +189,7 @@ static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret) } if(ctx->ptr == ctx->end) { - FIXME("unterminated string literal\n"); - return 0; + return lex_error(ctx, MAKE_VBSERROR(VBSE_UNTERMINATED_STRING)); } len += ctx->ptr-ptr; @@ -298,8 +303,7 @@ static int parse_numeric_literal(parser_ctx_t *ctx, void **ret) } if(!is_digit(*ctx->ptr)) { - FIXME("Invalid numeric literal\n"); - return 0; + return lex_error(ctx, MAKE_VBSERROR(VBSE_INVALID_NUMBER)); } use_int = FALSE; @@ -315,8 +319,7 @@ static int parse_numeric_literal(parser_ctx_t *ctx, void **ret) } if(sign*e + exp > INT_MAX/100) { - FIXME("Invalid numeric literal\n"); - return 0; + return lex_error(ctx, MAKE_VBSERROR(VBSE_INVALID_NUMBER)); } } while(is_digit(*ctx->ptr)); @@ -330,8 +333,7 @@ static int parse_numeric_literal(parser_ctx_t *ctx, void **ret) r = exp>=0 ? d*pow(10, exp) : d/pow(10, -exp); if(isinf(r)) { - FIXME("Invalid numeric literal\n"); - return 0; + return lex_error(ctx, MAKE_VBSERROR(VBSE_INVALID_NUMBER)); } *(double*)ret = r; @@ -510,7 +512,7 @@ static int parse_next_token(void *lval, unsigned *loc, parser_ctx_t *ctx) } return '>'; default: - FIXME("Unhandled char %c in %s\n", *ctx->ptr, debugstr_w(ctx->ptr)); + return lex_error(ctx, MAKE_VBSERROR(VBSE_INVALID_CHAR)); } return 0; diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c index 8fbd33a355d..1a231d5f40d 100644 --- a/dlls/vbscript/tests/run.c +++ b/dlls/vbscript/tests/run.c @@ -2872,8 +2872,8 @@ static void test_parse_errors(void) { /* Unterminated string constant - error 1033 */ L"x = \"hello\n", - 0, -10, - NULL, S_OK, -1033 + 0, 10, + NULL, S_OK, 1033 }, { /* Expected 'End' - error 1014 */ @@ -2897,7 +2897,7 @@ static void test_parse_errors(void) /* Invalid character - error 1032 */ L"x = @invalid\n", 0, 4, - NULL, S_OK, -1032 + NULL, S_OK, 1032 }, { /* Expected literal constant - error 1045 */ @@ -2962,8 +2962,8 @@ static void test_parse_errors(void) { /* Invalid number - error 1031 */ L"x = 1e999\n", - 0, -9, - NULL, S_OK, -1031 + 0, 9, + NULL, S_OK, 1031 }, { /* 'loop' without 'do' - error 1038 */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10386