This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
SV_CONST(name) and PL_sv_consts
authorRuslan Zakirov <ruz@bestpractical.com>
Mon, 25 Mar 2013 01:31:35 +0000 (05:31 +0400)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 30 Jun 2013 18:43:41 +0000 (11:43 -0700)
SV_CONST(XXX) returns SV* that contains "XXX" string.
SVs are built on demand and stored in interp's structure
for re-use. All SVs have precomputed hash value.

Creates SVs on demand, we don't want 35 SV created during
compile time or cloned during thread creation.

embedvar.h
intrpvar.h
perl.c
sv.c
sv.h

index 808d497..0c34c0f 100644 (file)
 #define PL_subline             (vTHX->Isubline)
 #define PL_subname             (vTHX->Isubname)
 #define PL_sv_arenaroot                (vTHX->Isv_arenaroot)
+#define PL_sv_consts           (vTHX->Isv_consts)
 #define PL_sv_count            (vTHX->Isv_count)
 #define PL_sv_no               (vTHX->Isv_no)
 #define PL_sv_objcount         (vTHX->Isv_objcount)
index 1d29519..6a0fd10 100644 (file)
@@ -775,6 +775,8 @@ PERLVARI(I, xmlfp,  PerlIO *, NULL)
 PERLVARI(I, sv_serial, U32,    0)      /* SV serial number, used in sv.c */
 #endif
 
+PERLVARA(I, sv_consts, SV_CONSTS_COUNT, SV*)   /* constant SVs with precomputed hash value */
+
 /* If you are adding a U8 or U16, check to see if there are 'Space' comments
  * above on where there are gaps which currently will be structure padding.  */
 
diff --git a/perl.c b/perl.c
index 41b0a64..90b5695 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -308,6 +308,8 @@ perl_construct(pTHXx)
     HvSHAREKEYS_off(PL_strtab);                        /* mandatory */
     hv_ksplit(PL_strtab, 512);
 
+    Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*);
+
 #if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
     _dyld_lookup_and_bind
        ("__environ", (unsigned long *) &environ_pointer, NULL);
@@ -1081,6 +1083,12 @@ perl_destruct(pTHXx)
     sys_intern_clear();
 #endif
 
+    /* constant strings */
+    for (i = 0; i < SV_CONSTS_COUNT; i++) {
+        SvREFCNT_dec(PL_sv_consts[i]);
+        PL_sv_consts[i] = NULL;
+    }
+
     /* Destruct the global string table. */
     {
        /* Yell and reset the HeVAL() slots that are still holding refcounts,
diff --git a/sv.c b/sv.c
index 6306707..ec70030 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -13388,6 +13388,8 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
 
+    Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*);
+
     /* This PV will be free'd special way so must set it same way op.c does */
     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
diff --git a/sv.h b/sv.h
index 98d712d..0c1ded6 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -2207,6 +2207,54 @@ Evaluates I<sv> more than once.  Sets I<len> to 0 if C<SvOOK(sv)> is false.
 
 #define newIO()        MUTABLE_IO(newSV_type(SVt_PVIO))
 
+#define SV_CONST(name) \
+       PL_sv_consts[SV_CONST_##name] \
+               ? PL_sv_consts[SV_CONST_##name] \
+               : (PL_sv_consts[SV_CONST_##name] = newSVpv_share(#name, 0))
+
+#define SV_CONST_TIESCALAR 0
+#define SV_CONST_TIEARRAY 1
+#define SV_CONST_TIEHASH 2
+#define SV_CONST_TIEHANDLE 3
+
+#define SV_CONST_FETCH 4
+#define SV_CONST_FETCHSIZE 5
+#define SV_CONST_STORE 6
+#define SV_CONST_STORESIZE 7
+#define SV_CONST_EXISTS 8
+
+#define SV_CONST_PUSH 9
+#define SV_CONST_POP 10
+#define SV_CONST_SHIFT 11
+#define SV_CONST_UNSHIFT 12
+#define SV_CONST_SPLICE 13
+#define SV_CONST_EXTEND 14
+
+#define SV_CONST_FIRSTKEY 15
+#define SV_CONST_NEXTKEY 16
+#define SV_CONST_SCALAR 17
+
+#define SV_CONST_OPEN 18
+#define SV_CONST_WRITE 19
+#define SV_CONST_PRINT 20
+#define SV_CONST_PRINTF 21
+#define SV_CONST_READ 22
+#define SV_CONST_READLINE 23
+#define SV_CONST_GETC 24
+#define SV_CONST_SEEK 25
+#define SV_CONST_TELL 26
+#define SV_CONST_EOF 27
+#define SV_CONST_BINMODE 28
+#define SV_CONST_FILENO 29
+#define SV_CONST_CLOSE 30
+
+#define SV_CONST_DELETE 31
+#define SV_CONST_CLEAR 32
+#define SV_CONST_UNTIE 33
+#define SV_CONST_DESTROY 34
+
+#define SV_CONSTS_COUNT 35
+
 /*
  * Local variables:
  * c-indentation-style: bsd