This patch speeds up the following program 4 times by attaching compiled
re to the SV.

  $_ = 'quick brown fox jumped over a fence'; 
  @r = map "\\b$_\\b", split; 
  $c = 10000; 
  while ($c--) {
    for $p (@r) { /$p/ }
  }

I noticed no negative sideeffects, but did not try exhausting speed tests.

Enjoy,
Ilya

--- ./sv.c~	Thu Mar  5 14:04:08 1998
+++ ./sv.c	Mon Mar 16 07:04:44 1998
@@ -2530,6 +2530,7 @@ sv_magic(register SV *sv, SV *obj, int h
 	mg->mg_virtual = &vtbl_packelem;
 	break;
     case 'r':
+	SvRMAGICAL_on(sv);
 	mg->mg_virtual = &vtbl_regexp;
 	break;
     case 'S':
--- ./proto.h~	Fri Mar  6 04:35:24 1998
+++ ./proto.h	Mon Mar 16 06:45:24 1998
@@ -252,6 +252,7 @@ int	magic_setuvar	_((SV* sv, MAGIC* mg))
 int	magic_setvec	_((SV* sv, MAGIC* mg));
 int	magic_set_all_env _((SV* sv, MAGIC* mg));
 U32	magic_sizepack	_((SV* sv, MAGIC* mg));
+int	magic_unchain	_((SV* sv, MAGIC* mg));
 int	magic_wipepack	_((SV* sv, MAGIC* mg));
 void	magicname _((char* sym, char* name, I32 namlen));
 int	main _((int argc, char** argv, char** env));
--- ./pp_ctl.c~	Thu Mar  5 14:05:04 1998
+++ ./pp_ctl.c	Mon Mar 16 06:44:54 1998
@@ -73,8 +73,8 @@ PP(pp_regcomp) {
     MAGIC *mg = Null(MAGIC*);
 
     tmpstr = POPs;
-    if(SvROK(tmpstr)) {
-	SV *sv = SvRV(tmpstr);
+    if(SvROK(tmpstr) || SvRMAGICAL(tmpstr)) {
+	SV *sv = SvROK(tmpstr) ? SvRV(tmpstr) : tmpstr;
 	if(SvMAGICAL(sv))
 	    mg = mg_find(sv, 'r');
     }
@@ -99,6 +99,7 @@ PP(pp_regcomp) {
 
 	    pm->op_pmflags = pm->op_pmpermflags;	/* reset case sensitivity */
 	    pm->op_pmregexp = pregcomp(t, t + len, pm);
+	    sv_magic(tmpstr,(SV*)ReREFCNT_inc(pm->op_pmregexp),'r',0,0);
 	}
     }
 
--- ./global.sym~	Thu Mar  5 13:11:26 1998
+++ ./global.sym	Mon Mar 16 06:42:34 1998
@@ -416,6 +416,7 @@ magic_settaint
 magic_setuvar
 magic_setvec
 magic_sizepack
+magic_unchain
 magic_wipepack
 magicname
 markstack_grow
--- ./mg.c~	Thu Mar  5 13:11:32 1998
+++ ./mg.c	Mon Mar 16 06:41:48 1998
@@ -1375,6 +1375,13 @@ magic_freeregexp(SV *sv, MAGIC *mg)
     return 0;
 }
 
+int
+magic_unchain(SV *sv, MAGIC *mg)
+{
+    sv_unmagic(sv, mg->mg_type);
+    return 0;
+}
+
 #ifdef USE_LOCALE_COLLATE
 int
 magic_setcollxfrm(SV *sv, MAGIC *mg)
--- ./perl.h~	Thu Mar  5 14:05:04 1998
+++ ./perl.h	Mon Mar 16 06:31:22 1998
@@ -1819,7 +1819,7 @@ EXT MGVTBL vtbl_mutex =	{0,	0,	0,	0,	mag
 EXT MGVTBL vtbl_defelem = {magic_getdefelem,magic_setdefelem,
 					0,	0,	magic_freedefelem};
 
-EXT MGVTBL vtbl_regexp = {0,0,0,0, magic_freeregexp};
+EXT MGVTBL vtbl_regexp = {0,magic_unchain,0,0, magic_freeregexp};
 
 #ifdef USE_LOCALE_COLLATE
 EXT MGVTBL vtbl_collxfrm = {0,
