History

Created multiple pointer field iterators based on application Fix bug in vm_string class related to appending null at the end of the current string - This was recently introduced because I didn't test the case :( Scheduler had an invalid usage of std::mutex that was found using the debug version of CRT Fix heinous perf issue in GC where it was taking longer than code execution - Switch from std::queue to std::stack -> perf gain of ~20%

arr committed 9 years ago

Commit 30c4c581 parent 6f29a816 files · +102 −39Browse files

Showing the changes to src/vm/string.cpp (1 of 6 files). Show all

Unified · Split

src/vm/string.cpp+21−10
@@ -123,14 +123,14 @@ namespace · 122 unmodified lines
123 template<>123 template<>
124 void copy_characters_to(char *dest, word_t dest_start, const char *source, word_t source_length)124 void copy_characters_to(char *dest, word_t dest_start, const char *source, word_t source_length)
125 {125 {
126 assert(dest != nullptr && source != nullptr);126 assert(dest != nullptr && source != nullptr && dest != source);
127 std::memcpy((dest + dest_start), source, source_length);127 std::memcpy((dest + dest_start), source, source_length);
128 }128 }
129 129
130 template<>130 template<>
131 void copy_characters_to(runtime::rune_t *dest, word_t dest_start, const runtime::rune_t *source, word_t source_length)131 void copy_characters_to(runtime::rune_t *dest, word_t dest_start, const runtime::rune_t *source, word_t source_length)
132 {132 {
133 assert(dest != nullptr && source != nullptr);133 assert(dest != nullptr && source != nullptr && dest != source);
134 std::memcpy((dest + dest_start), source, (source_length * sizeof(runtime::rune_t)));134 std::memcpy((dest + dest_start), source, (source_length * sizeof(runtime::rune_t)));
135 }135 }
136 136
@@ -286,17 +286,19 @@ vm_string_t::vm_string_t(const vm_string_t &other, word_t begin_index, word_t en · 149 unmodified lines
286 // Allocate memory based on character count and size286 // Allocate memory based on character count and size
287 auto src = other._mem.local;287 auto src = other._mem.local;
288 auto dest = _mem.local;288 auto dest = _mem.local;
289 const auto length_in_bytes = _length * _character_size;
290 if (_is_alloc)289 if (_is_alloc)
291 {290 {
292 src = other._mem.alloc;291 src = other._mem.alloc;
293 _mem.alloc = alloc_memory<uint8_t>(_length_max);292 _mem.alloc = alloc_memory<uint8_t>(_length_max * _character_size);
294 dest = _mem.alloc;293 dest = _mem.alloc;
295 }294 }
296 295
297 // Copy over string content starting at the correct index (char vs. rune_t)296 // Copy over string content starting at the correct index (char vs. rune_t)
297 const auto length_in_bytes = _length * _character_size;
298 std::memcpy(dest, (src + (begin_index * _character_size)), length_in_bytes);298 std::memcpy(dest, (src + (begin_index * _character_size)), length_in_bytes);
299 debug::log_msg(debug::component_trace_t::memory, debug::log_level_t::debug, "copy: vm string: %#" PRIxPTR " %d %d %#" PRIxPTR, &other, begin_index, end_index, this);299
300 if (debug::is_component_tracing_enabled<debug::component_trace_t::memory>())
301 debug::log_msg(debug::component_trace_t::memory, debug::log_level_t::debug, "copy: vm string: %#" PRIxPTR " %d %d %#" PRIxPTR, &other, begin_index, end_index, this);
300}302}
301 303
302vm_string_t::~vm_string_t()304vm_string_t::~vm_string_t()
@@ -309,10 +311,11 @@ vm_string_t::~vm_string_t() · 6 unmodified lines
309 if (_is_alloc)311 if (_is_alloc)
310 free_memory(source);312 free_memory(source);
311 313
312 debug::log_msg(debug::component_trace_t::memory, debug::log_level_t::debug, "destroy: vm string");
313
314 debug::assign_debug_pointer(&source);314 debug::assign_debug_pointer(&source);
315 debug::assign_debug_pointer(&_encoded_str);315 debug::assign_debug_pointer(&_encoded_str);
316
317 if (debug::is_component_tracing_enabled<debug::component_trace_t::memory>())
318 debug::log_msg(debug::component_trace_t::memory, debug::log_level_t::debug, "destroy: vm string");
316}319}
317 320
318vm_string_t &vm_string_t::append(const vm_string_t &other)321vm_string_t &vm_string_t::append(const vm_string_t &other)
@@ -324,6 +327,7 @@ vm_string_t &vm_string_t::append(const vm_string_t &other) · 5 unmodified lines
324 327
325 // Check if the new string has any length at all.328 // Check if the new string has any length at all.
326 const auto other_length = other._length;329 const auto other_length = other._length;
330 assert(other_length >= 0);
327 if (other_length == 0)331 if (other_length == 0)
328 return *this;332 return *this;
329 333
@@ -342,7 +346,7 @@ vm_string_t &vm_string_t::append(const vm_string_t &other) · 12 unmodified lines
342 346
343 // Define the values for the appended string347 // Define the values for the appended string
344 const auto new_length = local_length + other_length;348 const auto new_length = local_length + other_length;
345 const auto new_length_max = (new_length == 0) ? static_cast<word_t>(compute_max_length(_mem.local)) : compute_max_length(new_length);349 const auto new_length_max = compute_max_length(new_length);
346 const auto new_is_rune = local_is_rune || other_is_rune;350 const auto new_is_rune = local_is_rune || other_is_rune;
347 uint8_t *new_source = nullptr;351 uint8_t *new_source = nullptr;
348 352
@@ -497,8 +501,15 @@ const char *vm_string_t::str() const · 148 unmodified lines
497 // If the string is ASCII then return the memory501 // If the string is ASCII then return the memory
498 if (_character_size == sizeof(char))502 if (_character_size == sizeof(char))
499 {503 {
500 _encoded_str = (_is_alloc) ? reinterpret_cast<char *>(_mem.alloc) : reinterpret_cast<char *>(_mem.local);504 auto str = (_is_alloc) ? _mem.alloc : _mem.local;
501 _encoded_str[_length] = '\0';505 if (_length_max <= _length)
506 {
507 auto tmp = alloc_memory<char>(_length + 1); // +1 for null
508 str = static_cast<uint8_t *>(std::memcpy(tmp, str, _length));
509 }
510
511 _encoded_str = reinterpret_cast<char *>(str);
512 assert(_encoded_str[_length] == '\0');
502 return _encoded_str;513 return _encoded_str;
503 }514 }
504 515