From 615f6a6e8b13f33226263131e358ee7b1aad1ba7 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 30 Sep 2014 16:51:14 +0200 Subject: [PATCH] jscript: Move parser related declarations to separated header. --- dlls/jscript/compile.c | 1 + dlls/jscript/engine.c | 15 ++ dlls/jscript/engine.h | 355 +---------------------------------------- dlls/jscript/lex.c | 1 + dlls/jscript/parser.h | 354 ++++++++++++++++++++++++++++++++++++++++ dlls/jscript/parser.y | 1 + 6 files changed, 374 insertions(+), 353 deletions(-) create mode 100644 dlls/jscript/parser.h diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c index d332087768a..f056be15275 100644 --- a/dlls/jscript/compile.c +++ b/dlls/jscript/compile.c @@ -21,6 +21,7 @@ #include "jscript.h" #include "engine.h" +#include "parser.h" #include "wine/debug.h" diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 942d10c242f..9c6acb39cf7 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -46,6 +46,21 @@ struct _except_frame_t { except_frame_t *next; }; +typedef struct { + enum { + EXPRVAL_JSVAL, + EXPRVAL_IDREF, + EXPRVAL_INVALID + } type; + union { + jsval_t val; + struct { + IDispatch *disp; + DISPID id; + } idref; + } u; +} exprval_t; + static HRESULT stack_push(exec_ctx_t *ctx, jsval_t v) { if(!ctx->stack_size) { diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h index 618c6f09da0..bd49c99ef13 100644 --- a/dlls/jscript/engine.h +++ b/dlls/jscript/engine.h @@ -16,26 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -typedef struct _source_elements_t source_elements_t; -typedef struct _expression_t expression_t; -typedef struct _statement_t statement_t; - -typedef struct { - const WCHAR *begin; - const WCHAR *end; - const WCHAR *ptr; - - script_ctx_t *script; - source_elements_t *source; - BOOL nl; - BOOL implicit_nl_semicolon; - BOOL is_html; - BOOL lexer_error; - HRESULT hres; - - heap_pool_t heap; -} parser_ctx_t; - #define OP_LIST \ X(add, 1, 0,0) \ X(and, 1, 0,0) \ @@ -191,21 +171,6 @@ static inline void bytecode_addref(bytecode_t *code) code->ref++; } -HRESULT script_parse(script_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; - -static inline void *parser_alloc(parser_ctx_t *ctx, DWORD size) -{ - return heap_pool_alloc(&ctx->heap, size); -} - -static inline void *parser_alloc_tmp(parser_ctx_t *ctx, DWORD size) -{ - return heap_pool_alloc(&ctx->script->tmp_heap, size); -} - typedef struct _scope_chain_t { LONG ref; jsdisp_t *jsobj; @@ -222,11 +187,12 @@ static inline void scope_addref(scope_chain_t *scope) } typedef struct _except_frame_t except_frame_t; +struct _parser_ctx_t; struct _exec_ctx_t { LONG ref; - parser_ctx_t *parser; + struct _parser_ctx_t *parser; bytecode_t *code; script_ctx_t *script; scope_chain_t *scope_chain; @@ -253,320 +219,3 @@ void exec_release(exec_ctx_t*) DECLSPEC_HIDDEN; HRESULT create_exec_ctx(script_ctx_t*,IDispatch*,jsdisp_t*,scope_chain_t*,BOOL,exec_ctx_t**) DECLSPEC_HIDDEN; HRESULT exec_source(exec_ctx_t*,bytecode_t*,function_code_t*,BOOL,jsval_t*) DECLSPEC_HIDDEN; HRESULT create_source_function(script_ctx_t*,bytecode_t*,function_code_t*,scope_chain_t*,jsdisp_t**) DECLSPEC_HIDDEN; - -typedef enum { - LT_DOUBLE, - LT_STRING, - LT_BOOL, - LT_NULL, - LT_REGEXP -}literal_type_t; - -typedef struct { - literal_type_t type; - union { - double dval; - const WCHAR *wstr; - BOOL bval; - struct { - const WCHAR *str; - DWORD str_len; - DWORD flags; - } regexp; - } u; -} literal_t; - -literal_t *parse_regexp(parser_ctx_t*) DECLSPEC_HIDDEN; -literal_t *new_boolean_literal(parser_ctx_t*,BOOL) DECLSPEC_HIDDEN; - -typedef struct _variable_declaration_t { - const WCHAR *identifier; - expression_t *expr; - - struct _variable_declaration_t *next; - struct _variable_declaration_t *global_next; /* for compiler */ -} variable_declaration_t; - -typedef enum { - STAT_BLOCK, - STAT_BREAK, - STAT_CONTINUE, - STAT_EMPTY, - STAT_EXPR, - STAT_FOR, - STAT_FORIN, - STAT_IF, - STAT_LABEL, - STAT_RETURN, - STAT_SWITCH, - STAT_THROW, - STAT_TRY, - STAT_VAR, - STAT_WHILE, - STAT_WITH -} statement_type_t; - -struct _statement_t { - statement_type_t type; - statement_t *next; -}; - -typedef struct { - statement_t stat; - statement_t *stat_list; -} block_statement_t; - -typedef struct { - statement_t stat; - variable_declaration_t *variable_list; -} var_statement_t; - -typedef struct { - statement_t stat; - expression_t *expr; -} expression_statement_t; - -typedef struct { - statement_t stat; - expression_t *expr; - statement_t *if_stat; - statement_t *else_stat; -} if_statement_t; - -typedef struct { - statement_t stat; - BOOL do_while; - expression_t *expr; - statement_t *statement; -} while_statement_t; - -typedef struct { - statement_t stat; - variable_declaration_t *variable_list; - expression_t *begin_expr; - expression_t *expr; - expression_t *end_expr; - statement_t *statement; -} for_statement_t; - -typedef struct { - statement_t stat; - variable_declaration_t *variable; - expression_t *expr; - expression_t *in_expr; - statement_t *statement; -} forin_statement_t; - -typedef struct { - statement_t stat; - const WCHAR *identifier; -} branch_statement_t; - -typedef struct { - statement_t stat; - expression_t *expr; - statement_t *statement; -} with_statement_t; - -typedef struct { - statement_t stat; - const WCHAR *identifier; - statement_t *statement; -} labelled_statement_t; - -typedef struct _case_clausule_t { - expression_t *expr; - statement_t *stat; - - struct _case_clausule_t *next; -} case_clausule_t; - -typedef struct { - statement_t stat; - expression_t *expr; - case_clausule_t *case_list; -} switch_statement_t; - -typedef struct { - const WCHAR *identifier; - statement_t *statement; -} catch_block_t; - -typedef struct { - statement_t stat; - statement_t *try_statement; - catch_block_t *catch_block; - statement_t *finally_statement; -} try_statement_t; - -typedef struct { - enum { - EXPRVAL_JSVAL, - EXPRVAL_IDREF, - EXPRVAL_INVALID - } type; - union { - jsval_t val; - struct { - IDispatch *disp; - DISPID id; - } idref; - } u; -} exprval_t; - -typedef enum { - EXPR_COMMA, - EXPR_OR, - EXPR_AND, - EXPR_BOR, - EXPR_BXOR, - EXPR_BAND, - EXPR_INSTANCEOF, - EXPR_IN, - EXPR_ADD, - EXPR_SUB, - EXPR_MUL, - EXPR_DIV, - EXPR_MOD, - EXPR_DELETE, - EXPR_VOID, - EXPR_TYPEOF, - EXPR_MINUS, - EXPR_PLUS, - EXPR_POSTINC, - EXPR_POSTDEC, - EXPR_PREINC, - EXPR_PREDEC, - EXPR_EQ, - EXPR_EQEQ, - EXPR_NOTEQ, - EXPR_NOTEQEQ, - EXPR_LESS, - EXPR_LESSEQ, - EXPR_GREATER, - EXPR_GREATEREQ, - EXPR_BITNEG, - EXPR_LOGNEG, - EXPR_LSHIFT, - EXPR_RSHIFT, - EXPR_RRSHIFT, - EXPR_ASSIGN, - EXPR_ASSIGNLSHIFT, - EXPR_ASSIGNRSHIFT, - EXPR_ASSIGNRRSHIFT, - EXPR_ASSIGNADD, - EXPR_ASSIGNSUB, - EXPR_ASSIGNMUL, - EXPR_ASSIGNDIV, - EXPR_ASSIGNMOD, - EXPR_ASSIGNAND, - EXPR_ASSIGNOR, - EXPR_ASSIGNXOR, - EXPR_COND, - EXPR_ARRAY, - EXPR_MEMBER, - EXPR_NEW, - EXPR_CALL, - EXPR_THIS, - EXPR_FUNC, - EXPR_IDENT, - EXPR_ARRAYLIT, - EXPR_PROPVAL, - EXPR_LITERAL -} expression_type_t; - -struct _expression_t { - expression_type_t type; -}; - -typedef struct _parameter_t { - const WCHAR *identifier; - struct _parameter_t *next; -} parameter_t; - -struct _source_elements_t { - statement_t *statement; - statement_t *statement_tail; -}; - -typedef struct _function_expression_t { - expression_t expr; - const WCHAR *identifier; - parameter_t *parameter_list; - source_elements_t *source_elements; - const WCHAR *src_str; - DWORD src_len; - - struct _function_expression_t *next; /* for compiler */ -} function_expression_t; - -typedef struct { - expression_t expr; - expression_t *expression1; - expression_t *expression2; -} binary_expression_t; - -typedef struct { - expression_t expr; - expression_t *expression; -} unary_expression_t; - -typedef struct { - expression_t expr; - expression_t *expression; - expression_t *true_expression; - expression_t *false_expression; -} conditional_expression_t; - -typedef struct { - expression_t expr; - expression_t *expression; - const WCHAR *identifier; -} member_expression_t; - -typedef struct _argument_t { - expression_t *expr; - - struct _argument_t *next; -} argument_t; - -typedef struct { - expression_t expr; - expression_t *expression; - argument_t *argument_list; -} call_expression_t; - -typedef struct { - expression_t expr; - const WCHAR *identifier; -} identifier_expression_t; - -typedef struct { - expression_t expr; - literal_t *literal; -} literal_expression_t; - -typedef struct _array_element_t { - int elision; - expression_t *expr; - - struct _array_element_t *next; -} array_element_t; - -typedef struct { - expression_t expr; - array_element_t *element_list; - int length; -} array_literal_expression_t; - -typedef struct _prop_val_t { - literal_t *name; - expression_t *value; - - struct _prop_val_t *next; -} prop_val_t; - -typedef struct { - expression_t expr; - prop_val_t *property_list; -} property_value_expression_t; diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c index 363e18da3eb..731883801fd 100644 --- a/dlls/jscript/lex.c +++ b/dlls/jscript/lex.c @@ -25,6 +25,7 @@ #include "activscp.h" #include "objsafe.h" #include "engine.h" +#include "parser.h" #include "parser.tab.h" diff --git a/dlls/jscript/parser.h b/dlls/jscript/parser.h new file mode 100644 index 00000000000..ff50cb1da79 --- /dev/null +++ b/dlls/jscript/parser.h @@ -0,0 +1,354 @@ +/* + * Copyright 2014 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +typedef struct _source_elements_t source_elements_t; +typedef struct _expression_t expression_t; +typedef struct _statement_t statement_t; + +typedef struct _parser_ctx_t { + const WCHAR *begin; + const WCHAR *end; + const WCHAR *ptr; + + script_ctx_t *script; + source_elements_t *source; + BOOL nl; + BOOL implicit_nl_semicolon; + BOOL is_html; + BOOL lexer_error; + HRESULT hres; + + heap_pool_t heap; +} parser_ctx_t; + +HRESULT script_parse(script_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; + +static inline void *parser_alloc(parser_ctx_t *ctx, DWORD size) +{ + return heap_pool_alloc(&ctx->heap, size); +} + +static inline void *parser_alloc_tmp(parser_ctx_t *ctx, DWORD size) +{ + return heap_pool_alloc(&ctx->script->tmp_heap, size); +} + +typedef enum { + LT_DOUBLE, + LT_STRING, + LT_BOOL, + LT_NULL, + LT_REGEXP +}literal_type_t; + +typedef struct { + literal_type_t type; + union { + double dval; + const WCHAR *wstr; + BOOL bval; + struct { + const WCHAR *str; + DWORD str_len; + DWORD flags; + } regexp; + } u; +} literal_t; + +literal_t *parse_regexp(parser_ctx_t*) DECLSPEC_HIDDEN; +literal_t *new_boolean_literal(parser_ctx_t*,BOOL) DECLSPEC_HIDDEN; + +typedef struct _variable_declaration_t { + const WCHAR *identifier; + expression_t *expr; + + struct _variable_declaration_t *next; + struct _variable_declaration_t *global_next; /* for compiler */ +} variable_declaration_t; + +typedef enum { + STAT_BLOCK, + STAT_BREAK, + STAT_CONTINUE, + STAT_EMPTY, + STAT_EXPR, + STAT_FOR, + STAT_FORIN, + STAT_IF, + STAT_LABEL, + STAT_RETURN, + STAT_SWITCH, + STAT_THROW, + STAT_TRY, + STAT_VAR, + STAT_WHILE, + STAT_WITH +} statement_type_t; + +struct _statement_t { + statement_type_t type; + statement_t *next; +}; + +typedef struct { + statement_t stat; + statement_t *stat_list; +} block_statement_t; + +typedef struct { + statement_t stat; + variable_declaration_t *variable_list; +} var_statement_t; + +typedef struct { + statement_t stat; + expression_t *expr; +} expression_statement_t; + +typedef struct { + statement_t stat; + expression_t *expr; + statement_t *if_stat; + statement_t *else_stat; +} if_statement_t; + +typedef struct { + statement_t stat; + BOOL do_while; + expression_t *expr; + statement_t *statement; +} while_statement_t; + +typedef struct { + statement_t stat; + variable_declaration_t *variable_list; + expression_t *begin_expr; + expression_t *expr; + expression_t *end_expr; + statement_t *statement; +} for_statement_t; + +typedef struct { + statement_t stat; + variable_declaration_t *variable; + expression_t *expr; + expression_t *in_expr; + statement_t *statement; +} forin_statement_t; + +typedef struct { + statement_t stat; + const WCHAR *identifier; +} branch_statement_t; + +typedef struct { + statement_t stat; + expression_t *expr; + statement_t *statement; +} with_statement_t; + +typedef struct { + statement_t stat; + const WCHAR *identifier; + statement_t *statement; +} labelled_statement_t; + +typedef struct _case_clausule_t { + expression_t *expr; + statement_t *stat; + + struct _case_clausule_t *next; +} case_clausule_t; + +typedef struct { + statement_t stat; + expression_t *expr; + case_clausule_t *case_list; +} switch_statement_t; + +typedef struct { + const WCHAR *identifier; + statement_t *statement; +} catch_block_t; + +typedef struct { + statement_t stat; + statement_t *try_statement; + catch_block_t *catch_block; + statement_t *finally_statement; +} try_statement_t; + +typedef enum { + EXPR_COMMA, + EXPR_OR, + EXPR_AND, + EXPR_BOR, + EXPR_BXOR, + EXPR_BAND, + EXPR_INSTANCEOF, + EXPR_IN, + EXPR_ADD, + EXPR_SUB, + EXPR_MUL, + EXPR_DIV, + EXPR_MOD, + EXPR_DELETE, + EXPR_VOID, + EXPR_TYPEOF, + EXPR_MINUS, + EXPR_PLUS, + EXPR_POSTINC, + EXPR_POSTDEC, + EXPR_PREINC, + EXPR_PREDEC, + EXPR_EQ, + EXPR_EQEQ, + EXPR_NOTEQ, + EXPR_NOTEQEQ, + EXPR_LESS, + EXPR_LESSEQ, + EXPR_GREATER, + EXPR_GREATEREQ, + EXPR_BITNEG, + EXPR_LOGNEG, + EXPR_LSHIFT, + EXPR_RSHIFT, + EXPR_RRSHIFT, + EXPR_ASSIGN, + EXPR_ASSIGNLSHIFT, + EXPR_ASSIGNRSHIFT, + EXPR_ASSIGNRRSHIFT, + EXPR_ASSIGNADD, + EXPR_ASSIGNSUB, + EXPR_ASSIGNMUL, + EXPR_ASSIGNDIV, + EXPR_ASSIGNMOD, + EXPR_ASSIGNAND, + EXPR_ASSIGNOR, + EXPR_ASSIGNXOR, + EXPR_COND, + EXPR_ARRAY, + EXPR_MEMBER, + EXPR_NEW, + EXPR_CALL, + EXPR_THIS, + EXPR_FUNC, + EXPR_IDENT, + EXPR_ARRAYLIT, + EXPR_PROPVAL, + EXPR_LITERAL +} expression_type_t; + +struct _expression_t { + expression_type_t type; +}; + +typedef struct _parameter_t { + const WCHAR *identifier; + struct _parameter_t *next; +} parameter_t; + +struct _source_elements_t { + statement_t *statement; + statement_t *statement_tail; +}; + +typedef struct _function_expression_t { + expression_t expr; + const WCHAR *identifier; + parameter_t *parameter_list; + source_elements_t *source_elements; + const WCHAR *src_str; + DWORD src_len; + + struct _function_expression_t *next; /* for compiler */ +} function_expression_t; + +typedef struct { + expression_t expr; + expression_t *expression1; + expression_t *expression2; +} binary_expression_t; + +typedef struct { + expression_t expr; + expression_t *expression; +} unary_expression_t; + +typedef struct { + expression_t expr; + expression_t *expression; + expression_t *true_expression; + expression_t *false_expression; +} conditional_expression_t; + +typedef struct { + expression_t expr; + expression_t *expression; + const WCHAR *identifier; +} member_expression_t; + +typedef struct _argument_t { + expression_t *expr; + + struct _argument_t *next; +} argument_t; + +typedef struct { + expression_t expr; + expression_t *expression; + argument_t *argument_list; +} call_expression_t; + +typedef struct { + expression_t expr; + const WCHAR *identifier; +} identifier_expression_t; + +typedef struct { + expression_t expr; + literal_t *literal; +} literal_expression_t; + +typedef struct _array_element_t { + int elision; + expression_t *expr; + + struct _array_element_t *next; +} array_element_t; + +typedef struct { + expression_t expr; + array_element_t *element_list; + int length; +} array_literal_expression_t; + +typedef struct _prop_val_t { + literal_t *name; + expression_t *value; + + struct _prop_val_t *next; +} prop_val_t; + +typedef struct { + expression_t expr; + prop_val_t *property_list; +} property_value_expression_t; diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y index 327366a7f8e..7b36b115b0d 100644 --- a/dlls/jscript/parser.y +++ b/dlls/jscript/parser.y @@ -20,6 +20,7 @@ #include "jscript.h" #include "engine.h" +#include "parser.h" #include "wine/debug.h"