.const .Integer P0 = "42" # PASM
.const .Integer i = "42" # PIR
.const Integer i = "42" # PIR
Caveat: don't use this yet, the PMC constants vanish after the first GC
sweep. See below.
The constant has to be a double-quoted string. E.g.
.const FixedIntegerArray a = "[2,3,4]"
A PMC class that supports this feature has to implement:
- freeze/thaw for getting the value to/from bytecode
- the instantiate constructor, which is called with one STRING argument
in S5 aka REG_STR(5) (see integer.pmc). It has to parse the string and
create an appropriate PMC.
We already had this construct for subroutines:
.const .Sub f = "foo"
which is actually:
set_p_pc f, pmc_constant_of_sub_foo
2) as PMC constants should work from .PBC files too, PMC constants
including subroutine PMCs are now serialized using the freeze/thaw
mechanism.
3) TODO items:
I really want to have these constants live in the constant PMC pool. The
constructor would then be a new VTABLE C<instantiate_constant> or some
such. For now they are plain PMCs, but *not* marked during DOD, so don't
use it for now. As a short-term solution we could of course scan the
constant table and mark PMC items.
This also implies that attaching non-constant items to constant PMCs is
illegal, e.g. setting properties on Sub PMCs. If you want to do this the
PMC constant has to be cloned first.
Second: to protect these PMCs from any modification, a VTABLE variant
should be swapped in that has all VTABLE slots that modify the PMC
redirected to an error function:
"Modification of a read-only value attempted at ..."
There is an experimental feature for such a scheme in the SArray PMC:
pmclass SArray const_too ...
^^^^^^^^^
This creates a second PMC class ConstSArray with a distinct type enum.
But that's basically a bad hack, e.g. the type list in classes/pmc.num
must contain an entry for that class too.
I'm not quite sure, if such read-only PMC variants should have a
separate class type enum or just a different vtable.
We need this anyway for perl6:
sub foo($a is ro, ...)
The PMC compiler already has a list of methods that modify the PMC, we
just need a scheme to create these vtable variants in a more general way.
Comments, proposals, takers ;) welcome,
leo