Fix hv_fetch with UTF-8 keys
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/35b4c52e Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/35b4c52e Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/35b4c52e Branch: refs/heads/master Commit: 35b4c52ebaf789920276154a150615896e8edc47 Parents: 199561e Author: Nick Wellnhofer <[email protected]> Authored: Sat Aug 1 17:19:13 2015 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Tue Aug 4 21:57:40 2015 +0200 ---------------------------------------------------------------------- perl/xs/Lucy/Document/Doc.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/35b4c52e/perl/xs/Lucy/Document/Doc.c ---------------------------------------------------------------------- diff --git a/perl/xs/Lucy/Document/Doc.c b/perl/xs/Lucy/Document/Doc.c index 2f54da7..fff4e62 100644 --- a/perl/xs/Lucy/Document/Doc.c +++ b/perl/xs/Lucy/Document/Doc.c @@ -150,7 +150,7 @@ LUCY_Doc_Extract_IMP(lucy_Doc *self, cfish_String *field) { lucy_DocIVARS *const ivars = lucy_Doc_IVARS(self); cfish_Obj *retval = NULL; SV **sv_ptr = hv_fetch((HV*)ivars->fields, CFISH_Str_Get_Ptr8(field), - CFISH_Str_Get_Size(field), 0); + -CFISH_Str_Get_Size(field), 0); if (sv_ptr) { retval = XSBind_perl_to_cfish(aTHX_ *sv_ptr); @@ -218,8 +218,20 @@ LUCY_Doc_Equals_IMP(lucy_Doc *self, cfish_Obj *other) { while (num_fields--) { HE *my_entry = hv_iternext(my_fields); SV *my_val_sv = HeVAL(my_entry); - STRLEN key_len = HeKLEN(my_entry); - char *key = HeKEY(my_entry); + STRLEN key_len; + char *key; + + if (HeKLEN(my_entry) == HEf_SVKEY) { + SV *key_sv = HeKEY_sv(my_entry); + key = SvPV(key_sv, key_len); + if (SvUTF8(key_sv)) { key_len = -key_len; } + } + else { + key_len = HeKLEN(my_entry); + key = key_len ? HeKEY(my_entry) : Nullch; + if (HeKUTF8(my_entry)) { key_len = -key_len; } + } + SV **const other_val = hv_fetch(other_fields, key, key_len, 0); if (!other_val) { return false; } if (!sv_eq(my_val_sv, *other_val)) { return false; }
