Browse Source

* moved the default procedure CurrRaiseLabel to the end of the procedure, not
at the exit label. This fixes problems when using units with finalization
code that contain classes with class destructors in branchful WebAssembly
exceptions mode.

Nikolay Nikolov 3 years ago
parent
commit
6fe647ee3d
2 changed files with 6 additions and 2 deletions
  1. 0 2
      compiler/wasm32/cpupi.pas
  2. 6 0
      compiler/wasm32/hlcgcpu.pas

+ 0 - 2
compiler/wasm32/cpupi.pas

@@ -353,8 +353,6 @@ implementation
         list.concat(taicpu.op_none(a_end_block));
         list.concat(taicpu.op_none(a_end_block));
         thlcgwasm(hlcg).decblock;
         thlcgwasm(hlcg).decblock;
         inherited generate_exit_label(list);
         inherited generate_exit_label(list);
-        if ts_wasm_bf_exceptions in current_settings.targetswitches then
-          hlcg.a_label(list,CurrRaiseLabel);
       end;
       end;
 
 
     procedure tcpuprocinfo.postprocess_code;
     procedure tcpuprocinfo.postprocess_code;

+ 6 - 0
compiler/wasm32/hlcgcpu.pas

@@ -2191,10 +2191,16 @@ implementation
       inherited;
       inherited;
       list.concat(taicpu.op_none(a_block));
       list.concat(taicpu.op_none(a_block));
       incblock;
       incblock;
+      list.concat(taicpu.op_none(a_block));
+      incblock;
     end;
     end;
 
 
   procedure thlcgwasm.gen_exit_code(list: TAsmList);
   procedure thlcgwasm.gen_exit_code(list: TAsmList);
     begin
     begin
+      list.concat(taicpu.op_none(a_end_block));
+      thlcgwasm(hlcg).decblock;
+      if ts_wasm_bf_exceptions in current_settings.targetswitches then
+        a_label(list,tcpuprocinfo(current_procinfo).CurrRaiseLabel);
       if fevalstackheight<>0 then
       if fevalstackheight<>0 then
 {$ifdef DEBUG_WASMSTACK}
 {$ifdef DEBUG_WASMSTACK}
         list.concat(tai_comment.Create(strpnew('!!! values remaining on stack at end of block !!!')));
         list.concat(tai_comment.Create(strpnew('!!! values remaining on stack at end of block !!!')));