Закодирован Perl6 NativeCall с Str ('utf16') получил случайно искаженный результат - PullRequest
0 голосов
/ 09 декабря 2018

Я отображаю GetFullPathName Windows API в сценарии perl6, используя NativeCall, поэтому я написал следующее:

#!perl6
use NativeCall;
constant \WIN32_MAX_PATH = 260;    

#I may use directly $path.IO.absolute()
sub Win32-GetFullPathName(
        Str $lpFileName is encoded('utf16'),
        int32 $nBufferLength, 
        #Str $lpBuffer is encoded('utf16') is rw,
        Blob $lpBuffer is rw,
        Str $lpFilenameIndex is rw)
    returns int32
    is native('kernel32.dll') 
    is symbol('GetFullPathNameW') 
    { * }


my $path = '.';
my $fp-size = Win32-GetFullPathName(
        $path, # $path ~ "\0", # <!-- this hack make it working fine
        WIN32_MAX_PATH, 
        #my Str $fpath = ' ' x WIN32_MAX_PATH;
        my $buffer = buf16.allocate(WIN32_MAX_PATH), 
        Str );
put "[$fp-size] => ", $buffer.decode('utf16').substr(0, $fp-size);

Код работает случайным образом, пока я не добавлю "\0"после $path.

[EDIT] Результаты при многократном вызове:

[12] => D: \ dev \ pa.t

[12] => D: \ dev \ pa.

[12] => D: \ dev \ pa.槟

[9] => D: \ dev \ pa

[9] => D: \ dev \ pa

Есть ли другой способ сделать это?

1 Ответ

0 голосов
/ 10 декабря 2018

Я подозреваю, что ошибка MoarVM в src/strings/utf16.c, в частности строка 403 :

result = MVM_realloc(result, *output_size);

, которая, вероятно, должна читать

result = MVM_realloc(result, *output_size + 2);

Если вы можете проверитьчто это решит вашу проблему, не стесняйтесь подать отчет об ошибке или даже создать запрос на извлечение .

...