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 <stdlib.h> | 5 #include <stdlib.h> |
6 #include <limits> | 6 #include <limits> |
7 | 7 |
8 #include "v8.h" | 8 #include "v8.h" |
9 | 9 |
10 #include "accessors.h" | 10 #include "accessors.h" |
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
971 size_t element_size = 1; // Bogus initialization. | 971 size_t element_size = 1; // Bogus initialization. |
972 ElementsKind external_elements_kind = | 972 ElementsKind external_elements_kind = |
973 EXTERNAL_INT8_ELEMENTS; // Bogus initialization. | 973 EXTERNAL_INT8_ELEMENTS; // Bogus initialization. |
974 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. | 974 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. |
975 Runtime::ArrayIdToTypeAndSize(arrayId, | 975 Runtime::ArrayIdToTypeAndSize(arrayId, |
976 &array_type, | 976 &array_type, |
977 &external_elements_kind, | 977 &external_elements_kind, |
978 &fixed_elements_kind, | 978 &fixed_elements_kind, |
979 &element_size); | 979 &element_size); |
980 | 980 |
981 RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind); | |
982 | |
981 size_t byte_offset = 0; | 983 size_t byte_offset = 0; |
982 size_t byte_length = 0; | 984 size_t byte_length = 0; |
983 RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_offset_object, &byte_offset)); | 985 RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_offset_object, &byte_offset)); |
984 RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_length_object, &byte_length)); | 986 RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_length_object, &byte_length)); |
985 | 987 |
986 holder->set_byte_offset(*byte_offset_object); | 988 holder->set_byte_offset(*byte_offset_object); |
987 holder->set_byte_length(*byte_length_object); | 989 holder->set_byte_length(*byte_length_object); |
988 | 990 |
989 CHECK_EQ(0, static_cast<int>(byte_length % element_size)); | 991 RUNTIME_ASSERT(0 == static_cast<int>(byte_length % element_size)); |
Dmitry Lomov (no reviews)
2014/05/07 14:47:18
nit: static_cast<int> no longer needed here
Jakob Kummerow
2014/05/08 09:32:57
Done.
| |
990 size_t length = byte_length / element_size; | 992 size_t length = byte_length / element_size; |
991 | 993 |
992 if (length > static_cast<unsigned>(Smi::kMaxValue)) { | 994 if (length > static_cast<unsigned>(Smi::kMaxValue)) { |
993 return isolate->Throw( | 995 return isolate->Throw( |
994 *isolate->factory()->NewRangeError("invalid_typed_array_length", | 996 *isolate->factory()->NewRangeError("invalid_typed_array_length", |
995 HandleVector<Object>(NULL, 0))); | 997 HandleVector<Object>(NULL, 0))); |
996 } | 998 } |
997 | 999 |
998 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); | 1000 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); |
999 holder->set_length(*length_obj); | 1001 holder->set_length(*length_obj); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1055 size_t element_size = 1; // Bogus initialization. | 1057 size_t element_size = 1; // Bogus initialization. |
1056 ElementsKind external_elements_kind = | 1058 ElementsKind external_elements_kind = |
1057 EXTERNAL_INT8_ELEMENTS; // Bogus intialization. | 1059 EXTERNAL_INT8_ELEMENTS; // Bogus intialization. |
1058 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. | 1060 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. |
1059 Runtime::ArrayIdToTypeAndSize(arrayId, | 1061 Runtime::ArrayIdToTypeAndSize(arrayId, |
1060 &array_type, | 1062 &array_type, |
1061 &external_elements_kind, | 1063 &external_elements_kind, |
1062 &fixed_elements_kind, | 1064 &fixed_elements_kind, |
1063 &element_size); | 1065 &element_size); |
1064 | 1066 |
1067 RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind); | |
1068 | |
1065 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); | 1069 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); |
1066 if (source->IsJSTypedArray() && | 1070 if (source->IsJSTypedArray() && |
1067 JSTypedArray::cast(*source)->type() == array_type) { | 1071 JSTypedArray::cast(*source)->type() == array_type) { |
1068 length_obj = Handle<Object>(JSTypedArray::cast(*source)->length(), isolate); | 1072 length_obj = Handle<Object>(JSTypedArray::cast(*source)->length(), isolate); |
1069 } | 1073 } |
1070 size_t length = 0; | 1074 size_t length = 0; |
1071 RUNTIME_ASSERT(TryNumberToSize(isolate, *length_obj, &length)); | 1075 RUNTIME_ASSERT(TryNumberToSize(isolate, *length_obj, &length)); |
1072 | 1076 |
1073 if ((length > static_cast<unsigned>(Smi::kMaxValue)) || | 1077 if ((length > static_cast<unsigned>(Smi::kMaxValue)) || |
1074 (length > (kMaxInt / element_size))) { | 1078 (length > (kMaxInt / element_size))) { |
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1732 } | 1736 } |
1733 | 1737 |
1734 | 1738 |
1735 RUNTIME_FUNCTION(Runtime_WeakCollectionGet) { | 1739 RUNTIME_FUNCTION(Runtime_WeakCollectionGet) { |
1736 HandleScope scope(isolate); | 1740 HandleScope scope(isolate); |
1737 ASSERT(args.length() == 2); | 1741 ASSERT(args.length() == 2); |
1738 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 1742 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
1739 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 1743 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
1740 Handle<ObjectHashTable> table( | 1744 Handle<ObjectHashTable> table( |
1741 ObjectHashTable::cast(weak_collection->table())); | 1745 ObjectHashTable::cast(weak_collection->table())); |
1746 RUNTIME_ASSERT(table->IsKey(*key)); | |
1742 Handle<Object> lookup(table->Lookup(key), isolate); | 1747 Handle<Object> lookup(table->Lookup(key), isolate); |
1743 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; | 1748 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; |
1744 } | 1749 } |
1745 | 1750 |
1746 | 1751 |
1747 RUNTIME_FUNCTION(Runtime_WeakCollectionHas) { | 1752 RUNTIME_FUNCTION(Runtime_WeakCollectionHas) { |
1748 HandleScope scope(isolate); | 1753 HandleScope scope(isolate); |
1749 ASSERT(args.length() == 2); | 1754 ASSERT(args.length() == 2); |
1750 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 1755 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
1751 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 1756 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
1752 Handle<ObjectHashTable> table( | 1757 Handle<ObjectHashTable> table( |
1753 ObjectHashTable::cast(weak_collection->table())); | 1758 ObjectHashTable::cast(weak_collection->table())); |
1759 RUNTIME_ASSERT(table->IsKey(*key)); | |
1754 Handle<Object> lookup(table->Lookup(key), isolate); | 1760 Handle<Object> lookup(table->Lookup(key), isolate); |
1755 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); | 1761 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); |
1756 } | 1762 } |
1757 | 1763 |
1758 | 1764 |
1759 RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { | 1765 RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { |
1760 HandleScope scope(isolate); | 1766 HandleScope scope(isolate); |
1761 ASSERT(args.length() == 2); | 1767 ASSERT(args.length() == 2); |
1762 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 1768 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
1763 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 1769 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
1764 Handle<ObjectHashTable> table(ObjectHashTable::cast( | 1770 Handle<ObjectHashTable> table(ObjectHashTable::cast( |
1765 weak_collection->table())); | 1771 weak_collection->table())); |
1772 RUNTIME_ASSERT(table->IsKey(*key)); | |
1766 Handle<Object> lookup(table->Lookup(key), isolate); | 1773 Handle<Object> lookup(table->Lookup(key), isolate); |
1767 Handle<ObjectHashTable> new_table = | 1774 Handle<ObjectHashTable> new_table = |
1768 ObjectHashTable::Put(table, key, isolate->factory()->the_hole_value()); | 1775 ObjectHashTable::Put(table, key, isolate->factory()->the_hole_value()); |
1769 weak_collection->set_table(*new_table); | 1776 weak_collection->set_table(*new_table); |
1770 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); | 1777 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); |
1771 } | 1778 } |
1772 | 1779 |
1773 | 1780 |
1774 RUNTIME_FUNCTION(Runtime_WeakCollectionSet) { | 1781 RUNTIME_FUNCTION(Runtime_WeakCollectionSet) { |
1775 HandleScope scope(isolate); | 1782 HandleScope scope(isolate); |
1776 ASSERT(args.length() == 3); | 1783 ASSERT(args.length() == 3); |
1777 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 1784 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
1778 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 1785 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
1779 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 1786 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
1780 Handle<ObjectHashTable> table( | 1787 Handle<ObjectHashTable> table( |
1781 ObjectHashTable::cast(weak_collection->table())); | 1788 ObjectHashTable::cast(weak_collection->table())); |
1789 RUNTIME_ASSERT(table->IsKey(*key)); | |
1782 Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value); | 1790 Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value); |
1783 weak_collection->set_table(*new_table); | 1791 weak_collection->set_table(*new_table); |
1784 return isolate->heap()->undefined_value(); | 1792 return isolate->heap()->undefined_value(); |
1785 } | 1793 } |
1786 | 1794 |
1787 | 1795 |
1788 RUNTIME_FUNCTION(Runtime_ClassOf) { | 1796 RUNTIME_FUNCTION(Runtime_ClassOf) { |
1789 SealHandleScope shs(isolate); | 1797 SealHandleScope shs(isolate); |
1790 ASSERT(args.length() == 1); | 1798 ASSERT(args.length() == 1); |
1791 CONVERT_ARG_CHECKED(Object, obj, 0); | 1799 CONVERT_ARG_CHECKED(Object, obj, 0); |
(...skipping 2506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4298 RUNTIME_FUNCTION(Runtime_StringReplaceGlobalRegExpWithString) { | 4306 RUNTIME_FUNCTION(Runtime_StringReplaceGlobalRegExpWithString) { |
4299 HandleScope scope(isolate); | 4307 HandleScope scope(isolate); |
4300 ASSERT(args.length() == 4); | 4308 ASSERT(args.length() == 4); |
4301 | 4309 |
4302 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); | 4310 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); |
4303 CONVERT_ARG_HANDLE_CHECKED(String, replacement, 2); | 4311 CONVERT_ARG_HANDLE_CHECKED(String, replacement, 2); |
4304 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1); | 4312 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1); |
4305 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3); | 4313 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3); |
4306 | 4314 |
4307 RUNTIME_ASSERT(regexp->GetFlags().is_global()); | 4315 RUNTIME_ASSERT(regexp->GetFlags().is_global()); |
4316 RUNTIME_ASSERT(last_match_info->HasFastObjectElements()); | |
4308 | 4317 |
4309 subject = String::Flatten(subject); | 4318 subject = String::Flatten(subject); |
4310 | 4319 |
4311 if (replacement->length() == 0) { | 4320 if (replacement->length() == 0) { |
4312 if (subject->HasOnlyOneByteChars()) { | 4321 if (subject->HasOnlyOneByteChars()) { |
4313 return StringReplaceGlobalRegExpWithEmptyString<SeqOneByteString>( | 4322 return StringReplaceGlobalRegExpWithEmptyString<SeqOneByteString>( |
4314 isolate, subject, regexp, last_match_info); | 4323 isolate, subject, regexp, last_match_info); |
4315 } else { | 4324 } else { |
4316 return StringReplaceGlobalRegExpWithEmptyString<SeqTwoByteString>( | 4325 return StringReplaceGlobalRegExpWithEmptyString<SeqTwoByteString>( |
4317 isolate, subject, regexp, last_match_info); | 4326 isolate, subject, regexp, last_match_info); |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4728 result_array->set_length(js_array_length); | 4737 result_array->set_length(js_array_length); |
4729 RegExpImpl::SetLastMatchInfo( | 4738 RegExpImpl::SetLastMatchInfo( |
4730 last_match_array, subject, capture_count, NULL); | 4739 last_match_array, subject, capture_count, NULL); |
4731 return *result_array; | 4740 return *result_array; |
4732 } | 4741 } |
4733 } | 4742 } |
4734 | 4743 |
4735 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate); | 4744 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate); |
4736 if (global_cache.HasException()) return isolate->heap()->exception(); | 4745 if (global_cache.HasException()) return isolate->heap()->exception(); |
4737 | 4746 |
4738 Handle<FixedArray> result_elements; | 4747 // Ensured in Runtime_RegExpExecMultiple. |
4739 if (result_array->HasFastObjectElements()) { | 4748 ASSERT(result_array->HasFastObjectElements()); |
4740 result_elements = | 4749 Handle<FixedArray> result_elements( |
4741 Handle<FixedArray>(FixedArray::cast(result_array->elements())); | 4750 FixedArray::cast(result_array->elements())); |
4742 } | 4751 if (result_elements->length() < 16) { |
4743 if (result_elements.is_null() || result_elements->length() < 16) { | |
4744 result_elements = isolate->factory()->NewFixedArrayWithHoles(16); | 4752 result_elements = isolate->factory()->NewFixedArrayWithHoles(16); |
4745 } | 4753 } |
4746 | 4754 |
4747 FixedArrayBuilder builder(result_elements); | 4755 FixedArrayBuilder builder(result_elements); |
4748 | 4756 |
4749 // Position to search from. | 4757 // Position to search from. |
4750 int match_start = -1; | 4758 int match_start = -1; |
4751 int match_end = 0; | 4759 int match_end = 0; |
4752 bool first = true; | 4760 bool first = true; |
4753 | 4761 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4847 // lastMatchInfoOverride to maintain the last match info, so we don't need to | 4855 // lastMatchInfoOverride to maintain the last match info, so we don't need to |
4848 // set any other last match array info. | 4856 // set any other last match array info. |
4849 RUNTIME_FUNCTION(Runtime_RegExpExecMultiple) { | 4857 RUNTIME_FUNCTION(Runtime_RegExpExecMultiple) { |
4850 HandleScope handles(isolate); | 4858 HandleScope handles(isolate); |
4851 ASSERT(args.length() == 4); | 4859 ASSERT(args.length() == 4); |
4852 | 4860 |
4853 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); | 4861 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); |
4854 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); | 4862 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); |
4855 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 2); | 4863 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 2); |
4856 CONVERT_ARG_HANDLE_CHECKED(JSArray, result_array, 3); | 4864 CONVERT_ARG_HANDLE_CHECKED(JSArray, result_array, 3); |
4865 RUNTIME_ASSERT(last_match_info->HasFastObjectElements()); | |
4866 RUNTIME_ASSERT(result_array->HasFastObjectElements()); | |
4857 | 4867 |
4858 subject = String::Flatten(subject); | 4868 subject = String::Flatten(subject); |
4859 ASSERT(regexp->GetFlags().is_global()); | 4869 RUNTIME_ASSERT(regexp->GetFlags().is_global()); |
4860 | 4870 |
4861 if (regexp->CaptureCount() == 0) { | 4871 if (regexp->CaptureCount() == 0) { |
4862 return SearchRegExpMultiple<false>( | 4872 return SearchRegExpMultiple<false>( |
4863 isolate, subject, regexp, last_match_info, result_array); | 4873 isolate, subject, regexp, last_match_info, result_array); |
4864 } else { | 4874 } else { |
4865 return SearchRegExpMultiple<true>( | 4875 return SearchRegExpMultiple<true>( |
4866 isolate, subject, regexp, last_match_info, result_array); | 4876 isolate, subject, regexp, last_match_info, result_array); |
4867 } | 4877 } |
4868 } | 4878 } |
4869 | 4879 |
(...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5497 } | 5507 } |
5498 | 5508 |
5499 | 5509 |
5500 RUNTIME_FUNCTION(Runtime_SetHiddenProperty) { | 5510 RUNTIME_FUNCTION(Runtime_SetHiddenProperty) { |
5501 HandleScope scope(isolate); | 5511 HandleScope scope(isolate); |
5502 RUNTIME_ASSERT(args.length() == 3); | 5512 RUNTIME_ASSERT(args.length() == 3); |
5503 | 5513 |
5504 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 5514 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
5505 CONVERT_ARG_HANDLE_CHECKED(String, key, 1); | 5515 CONVERT_ARG_HANDLE_CHECKED(String, key, 1); |
5506 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 5516 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
5517 RUNTIME_ASSERT(key->IsUniqueName()); | |
5507 return *JSObject::SetHiddenProperty(object, key, value); | 5518 return *JSObject::SetHiddenProperty(object, key, value); |
5508 } | 5519 } |
5509 | 5520 |
5510 | 5521 |
5511 RUNTIME_FUNCTION(Runtime_SetProperty) { | 5522 RUNTIME_FUNCTION(Runtime_SetProperty) { |
5512 HandleScope scope(isolate); | 5523 HandleScope scope(isolate); |
5513 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); | 5524 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); |
5514 | 5525 |
5515 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); | 5526 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); |
5516 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 5527 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
(...skipping 1814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7331 | 7342 |
7332 | 7343 |
7333 RUNTIME_FUNCTION(Runtime_StringBuilderJoin) { | 7344 RUNTIME_FUNCTION(Runtime_StringBuilderJoin) { |
7334 HandleScope scope(isolate); | 7345 HandleScope scope(isolate); |
7335 ASSERT(args.length() == 3); | 7346 ASSERT(args.length() == 3); |
7336 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); | 7347 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); |
7337 if (!args[1]->IsSmi()) return isolate->ThrowInvalidStringLength(); | 7348 if (!args[1]->IsSmi()) return isolate->ThrowInvalidStringLength(); |
7338 CONVERT_SMI_ARG_CHECKED(array_length, 1); | 7349 CONVERT_SMI_ARG_CHECKED(array_length, 1); |
7339 CONVERT_ARG_HANDLE_CHECKED(String, separator, 2); | 7350 CONVERT_ARG_HANDLE_CHECKED(String, separator, 2); |
7340 RUNTIME_ASSERT(array->HasFastObjectElements()); | 7351 RUNTIME_ASSERT(array->HasFastObjectElements()); |
7352 RUNTIME_ASSERT(array_length >= 0); | |
7341 | 7353 |
7342 Handle<FixedArray> fixed_array(FixedArray::cast(array->elements())); | 7354 Handle<FixedArray> fixed_array(FixedArray::cast(array->elements())); |
7343 if (fixed_array->length() < array_length) { | 7355 if (fixed_array->length() < array_length) { |
7344 array_length = fixed_array->length(); | 7356 array_length = fixed_array->length(); |
7345 } | 7357 } |
7346 | 7358 |
7347 if (array_length == 0) { | 7359 if (array_length == 0) { |
7348 return isolate->heap()->empty_string(); | 7360 return isolate->heap()->empty_string(); |
7349 } else if (array_length == 1) { | 7361 } else if (array_length == 1) { |
7350 Object* first = fixed_array->get(0); | 7362 Object* first = fixed_array->get(0); |
(...skipping 27 matching lines...) Expand all Loading... | |
7378 isolate, answer, | 7390 isolate, answer, |
7379 isolate->factory()->NewRawTwoByteString(length)); | 7391 isolate->factory()->NewRawTwoByteString(length)); |
7380 | 7392 |
7381 DisallowHeapAllocation no_gc; | 7393 DisallowHeapAllocation no_gc; |
7382 | 7394 |
7383 uc16* sink = answer->GetChars(); | 7395 uc16* sink = answer->GetChars(); |
7384 #ifdef DEBUG | 7396 #ifdef DEBUG |
7385 uc16* end = sink + length; | 7397 uc16* end = sink + length; |
7386 #endif | 7398 #endif |
7387 | 7399 |
7400 RUNTIME_ASSERT(fixed_array->get(0)->IsString()); | |
7388 String* first = String::cast(fixed_array->get(0)); | 7401 String* first = String::cast(fixed_array->get(0)); |
7389 String* seperator_raw = *separator; | 7402 String* separator_raw = *separator; |
7390 int first_length = first->length(); | 7403 int first_length = first->length(); |
7391 String::WriteToFlat(first, sink, 0, first_length); | 7404 String::WriteToFlat(first, sink, 0, first_length); |
7392 sink += first_length; | 7405 sink += first_length; |
7393 | 7406 |
7394 for (int i = 1; i < array_length; i++) { | 7407 for (int i = 1; i < array_length; i++) { |
7395 ASSERT(sink + separator_length <= end); | 7408 ASSERT(sink + separator_length <= end); |
7396 String::WriteToFlat(seperator_raw, sink, 0, separator_length); | 7409 String::WriteToFlat(separator_raw, sink, 0, separator_length); |
7397 sink += separator_length; | 7410 sink += separator_length; |
7398 | 7411 |
7412 RUNTIME_ASSERT(fixed_array->get(i)->IsString()); | |
7399 String* element = String::cast(fixed_array->get(i)); | 7413 String* element = String::cast(fixed_array->get(i)); |
7400 int element_length = element->length(); | 7414 int element_length = element->length(); |
7401 ASSERT(sink + element_length <= end); | 7415 ASSERT(sink + element_length <= end); |
7402 String::WriteToFlat(element, sink, 0, element_length); | 7416 String::WriteToFlat(element, sink, 0, element_length); |
7403 sink += element_length; | 7417 sink += element_length; |
7404 } | 7418 } |
7405 ASSERT(sink == end); | 7419 ASSERT(sink == end); |
7406 | 7420 |
7407 // Use %_FastAsciiArrayJoin instead. | 7421 // Use %_FastAsciiArrayJoin instead. |
7408 ASSERT(!answer->IsOneByteRepresentation()); | 7422 ASSERT(!answer->IsOneByteRepresentation()); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7467 // Find total length of join result. | 7481 // Find total length of join result. |
7468 int string_length = 0; | 7482 int string_length = 0; |
7469 bool is_ascii = separator->IsOneByteRepresentation(); | 7483 bool is_ascii = separator->IsOneByteRepresentation(); |
7470 bool overflow = false; | 7484 bool overflow = false; |
7471 CONVERT_NUMBER_CHECKED(int, elements_length, Int32, elements_array->length()); | 7485 CONVERT_NUMBER_CHECKED(int, elements_length, Int32, elements_array->length()); |
7472 RUNTIME_ASSERT(elements_length <= elements_array->elements()->length()); | 7486 RUNTIME_ASSERT(elements_length <= elements_array->elements()->length()); |
7473 RUNTIME_ASSERT((elements_length & 1) == 0); // Even length. | 7487 RUNTIME_ASSERT((elements_length & 1) == 0); // Even length. |
7474 FixedArray* elements = FixedArray::cast(elements_array->elements()); | 7488 FixedArray* elements = FixedArray::cast(elements_array->elements()); |
7475 for (int i = 0; i < elements_length; i += 2) { | 7489 for (int i = 0; i < elements_length; i += 2) { |
7476 RUNTIME_ASSERT(elements->get(i)->IsNumber()); | 7490 RUNTIME_ASSERT(elements->get(i)->IsNumber()); |
7491 CONVERT_NUMBER_CHECKED(uint32_t, position, Uint32, elements->get(i)); | |
7492 RUNTIME_ASSERT(position < array_length); | |
7477 RUNTIME_ASSERT(elements->get(i + 1)->IsString()); | 7493 RUNTIME_ASSERT(elements->get(i + 1)->IsString()); |
7478 } | 7494 } |
7479 | 7495 |
7480 { DisallowHeapAllocation no_gc; | 7496 { DisallowHeapAllocation no_gc; |
7481 for (int i = 0; i < elements_length; i += 2) { | 7497 for (int i = 0; i < elements_length; i += 2) { |
7482 String* string = String::cast(elements->get(i + 1)); | 7498 String* string = String::cast(elements->get(i + 1)); |
7483 int length = string->length(); | 7499 int length = string->length(); |
7484 if (is_ascii && !string->IsOneByteRepresentation()) { | 7500 if (is_ascii && !string->IsOneByteRepresentation()) { |
7485 is_ascii = false; | 7501 is_ascii = false; |
7486 } | 7502 } |
(...skipping 2258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9745 return isolate->heap()->null_value(); | 9761 return isolate->heap()->null_value(); |
9746 } | 9762 } |
9747 } | 9763 } |
9748 | 9764 |
9749 | 9765 |
9750 RUNTIME_FUNCTION(Runtime_DateLocalTimezone) { | 9766 RUNTIME_FUNCTION(Runtime_DateLocalTimezone) { |
9751 HandleScope scope(isolate); | 9767 HandleScope scope(isolate); |
9752 ASSERT(args.length() == 1); | 9768 ASSERT(args.length() == 1); |
9753 | 9769 |
9754 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 9770 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
9771 RUNTIME_ASSERT(x >= -DateCache::kMaxTimeBeforeUTCInMs && | |
9772 x <= DateCache::kMaxTimeBeforeUTCInMs); | |
9755 const char* zone = | 9773 const char* zone = |
9756 isolate->date_cache()->LocalTimezone(static_cast<int64_t>(x)); | 9774 isolate->date_cache()->LocalTimezone(static_cast<int64_t>(x)); |
9757 Handle<String> result = isolate->factory()->NewStringFromUtf8( | 9775 Handle<String> result = isolate->factory()->NewStringFromUtf8( |
9758 CStrVector(zone)).ToHandleChecked(); | 9776 CStrVector(zone)).ToHandleChecked(); |
9759 return *result; | 9777 return *result; |
9760 } | 9778 } |
9761 | 9779 |
9762 | 9780 |
9763 RUNTIME_FUNCTION(Runtime_DateToUTC) { | 9781 RUNTIME_FUNCTION(Runtime_DateToUTC) { |
9764 HandleScope scope(isolate); | 9782 HandleScope scope(isolate); |
9765 ASSERT(args.length() == 1); | 9783 ASSERT(args.length() == 1); |
9766 | 9784 |
9767 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 9785 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
9786 RUNTIME_ASSERT(x >= -DateCache::kMaxTimeBeforeUTCInMs && | |
9787 x <= DateCache::kMaxTimeBeforeUTCInMs); | |
9768 int64_t time = isolate->date_cache()->ToUTC(static_cast<int64_t>(x)); | 9788 int64_t time = isolate->date_cache()->ToUTC(static_cast<int64_t>(x)); |
9769 | 9789 |
9770 return *isolate->factory()->NewNumber(static_cast<double>(time)); | 9790 return *isolate->factory()->NewNumber(static_cast<double>(time)); |
9771 } | 9791 } |
9772 | 9792 |
9773 | 9793 |
9774 RUNTIME_FUNCTION(Runtime_DateCacheVersion) { | 9794 RUNTIME_FUNCTION(Runtime_DateCacheVersion) { |
9775 HandleScope hs(isolate); | 9795 HandleScope hs(isolate); |
9776 ASSERT(args.length() == 0); | 9796 ASSERT(args.length() == 0); |
9777 if (!isolate->eternal_handles()->Exists(EternalHandles::DATE_CACHE_VERSION)) { | 9797 if (!isolate->eternal_handles()->Exists(EternalHandles::DATE_CACHE_VERSION)) { |
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10349 } | 10369 } |
10350 } | 10370 } |
10351 break; | 10371 break; |
10352 } | 10372 } |
10353 case FAST_HOLEY_DOUBLE_ELEMENTS: | 10373 case FAST_HOLEY_DOUBLE_ELEMENTS: |
10354 case FAST_DOUBLE_ELEMENTS: { | 10374 case FAST_DOUBLE_ELEMENTS: { |
10355 // Empty array is FixedArray but not FixedDoubleArray. | 10375 // Empty array is FixedArray but not FixedDoubleArray. |
10356 if (length == 0) break; | 10376 if (length == 0) break; |
10357 // Run through the elements FixedArray and use HasElement and GetElement | 10377 // Run through the elements FixedArray and use HasElement and GetElement |
10358 // to check the prototype for missing elements. | 10378 // to check the prototype for missing elements. |
10379 if (receiver->elements()->IsFixedArray()) { | |
10380 ASSERT(receiver->elements()->length() == 0); | |
10381 break; | |
10382 } | |
10359 Handle<FixedDoubleArray> elements( | 10383 Handle<FixedDoubleArray> elements( |
10360 FixedDoubleArray::cast(receiver->elements())); | 10384 FixedDoubleArray::cast(receiver->elements())); |
10361 int fast_length = static_cast<int>(length); | 10385 int fast_length = static_cast<int>(length); |
10362 ASSERT(fast_length <= elements->length()); | 10386 ASSERT(fast_length <= elements->length()); |
10363 for (int j = 0; j < fast_length; j++) { | 10387 for (int j = 0; j < fast_length; j++) { |
10364 HandleScope loop_scope(isolate); | 10388 HandleScope loop_scope(isolate); |
10365 if (!elements->is_the_hole(j)) { | 10389 if (!elements->is_the_hole(j)) { |
10366 double double_value = elements->get_scalar(j); | 10390 double double_value = elements->get_scalar(j); |
10367 Handle<Object> element_value = | 10391 Handle<Object> element_value = |
10368 isolate->factory()->NewNumber(double_value); | 10392 isolate->factory()->NewNumber(double_value); |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10699 | 10723 |
10700 JSObject::ValidateElements(to); | 10724 JSObject::ValidateElements(to); |
10701 return *to; | 10725 return *to; |
10702 } | 10726 } |
10703 | 10727 |
10704 | 10728 |
10705 // How many elements does this object/array have? | 10729 // How many elements does this object/array have? |
10706 RUNTIME_FUNCTION(Runtime_EstimateNumberOfElements) { | 10730 RUNTIME_FUNCTION(Runtime_EstimateNumberOfElements) { |
10707 SealHandleScope shs(isolate); | 10731 SealHandleScope shs(isolate); |
10708 ASSERT(args.length() == 1); | 10732 ASSERT(args.length() == 1); |
10709 CONVERT_ARG_CHECKED(JSObject, object, 0); | 10733 CONVERT_ARG_CHECKED(JSArray, object, 0); |
10710 HeapObject* elements = object->elements(); | 10734 HeapObject* elements = object->elements(); |
10711 if (elements->IsDictionary()) { | 10735 if (elements->IsDictionary()) { |
10712 int result = SeededNumberDictionary::cast(elements)->NumberOfElements(); | 10736 int result = SeededNumberDictionary::cast(elements)->NumberOfElements(); |
10713 return Smi::FromInt(result); | 10737 return Smi::FromInt(result); |
10714 } else if (object->IsJSArray()) { | |
10715 return JSArray::cast(object)->length(); | |
10716 } else { | 10738 } else { |
10717 return Smi::FromInt(FixedArray::cast(elements)->length()); | 10739 return object->length(); |
10718 } | 10740 } |
10719 } | 10741 } |
10720 | 10742 |
10721 | 10743 |
10722 // Returns an array that tells you where in the [0, length) interval an array | 10744 // Returns an array that tells you where in the [0, length) interval an array |
10723 // might have elements. Can either return an array of keys (positive integers | 10745 // might have elements. Can either return an array of keys (positive integers |
10724 // or undefined) or a number representing the positive length of an interval | 10746 // or undefined) or a number representing the positive length of an interval |
10725 // starting at index 0. | 10747 // starting at index 0. |
10726 // Intervals can span over some keys that are not in the object. | 10748 // Intervals can span over some keys that are not in the object. |
10727 RUNTIME_FUNCTION(Runtime_GetArrayKeys) { | 10749 RUNTIME_FUNCTION(Runtime_GetArrayKeys) { |
(...skipping 20 matching lines...) Expand all Loading... | |
10748 isolate, keys, FixedArray::UnionOfKeys(keys, current_keys)); | 10770 isolate, keys, FixedArray::UnionOfKeys(keys, current_keys)); |
10749 } | 10771 } |
10750 // Erase any keys >= length. | 10772 // Erase any keys >= length. |
10751 // TODO(adamk): Remove this step when the contract of %GetArrayKeys | 10773 // TODO(adamk): Remove this step when the contract of %GetArrayKeys |
10752 // is changed to let this happen on the JS side. | 10774 // is changed to let this happen on the JS side. |
10753 for (int i = 0; i < keys->length(); i++) { | 10775 for (int i = 0; i < keys->length(); i++) { |
10754 if (NumberToUint32(keys->get(i)) >= length) keys->set_undefined(i); | 10776 if (NumberToUint32(keys->get(i)) >= length) keys->set_undefined(i); |
10755 } | 10777 } |
10756 return *isolate->factory()->NewJSArrayWithElements(keys); | 10778 return *isolate->factory()->NewJSArrayWithElements(keys); |
10757 } else { | 10779 } else { |
10758 ASSERT(array->HasFastSmiOrObjectElements() || | 10780 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements() || |
10759 array->HasFastDoubleElements()); | 10781 array->HasFastDoubleElements()); |
10760 uint32_t actual_length = static_cast<uint32_t>(array->elements()->length()); | 10782 uint32_t actual_length = static_cast<uint32_t>(array->elements()->length()); |
10761 return *isolate->factory()->NewNumberFromUint(Min(actual_length, length)); | 10783 return *isolate->factory()->NewNumberFromUint(Min(actual_length, length)); |
10762 } | 10784 } |
10763 } | 10785 } |
10764 | 10786 |
10765 | 10787 |
10766 RUNTIME_FUNCTION(Runtime_LookupAccessor) { | 10788 RUNTIME_FUNCTION(Runtime_LookupAccessor) { |
10767 HandleScope scope(isolate); | 10789 HandleScope scope(isolate); |
10768 ASSERT(args.length() == 3); | 10790 ASSERT(args.length() == 3); |
10769 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); | 10791 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10852 if (!obj.ToHandle(&value)) { | 10874 if (!obj.ToHandle(&value)) { |
10853 value = handle(isolate->pending_exception(), isolate); | 10875 value = handle(isolate->pending_exception(), isolate); |
10854 isolate->clear_pending_exception(); | 10876 isolate->clear_pending_exception(); |
10855 if (has_caught != NULL) *has_caught = true; | 10877 if (has_caught != NULL) *has_caught = true; |
10856 return value; | 10878 return value; |
10857 } | 10879 } |
10858 } | 10880 } |
10859 break; | 10881 break; |
10860 } | 10882 } |
10861 case INTERCEPTOR: | 10883 case INTERCEPTOR: |
10884 case HANDLER: | |
10862 break; | 10885 break; |
10863 case HANDLER: | |
10864 case NONEXISTENT: | 10886 case NONEXISTENT: |
10865 UNREACHABLE(); | 10887 UNREACHABLE(); |
10866 break; | 10888 break; |
10867 } | 10889 } |
10868 ASSERT(!value->IsTheHole() || result->IsReadOnly()); | 10890 ASSERT(!value->IsTheHole() || result->IsReadOnly()); |
10869 return value->IsTheHole() | 10891 return value->IsTheHole() |
10870 ? Handle<Object>::cast(isolate->factory()->undefined_value()) : value; | 10892 ? Handle<Object>::cast(isolate->factory()->undefined_value()) : value; |
10871 } | 10893 } |
10872 | 10894 |
10873 | 10895 |
(...skipping 1816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12690 | 12712 |
12691 // Set a break point in a function. | 12713 // Set a break point in a function. |
12692 // args[0]: function | 12714 // args[0]: function |
12693 // args[1]: number: break source position (within the function source) | 12715 // args[1]: number: break source position (within the function source) |
12694 // args[2]: number: break point object | 12716 // args[2]: number: break point object |
12695 RUNTIME_FUNCTION(Runtime_SetFunctionBreakPoint) { | 12717 RUNTIME_FUNCTION(Runtime_SetFunctionBreakPoint) { |
12696 HandleScope scope(isolate); | 12718 HandleScope scope(isolate); |
12697 ASSERT(args.length() == 3); | 12719 ASSERT(args.length() == 3); |
12698 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 12720 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
12699 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 12721 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); |
12700 RUNTIME_ASSERT(source_position >= 0); | 12722 RUNTIME_ASSERT(source_position >= function->shared()->start_position() && |
12723 source_position <= function->shared()->end_position()); | |
12701 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 2); | 12724 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 2); |
12702 | 12725 |
12703 // Set break point. | 12726 // Set break point. |
12704 isolate->debug()->SetBreakPoint(function, break_point_object_arg, | 12727 RUNTIME_ASSERT(isolate->debug()->SetBreakPoint( |
12705 &source_position); | 12728 function, break_point_object_arg, &source_position)); |
12706 | 12729 |
12707 return Smi::FromInt(source_position); | 12730 return Smi::FromInt(source_position); |
12708 } | 12731 } |
12709 | 12732 |
12710 | 12733 |
12711 // Changes the state of a break point in a script and returns source position | 12734 // Changes the state of a break point in a script and returns source position |
12712 // where break point was set. NOTE: Regarding performance see the NOTE for | 12735 // where break point was set. NOTE: Regarding performance see the NOTE for |
12713 // GetScriptFromScriptData. | 12736 // GetScriptFromScriptData. |
12714 // args[0]: script to set break point in | 12737 // args[0]: script to set break point in |
12715 // args[1]: number: break source position (within the script source) | 12738 // args[1]: number: break source position (within the script source) |
(...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13497 CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); | 13520 CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); |
13498 CONVERT_ARG_HANDLE_CHECKED(Object, script_object, 1); | 13521 CONVERT_ARG_HANDLE_CHECKED(Object, script_object, 1); |
13499 | 13522 |
13500 if (function_object->IsJSValue()) { | 13523 if (function_object->IsJSValue()) { |
13501 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object); | 13524 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object); |
13502 if (script_object->IsJSValue()) { | 13525 if (script_object->IsJSValue()) { |
13503 RUNTIME_ASSERT(JSValue::cast(*script_object)->value()->IsScript()); | 13526 RUNTIME_ASSERT(JSValue::cast(*script_object)->value()->IsScript()); |
13504 Script* script = Script::cast(JSValue::cast(*script_object)->value()); | 13527 Script* script = Script::cast(JSValue::cast(*script_object)->value()); |
13505 script_object = Handle<Object>(script, isolate); | 13528 script_object = Handle<Object>(script, isolate); |
13506 } | 13529 } |
13507 | 13530 RUNTIME_ASSERT(function_wrapper->value()->IsSharedFunctionInfo()); |
13508 LiveEdit::SetFunctionScript(function_wrapper, script_object); | 13531 LiveEdit::SetFunctionScript(function_wrapper, script_object); |
13509 } else { | 13532 } else { |
13510 // Just ignore this. We may not have a SharedFunctionInfo for some functions | 13533 // Just ignore this. We may not have a SharedFunctionInfo for some functions |
13511 // and we check it in this function. | 13534 // and we check it in this function. |
13512 } | 13535 } |
13513 | 13536 |
13514 return isolate->heap()->undefined_value(); | 13537 return isolate->heap()->undefined_value(); |
13515 } | 13538 } |
13516 | 13539 |
13517 | 13540 |
(...skipping 1722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15240 } | 15263 } |
15241 return NULL; | 15264 return NULL; |
15242 } | 15265 } |
15243 | 15266 |
15244 | 15267 |
15245 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { | 15268 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { |
15246 return &(kIntrinsicFunctions[static_cast<int>(id)]); | 15269 return &(kIntrinsicFunctions[static_cast<int>(id)]); |
15247 } | 15270 } |
15248 | 15271 |
15249 } } // namespace v8::internal | 15272 } } // namespace v8::internal |
OLD | NEW |