HTTP/1.1 -1 Read error in cache disk data: SuccessContent-Type: text/plain; charset="utf-8" Last-Modified: Sat, 22 Jan 2022 04:12:07 GMT Content-length: 3263 Connection: Close Proxy-Connection: Close X-Cache: HIT from web1.osuosl.org Server: ProxyTrack 0.5 (HTTrack 3.49.2) == Intro == The PMC Union is being deprecated, which means that any instances of PMC_int_val, etc need to disappear. This is a big job with several gotchas. == Why == from #parrotsketch: {{{ cotto> allison, what's your reason for deprecating the PMC UnionVal? (I can see some reasons of my own, I'm just curious what you see.) chromatic> It's typeunsafe and it's a premature optimization. chromatic> It makes PIR-level subclassing Very Difficult. allison> cotto: it prevents subclassing, for one (because the child may be trying to use the union val differently) cotto> thanks. eoq allison> cotto: and just generally dangerous, to be using blobs of memory like that chromatic> It violates encapsulation. allison> chromatic: yes, those too NotFound> And it increases coupling between pmcs allison> cotto: it also bloats the PMC header structure }}} == What Needs to Happen == The following PMCs should be straightforward to convert to ATTRs. If a PMC has a certain macro listed, only convert uses of that macro to ATTRs for the PMC. Other !UnionVal macros have depenency issues which are not yet resolvable. ||PMC||status|| ||!BigInt||fixed in r35664|| ||Continuation (PMC_pmc_val only)||removed in r35712|| ||Coroutine (PMC_pmc_val only)|||| ||Float||fixed in r35666|| ||!LexPad (PMC_pmc_val only)||fixed in r35669|| ||!LuaBoolean|||| ||!LuaThread|||| ||!MatchRange (PMC_int_val2 only)|||| ||!NameSpace (PMC_pmc_val only)|||| ||SArray||will be removed|| ||TQueue||fixed in r35653|| Allison [http://rt.perl.org/rt3/Ticket/Display.html?id=48014#txn-438628 explained in depth] how to convert code. Good example code can be found in src/pmc/exporter.pmc . == Inheritance == Because the PMC union struct is part of a PMC's internals, its use is affected by PMC inheritance. The following image shows the dependencies between all *core* PMCs. This does not include PMCs from HLLs. Because of these dependencies, all PMCs in a given dependency tree will have to be updated simultaneously. This only means that all instances of e.g. PMC_struct_val will have to be updated, not all instances of all PMC_x_val. [[Image(wiki:PMCUnionDeprecationTasklist:pmc_deps.png)]] == Notes == * this space intentionally left blank == Gotchas == * You may need to add certain VTABLE functions to the PMCs which you are updating. This applies not just to init and destroy, but also clone, morph and other functions that need to deal with the PMC's internal data. This is especially true if your PMC *doesn't have* an explicit clone VTABLE function. The absence of clone VTABLE function means that it's using the default clone, which works by copying the UnionVal. Such functions will *not* work properly for any PMCs which don't use the UnionVal. * Make sure that PMC_data is only used for the PMC-specific attributes struct. * Watch out for MULTI functions in base classes. This is mainly a concern when working on an extending PMC where the base PMC has a MULTI function that the extending PMC doesn't override. For example, the String PMC needs its own is_equal MULTI, since scalar's is_equal MULTI assumes that any extending PMCs use the UnionVal rather than ATTRs.t/login">Login
  • Prefe