Use raw-to-handle trampoline in [Get/Set]HiddenPropertiesHashTable.
R=danno@chromium.org Review URL: https://codereview.chromium.org/23629040 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16623 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
47e86b889e
commit
448d98e19d
@ -639,6 +639,24 @@ class IdempotentPointerToHandleCodeTrampoline {
|
|||||||
: reinterpret_cast<MaybeObject*>(Failure::RetryAfterGC());
|
: reinterpret_cast<MaybeObject*>(Failure::RetryAfterGC());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename R, typename P1, typename P2, typename P3, typename P4,
|
||||||
|
typename P5, typename P6, typename P7>
|
||||||
|
MUST_USE_RESULT MaybeObject* CallWithReturnValue(
|
||||||
|
R (*function)(P1, P2, P3, P4, P5, P6, P7),
|
||||||
|
P1 p1,
|
||||||
|
P2 p2,
|
||||||
|
P3 p3,
|
||||||
|
P4 p4,
|
||||||
|
P5 p5,
|
||||||
|
P6 p6,
|
||||||
|
P7 p7) {
|
||||||
|
int collections = isolate_->heap()->gc_count();
|
||||||
|
Handle<Object> result = (*function)(p1, p2, p3, p4, p5, p6, p7);
|
||||||
|
return (collections == isolate_->heap()->gc_count())
|
||||||
|
? *result
|
||||||
|
: reinterpret_cast<MaybeObject*>(Failure::RetryAfterGC());
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Isolate* isolate_;
|
Isolate* isolate_;
|
||||||
};
|
};
|
||||||
|
@ -4029,6 +4029,29 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MaybeObject* JSObject::SetLocalPropertyIgnoreAttributesTrampoline(
|
||||||
|
Name* key,
|
||||||
|
Object* value,
|
||||||
|
PropertyAttributes attributes,
|
||||||
|
ValueType value_type,
|
||||||
|
StoreMode mode,
|
||||||
|
ExtensibilityCheck extensibility_check) {
|
||||||
|
// TODO(mstarzinger): The trampoline is a giant hack, don't use it anywhere
|
||||||
|
// else or handlification people will start hating you for all eternity.
|
||||||
|
HandleScope scope(GetIsolate());
|
||||||
|
IdempotentPointerToHandleCodeTrampoline trampoline(GetIsolate());
|
||||||
|
return trampoline.CallWithReturnValue(
|
||||||
|
&JSObject::SetLocalPropertyIgnoreAttributes,
|
||||||
|
Handle<JSObject>(this),
|
||||||
|
Handle<Name>(key),
|
||||||
|
Handle<Object>(value, GetIsolate()),
|
||||||
|
attributes,
|
||||||
|
value_type,
|
||||||
|
mode,
|
||||||
|
extensibility_check);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Set a real local property, even if it is READ_ONLY. If the property is not
|
// Set a real local property, even if it is READ_ONLY. If the property is not
|
||||||
// present, add it with attributes NONE. This code is an exact clone of
|
// present, add it with attributes NONE. This code is an exact clone of
|
||||||
// SetProperty, with the check for IsReadOnly and the check for a
|
// SetProperty, with the check for IsReadOnly and the check for a
|
||||||
@ -4044,11 +4067,12 @@ Handle<Object> JSObject::SetLocalPropertyIgnoreAttributes(
|
|||||||
Handle<Object> value,
|
Handle<Object> value,
|
||||||
PropertyAttributes attributes,
|
PropertyAttributes attributes,
|
||||||
ValueType value_type,
|
ValueType value_type,
|
||||||
StoreMode mode) {
|
StoreMode mode,
|
||||||
|
ExtensibilityCheck extensibility_check) {
|
||||||
CALL_HEAP_FUNCTION(
|
CALL_HEAP_FUNCTION(
|
||||||
object->GetIsolate(),
|
object->GetIsolate(),
|
||||||
object->SetLocalPropertyIgnoreAttributes(
|
object->SetLocalPropertyIgnoreAttributes(
|
||||||
*key, *value, attributes, value_type, mode),
|
*key, *value, attributes, value_type, mode, extensibility_check),
|
||||||
Object);
|
Object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4951,13 +4975,13 @@ MaybeObject* JSObject::GetHiddenPropertiesHashTable(
|
|||||||
ASSERT_EQ(hashtable, new_table);
|
ASSERT_EQ(hashtable, new_table);
|
||||||
}
|
}
|
||||||
|
|
||||||
MaybeObject* store_result =
|
MaybeObject* store_result = SetLocalPropertyIgnoreAttributesTrampoline(
|
||||||
SetLocalPropertyIgnoreAttributes(GetHeap()->hidden_string(),
|
GetHeap()->hidden_string(),
|
||||||
hashtable,
|
hashtable,
|
||||||
DONT_ENUM,
|
DONT_ENUM,
|
||||||
OPTIMAL_REPRESENTATION,
|
OPTIMAL_REPRESENTATION,
|
||||||
ALLOW_AS_CONSTANT,
|
ALLOW_AS_CONSTANT,
|
||||||
OMIT_EXTENSIBILITY_CHECK);
|
OMIT_EXTENSIBILITY_CHECK);
|
||||||
if (store_result->IsFailure()) return store_result;
|
if (store_result->IsFailure()) return store_result;
|
||||||
return hashtable;
|
return hashtable;
|
||||||
}
|
}
|
||||||
@ -4984,13 +5008,13 @@ MaybeObject* JSObject::SetHiddenPropertiesHashTable(Object* value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MaybeObject* store_result =
|
MaybeObject* store_result = SetLocalPropertyIgnoreAttributesTrampoline(
|
||||||
SetLocalPropertyIgnoreAttributes(GetHeap()->hidden_string(),
|
GetHeap()->hidden_string(),
|
||||||
value,
|
value,
|
||||||
DONT_ENUM,
|
DONT_ENUM,
|
||||||
OPTIMAL_REPRESENTATION,
|
OPTIMAL_REPRESENTATION,
|
||||||
ALLOW_AS_CONSTANT,
|
ALLOW_AS_CONSTANT,
|
||||||
OMIT_EXTENSIBILITY_CHECK);
|
OMIT_EXTENSIBILITY_CHECK);
|
||||||
if (store_result->IsFailure()) return store_result;
|
if (store_result->IsFailure()) return store_result;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -2163,7 +2163,8 @@ class JSObject: public JSReceiver {
|
|||||||
Handle<Object> value,
|
Handle<Object> value,
|
||||||
PropertyAttributes attributes,
|
PropertyAttributes attributes,
|
||||||
ValueType value_type = OPTIMAL_REPRESENTATION,
|
ValueType value_type = OPTIMAL_REPRESENTATION,
|
||||||
StoreMode mode = ALLOW_AS_CONSTANT);
|
StoreMode mode = ALLOW_AS_CONSTANT,
|
||||||
|
ExtensibilityCheck extensibility_check = PERFORM_EXTENSIBILITY_CHECK);
|
||||||
|
|
||||||
static inline Handle<String> ExpectedTransitionKey(Handle<Map> map);
|
static inline Handle<String> ExpectedTransitionKey(Handle<Map> map);
|
||||||
static inline Handle<Map> ExpectedTransitionTarget(Handle<Map> map);
|
static inline Handle<Map> ExpectedTransitionTarget(Handle<Map> map);
|
||||||
@ -2194,6 +2195,13 @@ class JSObject: public JSReceiver {
|
|||||||
ValueType value_type = OPTIMAL_REPRESENTATION,
|
ValueType value_type = OPTIMAL_REPRESENTATION,
|
||||||
StoreMode mode = ALLOW_AS_CONSTANT,
|
StoreMode mode = ALLOW_AS_CONSTANT,
|
||||||
ExtensibilityCheck extensibility_check = PERFORM_EXTENSIBILITY_CHECK);
|
ExtensibilityCheck extensibility_check = PERFORM_EXTENSIBILITY_CHECK);
|
||||||
|
MUST_USE_RESULT MaybeObject* SetLocalPropertyIgnoreAttributesTrampoline(
|
||||||
|
Name* key,
|
||||||
|
Object* value,
|
||||||
|
PropertyAttributes attributes,
|
||||||
|
ValueType value_type = OPTIMAL_REPRESENTATION,
|
||||||
|
StoreMode mode = ALLOW_AS_CONSTANT,
|
||||||
|
ExtensibilityCheck extensibility_check = PERFORM_EXTENSIBILITY_CHECK);
|
||||||
|
|
||||||
// Retrieve a value in a normalized object given a lookup result.
|
// Retrieve a value in a normalized object given a lookup result.
|
||||||
// Handles the special representation of JS global objects.
|
// Handles the special representation of JS global objects.
|
||||||
|
Loading…
Reference in New Issue
Block a user