Index: src/handles.cc |
=================================================================== |
--- src/handles.cc (revision 7267) |
+++ src/handles.cc (working copy) |
@@ -45,57 +45,62 @@ |
namespace internal { |
-v8::ImplementationUtilities::HandleScopeData HandleScope::current_ = |
- { NULL, NULL, 0 }; |
- |
- |
int HandleScope::NumberOfHandles() { |
- int n = HandleScopeImplementer::instance()->blocks()->length(); |
+ Isolate* isolate = Isolate::Current(); |
+ HandleScopeImplementer* impl = isolate->handle_scope_implementer(); |
+ int n = impl->blocks()->length(); |
if (n == 0) return 0; |
return ((n - 1) * kHandleBlockSize) + static_cast<int>( |
- (current_.next - HandleScopeImplementer::instance()->blocks()->last())); |
+ (isolate->handle_scope_data()->next - impl->blocks()->last())); |
} |
Object** HandleScope::Extend() { |
- Object** result = current_.next; |
+ Isolate* isolate = Isolate::Current(); |
+ v8::ImplementationUtilities::HandleScopeData* current = |
+ isolate->handle_scope_data(); |
- ASSERT(result == current_.limit); |
+ Object** result = current->next; |
+ |
+ ASSERT(result == current->limit); |
// Make sure there's at least one scope on the stack and that the |
// top of the scope stack isn't a barrier. |
- if (current_.level == 0) { |
+ if (current->level == 0) { |
Utils::ReportApiFailure("v8::HandleScope::CreateHandle()", |
"Cannot create a handle without a HandleScope"); |
return NULL; |
} |
- HandleScopeImplementer* impl = HandleScopeImplementer::instance(); |
+ HandleScopeImplementer* impl = isolate->handle_scope_implementer(); |
// If there's more room in the last block, we use that. This is used |
// for fast creation of scopes after scope barriers. |
if (!impl->blocks()->is_empty()) { |
Object** limit = &impl->blocks()->last()[kHandleBlockSize]; |
- if (current_.limit != limit) { |
- current_.limit = limit; |
- ASSERT(limit - current_.next < kHandleBlockSize); |
+ if (current->limit != limit) { |
+ current->limit = limit; |
+ ASSERT(limit - current->next < kHandleBlockSize); |
} |
} |
// If we still haven't found a slot for the handle, we extend the |
// current handle scope by allocating a new handle block. |
- if (result == current_.limit) { |
+ if (result == current->limit) { |
// If there's a spare block, use it for growing the current scope. |
result = impl->GetSpareOrNewBlock(); |
// Add the extension to the global list of blocks, but count the |
// extension as part of the current scope. |
impl->blocks()->Add(result); |
- current_.limit = &result[kHandleBlockSize]; |
+ current->limit = &result[kHandleBlockSize]; |
} |
return result; |
} |
-void HandleScope::DeleteExtensions() { |
- HandleScopeImplementer::instance()->DeleteExtensions(current_.limit); |
+void HandleScope::DeleteExtensions(Isolate* isolate) { |
+ ASSERT(isolate == Isolate::Current()); |
+ v8::ImplementationUtilities::HandleScopeData* current = |
+ isolate->handle_scope_data(); |
+ isolate->handle_scope_implementer()->DeleteExtensions(current->limit); |
} |
@@ -108,37 +113,44 @@ |
Address HandleScope::current_level_address() { |
- return reinterpret_cast<Address>(¤t_.level); |
+ return reinterpret_cast<Address>( |
+ &Isolate::Current()->handle_scope_data()->level); |
} |
Address HandleScope::current_next_address() { |
- return reinterpret_cast<Address>(¤t_.next); |
+ return reinterpret_cast<Address>( |
+ &Isolate::Current()->handle_scope_data()->next); |
} |
Address HandleScope::current_limit_address() { |
- return reinterpret_cast<Address>(¤t_.limit); |
+ return reinterpret_cast<Address>( |
+ &Isolate::Current()->handle_scope_data()->limit); |
} |
Handle<FixedArray> AddKeysFromJSArray(Handle<FixedArray> content, |
Handle<JSArray> array) { |
- CALL_HEAP_FUNCTION(content->AddKeysFromJSArray(*array), FixedArray); |
+ CALL_HEAP_FUNCTION(content->GetHeap()->isolate(), |
+ content->AddKeysFromJSArray(*array), FixedArray); |
} |
Handle<FixedArray> UnionOfKeys(Handle<FixedArray> first, |
Handle<FixedArray> second) { |
- CALL_HEAP_FUNCTION(first->UnionOfKeys(*second), FixedArray); |
+ CALL_HEAP_FUNCTION(first->GetHeap()->isolate(), |
+ first->UnionOfKeys(*second), FixedArray); |
} |
Handle<JSGlobalProxy> ReinitializeJSGlobalProxy( |
Handle<JSFunction> constructor, |
Handle<JSGlobalProxy> global) { |
- CALL_HEAP_FUNCTION(Heap::ReinitializeJSGlobalProxy(*constructor, *global), |
- JSGlobalProxy); |
+ CALL_HEAP_FUNCTION( |
+ constructor->GetHeap()->isolate(), |
+ constructor->GetHeap()->ReinitializeJSGlobalProxy(*constructor, *global), |
+ JSGlobalProxy); |
} |
@@ -153,7 +165,8 @@ |
func->shared()->set_expected_nof_properties(nof); |
if (func->has_initial_map()) { |
Handle<Map> new_initial_map = |
- Factory::CopyMapDropTransitions(Handle<Map>(func->initial_map())); |
+ func->GetIsolate()->factory()->CopyMapDropTransitions( |
+ Handle<Map>(func->initial_map())); |
new_initial_map->set_unused_property_fields(nof); |
func->set_initial_map(*new_initial_map); |
} |
@@ -161,7 +174,8 @@ |
void SetPrototypeProperty(Handle<JSFunction> func, Handle<JSObject> value) { |
- CALL_HEAP_FUNCTION_VOID(func->SetPrototype(*value)); |
+ CALL_HEAP_FUNCTION_VOID(func->GetHeap()->isolate(), |
+ func->SetPrototype(*value)); |
} |
@@ -193,20 +207,23 @@ |
void NormalizeProperties(Handle<JSObject> object, |
PropertyNormalizationMode mode, |
int expected_additional_properties) { |
- CALL_HEAP_FUNCTION_VOID(object->NormalizeProperties( |
- mode, |
- expected_additional_properties)); |
+ CALL_HEAP_FUNCTION_VOID(object->GetHeap()->isolate(), |
+ object->NormalizeProperties( |
+ mode, |
+ expected_additional_properties)); |
} |
void NormalizeElements(Handle<JSObject> object) { |
- CALL_HEAP_FUNCTION_VOID(object->NormalizeElements()); |
+ CALL_HEAP_FUNCTION_VOID(object->GetHeap()->isolate(), |
+ object->NormalizeElements()); |
} |
void TransformToFastProperties(Handle<JSObject> object, |
int unused_property_fields) { |
CALL_HEAP_FUNCTION_VOID( |
+ object->GetHeap()->isolate(), |
object->TransformToFastProperties(unused_property_fields)); |
} |
@@ -215,24 +232,26 @@ |
uint32_t index, |
Handle<Object> value, |
PropertyDetails details) { |
- CALL_HEAP_FUNCTION_VOID(dictionary->Set(index, *value, details)); |
+ CALL_HEAP_FUNCTION_VOID(dictionary->GetIsolate(), |
+ dictionary->Set(index, *value, details)); |
} |
void FlattenString(Handle<String> string) { |
- CALL_HEAP_FUNCTION_VOID(string->TryFlatten()); |
+ CALL_HEAP_FUNCTION_VOID(string->GetIsolate(), string->TryFlatten()); |
} |
Handle<String> FlattenGetString(Handle<String> string) { |
- CALL_HEAP_FUNCTION(string->TryFlatten(), String); |
+ CALL_HEAP_FUNCTION(string->GetIsolate(), string->TryFlatten(), String); |
} |
Handle<Object> SetPrototype(Handle<JSFunction> function, |
Handle<Object> prototype) { |
ASSERT(function->should_have_prototype()); |
- CALL_HEAP_FUNCTION(Accessors::FunctionSetPrototype(*function, |
+ CALL_HEAP_FUNCTION(function->GetHeap()->isolate(), |
+ Accessors::FunctionSetPrototype(*function, |
*prototype, |
NULL), |
Object); |
@@ -244,7 +263,8 @@ |
Handle<Object> value, |
PropertyAttributes attributes, |
StrictModeFlag strict_mode) { |
- CALL_HEAP_FUNCTION(object->SetProperty(*key, *value, attributes, strict_mode), |
+ CALL_HEAP_FUNCTION(object->GetHeap()->isolate(), |
+ object->SetProperty(*key, *value, attributes, strict_mode), |
Object); |
} |
@@ -254,8 +274,11 @@ |
Handle<Object> value, |
PropertyAttributes attributes, |
StrictModeFlag strict_mode) { |
+ Isolate* isolate = Isolate::Current(); |
CALL_HEAP_FUNCTION( |
- Runtime::SetObjectProperty(object, key, value, attributes, strict_mode), |
+ isolate, |
+ Runtime::SetObjectProperty( |
+ isolate, object, key, value, attributes, strict_mode), |
Object); |
} |
@@ -264,9 +287,11 @@ |
Handle<Object> key, |
Handle<Object> value, |
PropertyAttributes attributes) { |
+ Isolate* isolate = object->GetIsolate(); |
CALL_HEAP_FUNCTION( |
+ isolate, |
Runtime::ForceSetObjectProperty( |
- object, key, value, attributes), |
+ isolate, object, key, value, attributes), |
Object); |
} |
@@ -275,14 +300,18 @@ |
Handle<String> key, |
Handle<Object> value, |
PropertyDetails details) { |
- CALL_HEAP_FUNCTION(object->SetNormalizedProperty(*key, *value, details), |
+ CALL_HEAP_FUNCTION(object->GetIsolate(), |
+ object->SetNormalizedProperty(*key, *value, details), |
Object); |
} |
Handle<Object> ForceDeleteProperty(Handle<JSObject> object, |
Handle<Object> key) { |
- CALL_HEAP_FUNCTION(Runtime::ForceDeleteObjectProperty(object, key), Object); |
+ Isolate* isolate = object->GetIsolate(); |
+ CALL_HEAP_FUNCTION(isolate, |
+ Runtime::ForceDeleteObjectProperty(isolate, object, key), |
+ Object); |
} |
@@ -291,8 +320,10 @@ |
Handle<String> key, |
Handle<Object> value, |
PropertyAttributes attributes) { |
- CALL_HEAP_FUNCTION(object-> |
- SetLocalPropertyIgnoreAttributes(*key, *value, attributes), Object); |
+ CALL_HEAP_FUNCTION( |
+ object->GetIsolate(), |
+ object->SetLocalPropertyIgnoreAttributes(*key, *value, attributes), |
+ Object); |
} |
@@ -300,10 +331,10 @@ |
Handle<String> key, |
Handle<Object> value, |
PropertyAttributes attributes) { |
- ASSERT(!Top::has_pending_exception()); |
+ ASSERT(!object->GetIsolate()->has_pending_exception()); |
CHECK(!SetLocalPropertyIgnoreAttributes( |
object, key, value, attributes).is_null()); |
- CHECK(!Top::has_pending_exception()); |
+ CHECK(!object->GetIsolate()->has_pending_exception()); |
} |
@@ -312,7 +343,8 @@ |
Handle<Object> value, |
PropertyAttributes attributes, |
StrictModeFlag strict_mode) { |
- CALL_HEAP_FUNCTION(object->SetPropertyWithInterceptor(*key, |
+ CALL_HEAP_FUNCTION(object->GetIsolate(), |
+ object->SetPropertyWithInterceptor(*key, |
*value, |
attributes, |
strict_mode), |
@@ -322,20 +354,24 @@ |
Handle<Object> GetProperty(Handle<JSObject> obj, |
const char* name) { |
- Handle<String> str = Factory::LookupAsciiSymbol(name); |
- CALL_HEAP_FUNCTION(obj->GetProperty(*str), Object); |
+ Isolate* isolate = obj->GetIsolate(); |
+ Handle<String> str = isolate->factory()->LookupAsciiSymbol(name); |
+ CALL_HEAP_FUNCTION(isolate, obj->GetProperty(*str), Object); |
} |
Handle<Object> GetProperty(Handle<Object> obj, |
Handle<Object> key) { |
- CALL_HEAP_FUNCTION(Runtime::GetObjectProperty(obj, key), Object); |
+ Isolate* isolate = Isolate::Current(); |
+ CALL_HEAP_FUNCTION(isolate, |
+ Runtime::GetObjectProperty(isolate, obj, key), Object); |
} |
Handle<Object> GetElement(Handle<Object> obj, |
uint32_t index) { |
- CALL_HEAP_FUNCTION(Runtime::GetElement(obj, index), Object); |
+ Isolate* isolate = Isolate::Current(); |
+ CALL_HEAP_FUNCTION(isolate, Runtime::GetElement(obj, index), Object); |
} |
@@ -343,7 +379,9 @@ |
Handle<JSObject> holder, |
Handle<String> name, |
PropertyAttributes* attributes) { |
- CALL_HEAP_FUNCTION(holder->GetPropertyWithInterceptor(*receiver, |
+ Isolate* isolate = receiver->GetIsolate(); |
+ CALL_HEAP_FUNCTION(isolate, |
+ holder->GetPropertyWithInterceptor(*receiver, |
*name, |
attributes), |
Object); |
@@ -358,19 +396,21 @@ |
Handle<Object> SetPrototype(Handle<JSObject> obj, Handle<Object> value) { |
const bool skip_hidden_prototypes = false; |
- CALL_HEAP_FUNCTION(obj->SetPrototype(*value, skip_hidden_prototypes), Object); |
+ CALL_HEAP_FUNCTION(obj->GetIsolate(), |
+ obj->SetPrototype(*value, skip_hidden_prototypes), Object); |
} |
Handle<Object> PreventExtensions(Handle<JSObject> object) { |
- CALL_HEAP_FUNCTION(object->PreventExtensions(), Object); |
+ CALL_HEAP_FUNCTION(object->GetIsolate(), object->PreventExtensions(), Object); |
} |
Handle<Object> GetHiddenProperties(Handle<JSObject> obj, |
bool create_if_needed) { |
+ Isolate* isolate = obj->GetIsolate(); |
Object* holder = obj->BypassGlobalProxy(); |
- if (holder->IsUndefined()) return Factory::undefined_value(); |
+ if (holder->IsUndefined()) return isolate->factory()->undefined_value(); |
obj = Handle<JSObject>(JSObject::cast(holder)); |
if (obj->HasFastProperties()) { |
@@ -380,7 +420,7 @@ |
// code zero) it will always occupy the first entry if present. |
DescriptorArray* descriptors = obj->map()->instance_descriptors(); |
if ((descriptors->number_of_descriptors() > 0) && |
- (descriptors->GetKey(0) == Heap::hidden_symbol()) && |
+ (descriptors->GetKey(0) == isolate->heap()->hidden_symbol()) && |
descriptors->IsProperty(0)) { |
ASSERT(descriptors->GetType(0) == FIELD); |
return Handle<Object>(obj->FastPropertyAt(descriptors->GetFieldIndex(0))); |
@@ -394,32 +434,39 @@ |
// Hidden properties object not found. Allocate a new hidden properties |
// object if requested. Otherwise return the undefined value. |
if (create_if_needed) { |
- Handle<Object> hidden_obj = Factory::NewJSObject(Top::object_function()); |
- CALL_HEAP_FUNCTION(obj->SetHiddenPropertiesObject(*hidden_obj), Object); |
+ Handle<Object> hidden_obj = |
+ isolate->factory()->NewJSObject(isolate->object_function()); |
+ CALL_HEAP_FUNCTION(isolate, |
+ obj->SetHiddenPropertiesObject(*hidden_obj), Object); |
} else { |
- return Factory::undefined_value(); |
+ return isolate->factory()->undefined_value(); |
} |
} |
- return Handle<Object>(obj->GetHiddenPropertiesObject()); |
+ return Handle<Object>(obj->GetHiddenPropertiesObject(), isolate); |
} |
Handle<Object> DeleteElement(Handle<JSObject> obj, |
uint32_t index) { |
- CALL_HEAP_FUNCTION(obj->DeleteElement(index, JSObject::NORMAL_DELETION), |
+ CALL_HEAP_FUNCTION(obj->GetIsolate(), |
+ obj->DeleteElement(index, JSObject::NORMAL_DELETION), |
Object); |
} |
Handle<Object> DeleteProperty(Handle<JSObject> obj, |
Handle<String> prop) { |
- CALL_HEAP_FUNCTION(obj->DeleteProperty(*prop, JSObject::NORMAL_DELETION), |
+ CALL_HEAP_FUNCTION(obj->GetIsolate(), |
+ obj->DeleteProperty(*prop, JSObject::NORMAL_DELETION), |
Object); |
} |
Handle<Object> LookupSingleCharacterStringFromCode(uint32_t index) { |
- CALL_HEAP_FUNCTION(Heap::LookupSingleCharacterStringFromCode(index), Object); |
+ Isolate* isolate = Isolate::Current(); |
+ CALL_HEAP_FUNCTION( |
+ isolate, |
+ isolate->heap()->LookupSingleCharacterStringFromCode(index), Object); |
} |
@@ -427,7 +474,8 @@ |
int start, |
int end, |
PretenureFlag pretenure) { |
- CALL_HEAP_FUNCTION(str->SubString(start, end, pretenure), String); |
+ CALL_HEAP_FUNCTION(str->GetIsolate(), |
+ str->SubString(start, end, pretenure), String); |
} |
@@ -443,7 +491,8 @@ |
value = number; |
} |
} |
- CALL_HEAP_FUNCTION(object->SetElement(index, *value, strict_mode), Object); |
+ CALL_HEAP_FUNCTION(object->GetIsolate(), |
+ object->SetElement(index, *value, strict_mode), Object); |
} |
@@ -452,18 +501,21 @@ |
Handle<Object> value, |
StrictModeFlag strict_mode) { |
ASSERT(!object->HasExternalArrayElements()); |
- CALL_HEAP_FUNCTION(object->SetElement(index, *value, strict_mode, false), |
+ CALL_HEAP_FUNCTION(object->GetIsolate(), |
+ object->SetElement(index, *value, strict_mode, false), |
Object); |
} |
Handle<JSObject> Copy(Handle<JSObject> obj) { |
- CALL_HEAP_FUNCTION(Heap::CopyJSObject(*obj), JSObject); |
+ Isolate* isolate = obj->GetIsolate(); |
+ CALL_HEAP_FUNCTION(isolate, |
+ isolate->heap()->CopyJSObject(*obj), JSObject); |
} |
Handle<Object> SetAccessor(Handle<JSObject> obj, Handle<AccessorInfo> info) { |
- CALL_HEAP_FUNCTION(obj->DefineAccessor(*info), Object); |
+ CALL_HEAP_FUNCTION(obj->GetIsolate(), obj->DefineAccessor(*info), Object); |
} |
@@ -484,12 +536,13 @@ |
Proxy* proxy = Script::cast(wrapper->value())->wrapper(); |
ASSERT(proxy->proxy() == reinterpret_cast<Address>(cache.location())); |
proxy->set_proxy(0); |
- GlobalHandles::Destroy(cache.location()); |
- Counters::script_wrappers.Decrement(); |
+ Isolate::Current()->global_handles()->Destroy(cache.location()); |
+ COUNTERS->script_wrappers()->Decrement(); |
} |
Handle<JSValue> GetScriptWrapper(Handle<Script> script) { |
+ Isolate* isolate = Isolate::Current(); |
if (script->wrapper()->proxy() != NULL) { |
// Return the script wrapper directly from the cache. |
return Handle<JSValue>( |
@@ -497,17 +550,18 @@ |
} |
// Construct a new script wrapper. |
- Counters::script_wrappers.Increment(); |
- Handle<JSFunction> constructor = Top::script_function(); |
+ isolate->counters()->script_wrappers()->Increment(); |
+ Handle<JSFunction> constructor = isolate->script_function(); |
Handle<JSValue> result = |
- Handle<JSValue>::cast(Factory::NewJSObject(constructor)); |
+ Handle<JSValue>::cast(isolate->factory()->NewJSObject(constructor)); |
result->set_value(*script); |
// Create a new weak global handle and use it to cache the wrapper |
// for future use. The cache will automatically be cleared by the |
// garbage collector when it is not used anymore. |
- Handle<Object> handle = GlobalHandles::Create(*result); |
- GlobalHandles::MakeWeak(handle.location(), NULL, &ClearWrapperCache); |
+ Handle<Object> handle = isolate->global_handles()->Create(*result); |
+ isolate->global_handles()->MakeWeak(handle.location(), NULL, |
+ &ClearWrapperCache); |
script->wrapper()->set_proxy(reinterpret_cast<Address>(handle.location())); |
return result; |
} |
@@ -520,7 +574,8 @@ |
if (!script->source()->IsString()) { |
ASSERT(script->source()->IsUndefined()); |
- Handle<FixedArray> empty = Factory::NewFixedArray(0); |
+ Handle<FixedArray> empty = |
+ script->GetIsolate()->factory()->NewFixedArray(0); |
script->set_line_ends(*empty); |
ASSERT(script->line_ends()->IsFixedArray()); |
return; |
@@ -530,8 +585,8 @@ |
Handle<FixedArray> array = CalculateLineEnds(src, true); |
- if (*array != Heap::empty_fixed_array()) { |
- array->set_map(Heap::fixed_cow_array_map()); |
+ if (*array != HEAP->empty_fixed_array()) { |
+ array->set_map(HEAP->fixed_cow_array_map()); |
} |
script->set_line_ends(*array); |
@@ -540,11 +595,12 @@ |
template <typename SourceChar> |
-static void CalculateLineEnds(List<int>* line_ends, |
+static void CalculateLineEnds(Isolate* isolate, |
+ List<int>* line_ends, |
Vector<const SourceChar> src, |
bool with_last_line) { |
const int src_len = src.length(); |
- StringSearch<char, SourceChar> search(CStrVector("\n")); |
+ StringSearch<char, SourceChar> search(isolate, CStrVector("\n")); |
// Find and record line ends. |
int position = 0; |
@@ -571,15 +627,22 @@ |
List<int> line_ends(line_count_estimate); |
{ |
AssertNoAllocation no_heap_allocation; // ensure vectors stay valid. |
+ Isolate* isolate = src->GetIsolate(); |
// Dispatch on type of strings. |
if (src->IsAsciiRepresentation()) { |
- CalculateLineEnds(&line_ends, src->ToAsciiVector(), with_last_line); |
+ CalculateLineEnds(isolate, |
+ &line_ends, |
+ src->ToAsciiVector(), |
+ with_last_line); |
} else { |
- CalculateLineEnds(&line_ends, src->ToUC16Vector(), with_last_line); |
+ CalculateLineEnds(isolate, |
+ &line_ends, |
+ src->ToUC16Vector(), |
+ with_last_line); |
} |
} |
int line_count = line_ends.length(); |
- Handle<FixedArray> array = Factory::NewFixedArray(line_count); |
+ Handle<FixedArray> array = FACTORY->NewFixedArray(line_count); |
for (int i = 0; i < line_count; i++) { |
array->set(i, Smi::FromInt(line_ends[i])); |
} |
@@ -645,17 +708,18 @@ |
// Compute the property keys from the interceptor. |
v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSObject> receiver, |
Handle<JSObject> object) { |
+ Isolate* isolate = receiver->GetIsolate(); |
Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
- CustomArguments args(interceptor->data(), *receiver, *object); |
+ CustomArguments args(isolate, interceptor->data(), *receiver, *object); |
v8::AccessorInfo info(args.end()); |
v8::Handle<v8::Array> result; |
if (!interceptor->enumerator()->IsUndefined()) { |
v8::NamedPropertyEnumerator enum_fun = |
v8::ToCData<v8::NamedPropertyEnumerator>(interceptor->enumerator()); |
- LOG(ApiObjectAccess("interceptor-named-enum", *object)); |
+ LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); |
{ |
// Leaving JavaScript. |
- VMState state(EXTERNAL); |
+ VMState state(isolate, EXTERNAL); |
result = enum_fun(info); |
} |
} |
@@ -666,17 +730,18 @@ |
// Compute the element keys from the interceptor. |
v8::Handle<v8::Array> GetKeysForIndexedInterceptor(Handle<JSObject> receiver, |
Handle<JSObject> object) { |
+ Isolate* isolate = receiver->GetIsolate(); |
Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); |
- CustomArguments args(interceptor->data(), *receiver, *object); |
+ CustomArguments args(isolate, interceptor->data(), *receiver, *object); |
v8::AccessorInfo info(args.end()); |
v8::Handle<v8::Array> result; |
if (!interceptor->enumerator()->IsUndefined()) { |
v8::IndexedPropertyEnumerator enum_fun = |
v8::ToCData<v8::IndexedPropertyEnumerator>(interceptor->enumerator()); |
- LOG(ApiObjectAccess("interceptor-indexed-enum", *object)); |
+ LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object)); |
{ |
// Leaving JavaScript. |
- VMState state(EXTERNAL); |
+ VMState state(isolate, EXTERNAL); |
result = enum_fun(info); |
} |
} |
@@ -697,31 +762,33 @@ |
Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSObject> object, |
KeyCollectionType type) { |
USE(ContainsOnlyValidKeys); |
- Handle<FixedArray> content = Factory::empty_fixed_array(); |
+ Isolate* isolate = object->GetIsolate(); |
+ Handle<FixedArray> content = isolate->factory()->empty_fixed_array(); |
Handle<JSObject> arguments_boilerplate = |
Handle<JSObject>( |
- Top::context()->global_context()->arguments_boilerplate()); |
+ isolate->context()->global_context()->arguments_boilerplate()); |
Handle<JSFunction> arguments_function = |
Handle<JSFunction>( |
JSFunction::cast(arguments_boilerplate->map()->constructor())); |
// Only collect keys if access is permitted. |
for (Handle<Object> p = object; |
- *p != Heap::null_value(); |
+ *p != isolate->heap()->null_value(); |
p = Handle<Object>(p->GetPrototype())) { |
Handle<JSObject> current(JSObject::cast(*p)); |
// Check access rights if required. |
if (current->IsAccessCheckNeeded() && |
- !Top::MayNamedAccess(*current, Heap::undefined_value(), |
- v8::ACCESS_KEYS)) { |
- Top::ReportFailedAccessCheck(*current, v8::ACCESS_KEYS); |
+ !isolate->MayNamedAccess(*current, |
+ isolate->heap()->undefined_value(), |
+ v8::ACCESS_KEYS)) { |
+ isolate->ReportFailedAccessCheck(*current, v8::ACCESS_KEYS); |
break; |
} |
// Compute the element keys. |
Handle<FixedArray> element_keys = |
- Factory::NewFixedArray(current->NumberOfEnumElements()); |
+ isolate->factory()->NewFixedArray(current->NumberOfEnumElements()); |
current->GetEnumElementKeys(*element_keys); |
content = UnionOfKeys(content, element_keys); |
ASSERT(ContainsOnlyValidKeys(content)); |
@@ -775,26 +842,28 @@ |
Handle<JSArray> GetKeysFor(Handle<JSObject> object) { |
- Counters::for_in.Increment(); |
+ Isolate* isolate = object->GetIsolate(); |
+ isolate->counters()->for_in()->Increment(); |
Handle<FixedArray> elements = GetKeysInFixedArrayFor(object, |
INCLUDE_PROTOS); |
- return Factory::NewJSArrayWithElements(elements); |
+ return isolate->factory()->NewJSArrayWithElements(elements); |
} |
Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object, |
bool cache_result) { |
int index = 0; |
+ Isolate* isolate = object->GetIsolate(); |
if (object->HasFastProperties()) { |
if (object->map()->instance_descriptors()->HasEnumCache()) { |
- Counters::enum_cache_hits.Increment(); |
+ isolate->counters()->enum_cache_hits()->Increment(); |
DescriptorArray* desc = object->map()->instance_descriptors(); |
return Handle<FixedArray>(FixedArray::cast(desc->GetEnumCache())); |
} |
- Counters::enum_cache_misses.Increment(); |
+ isolate->counters()->enum_cache_misses()->Increment(); |
int num_enum = object->NumberOfEnumProperties(); |
- Handle<FixedArray> storage = Factory::NewFixedArray(num_enum); |
- Handle<FixedArray> sort_array = Factory::NewFixedArray(num_enum); |
+ Handle<FixedArray> storage = isolate->factory()->NewFixedArray(num_enum); |
+ Handle<FixedArray> sort_array = isolate->factory()->NewFixedArray(num_enum); |
Handle<DescriptorArray> descs = |
Handle<DescriptorArray>(object->map()->instance_descriptors()); |
for (int i = 0; i < descs->number_of_descriptors(); i++) { |
@@ -808,7 +877,8 @@ |
(*storage)->SortPairs(*sort_array, sort_array->length()); |
if (cache_result) { |
Handle<FixedArray> bridge_storage = |
- Factory::NewFixedArray(DescriptorArray::kEnumCacheBridgeLength); |
+ isolate->factory()->NewFixedArray( |
+ DescriptorArray::kEnumCacheBridgeLength); |
DescriptorArray* desc = object->map()->instance_descriptors(); |
desc->SetEnumCache(*bridge_storage, *storage); |
} |
@@ -816,8 +886,8 @@ |
return storage; |
} else { |
int num_enum = object->NumberOfEnumProperties(); |
- Handle<FixedArray> storage = Factory::NewFixedArray(num_enum); |
- Handle<FixedArray> sort_array = Factory::NewFixedArray(num_enum); |
+ Handle<FixedArray> storage = isolate->factory()->NewFixedArray(num_enum); |
+ Handle<FixedArray> sort_array = isolate->factory()->NewFixedArray(num_enum); |
object->property_dictionary()->CopyEnumKeysTo(*storage, *sort_array); |
return storage; |
} |
@@ -834,10 +904,12 @@ |
ClearExceptionFlag flag) { |
// Compile the source information to a code object. |
ASSERT(info->IsOptimizing() || !info->shared_info()->is_compiled()); |
- ASSERT(!Top::has_pending_exception()); |
+ ASSERT(!info->isolate()->has_pending_exception()); |
bool result = Compiler::CompileLazy(info); |
- ASSERT(result != Top::has_pending_exception()); |
- if (!result && flag == CLEAR_EXCEPTION) Top::clear_pending_exception(); |
+ ASSERT(result != Isolate::Current()->has_pending_exception()); |
+ if (!result && flag == CLEAR_EXCEPTION) { |
+ info->isolate()->clear_pending_exception(); |
+ } |
return result; |
} |