Files
sdk/runtime/vm/object_store.h
T
Regis Crelier 7f57ebcfa1 Remove signature classes from the VM.
They were used as the class of closure instances and as the type class of
function types.
All closure instances now have class _Closure and function types are represented
by a new class FunctionType extending AbstractType.
Fix issue 24567 and add regression test.

R=asiva@google.com, rmacnak@google.com

Review URL: https://codereview.chromium.org/1584223006 .
2016-01-19 16:32:59 -08:00

600 lines
18 KiB
C++

// Copyright (c) 2012, 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.
#ifndef VM_OBJECT_STORE_H_
#define VM_OBJECT_STORE_H_
#include "vm/object.h"
namespace dart {
// Forward declarations.
class Isolate;
class ObjectPointerVisitor;
// The object store is a per isolate instance which stores references to
// objects used by the VM.
// TODO(iposva): Move the actual store into the object heap for quick handling
// by snapshots eventually.
class ObjectStore {
public:
enum BootstrapLibraryId {
kNone = 0,
kAsync,
kCore,
kCollection,
kConvert,
kDeveloper,
kInternal,
kIsolate,
kMath,
kMirrors,
kProfiler,
kTypedData,
kVMService,
};
~ObjectStore();
RawClass* object_class() const {
ASSERT(object_class_ != Object::null());
return object_class_;
}
void set_object_class(const Class& value) { object_class_ = value.raw(); }
static intptr_t object_class_offset() {
return OFFSET_OF(ObjectStore, object_class_);
}
RawType* object_type() const { return object_type_; }
void set_object_type(const Type& value) {
object_type_ = value.raw();
}
RawClass* null_class() const {
ASSERT(null_class_ != Object::null());
return null_class_;
}
void set_null_class(const Class& value) { null_class_ = value.raw(); }
RawType* null_type() const { return null_type_; }
void set_null_type(const Type& value) {
null_type_ = value.raw();
}
RawType* function_type() const { return function_type_; }
void set_function_type(const Type& value) {
function_type_ = value.raw();
}
RawClass* closure_class() const { return closure_class_; }
void set_closure_class(const Class& value) {
closure_class_ = value.raw();
}
RawType* number_type() const { return number_type_; }
void set_number_type(const Type& value) {
number_type_ = value.raw();
}
RawType* int_type() const { return int_type_; }
void set_int_type(const Type& value) {
int_type_ = value.raw();
}
RawClass* integer_implementation_class() const {
return integer_implementation_class_;
}
void set_integer_implementation_class(const Class& value) {
integer_implementation_class_ = value.raw();
}
RawClass* smi_class() const { return smi_class_; }
void set_smi_class(const Class& value) { smi_class_ = value.raw(); }
RawType* smi_type() const { return smi_type_; }
void set_smi_type(const Type& value) { smi_type_ = value.raw();
}
RawClass* double_class() const { return double_class_; }
void set_double_class(const Class& value) { double_class_ = value.raw(); }
RawType* double_type() const { return double_type_; }
void set_double_type(const Type& value) { double_type_ = value.raw(); }
RawClass* mint_class() const { return mint_class_; }
void set_mint_class(const Class& value) { mint_class_ = value.raw(); }
RawType* mint_type() const { return mint_type_; }
void set_mint_type(const Type& value) { mint_type_ = value.raw(); }
RawClass* bigint_class() const { return bigint_class_; }
void set_bigint_class(const Class& value) { bigint_class_ = value.raw(); }
RawType* string_type() const { return string_type_; }
void set_string_type(const Type& value) {
string_type_ = value.raw();
}
RawClass* future_class() const { return future_class_; }
void set_future_class(const Class& value) {
future_class_ = value.raw();
}
RawClass* completer_class() const { return completer_class_; }
void set_completer_class(const Class& value) {
completer_class_ = value.raw();
}
RawClass* stream_iterator_class() const { return stream_iterator_class_; }
void set_stream_iterator_class(const Class& value) {
stream_iterator_class_ = value.raw();
}
RawClass* symbol_class() { return symbol_class_; }
void set_symbol_class(const Class& value) {
symbol_class_ = value.raw();
}
RawClass* one_byte_string_class() const { return one_byte_string_class_; }
void set_one_byte_string_class(const Class& value) {
one_byte_string_class_ = value.raw();
}
RawClass* two_byte_string_class() const { return two_byte_string_class_; }
void set_two_byte_string_class(const Class& value) {
two_byte_string_class_ = value.raw();
}
RawClass* external_one_byte_string_class() const {
return external_one_byte_string_class_;
}
void set_external_one_byte_string_class(const Class& value) {
external_one_byte_string_class_ = value.raw();
}
RawClass* external_two_byte_string_class() const {
return external_two_byte_string_class_;
}
void set_external_two_byte_string_class(const Class& value) {
external_two_byte_string_class_ = value.raw();
}
RawType* bool_type() const { return bool_type_; }
void set_bool_type(const Type& value) { bool_type_ = value.raw(); }
RawClass* bool_class() const { return bool_class_; }
void set_bool_class(const Class& value) { bool_class_ = value.raw(); }
RawClass* array_class() const { return array_class_; }
void set_array_class(const Class& value) { array_class_ = value.raw(); }
static intptr_t array_class_offset() {
return OFFSET_OF(ObjectStore, array_class_);
}
RawType* array_type() const { return array_type_; }
void set_array_type(const Type& value) { array_type_ = value.raw(); }
RawClass* immutable_array_class() const { return immutable_array_class_; }
void set_immutable_array_class(const Class& value) {
immutable_array_class_ = value.raw();
}
RawClass* growable_object_array_class() const {
return growable_object_array_class_;
}
void set_growable_object_array_class(const Class& value) {
growable_object_array_class_ = value.raw();
}
static intptr_t growable_object_array_class_offset() {
return OFFSET_OF(ObjectStore, growable_object_array_class_);
}
RawClass* linked_hash_map_class() const {
return linked_hash_map_class_;
}
void set_linked_hash_map_class(const Class& value) {
linked_hash_map_class_ = value.raw();
}
RawClass* float32x4_class() const {
return float32x4_class_;
}
void set_float32x4_class(const Class& value) {
float32x4_class_ = value.raw();
}
RawType* float32x4_type() const { return float32x4_type_; }
void set_float32x4_type(const Type& value) { float32x4_type_ = value.raw(); }
RawClass* int32x4_class() const {
return int32x4_class_;
}
void set_int32x4_class(const Class& value) {
int32x4_class_ = value.raw();
}
RawType* int32x4_type() const { return int32x4_type_; }
void set_int32x4_type(const Type& value) { int32x4_type_ = value.raw(); }
RawClass* float64x2_class() const {
return float64x2_class_;
}
void set_float64x2_class(const Class& value) {
float64x2_class_ = value.raw();
}
RawType* float64x2_type() const { return float64x2_type_; }
void set_float64x2_type(const Type& value) { float64x2_type_ = value.raw(); }
RawClass* error_class() const {
return error_class_;
}
void set_error_class(const Class& value) {
error_class_ = value.raw();
}
static intptr_t error_class_offset() {
return OFFSET_OF(ObjectStore, error_class_);
}
RawClass* weak_property_class() const {
return weak_property_class_;
}
void set_weak_property_class(const Class& value) {
weak_property_class_ = value.raw();
}
RawArray* symbol_table() const { return symbol_table_; }
void set_symbol_table(const Array& value) { symbol_table_ = value.raw(); }
RawArray* canonical_type_arguments() const {
return canonical_type_arguments_;
}
void set_canonical_type_arguments(const Array& value) {
canonical_type_arguments_ = value.raw();
}
RawLibrary* async_library() const { return async_library_; }
RawLibrary* builtin_library() const { return builtin_library_; }
RawLibrary* core_library() const { return core_library_; }
RawLibrary* collection_library() const { return collection_library_; }
RawLibrary* convert_library() const { return convert_library_; }
RawLibrary* developer_library() const { return developer_library_; }
RawLibrary* internal_library() const { return internal_library_; }
RawLibrary* isolate_library() const { return isolate_library_; }
RawLibrary* math_library() const { return math_library_; }
RawLibrary* mirrors_library() const { return mirrors_library_; }
RawLibrary* profiler_library() const { return profiler_library_; }
RawLibrary* typed_data_library() const { return typed_data_library_; }
RawLibrary* vmservice_library() const { return vmservice_library_; }
void set_bootstrap_library(BootstrapLibraryId index, const Library& value) {
switch (index) {
case kAsync:
async_library_ = value.raw();
break;
case kCore:
core_library_ = value.raw();
break;
case kCollection:
collection_library_ = value.raw();
break;
case kConvert:
convert_library_ = value.raw();
break;
case kDeveloper:
developer_library_ = value.raw();
break;
case kInternal:
internal_library_ = value.raw();
break;
case kIsolate:
isolate_library_ = value.raw();
break;
case kMath:
math_library_ = value.raw();
break;
case kMirrors:
mirrors_library_ = value.raw();
break;
case kProfiler:
profiler_library_ = value.raw();
break;
case kTypedData:
typed_data_library_ = value.raw();
break;
case kVMService:
vmservice_library_ = value.raw();
break;
default:
UNREACHABLE();
}
}
void set_builtin_library(const Library& value) {
builtin_library_ = value.raw();
}
RawLibrary* native_wrappers_library() const {
return native_wrappers_library_;
}
void set_native_wrappers_library(const Library& value) {
native_wrappers_library_ = value.raw();
}
RawLibrary* root_library() const { return root_library_; }
void set_root_library(const Library& value) {
root_library_ = value.raw();
}
RawGrowableObjectArray* libraries() const { return libraries_; }
void set_libraries(const GrowableObjectArray& value) {
libraries_ = value.raw();
}
RawGrowableObjectArray* closure_functions() const {
return closure_functions_;
}
void set_closure_functions(const GrowableObjectArray& value) {
ASSERT(!value.IsNull());
closure_functions_ = value.raw();
}
RawGrowableObjectArray* pending_classes() const { return pending_classes_; }
void set_pending_classes(const GrowableObjectArray& value) {
ASSERT(!value.IsNull());
pending_classes_ = value.raw();
}
RawGrowableObjectArray* pending_deferred_loads() const {
return pending_deferred_loads_;
}
void clear_pending_deferred_loads() {
pending_deferred_loads_ = GrowableObjectArray::New();
}
RawGrowableObjectArray* resume_capabilities() const {
return resume_capabilities_;
}
RawGrowableObjectArray* exit_listeners() const {
return exit_listeners_;
}
RawGrowableObjectArray* error_listeners() const {
return error_listeners_;
}
RawError* sticky_error() const { return sticky_error_; }
void set_sticky_error(const Error& value) {
// TODO(asiva): Move sticky_error_ into thread specific area.
ASSERT(Thread::Current()->IsMutatorThread());
ASSERT(!value.IsNull());
sticky_error_ = value.raw();
}
void clear_sticky_error() { sticky_error_ = Error::null(); }
RawContext* empty_context() const { return empty_context_; }
void set_empty_context(const Context& value) {
empty_context_ = value.raw();
}
RawInstance* stack_overflow() const { return stack_overflow_; }
void set_stack_overflow(const Instance& value) {
stack_overflow_ = value.raw();
}
RawInstance* out_of_memory() const { return out_of_memory_; }
void set_out_of_memory(const Instance& value) {
out_of_memory_ = value.raw();
}
RawUnhandledException* preallocated_unhandled_exception() const {
return preallocated_unhandled_exception_;
}
void set_preallocated_unhandled_exception(const UnhandledException& value) {
preallocated_unhandled_exception_ = value.raw();
}
RawStacktrace* preallocated_stack_trace() const {
return preallocated_stack_trace_;
}
void set_preallocated_stack_trace(const Stacktrace& value) {
preallocated_stack_trace_ = value.raw();
}
RawFunction* lookup_port_handler() const {
return lookup_port_handler_;
}
void set_lookup_port_handler(const Function& function) {
lookup_port_handler_ = function.raw();
}
RawTypedData* empty_uint32_array() const {
return empty_uint32_array_;
}
void set_empty_uint32_array(const TypedData& array) {
// Only set once.
ASSERT(empty_uint32_array_ == TypedData::null());
ASSERT(!array.IsNull());
empty_uint32_array_ = array.raw();
}
RawFunction* handle_message_function() const {
return handle_message_function_;
}
void set_handle_message_function(const Function& function) {
handle_message_function_ = function.raw();
}
RawArray* library_load_error_table() const {
return library_load_error_table_;
}
void set_library_load_error_table(const Array& table) {
library_load_error_table_ = table.raw();
}
static intptr_t library_load_error_table_offset() {
return OFFSET_OF(ObjectStore, library_load_error_table_);
}
RawArray* compile_time_constants() const {
return compile_time_constants_;
}
void set_compile_time_constants(const Array& value) {
compile_time_constants_ = value.raw();
}
RawArray* unique_dynamic_targets() const {
return unique_dynamic_targets_;
}
void set_unique_dynamic_targets(const Array& value) {
unique_dynamic_targets_ = value.raw();
}
RawGrowableObjectArray* token_objects() const {
return token_objects_;
}
void set_token_objects(const GrowableObjectArray& value) {
token_objects_ = value.raw();
}
RawArray* token_objects_map() const {
return token_objects_map_;
}
void set_token_objects_map(const Array& value) {
token_objects_map_ = value.raw();
}
RawGrowableObjectArray* megamorphic_cache_table() const {
return megamorphic_cache_table_;
}
void set_megamorphic_cache_table(const GrowableObjectArray& value) {
megamorphic_cache_table_ = value.raw();
}
RawCode* megamorphic_miss_code() const {
return megamorphic_miss_code_;
}
RawFunction* megamorphic_miss_function() const {
return megamorphic_miss_function_;
}
void SetMegamorphicMissHandler(const Code& code, const Function& func) {
// Hold onto the code so it is traced and not detached from the function.
megamorphic_miss_code_ = code.raw();
megamorphic_miss_function_ = func.raw();
}
// Visit all object pointers.
void VisitObjectPointers(ObjectPointerVisitor* visitor);
// Called to initialize objects required by the vm but which invoke
// dart code. If an error occurs then false is returned and error
// information is stored in sticky_error().
bool PreallocateObjects();
void InitKnownObjects();
static void Init(Isolate* isolate);
private:
ObjectStore();
RawObject** from() { return reinterpret_cast<RawObject**>(&object_class_); }
RawClass* object_class_;
RawType* object_type_;
RawClass* null_class_;
RawType* null_type_;
RawType* function_type_;
RawClass* closure_class_;
RawType* number_type_;
RawType* int_type_;
RawClass* integer_implementation_class_;
RawClass* smi_class_;
RawType* smi_type_;
RawClass* mint_class_;
RawType* mint_type_;
RawClass* bigint_class_;
RawClass* double_class_;
RawType* double_type_;
RawType* float32x4_type_;
RawType* int32x4_type_;
RawType* float64x2_type_;
RawType* string_type_;
RawClass* future_class_;
RawClass* completer_class_;
RawClass* stream_iterator_class_;
RawClass* symbol_class_;
RawClass* one_byte_string_class_;
RawClass* two_byte_string_class_;
RawClass* external_one_byte_string_class_;
RawClass* external_two_byte_string_class_;
RawType* bool_type_;
RawClass* bool_class_;
RawClass* array_class_;
RawType* array_type_;
RawClass* immutable_array_class_;
RawClass* growable_object_array_class_;
RawClass* linked_hash_map_class_;
RawClass* float32x4_class_;
RawClass* int32x4_class_;
RawClass* float64x2_class_;
RawClass* error_class_;
RawClass* weak_property_class_;
RawArray* symbol_table_;
RawArray* canonical_type_arguments_;
RawLibrary* async_library_;
RawLibrary* builtin_library_;
RawLibrary* core_library_;
RawLibrary* collection_library_;
RawLibrary* convert_library_;
RawLibrary* developer_library_;
RawLibrary* internal_library_;
RawLibrary* isolate_library_;
RawLibrary* math_library_;
RawLibrary* mirrors_library_;
RawLibrary* native_wrappers_library_;
RawLibrary* profiler_library_;
RawLibrary* root_library_;
RawLibrary* typed_data_library_;
RawLibrary* vmservice_library_;
RawGrowableObjectArray* libraries_;
RawGrowableObjectArray* closure_functions_;
RawGrowableObjectArray* pending_classes_;
RawGrowableObjectArray* pending_deferred_loads_;
RawGrowableObjectArray* resume_capabilities_;
RawGrowableObjectArray* exit_listeners_;
RawGrowableObjectArray* error_listeners_;
RawError* sticky_error_;
RawContext* empty_context_;
RawInstance* stack_overflow_;
RawInstance* out_of_memory_;
RawUnhandledException* preallocated_unhandled_exception_;
RawStacktrace* preallocated_stack_trace_;
RawFunction* lookup_port_handler_;
RawTypedData* empty_uint32_array_;
RawFunction* handle_message_function_;
RawArray* library_load_error_table_;
RawArray* compile_time_constants_;
RawObject** to_snapshot() {
return reinterpret_cast<RawObject**>(&compile_time_constants_);
}
RawArray* unique_dynamic_targets_;
RawGrowableObjectArray* token_objects_;
RawArray* token_objects_map_;
RawGrowableObjectArray* megamorphic_cache_table_;
RawCode* megamorphic_miss_code_;
RawFunction* megamorphic_miss_function_;
RawObject** to() {
return reinterpret_cast<RawObject**>(&megamorphic_miss_function_);
}
friend class FullSnapshotWriter;
friend class SnapshotReader;
friend class VmIsolateSnapshotReader;
DISALLOW_COPY_AND_ASSIGN(ObjectStore);
};
} // namespace dart
#endif // VM_OBJECT_STORE_H_