Skip to content

Commit 7ad8d38

Browse files
authored
Merge pull request #5 from Oldes/r2-pick
FEAT/FIX: Picking the right PICK
2 parents 59f9cc3 + 6202a85 commit 7ad8d38

File tree

3 files changed

+19
-8
lines changed

3 files changed

+19
-8
lines changed

src/core/t-block.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -534,13 +534,15 @@ static struct {
534534
REBINT n = 0;
535535

536536
/* Issues!!!
537-
a/1.3
538537
a/not-found: 10 error or append?
539538
a/not-followed: 10 error or append?
540539
*/
541540

542-
if (IS_INTEGER(pvs->select)) {
543-
n = Int32(pvs->select) + VAL_INDEX(pvs->value) - 1;
541+
if (IS_INTEGER(pvs->select) || IS_DECIMAL(pvs->select)) {
542+
REBINT i = Int32(pvs->select);
543+
if (i == 0) return PE_NONE; // like in case: path/0
544+
if (i < 0) i++;
545+
n = i + VAL_INDEX(pvs->value) - 1;
544546
}
545547
else if (IS_WORD(pvs->select)) {
546548
n = Find_Word(VAL_SERIES(pvs->value), VAL_INDEX(pvs->value), VAL_WORD_CANON(pvs->select));
@@ -573,6 +575,8 @@ static struct {
573575
REBINT n = 0;
574576

575577
n = Get_Num_Arg(selector);
578+
if (n == 0) return 0;
579+
if (n < 0) n++;
576580
n += VAL_INDEX(block) - 1;
577581
if (n < 0 || (REBCNT)n >= VAL_TAIL(block)) return 0;
578582
return VAL_BLK_SKIP(block, n);

src/core/t-string.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,10 @@ static REBSER *make_binary(REBVAL *arg, REBOOL make)
354354
REBSER *ser = VAL_SERIES(data);
355355

356356
if (IS_INTEGER(pvs->select)) {
357-
n = Int32(pvs->select) + VAL_INDEX(data) - 1;
357+
i = Int32(pvs->select);
358+
if (i == 0) return PE_NONE; // like in case: path/0
359+
if (i < 0) i++;
360+
n = i + VAL_INDEX(data) - 1;
358361
}
359362
else return PE_BAD_SELECT;
360363

@@ -542,8 +545,9 @@ static REBSER *make_binary(REBVAL *arg, REBOOL make)
542545
case A_PICK:
543546
case A_POKE:
544547
len = Get_Num_Arg(arg); // Position
545-
//if (len > 0) index--;
546-
if (REB_I32_SUB_OF(len, 1, &len)
548+
if (len < 0) REB_I32_ADD_OF(index, 1, &index);
549+
if (len == 0
550+
|| REB_I32_SUB_OF(len, 1, &len)
547551
|| REB_I32_ADD_OF(index, len, &index)
548552
|| index < 0 || index >= tail) {
549553
if (action == A_PICK) goto is_none;

src/core/t-vector.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -468,10 +468,13 @@ void Set_Vector_Row(REBSER *ser, REBVAL *blk)
468468
REBINT bits;
469469
REBYTE *vp;
470470
REBI64 i;
471-
REBDEC f;
471+
REBDEC f = 0.0;
472472

473-
if (IS_INTEGER(pvs->select) || IS_DECIMAL(pvs->select))
473+
if (IS_INTEGER(pvs->select) || IS_DECIMAL(pvs->select)) {
474474
n = Int32(pvs->select);
475+
if (n == 0) return PE_NONE;
476+
if (n < 0) n++;
477+
}
475478
else return PE_BAD_SELECT;
476479

477480
n += VAL_INDEX(pvs->value);

0 commit comments

Comments
 (0)