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
parent 47e86b88
......@@ -639,6 +639,24 @@ class IdempotentPointerToHandleCodeTrampoline {
: 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:
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
// present, add it with attributes NONE. This code is an exact clone of
// SetProperty, with the check for IsReadOnly and the check for a
......@@ -4044,11 +4067,12 @@ Handle<Object> JSObject::SetLocalPropertyIgnoreAttributes(
Handle<Object> value,
PropertyAttributes attributes,
ValueType value_type,
StoreMode mode) {
StoreMode mode,
ExtensibilityCheck extensibility_check) {
CALL_HEAP_FUNCTION(
object->GetIsolate(),
object->SetLocalPropertyIgnoreAttributes(
*key, *value, attributes, value_type, mode),
*key, *value, attributes, value_type, mode, extensibility_check),
Object);
}
......@@ -4951,13 +4975,13 @@ MaybeObject* JSObject::GetHiddenPropertiesHashTable(
ASSERT_EQ(hashtable, new_table);
}
MaybeObject* store_result =
SetLocalPropertyIgnoreAttributes(GetHeap()->hidden_string(),
hashtable,
DONT_ENUM,
OPTIMAL_REPRESENTATION,
ALLOW_AS_CONSTANT,
OMIT_EXTENSIBILITY_CHECK);
MaybeObject* store_result = SetLocalPropertyIgnoreAttributesTrampoline(
GetHeap()->hidden_string(),
hashtable,
DONT_ENUM,
OPTIMAL_REPRESENTATION,
ALLOW_AS_CONSTANT,
OMIT_EXTENSIBILITY_CHECK);
if (store_result->IsFailure()) return store_result;
return hashtable;
}
......@@ -4984,13 +5008,13 @@ MaybeObject* JSObject::SetHiddenPropertiesHashTable(Object* value) {
}
}
}
MaybeObject* store_result =
SetLocalPropertyIgnoreAttributes(GetHeap()->hidden_string(),
value,
DONT_ENUM,
OPTIMAL_REPRESENTATION,
ALLOW_AS_CONSTANT,
OMIT_EXTENSIBILITY_CHECK);
MaybeObject* store_result = SetLocalPropertyIgnoreAttributesTrampoline(
GetHeap()->hidden_string(),
value,
DONT_ENUM,
OPTIMAL_REPRESENTATION,
ALLOW_AS_CONSTANT,
OMIT_EXTENSIBILITY_CHECK);
if (store_result->IsFailure()) return store_result;
return this;
}
......
......@@ -2163,7 +2163,8 @@ class JSObject: public JSReceiver {
Handle<Object> value,
PropertyAttributes attributes,
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<Map> ExpectedTransitionTarget(Handle<Map> map);
......@@ -2194,6 +2195,13 @@ class JSObject: public JSReceiver {
ValueType value_type = OPTIMAL_REPRESENTATION,
StoreMode mode = ALLOW_AS_CONSTANT,
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.
// Handles the special representation of JS global objects.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment