Menu

#255 Don't increase refcount for "Call ${__FUNCTION__}" recursive functions

Unstable
open
nobody
None
5
2014-08-29
2014-08-29
Anders
No

A function that only references itself should issue a unused function warning:

Function Foo
Call ${__FUNCTION__}
FunctionEnd

Patch:

Index: Source/build.cpp
===================================================================
--- Source/build.cpp    (revision 6538)
+++ Source/build.cpp    (working copy)
@@ -1458,7 +1458,7 @@
   return 0;
 }

-int CEXEBuild::resolve_call_int(const TCHAR *fn, const TCHAR *str, int fptr, int *ofs)
+int CEXEBuild::resolve_call_int(const TCHAR *fn, const TCHAR *str, int fptr, int *ofs, section*caller)
 {
   if (fptr < 0) return 0;
   int nf=cur_functions->getlen()/sizeof(section);
@@ -1468,7 +1468,8 @@
     if (sec->name_ptr>0 && sec->name_ptr == fptr)
     {
       ofs[0]=sec->code;
-      sec->flags++;
+      if (caller != sec) // Don't increase refcount for "Call ${__FUNCTION__}" recursive functions
+        sec->flags++;
       return 0;
     }
     sec++;
@@ -1477,8 +1478,12 @@
   ERROR_MSG(_T("Note: uninstall functions must begin with \"un.\", and install functions must not\n"));
   return 1;
 }
+int CEXEBuild::resolve_call_int(const TCHAR *fn, const TCHAR *str, int fptr, int *ofs)
+{
+  return resolve_call_int(fn, str, fptr, ofs, 0);
+}

-int CEXEBuild::resolve_instruction(const TCHAR *fn, const TCHAR *str, entry *w, int offs, int start, int end)
+int CEXEBuild::resolve_instruction(const TCHAR *fn, const TCHAR *str, entry *w, int offs, int start, int end, section*caller)
 {
   if (w->which == EW_NOP)
   {
@@ -1531,7 +1536,7 @@
     }
     else
     {
-      if (w->offsets[0] >= 0 && resolve_call_int(fn,str,w->offsets[0],w->offsets)) return 1;
+      if (w->offsets[0] >= 0 && resolve_call_int(fn,str,w->offsets[0],w->offsets, caller)) return 1;
       // if w->offsets[0] >= 0, EW_CALL requires that it 1-based.
       // otherwise, if < 0, it needs an increment anyway (since it
       // was encoded with a -2 base, to prevent it looking like an
@@ -1562,6 +1567,10 @@
 #endif
   return 0;
 }
+int CEXEBuild::resolve_instruction(const TCHAR *fn, const TCHAR *str, entry *w, int offs, int start, int end)
+{
+  return resolve_instruction(fn,str,w,offs,start,end,0);
+}

 int CEXEBuild::resolve_coderefs(const TCHAR *str)
 {
@@ -1577,7 +1586,7 @@
       {
         TCHAR fname[1024];
         wsprintf(fname,_T("function \"%") NPRIs _T("\""),ns_func.get()+sec->name_ptr);
-        if (resolve_instruction(fname,str,w+x,x,sec->code,sec->code+sec->code_size)) return 1;
+        if (resolve_instruction(fname,str,w+x,x,sec->code,sec->code+sec->code_size,sec)) return 1;
       }
       sec++;
     }
Index: Source/build.h
===================================================================
--- Source/build.h  (revision 6541)
+++ Source/build.h  (working copy)
@@ -298,7 +298,9 @@
     int UpdatePEHeader();

     int resolve_jump_int(const TCHAR *fn, int *a, int offs, int start, int end);
+    int resolve_call_int(const TCHAR *fn, const TCHAR *str, int fptr, int *ofs, section*caller);
     int resolve_call_int(const TCHAR *fn, const TCHAR *str, int fptr, int *ofs);
+    int resolve_instruction(const TCHAR *fn, const TCHAR *str, entry *w, int offs, int start, int end, section*caller);
     int resolve_instruction(const TCHAR *fn, const TCHAR *str, entry *w, int offs, int start, int end);

     int resolve_coderefs(const TCHAR *str);

I'm not sure if this is the best way to deal with this but dealing with it in TOK_CALL does not seem possible.

Discussion


Log in to post a comment.