* disallow conversion between regular pointers and WasmExternRef

This commit is contained in:
Nikolay Nikolov 2023-06-11 05:28:39 +03:00
parent 021c1a7bb4
commit a47a1c093a
4 changed files with 51 additions and 0 deletions

View File

@ -38,6 +38,8 @@ interface
procedure second_int_to_bool;override;
procedure second_ansistring_to_pchar;override;
procedure second_class_to_intf;override;
public
function target_specific_explicit_typeconv: boolean;override;
end;
implementation
@ -253,6 +255,16 @@ implementation
internalerror(2002081301);
end;
function twasmtypeconvnode.target_specific_explicit_typeconv: boolean;
begin
result:=false;
if is_pointer(left.resultdef) and
is_pointer(resultdef) and
not tpointerdef(left.resultdef).compatible_with_pointerdef_size(tpointerdef(resultdef)) then
CGMessage2(type_e_illegal_type_conversion,left.resultdef.typename,resultdef.typename);
end;
begin
ctypeconvnode:=twasmtypeconvnode;
end.

View File

@ -69,6 +69,7 @@ type
constructor create_externref(def: tdef);
function getcopy: tstoreddef; override;
function GetTypeName: string; override;
function compatible_with_pointerdef_size(ptr: tpointerdef): boolean; override;
end;
tcpupointerdefclass = class of tcpupointerdef;
@ -294,6 +295,12 @@ implementation
end;
function tcpupointerdef.compatible_with_pointerdef_size(ptr: tpointerdef): boolean;
begin
result:=tcpupointerdef(ptr).is_wasm_externref=is_wasm_externref;
end;
{****************************************************************************
tcpuprocdef
****************************************************************************}

View File

@ -0,0 +1,16 @@
{ %cpu=wasm32 }
{ %fail }
program twasmexternref3;
procedure testproc;
var
p: WasmExternRef;
q: Pointer;
begin
{ WasmExternRef cannot be converted to pointer }
q := Pointer(p);
end;
begin
end.

View File

@ -0,0 +1,16 @@
{ %cpu=wasm32 }
{ %fail }
program twasmexternref3a;
procedure testproc;
var
p: WasmExternRef;
q: Pointer;
begin
{ A pointer cannot be converted to WasmExternRef }
p := WasmExternRef(q);
end;
begin
end.