| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/builtins.h" | 5 #include "src/builtins/builtins.h" |
| 6 #include "src/builtins/builtins-utils.h" | 6 #include "src/builtins/builtins-utils.h" |
| 7 | 7 |
| 8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
| 9 #include "src/code-stub-assembler.h" | 9 #include "src/code-stub-assembler.h" |
| 10 #include "src/contexts.h" | 10 #include "src/contexts.h" |
| (...skipping 2030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2041 CSA_ASSERT(this, | 2041 CSA_ASSERT(this, |
| 2042 TaggedIsSmi(LoadObjectField(array, JSArray::kLengthOffset))); | 2042 TaggedIsSmi(LoadObjectField(array, JSArray::kLengthOffset))); |
| 2043 Node* len = LoadAndUntagObjectField(array, JSArray::kLengthOffset); | 2043 Node* len = LoadAndUntagObjectField(array, JSArray::kLengthOffset); |
| 2044 | 2044 |
| 2045 len_var.Bind(len); | 2045 len_var.Bind(len); |
| 2046 Branch(WordEqual(len_var.value(), intptr_zero), &return_not_found, &init_k); | 2046 Branch(WordEqual(len_var.value(), intptr_zero), &return_not_found, &init_k); |
| 2047 } | 2047 } |
| 2048 | 2048 |
| 2049 Bind(&init_k); | 2049 Bind(&init_k); |
| 2050 { | 2050 { |
| 2051 Label done(this), init_k_smi(this), init_k_heap_num(this), | 2051 // For now only deal with undefined and Smis here; we must be really careful |
| 2052 init_k_zero(this), init_k_n(this); | 2052 // with side-effects from the ToInteger conversion as the side-effects might |
| 2053 Node* tagged_n = ToInteger(context, start_from); | 2053 // render our assumptions about the receiver being a fast JSArray and the |
| 2054 | 2054 // length invalid. |
| 2055 Branch(TaggedIsSmi(tagged_n), &init_k_smi, &init_k_heap_num); | 2055 Label done(this), init_k_smi(this), init_k_other(this), init_k_zero(this), |
| 2056 init_k_n(this); |
| 2057 Branch(TaggedIsSmi(start_from), &init_k_smi, &init_k_other); |
| 2056 | 2058 |
| 2057 Bind(&init_k_smi); | 2059 Bind(&init_k_smi); |
| 2058 { | 2060 { |
| 2059 start_from_var.Bind(SmiUntag(tagged_n)); | 2061 // The fromIndex is a Smi. |
| 2062 start_from_var.Bind(SmiUntag(start_from)); |
| 2060 Goto(&init_k_n); | 2063 Goto(&init_k_n); |
| 2061 } | 2064 } |
| 2062 | 2065 |
| 2063 Bind(&init_k_heap_num); | 2066 Bind(&init_k_other); |
| 2064 { | 2067 { |
| 2065 Label do_return_not_found(this); | 2068 // The fromIndex must be undefined then, otherwise bailout and let the |
| 2066 // This round is lossless for all valid lengths. | 2069 // runtime deal with the full ToInteger conversion. |
| 2067 Node* fp_len = RoundIntPtrToFloat64(len_var.value()); | 2070 GotoIfNot(IsUndefined(start_from), &call_runtime); |
| 2068 Node* fp_n = LoadHeapNumberValue(tagged_n); | 2071 start_from_var.Bind(intptr_zero); |
| 2069 GotoIf(Float64GreaterThanOrEqual(fp_n, fp_len), &do_return_not_found); | |
| 2070 start_from_var.Bind(ChangeInt32ToIntPtr(TruncateFloat64ToWord32(fp_n))); | |
| 2071 Goto(&init_k_n); | 2072 Goto(&init_k_n); |
| 2072 | |
| 2073 Bind(&do_return_not_found); | |
| 2074 { | |
| 2075 index_var.Bind(intptr_zero); | |
| 2076 Goto(&return_not_found); | |
| 2077 } | |
| 2078 } | 2073 } |
| 2079 | 2074 |
| 2080 Bind(&init_k_n); | 2075 Bind(&init_k_n); |
| 2081 { | 2076 { |
| 2082 Label if_positive(this), if_negative(this), done(this); | 2077 Label if_positive(this), if_negative(this), done(this); |
| 2083 Branch(IntPtrLessThan(start_from_var.value(), intptr_zero), &if_negative, | 2078 Branch(IntPtrLessThan(start_from_var.value(), intptr_zero), &if_negative, |
| 2084 &if_positive); | 2079 &if_positive); |
| 2085 | 2080 |
| 2086 Bind(&if_positive); | 2081 Bind(&if_positive); |
| 2087 { | 2082 { |
| (...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2748 { | 2743 { |
| 2749 Node* message = SmiConstant(MessageTemplate::kDetachedOperation); | 2744 Node* message = SmiConstant(MessageTemplate::kDetachedOperation); |
| 2750 CallRuntime(Runtime::kThrowTypeError, context, message, | 2745 CallRuntime(Runtime::kThrowTypeError, context, message, |
| 2751 HeapConstant(operation)); | 2746 HeapConstant(operation)); |
| 2752 Unreachable(); | 2747 Unreachable(); |
| 2753 } | 2748 } |
| 2754 } | 2749 } |
| 2755 | 2750 |
| 2756 } // namespace internal | 2751 } // namespace internal |
| 2757 } // namespace v8 | 2752 } // namespace v8 |
| OLD | NEW |