mPUSHu(key);
}
/* 1 */ {
- size_t n;
+ STRLEN n;
char *p = SvPV(declarator, n);
char *q = memchr(p, ' ', n);
- mPUSHp(p, q ? (size_t)(q - p) : n);
+ SV *tmp = newSVpvn_utf8(p, q ? (size_t)(q - p) : n, SvUTF8(declarator));
+ mPUSHs(tmp);
}
if (!ps) {
if (SvTRUE(kws->shift)) {
I32 c;
declarator = sentinel_mortalize(sen, newSVpvn(keyword_ptr, keyword_len));
+ if (lex_bufutf8()) {
+ SvUTF8_on(declarator);
+ }
lex_read_space(0);
SV *sv, **psv;
const char *p, *kw_active;
STRLEN kw_active_len;
+ bool kw_is_utf8;
if (!(hints = GvHV(PL_hintgv))) {
return FALSE;
if (kw_active_len <= kw_len) {
return FALSE;
}
+
+ kw_is_utf8 = lex_bufutf8();
+
for (
p = kw_active;
(p = strchr(p, *kw_ptr)) &&
#define FETCH_HINTK_INTO(NAME, PTR, LEN, X) STMT_START { \
const char *fk_ptr_; \
STRLEN fk_len_; \
+ I32 fk_xlen_; \
SV *fk_sv_; \
fk_sv_ = sentinel_mortalize(sen, newSVpvs(HINTK_ ## NAME)); \
sv_catpvn(fk_sv_, PTR, LEN); \
fk_ptr_ = SvPV(fk_sv_, fk_len_); \
- if (!((X) = hv_fetch(hints, fk_ptr_, fk_len_, 0))) { \
+ fk_xlen_ = fk_len_; \
+ if (kw_is_utf8) { \
+ fk_xlen_ = -fk_xlen_; \
+ } \
+ if (!((X) = hv_fetch(hints, fk_ptr_, fk_xlen_, 0))) { \
croak("%s: internal error: $^H{'%.*s'} not set", MY_PKG, (int)fk_len_, fk_ptr_); \
} \
} STMT_END
--- /dev/null
+#!perl
+use utf8;
+use Test::More tests => 25;
+
+use warnings FATAL => 'all';
+use strict;
+
+use Function::Parameters { pŕöç => 'function_strict' };
+
+pŕöç hörps($x) { $x * 2 }
+pŕöç drau($spın̈al_tap) { $spın̈al_tap * 3 }
+pŕöç ääää($éééééé) { $éééééé * 4 }
+
+is hörps(10), 20;
+is drau(11), 33;
+is ääää(12), 48;
+
+is eval('pŕöç á(){} 1'), 1;
+is á(), undef;
+
+is eval('pŕöç ́(){} 1'), undef;
+like $@, qr/pŕöç.* function body/s;
+
+is eval(q<pŕöç 'hi(){} 1>), undef;
+like $@, qr/pŕöç.* function body/s;
+
+is eval('pŕöç ::hi($z){} 1'), 1;
+is hi(42), undef;
+
+is eval('pŕöç 123(){} 1'), undef;
+like $@, qr/pŕöç.* function body/s;
+
+is eval('pŕöç main::234(){} 1'), undef;
+like $@, qr/pŕöç.* function body/s;
+
+is eval('pŕöç m123($z){} 1'), 1;
+is m123(42), undef;
+
+is eval('pŕöç ::m234($z){} 1'), 1;
+is m234(42), undef;
+
+is eval { ääää }, undef;
+like $@, qr/pŕöç.*ääää/s;
+
+SKIP: {
+ eval { require Moo } or skip "info requires Moo", 4;
+
+ for my $info (Function::Parameters::info \&ääää) {
+ is $info->keyword, 'pŕöç';
+ is join(' ', $info->positional_required), '$éééééé';
+ }
+
+ for my $info (Function::Parameters::info \&drau) {
+ is $info->keyword, 'pŕöç';
+ is join(' ', $info->positional_required), '$spın̈al_tap';
+ }
+}