Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Side by Side Diff: src/builtins.cc

Issue 2028983002: Introduce IsUndefined(Isolate*) and IsTheHole(Isolate*) (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fixing wrongly wrapped lines Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/builtins.h" 5 #include "src/builtins.h"
6 6
7 #include "src/api-arguments.h" 7 #include "src/api-arguments.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, \ 177 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, \
178 isolate->factory()->NewStringFromAsciiChecked(method), \ 178 isolate->factory()->NewStringFromAsciiChecked(method), \
179 args.receiver())); \ 179 args.receiver())); \
180 } \ 180 } \
181 Handle<Type> name = Handle<Type>::cast(args.receiver()) 181 Handle<Type> name = Handle<Type>::cast(args.receiver())
182 182
183 // Throws a TypeError for {method} if the receiver is not coercible to Object, 183 // Throws a TypeError for {method} if the receiver is not coercible to Object,
184 // or converts the receiver to a String otherwise and assigns it to a new var 184 // or converts the receiver to a String otherwise and assigns it to a new var
185 // with the given {name}. 185 // with the given {name}.
186 #define TO_THIS_STRING(name, method) \ 186 #define TO_THIS_STRING(name, method) \
187 if (args.receiver()->IsNull() || args.receiver()->IsUndefined()) { \ 187 if (args.receiver()->IsNull() || args.receiver()->IsUndefined(isolate)) { \
188 THROW_NEW_ERROR_RETURN_FAILURE( \ 188 THROW_NEW_ERROR_RETURN_FAILURE( \
189 isolate, \ 189 isolate, \
190 NewTypeError(MessageTemplate::kCalledOnNullOrUndefined, \ 190 NewTypeError(MessageTemplate::kCalledOnNullOrUndefined, \
191 isolate->factory()->NewStringFromAsciiChecked(method))); \ 191 isolate->factory()->NewStringFromAsciiChecked(method))); \
192 } \ 192 } \
193 Handle<String> name; \ 193 Handle<String> name; \
194 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( \ 194 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( \
195 isolate, name, Object::ToString(isolate, args.receiver())) 195 isolate, name, Object::ToString(isolate, args.receiver()))
196 196
197 inline bool ClampedToInteger(Object* object, int* out) { 197 inline bool ClampedToInteger(Object* object, int* out) {
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 relative_end = len; 597 relative_end = len;
598 if (argument_count > 0) { 598 if (argument_count > 0) {
599 DisallowHeapAllocation no_gc; 599 DisallowHeapAllocation no_gc;
600 if (!ClampedToInteger(args[1], &relative_start)) { 600 if (!ClampedToInteger(args[1], &relative_start)) {
601 AllowHeapAllocation allow_allocation; 601 AllowHeapAllocation allow_allocation;
602 return CallJsIntrinsic(isolate, isolate->array_slice(), args); 602 return CallJsIntrinsic(isolate, isolate->array_slice(), args);
603 } 603 }
604 if (argument_count > 1) { 604 if (argument_count > 1) {
605 Object* end_arg = args[2]; 605 Object* end_arg = args[2];
606 // slice handles the end_arg specially 606 // slice handles the end_arg specially
607 if (end_arg->IsUndefined()) { 607 if (end_arg->IsUndefined(isolate)) {
608 relative_end = len; 608 relative_end = len;
609 } else if (!ClampedToInteger(end_arg, &relative_end)) { 609 } else if (!ClampedToInteger(end_arg, &relative_end)) {
610 AllowHeapAllocation allow_allocation; 610 AllowHeapAllocation allow_allocation;
611 return CallJsIntrinsic(isolate, isolate->array_slice(), args); 611 return CallJsIntrinsic(isolate, isolate->array_slice(), args);
612 } 612 }
613 } 613 }
614 } 614 }
615 615
616 // ECMAScript 232, 3rd Edition, Section 15.4.4.10, step 6. 616 // ECMAScript 232, 3rd Edition, Section 15.4.4.10, step 6.
617 uint32_t actual_start = (relative_start < 0) ? Max(len + relative_start, 0) 617 uint32_t actual_start = (relative_start < 0) ? Max(len + relative_start, 0)
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 // Convert storage to dictionary mode. 812 // Convert storage to dictionary mode.
813 void SetDictionaryMode() { 813 void SetDictionaryMode() {
814 DCHECK(fast_elements() && is_fixed_array()); 814 DCHECK(fast_elements() && is_fixed_array());
815 Handle<FixedArray> current_storage = storage_fixed_array(); 815 Handle<FixedArray> current_storage = storage_fixed_array();
816 Handle<SeededNumberDictionary> slow_storage( 816 Handle<SeededNumberDictionary> slow_storage(
817 SeededNumberDictionary::New(isolate_, current_storage->length())); 817 SeededNumberDictionary::New(isolate_, current_storage->length()));
818 uint32_t current_length = static_cast<uint32_t>(current_storage->length()); 818 uint32_t current_length = static_cast<uint32_t>(current_storage->length());
819 FOR_WITH_HANDLE_SCOPE( 819 FOR_WITH_HANDLE_SCOPE(
820 isolate_, uint32_t, i = 0, i, i < current_length, i++, { 820 isolate_, uint32_t, i = 0, i, i < current_length, i++, {
821 Handle<Object> element(current_storage->get(i), isolate_); 821 Handle<Object> element(current_storage->get(i), isolate_);
822 if (!element->IsTheHole()) { 822 if (!element->IsTheHole(isolate_)) {
823 // The object holding this backing store has just been allocated, so 823 // The object holding this backing store has just been allocated, so
824 // it cannot yet be used as a prototype. 824 // it cannot yet be used as a prototype.
825 Handle<SeededNumberDictionary> new_storage = 825 Handle<SeededNumberDictionary> new_storage =
826 SeededNumberDictionary::AtNumberPut(slow_storage, i, element, 826 SeededNumberDictionary::AtNumberPut(slow_storage, i, element,
827 false); 827 false);
828 if (!new_storage.is_identical_to(slow_storage)) { 828 if (!new_storage.is_identical_to(slow_storage)) {
829 slow_storage = loop_scope.CloseAndEscape(new_storage); 829 slow_storage = loop_scope.CloseAndEscape(new_storage);
830 } 830 }
831 } 831 }
832 }); 832 });
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 int element_count = 0; 869 int element_count = 0;
870 switch (array->GetElementsKind()) { 870 switch (array->GetElementsKind()) {
871 case FAST_SMI_ELEMENTS: 871 case FAST_SMI_ELEMENTS:
872 case FAST_HOLEY_SMI_ELEMENTS: 872 case FAST_HOLEY_SMI_ELEMENTS:
873 case FAST_ELEMENTS: 873 case FAST_ELEMENTS:
874 case FAST_HOLEY_ELEMENTS: { 874 case FAST_HOLEY_ELEMENTS: {
875 // Fast elements can't have lengths that are not representable by 875 // Fast elements can't have lengths that are not representable by
876 // a 32-bit signed integer. 876 // a 32-bit signed integer.
877 DCHECK(static_cast<int32_t>(FixedArray::kMaxLength) >= 0); 877 DCHECK(static_cast<int32_t>(FixedArray::kMaxLength) >= 0);
878 int fast_length = static_cast<int>(length); 878 int fast_length = static_cast<int>(length);
879 Handle<FixedArray> elements(FixedArray::cast(array->elements())); 879 Isolate* isolate = array->GetIsolate();
880 Handle<FixedArray> elements(FixedArray::cast(array->elements()), isolate);
880 for (int i = 0; i < fast_length; i++) { 881 for (int i = 0; i < fast_length; i++) {
881 if (!elements->get(i)->IsTheHole()) element_count++; 882 if (!elements->get(i)->IsTheHole(isolate)) element_count++;
882 } 883 }
883 break; 884 break;
884 } 885 }
885 case FAST_DOUBLE_ELEMENTS: 886 case FAST_DOUBLE_ELEMENTS:
886 case FAST_HOLEY_DOUBLE_ELEMENTS: { 887 case FAST_HOLEY_DOUBLE_ELEMENTS: {
887 // Fast elements can't have lengths that are not representable by 888 // Fast elements can't have lengths that are not representable by
888 // a 32-bit signed integer. 889 // a 32-bit signed integer.
889 DCHECK(static_cast<int32_t>(FixedDoubleArray::kMaxLength) >= 0); 890 DCHECK(static_cast<int32_t>(FixedDoubleArray::kMaxLength) >= 0);
890 int fast_length = static_cast<int>(length); 891 int fast_length = static_cast<int>(length);
891 if (array->elements()->IsFixedArray()) { 892 if (array->elements()->IsFixedArray()) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
947 switch (kind) { 948 switch (kind) {
948 case FAST_SMI_ELEMENTS: 949 case FAST_SMI_ELEMENTS:
949 case FAST_ELEMENTS: 950 case FAST_ELEMENTS:
950 case FAST_HOLEY_SMI_ELEMENTS: 951 case FAST_HOLEY_SMI_ELEMENTS:
951 case FAST_HOLEY_ELEMENTS: { 952 case FAST_HOLEY_ELEMENTS: {
952 DisallowHeapAllocation no_gc; 953 DisallowHeapAllocation no_gc;
953 FixedArray* elements = FixedArray::cast(object->elements()); 954 FixedArray* elements = FixedArray::cast(object->elements());
954 uint32_t length = static_cast<uint32_t>(elements->length()); 955 uint32_t length = static_cast<uint32_t>(elements->length());
955 if (range < length) length = range; 956 if (range < length) length = range;
956 for (uint32_t i = 0; i < length; i++) { 957 for (uint32_t i = 0; i < length; i++) {
957 if (!elements->get(i)->IsTheHole()) { 958 if (!elements->get(i)->IsTheHole(isolate)) {
958 indices->Add(i); 959 indices->Add(i);
959 } 960 }
960 } 961 }
961 break; 962 break;
962 } 963 }
963 case FAST_HOLEY_DOUBLE_ELEMENTS: 964 case FAST_HOLEY_DOUBLE_ELEMENTS:
964 case FAST_DOUBLE_ELEMENTS: { 965 case FAST_DOUBLE_ELEMENTS: {
965 if (object->elements()->IsFixedArray()) { 966 if (object->elements()->IsFixedArray()) {
966 DCHECK(object->elements()->length() == 0); 967 DCHECK(object->elements()->length() == 0);
967 break; 968 break;
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1117 case FAST_ELEMENTS: 1118 case FAST_ELEMENTS:
1118 case FAST_HOLEY_SMI_ELEMENTS: 1119 case FAST_HOLEY_SMI_ELEMENTS:
1119 case FAST_HOLEY_ELEMENTS: { 1120 case FAST_HOLEY_ELEMENTS: {
1120 // Run through the elements FixedArray and use HasElement and GetElement 1121 // Run through the elements FixedArray and use HasElement and GetElement
1121 // to check the prototype for missing elements. 1122 // to check the prototype for missing elements.
1122 Handle<FixedArray> elements(FixedArray::cast(array->elements())); 1123 Handle<FixedArray> elements(FixedArray::cast(array->elements()));
1123 int fast_length = static_cast<int>(length); 1124 int fast_length = static_cast<int>(length);
1124 DCHECK(fast_length <= elements->length()); 1125 DCHECK(fast_length <= elements->length());
1125 FOR_WITH_HANDLE_SCOPE(isolate, int, j = 0, j, j < fast_length, j++, { 1126 FOR_WITH_HANDLE_SCOPE(isolate, int, j = 0, j, j < fast_length, j++, {
1126 Handle<Object> element_value(elements->get(j), isolate); 1127 Handle<Object> element_value(elements->get(j), isolate);
1127 if (!element_value->IsTheHole()) { 1128 if (!element_value->IsTheHole(isolate)) {
1128 if (!visitor->visit(j, element_value)) return false; 1129 if (!visitor->visit(j, element_value)) return false;
1129 } else { 1130 } else {
1130 Maybe<bool> maybe = JSReceiver::HasElement(array, j); 1131 Maybe<bool> maybe = JSReceiver::HasElement(array, j);
1131 if (!maybe.IsJust()) return false; 1132 if (!maybe.IsJust()) return false;
1132 if (maybe.FromJust()) { 1133 if (maybe.FromJust()) {
1133 // Call GetElement on array, not its prototype, or getters won't 1134 // Call GetElement on array, not its prototype, or getters won't
1134 // have the correct receiver. 1135 // have the correct receiver.
1135 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 1136 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
1136 isolate, element_value, 1137 isolate, element_value,
1137 JSReceiver::GetElement(isolate, array, j), false); 1138 JSReceiver::GetElement(isolate, array, j), false);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 static Maybe<bool> IsConcatSpreadable(Isolate* isolate, Handle<Object> obj) { 1232 static Maybe<bool> IsConcatSpreadable(Isolate* isolate, Handle<Object> obj) {
1232 HandleScope handle_scope(isolate); 1233 HandleScope handle_scope(isolate);
1233 if (!obj->IsJSReceiver()) return Just(false); 1234 if (!obj->IsJSReceiver()) return Just(false);
1234 if (!isolate->IsIsConcatSpreadableLookupChainIntact()) { 1235 if (!isolate->IsIsConcatSpreadableLookupChainIntact()) {
1235 // Slow path if @@isConcatSpreadable has been used. 1236 // Slow path if @@isConcatSpreadable has been used.
1236 Handle<Symbol> key(isolate->factory()->is_concat_spreadable_symbol()); 1237 Handle<Symbol> key(isolate->factory()->is_concat_spreadable_symbol());
1237 Handle<Object> value; 1238 Handle<Object> value;
1238 MaybeHandle<Object> maybeValue = 1239 MaybeHandle<Object> maybeValue =
1239 i::Runtime::GetObjectProperty(isolate, obj, key); 1240 i::Runtime::GetObjectProperty(isolate, obj, key);
1240 if (!maybeValue.ToHandle(&value)) return Nothing<bool>(); 1241 if (!maybeValue.ToHandle(&value)) return Nothing<bool>();
1241 if (!value->IsUndefined()) return Just(value->BooleanValue()); 1242 if (!value->IsUndefined(isolate)) return Just(value->BooleanValue());
1242 } 1243 }
1243 return Object::IsArray(obj); 1244 return Object::IsArray(obj);
1244 } 1245 }
1245 1246
1246 1247
1247 Object* Slow_ArrayConcat(Arguments* args, Handle<Object> species, 1248 Object* Slow_ArrayConcat(Arguments* args, Handle<Object> species,
1248 Isolate* isolate) { 1249 Isolate* isolate) {
1249 int argument_count = args->length(); 1250 int argument_count = args->length();
1250 1251
1251 bool is_array_species = *species == isolate->context()->array_function(); 1252 bool is_array_species = *species == isolate->context()->array_function();
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
1490 1491
1491 } // namespace 1492 } // namespace
1492 1493
1493 1494
1494 // ES6 22.1.3.1 Array.prototype.concat 1495 // ES6 22.1.3.1 Array.prototype.concat
1495 BUILTIN(ArrayConcat) { 1496 BUILTIN(ArrayConcat) {
1496 HandleScope scope(isolate); 1497 HandleScope scope(isolate);
1497 1498
1498 Handle<Object> receiver = args.receiver(); 1499 Handle<Object> receiver = args.receiver();
1499 // TODO(bmeurer): Do we really care about the exact exception message here? 1500 // TODO(bmeurer): Do we really care about the exact exception message here?
1500 if (receiver->IsNull() || receiver->IsUndefined()) { 1501 if (receiver->IsNull() || receiver->IsUndefined(isolate)) {
1501 THROW_NEW_ERROR_RETURN_FAILURE( 1502 THROW_NEW_ERROR_RETURN_FAILURE(
1502 isolate, NewTypeError(MessageTemplate::kCalledOnNullOrUndefined, 1503 isolate, NewTypeError(MessageTemplate::kCalledOnNullOrUndefined,
1503 isolate->factory()->NewStringFromAsciiChecked( 1504 isolate->factory()->NewStringFromAsciiChecked(
1504 "Array.prototype.concat"))); 1505 "Array.prototype.concat")));
1505 } 1506 }
1506 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 1507 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
1507 isolate, receiver, Object::ToObject(isolate, args.receiver())); 1508 isolate, receiver, Object::ToObject(isolate, args.receiver()));
1508 args[0] = *receiver; 1509 args[0] = *receiver;
1509 1510
1510 Handle<JSArray> result_array; 1511 Handle<JSArray> result_array;
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1690 isolate); 1691 isolate);
1691 if (map->prototype() != *prototype) { 1692 if (map->prototype() != *prototype) {
1692 map = Map::TransitionToPrototype(map, prototype, FAST_PROTOTYPE); 1693 map = Map::TransitionToPrototype(map, prototype, FAST_PROTOTYPE);
1693 } 1694 }
1694 1695
1695 // Actually allocate the object. 1696 // Actually allocate the object.
1696 Handle<JSObject> object = isolate->factory()->NewJSObjectFromMap(map); 1697 Handle<JSObject> object = isolate->factory()->NewJSObjectFromMap(map);
1697 1698
1698 // Define the properties if properties was specified and is not undefined. 1699 // Define the properties if properties was specified and is not undefined.
1699 Handle<Object> properties = args.atOrUndefined(isolate, 2); 1700 Handle<Object> properties = args.atOrUndefined(isolate, 2);
1700 if (!properties->IsUndefined()) { 1701 if (!properties->IsUndefined(isolate)) {
1701 RETURN_FAILURE_ON_EXCEPTION( 1702 RETURN_FAILURE_ON_EXCEPTION(
1702 isolate, JSReceiver::DefineProperties(isolate, object, properties)); 1703 isolate, JSReceiver::DefineProperties(isolate, object, properties));
1703 } 1704 }
1704 1705
1705 return *object; 1706 return *object;
1706 } 1707 }
1707 1708
1708 // ES6 section 19.1.2.3 Object.defineProperties 1709 // ES6 section 19.1.2.3 Object.defineProperties
1709 BUILTIN(ObjectDefineProperties) { 1710 BUILTIN(ObjectDefineProperties) {
1710 HandleScope scope(isolate); 1711 HandleScope scope(isolate);
(...skipping 1233 matching lines...) Expand 10 before | Expand all | Expand 10 after
2944 // 3. If buffer does not have an [[ArrayBufferData]] internal slot, throw a 2945 // 3. If buffer does not have an [[ArrayBufferData]] internal slot, throw a
2945 // TypeError exception. 2946 // TypeError exception.
2946 if (!buffer->IsJSArrayBuffer()) { 2947 if (!buffer->IsJSArrayBuffer()) {
2947 THROW_NEW_ERROR_RETURN_FAILURE( 2948 THROW_NEW_ERROR_RETURN_FAILURE(
2948 isolate, NewTypeError(MessageTemplate::kDataViewNotArrayBuffer)); 2949 isolate, NewTypeError(MessageTemplate::kDataViewNotArrayBuffer));
2949 } 2950 }
2950 Handle<JSArrayBuffer> array_buffer = Handle<JSArrayBuffer>::cast(buffer); 2951 Handle<JSArrayBuffer> array_buffer = Handle<JSArrayBuffer>::cast(buffer);
2951 2952
2952 // 4. Let numberOffset be ? ToNumber(byteOffset). 2953 // 4. Let numberOffset be ? ToNumber(byteOffset).
2953 Handle<Object> number_offset; 2954 Handle<Object> number_offset;
2954 if (byte_offset->IsUndefined()) { 2955 if (byte_offset->IsUndefined(isolate)) {
2955 // We intentionally violate the specification at this point to allow 2956 // We intentionally violate the specification at this point to allow
2956 // for new DataView(buffer) invocations to be equivalent to the full 2957 // for new DataView(buffer) invocations to be equivalent to the full
2957 // new DataView(buffer, 0) invocation. 2958 // new DataView(buffer, 0) invocation.
2958 number_offset = handle(Smi::FromInt(0), isolate); 2959 number_offset = handle(Smi::FromInt(0), isolate);
2959 } else { 2960 } else {
2960 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, number_offset, 2961 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, number_offset,
2961 Object::ToNumber(byte_offset)); 2962 Object::ToNumber(byte_offset));
2962 } 2963 }
2963 2964
2964 // 5. Let offset be ToInteger(numberOffset). 2965 // 5. Let offset be ToInteger(numberOffset).
(...skipping 14 matching lines...) Expand all
2979 // internal slot. 2980 // internal slot.
2980 double const buffer_byte_length = array_buffer->byte_length()->Number(); 2981 double const buffer_byte_length = array_buffer->byte_length()->Number();
2981 2982
2982 // 9. If offset > bufferByteLength, throw a RangeError exception 2983 // 9. If offset > bufferByteLength, throw a RangeError exception
2983 if (offset->Number() > buffer_byte_length) { 2984 if (offset->Number() > buffer_byte_length) {
2984 THROW_NEW_ERROR_RETURN_FAILURE( 2985 THROW_NEW_ERROR_RETURN_FAILURE(
2985 isolate, NewRangeError(MessageTemplate::kInvalidDataViewOffset)); 2986 isolate, NewRangeError(MessageTemplate::kInvalidDataViewOffset));
2986 } 2987 }
2987 2988
2988 Handle<Object> view_byte_length; 2989 Handle<Object> view_byte_length;
2989 if (byte_length->IsUndefined()) { 2990 if (byte_length->IsUndefined(isolate)) {
2990 // 10. If byteLength is undefined, then 2991 // 10. If byteLength is undefined, then
2991 // a. Let viewByteLength be bufferByteLength - offset. 2992 // a. Let viewByteLength be bufferByteLength - offset.
2992 view_byte_length = 2993 view_byte_length =
2993 isolate->factory()->NewNumber(buffer_byte_length - offset->Number()); 2994 isolate->factory()->NewNumber(buffer_byte_length - offset->Number());
2994 } else { 2995 } else {
2995 // 11. Else, 2996 // 11. Else,
2996 // a. Let viewByteLength be ? ToLength(byteLength). 2997 // a. Let viewByteLength be ? ToLength(byteLength).
2997 // b. If offset+viewByteLength > bufferByteLength, throw a RangeError 2998 // b. If offset+viewByteLength > bufferByteLength, throw a RangeError
2998 // exception 2999 // exception
2999 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 3000 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
(...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after
4163 function->shared()->set_name_should_print_as_anonymous(true); 4164 function->shared()->set_name_should_print_as_anonymous(true);
4164 } 4165 }
4165 4166
4166 // If new.target is equal to target then the function created 4167 // If new.target is equal to target then the function created
4167 // is already correctly setup and nothing else should be done 4168 // is already correctly setup and nothing else should be done
4168 // here. But if new.target is not equal to target then we are 4169 // here. But if new.target is not equal to target then we are
4169 // have a Function builtin subclassing case and therefore the 4170 // have a Function builtin subclassing case and therefore the
4170 // function has wrong initial map. To fix that we create a new 4171 // function has wrong initial map. To fix that we create a new
4171 // function object with correct initial map. 4172 // function object with correct initial map.
4172 Handle<Object> unchecked_new_target = args.new_target(); 4173 Handle<Object> unchecked_new_target = args.new_target();
4173 if (!unchecked_new_target->IsUndefined() && 4174 if (!unchecked_new_target->IsUndefined(isolate) &&
4174 !unchecked_new_target.is_identical_to(target)) { 4175 !unchecked_new_target.is_identical_to(target)) {
4175 Handle<JSReceiver> new_target = 4176 Handle<JSReceiver> new_target =
4176 Handle<JSReceiver>::cast(unchecked_new_target); 4177 Handle<JSReceiver>::cast(unchecked_new_target);
4177 Handle<Map> initial_map; 4178 Handle<Map> initial_map;
4178 ASSIGN_RETURN_ON_EXCEPTION( 4179 ASSIGN_RETURN_ON_EXCEPTION(
4179 isolate, initial_map, 4180 isolate, initial_map,
4180 JSFunction::GetDerivedMap(isolate, target, new_target), JSFunction); 4181 JSFunction::GetDerivedMap(isolate, target, new_target), JSFunction);
4181 4182
4182 Handle<SharedFunctionInfo> shared_info(function->shared(), isolate); 4183 Handle<SharedFunctionInfo> shared_info(function->shared(), isolate);
4183 Handle<Map> map = Map::AsLanguageMode( 4184 Handle<Map> map = Map::AsLanguageMode(
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
4315 HandleScope scope(isolate); 4316 HandleScope scope(isolate);
4316 RETURN_RESULT_OR_FAILURE( 4317 RETURN_RESULT_OR_FAILURE(
4317 isolate, CreateDynamicFunction(isolate, args, "async function")); 4318 isolate, CreateDynamicFunction(isolate, args, "async function"));
4318 } 4319 }
4319 4320
4320 // ES6 section 19.4.1.1 Symbol ( [ description ] ) for the [[Call]] case. 4321 // ES6 section 19.4.1.1 Symbol ( [ description ] ) for the [[Call]] case.
4321 BUILTIN(SymbolConstructor) { 4322 BUILTIN(SymbolConstructor) {
4322 HandleScope scope(isolate); 4323 HandleScope scope(isolate);
4323 Handle<Symbol> result = isolate->factory()->NewSymbol(); 4324 Handle<Symbol> result = isolate->factory()->NewSymbol();
4324 Handle<Object> description = args.atOrUndefined(isolate, 1); 4325 Handle<Object> description = args.atOrUndefined(isolate, 1);
4325 if (!description->IsUndefined()) { 4326 if (!description->IsUndefined(isolate)) {
4326 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, description, 4327 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, description,
4327 Object::ToString(isolate, description)); 4328 Object::ToString(isolate, description));
4328 result->set_name(*description); 4329 result->set_name(*description);
4329 } 4330 }
4330 return *result; 4331 return *result;
4331 } 4332 }
4332 4333
4333 4334
4334 // ES6 section 19.4.1.1 Symbol ( [ description ] ) for the [[Construct]] case. 4335 // ES6 section 19.4.1.1 Symbol ( [ description ] ) for the [[Construct]] case.
4335 BUILTIN(SymbolConstructor_ConstructStub) { 4336 BUILTIN(SymbolConstructor_ConstructStub) {
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after
4851 4852
4852 4853
4853 namespace { 4854 namespace {
4854 4855
4855 MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper( 4856 MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper(
4856 Isolate* isolate, 4857 Isolate* isolate,
4857 BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget> args) { 4858 BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget> args) {
4858 HandleScope scope(isolate); 4859 HandleScope scope(isolate);
4859 Handle<HeapObject> function = args.target<HeapObject>(); 4860 Handle<HeapObject> function = args.target<HeapObject>();
4860 Handle<HeapObject> new_target = args.new_target(); 4861 Handle<HeapObject> new_target = args.new_target();
4861 bool is_construct = !new_target->IsUndefined(); 4862 bool is_construct = !new_target->IsUndefined(isolate);
4862 Handle<JSReceiver> receiver; 4863 Handle<JSReceiver> receiver;
4863 4864
4864 DCHECK(function->IsFunctionTemplateInfo() || 4865 DCHECK(function->IsFunctionTemplateInfo() ||
4865 Handle<JSFunction>::cast(function)->shared()->IsApiFunction()); 4866 Handle<JSFunction>::cast(function)->shared()->IsApiFunction());
4866 4867
4867 Handle<FunctionTemplateInfo> fun_data = 4868 Handle<FunctionTemplateInfo> fun_data =
4868 function->IsFunctionTemplateInfo() 4869 function->IsFunctionTemplateInfo()
4869 ? Handle<FunctionTemplateInfo>::cast(function) 4870 ? Handle<FunctionTemplateInfo>::cast(function)
4870 : handle(JSFunction::cast(*function)->shared()->get_api_func_data()); 4871 : handle(JSFunction::cast(*function)->shared()->get_api_func_data());
4871 if (is_construct) { 4872 if (is_construct) {
4872 DCHECK(args.receiver()->IsTheHole()); 4873 DCHECK(args.receiver()->IsTheHole(isolate));
4873 if (fun_data->instance_template()->IsUndefined()) { 4874 if (fun_data->instance_template()->IsUndefined(isolate)) {
4874 v8::Local<ObjectTemplate> templ = 4875 v8::Local<ObjectTemplate> templ =
4875 ObjectTemplate::New(reinterpret_cast<v8::Isolate*>(isolate), 4876 ObjectTemplate::New(reinterpret_cast<v8::Isolate*>(isolate),
4876 ToApiHandle<v8::FunctionTemplate>(fun_data)); 4877 ToApiHandle<v8::FunctionTemplate>(fun_data));
4877 fun_data->set_instance_template(*Utils::OpenHandle(*templ)); 4878 fun_data->set_instance_template(*Utils::OpenHandle(*templ));
4878 } 4879 }
4879 Handle<ObjectTemplateInfo> instance_template( 4880 Handle<ObjectTemplateInfo> instance_template(
4880 ObjectTemplateInfo::cast(fun_data->instance_template()), isolate); 4881 ObjectTemplateInfo::cast(fun_data->instance_template()), isolate);
4881 ASSIGN_RETURN_ON_EXCEPTION( 4882 ASSIGN_RETURN_ON_EXCEPTION(
4882 isolate, receiver, 4883 isolate, receiver,
4883 ApiNatives::InstantiateObject(instance_template, 4884 ApiNatives::InstantiateObject(instance_template,
(...skipping 18 matching lines...) Expand all
4902 4903
4903 Object* raw_holder = fun_data->GetCompatibleReceiver(isolate, *receiver); 4904 Object* raw_holder = fun_data->GetCompatibleReceiver(isolate, *receiver);
4904 4905
4905 if (raw_holder->IsNull()) { 4906 if (raw_holder->IsNull()) {
4906 // This function cannot be called with the given receiver. Abort! 4907 // This function cannot be called with the given receiver. Abort!
4907 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kIllegalInvocation), 4908 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kIllegalInvocation),
4908 Object); 4909 Object);
4909 } 4910 }
4910 4911
4911 Object* raw_call_data = fun_data->call_code(); 4912 Object* raw_call_data = fun_data->call_code();
4912 if (!raw_call_data->IsUndefined()) { 4913 if (!raw_call_data->IsUndefined(isolate)) {
4913 DCHECK(raw_call_data->IsCallHandlerInfo()); 4914 DCHECK(raw_call_data->IsCallHandlerInfo());
4914 CallHandlerInfo* call_data = CallHandlerInfo::cast(raw_call_data); 4915 CallHandlerInfo* call_data = CallHandlerInfo::cast(raw_call_data);
4915 Object* callback_obj = call_data->callback(); 4916 Object* callback_obj = call_data->callback();
4916 v8::FunctionCallback callback = 4917 v8::FunctionCallback callback =
4917 v8::ToCData<v8::FunctionCallback>(callback_obj); 4918 v8::ToCData<v8::FunctionCallback>(callback_obj);
4918 Object* data_obj = call_data->data(); 4919 Object* data_obj = call_data->data();
4919 4920
4920 LOG(isolate, ApiObjectAccess("call", JSObject::cast(*args.receiver()))); 4921 LOG(isolate, ApiObjectAccess("call", JSObject::cast(*args.receiver())));
4921 DCHECK(raw_holder->IsJSObject()); 4922 DCHECK(raw_holder->IsJSObject());
4922 4923
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
5112 } 5113 }
5113 5114
5114 // Get the invocation callback from the function descriptor that was 5115 // Get the invocation callback from the function descriptor that was
5115 // used to create the called object. 5116 // used to create the called object.
5116 DCHECK(obj->map()->is_callable()); 5117 DCHECK(obj->map()->is_callable());
5117 JSFunction* constructor = JSFunction::cast(obj->map()->GetConstructor()); 5118 JSFunction* constructor = JSFunction::cast(obj->map()->GetConstructor());
5118 // TODO(ishell): turn this back to a DCHECK. 5119 // TODO(ishell): turn this back to a DCHECK.
5119 CHECK(constructor->shared()->IsApiFunction()); 5120 CHECK(constructor->shared()->IsApiFunction());
5120 Object* handler = 5121 Object* handler =
5121 constructor->shared()->get_api_func_data()->instance_call_handler(); 5122 constructor->shared()->get_api_func_data()->instance_call_handler();
5122 DCHECK(!handler->IsUndefined()); 5123 DCHECK(!handler->IsUndefined(isolate));
5123 // TODO(ishell): remove this debugging code. 5124 // TODO(ishell): remove this debugging code.
5124 CHECK(handler->IsCallHandlerInfo()); 5125 CHECK(handler->IsCallHandlerInfo());
5125 CallHandlerInfo* call_data = CallHandlerInfo::cast(handler); 5126 CallHandlerInfo* call_data = CallHandlerInfo::cast(handler);
5126 Object* callback_obj = call_data->callback(); 5127 Object* callback_obj = call_data->callback();
5127 v8::FunctionCallback callback = 5128 v8::FunctionCallback callback =
5128 v8::ToCData<v8::FunctionCallback>(callback_obj); 5129 v8::ToCData<v8::FunctionCallback>(callback_obj);
5129 5130
5130 // Get the data for the call and perform the callback. 5131 // Get the data for the call and perform the callback.
5131 Object* result; 5132 Object* result;
5132 { 5133 {
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
5771 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) 5772 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T)
5772 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 5773 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
5773 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 5774 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
5774 #undef DEFINE_BUILTIN_ACCESSOR_C 5775 #undef DEFINE_BUILTIN_ACCESSOR_C
5775 #undef DEFINE_BUILTIN_ACCESSOR_A 5776 #undef DEFINE_BUILTIN_ACCESSOR_A
5776 #undef DEFINE_BUILTIN_ACCESSOR_T 5777 #undef DEFINE_BUILTIN_ACCESSOR_T
5777 #undef DEFINE_BUILTIN_ACCESSOR_H 5778 #undef DEFINE_BUILTIN_ACCESSOR_H
5778 5779
5779 } // namespace internal 5780 } // namespace internal
5780 } // namespace v8 5781 } // namespace v8
OLDNEW
« no previous file with comments | « src/bootstrapper.cc ('k') | src/compilation-cache.cc » ('j') | src/debug/debug.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698