Branch: refs/heads/smoke-me/khw-locale
  Home:   https://github.com/Perl/perl5
  Commit: 731d4e6756b0bcddf27f4ccede170f3d1f365ae1
      
https://github.com/Perl/perl5/commit/731d4e6756b0bcddf27f4ccede170f3d1f365ae1
  Author: Karl Williamson <[email protected]>
  Date:   2020-01-03 (Fri, 03 Jan 2020)

  Changed paths:
    M embedvar.h
    M ext/POSIX/POSIX.xs
    M ext/POSIX/lib/POSIX.pod
    M ext/POSIX/t/mb.t
    M intrpvar.h
    M locale.c
    M perl.h
    M pod/perldelta.pod
    M t/porting/known_pod_issues.dat

  Log Message:
  -----------
  POSIX::mblen() Make thread-safe; allow shift state control

This commit changes to use mbrlen() on threaded perls, (mostly)
transparently, when available, to achieve thread-safe operation.  It is
not completely transparent because mbrlen may set errno differently upon
errors, and no effort is made to hide that difference.  Also mbrlen on
some platforms can handle valid, but-partial characters; and the return
value in an edge case may differ.

This commit also changes the behavior so that it takes a scalar
parameter instead of a char *, and this might not be forceable into a
valid PV.  If not a PV, mblen() is always used (with a semaphore) to
initialize the shift state.  Previously the shift state was always
reinitialized with every call, which meant this could not work on
locales with shift states.

[perl #133928] showed that someone was having trouble with shift states.


  Commit: bd98f894a662dc03352a469a81e219892fe42ff8
      
https://github.com/Perl/perl5/commit/bd98f894a662dc03352a469a81e219892fe42ff8
  Author: Karl Williamson <[email protected]>
  Date:   2020-01-03 (Fri, 03 Jan 2020)

  Changed paths:
    M ext/POSIX/POSIX.xs
    M ext/POSIX/lib/POSIX.pod
    M ext/POSIX/t/mb.t
    M pod/perldelta.pod

  Log Message:
  -----------
  POSIX::mblen: Make 2nd parameter optional

Now that an SV is passed instead of a PV, its length is available
without having to have a second parameter.  The second parameter is now
only used if it restricts the desired length to scan to less than that
available.


  Commit: 557c2554c9f5c4ef7a9f4f0cb238f15f262714cc
      
https://github.com/Perl/perl5/commit/557c2554c9f5c4ef7a9f4f0cb238f15f262714cc
  Author: Karl Williamson <[email protected]>
  Date:   2020-01-03 (Fri, 03 Jan 2020)

  Changed paths:
    M embedvar.h
    M ext/POSIX/POSIX.xs
    M ext/POSIX/lib/POSIX.pod
    M ext/POSIX/t/mb.t
    M intrpvar.h
    M locale.c
    M pod/perldelta.pod
    M t/porting/known_pod_issues.dat

  Log Message:
  -----------
  Fixup POSIX::mbtowc, wctomb

This commit enhances these functions so that on threaded perls, they use
mbrtowc and wcrtomb when available, making them thread safe.  The
substitution isn't completely transparent, as no effort is made to hide
any differences in errno setting upon error.  And there may be slight
differences in edge case behavior on some platforms.

This commit also changes the behaviors so that they take a scalar
parameter instead of a char *, and this might be 'undef' or not be
forceable into a valid PV.  If not a PV, the functions initialize the
shift state.  Previously the shift state was always reinitialized with
every call, which meant these could not work on locales with shift
states.

In addition, there were several issues in mbtowc and wctomb that this
commit fixes.

mbtowc and wctomb, when used, are now run with a semaphore.  This avoids
races if called at the same time in another thread.

The final parameter to mbtowc is now optional, as passing an SV allows
us to determine the length without the need for an extra parameter.  It
is now used only to restrict the parsing of the string to shorter than
the actual length.

wctomb would segfault if the string parameter was shared or hadn't
been pre-allocated with a string of sufficient length to hold the
result.


Compare: https://github.com/Perl/perl5/compare/731d4e6756b0%5E...557c2554c9f5

Reply via email to