OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 "hydrogen.h" | 5 #include "hydrogen.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "v8.h" | 9 #include "v8.h" |
10 #include "allocation-site-scopes.h" | 10 #include "allocation-site-scopes.h" |
(...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1528 } | 1528 } |
1529 | 1529 |
1530 | 1530 |
1531 HValue* HGraphBuilder::BuildRegExpConstructResult(HValue* length, | 1531 HValue* HGraphBuilder::BuildRegExpConstructResult(HValue* length, |
1532 HValue* index, | 1532 HValue* index, |
1533 HValue* input) { | 1533 HValue* input) { |
1534 NoObservableSideEffectsScope scope(this); | 1534 NoObservableSideEffectsScope scope(this); |
1535 | 1535 |
1536 // Compute the size of the RegExpResult followed by FixedArray with length. | 1536 // Compute the size of the RegExpResult followed by FixedArray with length. |
1537 HValue* size = length; | 1537 HValue* size = length; |
| 1538 // Make sure size does not exceed max regular heap object size. |
| 1539 const int kHeaderSize = JSRegExpResult::kSize + FixedArray::kHeaderSize; |
| 1540 const int kMaxLength = |
| 1541 (Page::kMaxRegularHeapObjectSize - kHeaderSize) >> kPointerSizeLog2; |
| 1542 Add<HBoundsCheck>(size, Add<HConstant>(kMaxLength)); |
| 1543 |
1538 size = AddUncasted<HShl>(size, Add<HConstant>(kPointerSizeLog2)); | 1544 size = AddUncasted<HShl>(size, Add<HConstant>(kPointerSizeLog2)); |
1539 size = AddUncasted<HAdd>(size, Add<HConstant>(static_cast<int32_t>( | 1545 size = AddUncasted<HAdd>(size, Add<HConstant>(kHeaderSize)); |
1540 JSRegExpResult::kSize + FixedArray::kHeaderSize))); | |
1541 | |
1542 // Make sure size does not exceeds max regular heap object size. | |
1543 Add<HBoundsCheck>(size, Add<HConstant>(Page::kMaxRegularHeapObjectSize)); | |
1544 | 1546 |
1545 // Allocate the JSRegExpResult and the FixedArray in one step. | 1547 // Allocate the JSRegExpResult and the FixedArray in one step. |
1546 HValue* result = Add<HAllocate>( | 1548 HValue* result = Add<HAllocate>( |
1547 size, HType::JSArray(), NOT_TENURED, JS_ARRAY_TYPE); | 1549 size, HType::JSArray(), NOT_TENURED, JS_ARRAY_TYPE); |
1548 | 1550 |
1549 // Determine the elements FixedArray. | 1551 // Determine the elements FixedArray. |
1550 HValue* elements = Add<HInnerAllocatedObject>( | 1552 HValue* elements = Add<HInnerAllocatedObject>( |
1551 result, Add<HConstant>(JSRegExpResult::kSize)); | 1553 result, Add<HConstant>(JSRegExpResult::kSize)); |
1552 | 1554 |
1553 // Initialize the JSRegExpResult header. | 1555 // Initialize the JSRegExpResult header. |
(...skipping 10248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11802 if (ShouldProduceTraceOutput()) { | 11804 if (ShouldProduceTraceOutput()) { |
11803 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11805 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
11804 } | 11806 } |
11805 | 11807 |
11806 #ifdef DEBUG | 11808 #ifdef DEBUG |
11807 graph_->Verify(false); // No full verify. | 11809 graph_->Verify(false); // No full verify. |
11808 #endif | 11810 #endif |
11809 } | 11811 } |
11810 | 11812 |
11811 } } // namespace v8::internal | 11813 } } // namespace v8::internal |
OLD | NEW |