Bladeren bron

* disallow conversion between regular pointers and WasmExternRef

Nikolay Nikolov 2 jaren geleden
bovenliggende
commit
a47a1c093a

+ 12 - 0
compiler/wasm32/nwasmcnv.pas

@@ -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.

+ 7 - 0
compiler/wasm32/symcpu.pas

@@ -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
 ****************************************************************************}

+ 16 - 0
tests/test/wasm/twasmexternref3.pp

@@ -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.

+ 16 - 0
tests/test/wasm/twasmexternref3a.pp

@@ -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.