commit | c532458e092841c97c6f7f66982e88cd596c0bd9 | [log] [tgz] |
---|---|---|
author | Alexander Markov <alexmarkov@google.com> | Thu May 09 23:16:38 2019 +0000 |
committer | commit-bot@chromium.org <commit-bot@chromium.org> | Thu May 09 23:16:38 2019 +0000 |
tree | 03c6216d178e52265f300b4f35a237aac9ab7ffa | |
parent | 2736dab879cdab4b038948c3188731679bb2a4ad [diff] |
[vm/compiler] Fix for flaky crash in CallSpecializer::ReplaceWithInstanceOf There were rare crashes ../../runtime/vm/compiler/call_specializer.cc: 1393: error: expected: call->MatchesCoreName(Symbols::_simpleInstanceOf()) version=2.3.0-edge.796ebc6069bde3a59475a9b45075f49e50b0cc34 (Thu May 9 09:38:28 2019 -0700) on "linux_x64" thread=82540, isolate=vm-service(0x558748c5d200) pc 0x000055874635dd6c fp 0x00007fa94dd3bf30 dart::Profiler::DumpStackTrace(void*) pc 0x0000558745f90332 fp 0x00007fa94dd3c010 dart::Assert::Fail(char const*, ...) pc 0x000055874653909b fp 0x00007fa94dd3c0a0 dart::CallSpecializer::ReplaceWithInstanceOf(dart::InstanceCallInstr*) pc 0x0000558746496ed6 fp 0x00007fa94dd3c0f0 dart::FlowGraphVisitor::VisitBlocks() when running tools/test.py --repeat 5000 -n dartkb-mixed-linux-debug-x64 language_2/null_test at the rate ~1-3 crashes per 30,000 test cases. The problem is that in function bool InstanceCallInstr::MatchesCoreName(const String& name) { return function_name().raw() == Library::PrivateCoreLibName(name).raw(); } 'function_name().raw()' is evaluated before PrivateCoreLibName(name) is called and saved in a temporary (register). PrivateCoreLibName may trigger GC and relocate objects. In such case, 'PrivateCoreLibName(name).raw()' results in a moved object, which is compared to a stale object address. This CL fixes InstanceCallInstr::MatchesCoreName and other similar places by introducing Library::IsPrivateCoreLibName, which is also a little bit more efficient as it avoids extra symbol table lookup. Change-Id: I4dc91c586b0c595a3e85d6da13b98fc2248fb8fd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/102120 Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Aart Bik <ajcbik@google.com>
Dart is an open-source, scalable programming language, with robust libraries and runtimes, for building web, server, and mobile apps.
Visit the dartlang.org to learn more about the language, tools, getting started, and more.
Browse pub.dartlang.org for more packages and libraries contributed by the community and the Dart team.
If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.
There are more documents on our wiki.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.