]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4152: Eliminate "will never be null" warnings in smobs.tcc
authorDavid Kastrup <dak@gnu.org>
Sat, 4 Oct 2014 08:11:59 +0000 (10:11 +0200)
committerDavid Kastrup <dak@gnu.org>
Thu, 9 Oct 2014 11:24:56 +0000 (13:24 +0200)
Hopefully this will no longer cause spurious warnings with g++ 4.7.

lily/include/small-smobs.hh
lily/include/smobs.hh
lily/include/smobs.tcc

index a752662c1e534da09c82336d8be22b7bd71f4e69..fa63af9a90057672fb18c86df2c17c55dcad7919 100644 (file)
@@ -32,7 +32,6 @@ public:
   static SCM make_smob (SCM arg1 = SCM_UNDEFINED) {
     SCM_RETURN_NEWSMOB (Smob_base<Super>::smob_tag (), SCM_UNPACK (arg1));
   }
-  static const int free_smob = 0;
   SCM mark_smob () { return scm1 (); };
   static Super *unchecked_unsmob (SCM s) {
     return reinterpret_cast<Super *> (SCM_UNPACK (s));
@@ -53,7 +52,6 @@ public:
                          SCM_UNPACK (arg1),
                          SCM_UNPACK (arg2));
   }
-  static const int free_smob = 0;
   SCM mark_smob ()
   {
     scm_gc_mark (scm2 ());
@@ -82,7 +80,6 @@ public:
                          SCM_UNPACK (arg2),
                          SCM_UNPACK (arg3));
   }
-  static const int free_smob = 0;
   static SCM mark_smob (SCM s)
   {
     scm_gc_mark (scm3 ());
index f9eeed7f85545e8dc9a5b4c539129bd51a09178c..bc4b61d7fd491218d7fe45fe9c4140fc9aa8c373 100644 (file)
@@ -172,25 +172,20 @@ private:
   // (where it will mask the private template member) rather than
   // specializing a different template function/pointer.
   //
-  // Since we consider those internal-only, two of them are actually
-  // implemented as literal zero constant.  That allows us to fall
-  // back to GUILE's default implementation.  Arguably the same could
-  // be done for print_smob, but the resulting default output of, say,
-  // #<Context_mod 0x7352414> would depend on memory layout, thus
-  // being unsuitable for regtest comparisons unless filtered.
-
-  SCM mark_smob (void); // Should not be inline since we do an address
-                        // comparison
+  // Most default functions are do-nothings.  void init() will
+  // recognize their address when not overriden and will then refrain
+  // altogether from passing the the respective callbacks to GUILE.
+  SCM mark_smob (void);
   static SCM mark_trampoline (SCM); // Used for calling mark_smob
-  static const int equal_p = 0;
-  static const int smob_proc = 0;
-  static const int smob_proc_signature_ = 0;
+  static size_t free_smob (SCM obj);
+  static SCM equal_p (SCM, SCM);
+
+  // print_smob is the exception.  It is unconditionally passed to
+  // GUILE since the default output of, say, #<Context_mod 0x7352414>
+  // would depend on memory layout, thus being unsuitable for regtest
+  // comparisons unless filtered.
   static int print_smob (SCM, SCM, scm_print_state *);
-  static size_t free_smob (SCM obj)
-  {
-    delete Smob_base<Super>::unregister_ptr (obj);
-    return 0;
-  }
+
   // type_p_name_ can be overriden in the Super class with a static
   // const char [] string.  This requires both a declaration in the
   // class as well as a single instantiation outside.  Using a
@@ -201,12 +196,13 @@ private:
   // in a single compilation unit.  That requires just as much source
   // code maintenance while being harder to understand and quite
   // trickier in its failure symptoms when things go wrong.  So we
-  // just do things like with the other specializations.
+  // just use a static zero as "not here" indication.
   static const int type_p_name_ = 0;
-  // This macro is used in the Super class definition for making a
-  // smob callable like a function.  Declaration has to be public.  It
-  // may be either be completed with a semicolon in which case a
-  // definition of the member function smob_proc has to be done
+
+  // LY_DECLARE_SMOB_PROC is used in the Super class definition for
+  // making a smob callable like a function.  Declaration has to be
+  // public.  It may be either be completed with a semicolon in which
+  // case a definition of the member function smob_proc has to be done
   // outside of the class body, or the semicolon is left off and an
   // inline function body is added immediately below.  It would be
   // nice if this were a non-static member function but it would seem
@@ -215,8 +211,15 @@ private:
 #define LY_DECLARE_SMOB_PROC(REQ, OPT, VAR, ARGLIST)                    \
   static const int smob_proc_signature_ = ((REQ)<<8)|((OPT)<<4)|(VAR);  \
   static SCM smob_proc ARGLIST
+
   // a separate LY_DEFINE_SMOB_PROC seems sort of pointless as it
   // would just result in SCM CLASS::smob_proc ARGLIST
+  //
+  // The default case without function functionality is recognized by
+  // smob_proc_signature being -1.
+  static const int smob_proc = 0;
+  static const int smob_proc_signature_ = -1;
+
 public:
   static bool is_smob (SCM s)
   {
@@ -232,10 +235,15 @@ public:
   }
 };
 
-
+// Simple smobs
 template <class Super>
 class Simple_smob : public Smob_base<Super> {
 public:
+  static size_t free_smob (SCM obj)
+  {
+    delete Smob_base<Super>::unregister_ptr (obj);
+    return 0;
+  }
   SCM smobbed_copy () const
   {
     Super *p = new Super(*static_cast<const Super *> (this));
@@ -252,6 +260,11 @@ private:
   SCM self_scm_;
   SCM protection_cons_;
 public:
+  static size_t free_smob (SCM obj)
+  {
+    delete Smob_base<Super>::unregister_ptr (obj);
+    return 0;
+  }
   SCM unprotected_smobify_self ()
   {
     self_scm_ = SCM_UNDEFINED;
index eaec076de349442b1b4726e07f71c1160e097b76..f927d481d422fda55fd75bdaf502786eb5675d7d 100644 (file)
@@ -49,7 +49,7 @@ Smob_base<Super>::register_ptr (Super *p)
   return s;
 }
 
-// Default, should not actually get called
+// Defaults, should not actually get called
 template <class Super>
 SCM
 Smob_base<Super>::mark_smob ()
@@ -57,6 +57,22 @@ Smob_base<Super>::mark_smob ()
   return SCM_UNSPECIFIED;
 }
 
+template <class Super>
+size_t
+Smob_base<Super>::free_smob (SCM)
+{
+  return 0;
+}
+
+template <class Super>
+SCM
+Smob_base<Super>::equal_p (SCM, SCM)
+{
+  return SCM_BOOL_F;
+}
+
+// Default, will often get called
+
 template <class Super>
 int
 Smob_base<Super>::print_smob (SCM, SCM p, scm_print_state *)
@@ -103,13 +119,12 @@ void Smob_base<Super>::init ()
   // While that's not a consideration for type_p_name_, it's easier
   // doing it like the rest.
 
-  if (Super::free_smob != 0)
+  if (&Super::free_smob != &Smob_base<Super>::free_smob)
     scm_set_smob_free (smob_tag_, Super::free_smob);
   if (&Super::mark_smob != &Smob_base<Super>::mark_smob)
     scm_set_smob_mark (smob_tag_, Super::mark_trampoline);
-  if (Super::print_smob != 0)
-    scm_set_smob_print (smob_tag_, Super::print_smob);
-  if (Super::equal_p != 0)
+  scm_set_smob_print (smob_tag_, Super::print_smob);
+  if (&Super::equal_p != &Smob_base<Super>::equal_p)
     scm_set_smob_equalp (smob_tag_, Super::equal_p);
   if (Super::type_p_name_ != 0)
     {
@@ -122,7 +137,7 @@ void Smob_base<Super>::init ()
       scm_c_export (Super::type_p_name_, NULL);
     }
   ly_add_type_predicate ((void *) is_smob, smob_name_.c_str ());
-  if (Super::smob_proc != 0)
+  if (Super::smob_proc_signature_ >= 0)
     scm_set_smob_apply (smob_tag_,
                         (scm_t_subr)Super::smob_proc,
                         Super::smob_proc_signature_ >> 8,