浏览代码

* 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 年之前
父节点
当前提交
6fe647ee3d
共有 2 个文件被更改,包括 6 次插入2 次删除
  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));
         thlcgwasm(hlcg).decblock;
         inherited generate_exit_label(list);
-        if ts_wasm_bf_exceptions in current_settings.targetswitches then
-          hlcg.a_label(list,CurrRaiseLabel);
       end;
 
     procedure tcpuprocinfo.postprocess_code;

+ 6 - 0
compiler/wasm32/hlcgcpu.pas

@@ -2191,10 +2191,16 @@ implementation
       inherited;
       list.concat(taicpu.op_none(a_block));
       incblock;
+      list.concat(taicpu.op_none(a_block));
+      incblock;
     end;
 
   procedure thlcgwasm.gen_exit_code(list: TAsmList);
     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
 {$ifdef DEBUG_WASMSTACK}
         list.concat(tai_comment.Create(strpnew('!!! values remaining on stack at end of block !!!')));