Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1689)

Unified Diff: runtime/vm/assembler.h

Issue 1175523002: Object pool with support for untagged entries. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/observatory/tests/service/graph_test.dart ('k') | runtime/vm/assembler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/assembler.h
diff --git a/runtime/vm/assembler.h b/runtime/vm/assembler.h
index 26f7b662ca5e660f3d58f2ad88047710c29cf79d..f2ad6fed6491405e95ac124d3c1208104c83955d 100644
--- a/runtime/vm/assembler.h
+++ b/runtime/vm/assembler.h
@@ -216,45 +216,61 @@ class AssemblerBuffer : public ValueObject {
class ObjIndexPair {
public:
// Typedefs needed for the DirectChainedHashMap template.
- typedef const Object* Key;
+ typedef ObjectPool::Entry Key;
typedef intptr_t Value;
typedef ObjIndexPair Pair;
static const intptr_t kNoIndex = -1;
- ObjIndexPair() : key_(NULL), value_(kNoIndex) { }
-
- ObjIndexPair(Key key, Value value)
- : key_(key->IsNotTemporaryScopedHandle()
- ? key : &Object::ZoneHandle(key->raw())),
- value_(value) { }
+ ObjIndexPair() : key_(static_cast<uword>(NULL), ObjectPool::kTaggedObject),
+ value_(kNoIndex) { }
+
+ ObjIndexPair(Key key, Value value) : value_(value) {
+ key_.type_ = key.type_;
+ if (key.type_ == ObjectPool::kTaggedObject) {
+ if (key.obj_->IsNotTemporaryScopedHandle()) {
+ key_.obj_ = key.obj_;
+ } else {
+ key_.obj_ = &Object::ZoneHandle(key.obj_->raw());
+ }
+ } else {
+ key_.raw_value_ = key.raw_value_;
+ }
+ }
static Key KeyOf(Pair kv) { return kv.key_; }
static Value ValueOf(Pair kv) { return kv.value_; }
static intptr_t Hashcode(Key key) {
- if (key->IsSmi()) {
- return Smi::Cast(*key).Value();
+ if (key.type_ != ObjectPool::kTaggedObject) {
+ return key.raw_value_;
}
- if (key->IsDouble()) {
+ if (key.obj_->IsSmi()) {
+ return Smi::Cast(*key.obj_).Value();
+ }
+ if (key.obj_->IsDouble()) {
return static_cast<intptr_t>(
bit_cast<int32_t, float>(
- static_cast<float>(Double::Cast(*key).value())));
+ static_cast<float>(Double::Cast(*key.obj_).value())));
}
- if (key->IsMint()) {
- return static_cast<intptr_t>(Mint::Cast(*key).value());
+ if (key.obj_->IsMint()) {
+ return static_cast<intptr_t>(Mint::Cast(*key.obj_).value());
}
- if (key->IsString()) {
- return String::Cast(*key).Hash();
+ if (key.obj_->IsString()) {
+ return String::Cast(*key.obj_).Hash();
}
// TODO(fschneider): Add hash function for other classes commonly used as
// compile-time constants.
- return key->GetClassId();
+ return key.obj_->GetClassId();
}
static inline bool IsKeyEqual(Pair kv, Key key) {
- return kv.key_->raw() == key->raw();
+ if (kv.key_.type_ != key.type_) return false;
+ if (kv.key_.type_ == ObjectPool::kTaggedObject) {
+ return kv.key_.obj_->raw() == key.obj_->raw();
+ }
+ return kv.key_.raw_value_ == key.raw_value_;
}
private:
@@ -269,25 +285,26 @@ enum Patchability {
};
-class ObjectPool : public ValueObject {
+class ObjectPoolWrapper : public ValueObject {
public:
- ObjectPool() : object_pool_(GrowableObjectArray::Handle()) { }
-
- intptr_t AddObject(const Object& obj, Patchability patchable);
+ intptr_t AddObject(const Object& obj);
+ intptr_t AddImmediate(uword imm);
intptr_t AddExternalLabel(const ExternalLabel* label,
Patchability patchable);
- intptr_t FindObject(const Object& obj, Patchability patchable);
+ intptr_t FindObject(const Object& obj);
+ intptr_t FindImmediate(uword imm);
intptr_t FindExternalLabel(const ExternalLabel* label,
Patchability patchable);
- const GrowableObjectArray& data() const { return object_pool_; }
+
+ RawObjectPool* MakeObjectPool();
private:
- // Objects and jump targets.
- GrowableObjectArray& object_pool_;
+ intptr_t AddObject(ObjectPool::Entry entry, Patchability patchable);
+ intptr_t FindObject(ObjectPool::Entry entry, Patchability patchable);
- // Patchability of pool entries.
- GrowableArray<Patchability> patchable_pool_entries_;
+ // Objects and jump targets.
+ GrowableArray<ObjectPool::Entry> object_pool_;
// Hashmap for fast lookup in object pool.
DirectChainedHashMap<ObjIndexPair> object_pool_index_table_;
« no previous file with comments | « runtime/observatory/tests/service/graph_test.dart ('k') | runtime/vm/assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698