mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 06:08:16 +02:00
* when automatically generating an overriding getter/setter method (because
a property in a child class has a higher visibility than the getter/ setter), ensure that we call the inherited method and not the method itself (causing a stack overflow due to infinite recursion) git-svn-id: trunk@25223 -
This commit is contained in:
parent
a21a20d559
commit
1ce93f7430
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -10634,6 +10634,7 @@ tests/test/jvm/testshort.pp svneol=native#text/plain
|
||||
tests/test/jvm/tformalpara.pp svneol=native#text/plain
|
||||
tests/test/jvm/tint.pp svneol=native#text/plain
|
||||
tests/test/jvm/tintstr.pp svneol=native#text/plain
|
||||
tests/test/jvm/tjsetter.java svneol=native#text/plain
|
||||
tests/test/jvm/tnestdynarr.pp svneol=native#text/plain
|
||||
tests/test/jvm/tnestedset.pp svneol=native#text/plain
|
||||
tests/test/jvm/tnestproc.pp svneol=native#text/plain
|
||||
@ -10677,6 +10678,7 @@ tests/test/jvm/tw22807.pp svneol=native#text/plain
|
||||
tests/test/jvm/tw24089.pp svneol=native#text/plain
|
||||
tests/test/jvm/twith.pp svneol=native#text/plain
|
||||
tests/test/jvm/uenum.pp svneol=native#text/plain
|
||||
tests/test/jvm/ujsetter.pp svneol=native#text/plain
|
||||
tests/test/jvm/unsupported.pp svneol=native#text/plain
|
||||
tests/test/lcpref.inc svneol=native#text/plain
|
||||
tests/test/library/testdll.pp svneol=native#text/plain
|
||||
|
@ -951,7 +951,24 @@ implementation
|
||||
end;
|
||||
{ otherwise we can't do anything, and
|
||||
proc_add_definition will give an error }
|
||||
end
|
||||
end;
|
||||
{ add method with the correct visibility }
|
||||
pd:=tprocdef(parentpd.getcopy);
|
||||
{ get rid of the import name for inherited virtual class methods,
|
||||
it has to be regenerated rather than amended }
|
||||
if [po_classmethod,po_virtualmethod]<=pd.procoptions then
|
||||
begin
|
||||
stringdispose(pd.import_name);
|
||||
exclude(pd.procoptions,po_has_importname);
|
||||
end;
|
||||
pd.visibility:=p.visibility;
|
||||
pd.procoptions:=pd.procoptions+procoptions;
|
||||
{ ignore this artificially added procdef when looking for overloads }
|
||||
include(pd.procoptions,po_ignore_for_overload_resolution);
|
||||
finish_copied_procdef(pd,parentpd.procsym.realname,obj.symtable,obj);
|
||||
exclude(pd.procoptions,po_external);
|
||||
pd.synthetickind:=tsk_anon_inherited;
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
{ make the artificial getter/setter virtual so we can override it in
|
||||
|
@ -262,3 +262,9 @@ ppcjvm -O2 -g -B tw24089
|
||||
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||
java -Dfile.encoding=UTF-8 -cp ..\..\..\rtl\units\jvm-java;. -Sa tw24089
|
||||
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||
ppcjvm -O2 -g -B -CTautosetterprefix=Set ujsetter
|
||||
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||
javac -encoding utf-8 -cp ..\..\..\rtl\units\jvm-java;. tjsetter.java
|
||||
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||
java -Dfile.encoding=UTF-8 -cp ..\..\..\rtl\units\jvm-java;. -Sa tjsetter
|
||||
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||
|
@ -146,4 +146,7 @@ $PPC -O2 -g -B -CTautogetterprefix=Get tprop4
|
||||
java -Dfile.encoding=UTF-8 -cp ../../../rtl/units/$RTLDIR:. tprop4
|
||||
$PPC -O2 -g -B -Sa tw24089
|
||||
java -Dfile.encoding=UTF-8 -cp ../../../rtl/units/$RTLDIR:. tw24089
|
||||
$PPC -O2 -g -B -Sa -CTautosetterprefix=Set ujsetter
|
||||
javac -encoding utf-8 -cp ../../../rtl/units/$RTLDIR:. tjsetter.java
|
||||
java -Dfile.encoding=UTF-8 -cp ../../../rtl/units/$RTLDIR:. tjsetter
|
||||
|
||||
|
19
tests/test/jvm/tjsetter.java
Normal file
19
tests/test/jvm/tjsetter.java
Normal file
@ -0,0 +1,19 @@
|
||||
import org.freepascal.test.jsetter.*;
|
||||
|
||||
public class tjsetter {
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
tjsetterchild c;
|
||||
|
||||
c = new tjsetterchild();
|
||||
c.SetVal(2);
|
||||
if (c.get() != 2)
|
||||
java.lang.Runtime.getRuntime().exit(1);
|
||||
c = new tjsetterchild2();
|
||||
c.SetVal(2);
|
||||
if (c.get() != 1)
|
||||
java.lang.Runtime.getRuntime().exit(2);
|
||||
}
|
||||
|
||||
}
|
48
tests/test/jvm/ujsetter.pp
Normal file
48
tests/test/jvm/ujsetter.pp
Normal file
@ -0,0 +1,48 @@
|
||||
unit ujsetter;
|
||||
|
||||
{$namespace org.freepascal.test.jsetter}
|
||||
{$mode delphi}
|
||||
|
||||
interface
|
||||
|
||||
type
|
||||
tjsetterbase = class
|
||||
protected
|
||||
fval: longint;
|
||||
procedure SetVal(v: longint); virtual;
|
||||
public
|
||||
function get: longint;
|
||||
end;
|
||||
|
||||
tjsetterchild = class(tjsetterbase)
|
||||
public
|
||||
property Val: longint read fval write SetVal;
|
||||
end;
|
||||
|
||||
tjsetterchild2 = class(tjsetterchild)
|
||||
protected
|
||||
procedure SetVal(v: longint); override;
|
||||
public
|
||||
property Val: longint read fval write SetVal;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
function tjsetterbase.get: longint;
|
||||
begin
|
||||
result:=fval;
|
||||
end;
|
||||
|
||||
procedure tjsetterbase.SetVal(v: longint);
|
||||
begin
|
||||
fval:=v;
|
||||
end;
|
||||
|
||||
procedure tjsetterchild2.SetVal(v: longint);
|
||||
begin
|
||||
fval:=v-1;
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user