#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

Reply via email to