* gnu/packages/patches/swig-guile-gc.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/swig.scm (swig)[source](patches): Use it.
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
Fix garbage collection for Guile versions >= 2.0.12.  This issue showed
 | 
						|
up when running the tests on i686-linux.
 | 
						|
 | 
						|
Taken from this upstream commit:
 | 
						|
https://github.com/swig/swig/commit/38f2ab0c30e369e63bbd0a6152108488d0de68e1
 | 
						|
 | 
						|
diff --git a/Lib/guile/guile_scm_run.swg b/Lib/guile/guile_scm_run.swg
 | 
						|
index 274f197158..0d04cb7c62 100644
 | 
						|
--- a/Lib/guile/guile_scm_run.swg
 | 
						|
+++ b/Lib/guile/guile_scm_run.swg
 | 
						|
@@ -99,6 +99,7 @@ SWIG_Guile_scm2newstr(SCM str, size_t *len) {
 | 
						|
 static int swig_initialized = 0;
 | 
						|
 static scm_t_bits swig_tag = 0;
 | 
						|
 static scm_t_bits swig_collectable_tag = 0;
 | 
						|
+static scm_t_bits swig_finalized_tag = 0;
 | 
						|
 static scm_t_bits swig_destroyed_tag = 0;
 | 
						|
 static scm_t_bits swig_member_function_tag = 0;
 | 
						|
 static SCM swig_make_func = SCM_EOL;
 | 
						|
@@ -163,7 +164,19 @@ SWIG_Guile_PointerType(SCM object)
 | 
						|
   }
 | 
						|
   else scm_wrong_type_arg("SWIG-Guile-PointerType", 1, object);
 | 
						|
 }
 | 
						|
-  
 | 
						|
+
 | 
						|
+SWIGINTERN int
 | 
						|
+SWIG_Guile_IsValidSmob(SCM smob)
 | 
						|
+{
 | 
						|
+  /* We do not accept smobs representing destroyed pointers, but we have to
 | 
						|
+     allow finalized smobs because Guile >= 2.0.12 sets all smob instances
 | 
						|
+     to the 'finalized' type before calling their 'free' function. This change
 | 
						|
+     was introduced to Guile in commit 8dff3af087c6eaa83ae0d72aa8b22aef5c65d65d */
 | 
						|
+  return SCM_SMOB_PREDICATE(swig_tag, smob)
 | 
						|
+    || SCM_SMOB_PREDICATE(swig_collectable_tag, smob)
 | 
						|
+    || SCM_SMOB_PREDICATE(swig_finalized_tag, smob);
 | 
						|
+}
 | 
						|
+
 | 
						|
 SWIGINTERN int
 | 
						|
 SWIG_Guile_ConvertPtr(SCM s, void **result, swig_type_info *type, int flags)
 | 
						|
 {
 | 
						|
@@ -179,8 +192,7 @@ SWIG_Guile_ConvertPtr(SCM s, void **result, swig_type_info *type, int flags)
 | 
						|
     *result = SCM_POINTER_VALUE(s);
 | 
						|
     return SWIG_OK;
 | 
						|
 #endif /* if SCM_MAJOR_VERSION >= 2 */
 | 
						|
-  } else if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob)) {
 | 
						|
-    /* we do not accept smobs representing destroyed pointers */
 | 
						|
+  } else if (SWIG_Guile_IsValidSmob(smob)) {
 | 
						|
     from = (swig_type_info *) SCM_CELL_WORD_2(smob);
 | 
						|
     if (!from) return SWIG_ERROR;
 | 
						|
     if (type) {
 | 
						|
@@ -239,7 +251,7 @@ SWIG_Guile_MarkPointerNoncollectable(SCM s)
 | 
						|
 {
 | 
						|
   SCM smob = SWIG_Guile_GetSmob(s);
 | 
						|
   if (!SCM_NULLP(smob)) {
 | 
						|
-    if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob)) {
 | 
						|
+    if (SWIG_Guile_IsValidSmob(smob)) {
 | 
						|
       SCM_SET_CELL_TYPE(smob, swig_tag);
 | 
						|
     }
 | 
						|
     else scm_wrong_type_arg(NULL, 0, s);
 | 
						|
@@ -252,7 +264,7 @@ SWIG_Guile_MarkPointerDestroyed(SCM s)
 | 
						|
 {
 | 
						|
   SCM smob = SWIG_Guile_GetSmob(s);
 | 
						|
   if (!SCM_NULLP(smob)) {
 | 
						|
-    if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob)) {
 | 
						|
+    if (SWIG_Guile_IsValidSmob(smob)) {
 | 
						|
       SCM_SET_CELL_TYPE(smob, swig_destroyed_tag);
 | 
						|
     }
 | 
						|
     else scm_wrong_type_arg(NULL, 0, s);
 | 
						|
@@ -419,6 +431,8 @@ SWIG_Guile_Init ()
 | 
						|
     scm_set_smob_print(swig_collectable_tag, print_collectable_swig);
 | 
						|
     scm_set_smob_equalp(swig_collectable_tag, equalp_swig);
 | 
						|
     scm_set_smob_free(swig_collectable_tag, free_swig);
 | 
						|
+    /* For Guile >= 2.0.12. See libguile/smob.c:clear_smobnum */
 | 
						|
+    swig_finalized_tag = swig_collectable_tag & ~0xff00;
 | 
						|
   }
 | 
						|
   if (ensure_smob_tag(swig_module, &swig_destroyed_tag,
 | 
						|
 		      "destroyed-swig-pointer", "destroyed-swig-pointer-tag")) {
 |