Jacek Caban : jscript: Use parser location to calculate function body string.
Alexandre Julliard
julliard at winehq.org
Thu Jan 23 15:48:50 CST 2020
Module: wine
Branch: master
Commit: 0fb086d5736508b1dca3c6433fa67a6df482b8a1
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0fb086d5736508b1dca3c6433fa67a6df482b8a1
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jan 23 13:52:15 2020 +0100
jscript: Use parser location to calculate function body string.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/jscript/compile.c | 10 +++++++++-
dlls/jscript/lex.c | 16 ++++++++--------
dlls/jscript/parser.h | 2 +-
dlls/jscript/parser.y | 30 +++++++++++++-----------------
4 files changed, 31 insertions(+), 27 deletions(-)
diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c
index a530e87d8e..d8eb3de714 100644
--- a/dlls/jscript/compile.c
+++ b/dlls/jscript/compile.c
@@ -2245,6 +2245,11 @@ void release_bytecode(bytecode_t *code)
static HRESULT init_code(compiler_ctx_t *compiler, const WCHAR *source)
{
+ size_t len = source ? lstrlenW(source) : 0;
+
+ if(len > INT32_MAX)
+ return E_OUTOFMEMORY;
+
compiler->code = heap_alloc_zero(sizeof(bytecode_t));
if(!compiler->code)
return E_OUTOFMEMORY;
@@ -2252,11 +2257,14 @@ static HRESULT init_code(compiler_ctx_t *compiler, const WCHAR *source)
compiler->code->ref = 1;
heap_pool_init(&compiler->code->heap);
- compiler->code->source = heap_strdupW(source);
+ compiler->code->source = heap_alloc((len + 1) * sizeof(WCHAR));
if(!compiler->code->source) {
release_bytecode(compiler->code);
return E_OUTOFMEMORY;
}
+ if(len)
+ memcpy(compiler->code->source, source, len * sizeof(WCHAR));
+ compiler->code->source[len] = 0;
compiler->code->instrs = heap_alloc(64 * sizeof(instr_t));
if(!compiler->code->instrs) {
diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c
index 1b34a14a79..de8549eeaf 100644
--- a/dlls/jscript/lex.c
+++ b/dlls/jscript/lex.c
@@ -543,12 +543,15 @@ static BOOL parse_numeric_literal(parser_ctx_t *ctx, double *ret)
return TRUE;
}
-static int next_token(parser_ctx_t *ctx, void *lval)
+static int next_token(parser_ctx_t *ctx, unsigned *loc, void *lval)
{
do {
- if(!skip_spaces(ctx))
+ if(!skip_spaces(ctx)) {
+ *loc = ctx->ptr - ctx->begin;
return tEOF;
+ }
}while(skip_comment(ctx) || skip_html_comment(ctx));
+ *loc = ctx->ptr - ctx->begin;
if(ctx->implicit_nl_semicolon) {
if(ctx->nl)
@@ -576,6 +579,7 @@ static int next_token(parser_ctx_t *ctx, void *lval)
switch(*ctx->ptr) {
case '{':
+ case '}':
case '(':
case ')':
case '[':
@@ -586,10 +590,6 @@ static int next_token(parser_ctx_t *ctx, void *lval)
case '?':
return *ctx->ptr++;
- case '}':
- *(const WCHAR**)lval = ctx->ptr++;
- return '}';
-
case '.':
if(ctx->ptr+1 < ctx->end && is_digit(ctx->ptr[1])) {
double n;
@@ -1099,14 +1099,14 @@ static int cc_token(parser_ctx_t *ctx, void *lval)
return tBooleanLiteral;
}
-int parser_lex(void *lval, parser_ctx_t *ctx)
+int parser_lex(void *lval, unsigned *loc, parser_ctx_t *ctx)
{
int ret;
ctx->nl = ctx->ptr == ctx->begin;
do {
- ret = next_token(ctx, lval);
+ ret = next_token(ctx, loc, lval);
} while(ret == '@' && !(ret = cc_token(ctx, lval)));
return ret;
diff --git a/dlls/jscript/parser.h b/dlls/jscript/parser.h
index bceb5569b4..d180c0551a 100644
--- a/dlls/jscript/parser.h
+++ b/dlls/jscript/parser.h
@@ -51,7 +51,7 @@ typedef struct _parser_ctx_t {
HRESULT script_parse(script_ctx_t*,struct _compiler_ctx_t*,const WCHAR*,const WCHAR*,BOOL,parser_ctx_t**) DECLSPEC_HIDDEN;
void parser_release(parser_ctx_t*) DECLSPEC_HIDDEN;
-int parser_lex(void*,parser_ctx_t*) DECLSPEC_HIDDEN;
+int parser_lex(void*,unsigned*,parser_ctx_t*) DECLSPEC_HIDDEN;
static inline void *parser_alloc(parser_ctx_t *ctx, DWORD size)
{
diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y
index ca83b6fd15..aa5e27d7c7 100644
--- a/dlls/jscript/parser.y
+++ b/dlls/jscript/parser.y
@@ -26,7 +26,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
-static int parser_error(parser_ctx_t*,const char*);
+static int parser_error(unsigned*,parser_ctx_t*,const char*);
static void set_error(parser_ctx_t*,UINT);
static BOOL explicit_error(parser_ctx_t*,void*,WCHAR);
static BOOL allow_auto_semicolon(parser_ctx_t*);
@@ -137,6 +137,9 @@ static expression_t *new_prop_and_value_expression(parser_ctx_t*,property_list_t
static source_elements_t *new_source_elements(parser_ctx_t*);
static source_elements_t *source_elements_add_statement(source_elements_t*,statement_t*);
+#define YYLTYPE unsigned
+#define YYLLOC_DEFAULT(Cur, Rhs, N) Cur = YYRHSLOC((Rhs), (N) ? 1 : 0)
+
%}
%lex-param { parser_ctx_t *ctx }
@@ -146,7 +149,6 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state
%union {
int ival;
- const WCHAR *srcptr;
jsstr_t *str;
literal_t *literal;
struct _argument_list_t *argument_list;
@@ -171,8 +173,6 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state
%token <identifier> kINSTANCEOF kNEW kNULL kRETURN kSWITCH kTHIS kTHROW kTRUE kFALSE kTRY kTYPEOF kVAR kVOID kWHILE kWITH
%token tANDAND tOROR tINC tDEC tHTMLCOMMENT kDIVEQ kDCOL
-%token <srcptr> '}'
-
/* tokens */
%token <identifier> tIdentifier
%token <ival> tAssignOper tEqOper tShiftOper tRelOper
@@ -244,7 +244,6 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state
%type <property_definition> PropertyDefinition
%type <literal> PropertyName
%type <literal> BooleanLiteral
-%type <srcptr> KFunction left_bracket
%type <ival> AssignOper
%type <identifier> IdentifierName ReservedAsIdentifier
@@ -270,15 +269,12 @@ SourceElements
/* ECMA-262 3rd Edition 13 */
FunctionExpression
- : KFunction left_bracket FormalParameterList_opt right_bracket '{' FunctionBody '}'
- { $$ = new_function_expression(ctx, NULL, $3, $6, NULL, $1, $7-$1+1); }
- | KFunction tIdentifier left_bracket FormalParameterList_opt right_bracket '{' FunctionBody '}'
- { $$ = new_function_expression(ctx, $2, $4, $7, NULL, $1, $8-$1+1); }
- | KFunction tIdentifier kDCOL tIdentifier left_bracket FormalParameterList_opt right_bracket '{' FunctionBody '}'
- { $$ = new_function_expression(ctx, $4, $6, $9, $2, $1, $10-$1+1); }
-
-KFunction
- : kFUNCTION { $$ = ctx->ptr - 8; }
+ : kFUNCTION left_bracket FormalParameterList_opt right_bracket '{' FunctionBody '}'
+ { $$ = new_function_expression(ctx, NULL, $3, $6, NULL, ctx->begin + @1, @7 - @1 + 1); }
+ | kFUNCTION tIdentifier left_bracket FormalParameterList_opt right_bracket '{' FunctionBody '}'
+ { $$ = new_function_expression(ctx, $2, $4, $7, NULL, ctx->begin + @1, @8 - @1 + 1); }
+ | kFUNCTION tIdentifier kDCOL tIdentifier left_bracket FormalParameterList_opt right_bracket '{' FunctionBody '}'
+ { $$ = new_function_expression(ctx, $4, $6, $9, $2, ctx->begin + @1, @10 - @1 + 1); }
/* ECMA-262 3rd Edition 13 */
FunctionBody
@@ -809,7 +805,7 @@ PropertyDefinition
GetterSetterMethod
: left_bracket FormalParameterList_opt right_bracket '{' FunctionBody '}'
- { $$ = new_function_expression(ctx, NULL, $2, $5, NULL, $1, $6-$1); }
+ { $$ = new_function_expression(ctx, NULL, $2, $5, NULL, ctx->begin + @1, @6 - @1 + 1); }
/* Ecma-262 3rd Edition 11.1.5 */
PropertyName
@@ -889,7 +885,7 @@ semicolon_opt
| error { if(!allow_auto_semicolon(ctx)) {YYABORT;} }
left_bracket
- : '(' { $$ = ctx->ptr; }
+ : '('
| error { set_error(ctx, JS_E_MISSING_LBRACKET); YYABORT; }
right_bracket
@@ -1461,7 +1457,7 @@ static expression_t *new_call_expression(parser_ctx_t *ctx, expression_t *expres
return &ret->expr;
}
-static int parser_error(parser_ctx_t *ctx, const char *str)
+static int parser_error(unsigned *loc, parser_ctx_t *ctx, const char *str)
{
return 0;
}
More information about the wine-cvs
mailing list