From 152d317c8cb9a3250beced870fee883ddfe23829 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 1 Jan 2021 15:52:42 +0100 Subject: [PATCH] egg: Fix egg lexer state not being cleaned up after error --- panda/src/egg/lexer.cxx.prebuilt | 10 ++++++++++ panda/src/egg/lexer.lxx | 10 ++++++++++ panda/src/egg/lexerDefs.h | 1 + panda/src/egg/parser.cxx.prebuilt | 2 ++ panda/src/egg/parser.yxx | 2 ++ 5 files changed, 25 insertions(+) diff --git a/panda/src/egg/lexer.cxx.prebuilt b/panda/src/egg/lexer.cxx.prebuilt index 9e412bce1f..f0b0a2b4ec 100644 --- a/panda/src/egg/lexer.cxx.prebuilt +++ b/panda/src/egg/lexer.cxx.prebuilt @@ -971,6 +971,7 @@ extern "C" int eggyywrap(void); // declared below. static int yyinput(void); // declared by flex. +int eggyylex_destroy(void); //////////////////////////////////////////////////////////////////// // Static variables @@ -1018,6 +1019,15 @@ egg_init_lexer(istream &in, const string &filename) { initial_token = START_EGG; } +void +egg_cleanup_lexer() { + // Reset the lexer state. + eggyylex_destroy(); + + input_p = nullptr; + egg_filename.clear(); +} + void egg_start_group_body() { /* Set the initial state to begin within a group_body context, diff --git a/panda/src/egg/lexer.lxx b/panda/src/egg/lexer.lxx index e88e5a388f..88aed62e46 100644 --- a/panda/src/egg/lexer.lxx +++ b/panda/src/egg/lexer.lxx @@ -26,6 +26,7 @@ extern "C" int eggyywrap(void); // declared below. static int yyinput(void); // declared by flex. +int eggyylex_destroy(void); //////////////////////////////////////////////////////////////////// // Static variables @@ -73,6 +74,15 @@ egg_init_lexer(istream &in, const string &filename) { initial_token = START_EGG; } +void +egg_cleanup_lexer() { + // Reset the lexer state. + yylex_destroy(); + + input_p = nullptr; + egg_filename.clear(); +} + void egg_start_group_body() { /* Set the initial state to begin within a group_body context, diff --git a/panda/src/egg/lexerDefs.h b/panda/src/egg/lexerDefs.h index 4e39cb0b10..6b1f321cb5 100644 --- a/panda/src/egg/lexerDefs.h +++ b/panda/src/egg/lexerDefs.h @@ -21,6 +21,7 @@ #include void egg_init_lexer(std::istream &in, const std::string &filename); +void egg_cleanup_lexer(); void egg_start_group_body(); void egg_start_texture_body(); void egg_start_primitive_body(); diff --git a/panda/src/egg/parser.cxx.prebuilt b/panda/src/egg/parser.cxx.prebuilt index 576f851740..d9b32aced5 100644 --- a/panda/src/egg/parser.cxx.prebuilt +++ b/panda/src/egg/parser.cxx.prebuilt @@ -223,6 +223,8 @@ egg_cleanup_parser() { textures.clear(); materials.clear(); groups.clear(); + + egg_cleanup_lexer(); } diff --git a/panda/src/egg/parser.yxx b/panda/src/egg/parser.yxx index a41b08ba57..6f4ed4d443 100644 --- a/panda/src/egg/parser.yxx +++ b/panda/src/egg/parser.yxx @@ -153,6 +153,8 @@ egg_cleanup_parser() { textures.clear(); materials.clear(); groups.clear(); + + egg_cleanup_lexer(); } %}