]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/include/lily-guile-macros.hh
Add '-dcrop' option to ps and svg backends
[lilypond.git] / lily / include / lily-guile-macros.hh
index ef48650353f93c103d479790c6fa5bab213dd2c7..869a52af327c137a72b634e8ac837630f94acfd8 100644 (file)
@@ -99,28 +99,6 @@ scm_or_str2symbol (SCM s)
 inline SCM ly_symbol2scm (char const *x) { return scm_from_utf8_symbol ((x)); }
 #endif
 
-/*
-  we don't have to protect the result; it's already part of the
-  exports list of the module.
-*/
-
-#define ly_lily_module_constant(x)                                      \
-  ({                                                                    \
-    static SCM cached;                                                  \
-    /* We store this one locally, since G++ -O2 fucks up else */        \
-    SCM value = cached;                                                 \
-    if (__builtin_constant_p ((x)))                                     \
-      {                                                                 \
-        if (!SCM_UNPACK (cached))                                       \
-          value = cached =                                              \
-            scm_variable_ref (scm_c_module_lookup (global_lily_module, (x))); \
-      }                                                                 \
-    else                                                                \
-      value =                                                           \
-        scm_variable_ref (scm_c_module_lookup (global_lily_module, (x))); \
-    value;                                                              \
-  })
-
 /*
   Adds the NAME as a Scheme function, and a variable to store the SCM
   version of the function in the static variable NAME_proc
@@ -235,23 +213,28 @@ void ly_check_name (const string &cxx, const string &fname);
       }                                                                 \
   }
 
+template <class T>
+T *unsmob (SCM var);
+
 void ly_wrong_smob_arg (bool pred (SCM), SCM var, int number, const char *fun);
 
+// Do not call this directly.
+// Use LY_ASSERT_SMOB() which supplies the function name automatically.
+template <class T>
+inline T *ly_assert_smob (SCM var, int number, const char *fun)
+{
+  T *smob = unsmob<T> (var);
+  if (smob)
+    return smob;
+
+  ly_wrong_smob_arg (T::is_smob, var, number, fun);
+  return 0;
+}
+
 // Could be just implemented using LY_ASSERT_TYPE, but this variant
 // saves a slight amount of code
 
 #define LY_ASSERT_SMOB(klass, var, number)                              \
-  {                                                                     \
-    if (!klass::is_smob (var))                                          \
-      ly_wrong_smob_arg (klass::is_smob, var, number, __FUNCTION__);    \
-  }
-
-// This variant is for the case where klass::unsmob might actually be
-// situated in a base class of klass
-#define LY_ASSERT_DERIVED_SMOB(klass, var, number)                      \
-  {                                                                     \
-    if (!derived_unsmob<klass> (var))                                   \
-      ly_wrong_smob_arg (klass::is_smob, var, number, __FUNCTION__);    \
-  }
+  ly_assert_smob<klass> (var, number, __FUNCTION__)
 
 #endif /* LILY_GUILE_MACROS_HH */