912194a756
Review URL: https://codereview.chromium.org//11956004 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@17246 260f80e4-7a28-3924-810f-c04153c831b5
149 lines
4.9 KiB
C++
149 lines
4.9 KiB
C++
// Copyright (c) 2013, 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 "vm/object_store.h"
|
|
|
|
#include "vm/exceptions.h"
|
|
#include "vm/isolate.h"
|
|
#include "vm/object.h"
|
|
#include "vm/raw_object.h"
|
|
#include "vm/visitor.h"
|
|
|
|
namespace dart {
|
|
|
|
ObjectStore::ObjectStore()
|
|
: object_class_(Class::null()),
|
|
object_type_(Type::null()),
|
|
null_type_(Type::null()),
|
|
dynamic_type_(Type::null()),
|
|
void_type_(Type::null()),
|
|
function_type_(Type::null()),
|
|
type_class_(Class::null()),
|
|
number_type_(Type::null()),
|
|
int_type_(Type::null()),
|
|
integer_implementation_class_(Class::null()),
|
|
smi_class_(Class::null()),
|
|
mint_class_(Class::null()),
|
|
bigint_class_(Class::null()),
|
|
double_class_(Class::null()),
|
|
string_type_(Type::null()),
|
|
one_byte_string_class_(Class::null()),
|
|
two_byte_string_class_(Class::null()),
|
|
external_one_byte_string_class_(Class::null()),
|
|
external_two_byte_string_class_(Class::null()),
|
|
bool_type_(Type::null()),
|
|
bool_class_(Class::null()),
|
|
list_class_(Class::null()),
|
|
array_class_(Class::null()),
|
|
array_type_(Type::null()),
|
|
immutable_array_class_(Class::null()),
|
|
growable_object_array_class_(Class::null()),
|
|
int8_array_class_(Class::null()),
|
|
uint8_array_class_(Class::null()),
|
|
uint8_clamped_array_class_(Class::null()),
|
|
int16_array_class_(Class::null()),
|
|
uint16_array_class_(Class::null()),
|
|
int32_array_class_(Class::null()),
|
|
uint32_array_class_(Class::null()),
|
|
int64_array_class_(Class::null()),
|
|
uint64_array_class_(Class::null()),
|
|
float32_array_class_(Class::null()),
|
|
float64_array_class_(Class::null()),
|
|
external_int8_array_class_(Class::null()),
|
|
external_uint8_array_class_(Class::null()),
|
|
external_uint8_clamped_array_class_(Class::null()),
|
|
external_int16_array_class_(Class::null()),
|
|
external_uint16_array_class_(Class::null()),
|
|
external_int32_array_class_(Class::null()),
|
|
external_uint32_array_class_(Class::null()),
|
|
external_int64_array_class_(Class::null()),
|
|
external_uint64_array_class_(Class::null()),
|
|
external_float32_array_class_(Class::null()),
|
|
external_float64_array_class_(Class::null()),
|
|
stacktrace_class_(Class::null()),
|
|
jsregexp_class_(Class::null()),
|
|
weak_property_class_(Class::null()),
|
|
symbol_table_(Array::null()),
|
|
canonical_type_arguments_(Array::null()),
|
|
core_library_(Library::null()),
|
|
core_impl_library_(Library::null()),
|
|
math_library_(Library::null()),
|
|
isolate_library_(Library::null()),
|
|
mirrors_library_(Library::null()),
|
|
scalarlist_library_(Library::null()),
|
|
native_wrappers_library_(Library::null()),
|
|
builtin_library_(Library::null()),
|
|
root_library_(Library::null()),
|
|
libraries_(GrowableObjectArray::null()),
|
|
pending_classes_(GrowableObjectArray::null()),
|
|
sticky_error_(Error::null()),
|
|
unhandled_exception_handler_(String::null()),
|
|
empty_context_(Context::null()),
|
|
stack_overflow_(Instance::null()),
|
|
out_of_memory_(Instance::null()),
|
|
keyword_symbols_(Array::null()),
|
|
receive_port_create_function_(Function::null()),
|
|
lookup_receive_port_function_(Function::null()),
|
|
handle_message_function_(Function::null()) {
|
|
}
|
|
|
|
|
|
ObjectStore::~ObjectStore() {
|
|
}
|
|
|
|
|
|
void ObjectStore::VisitObjectPointers(ObjectPointerVisitor* visitor) {
|
|
ASSERT(visitor != NULL);
|
|
visitor->VisitPointers(from(), to());
|
|
}
|
|
|
|
|
|
void ObjectStore::Init(Isolate* isolate) {
|
|
ASSERT(isolate->object_store() == NULL);
|
|
ObjectStore* store = new ObjectStore();
|
|
isolate->set_object_store(store);
|
|
}
|
|
|
|
|
|
bool ObjectStore::PreallocateObjects() {
|
|
Isolate* isolate = Isolate::Current();
|
|
ASSERT(isolate != NULL && isolate->object_store() == this);
|
|
if (this->stack_overflow() != Instance::null() &&
|
|
this->out_of_memory() != Instance::null()) {
|
|
return true;
|
|
}
|
|
ASSERT(this->stack_overflow() == Instance::null());
|
|
ASSERT(this->out_of_memory() == Instance::null());
|
|
// TODO(regis): Reenable this code for arm and mips when possible.
|
|
#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
|
|
Object& result = Object::Handle();
|
|
|
|
result = Exceptions::Create(Exceptions::kStackOverflow,
|
|
Object::empty_array());
|
|
if (result.IsError()) {
|
|
return false;
|
|
}
|
|
set_stack_overflow(Instance::Cast(result));
|
|
|
|
result = Exceptions::Create(Exceptions::kOutOfMemory, Object::empty_array());
|
|
if (result.IsError()) {
|
|
return false;
|
|
}
|
|
set_out_of_memory(Instance::Cast(result));
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
|
|
void ObjectStore::InitKeywordTable() {
|
|
// Set up the keywords symbol array so that we can access it while scanning.
|
|
Array& keywords = Array::Handle(keyword_symbols());
|
|
ASSERT(keywords.IsNull());
|
|
keywords = Array::New(Token::numKeywords, Heap::kOld);
|
|
ASSERT(!keywords.IsError() && !keywords.IsNull());
|
|
set_keyword_symbols(keywords);
|
|
}
|
|
|
|
} // namespace dart
|