OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" |
10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 | 151 |
152 MAYBE_RETURN_NULL(Object::SetProperty(&it, value, language_mode, | 152 MAYBE_RETURN_NULL(Object::SetProperty(&it, value, language_mode, |
153 Object::MAY_BE_STORE_FROM_KEYED)); | 153 Object::MAY_BE_STORE_FROM_KEYED)); |
154 return value; | 154 return value; |
155 } | 155 } |
156 | 156 |
157 | 157 |
158 RUNTIME_FUNCTION(Runtime_GetPrototype) { | 158 RUNTIME_FUNCTION(Runtime_GetPrototype) { |
159 HandleScope scope(isolate); | 159 HandleScope scope(isolate); |
160 DCHECK(args.length() == 1); | 160 DCHECK(args.length() == 1); |
161 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0); | 161 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, obj, 0); |
162 Handle<Object> prototype; | 162 Handle<Object> prototype; |
163 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, prototype, | 163 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, prototype, |
164 Object::GetPrototype(isolate, obj)); | 164 JSReceiver::GetPrototype(isolate, obj)); |
165 return *prototype; | 165 return *prototype; |
166 } | 166 } |
167 | 167 |
168 | 168 |
169 RUNTIME_FUNCTION(Runtime_InternalSetPrototype) { | 169 RUNTIME_FUNCTION(Runtime_InternalSetPrototype) { |
170 HandleScope scope(isolate); | 170 HandleScope scope(isolate); |
171 DCHECK(args.length() == 2); | 171 DCHECK(args.length() == 2); |
172 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, obj, 0); | 172 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, obj, 0); |
173 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1); | 173 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1); |
174 MAYBE_RETURN( | 174 MAYBE_RETURN( |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 | 569 |
570 static Object* HasOwnPropertyImplementation(Isolate* isolate, | 570 static Object* HasOwnPropertyImplementation(Isolate* isolate, |
571 Handle<JSObject> object, | 571 Handle<JSObject> object, |
572 Handle<Name> key) { | 572 Handle<Name> key) { |
573 Maybe<bool> maybe = JSReceiver::HasOwnProperty(object, key); | 573 Maybe<bool> maybe = JSReceiver::HasOwnProperty(object, key); |
574 if (!maybe.IsJust()) return isolate->heap()->exception(); | 574 if (!maybe.IsJust()) return isolate->heap()->exception(); |
575 if (maybe.FromJust()) return isolate->heap()->true_value(); | 575 if (maybe.FromJust()) return isolate->heap()->true_value(); |
576 // Handle hidden prototypes. If there's a hidden prototype above this thing | 576 // Handle hidden prototypes. If there's a hidden prototype above this thing |
577 // then we have to check it for properties, because they are supposed to | 577 // then we have to check it for properties, because they are supposed to |
578 // look like they are on this object. | 578 // look like they are on this object. |
579 PrototypeIterator iter(isolate, object); | 579 if (object->map()->has_hidden_prototype()) { |
580 if (!iter.IsAtEnd() && | 580 PrototypeIterator iter(isolate, object); |
581 PrototypeIterator::GetCurrent<HeapObject>(iter) | 581 DCHECK(!iter.IsAtEnd()); |
582 ->map() | 582 |
583 ->is_hidden_prototype()) { | |
584 // TODO(verwaest): The recursion is not necessary for keys that are array | 583 // TODO(verwaest): The recursion is not necessary for keys that are array |
585 // indices. Removing this. | 584 // indices. Removing this. |
586 // Casting to JSObject is fine because JSProxies are never used as | 585 // Casting to JSObject is fine because JSProxies are never used as |
587 // hidden prototypes. | 586 // hidden prototypes. |
588 return HasOwnPropertyImplementation( | 587 return HasOwnPropertyImplementation( |
589 isolate, PrototypeIterator::GetCurrent<JSObject>(iter), key); | 588 isolate, PrototypeIterator::GetCurrent<JSObject>(iter), key); |
590 } | 589 } |
591 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | 590 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
592 return isolate->heap()->false_value(); | 591 return isolate->heap()->false_value(); |
593 } | 592 } |
(...skipping 24 matching lines...) Expand all Loading... |
618 } else { | 617 } else { |
619 maybe = JSObject::HasRealNamedProperty(js_obj, key); | 618 maybe = JSObject::HasRealNamedProperty(js_obj, key); |
620 } | 619 } |
621 if (!maybe.IsJust()) return isolate->heap()->exception(); | 620 if (!maybe.IsJust()) return isolate->heap()->exception(); |
622 DCHECK(!isolate->has_pending_exception()); | 621 DCHECK(!isolate->has_pending_exception()); |
623 if (maybe.FromJust()) { | 622 if (maybe.FromJust()) { |
624 return isolate->heap()->true_value(); | 623 return isolate->heap()->true_value(); |
625 } | 624 } |
626 Map* map = js_obj->map(); | 625 Map* map = js_obj->map(); |
627 if (!key_is_array_index && !map->has_named_interceptor() && | 626 if (!key_is_array_index && !map->has_named_interceptor() && |
628 !HeapObject::cast(map->prototype())->map()->is_hidden_prototype()) { | 627 !map->has_hidden_prototype()) { |
629 return isolate->heap()->false_value(); | 628 return isolate->heap()->false_value(); |
630 } | 629 } |
631 // Slow case. | 630 // Slow case. |
632 return HasOwnPropertyImplementation(isolate, Handle<JSObject>(js_obj), | 631 return HasOwnPropertyImplementation(isolate, Handle<JSObject>(js_obj), |
633 Handle<Name>(key)); | 632 Handle<Name>(key)); |
634 } else if (object->IsString() && key_is_array_index) { | 633 } else if (object->IsString() && key_is_array_index) { |
635 // Well, there is one exception: Handle [] on strings. | 634 // Well, there is one exception: Handle [] on strings. |
636 Handle<String> string = Handle<String>::cast(object); | 635 Handle<String> string = Handle<String>::cast(object); |
637 if (index < static_cast<uint32_t>(string->length())) { | 636 if (index < static_cast<uint32_t>(string->length())) { |
638 return isolate->heap()->true_value(); | 637 return isolate->heap()->true_value(); |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1240 Handle<Object> prototype; | 1239 Handle<Object> prototype; |
1241 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1240 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1242 isolate, prototype, | 1241 isolate, prototype, |
1243 Object::GetProperty(callable, isolate->factory()->prototype_string())); | 1242 Object::GetProperty(callable, isolate->factory()->prototype_string())); |
1244 if (!prototype->IsJSReceiver()) { | 1243 if (!prototype->IsJSReceiver()) { |
1245 THROW_NEW_ERROR_RETURN_FAILURE( | 1244 THROW_NEW_ERROR_RETURN_FAILURE( |
1246 isolate, | 1245 isolate, |
1247 NewTypeError(MessageTemplate::kInstanceofNonobjectProto, prototype)); | 1246 NewTypeError(MessageTemplate::kInstanceofNonobjectProto, prototype)); |
1248 } | 1247 } |
1249 // Return whether or not {prototype} is in the prototype chain of {object}. | 1248 // Return whether or not {prototype} is in the prototype chain of {object}. |
1250 Maybe<bool> result = Object::HasInPrototypeChain(isolate, object, prototype); | 1249 Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object); |
| 1250 Maybe<bool> result = |
| 1251 JSReceiver::HasInPrototypeChain(isolate, receiver, prototype); |
1251 MAYBE_RETURN(result, isolate->heap()->exception()); | 1252 MAYBE_RETURN(result, isolate->heap()->exception()); |
1252 return isolate->heap()->ToBoolean(result.FromJust()); | 1253 return isolate->heap()->ToBoolean(result.FromJust()); |
1253 } | 1254 } |
1254 | 1255 |
1255 | 1256 |
1256 RUNTIME_FUNCTION(Runtime_HasInPrototypeChain) { | 1257 RUNTIME_FUNCTION(Runtime_HasInPrototypeChain) { |
1257 HandleScope scope(isolate); | 1258 HandleScope scope(isolate); |
1258 DCHECK_EQ(2, args.length()); | 1259 DCHECK_EQ(2, args.length()); |
1259 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); | 1260 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); |
1260 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1); | 1261 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1); |
1261 Maybe<bool> result = Object::HasInPrototypeChain(isolate, object, prototype); | 1262 Maybe<bool> result = |
| 1263 JSReceiver::HasInPrototypeChain(isolate, object, prototype); |
1262 MAYBE_RETURN(result, isolate->heap()->exception()); | 1264 MAYBE_RETURN(result, isolate->heap()->exception()); |
1263 return isolate->heap()->ToBoolean(result.FromJust()); | 1265 return isolate->heap()->ToBoolean(result.FromJust()); |
1264 } | 1266 } |
1265 | 1267 |
1266 | 1268 |
1267 // ES6 section 7.4.7 CreateIterResultObject ( value, done ) | 1269 // ES6 section 7.4.7 CreateIterResultObject ( value, done ) |
1268 RUNTIME_FUNCTION(Runtime_CreateIterResultObject) { | 1270 RUNTIME_FUNCTION(Runtime_CreateIterResultObject) { |
1269 HandleScope scope(isolate); | 1271 HandleScope scope(isolate); |
1270 DCHECK_EQ(2, args.length()); | 1272 DCHECK_EQ(2, args.length()); |
1271 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); | 1273 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); |
(...skipping 29 matching lines...) Expand all Loading... |
1301 DCHECK(args.length() == 2); | 1303 DCHECK(args.length() == 2); |
1302 CONVERT_ARG_HANDLE_CHECKED(Object, o, 0); | 1304 CONVERT_ARG_HANDLE_CHECKED(Object, o, 0); |
1303 CONVERT_ARG_HANDLE_CHECKED(Object, properties, 1); | 1305 CONVERT_ARG_HANDLE_CHECKED(Object, properties, 1); |
1304 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1306 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1305 isolate, o, JSReceiver::DefineProperties(isolate, o, properties)); | 1307 isolate, o, JSReceiver::DefineProperties(isolate, o, properties)); |
1306 return *o; | 1308 return *o; |
1307 } | 1309 } |
1308 | 1310 |
1309 } // namespace internal | 1311 } // namespace internal |
1310 } // namespace v8 | 1312 } // namespace v8 |
OLD | NEW |