#362: optimize freeze_size
--------------------+-------------------------------------------------------
Reporter: rurban | Owner:
Type: todo | Status: new
Priority: normal | Milestone:
Component: core | Version:
Severity: medium | Keywords:
Lang: | Patch:
Platform: |
--------------------+-------------------------------------------------------
Currently creating a pbc involves freeze malloc/free for '''every'''
registered pmc, just to calculate the size of the pmc, just to help
PackFile_Constant_pack_size()
"Determines the size of the buffer needed in order to pack the PackFile
Constant into a contiguous region of memory."
The action VISIT_FREEZE_SIZE was invented a long time ago, but never
implemented.
I've added a Parrot_freeze_size() function, which should use
VISIT_FREEZE_SIZE.
Only the packfile API has _packed_size methods, the pmc's not yet.
Cooperative pmc's can also implement this action by returning the
simulated size without actual amlloc, others still do the malloc/free, and
Parrot_freeze_size will count the strlen then.
We might need a fallback scenario for old pmc's (e.g. languages) which did
not implement this interface.
And a more general architectural comment:[[BR]]
We have no pmc registration interface which handles the available methods
between the clients and core,
* to be able to handle missing methods in core,
* or use proxies for missing methods in older or newer packfiles.
A cross-version compatible packfile solution would need that.
e.g. we have only (void)info->visit_action and not
(int)info->visit_action to be able to fallback to the parent.
{{{
case VISIT_FREEZE_NORMAL:
freeze_pmc(interp, pmc, info, seen, id);
if (pmc)
info->visit_action = pmc->vtable->freeze;
break;
case VISIT_FREEZE_SIZE: /* do not actually freeze */
if (pmc && have_pmc(interp, pmc, "freeze_size", seen, id))
info->visit_action = pmc->vtable->freeze_size;
else {
freeze_pmc(interp, pmc, info, seen, id);
if (pmc)
info->visit_action = pmc->vtable->freeze;
}
break;
}}}
--
Ticket URL: <https://trac.parrot.org/parrot/ticket/362>
Parrot <https://trac.parrot.org/parrot/>
Parrot Development
_______________________________________________
parrot-tickets mailing list
[email protected]
http://lists.parrot.org/mailman/listinfo/parrot-tickets