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
#define set_object(x, y) internal_set_object (ly_symbol2scm (x), y)
#define del_property(x) internal_del_property (ly_symbol2scm (x))
-#ifndef NDEBUG
+#ifdef DEBUG
/*
TODO: include modification callback support here, perhaps
through intermediate Grob::instrumented_set_property( .. __LINE__ ).
} \
}
+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 */