From 06feac07a5a303ff26ea1b861b904f54520483b0 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Tue, 15 Sep 2015 11:51:19 +0000 Subject: [PATCH] + support for the text/file types on the JVM platform git-svn-id: trunk@31683 - --- compiler/jvm/hlcgcpu.pas | 3 ++- compiler/jvm/jvmdef.pas | 12 +++++++++++- compiler/jvm/njvmcnv.pas | 27 +++++++++++++++++++++++++++ compiler/jvm/tgcpu.pas | 14 +++++++++++++- 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/compiler/jvm/hlcgcpu.pas b/compiler/jvm/hlcgcpu.pas index 62e58a1a03..af0d6ba53f 100644 --- a/compiler/jvm/hlcgcpu.pas +++ b/compiler/jvm/hlcgcpu.pas @@ -291,8 +291,9 @@ implementation class function thlcgjvm.def2regtyp(def: tdef): tregistertype; begin case def.typ of - { records and enums are implemented via classes } + { records (including files) and enums are implemented via classes } recorddef, + filedef, enumdef, setdef: result:=R_ADDRESSREGISTER; diff --git a/compiler/jvm/jvmdef.pas b/compiler/jvm/jvmdef.pas index 626eca8db4..16835cff3f 100644 --- a/compiler/jvm/jvmdef.pas +++ b/compiler/jvm/jvmdef.pas @@ -290,7 +290,17 @@ implementation encodedstr:=encodedstr+c; end; filedef : - result:=false; + begin + case tfiledef(def).filetyp of + ft_text: + result:=jvmaddencodedtype(search_system_type('TEXTREC').typedef,false,encodedstr,forcesignature,founderror); + ft_typed, + ft_untyped: + result:=jvmaddencodedtype(search_system_type('FILEREC').typedef,false,encodedstr,forcesignature,founderror); + else + internalerror(2015091406); + end; + end; recorddef : begin encodedstr:=encodedstr+'L'+trecorddef(def).jvm_full_typename(true)+';' diff --git a/compiler/jvm/njvmcnv.pas b/compiler/jvm/njvmcnv.pas index e239e7bc0a..7dc603f6ae 100644 --- a/compiler/jvm/njvmcnv.pas +++ b/compiler/jvm/njvmcnv.pas @@ -1121,6 +1121,24 @@ implementation result:=false; end; + + function compatible_file_conversion(def1, def2: tdef): boolean; + begin + if def1.typ=filedef then + case tfiledef(def1).filetyp of + ft_text: + result:=def2=search_system_type('TEXTREC').typedef; + ft_typed, + ft_untyped: + result:=def2=search_system_type('FILEREC').typedef; + else + internalerror(2015091401); + end + else + result:=false; + end; + + var fromclasscompatible, toclasscompatible: boolean; @@ -1380,6 +1398,15 @@ implementation float(intvalue) will convert rather than re-interpret the value) } end; + { files } + if compatible_file_conversion(left.resultdef,resultdef) or + compatible_file_conversion(resultdef,left.resultdef) then + begin + result:=true; + exit; + end; + + { anything not explicitly handled is a problem } result:=true; CGMessage2(type_e_illegal_type_conversion,left.resultdef.typename,resultdef.typename); diff --git a/compiler/jvm/tgcpu.pas b/compiler/jvm/tgcpu.pas index acc42bdcfb..bb1399948e 100644 --- a/compiler/jvm/tgcpu.pas +++ b/compiler/jvm/tgcpu.pas @@ -55,7 +55,7 @@ unit tgcpu; uses verbose, cgbase, - symconst,symdef,symsym,symcpu,defutil, + symconst,symtable,symdef,symsym,symcpu,defutil, cpubase,aasmcpu, hlcgobj,hlcgcpu; @@ -211,6 +211,18 @@ unit tgcpu; result:=true; end; end; + filedef: + begin + case tfiledef(def).filetyp of + ft_text: + result:=getifspecialtemp(list,search_system_type('TEXTREC').typedef,forcesize,temptype,ref); + ft_typed, + ft_untyped: + result:=getifspecialtemp(list,search_system_type('FILEREC').typedef,forcesize,temptype,ref); + else + internalerror(2015091405); + end; + end; end; end;