Skip to content

Commit 64dbbcb

Browse files
committed
Optimize character string GENSYM
1 parent e99b924 commit 64dbbcb

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

src/core/primitives.cc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1526,6 +1526,22 @@ CL_DEFUN Symbol_sp core__gensym_quick(SimpleBaseString_sp prefix,
15261526
return Symbol_O::create(name);
15271527
}
15281528

1529+
CL_DEFUN Symbol_sp core__gensym_quick_char(SimpleCharacterString_sp prefix,
1530+
size_t suffix) {
1531+
size_t prefixlen = prefix->length();
1532+
size_t suffixlen = (suffix < 2) ? 1 : std::ceil(std::log10(suffix));
1533+
auto name = SimpleCharacterString_O::make(prefixlen + suffixlen);
1534+
for (size_t i = 0; i < prefixlen; ++i)
1535+
(*name)[i] = (*prefix)[i];
1536+
for (size_t j = prefixlen + suffixlen - 1; j >= prefixlen; --j) {
1537+
auto div = std::div(suffix, 10);
1538+
(*name)[j] = div.rem + '0';
1539+
suffix = div.quot;
1540+
}
1541+
return Symbol_O::create(name);
1542+
1543+
}
1544+
15291545
CL_LAMBDA(&optional (x "G"));
15301546
CL_DECLARE();
15311547
CL_DOCSTRING(R"dx(See CLHS gensym)dx");
@@ -1543,6 +1559,13 @@ CL_DEFUN Symbol_sp cl__gensym(T_sp x) {
15431559
Symbol_sp result = core__gensym_quick(gc::As_unsafe<SimpleBaseString_sp>(x), fcounter);
15441560
cl::_sym_STARgensym_counterSTAR->setf_symbolValue(Integer_O::create(1 + fcounter));
15451561
return result;
1562+
} else if (gc::IsA<SimpleCharacterString_sp>(x)
1563+
&& counter.fixnump() && counter.unsafe_fixnum() >= 0) {
1564+
// other fast path
1565+
gctools::Fixnum fcounter = counter.unsafe_fixnum();
1566+
Symbol_sp result = core__gensym_quick_char(gc::As_unsafe<SimpleCharacterString_sp>(x), fcounter);
1567+
cl::_sym_STARgensym_counterSTAR->setf_symbolValue(Integer_O::create(1 + fcounter));
1568+
return result;
15461569
}
15471570
String_sp sx = gc::As_unsafe<String_sp>(x);
15481571
StrNs_sp ss = gc::As_unsafe<StrNs_sp>(core__make_vector(sx->element_type(),16,true,clasp_make_fixnum(0)));

0 commit comments

Comments
 (0)