Reland "Handlify GetDeclaredAccessorProperty."
R=jarin@chromium.org Review URL: https://codereview.chromium.org/236613006 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20745 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
c1db31b97c
commit
414dd03250
@ -210,9 +210,9 @@ static inline To* CheckedCast(void *from) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static MaybeObject* PerformCompare(const BitmaskCompareDescriptor& descriptor,
|
static Handle<Object> PerformCompare(const BitmaskCompareDescriptor& descriptor,
|
||||||
char* ptr,
|
char* ptr,
|
||||||
Heap* heap) {
|
Isolate* isolate) {
|
||||||
uint32_t bitmask = descriptor.bitmask;
|
uint32_t bitmask = descriptor.bitmask;
|
||||||
uint32_t compare_value = descriptor.compare_value;
|
uint32_t compare_value = descriptor.compare_value;
|
||||||
uint32_t value;
|
uint32_t value;
|
||||||
@ -232,26 +232,27 @@ static MaybeObject* PerformCompare(const BitmaskCompareDescriptor& descriptor,
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
return NULL;
|
return isolate->factory()->undefined_value();
|
||||||
}
|
}
|
||||||
return heap->ToBoolean((bitmask & value) == (bitmask & compare_value));
|
return isolate->factory()->ToBoolean(
|
||||||
|
(bitmask & value) == (bitmask & compare_value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static MaybeObject* PerformCompare(const PointerCompareDescriptor& descriptor,
|
static Handle<Object> PerformCompare(const PointerCompareDescriptor& descriptor,
|
||||||
char* ptr,
|
char* ptr,
|
||||||
Heap* heap) {
|
Isolate* isolate) {
|
||||||
uintptr_t compare_value =
|
uintptr_t compare_value =
|
||||||
reinterpret_cast<uintptr_t>(descriptor.compare_value);
|
reinterpret_cast<uintptr_t>(descriptor.compare_value);
|
||||||
uintptr_t value = *CheckedCast<uintptr_t>(ptr);
|
uintptr_t value = *CheckedCast<uintptr_t>(ptr);
|
||||||
return heap->ToBoolean(compare_value == value);
|
return isolate->factory()->ToBoolean(compare_value == value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static MaybeObject* GetPrimitiveValue(
|
static Handle<Object> GetPrimitiveValue(
|
||||||
const PrimitiveValueDescriptor& descriptor,
|
const PrimitiveValueDescriptor& descriptor,
|
||||||
char* ptr,
|
char* ptr,
|
||||||
Heap* heap) {
|
Isolate* isolate) {
|
||||||
int32_t int32_value = 0;
|
int32_t int32_value = 0;
|
||||||
switch (descriptor.data_type) {
|
switch (descriptor.data_type) {
|
||||||
case kDescriptorInt8Type:
|
case kDescriptorInt8Type:
|
||||||
@ -271,29 +272,36 @@ static MaybeObject* GetPrimitiveValue(
|
|||||||
break;
|
break;
|
||||||
case kDescriptorUint32Type: {
|
case kDescriptorUint32Type: {
|
||||||
uint32_t value = *CheckedCast<uint32_t>(ptr);
|
uint32_t value = *CheckedCast<uint32_t>(ptr);
|
||||||
return heap->NumberFromUint32(value);
|
AllowHeapAllocation allow_gc;
|
||||||
|
return isolate->factory()->NewNumberFromUint(value);
|
||||||
}
|
}
|
||||||
case kDescriptorBoolType: {
|
case kDescriptorBoolType: {
|
||||||
uint8_t byte = *CheckedCast<uint8_t>(ptr);
|
uint8_t byte = *CheckedCast<uint8_t>(ptr);
|
||||||
return heap->ToBoolean(byte & (0x1 << descriptor.bool_offset));
|
return isolate->factory()->ToBoolean(
|
||||||
|
byte & (0x1 << descriptor.bool_offset));
|
||||||
}
|
}
|
||||||
case kDescriptorFloatType: {
|
case kDescriptorFloatType: {
|
||||||
float value = *CheckedCast<float>(ptr);
|
float value = *CheckedCast<float>(ptr);
|
||||||
return heap->NumberFromDouble(value);
|
AllowHeapAllocation allow_gc;
|
||||||
|
return isolate->factory()->NewNumber(value);
|
||||||
}
|
}
|
||||||
case kDescriptorDoubleType: {
|
case kDescriptorDoubleType: {
|
||||||
double value = *CheckedCast<double>(ptr);
|
double value = *CheckedCast<double>(ptr);
|
||||||
return heap->NumberFromDouble(value);
|
AllowHeapAllocation allow_gc;
|
||||||
|
return isolate->factory()->NewNumber(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return heap->NumberFromInt32(int32_value);
|
AllowHeapAllocation allow_gc;
|
||||||
|
return isolate->factory()->NewNumberFromInt(int32_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static MaybeObject* GetDeclaredAccessorProperty(Object* receiver,
|
static Handle<Object> GetDeclaredAccessorProperty(
|
||||||
DeclaredAccessorInfo* info,
|
Handle<Object> receiver,
|
||||||
Isolate* isolate) {
|
Handle<DeclaredAccessorInfo> info,
|
||||||
char* current = reinterpret_cast<char*>(receiver);
|
Isolate* isolate) {
|
||||||
|
DisallowHeapAllocation no_gc;
|
||||||
|
char* current = reinterpret_cast<char*>(*receiver);
|
||||||
DeclaredAccessorDescriptorIterator iterator(info->descriptor());
|
DeclaredAccessorDescriptorIterator iterator(info->descriptor());
|
||||||
while (true) {
|
while (true) {
|
||||||
const DeclaredAccessorDescriptorData* data = iterator.Next();
|
const DeclaredAccessorDescriptorData* data = iterator.Next();
|
||||||
@ -301,7 +309,7 @@ static MaybeObject* GetDeclaredAccessorProperty(Object* receiver,
|
|||||||
case kDescriptorReturnObject: {
|
case kDescriptorReturnObject: {
|
||||||
ASSERT(iterator.Complete());
|
ASSERT(iterator.Complete());
|
||||||
current = *CheckedCast<char*>(current);
|
current = *CheckedCast<char*>(current);
|
||||||
return *CheckedCast<Object*>(current);
|
return handle(*CheckedCast<Object*>(current), isolate);
|
||||||
}
|
}
|
||||||
case kDescriptorPointerDereference:
|
case kDescriptorPointerDereference:
|
||||||
ASSERT(!iterator.Complete());
|
ASSERT(!iterator.Complete());
|
||||||
@ -324,31 +332,21 @@ static MaybeObject* GetDeclaredAccessorProperty(Object* receiver,
|
|||||||
ASSERT(iterator.Complete());
|
ASSERT(iterator.Complete());
|
||||||
return PerformCompare(data->bitmask_compare_descriptor,
|
return PerformCompare(data->bitmask_compare_descriptor,
|
||||||
current,
|
current,
|
||||||
isolate->heap());
|
isolate);
|
||||||
case kDescriptorPointerCompare:
|
case kDescriptorPointerCompare:
|
||||||
ASSERT(iterator.Complete());
|
ASSERT(iterator.Complete());
|
||||||
return PerformCompare(data->pointer_compare_descriptor,
|
return PerformCompare(data->pointer_compare_descriptor,
|
||||||
current,
|
current,
|
||||||
isolate->heap());
|
isolate);
|
||||||
case kDescriptorPrimitiveValue:
|
case kDescriptorPrimitiveValue:
|
||||||
ASSERT(iterator.Complete());
|
ASSERT(iterator.Complete());
|
||||||
return GetPrimitiveValue(data->primitive_value_descriptor,
|
return GetPrimitiveValue(data->primitive_value_descriptor,
|
||||||
current,
|
current,
|
||||||
isolate->heap());
|
isolate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
return NULL;
|
return isolate->factory()->undefined_value();
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static Handle<Object> GetDeclaredAccessorProperty(
|
|
||||||
Handle<Object> receiver,
|
|
||||||
Handle<DeclaredAccessorInfo> info,
|
|
||||||
Isolate* isolate) {
|
|
||||||
CALL_HEAP_FUNCTION(isolate,
|
|
||||||
GetDeclaredAccessorProperty(*receiver, *info, isolate),
|
|
||||||
Object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -392,12 +390,10 @@ MaybeHandle<Object> JSObject::GetPropertyWithCallback(Handle<JSObject> object,
|
|||||||
// so we do not support it for now.
|
// so we do not support it for now.
|
||||||
if (name->IsSymbol()) return isolate->factory()->undefined_value();
|
if (name->IsSymbol()) return isolate->factory()->undefined_value();
|
||||||
if (structure->IsDeclaredAccessorInfo()) {
|
if (structure->IsDeclaredAccessorInfo()) {
|
||||||
CALL_HEAP_FUNCTION(
|
return GetDeclaredAccessorProperty(
|
||||||
isolate,
|
receiver,
|
||||||
GetDeclaredAccessorProperty(*receiver,
|
Handle<DeclaredAccessorInfo>::cast(structure),
|
||||||
DeclaredAccessorInfo::cast(*structure),
|
isolate);
|
||||||
isolate),
|
|
||||||
Object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<ExecutableAccessorInfo> data =
|
Handle<ExecutableAccessorInfo> data =
|
||||||
|
Loading…
Reference in New Issue
Block a user