1// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4//
5// This file (and "raw_object_fields.cc") provide a kind of reflection that
6// allows us to identify the name of fields in hand-written "Raw..." classes
7// (from "raw_object.h") given the class and the offset within the object. This
8// is used for example by the snapshot profile writer ("v8_snapshot_writer.h")
9// to show the property names of these built-in objects in the snapshot profile.
10
11#ifndef RUNTIME_VM_RAW_OBJECT_FIELDS_H_
12#define RUNTIME_VM_RAW_OBJECT_FIELDS_H_
13
14#include <utility>
15
16#include "vm/hash_map.h"
17#include "vm/object.h"
18#include "vm/raw_object.h"
19
20namespace dart {
21
22#if defined(DART_PRECOMPILER) || !defined(DART_PRODUCT)
23
24class OffsetsTable : public ZoneAllocated {
25 public:
26 explicit OffsetsTable(Zone* zone);
27
28 // Returns 'nullptr' if no offset was found.
29 // Otherwise, the returned string is allocated in global static memory.
30 const char* FieldNameForOffset(intptr_t cid, intptr_t offset);
31
32 struct OffsetsTableEntry {
33 const intptr_t class_id;
34 const char* field_name;
35 intptr_t offset;
36 };
37
38 static OffsetsTableEntry offsets_table[];
39
40 private:
41 struct IntAndIntToStringMapTraits {
42 typedef std::pair<intptr_t, intptr_t> Key;
43 typedef const char* Value;
44
45 struct Pair {
46 Key key;
47 Value value;
48 Pair() : key({-1, -1}), value(nullptr) {}
49 Pair(Key k, Value v) : key(k), value(v) {}
50 };
51
52 static Value ValueOf(Pair pair) { return pair.value; }
53 static Key KeyOf(Pair pair) { return pair.key; }
54 static size_t Hashcode(Key key) { return key.first ^ key.second; }
55 static bool IsKeyEqual(Pair x, Key y) {
56 return x.key.first == y.first && x.key.second == y.second;
57 }
58 };
59
60 DirectChainedHashMap<IntAndIntToStringMapTraits> cached_offsets_;
61};
62
63#else
64
65class OffsetsTable : public ZoneAllocated {
66 public:
67 explicit OffsetsTable(Zone* zone) {}
68
69 const char* FieldNameForOffset(intptr_t cid, intptr_t offset) {
70 return nullptr;
71 }
72};
73
74#endif
75
76} // namespace dart
77
78#endif // RUNTIME_VM_RAW_OBJECT_FIELDS_H_
79