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#include "vm/raw_object_fields.h"
6
7namespace dart {
8
9#if defined(DART_PRECOMPILER) || !defined(DART_PRODUCT)
10
11#define COMMON_CLASSES_AND_FIELDS(F) \
12 F(Class, name_) \
13 F(Class, user_name_) \
14 F(Class, functions_) \
15 F(Class, functions_hash_table_) \
16 F(Class, fields_) \
17 F(Class, offset_in_words_to_field_) \
18 F(Class, interfaces_) \
19 F(Class, script_) \
20 F(Class, library_) \
21 F(Class, type_parameters_) \
22 F(Class, super_type_) \
23 F(Class, signature_function_) \
24 F(Class, constants_) \
25 F(Class, declaration_type_) \
26 F(Class, invocation_dispatcher_cache_) \
27 F(Class, allocation_stub_) \
28 F(Class, direct_implementors_) \
29 F(Class, direct_subclasses_) \
30 F(Class, dependent_code_) \
31 F(PatchClass, patched_class_) \
32 F(PatchClass, origin_class_) \
33 F(PatchClass, script_) \
34 F(PatchClass, library_kernel_data_) \
35 F(Function, name_) \
36 F(Function, owner_) \
37 F(Function, result_type_) \
38 F(Function, parameter_types_) \
39 F(Function, parameter_names_) \
40 F(Function, type_parameters_) \
41 F(Function, data_) \
42 F(Function, ic_data_array_) \
43 F(Function, code_) \
44 F(ClosureData, context_scope_) \
45 F(ClosureData, parent_function_) \
46 F(ClosureData, signature_type_) \
47 F(ClosureData, closure_) \
48 F(SignatureData, parent_function_) \
49 F(SignatureData, signature_type_) \
50 F(RedirectionData, type_) \
51 F(RedirectionData, identifier_) \
52 F(RedirectionData, target_) \
53 F(Field, name_) \
54 F(Field, owner_) \
55 F(Field, type_) \
56 F(Field, guarded_list_length_) \
57 F(Field, dependent_code_) \
58 F(Field, initializer_function_) \
59 F(Field, host_offset_or_field_id_) \
60 F(Script, url_) \
61 F(Script, resolved_url_) \
62 F(Script, compile_time_constants_) \
63 F(Script, line_starts_) \
64 F(Script, debug_positions_) \
65 F(Script, kernel_program_info_) \
66 F(Script, source_) \
67 F(Library, name_) \
68 F(Library, url_) \
69 F(Library, private_key_) \
70 F(Library, dictionary_) \
71 F(Library, metadata_) \
72 F(Library, toplevel_class_) \
73 F(Library, used_scripts_) \
74 F(Library, loading_unit_) \
75 F(Library, imports_) \
76 F(Library, exports_) \
77 F(Library, kernel_data_) \
78 F(Library, resolved_names_) \
79 F(Library, exported_names_) \
80 F(Library, loaded_scripts_) \
81 F(Namespace, library_) \
82 F(Namespace, show_names_) \
83 F(Namespace, hide_names_) \
84 F(Namespace, metadata_field_) \
85 F(KernelProgramInfo, string_offsets_) \
86 F(KernelProgramInfo, string_data_) \
87 F(KernelProgramInfo, canonical_names_) \
88 F(KernelProgramInfo, metadata_payloads_) \
89 F(KernelProgramInfo, metadata_mappings_) \
90 F(KernelProgramInfo, scripts_) \
91 F(KernelProgramInfo, constants_) \
92 F(KernelProgramInfo, bytecode_component_) \
93 F(KernelProgramInfo, potential_natives_) \
94 F(KernelProgramInfo, potential_pragma_functions_) \
95 F(KernelProgramInfo, constants_table_) \
96 F(KernelProgramInfo, libraries_cache_) \
97 F(KernelProgramInfo, classes_cache_) \
98 F(KernelProgramInfo, retained_kernel_blob_) \
99 F(Code, object_pool_) \
100 F(Code, instructions_) \
101 F(Code, owner_) \
102 F(Code, exception_handlers_) \
103 F(Code, pc_descriptors_) \
104 F(Code, catch_entry_) \
105 F(Code, compressed_stackmaps_) \
106 F(Code, inlined_id_to_function_) \
107 F(Code, code_source_map_) \
108 F(Bytecode, object_pool_) \
109 F(Bytecode, instructions_) \
110 F(Bytecode, function_) \
111 F(Bytecode, exception_handlers_) \
112 F(Bytecode, pc_descriptors_) \
113 F(Bytecode, closures_) \
114 F(ExceptionHandlers, handled_types_data_) \
115 F(Context, parent_) \
116 F(ParameterTypeCheck, param_) \
117 F(ParameterTypeCheck, type_or_bound_) \
118 F(ParameterTypeCheck, name_) \
119 F(ParameterTypeCheck, cache_) \
120 F(SingleTargetCache, target_) \
121 F(UnlinkedCall, target_name_) \
122 F(UnlinkedCall, args_descriptor_) \
123 F(MonomorphicSmiableCall, expected_cid_) \
124 F(MonomorphicSmiableCall, target_) \
125 F(CallSiteData, target_name_) \
126 F(CallSiteData, args_descriptor_) \
127 F(ICData, entries_) \
128 F(ICData, owner_) \
129 F(MegamorphicCache, buckets_) \
130 F(MegamorphicCache, mask_) \
131 F(SubtypeTestCache, cache_) \
132 F(LoadingUnit, parent_) \
133 F(LoadingUnit, base_objects_) \
134 F(ApiError, message_) \
135 F(LanguageError, previous_error_) \
136 F(LanguageError, script_) \
137 F(LanguageError, message_) \
138 F(LanguageError, formatted_message_) \
139 F(UnhandledException, exception_) \
140 F(UnhandledException, stacktrace_) \
141 F(UnwindError, message_) \
142 F(LibraryPrefix, name_) \
143 F(LibraryPrefix, importer_) \
144 F(LibraryPrefix, imports_) \
145 F(TypeArguments, instantiations_) \
146 F(TypeArguments, length_) \
147 F(TypeArguments, hash_) \
148 F(TypeArguments, nullability_) \
149 F(AbstractType, type_test_stub_) \
150 F(Type, type_test_stub_) \
151 F(Type, type_class_id_) \
152 F(Type, arguments_) \
153 F(Type, hash_) \
154 F(Type, signature_) \
155 F(TypeRef, type_test_stub_) \
156 F(TypeRef, type_) \
157 F(TypeParameter, type_test_stub_) \
158 F(TypeParameter, name_) \
159 F(TypeParameter, hash_) \
160 F(TypeParameter, bound_) \
161 F(TypeParameter, parameterized_function_) \
162 F(Closure, instantiator_type_arguments_) \
163 F(Closure, function_type_arguments_) \
164 F(Closure, delayed_type_arguments_) \
165 F(Closure, function_) \
166 F(Closure, context_) \
167 F(Closure, hash_) \
168 F(String, length_) \
169 F(String, hash_) \
170 F(Array, type_arguments_) \
171 F(Array, length_) \
172 F(GrowableObjectArray, type_arguments_) \
173 F(GrowableObjectArray, length_) \
174 F(GrowableObjectArray, data_) \
175 F(LinkedHashMap, type_arguments_) \
176 F(LinkedHashMap, index_) \
177 F(LinkedHashMap, hash_mask_) \
178 F(LinkedHashMap, data_) \
179 F(LinkedHashMap, used_data_) \
180 F(LinkedHashMap, deleted_keys_) \
181 F(TypedData, length_) \
182 F(ExternalTypedData, length_) \
183 F(ReceivePort, send_port_) \
184 F(ReceivePort, handler_) \
185 F(StackTrace, async_link_) \
186 F(StackTrace, code_array_) \
187 F(StackTrace, pc_offset_array_) \
188 F(RegExp, num_bracket_expressions_) \
189 F(RegExp, capture_name_map_) \
190 F(RegExp, pattern_) \
191 F(RegExp, external_one_byte_function_) \
192 F(RegExp, external_two_byte_function_) \
193 F(RegExp, external_one_byte_sticky_function_) \
194 F(RegExp, external_two_byte_sticky_function_) \
195 F(WeakProperty, key_) \
196 F(WeakProperty, value_) \
197 F(MirrorReference, referent_) \
198 F(UserTag, label_) \
199 F(PointerBase, data_) \
200 F(Pointer, type_arguments_) \
201 F(DynamicLibrary, handle_) \
202 F(FfiTrampolineData, signature_type_) \
203 F(FfiTrampolineData, c_signature_) \
204 F(FfiTrampolineData, callback_target_) \
205 F(FfiTrampolineData, callback_exceptional_return_) \
206 F(TypedDataBase, length_) \
207 F(TypedDataView, typed_data_) \
208 F(TypedDataView, offset_in_bytes_) \
209 F(FutureOr, type_arguments_)
210
211#define AOT_CLASSES_AND_FIELDS(F) F(WeakSerializationReference, cid_)
212
213#define JIT_CLASSES_AND_FIELDS(F) \
214 F(Code, active_instructions_) \
215 F(Code, deopt_info_array_) \
216 F(Code, static_calls_target_table_) \
217 F(ICData, receivers_static_type_) \
218 F(Function, bytecode_) \
219 F(Function, unoptimized_code_) \
220 F(Field, saved_initial_value_) \
221 F(Field, type_test_cache_) \
222 F(WeakSerializationReference, target_)
223
224OffsetsTable::OffsetsTable(Zone* zone) : cached_offsets_(zone) {
225 for (intptr_t i = 0; offsets_table[i].class_id != -1; ++i) {
226 OffsetsTableEntry entry = offsets_table[i];
227 cached_offsets_.Insert({{entry.class_id, entry.offset}, entry.field_name});
228 }
229}
230
231const char* OffsetsTable::FieldNameForOffset(intptr_t class_id,
232 intptr_t offset) {
233 return cached_offsets_.LookupValue({class_id, offset});
234}
235
236#define DEFINE_OFFSETS_TABLE_ENTRY(class_name, field_name) \
237 {class_name::kClassId, #field_name, \
238 OFFSET_OF(class_name##Layout, field_name)},
239
240// clang-format off
241OffsetsTable::OffsetsTableEntry OffsetsTable::offsets_table[] = {
242 COMMON_CLASSES_AND_FIELDS(DEFINE_OFFSETS_TABLE_ENTRY)
243#if defined(DART_PRECOMPILED_RUNTIME)
244 AOT_CLASSES_AND_FIELDS(DEFINE_OFFSETS_TABLE_ENTRY)
245#else
246 JIT_CLASSES_AND_FIELDS(DEFINE_OFFSETS_TABLE_ENTRY)
247#endif
248 {-1, nullptr, -1}
249};
250// clang-format on
251
252#undef DEFINE_OFFSETS_TABLE_ENTRY
253
254#endif
255
256} // namespace dart
257