Skip to content

Commit

Permalink
FIX: Optimization of CHANGE/INSERT/APPEND integer! or char!
Browse files Browse the repository at this point in the history
  • Loading branch information
Oldes committed May 21, 2020
1 parent 47d9043 commit 853cd8a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 3 deletions.
10 changes: 7 additions & 3 deletions src/core/f-modify.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,13 +131,15 @@
// use as it is
}
else if (IS_INTEGER(src_val)) {
src_ser = Append_Byte(0, Int8u(src_val)); // creates a binary
src_ser = BUF_FORM;
SERIES_DATA(src_ser)[0] = Int8u(src_val);
SERIES_TAIL(src_ser) = 1;
}
else if (IS_BLOCK(src_val)) {
src_ser = Join_Binary(src_val); // NOTE: it's the shared FORM buffer!
}
else if (IS_CHAR(src_val)) {
src_ser = Make_Binary(6); // (I hate unicode)
src_ser = BUF_FORM;
src_ser->tail = Encode_UTF8_Char(BIN_HEAD(src_ser), VAL_CHAR(src_val));
}
else if (ANY_STR(src_val)) {
Expand All @@ -155,7 +157,9 @@
else Trap_Arg(src_val);
}
else if (IS_CHAR(src_val)) {
src_ser = Append_Byte(0, VAL_CHAR(src_val)); // unicode ok too
src_ser = BUF_FORM;
RESET_TAIL(src_ser);
src_ser = Append_Byte(src_ser, VAL_CHAR(src_val)); // unicode ok too
}
else if (IS_BLOCK(src_val)) {
src_ser = Form_Tight_Block(src_val);
Expand Down
22 changes: 22 additions & 0 deletions src/tests/units/evaluation-test.r3
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,28 @@ Rebol [
--assert 0 = p/made-blocks
--assert 0 = p/made-objects

;@@ https://github.com/Oldes/Rebol-issues/issues/1606
--test-- "dp [change binary! integer!]"
b: #{000000}
--assert 0 = select dp [change b 255] 'series-made
--assert b = #{FF0000}
--assert 0 = select dp [change/dup b 255 3] 'series-made
--assert b = #{FFFFFF}
--test-- "dp [change binary! char!]"
b: #{000000}
--assert 0 = select dp [change b #"a"] 'series-made
--assert b = #{610000}
--assert 0 = select dp [change/dup b #"a" 3] 'series-made
--assert b = #{616161}
--assert 0 = select dp [change/dup b #"á" 3] 'series-made
--assert b = #{C3A1C3A1C3A1}
--test-- "dp [change string! char!]"
b: "xxx"
--assert 0 = select dp [change b #"a"] 'series-made
--assert b = "axx"
--assert 0 = select dp [change/dup b #"a" 3] 'series-made
--assert b = "aaa"

===end-group===

~~~end-file~~~

0 comments on commit 853cd8a

Please sign in to comment.