Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 884 return typed_array->accessor(); \ | 884 return typed_array->accessor(); \ |
| 885 } | 885 } |
| 886 | 886 |
| 887 TYPED_ARRAY_GETTER(Buffer, buffer) | 887 TYPED_ARRAY_GETTER(Buffer, buffer) |
| 888 TYPED_ARRAY_GETTER(ByteLength, byte_length) | 888 TYPED_ARRAY_GETTER(ByteLength, byte_length) |
| 889 TYPED_ARRAY_GETTER(ByteOffset, byte_offset) | 889 TYPED_ARRAY_GETTER(ByteOffset, byte_offset) |
| 890 TYPED_ARRAY_GETTER(Length, length) | 890 TYPED_ARRAY_GETTER(Length, length) |
| 891 | 891 |
| 892 #undef TYPED_ARRAY_GETTER | 892 #undef TYPED_ARRAY_GETTER |
| 893 | 893 |
| 894 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArraySetSpecialCases) { | |
|
rossberg
2013/05/07 13:53:23
Nit: I'd change the name, since it's the normal ca
Dmitry Lomov (no reviews)
2013/05/07 14:20:00
Done.
| |
| 895 HandleScope scope(isolate); | |
| 896 CONVERT_ARG_HANDLE_CHECKED(Object, target_obj, 0); | |
| 897 CONVERT_ARG_HANDLE_CHECKED(Object, source_obj, 1); | |
| 898 CONVERT_ARG_HANDLE_CHECKED(Object, offset_obj, 2); | |
| 899 if (!target_obj->IsJSTypedArray() || !source_obj->IsJSTypedArray()) | |
| 900 return isolate->heap()->false_value(); | |
| 901 | |
| 902 Handle<JSTypedArray> target(JSTypedArray::cast(*target_obj)); | |
| 903 Handle<JSTypedArray> source(JSTypedArray::cast(*source_obj)); | |
| 904 size_t offset = NumberToSize(isolate, *offset_obj); | |
| 905 size_t target_length = NumberToSize(isolate, target->length()); | |
| 906 size_t source_length = NumberToSize(isolate, source->length()); | |
| 907 size_t target_byte_length = NumberToSize(isolate, target->byte_length()); | |
| 908 size_t source_byte_length = NumberToSize(isolate, source->byte_length()); | |
| 909 if (offset > target_length || | |
| 910 offset + source_length > target_length || | |
| 911 offset + source_length < offset) // overflow | |
| 912 return isolate->Throw(*isolate->factory()->NewRangeError( | |
| 913 "typed_array_set_source_too_long", HandleVector<Object>(NULL, 0))); | |
| 914 | |
| 915 Handle<JSArrayBuffer> target_buffer(JSArrayBuffer::cast(target->buffer())); | |
| 916 Handle<JSArrayBuffer> source_buffer(JSArrayBuffer::cast(source->buffer())); | |
| 917 size_t target_offset = NumberToSize(isolate, target->byte_offset()); | |
| 918 size_t source_offset = NumberToSize(isolate, source->byte_offset()); | |
| 919 uint8_t* target_base = | |
| 920 static_cast<uint8_t*>(target_buffer->backing_store()) + target_offset; | |
| 921 uint8_t* source_base = | |
| 922 static_cast<uint8_t*>(source_buffer->backing_store()) + source_offset; | |
| 923 | |
| 924 // Typed arrays of the same type: use memmove. | |
| 925 if (target->type() == source->type()) { | |
| 926 memmove(target_base + offset * target->element_size(), | |
| 927 source_base, source_byte_length); | |
| 928 return isolate->heap()->true_value(); | |
| 929 } | |
| 930 | |
| 931 // Typed arrays of different types over the same backing store | |
| 932 if ((source_base <= target_base && | |
| 933 source_base + source_byte_length > target_base) || | |
|
rossberg
2013/05/07 13:53:23
Style nit: spurious space
Dmitry Lomov (no reviews)
2013/05/07 14:20:00
Done.
| |
| 934 (target_base <= source_base && | |
| 935 target_base + target_byte_length > source_base)) { | |
| 936 size_t target_element_size = target->element_size(); | |
| 937 size_t source_element_size = source->element_size(); | |
| 938 | |
| 939 size_t source_length = NumberToSize(isolate, source->length()); | |
| 940 | |
| 941 // Copy left part | |
| 942 size_t left_index; | |
| 943 { | |
| 944 // First un-mutated byte after the next write | |
| 945 uint8_t* target_ptr = target_base + (offset + 1) * target_element_size; | |
| 946 // Next read at source_ptr. We do not care for memory changing before | |
| 947 // source_ptr - we have already copied it. | |
| 948 uint8_t* source_ptr = source_base; | |
| 949 for (left_index = 0; | |
| 950 left_index < source_length && target_ptr <= source_ptr; | |
| 951 left_index++) { | |
| 952 Handle<Object> v = Object::GetElement( | |
| 953 source, static_cast<uint32_t>(left_index)); | |
| 954 JSObject::SetElement( | |
| 955 target, static_cast<uint32_t>(offset + left_index), v, | |
| 956 NONE, kNonStrictMode); | |
| 957 target_ptr += target_element_size; | |
| 958 source_ptr += source_element_size; | |
| 959 } | |
| 960 } | |
| 961 // Copy right part | |
| 962 size_t right_index; | |
| 963 { | |
| 964 // First unmutated byte before the next write | |
| 965 uint8_t* target_ptr = | |
| 966 target_base + (offset + source_length - 1) * target_element_size; | |
| 967 // Next read before source_ptr. We do not care for memory changing after | |
| 968 // source_ptr - we have already copied it. | |
| 969 uint8_t* source_ptr = | |
| 970 source_base + source_length * source_element_size; | |
| 971 for (right_index = source_length - 1; | |
| 972 right_index >= left_index && target_ptr >= source_ptr; | |
| 973 right_index--) { | |
| 974 Handle<Object> v = Object::GetElement( | |
| 975 source, static_cast<uint32_t>(right_index)); | |
| 976 JSObject::SetElement( | |
| 977 target, static_cast<uint32_t>(offset + right_index), v, | |
| 978 NONE, kNonStrictMode); | |
| 979 target_ptr -= target_element_size; | |
| 980 source_ptr -= source_element_size; | |
| 981 } | |
| 982 } | |
| 983 ASSERT((right_index + 1) - left_index <= 8); | |
|
rossberg
2013/05/07 13:53:23
I'd keep a comment similar to the one I had in d8
Dmitry Lomov (no reviews)
2013/05/07 14:20:00
Done.
| |
| 984 Handle<Object> temp[8]; | |
| 985 size_t idx; | |
| 986 for (idx = left_index; idx <= right_index; idx++) { | |
| 987 temp[idx - left_index] = Object::GetElement( | |
| 988 source, static_cast<uint32_t>(idx)); | |
| 989 } | |
| 990 for (idx = left_index; idx <= right_index; idx++) { | |
| 991 JSObject::SetElement( | |
| 992 target, static_cast<uint32_t>(offset + idx), temp[idx-left_index], | |
| 993 NONE, kNonStrictMode); | |
| 994 } | |
| 995 } else { // Non-overlapping typed arrays | |
|
rossberg
2013/05/07 13:53:23
Perhaps negate the conditional to put the common a
Dmitry Lomov (no reviews)
2013/05/07 14:20:00
Can I please not? :))
On 2013/05/07 13:53:23, ross
| |
| 996 for (size_t idx = 0; idx < source_length; idx++) { | |
| 997 Handle<Object> value = Object::GetElement( | |
| 998 source, static_cast<uint32_t>(idx)); | |
| 999 JSObject::SetElement( | |
| 1000 target, static_cast<uint32_t>(offset + idx), value, | |
| 1001 NONE, kNonStrictMode); | |
| 1002 } | |
| 1003 } | |
| 1004 | |
| 1005 return isolate->heap()->true_value(); | |
| 1006 } | |
| 1007 | |
| 1008 | |
| 894 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetInitialize) { | 1009 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetInitialize) { |
| 895 HandleScope scope(isolate); | 1010 HandleScope scope(isolate); |
| 896 ASSERT(args.length() == 1); | 1011 ASSERT(args.length() == 1); |
| 897 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 1012 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
| 898 Handle<ObjectHashSet> table = isolate->factory()->NewObjectHashSet(0); | 1013 Handle<ObjectHashSet> table = isolate->factory()->NewObjectHashSet(0); |
| 899 holder->set_table(*table); | 1014 holder->set_table(*table); |
| 900 return *holder; | 1015 return *holder; |
| 901 } | 1016 } |
| 902 | 1017 |
| 903 | 1018 |
| (...skipping 12490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13394 // Handle last resort GC and make sure to allow future allocations | 13509 // Handle last resort GC and make sure to allow future allocations |
| 13395 // to grow the heap without causing GCs (if possible). | 13510 // to grow the heap without causing GCs (if possible). |
| 13396 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13511 isolate->counters()->gc_last_resort_from_js()->Increment(); |
| 13397 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13512 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
| 13398 "Runtime::PerformGC"); | 13513 "Runtime::PerformGC"); |
| 13399 } | 13514 } |
| 13400 } | 13515 } |
| 13401 | 13516 |
| 13402 | 13517 |
| 13403 } } // namespace v8::internal | 13518 } } // namespace v8::internal |
| OLD | NEW |