Skip to content

Commit 0b50d9c

Browse files
committed
FIX: better handling odd part values when using append/part on object! and map!
1 parent 1ca9df5 commit 0b50d9c

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

src/core/t-map.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,8 @@
336336
REBCNT n;
337337

338338
val = VAL_BLK_DATA(arg);
339-
for (n = 0; n < len && NOT_END(val) && NOT_END(val+1); val += 2, n += 2) {
339+
len >>= 1; // part must be number of key/value pairs
340+
for (n = 0; n < len && NOT_END(val) && NOT_END(val+1); val += 2, n++) {
340341
Find_Entry(ser, val, val+1, TRUE);
341342
}
342343
}

src/core/t-object.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,10 @@ static void Append_Obj(REBSER *obj, REBVAL *arg, REBCNT part)
101101
// Setup binding table with obj words:
102102
Collect_Object(obj);
103103

104+
part >>= 1; // part must be number of key/value pairs
105+
104106
// Examine word/value argument block
105-
for (word = arg, n = 0; ++n < part && NOT_END(word); word += 2, n++) {
107+
for (word = arg, n = 0; n < part && NOT_END(word); word += 2, n++) {
106108

107109
if (!IS_WORD(word) && !IS_SET_WORD(word)) {
108110
// release binding table
@@ -138,7 +140,7 @@ static void Append_Obj(REBSER *obj, REBVAL *arg, REBCNT part)
138140
Append_Frame(obj, 0, VAL_WORD_SYM(word));
139141

140142
// Set new values to obj words
141-
for (word = arg, n = 0; ++n < part && NOT_END(word); word += 2, n++) {
143+
for (word = arg, n = 0; n < part && NOT_END(word); word += 2, n++) {
142144

143145
i = binds[VAL_WORD_CANON(word)];
144146
val = FRM_VALUE(obj, i);

src/tests/units/map-test.r3

+10-1
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,18 @@ Rebol [
8484
--assert 2 = length? append/dup m [c 3] 0
8585
--assert 3 = length? append/dup m [c 3] 1
8686
--assert 4 = length? append/dup m [d 4] 2
87-
--assert 5 = length? append/part m [e 5 f 6] 1
87+
--assert 4 = length? append/part m [e 5 f 6] 1 ;no-op!
88+
--assert 5 = length? append/part m [e 5 f 6] 2
8889
--assert [1 2 3 4 5] = values-of m
8990

91+
--test-- "append/part map! with odd part"
92+
--assert [] == body-of append/part make map! [] [a 1 b 2 c 3] 1
93+
--assert [a: 1] == body-of append/part make map! [] [a 1 b 2 c 3] 2
94+
--assert [a: 1] == body-of append/part make map! [] [a 1 b 2 c 3] 3
95+
--assert [] == body-of append/part make map! [] tail [a 1 b 2 c 3] -1
96+
--assert [c: 3] == body-of append/part make map! [] tail [a 1 b 2 c 3] -2
97+
--assert [2 c] == body-of append/part make map! [] tail [a 1 b 2 c 3] -3 ;NOTE that it is not [c: 3] and its ok!
98+
9099
===end-group===
91100

92101

0 commit comments

Comments
 (0)