diff --git a/.gitattributes b/.gitattributes index beaaddc4c3..5bea747196 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14693,6 +14693,7 @@ tests/webtbf/tw3395.pp svneol=native#text/plain tests/webtbf/tw3395a.pp svneol=native#text/plain tests/webtbf/tw34355.pp svneol=native#text/pascal tests/webtbf/tw3450.pp svneol=native#text/plain +tests/webtbf/tw34691.pp svneol=native#text/pascal tests/webtbf/tw3473.pp svneol=native#text/plain tests/webtbf/tw3480.pp svneol=native#text/plain tests/webtbf/tw3480a.pp svneol=native#text/plain diff --git a/packages/rtl-objpas/src/inc/rtti.pp b/packages/rtl-objpas/src/inc/rtti.pp index 6425e23144..2293cc3898 100644 --- a/packages/rtl-objpas/src/inc/rtti.pp +++ b/packages/rtl-objpas/src/inc/rtti.pp @@ -542,6 +542,9 @@ resourcestring implementation uses +{$ifdef windows} + Windows, +{$endif} fgl; type @@ -701,6 +704,40 @@ var GRttiPool : TRttiPool; FuncCallMgr: TFunctionCallManagerArray; +function AllocateMemory(aSize: PtrUInt): Pointer; +begin +{$IF DEFINED(WINDOWS)} + Result := VirtualAlloc(Nil, aSize, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); +{$ELSE} + Result := GetMem(aSize); +{$ENDIF} +end; + +function ProtectMemory(aPtr: Pointer; aSize: PtrUInt; aExecutable: Boolean): Boolean; +{$IF DEFINED(WINDOWS)} +var + oldprot: DWORD; +{$ENDIF} +begin +{$IF DEFINED(WINDOWS)} + if aExecutable then + Result := VirtualProtect(aPtr, aSize, PAGE_EXECUTE_READ, oldprot) + else + Result := VirtualProtect(aPtr, aSize, PAGE_READWRITE, oldprot); +{$ELSE} + Result := True; +{$ENDIF} +end; + +procedure FreeMemory(aPtr: Pointer); +begin +{$IF DEFINED(WINDOWS)} + VirtualFree(aPtr, 0, MEM_RELEASE); +{$ELSE} + FreeMem(aPtr); +{$ENDIF} +end; + function CCToStr(aCC: TCallConv): String; inline; begin WriteStr(Result, aCC); diff --git a/packages/rtl-objpas/src/x86_64/invoke.inc b/packages/rtl-objpas/src/x86_64/invoke.inc index 1622f6a4b5..057aa8b86f 100644 --- a/packages/rtl-objpas/src/x86_64/invoke.inc +++ b/packages/rtl-objpas/src/x86_64/invoke.inc @@ -235,7 +235,7 @@ begin end; tkBool: begin case td^.OrdType of - otUByte: val := ShortInt(PBoolean(aArgs[i].ValueRef)^); + otUByte: val := ShortInt(System.PBoolean(aArgs[i].ValueRef)^); otUWord: val := Byte(PBoolean16(aArgs[i].ValueRef)^); otULong: val := SmallInt(PBoolean32(aArgs[i].ValueRef)^); otUQWord: val := QWord(PBoolean64(aArgs[i].ValueRef)^); diff --git a/tests/webtbf/tw34691.pp b/tests/webtbf/tw34691.pp new file mode 100644 index 0000000000..f2f28aa3c8 --- /dev/null +++ b/tests/webtbf/tw34691.pp @@ -0,0 +1,28 @@ +{ %FAIL } + +unit tw34691; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils; + +type + TObjA = class + Icon: String; + end; + + {$M+} + TObjB = class + FObjA: TObjA; + + published + property Icon: String read FObjA.Icon; + end; + +implementation + +end. +