Производительность 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. Не могли бы вы прокомментировать, как это исправить?
Файлы для тестирования можно скачать онлайн