/*! \brief Get a schematic object from a smob. * \ingroup guile_c_iface * \par Function Description * Return the #OBJECT represented by \a smob. * * \param [in] smob Guile value to retrieve #OBJECT from. * \return the #OBJECT represented by \a smob. */ OBJECT * edascm_to_object (SCM smob) { #ifndef NDEBUG SCM_ASSERT (EDASCM_OBJECTP (smob), smob, SCM_ARG1, "edascm_to_object"); #endif EDASCM_ASSERT_SMOB_VALID (smob); return (OBJECT *) SCM_SMOB_DATA (smob); }
/*! \brief Get a smob for a schematic object. * \ingroup guile_c_iface * \par Function Description * Create a new smob representing \a object. * * \warning The returned smob is initially marked as owned by the C * code. If it should be permitted to be garbage-collected, you * should set the garbage-collectable flag by calling: * * \code * SCM x = edascm_from_object (object); * edascm_c_set_gc (x, 1); * \endcode * * \note We currently have to bake a TOPLEVEL pointer into the smob, * so that if the object becomes garbage-collectable we can obtain a * TOPLEVEL to use for deleting the smob without accessing the * TOPLEVEL fluid and potentially causing a race condition (see bug * 909358). * * \param object #OBJECT to create a smob for. * \return a smob representing \a object. */ SCM edascm_from_object (OBJECT *object) { SCM smob = smob_cache_lookup (object); if (EDASCM_OBJECTP (smob)) { return smob; } TOPLEVEL *toplevel = edascm_c_current_toplevel (); SCM_NEWSMOB2 (smob, geda_smob_tag, object, toplevel); SCM_SET_SMOB_FLAGS (smob, GEDA_SMOB_OBJECT); /* Set weak references */ s_object_weak_ref (object, smob_weakref2_notify, unpack_as_pointer (smob)); smob_cache_add (object, smob); return smob; }
/*! \brief Test whether a smob is a #OBJECT instance * \ingroup guile_c_iface * \par Function Description * If \a smob is a #OBJECT instance, returns non-zero. Otherwise, * returns zero. * * \param [in] smob Guile value to test. * * \return non-zero iff \a smob is a #OBJECT instance. */ int edascm_is_object (SCM smob) { return EDASCM_OBJECTP (smob); }