Skip to content
This repository was archived by the owner on Dec 1, 2024. It is now read-only.

Commit 9b08726

Browse files
committed
Make iterator seek target a local variable
Cherry-picked from Level/leveldown#683
1 parent 99918c5 commit 9b08726

1 file changed

Lines changed: 14 additions & 28 deletions

File tree

binding.cc

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,6 @@ struct Iterator {
543543
highWaterMark_(highWaterMark),
544544
dbIterator_(NULL),
545545
count_(0),
546-
target_(NULL),
547546
seeking_(false),
548547
landed_(false),
549548
nexting_(false),
@@ -558,7 +557,6 @@ struct Iterator {
558557

559558
~Iterator () {
560559
assert(ended_);
561-
ReleaseTarget();
562560

563561
if (start_ != NULL) delete start_;
564562
if (end_ != NULL) delete end_;
@@ -570,16 +568,6 @@ struct Iterator {
570568
delete options_;
571569
}
572570

573-
void ReleaseTarget () {
574-
if (target_ != NULL) {
575-
if (!target_->empty()) {
576-
delete [] target_->data();
577-
}
578-
delete target_;
579-
target_ = NULL;
580-
}
581-
}
582-
583571
void Attach (napi_ref ref) {
584572
ref_ = ref;
585573
database_->AttachIterator(id_, this);
@@ -684,21 +672,21 @@ struct Iterator {
684672
return false;
685673
}
686674

687-
bool OutOfRange (leveldb::Slice* target) {
688-
if ((lt_ != NULL && target->compare(*lt_) >= 0) ||
689-
(lte_ != NULL && target->compare(*lte_) > 0) ||
690-
(start_ != NULL && reverse_ && target->compare(*start_) > 0)) {
675+
bool OutOfRange (leveldb::Slice& target) {
676+
if ((lt_ != NULL && target.compare(*lt_) >= 0) ||
677+
(lte_ != NULL && target.compare(*lte_) > 0) ||
678+
(start_ != NULL && reverse_ && target.compare(*start_) > 0)) {
691679
return true;
692680
}
693681

694682
if (end_ != NULL) {
695-
int d = target->compare(*end_);
683+
int d = target.compare(*end_);
696684
if (reverse_ ? d < 0 : d > 0) return true;
697685
}
698686

699-
return ((gt_ != NULL && target->compare(*gt_) <= 0) ||
700-
(gte_ != NULL && target->compare(*gte_) < 0) ||
701-
(start_ != NULL && !reverse_ && target->compare(*start_) < 0));
687+
return ((gt_ != NULL && target.compare(*gt_) <= 0) ||
688+
(gte_ != NULL && target.compare(*gte_) < 0) ||
689+
(start_ != NULL && !reverse_ && target.compare(*start_) < 0));
702690
}
703691

704692
bool IteratorNext (std::vector<std::pair<std::string, std::string> >& result) {
@@ -746,7 +734,6 @@ struct Iterator {
746734
uint32_t highWaterMark_;
747735
leveldb::Iterator* dbIterator_;
748736
int count_;
749-
leveldb::Slice* target_;
750737
bool seeking_;
751738
bool landed_;
752739
bool nexting_;
@@ -1364,17 +1351,16 @@ NAPI_METHOD(iterator_seek) {
13641351
napi_throw_error(env, NULL, "iterator has ended");
13651352
}
13661353

1367-
iterator->ReleaseTarget();
1368-
iterator->target_ = new leveldb::Slice(ToSlice(env, argv[1]));
1354+
leveldb::Slice target = ToSlice(env, argv[1]);
13691355
iterator->GetIterator();
13701356

13711357
leveldb::Iterator* dbIterator = iterator->dbIterator_;
1372-
dbIterator->Seek(*iterator->target_);
1358+
dbIterator->Seek(target);
13731359

13741360
iterator->seeking_ = true;
13751361
iterator->landed_ = false;
13761362

1377-
if (iterator->OutOfRange(iterator->target_)) {
1363+
if (iterator->OutOfRange(target)) {
13781364
if (iterator->reverse_) {
13791365
dbIterator->SeekToFirst();
13801366
dbIterator->Prev();
@@ -1384,7 +1370,7 @@ NAPI_METHOD(iterator_seek) {
13841370
}
13851371
}
13861372
else if (dbIterator->Valid()) {
1387-
int cmp = dbIterator->key().compare(*iterator->target_);
1373+
int cmp = dbIterator->key().compare(target);
13881374
if (cmp > 0 && iterator->reverse_) {
13891375
dbIterator->Prev();
13901376
} else if (cmp < 0 && !iterator->reverse_) {
@@ -1397,7 +1383,7 @@ NAPI_METHOD(iterator_seek) {
13971383
dbIterator->SeekToFirst();
13981384
}
13991385
if (dbIterator->Valid()) {
1400-
int cmp = dbIterator->key().compare(*iterator->target_);
1386+
int cmp = dbIterator->key().compare(target);
14011387
if (cmp > 0 && iterator->reverse_) {
14021388
dbIterator->SeekToFirst();
14031389
dbIterator->Prev();
@@ -1408,6 +1394,7 @@ NAPI_METHOD(iterator_seek) {
14081394
}
14091395
}
14101396

1397+
DisposeSliceBuffer(target);
14111398
NAPI_RETURN_UNDEFINED();
14121399
}
14131400

@@ -1469,7 +1456,6 @@ NAPI_METHOD(iterator_end) {
14691456
* for this function being a separate function pointer.
14701457
*/
14711458
void CheckEndCallback (Iterator* iterator) {
1472-
iterator->ReleaseTarget();
14731459
iterator->nexting_ = false;
14741460
if (iterator->endWorker_ != NULL) {
14751461
iterator->endWorker_->Queue();

0 commit comments

Comments
 (0)