| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/contexts.h" | 9 #include "src/contexts.h" |
| 10 #include "src/deoptimizer.h" | 10 #include "src/deoptimizer.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 if (Name::Equals(name, property_name)) { | 62 if (Name::Equals(name, property_name)) { |
| 63 *object_offset = offset; | 63 *object_offset = offset; |
| 64 return true; | 64 return true; |
| 65 } | 65 } |
| 66 return false; | 66 return false; |
| 67 } | 67 } |
| 68 | 68 |
| 69 | 69 |
| 70 // Returns true for properties that are accessors to object fields. | 70 // Returns true for properties that are accessors to object fields. |
| 71 // If true, *object_offset contains offset of object field. | 71 // If true, *object_offset contains offset of object field. |
| 72 template <class T> | 72 bool Accessors::IsJSObjectFieldAccessor(Handle<Map> map, Handle<Name> name, |
| 73 bool Accessors::IsJSObjectFieldAccessor(typename T::TypeHandle type, | |
| 74 Handle<Name> name, | |
| 75 int* object_offset) { | 73 int* object_offset) { |
| 76 Isolate* isolate = name->GetIsolate(); | 74 Isolate* isolate = name->GetIsolate(); |
| 77 | 75 |
| 78 if (type->Is(T::String())) { | |
| 79 return CheckForName(name, isolate->factory()->length_string(), | |
| 80 String::kLengthOffset, object_offset); | |
| 81 } | |
| 82 | |
| 83 if (!type->IsClass()) return false; | |
| 84 Handle<Map> map = type->AsClass()->Map(); | |
| 85 | |
| 86 switch (map->instance_type()) { | 76 switch (map->instance_type()) { |
| 87 case JS_ARRAY_TYPE: | 77 case JS_ARRAY_TYPE: |
| 88 return | 78 return |
| 89 CheckForName(name, isolate->factory()->length_string(), | 79 CheckForName(name, isolate->factory()->length_string(), |
| 90 JSArray::kLengthOffset, object_offset); | 80 JSArray::kLengthOffset, object_offset); |
| 91 case JS_TYPED_ARRAY_TYPE: | 81 case JS_TYPED_ARRAY_TYPE: |
| 92 return | 82 return |
| 93 CheckForName(name, isolate->factory()->length_string(), | 83 CheckForName(name, isolate->factory()->length_string(), |
| 94 JSTypedArray::kLengthOffset, object_offset) || | 84 JSTypedArray::kLengthOffset, object_offset) || |
| 95 CheckForName(name, isolate->factory()->byte_length_string(), | 85 CheckForName(name, isolate->factory()->byte_length_string(), |
| 96 JSTypedArray::kByteLengthOffset, object_offset) || | 86 JSTypedArray::kByteLengthOffset, object_offset) || |
| 97 CheckForName(name, isolate->factory()->byte_offset_string(), | 87 CheckForName(name, isolate->factory()->byte_offset_string(), |
| 98 JSTypedArray::kByteOffsetOffset, object_offset); | 88 JSTypedArray::kByteOffsetOffset, object_offset); |
| 99 case JS_ARRAY_BUFFER_TYPE: | 89 case JS_ARRAY_BUFFER_TYPE: |
| 100 return | 90 return |
| 101 CheckForName(name, isolate->factory()->byte_length_string(), | 91 CheckForName(name, isolate->factory()->byte_length_string(), |
| 102 JSArrayBuffer::kByteLengthOffset, object_offset); | 92 JSArrayBuffer::kByteLengthOffset, object_offset); |
| 103 case JS_DATA_VIEW_TYPE: | 93 case JS_DATA_VIEW_TYPE: |
| 104 return | 94 return |
| 105 CheckForName(name, isolate->factory()->byte_length_string(), | 95 CheckForName(name, isolate->factory()->byte_length_string(), |
| 106 JSDataView::kByteLengthOffset, object_offset) || | 96 JSDataView::kByteLengthOffset, object_offset) || |
| 107 CheckForName(name, isolate->factory()->byte_offset_string(), | 97 CheckForName(name, isolate->factory()->byte_offset_string(), |
| 108 JSDataView::kByteOffsetOffset, object_offset); | 98 JSDataView::kByteOffsetOffset, object_offset); |
| 109 default: | 99 default: |
| 100 if (map->instance_type() < FIRST_NONSTRING_TYPE) { |
| 101 return CheckForName(name, isolate->factory()->length_string(), |
| 102 String::kLengthOffset, object_offset); |
| 103 } |
| 104 |
| 110 return false; | 105 return false; |
| 111 } | 106 } |
| 112 } | 107 } |
| 113 | 108 |
| 114 | 109 |
| 115 template | |
| 116 bool Accessors::IsJSObjectFieldAccessor<Type>(Type* type, | |
| 117 Handle<Name> name, | |
| 118 int* object_offset); | |
| 119 | |
| 120 | |
| 121 template | |
| 122 bool Accessors::IsJSObjectFieldAccessor<HeapType>(Handle<HeapType> type, | |
| 123 Handle<Name> name, | |
| 124 int* object_offset); | |
| 125 | |
| 126 | |
| 127 bool SetPropertyOnInstanceIfInherited( | 110 bool SetPropertyOnInstanceIfInherited( |
| 128 Isolate* isolate, const v8::PropertyCallbackInfo<void>& info, | 111 Isolate* isolate, const v8::PropertyCallbackInfo<void>& info, |
| 129 v8::Local<v8::Name> name, Handle<Object> value) { | 112 v8::Local<v8::Name> name, Handle<Object> value) { |
| 130 Handle<Object> holder = Utils::OpenHandle(*info.Holder()); | 113 Handle<Object> holder = Utils::OpenHandle(*info.Holder()); |
| 131 Handle<Object> receiver = Utils::OpenHandle(*info.This()); | 114 Handle<Object> receiver = Utils::OpenHandle(*info.This()); |
| 132 if (*holder == *receiver) return false; | 115 if (*holder == *receiver) return false; |
| 133 if (receiver->IsJSObject()) { | 116 if (receiver->IsJSObject()) { |
| 134 Handle<JSObject> object = Handle<JSObject>::cast(receiver); | 117 Handle<JSObject> object = Handle<JSObject>::cast(receiver); |
| 135 // This behaves sloppy since we lost the actual strict-mode. | 118 // This behaves sloppy since we lost the actual strict-mode. |
| 136 // TODO(verwaest): Fix by making ExecutableAccessorInfo behave like data | 119 // TODO(verwaest): Fix by making ExecutableAccessorInfo behave like data |
| (...skipping 1395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1532 info->set_data(Smi::FromInt(index)); | 1515 info->set_data(Smi::FromInt(index)); |
| 1533 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); | 1516 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); |
| 1534 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); | 1517 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); |
| 1535 info->set_getter(*getter); | 1518 info->set_getter(*getter); |
| 1536 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 1519 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
| 1537 return info; | 1520 return info; |
| 1538 } | 1521 } |
| 1539 | 1522 |
| 1540 | 1523 |
| 1541 } } // namespace v8::internal | 1524 } } // namespace v8::internal |
| OLD | NEW |