pcre_maketables выдает AV, если TPerlRegEx pcre.pas и JCL WIN64 obj файлы объединены вместе - PullRequest
0 голосов
/ 08 сентября 2018

Производительность TPerlRegEx для Delphi Win32 очень хороша для больших строк (например, RegEx JCL жалуется, что определенный предел достигнут с большими строками). Следовательно, t

Чтобы использовать основанный на классе TPerlRegEx для Delphi Win64, представляется целесообразным объединить его pcre.pas и файлы JJ WIN64 WIN64 . Основные изменения просто

{$IF DEFINED(WIN64)}
System.Win.Crtl,
{$ENDIF}

и

{$ELSE ~WIN32}
{$LINK delphi-win64-jcl\pcre_compile.obj}
{$LINK delphi-win64-jcl\pcre_config.obj}
{$LINK delphi-win64-jcl\pcre_dfa_exec.obj}
{$LINK delphi-win64-jcl\pcre_exec.obj}
{$LINK delphi-win64-jcl\pcre_fullinfo.obj}
{$LINK delphi-win64-jcl\pcre_get.obj}
{$LINK delphi-win64-jcl\pcre_jit_compile.obj}
{$LINK delphi-win64-jcl\pcre_maketables.obj}
{$LINK delphi-win64-jcl\pcre_newline.obj}
{$LINK delphi-win64-jcl\pcre_ord2utf8.obj}
{$LINK delphi-win64-jcl\pcre_refcount.obj}
{$LINK delphi-win64-jcl\pcre_study.obj}
{$LINK delphi-win64-jcl\pcre_tables.obj}
{$LINK delphi-win64-jcl\pcre_ucd.obj}
{$LINK delphi-win64-jcl\pcre_valid_utf8.obj}
{$LINK delphi-win64-jcl\pcre_version.obj}
{$LINK delphi-win64-jcl\pcre_xclass.obj}
{$LINK delphi-win64-jcl\pcre_chartables.obj}

//  Make the linker happy. (from JCL)
function __chkstk(size: size_t): Pointer;
begin
  Result := malloc(size);
end;
procedure _pcre_find_bracket; external;
procedure _pcre_jit_compile; external;
procedure _pcre_jit_free; external;

{$ENDIF ~WIN32}

Однако pcre_maketables выдает нарушение прав доступа. С точки зрения процессора, похоже, что malloc, который вызывает pcre_maketables, равен нулю.

CPU View

pcre_maketables:
000000000049B820 4883EC78         sub rsp,$78
000000000049B824 B940040000       mov ecx,$00000440
000000000049B829 FF153164FAFF     call qword ptr [rel $fffa6431]
000000000049B82F 4889442430       mov [rsp+$30],rax
000000000049B834 48837C243000     cmp qword ptr [rsp+$30],$00
000000000049B83A 7507             jnz pcre_maketables + $23

pcre_maketables.c

#ifndef DFTABLES
yield = (unsigned char*)(PUBL(malloc))(tables_length);
#else
yield = (unsigned char*)malloc(tables_length);
#endif

if (yield == NULL) return NULL;

Я не мог обойти эту проблему даже после того, как несколько раз отличался от pcl.pas в JCL. Не могли бы вы прокомментировать, как это исправить?

Файлы для тестирования можно скачать онлайн

...