| Index: runtime/vm/precompiler.cc
|
| diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
|
| index 2131fafdc551bda867454b23bafbf1b77f07f215..0425cfc812e67c9c91912d9e94032f0187702552 100644
|
| --- a/runtime/vm/precompiler.cc
|
| +++ b/runtime/vm/precompiler.cc
|
| @@ -119,6 +119,7 @@ void Precompiler::DoCompileAll(
|
| BindStaticCalls();
|
|
|
| DedupStackmaps();
|
| + DedupStackmapLists();
|
|
|
| if (FLAG_trace_precompiler) {
|
| THR_Print("Precompiled %" Pd " functions, %" Pd " dynamic types,"
|
| @@ -1108,6 +1109,55 @@ void Precompiler::DedupStackmaps() {
|
| }
|
|
|
|
|
| +void Precompiler::DedupStackmapLists() {
|
| + class DedupStackmapListsVisitor : public FunctionVisitor {
|
| + public:
|
| + explicit DedupStackmapListsVisitor(Zone* zone) :
|
| + zone_(zone),
|
| + canonical_stackmap_lists_(),
|
| + code_(Code::Handle(zone)),
|
| + stackmaps_(Array::Handle(zone)),
|
| + stackmap_(Stackmap::Handle(zone)) {
|
| + }
|
| +
|
| + void VisitFunction(const Function& function) {
|
| + if (!function.HasCode()) {
|
| + ASSERT(function.HasImplicitClosureFunction());
|
| + return;
|
| + }
|
| + code_ = function.CurrentCode();
|
| + stackmaps_ = code_.stackmaps();
|
| + if (stackmaps_.IsNull()) return;
|
| +
|
| + stackmaps_ = DedupStackmapList(stackmaps_);
|
| + code_.set_stackmaps(stackmaps_);
|
| + }
|
| +
|
| + RawArray* DedupStackmapList(const Array& stackmaps) {
|
| + const Array* canonical_stackmap_list =
|
| + canonical_stackmap_lists_.Lookup(&stackmaps);
|
| + if (canonical_stackmap_list == NULL) {
|
| + canonical_stackmap_lists_.Insert(
|
| + &Array::ZoneHandle(zone_, stackmaps.raw()));
|
| + return stackmaps.raw();
|
| + } else {
|
| + return canonical_stackmap_list->raw();
|
| + }
|
| + }
|
| +
|
| + private:
|
| + Zone* zone_;
|
| + ArraySet canonical_stackmap_lists_;
|
| + Code& code_;
|
| + Array& stackmaps_;
|
| + Stackmap& stackmap_;
|
| + };
|
| +
|
| + DedupStackmapListsVisitor visitor(Z);
|
| + VisitFunctions(&visitor);
|
| +}
|
| +
|
| +
|
| void Precompiler::VisitFunctions(FunctionVisitor* visitor) {
|
| Library& lib = Library::Handle(Z);
|
| Class& cls = Class::Handle(Z);
|
|
|