URL:
  <http://gna.org/bugs/?21127>

                 Summary: problems with wml_menu_item class
                 Project: Battle for Wesnoth
            Submitted by: anonymissimus
            Submitted on: Di 10 Sep 2013 18:41:21 GMT
                Category: Bug
                Severity: 4 - Important
                Priority: 5 - Normal
              Item Group:  None of the others
                  Status: None
                 Privacy: Public
             Assigned to: jamit
        Originator Email: 
             Open/Closed: Open
         Discussion Lock: Any
                 Release: 1.11.6+dev@83a92beb4550f2d220b05170490d8
        Operating System: win xp

    _______________________________________________________

Details:

In wml_menu_item::update(const vconfig & vcfg) there should be references.
Here's the fiff:
++
diff --git a/src/gamestatus.cpp b/src/gamestatus.cpp
index 4f43928..fd3d338 100644
--- a/src/gamestatus.cpp
+++ b/src/gamestatus.cpp
@@ -159,10 +159,10 @@ void wml_menu_item::update(const vconfig & vcfg)
        if ( vcfg.has_attribute("needs_select") )
                needs_select_ = vcfg["needs_select"].to_bool();
 
-       if ( const vconfig child = vcfg.child("show_if") )
+       if ( const vconfig& child = vcfg.child("show_if") )
                show_if_ = child;
 
-       if ( const vconfig child = vcfg.child("filter_location") )
+       if ( const vconfig& child = vcfg.child("filter_location") )
                filter_location_ = child;
 
        if ( const vconfig & cmd = vcfg.child("command") ) {

--

However, I still get a crash similar to this trace once a scenario attempts to
autosave at start:
++
>       
> wesnoth.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,config::attribute_value,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>
>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> const ,config::attribute_value> >,0> >::begin()  Zeile 561 + 0xc Bytes        
> C++
        wesnoth.exe!config::attribute_range()  Zeile 877 + 0x66 Bytes   C++
        wesnoth.exe!operator<<(std::basic_ostream<char,std::char_traits<char> > 
&
outstream={...}, const config & cfg={...})  Zeile 1321 + 0x238 Bytes    C++
        wesnoth.exe!config::debug()  Zeile 1313 + 0x10 Bytes    C++
        wesnoth.exe!wml_menu_item::to_config(config & cfg={...})  Zeile 143 + 
0x39
Bytes   C++
        wesnoth.exe!wmi_container::to_config(config & cfg={...})  Zeile 224 + 
0x3e
Bytes   C++
        wesnoth.exe!game_data::write_snapshot(config & cfg={...})  Zeile 915    
C++
        wesnoth.exe!game_state::write_snapshot(config & cfg={...}, game_display 
*
gui=0x08939b20)  Zeile 1246     C++
        wesnoth.exe!savegame::ingame_savegame::before_save()  Zeile 1153        
C++
        wesnoth.exe!savegame::savegame::save_game(CVideo * video=0x03df1394, 
const
std::basic_string<char,std::char_traits<char>,std::allocator<char> > &
filename="")  Zeile 940 + 0xf Bytes     C++
        wesnoth.exe!savegame::savegame::save_game_automatic(CVideo & 
video={...},
bool ask_for_overwrite=false, const
std::basic_string<char,std::char_traits<char>,std::allocator<char> > &
filename="")  Zeile 827 + 0x34 Bytes    C++
        wesnoth.exe!savegame::autosave_savegame::autosave(const bool
disable_autosave=false, const int autosave_max=10, const int
infinite_autosaves=61)  Zeile 1092 + 0x41 Bytes C++
        
wesnoth.exe!playsingle_controller::before_human_turn(savegame::autosave_savegame
save={...})  Zeile 707  C++
        wesnoth.exe!playmp_controller::before_human_turn(bool save=true)  Zeile
106     C++
        wesnoth.exe!playsingle_controller::play_side(const unsigned int
side_number=1, bool save=true)  Zeile 651 + 0x17 Bytes  C++
        wesnoth.exe!playmp_controller::play_side(const unsigned int 
side_number=1,
bool save=true)  Zeile 100      C++
        wesnoth.exe!playsingle_controller::play_turn(bool save=true)  Zeile 604 
+
0x21 Bytes      C++
        wesnoth.exe!playsingle_controller::play_scenario(const
std::pair<config::const_child_iterator,config::const_child_iterator> &
story=({i_=... },{i_=... }), bool skip_replay=false)  Zeile 412 + 0x1a
Bytes   C++
        wesnoth.exe!playmp_scenario(const config & game_config={...}, const 
config *
level=0x001229f0, display & disp={...}, game_state & state_of_game={...},
const std::pair<config::const_child_iterator,config::const_child_iterator> &
story=({i_=... },{i_=... }), bool skip_replay=false, io_type_t &
io_type=IO_SERVER, end_level_data & end_level={...})  Zeile 287 + 0x14
Bytes   C++
        wesnoth.exe!play_game(game_display & disp={...}, game_state &
gamestate={...}, const config & game_config={...}, io_type_t
io_type=IO_SERVER, bool skip_replay=false, bool network_game=false)  Zeile 465
+ 0x2c Bytes    C++
        wesnoth.exe!enter_connect_mode(game_display & disp={...}, const config &
game_config={...}, game_state & state={...}, const mp_game_settings &
params={...}, bool local_players_only=true)  Zeile 507 + 0x22 Bytes     C++
        wesnoth.exe!enter_configure_mode(game_display & disp={...}, const 
config &
game_config={...}, game_state & state={...}, const mp_game_settings &
params={...}, bool local_players_only=true)  Zeile 602 + 0x1d Bytes     C++
        wesnoth.exe!enter_create_mode(game_display & disp={...}, const config &
game_config={...}, game_state & state={...}, bool local_players_only=true) 
Zeile 562 + 0x1d Bytes  C++
        wesnoth.exe!mp::start_local_game(game_display & disp={...}, const 
config &
game_config={...}, game_state & state={...})  Zeile 750 + 0x13 Bytes    C++
        wesnoth.exe!game_controller::play_multiplayer()  Zeile 849 + 0x3b Bytes 
C++
        wesnoth.exe!do_gameloop(int argc=3, char * * argv=0x0012fea0)  Zeile 
597 +
0x12 Bytes      C++
        wesnoth.exe!SDL_main(int argc=3, char * * argv=0x0012fea0)  Zeile 695 + 
0xd
Bytes   C++
        wesnoth.exe!_main()  + 0xf5 Bytes       C
--
It happens at the show_if_.get_config()/filter_location_.get_config() calls in
wml_menu_item::to_config(config & cfg) const because those members contain
garbage at that point. They are still correct in wml_menu_item::update(const
vconfig & vcfg) (and I don't find out now why is that, perhaps
wml_menu_item::operator= should be defined ?)
Here's some reproduction wml. Don't have other menu items in there.
++
        [event]
                name=turn 1
                [set_menu_item]
                        first_time_only=no
                        id=one
                        description=_"1"
                        [command]
                                {DEBUG_MSG "1"}
                        [/command]
                [/set_menu_item]
                [set_menu_item]
                        first_time_only=no
                        id=show_if
                        description=_"show_if"
                        [show_if]
                                [have_unit]
                                        id=nonexist
                                [/have_unit]
                        [/show_if]
                        [command]
                                {DEBUG_MSG "show_if"}
                        [/command]
                [/set_menu_item]
                [set_menu_item]
                        first_time_only=no
                        id=filter_loc
                        description=_"filter_loc"
                        [filter_location]
                                [filter]
                                [/filter]
                        [/filter_location]
                        [command]
                                {DEBUG_MSG "filter_loc"}
                        [/command]
                [/set_menu_item]
        [/event]
--




    _______________________________________________________

Reply to this item at:

  <http://gna.org/bugs/?21127>

_______________________________________________
  Nachricht gesendet von/durch Gna!
  http://gna.org/


_______________________________________________
Wesnoth-bugs mailing list
Wesnoth-bugs@gna.org
https://mail.gna.org/listinfo/wesnoth-bugs

Reply via email to