cvsuser 03/01/11 02:59:42
Modified: classes perlhash.pmc
. headers.c packfile.c pmc.c
Log:
constant_pmc
Revision Changes Path
1.37 +3 -3 parrot/classes/perlhash.pmc
Index: perlhash.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlhash.pmc,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -w -r1.36 -r1.37
--- perlhash.pmc 10 Jan 2003 17:04:03 -0000 1.36
+++ perlhash.pmc 11 Jan 2003 10:59:33 -0000 1.37
@@ -1,7 +1,7 @@
/* perlhash.pmc
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: perlhash.pmc,v 1.36 2003/01/10 17:04:03 leo Exp $
+ * $Id: perlhash.pmc,v 1.37 2003/01/11 10:59:33 leo Exp $
* Overview:
* These are the vtable functions for the PerlHash base class
* Data Structure and Algorithms:
@@ -36,8 +36,8 @@
}
void init () {
if (undef == NULL) {
- undef = pmc_new(INTERP, enum_class_PerlUndef);
- PObj_constant_SET(undef);
+ undef = constant_pmc_new_noinit(INTERP, enum_class_PerlUndef);
+ undef->vtable->init(INTERP, undef);
}
PObj_custom_mark_SET(SELF);
new_hash(INTERP, (HASH **)&SELF->data);
1.31 +12 -6 parrot/headers.c
Index: headers.c
===================================================================
RCS file: /cvs/public/parrot/headers.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -w -r1.30 -r1.31
--- headers.c 4 Jan 2003 11:34:51 -0000 1.30
+++ headers.c 11 Jan 2003 10:59:41 -0000 1.31
@@ -1,7 +1,7 @@
/* headers.c
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: headers.c,v 1.30 2003/01/04 11:34:51 leo Exp $
+ * $Id: headers.c,v 1.31 2003/01/11 10:59:41 leo Exp $
* Overview:
* Header management functions. Handles getting of various headers,
* and pool creation
@@ -28,6 +28,7 @@
# define STRING_HEADERS_PER_ALLOC 512
#endif /* GC_IS_MALLOC */
+# define CONSTANT_PMC_HEADERS_PER_ALLOC 64
/** PMC Header Functions for small-object lookup table **/
void
@@ -380,6 +381,9 @@
/* Init the PMC header pool */
interpreter->arena_base->pmc_pool = new_pmc_pool(interpreter);
+ interpreter->arena_base->constant_pmc_pool = new_pmc_pool(interpreter);
+ interpreter->arena_base->constant_pmc_pool->objects_per_alloc =
+ CONSTANT_PMC_HEADERS_PER_ALLOC;
}
void
@@ -397,15 +401,17 @@
start = 2;
#endif
for (i = start; i <= 2; i++) {
- for (j = -2; j < (INTVAL)interpreter->arena_base->num_sized; j++) {
- if (j == -2)
- pool = interpreter->arena_base->constant_string_header_pool;
- else if (j == -1)
+ for (j = -3; j < (INTVAL)interpreter->arena_base->num_sized; j++) {
+ if (j == -3)
+ pool = interpreter->arena_base->constant_pmc_pool;
+ else if (j == -2)
pool = interpreter->arena_base->pmc_pool;
+ else if (j == -1)
+ pool = interpreter->arena_base->constant_string_header_pool;
else
pool = interpreter->arena_base->sized_header_pools[j];
if (pool) {
- if (j == -1) {
+ if (j <= -2) {
if (i == 2)
free_unused_pobjects(interpreter, pool);
}
1.63 +4 -4 parrot/packfile.c
Index: packfile.c
===================================================================
RCS file: /cvs/public/parrot/packfile.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -w -r1.62 -r1.63
--- packfile.c 10 Dec 2002 16:40:32 -0000 1.62
+++ packfile.c 11 Jan 2003 10:59:41 -0000 1.63
@@ -7,7 +7,7 @@
** This program is free software. It is subject to the same
** license as Parrot itself.
**
-** $Id: packfile.c,v 1.62 2002/12/10 16:40:32 leo Exp $
+** $Id: packfile.c,v 1.63 2003/01/11 10:59:41 leo Exp $
**
** History:
** Rework by Melvin; new bytecode format, make bytecode portable.
@@ -971,14 +971,14 @@
while (components-- > 0) {
if (tail) {
- tail->data = key_new(interpreter);
+ tail->data = constant_pmc_new_noinit(interpreter, enum_class_Key);
tail = tail->data;
}
else {
- head = tail = key_new(interpreter);
+ head = tail = constant_pmc_new_noinit(interpreter, enum_class_Key);
}
- PObj_constant_SET(tail);
+ tail->vtable->init(interpreter, tail);
switch (*cursor++) {
case PARROT_ARG_IC:
1.21 +24 -20 parrot/pmc.c
Index: pmc.c
===================================================================
RCS file: /cvs/public/parrot/pmc.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -w -r1.20 -r1.21
--- pmc.c 2 Nov 2002 14:57:47 -0000 1.20
+++ pmc.c 11 Jan 2003 10:59:41 -0000 1.21
@@ -1,7 +1,7 @@
/* pmc.c
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: pmc.c,v 1.20 2002/11/02 14:57:47 josh Exp $
+ * $Id: pmc.c,v 1.21 2003/01/11 10:59:41 leo Exp $
* Overview:
* The base vtable calling functions.
* Data Structure and Algorithms:
@@ -29,7 +29,16 @@
PMC *
pmc_new(struct Parrot_Interp *interpreter, INTVAL base_type)
{
- PMC *pmc = new_pmc_header(interpreter);
+ PMC *pmc = pmc_new_noinit(interpreter, base_type);
+ pmc->vtable->init(interpreter, pmc);
+ return pmc;
+}
+
+static PMC*
+get_new_pmc_header(struct Parrot_Interp *interpreter, INTVAL base_type,
+ struct Small_Object_Pool *pool)
+{
+ PMC *pmc = get_free_pmc(interpreter, pool);
if (!pmc) {
internal_exception(ALLOCATION_ERROR,
@@ -47,8 +56,6 @@
return NULL;
}
- pmc->vtable->init(interpreter, pmc);
-
return pmc;
}
@@ -66,27 +73,24 @@
PMC *
pmc_new_noinit(struct Parrot_Interp *interpreter, INTVAL base_type)
{
- PMC *pmc = new_pmc_header(interpreter);
-
- if (!pmc) {
- internal_exception(ALLOCATION_ERROR,
- "Parrot VM: PMC allocation failed!\n");
- return NULL;
+ return get_new_pmc_header(interpreter, base_type,
+ interpreter->arena_base->pmc_pool);
}
- pmc->vtable = &(Parrot_base_vtables[base_type]);
+/*=for api pmc constant_pmc_new_noinit
- if (!pmc->vtable || !pmc->vtable->init) {
- /* This is usually because you either didn't call init_world early
- * enough or you added a new PMC class without adding
- * Parrot_(classname)_class_init to init_world. */
- PANIC("Null vtable used");
- return NULL;
- }
+ Creates a new constant PMC of type C<base_type>
+=cut
+*/
+PMC *
+constant_pmc_new_noinit(struct Parrot_Interp *interpreter, INTVAL base_type)
+{
+ PMC *pmc = get_new_pmc_header(interpreter, base_type,
+ interpreter->arena_base->constant_pmc_pool);
+ PObj_constant_SET(pmc);
return pmc;
}
-
/*=for api pmc pmc_new_init
As C<pmc_new>, but passes C<init> to the PMC's C<init_pmc> method.