- removed several JVM methods that aren't necessary for WebAssembly

git-svn-id: branches/wasm@48058 -
This commit is contained in:
nickysn 2021-01-04 16:34:28 +00:00
parent 04c14500a7
commit 5b961c4125
2 changed files with 0 additions and 276 deletions

View File

@ -109,7 +109,6 @@ uses
procedure record_generated_code_for_procdef(pd: tprocdef; code, data: TAsmList); override;
procedure g_incrrefcount(list : TAsmList;t: tdef; const ref: treference);override;
procedure g_array_rtti_helper(list: TAsmList; t: tdef; const ref: treference; const highloc: tlocation; const name: string); override;
procedure g_initialize(list : TAsmList;t : tdef;const ref : treference);override;
procedure g_finalize(list : TAsmList;t : tdef;const ref : treference);override;
@ -121,8 +120,6 @@ uses
procedure g_copyvaluepara_openarray(list: TAsmList; const ref: treference; const lenloc: tlocation; arrdef: tarraydef; destreg: tregister); override;
procedure g_releasevaluepara_openarray(list: TAsmList; arrdef: tarraydef; const l: tlocation); override;
procedure gen_initialize_code(list: TAsmList); override;
procedure gen_entry_code(list: TAsmList); override;
procedure gen_exit_code(list: TAsmList); override;
@ -200,13 +197,7 @@ uses
property maxevalstackheight: longint read fmaxevalstackheight;
procedure gen_initialize_fields_code(list:TAsmList);
procedure gen_typecheck(list: TAsmList; checkop: tasmop; checkdef: tdef);
protected
function get_enum_init_val_ref(def: tdef; out ref: treference): boolean;
procedure allocate_implicit_structs_for_st_with_base_ref(list: TAsmList; st: tsymtable; const ref: treference; allocvartyp: tsymtyp);
procedure allocate_enum_with_base_ref(list: TAsmList; vs: tabstractvarsym; const initref: treference; destbaseref: treference);
procedure allocate_implicit_struct_with_base_ref(list: TAsmList; vs: tabstractvarsym; ref: treference);
procedure gen_load_uninitialized_function_result(list: TAsmList; pd: tprocdef; resdef: tdef; const resloc: tcgpara); override;
@ -1711,59 +1702,6 @@ implementation
// do nothing
end;
procedure thlcgwasm.g_array_rtti_helper(list: TAsmList; t: tdef; const ref: treference; const highloc: tlocation; const name: string);
var
normaldim: longint;
eleref, tmpref: treference;
begin
{ only in case of initialisation, we have to set all elements to "empty" }
if name<>'fpc_initialize_array' then
exit;
{ put array on the stack }
tmpref:=ref;
a_load_ref_stack(list,ptruinttype,tmpref,prepare_stack_for_ref(list,tmpref,false));
{ in case it's an open array whose elements are regular arrays, put the
dimension of the regular arrays on the stack (otherwise pass 0) }
normaldim:=0;
while (t.typ=arraydef) and
not is_dynamic_array(t) do
begin
inc(normaldim);
t:=tarraydef(t).elementdef;
end;
a_load_const_stack(list,s32inttype,normaldim,R_INTREGISTER);
{ highloc is invalid, the length is part of the array in Java }
if is_wide_or_unicode_string(t) then
g_call_system_proc(list,'fpc_initialize_array_unicodestring',[],nil)
else if is_ansistring(t) then
g_call_system_proc(list,'fpc_initialize_array_ansistring',[],nil)
else if is_dynamic_array(t) then
g_call_system_proc(list,'fpc_initialize_array_dynarr',[],nil)
else if is_record(t) or
(t.typ=setdef) then
begin
tg.gethltemp(list,t,t.size,tt_persistent,eleref);
a_load_ref_stack(list,t,eleref,prepare_stack_for_ref(list,eleref,false));
if is_record(t) then
g_call_system_proc(list,'fpc_initialize_array_record',[],nil)
else if tsetdef(t).elementdef.typ=enumdef then
g_call_system_proc(list,'fpc_initialize_array_enumset',[],nil)
else
g_call_system_proc(list,'fpc_initialize_array_bitset',[],nil);
tg.ungettemp(list,eleref);
end
else if (t.typ=enumdef) then
begin
if get_enum_init_val_ref(t,eleref) then
begin
a_load_ref_stack(list,ptruinttype,eleref,prepare_stack_for_ref(list,eleref,false));
g_call_system_proc(list,'fpc_initialize_array_object',[],nil);
end;
end
else
internalerror(2011031901);
end;
procedure thlcgwasm.g_initialize(list: TAsmList; t: tdef; const ref: treference);
var
dummyloc: tlocation;
@ -1921,32 +1859,6 @@ implementation
// do nothing, long live garbage collection!
end;
procedure thlcgwasm.gen_initialize_code(list: TAsmList);
var
ref: treference;
begin
{ create globals with wrapped types such as arrays/records }
case current_procinfo.procdef.proctypeoption of
potype_unitinit:
begin
cgutils.reference_reset_base(ref,NR_NO,0,ctempposinvalid,1,[]);
if assigned(current_module.globalsymtable) then
allocate_implicit_structs_for_st_with_base_ref(list,current_module.globalsymtable,ref,staticvarsym);
allocate_implicit_structs_for_st_with_base_ref(list,current_module.localsymtable,ref,staticvarsym);
end;
potype_class_constructor:
begin
{ also initialise local variables, if any }
inherited;
{ initialise class fields }
cgutils.reference_reset_base(ref,NR_NO,0,ctempposinvalid,1,[]);
allocate_implicit_structs_for_st_with_base_ref(list,tabstractrecorddef(current_procinfo.procdef.owner.defowner).symtable,ref,staticvarsym);
end
else
inherited
end;
end;
procedure thlcgwasm.gen_entry_code(list: TAsmList);
begin
list.concat(Tai_force_line.Create);
@ -2347,151 +2259,6 @@ implementation
a_load_ref_ref(list,ptruinttype,ptruinttype,initref,destbaseref);
end;
function thlcgwasm.get_enum_init_val_ref(def: tdef; out ref: treference): boolean;
var
sym: tstaticvarsym;
begin
result:=false;
sym:=tstaticvarsym(tcpuenumdef(tenumdef(def).getbasedef).classdef.symtable.Find('__FPC_ZERO_INITIALIZER'));
{ no enum with ordinal value 0 -> exit }
if not assigned(sym) then
exit;
reference_reset_symbol(ref,current_asmdata.RefAsmSymbol(sym.mangledname,AT_DATA),0,4,[]);
result:=true;
end;
procedure thlcgwasm.allocate_implicit_structs_for_st_with_base_ref(list: TAsmList; st: tsymtable; const ref: treference; allocvartyp: tsymtyp);
var
vs: tabstractvarsym;
def: tdef;
i: longint;
initref: treference;
begin
for i:=0 to st.symlist.count-1 do
begin
if (tsym(st.symlist[i]).typ<>allocvartyp) then
continue;
vs:=tabstractvarsym(st.symlist[i]);
if sp_static in vs.symoptions then
continue;
{ vo_is_external and vo_has_local_copy means a staticvarsym that is
alias for a constsym, whose sole purpose is for allocating and
intialising the constant }
if [vo_is_external,vo_has_local_copy]*vs.varoptions=[vo_is_external] then
continue;
{ threadvar innitializations are handled at the node tree level }
if vo_is_thread_var in vs.varoptions then
begin
{ nothing }
end
else if wasmAlwayInMem(vs.vardef) then
allocate_implicit_struct_with_base_ref(list,vs,ref)
{ enums are class instances in Java, while they are ordinals in
Pascal. When they are initialized with enum(0), such as in
constructors or global variables, initialize them with the
enum instance for 0 if it exists (if not, it remains nil since
there is no valid enum value in it) }
else if (vs.vardef.typ=enumdef) and
((vs.typ<>fieldvarsym) or
(tdef(vs.owner.defowner).typ<>objectdef) or
(ts_jvm_enum_field_init in current_settings.targetswitches)) and
get_enum_init_val_ref(vs.vardef,initref) then
allocate_enum_with_base_ref(list,vs,initref,ref);
end;
{ process symtables of routines part of this symtable (for local typed
constants) }
if allocvartyp=staticvarsym then
begin
for i:=0 to st.deflist.count-1 do
begin
def:=tdef(st.deflist[i]);
{ the unit symtable also contains the methods of classes defined
in that unit -> skip them when processing the unit itself.
Localst is not assigned for the main program code.
Localst can be the same as st in case of unit init code. }
if (def.typ<>procdef) or
(def.owner<>st) or
not assigned(tprocdef(def).localst) or
(tprocdef(def).localst=st) then
continue;
allocate_implicit_structs_for_st_with_base_ref(list,tprocdef(def).localst,ref,allocvartyp);
end;
end;
end;
procedure thlcgwasm.gen_initialize_fields_code(list: TAsmList);
var
sym: tsym;
selfpara: tparavarsym;
selfreg: tregister;
ref: treference;
obj: tabstractrecorddef;
i: longint;
needinit: boolean;
begin
obj:=tabstractrecorddef(current_procinfo.procdef.owner.defowner);
{ check whether there are any fields that need initialisation }
needinit:=false;
for i:=0 to obj.symtable.symlist.count-1 do
begin
sym:=tsym(obj.symtable.symlist[i]);
if (sym.typ=fieldvarsym) and
not(sp_static in sym.symoptions) and
(wasmAlwayInMem(tfieldvarsym(sym).vardef) or
((tfieldvarsym(sym).vardef.typ=enumdef) and
get_enum_init_val_ref(tfieldvarsym(sym).vardef,ref))) then
begin
needinit:=true;
break;
end;
end;
if not needinit then
exit;
selfpara:=tparavarsym(current_procinfo.procdef.parast.find('self'));
if not assigned(selfpara) then
internalerror(2011033001);
selfreg:=getaddressregister(list,selfpara.vardef);
a_load_loc_reg(list,obj,obj,selfpara.localloc,selfreg);
cgutils.reference_reset_base(ref,selfreg,0,ctempposinvalid,1,[]);
allocate_implicit_structs_for_st_with_base_ref(list,obj.symtable,ref,fieldvarsym);
end;
procedure thlcgwasm.gen_typecheck(list: TAsmList; checkop: tasmop; checkdef: tdef);
begin
{ replace special types with their equivalent class type }
if (checkdef.typ=pointerdef) and
wasmAlwayInMem(tpointerdef(checkdef).pointeddef) then
checkdef:=tpointerdef(checkdef).pointeddef;
if (checkdef=voidpointertype) or
(checkdef.typ=formaldef) then
checkdef:=ptruinttype
else if checkdef.typ=enumdef then
checkdef:=tcpuenumdef(checkdef).classdef
else if checkdef.typ=setdef then
begin
if tsetdef(checkdef).elementdef.typ=enumdef then
checkdef:=java_juenumset
else
checkdef:=java_jubitset;
end
else if is_wide_or_unicode_string(checkdef) then
checkdef:=java_jlstring
else if is_ansistring(checkdef) then
checkdef:=java_ansistring
else if is_shortstring(checkdef) then
checkdef:=java_shortstring;
if checkdef.typ in [objectdef,recorddef] then
list.concat(taicpu.op_sym(checkop,current_asmdata.RefAsmSymbol(tabstractrecorddef(checkdef).jvm_full_typename(true),AT_METADATA)))
else if checkdef.typ=classrefdef then
list.concat(taicpu.op_sym(checkop,current_asmdata.RefAsmSymbol('java/lang/Class',AT_METADATA)))
{ todo: WASM
else
list.concat(taicpu.op_sym(checkop,current_asmdata.RefAsmSymbol(jvmencodetype(checkdef,false),AT_METADATA)));
}
end;
procedure thlcgwasm.resizestackfpuval(list: TAsmList; fromsize, tosize: tcgsize);
begin
if (fromsize=OS_F32) and

View File

@ -115,16 +115,6 @@ type
tcpustringdefclass = class of tcpustringdef;
tcpuenumdef = class(tenumdef)
protected
procedure ppuload_platform(ppufile: tcompilerppufile); override;
procedure ppuwrite_platform(ppufile: tcompilerppufile); override;
public
{ class representing this enum on the Java side }
classdef : tobjectdef;
classdefderef : tderef;
function getcopy: tstoreddef; override;
procedure buildderef; override;
procedure deref; override;
end;
tcpuenumdefclass = class of tcpuenumdef;
@ -222,39 +212,6 @@ implementation
tcpuenumdef
****************************************************************************}
procedure tcpuenumdef.ppuload_platform(ppufile: tcompilerppufile);
begin
inherited;
ppufile.getderef(classdefderef);
end;
procedure tcpuenumdef.ppuwrite_platform(ppufile: tcompilerppufile);
begin
inherited;
ppufile.putderef(classdefderef);
end;
function tcpuenumdef.getcopy: tstoreddef;
begin
result:=inherited;
tcpuenumdef(result).classdef:=classdef;
end;
procedure tcpuenumdef.buildderef;
begin
inherited;
classdefderef.build(classdef);
end;
procedure tcpuenumdef.deref;
begin
inherited;
classdef:=tobjectdef(classdefderef.resolve);
end;
{****************************************************************************
tcpuprocdef