170aa90158
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 .
97 lines
2.5 KiB
C++
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
|