@@ -54,9 +54,11 @@ void snapshot::write_to_file(const char* filename) const
5454
5555namespace ink ::runtime::internal
5656{
57- size_t snapshot_impl::file_size (size_t serialization_length, size_t runner_cnt)
57+ size_t
58+ snapshot_impl::file_size (size_t serialization_length, size_t runner_cnt, size_t num_container)
5859{
59- return serialization_length + sizeof (header) + (runner_cnt + 1 ) * sizeof (size_t );
60+ return serialization_length + sizeof (header) + (runner_cnt + 1 + 1 ) * sizeof (uint32_t )
61+ + num_container * sizeof (uint32_t ) * 3 ;
6062}
6163
6264const unsigned char * snapshot_impl::get_data () const { return _file; }
@@ -67,7 +69,8 @@ snapshot_impl::snapshot_impl(const globals_impl& globals)
6769 : _managed{true }
6870{
6971 snapshot_interface::snapper snapper{globals.strings (), globals._owner ->string (0 )};
70- _length = globals.snap (nullptr , snapper);
72+ _length = 0 ;
73+ _length += globals.snap (nullptr , snapper);
7174 size_t runner_cnt = 0 ;
7275 for (auto node = globals._runners_start ; node; node = node->next ) {
7376 _length += node->object ->snap (nullptr , snapper);
@@ -77,19 +80,24 @@ snapshot_impl::snapshot_impl(const globals_impl& globals)
7780 runner_cnt > 0 ,
7881 " No runner assoziated with global you want to snap. This will just store the initial state."
7982 );
80- _length = file_size (_length, runner_cnt);
81- _header.story_hash = globals._runners_start ->object ->_story ->get_hash ();
82- _header.length = _length;
83- _header.num_runners = runner_cnt;
84- unsigned char * data = new unsigned char [_length];
85- _file = data;
86- unsigned char * ptr = data;
83+ const story_impl* story = globals._runners_start ->object ->_story ;
84+ _header.num_container = (story->_container_hash_end - story->_container_hash_start ) / 2 ;
85+ _length = file_size (_length, runner_cnt, _header.num_container );
86+ _header.story_hash = story->get_hash ();
87+ _header.length = _length;
88+ _header.num_runners = runner_cnt;
89+ unsigned char * data = new unsigned char [_length];
90+ _file = data;
91+ unsigned char * ptr = data;
8792 // write header
8893 memcpy (ptr, &_header, sizeof (_header));
8994 // write lookup table
9095 ptr += sizeof (header);
9196 {
92- size_t offset = (ptr - data) + (_header.num_runners + 1 ) * sizeof (size_t );
97+ uint32_t offset = (ptr - data) + (_header.num_runners + 1 + 1 ) * sizeof (uint32_t );
98+ memcpy (ptr, &offset, sizeof (offset));
99+ ptr += sizeof (offset);
100+ offset += _header.num_container * sizeof (uint32_t ) * 3 ;
93101 memcpy (ptr, &offset, sizeof (offset));
94102 ptr += sizeof (offset);
95103 offset += globals.snap (nullptr , snapper);
@@ -100,6 +108,21 @@ snapshot_impl::snapshot_impl(const globals_impl& globals)
100108 }
101109 }
102110
111+ uint32_t container_value;
112+ for (size_t i = 0 ; i < _header.num_container ; ++i) {
113+ container_value = story->_container_hash_start [i * 2 ];
114+ memcpy (ptr, &container_value, sizeof (container_value));
115+ ptr += sizeof (container_value);
116+ container_value = story->_container_hash_start [i * 2 + 1 ];
117+ memcpy (ptr, &container_value, sizeof (container_value));
118+ ptr += sizeof (container_value);
119+ if (!story->get_container_id (story->_container_hash_start [i * 2 + 1 ] + story->instructions (), container_value)) {
120+ container_value = ~0 ;
121+ }
122+ memcpy (ptr, &container_value, sizeof (container_value));
123+ ptr += sizeof (container_value);
124+ }
125+
103126 ptr += globals.snap (ptr, snapper);
104127 for (auto node = globals._runners_start ; node; node = node->next ) {
105128 ptr += node->object ->snap (ptr, snapper);
0 commit comments