Files
sdk/runtime/vm/fixed_cache_test.cc
T
Dmitry Olshansky 170aa90158 Re-landing of "replace TrySync with Metadata".
Use that to sync variables to predefined stack
slots inside of exception handler, not before
each MayThrow() instruction.

In JIT mode we can avoid storing extra metadata
by using deopt info instead.

Introduce caching of metadata and
exception handler based on PC.

R=fschneider@google.com, vegorov@google.com

Review-Url: https://codereview.chromium.org/2734323003 .
2017-03-13 13:27:00 +01:00

97 lines
2.5 KiB
C++

// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#include <string.h>
#include "platform/assert.h"
#include "vm/fixed_cache.h"
#include "vm/unit_test.h"
namespace dart {
UNIT_TEST_CASE(FixedCacheEmpty) {
FixedCache<int, int, 2> cache;
EXPECT(cache.Lookup(0) == NULL);
EXPECT(cache.Lookup(1) == NULL);
cache.Insert(1, 2);
EXPECT(*cache.Lookup(1) == 2);
EXPECT(cache.Lookup(0) == NULL);
}
UNIT_TEST_CASE(FixedCacheHalfFull) {
FixedCache<int, const char*, 8> cache;
// Insert at end.
cache.Insert(10, "a");
cache.Insert(20, "b");
cache.Insert(40, "c");
// Insert in the middle.
cache.Insert(15, "ab");
cache.Insert(25, "bc");
// Insert in front.
cache.Insert(5, "_");
// Check all items.
EXPECT(strcmp(*cache.Lookup(5), "_") == 0);
EXPECT(strcmp(*cache.Lookup(10), "a") == 0);
EXPECT(strcmp(*cache.Lookup(20), "b") == 0);
EXPECT(strcmp(*cache.Lookup(40), "c") == 0);
EXPECT(strcmp(*cache.Lookup(25), "bc") == 0);
// Non-existent - front, middle, end.
EXPECT(cache.Lookup(1) == NULL);
EXPECT(cache.Lookup(35) == NULL);
EXPECT(cache.Lookup(50) == NULL);
}
struct Resource {
Resource() : id(0) { copies++; }
explicit Resource(int id_) : id(id_) { copies++; }
Resource(const Resource& r) {
id = r.id;
copies++;
}
Resource& operator=(const Resource& r) {
id = r.id;
return *this;
}
~Resource() { copies--; }
int id;
static int copies;
};
int Resource::copies = 0;
UNIT_TEST_CASE(FixedCacheFullResource) {
{
FixedCache<int, Resource, 6> cache;
cache.Insert(10, Resource(2));
cache.Insert(20, Resource(4));
cache.Insert(40, Resource(16));
cache.Insert(30, Resource(8));
EXPECT(cache.Lookup(40)->id == 16);
EXPECT(cache.Lookup(5) == NULL);
EXPECT(cache.Lookup(0) == NULL);
// Insert in the front, middle.
cache.Insert(5, Resource(1));
cache.Insert(15, Resource(3));
cache.Insert(25, Resource(6));
// 40 got removed by shifting.
EXPECT(cache.Lookup(40) == NULL);
EXPECT(cache.Lookup(5)->id == 1);
EXPECT(cache.Lookup(15)->id == 3);
EXPECT(cache.Lookup(25)->id == 6);
// Insert at end top - 30 gets replaced by 40.
cache.Insert(40, Resource(16));
EXPECT(cache.Lookup(40)->id == 16);
EXPECT(cache.Lookup(30) == NULL);
}
EXPECT(Resource::copies == 0);
}
} // namespace dart