浏览代码

* fixed resetting of ansistrings

git-svn-id: trunk@2017 -
florian 19 年之前
父节点
当前提交
82a94db712
共有 2 个文件被更改,包括 21 次插入7 次删除
  1. 4 1
      compiler/cgobj.pas
  2. 17 6
      compiler/nutils.pas

+ 4 - 1
compiler/cgobj.pas

@@ -1608,7 +1608,10 @@ implementation
          if is_ansistring(t) or
          if is_ansistring(t) or
             is_widestring(t) or
             is_widestring(t) or
             is_interfacecom(t) then
             is_interfacecom(t) then
-            g_decrrefcount(list,t,ref)
+            begin
+              g_decrrefcount(list,t,ref);
+              a_load_const_ref(list,OS_ADDR,0,ref);
+            end
          else
          else
            begin
            begin
               reference_reset_symbol(href,tstoreddef(t).get_rtti_label(initrtti),0);
               reference_reset_symbol(href,tstoreddef(t).get_rtti_label(initrtti),0);

+ 17 - 6
compiler/nutils.pas

@@ -466,23 +466,34 @@ implementation
 
 
 
 
     function finalize_data_node(p:tnode):tnode;
     function finalize_data_node(p:tnode):tnode;
+      var
+        newstatement : tstatementnode;
       begin
       begin
         if not assigned(p.resulttype.def) then
         if not assigned(p.resulttype.def) then
           resulttypepass(p);
           resulttypepass(p);
         if is_ansistring(p.resulttype.def) then
         if is_ansistring(p.resulttype.def) then
           begin
           begin
-            result:=ccallnode.createintern('fpc_ansistr_decr_ref',
+            result:=internalstatements(newstatement);
+            addstatement(newstatement,ccallnode.createintern('fpc_ansistr_decr_ref',
                   ccallparanode.create(
                   ccallparanode.create(
                     ctypeconvnode.create_internal(p,voidpointertype),
                     ctypeconvnode.create_internal(p,voidpointertype),
-                  nil));
+                  nil)));
+            addstatement(newstatement,cassignmentnode.create(
+               ctypeconvnode.create_internal(p.getcopy,voidpointertype),
+               cnilnode.create
+               ));
           end
           end
-        else
-        if is_widestring(p.resulttype.def) then
+        else if is_widestring(p.resulttype.def) then
           begin
           begin
-            result:=ccallnode.createintern('fpc_widestr_decr_ref',
+            result:=internalstatements(newstatement);
+            addstatement(newstatement,ccallnode.createintern('fpc_widestr_decr_ref',
                   ccallparanode.create(
                   ccallparanode.create(
                     ctypeconvnode.create_internal(p,voidpointertype),
                     ctypeconvnode.create_internal(p,voidpointertype),
-                  nil));
+                  nil)));
+            addstatement(newstatement,cassignmentnode.create(
+               ctypeconvnode.create_internal(p.getcopy,voidpointertype),
+               cnilnode.create
+               ));
           end
           end
         else
         else
           result:=ccallnode.createintern('fpc_finalize',
           result:=ccallnode.createintern('fpc_finalize',