Skip to content

Commit f29dd26

Browse files
committed
Implement rb_enc_strlen.
1 parent 4e6b7fd commit f29dd26

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Compatibility:
2525
* Fix exception message when there are missing or extra keyword arguments - it contains all the missing/extra keywords now (#1522, @andrykonchin).
2626
* Always terminate native strings with enough `\0` bytes (#2704, @eregon).
2727
* Support `#dup` and `#clone` on foreign strings (@eregon).
28+
* Implement the `rb_enc_strlen` function for use by native extensions (@nirvdrum).
2829

2930
Performance:
3031

src/main/c/cext/encoding.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,16 @@ int rb_enc_precise_mbclen(const char *p, const char *e, rb_encoding *enc) {
246246
return polyglot_as_i32(RUBY_CEXT_INVOKE_NO_WRAP("rb_enc_precise_mbclen", rb_tr_temporary_native_string(p, length, enc)));
247247
}
248248

249+
long rb_enc_strlen(const char *p, const char *e, rb_encoding *enc) {
250+
long length = e - p;
251+
252+
if (rb_enc_mbminlen(enc) == rb_enc_mbmaxlen(enc)) {
253+
return length / rb_enc_mbminlen(enc) + !!(length % rb_enc_mbminlen(enc));
254+
}
255+
256+
return polyglot_as_i64(RUBY_CEXT_INVOKE_NO_WRAP("rb_enc_strlen", rb_tr_temporary_native_string(p, length, enc)));
257+
}
258+
249259
int rb_enc_dummy_p(rb_encoding *enc) {
250260
return polyglot_as_i32(RUBY_INVOKE_NO_WRAP(rb_enc_from_encoding(enc), "dummy?"));
251261
}
@@ -433,5 +443,3 @@ int enc_is_unicode(const OnigEncodingType *enc) {
433443
const char *name = rb_enc_name(enc);
434444
return !strncmp(name,"UTF", 3);
435445
}
436-
437-

src/main/java/org/truffleruby/cext/CExtNodes.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1481,6 +1481,21 @@ protected int rbEncPreciseMbclen(Object string,
14811481
}
14821482
}
14831483

1484+
@CoreMethod(names = "rb_enc_strlen", onSingleton = true, required = 1)
1485+
public abstract static class RbEncStrlen extends CoreMethodArrayArgumentsNode {
1486+
1487+
@Specialization(guards = "strings.isRubyString(string)", limit = "1")
1488+
protected int rbEncStrlen(Object string,
1489+
@Cached RubyStringLibrary strings,
1490+
@Cached TruffleString.CodePointLengthNode codePointLengthNode) {
1491+
var tstring = strings.getTString(string);
1492+
var tencoding = strings.getTEncoding(string);
1493+
1494+
return codePointLengthNode.execute(tstring, tencoding);
1495+
}
1496+
1497+
}
1498+
14841499
@CoreMethod(names = "rb_enc_left_char_head", onSingleton = true, required = 3, lowerFixnum = 3)
14851500
public abstract static class RbEncLeftCharHeadNode extends CoreMethodArrayArgumentsNode {
14861501

0 commit comments

Comments
 (0)