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

Side by Side Diff: src/builtins/builtins-regexp.cc

Issue 2556773002: [regexp] Shrink results array in @@match and @@split (Closed)
Patch Set: Address comments Created 4 years 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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-utils.h" 5 #include "src/builtins/builtins-utils.h"
6 #include "src/builtins/builtins.h" 6 #include "src/builtins/builtins.h"
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/code-stub-assembler.h" 8 #include "src/code-stub-assembler.h"
9 #include "src/regexp/jsregexp.h" 9 #include "src/regexp/jsregexp.h"
10 #include "src/regexp/regexp-utils.h" 10 #include "src/regexp/regexp-utils.h"
(...skipping 1368 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 1379
1380 Node* const length = var_length_.value(); 1380 Node* const length = var_length_.value();
1381 Node* const capacity = var_capacity_.value(); 1381 Node* const capacity = var_capacity_.value();
1382 1382
1383 Label grow(a), store(a); 1383 Label grow(a), store(a);
1384 a->Branch(a->IntPtrEqual(capacity, length), &grow, &store); 1384 a->Branch(a->IntPtrEqual(capacity, length), &grow, &store);
1385 1385
1386 a->Bind(&grow); 1386 a->Bind(&grow);
1387 { 1387 {
1388 Node* const new_capacity = NewCapacity(a, capacity); 1388 Node* const new_capacity = NewCapacity(a, capacity);
1389 Node* const new_array = GrowFixedArray(capacity, new_capacity, mode); 1389 Node* const new_array = ResizeFixedArray(length, new_capacity, mode);
1390 1390
1391 var_capacity_.Bind(new_capacity); 1391 var_capacity_.Bind(new_capacity);
1392 var_array_.Bind(new_array); 1392 var_array_.Bind(new_array);
1393 a->Goto(&store); 1393 a->Goto(&store);
1394 } 1394 }
1395 1395
1396 a->Bind(&store); 1396 a->Bind(&store);
1397 { 1397 {
1398 Node* const array = var_array_.value(); 1398 Node* const array = var_array_.value();
1399 a->StoreFixedArrayElement(array, length, value, barrier_mode, 0, mode); 1399 a->StoreFixedArrayElement(array, length, value, barrier_mode, 0, mode);
1400 1400
1401 Node* const new_length = a->IntPtrAdd(length, a->IntPtrConstant(1)); 1401 Node* const new_length = a->IntPtrAdd(length, a->IntPtrConstant(1));
1402 var_length_.Bind(new_length); 1402 var_length_.Bind(new_length);
1403 } 1403 }
1404 } 1404 }
1405 1405
1406 Node* ToJSArray(Node* const context) { 1406 Node* ToJSArray(Node* const context) {
1407 CodeStubAssembler* a = assembler_; 1407 CodeStubAssembler* a = assembler_;
1408 1408
1409 const ElementsKind kind = FAST_ELEMENTS; 1409 const ElementsKind kind = FAST_ELEMENTS;
1410 const ParameterMode mode = CodeStubAssembler::INTPTR_PARAMETERS;
1410 1411
1411 Node* const native_context = a->LoadNativeContext(context); 1412 Node* const native_context = a->LoadNativeContext(context);
1412 Node* const array_map = a->LoadJSArrayElementsMap(kind, native_context); 1413 Node* const array_map = a->LoadJSArrayElementsMap(kind, native_context);
1413 1414
1415 // Shrink to fit if necessary.
1416 {
1417 Label next(a);
1418
1419 Node* const length = var_length_.value();
1420 Node* const capacity = var_capacity_.value();
1421
1422 a->GotoIf(a->WordEqual(length, capacity), &next);
1423
1424 Node* const array = ResizeFixedArray(length, length, mode);
1425 var_array_.Bind(array);
1426 var_capacity_.Bind(length);
1427 a->Goto(&next);
1428
1429 a->Bind(&next);
1430 }
1431
1414 Node* const result_length = a->SmiTag(length()); 1432 Node* const result_length = a->SmiTag(length());
1415 Node* const result = a->AllocateUninitializedJSArrayWithoutElements( 1433 Node* const result = a->AllocateUninitializedJSArrayWithoutElements(
1416 kind, array_map, result_length, nullptr); 1434 kind, array_map, result_length, nullptr);
1417 1435
1418 // Note: We do not currently shrink the fixed array. 1436 // Note: We do not currently shrink the fixed array.
1419 1437
1420 a->StoreObjectField(result, JSObject::kElementsOffset, var_array_.value()); 1438 a->StoreObjectField(result, JSObject::kElementsOffset, var_array_.value());
1421 1439
1422 return result; 1440 return result;
1423 } 1441 }
(...skipping 23 matching lines...) Expand all
1447 // Growth rate is analog to JSObject::NewElementsCapacity: 1465 // Growth rate is analog to JSObject::NewElementsCapacity:
1448 // new_capacity = (current_capacity + (current_capacity >> 1)) + 16. 1466 // new_capacity = (current_capacity + (current_capacity >> 1)) + 16.
1449 1467
1450 Node* const new_capacity = a->IntPtrAdd( 1468 Node* const new_capacity = a->IntPtrAdd(
1451 a->IntPtrAdd(current_capacity, a->WordShr(current_capacity, 1)), 1469 a->IntPtrAdd(current_capacity, a->WordShr(current_capacity, 1)),
1452 a->IntPtrConstant(16)); 1470 a->IntPtrConstant(16));
1453 1471
1454 return new_capacity; 1472 return new_capacity;
1455 } 1473 }
1456 1474
1457 Node* GrowFixedArray(Node* const current_capacity, Node* const new_capacity, 1475 // Creates a new array with {new_capacity} and copies the first
1458 ParameterMode mode) { 1476 // {element_count} elements from the current array.
1477 Node* ResizeFixedArray(Node* const element_count, Node* const new_capacity,
1478 ParameterMode mode) {
1459 DCHECK(mode == CodeStubAssembler::INTPTR_PARAMETERS); 1479 DCHECK(mode == CodeStubAssembler::INTPTR_PARAMETERS);
1460 1480
1461 CodeStubAssembler* a = assembler_; 1481 CodeStubAssembler* a = assembler_;
1462 1482
1463 CSA_ASSERT(a, a->IntPtrGreaterThan(current_capacity, a->IntPtrConstant(0))); 1483 CSA_ASSERT(a, a->IntPtrGreaterThan(element_count, a->IntPtrConstant(0)));
1464 CSA_ASSERT(a, a->IntPtrGreaterThan(new_capacity, current_capacity)); 1484 CSA_ASSERT(a, a->IntPtrGreaterThan(new_capacity, a->IntPtrConstant(0)));
1485 CSA_ASSERT(a, a->IntPtrGreaterThanOrEqual(new_capacity, element_count));
1465 1486
1466 const ElementsKind kind = FAST_ELEMENTS; 1487 const ElementsKind kind = FAST_ELEMENTS;
1467 const WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER; 1488 const WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER;
1468 const CodeStubAssembler::AllocationFlags flags = 1489 const CodeStubAssembler::AllocationFlags flags =
1469 CodeStubAssembler::kAllowLargeObjectAllocation; 1490 CodeStubAssembler::kAllowLargeObjectAllocation;
1470 1491
1471 Node* const from_array = var_array_.value(); 1492 Node* const from_array = var_array_.value();
1472 Node* const to_array = 1493 Node* const to_array =
1473 a->AllocateFixedArray(kind, new_capacity, mode, flags); 1494 a->AllocateFixedArray(kind, new_capacity, mode, flags);
1474 a->CopyFixedArrayElements(kind, from_array, kind, to_array, 1495 a->CopyFixedArrayElements(kind, from_array, kind, to_array, element_count,
1475 current_capacity, new_capacity, barrier_mode, 1496 new_capacity, barrier_mode, mode);
1476 mode);
1477 1497
1478 return to_array; 1498 return to_array;
1479 } 1499 }
1480 1500
1481 private: 1501 private:
1482 CodeStubAssembler* const assembler_; 1502 CodeStubAssembler* const assembler_;
1483 Variable var_array_; 1503 Variable var_array_;
1484 Variable var_length_; 1504 Variable var_length_;
1485 Variable var_capacity_; 1505 Variable var_capacity_;
1486 }; 1506 };
(...skipping 1037 matching lines...) Expand 10 before | Expand all | Expand 10 after
2524 Bind(&if_matched); 2544 Bind(&if_matched);
2525 { 2545 {
2526 Node* result = 2546 Node* result =
2527 ConstructNewResultFromMatchInfo(context, match_indices, string); 2547 ConstructNewResultFromMatchInfo(context, match_indices, string);
2528 Return(result); 2548 Return(result);
2529 } 2549 }
2530 } 2550 }
2531 2551
2532 } // namespace internal 2552 } // namespace internal
2533 } // namespace v8 2553 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698