summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/XS-APItest/APItest.pm2
-rw-r--r--ext/XS-APItest/APItest.xs7
-rw-r--r--ext/XS-APItest/t/utf8.t9
-rw-r--r--utf8.h5
4 files changed, 21 insertions, 2 deletions
diff --git a/ext/XS-APItest/APItest.pm b/ext/XS-APItest/APItest.pm
index b586c8f3cd..85787d1c94 100644
--- a/ext/XS-APItest/APItest.pm
+++ b/ext/XS-APItest/APItest.pm
@@ -4,7 +4,7 @@ use strict;
use warnings;
use Carp;
-our $VERSION = '1.21';
+our $VERSION = '1.22';
require XSLoader;
diff --git a/ext/XS-APItest/APItest.xs b/ext/XS-APItest/APItest.xs
index 088afff840..4cdcc2abc7 100644
--- a/ext/XS-APItest/APItest.xs
+++ b/ext/XS-APItest/APItest.xs
@@ -6200,6 +6200,13 @@ test_isPSXSPC_LC_utf8(U8 * p, int type)
OUTPUT:
RETVAL
+STRLEN
+test_UTF8_IS_REPLACEMENT(char *s, STRLEN len)
+ CODE:
+ RETVAL = UTF8_IS_REPLACEMENT(s, s + len);
+ OUTPUT:
+ RETVAL
+
bool
test_isQUOTEMETA(UV ord)
CODE:
diff --git a/ext/XS-APItest/t/utf8.t b/ext/XS-APItest/t/utf8.t
index 1edc02d643..50d1a4e0fd 100644
--- a/ext/XS-APItest/t/utf8.t
+++ b/ext/XS-APItest/t/utf8.t
@@ -1227,4 +1227,13 @@ SKIP:
}
}
+{
+ my $replacement = chr(0xFFFD);
+ use bytes;
+ is(test_UTF8_IS_REPLACEMENT($replacement, length $replacement), 1,
+ "UTF8_IS_REPLACEMENT returns 1 on a REPLACEMENT character");
+ is(test_UTF8_IS_REPLACEMENT($replacement, length $replacement) - 1, 0,
+ "UTF8_IS_REPLACEMENT returns 0 on too short an input");
+}
+
done_testing;
diff --git a/utf8.h b/utf8.h
index 1d172cd626..bd2526ba5d 100644
--- a/utf8.h
+++ b/utf8.h
@@ -917,7 +917,10 @@ representation.
*/
#define UNICODE_REPLACEMENT 0xFFFD
#define UNICODE_IS_REPLACEMENT(uv) UNLIKELY((UV) (uv) == UNICODE_REPLACEMENT)
-#define UTF8_IS_REPLACEMENT(s, send) is_REPLACEMENT_utf8_safe(s,send)
+#define UTF8_IS_REPLACEMENT(s, send) \
+ UNLIKELY( ((send) - (s)) >= (sizeof(REPLACEMENT_CHARACTER_UTF8) - 1) \
+ && memEQ((s), REPLACEMENT_CHARACTER_UTF8, \
+ sizeof(REPLACEMENT_CHARACTER_UTF8) - 1))
/* Max legal code point according to Unicode */
#define PERL_UNICODE_MAX 0x10FFFF