Skip to content

Commit 853cd8a

Browse files
committed
FIX: Optimization of CHANGE/INSERT/APPEND integer! or char!
fixes: Oldes/Rebol-issues#1606
1 parent 47d9043 commit 853cd8a

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/core/f-modify.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,15 @@
131131
// use as it is
132132
}
133133
else if (IS_INTEGER(src_val)) {
134-
src_ser = Append_Byte(0, Int8u(src_val)); // creates a binary
134+
src_ser = BUF_FORM;
135+
SERIES_DATA(src_ser)[0] = Int8u(src_val);
136+
SERIES_TAIL(src_ser) = 1;
135137
}
136138
else if (IS_BLOCK(src_val)) {
137139
src_ser = Join_Binary(src_val); // NOTE: it's the shared FORM buffer!
138140
}
139141
else if (IS_CHAR(src_val)) {
140-
src_ser = Make_Binary(6); // (I hate unicode)
142+
src_ser = BUF_FORM;
141143
src_ser->tail = Encode_UTF8_Char(BIN_HEAD(src_ser), VAL_CHAR(src_val));
142144
}
143145
else if (ANY_STR(src_val)) {
@@ -155,7 +157,9 @@
155157
else Trap_Arg(src_val);
156158
}
157159
else if (IS_CHAR(src_val)) {
158-
src_ser = Append_Byte(0, VAL_CHAR(src_val)); // unicode ok too
160+
src_ser = BUF_FORM;
161+
RESET_TAIL(src_ser);
162+
src_ser = Append_Byte(src_ser, VAL_CHAR(src_val)); // unicode ok too
159163
}
160164
else if (IS_BLOCK(src_val)) {
161165
src_ser = Form_Tight_Block(src_val);

src/tests/units/evaluation-test.r3

+22
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,28 @@ Rebol [
479479
--assert 0 = p/made-blocks
480480
--assert 0 = p/made-objects
481481

482+
;@@ https://github.com/Oldes/Rebol-issues/issues/1606
483+
--test-- "dp [change binary! integer!]"
484+
b: #{000000}
485+
--assert 0 = select dp [change b 255] 'series-made
486+
--assert b = #{FF0000}
487+
--assert 0 = select dp [change/dup b 255 3] 'series-made
488+
--assert b = #{FFFFFF}
489+
--test-- "dp [change binary! char!]"
490+
b: #{000000}
491+
--assert 0 = select dp [change b #"a"] 'series-made
492+
--assert b = #{610000}
493+
--assert 0 = select dp [change/dup b #"a" 3] 'series-made
494+
--assert b = #{616161}
495+
--assert 0 = select dp [change/dup b #"á" 3] 'series-made
496+
--assert b = #{C3A1C3A1C3A1}
497+
--test-- "dp [change string! char!]"
498+
b: "xxx"
499+
--assert 0 = select dp [change b #"a"] 'series-made
500+
--assert b = "axx"
501+
--assert 0 = select dp [change/dup b #"a" 3] 'series-made
502+
--assert b = "aaa"
503+
482504
===end-group===
483505

484506
~~~end-file~~~

0 commit comments

Comments
 (0)