[svn:parrot] r49366 - in branches/gsoc_nci: . compilers/imcc compilers/opsc compilers/opsc/src/Ops compilers/opsc/src/Ops/Trans compilers/pct/src/PAST compilers/pct/src/PCT compilers/pct/src/POST config/auto config/auto/llvm config/gen config/gen/config_h config/gen/makefiles config/gen/platform/ansi config/gen/platform/generic config/gen/platform/win32 config/init/hints config/inter docs docs/book/pct docs/book/pir docs/pdds docs/pdds/draft docs/pmc docs/project editor examples/benchmarks examples/compilers examples/config/file examples/io examples/japh examples/json examples/languages/squaak/doc examples/languages/squaak/src examples/namespace examples/tools ext/nqp-rx/src/stage0 include/parrot include/parrot/oplib lib/Parrot lib/Parrot/Configure lib/Parrot/Configure/Options lib/Parrot/Configure/Options/Conf lib/Parrot/Configure/Step lib/Parrot/Docs/Section lib/Parrot/Harness lib/Parrot/Pmc2c ports/debian runtime/parrot/include runtime/parrot/library runtime/parrot /library/Archive runtime/parrot/library/LWP runtime/parrot/library/Test runtime/parrot/library/Test/Builder runtime/parrot/library/URI src src/call src/dynoplibs src/dynpmc src/gc src/interp src/io src/nci src/ops src/packfile src/pmc src/runcore src/string src/string/charset src/string/encoding t t/codingstd t/compilers/imcc/syn t/compilers/opsc t/compilers/pct t/dynoplibs t/dynpmc t/examples t/library t/native_pbc t/native_pbc/testdata t/oo t/op t/op/testlib t/pmc t/pmc/testlib t/run t/src t/steps/auto t/steps/inter t/tools tools/build tools/dev tools/install tools/release tools/util

ash at svn.parrot.org ash at svn.parrot.org
Tue Sep 28 17:18:44 UTC 2010


Author: ash
Date: Tue Sep 28 17:16:52 2010
New Revision: 49366
URL: https://trac.parrot.org/parrot/changeset/49366

Log:
Merge remote branch 'trunk' into gsoc_nci

Conflicts:
	src/pmc/nci.pmc

Added:
   branches/gsoc_nci/config/auto/llvm/
   branches/gsoc_nci/config/auto/llvm.pm
   branches/gsoc_nci/config/auto/llvm/hello.c
   branches/gsoc_nci/config/gen/platform/ansi/pid.c
   branches/gsoc_nci/config/gen/platform/generic/pid.c
   branches/gsoc_nci/config/gen/platform/win32/pid.c
   branches/gsoc_nci/examples/benchmarks/boolean.pir
   branches/gsoc_nci/examples/benchmarks/stress_integers.pir
   branches/gsoc_nci/examples/tools/pgegrep
      - copied, changed from r48555, branches/gsoc_nci/tools/util/pgegrep
   branches/gsoc_nci/include/parrot/imageio.h
   branches/gsoc_nci/include/parrot/list.h
   branches/gsoc_nci/src/gc/fixed_allocator.c
   branches/gsoc_nci/src/gc/fixed_allocator.h
   branches/gsoc_nci/src/gc/gc_ms2.c
   branches/gsoc_nci/src/gc/string_gc.c
   branches/gsoc_nci/src/gc/variable_size_pool.c
   branches/gsoc_nci/src/gc/variable_size_pool.h
   branches/gsoc_nci/src/list.c
   branches/gsoc_nci/src/packfile/byteorder.h
      - copied, changed from r48555, branches/gsoc_nci/src/byteorder.c
   branches/gsoc_nci/src/pmc/imageiofreeze.pmc
   branches/gsoc_nci/src/pmc/imageiothaw.pmc
   branches/gsoc_nci/src/pmc/nativepccmethod.pmc
   branches/gsoc_nci/src/string/encoding/ascii.c
   branches/gsoc_nci/src/string/encoding/binary.c
   branches/gsoc_nci/src/string/encoding/latin1.c
   branches/gsoc_nci/src/string/encoding/shared.c
   branches/gsoc_nci/src/string/encoding/shared.h
   branches/gsoc_nci/src/string/encoding/tables.c
      - copied, changed from r48555, branches/gsoc_nci/src/string/charset/tables.c
   branches/gsoc_nci/src/string/encoding/tables.h
      - copied, changed from r48555, branches/gsoc_nci/src/string/charset/tables.h
   branches/gsoc_nci/t/examples/pgegrep.t
      - copied, changed from r48555, branches/gsoc_nci/t/tools/pgegrep.t
   branches/gsoc_nci/t/op/gc-active-buffers.t
   branches/gsoc_nci/t/op/gc-leaky-box.t
   branches/gsoc_nci/t/op/gc-leaky-call.t
   branches/gsoc_nci/t/op/gc-non-recursive.t
   branches/gsoc_nci/t/op/testlib/
   branches/gsoc_nci/t/op/testlib/test_strings.pir
   branches/gsoc_nci/t/pmc/testlib/annotations.pir
      - copied, changed from r48555, branches/gsoc_nci/t/native_pbc/testdata/annotations.pir
   branches/gsoc_nci/t/pmc/testlib/number.pasm
   branches/gsoc_nci/t/steps/auto/llvm-01.t
   branches/gsoc_nci/tools/build/README
   branches/gsoc_nci/tools/dev/README
   branches/gsoc_nci/tools/dev/addopstags.pl
      - copied, changed from r48555, branches/gsoc_nci/tools/build/addopstags.pl
   branches/gsoc_nci/tools/dev/dump_pbc.pl
      - copied, changed from r48555, branches/gsoc_nci/tools/util/dump_pbc.pl
   branches/gsoc_nci/tools/dev/headerizer.pl
      - copied, changed from r48555, branches/gsoc_nci/tools/build/headerizer.pl
   branches/gsoc_nci/tools/dev/mk_language_shell.in
      - copied, changed from r48555, branches/gsoc_nci/tools/dev/mk_language_shell.pl
   branches/gsoc_nci/tools/dev/ncidef2pasm.pl
      - copied, changed from r48555, branches/gsoc_nci/tools/util/ncidef2pasm.pl
   branches/gsoc_nci/tools/dev/parrot-config.pir
      - copied, changed from r48555, branches/gsoc_nci/tools/util/parrot-config.pir
   branches/gsoc_nci/tools/dev/perlcritic-cage.conf
      - copied, changed from r48555, branches/gsoc_nci/tools/util/perlcritic-cage.conf
   branches/gsoc_nci/tools/dev/perlcritic.conf
      - copied, changed from r48555, branches/gsoc_nci/tools/util/perlcritic.conf
   branches/gsoc_nci/tools/dev/perltidy.conf
      - copied, changed from r48555, branches/gsoc_nci/tools/util/perltidy.conf
   branches/gsoc_nci/tools/dev/update_copyright.pl
      - copied, changed from r48555, branches/gsoc_nci/tools/util/update_copyright.pl
   branches/gsoc_nci/tools/release/
   branches/gsoc_nci/tools/release/README
   branches/gsoc_nci/tools/release/crow.pir
      - copied, changed from r48555, branches/gsoc_nci/tools/util/crow.pir
   branches/gsoc_nci/tools/release/gen_release_info.pl
      - copied, changed from r48555, branches/gsoc_nci/tools/util/gen_release_info.pl
   branches/gsoc_nci/tools/release/inc_ver.pir
      - copied, changed from r48555, branches/gsoc_nci/tools/util/inc_ver.pir
   branches/gsoc_nci/tools/release/release.json
      - copied, changed from r48555, branches/gsoc_nci/tools/util/release.json
   branches/gsoc_nci/tools/release/templates.json
      - copied, changed from r48555, branches/gsoc_nci/tools/util/templates.json
Deleted:
   branches/gsoc_nci/config/inter/charset.pm
   branches/gsoc_nci/config/inter/encoding.pm
   branches/gsoc_nci/docs/pdds/draft/pdd31_hll_interop.pod
   branches/gsoc_nci/examples/japh/README
   branches/gsoc_nci/examples/japh/japh1.pasm
   branches/gsoc_nci/examples/japh/japh3.pasm
   branches/gsoc_nci/examples/japh/japh4.pasm
   branches/gsoc_nci/examples/japh/japh5.pasm
   branches/gsoc_nci/include/parrot/charset.h
   branches/gsoc_nci/src/byteorder.c
   branches/gsoc_nci/src/frame_builder.c
   branches/gsoc_nci/src/frame_builder.h
   branches/gsoc_nci/src/pmc/imageio.pmc
   branches/gsoc_nci/src/pmc/packfilefixupentry.pmc
   branches/gsoc_nci/src/pmc/packfilefixuptable.pmc
   branches/gsoc_nci/src/string/charset.c
   branches/gsoc_nci/src/string/charset/ascii.c
   branches/gsoc_nci/src/string/charset/ascii.h
   branches/gsoc_nci/src/string/charset/binary.c
   branches/gsoc_nci/src/string/charset/binary.h
   branches/gsoc_nci/src/string/charset/iso-8859-1.c
   branches/gsoc_nci/src/string/charset/iso-8859-1.h
   branches/gsoc_nci/src/string/charset/tables.c
   branches/gsoc_nci/src/string/charset/tables.h
   branches/gsoc_nci/src/string/charset/unicode.c
   branches/gsoc_nci/src/string/charset/unicode.h
   branches/gsoc_nci/src/string/encoding/fixed_8.c
   branches/gsoc_nci/src/string/encoding/fixed_8.h
   branches/gsoc_nci/src/string/encoding/ucs2.h
   branches/gsoc_nci/src/string/encoding/ucs4.h
   branches/gsoc_nci/src/string/encoding/utf16.h
   branches/gsoc_nci/src/string/encoding/utf8.h
   branches/gsoc_nci/t/examples/japh.t
   branches/gsoc_nci/t/native_pbc/annotations.pbc
   branches/gsoc_nci/t/native_pbc/testdata/annotations.pir
   branches/gsoc_nci/t/op/gc-leaky.t
   branches/gsoc_nci/t/pmc/packfilefixupentry.t
   branches/gsoc_nci/t/pmc/packfilefixuptable.t
   branches/gsoc_nci/t/steps/inter/charset-01.t
   branches/gsoc_nci/t/steps/inter/encoding-01.t
   branches/gsoc_nci/t/tools/pgegrep.t
   branches/gsoc_nci/tools/build/addopstags.pl
   branches/gsoc_nci/tools/build/headerizer.pl
   branches/gsoc_nci/tools/dev/mk_language_shell.pl
   branches/gsoc_nci/tools/util/crow.pir
   branches/gsoc_nci/tools/util/dump_pbc.pl
   branches/gsoc_nci/tools/util/gen_release_info.pl
   branches/gsoc_nci/tools/util/inc_ver.pir
   branches/gsoc_nci/tools/util/ncidef2pasm.pl
   branches/gsoc_nci/tools/util/parrot-config.pir
   branches/gsoc_nci/tools/util/perlcritic-cage.conf
   branches/gsoc_nci/tools/util/perlcritic.conf
   branches/gsoc_nci/tools/util/perltidy.conf
   branches/gsoc_nci/tools/util/pgegrep
   branches/gsoc_nci/tools/util/release.json
   branches/gsoc_nci/tools/util/templates.json
   branches/gsoc_nci/tools/util/update_copyright.pl
Modified:
   branches/gsoc_nci/CREDITS
   branches/gsoc_nci/ChangeLog
   branches/gsoc_nci/Configure.pl
   branches/gsoc_nci/DEPRECATED.pod
   branches/gsoc_nci/MANIFEST
   branches/gsoc_nci/MANIFEST.SKIP
   branches/gsoc_nci/MANIFEST.generated
   branches/gsoc_nci/NEWS
   branches/gsoc_nci/PBC_COMPAT
   branches/gsoc_nci/README
   branches/gsoc_nci/RESPONSIBLE_PARTIES
   branches/gsoc_nci/VERSION
   branches/gsoc_nci/compilers/imcc/Rules.in
   branches/gsoc_nci/compilers/imcc/cfg.c
   branches/gsoc_nci/compilers/imcc/debug.c
   branches/gsoc_nci/compilers/imcc/imc.h
   branches/gsoc_nci/compilers/imcc/imcc.l
   branches/gsoc_nci/compilers/imcc/imcc.y
   branches/gsoc_nci/compilers/imcc/imclexer.c
   branches/gsoc_nci/compilers/imcc/imcparser.c
   branches/gsoc_nci/compilers/imcc/imcparser.h
   branches/gsoc_nci/compilers/imcc/instructions.c
   branches/gsoc_nci/compilers/imcc/instructions.h
   branches/gsoc_nci/compilers/imcc/optimizer.c
   branches/gsoc_nci/compilers/imcc/parser_util.c
   branches/gsoc_nci/compilers/imcc/pbc.c
   branches/gsoc_nci/compilers/imcc/pcc.c
   branches/gsoc_nci/compilers/imcc/reg_alloc.c
   branches/gsoc_nci/compilers/imcc/sets.c
   branches/gsoc_nci/compilers/imcc/sets.h
   branches/gsoc_nci/compilers/imcc/symreg.c
   branches/gsoc_nci/compilers/imcc/symreg.h
   branches/gsoc_nci/compilers/opsc/ops2c.nqp
   branches/gsoc_nci/compilers/opsc/src/Ops/Emitter.pm
   branches/gsoc_nci/compilers/opsc/src/Ops/File.pm
   branches/gsoc_nci/compilers/opsc/src/Ops/Trans/C.pm
   branches/gsoc_nci/compilers/pct/src/PAST/Compiler.pir
   branches/gsoc_nci/compilers/pct/src/PAST/Node.pir
   branches/gsoc_nci/compilers/pct/src/PCT/HLLCompiler.pir
   branches/gsoc_nci/compilers/pct/src/POST/Compiler.pir
   branches/gsoc_nci/compilers/pct/src/POST/Node.pir
   branches/gsoc_nci/config/auto/gcc.pm
   branches/gsoc_nci/config/auto/msvc.pm
   branches/gsoc_nci/config/auto/pcre.pm
   branches/gsoc_nci/config/auto/pmc.pm
   branches/gsoc_nci/config/auto/readline.pm
   branches/gsoc_nci/config/gen/config_h/config_h.in
   branches/gsoc_nci/config/gen/makefiles.pm
   branches/gsoc_nci/config/gen/makefiles/root.in
   branches/gsoc_nci/config/gen/platform.pm
   branches/gsoc_nci/config/init/hints/mswin32.pm
   branches/gsoc_nci/config/inter/progs.pm
   branches/gsoc_nci/docs/book/pct/ch04_pge.pod
   branches/gsoc_nci/docs/book/pir/ch04_variables.pod
   branches/gsoc_nci/docs/embed.pod
   branches/gsoc_nci/docs/parrothist.pod
   branches/gsoc_nci/docs/pdds/pdd09_gc.pod
   branches/gsoc_nci/docs/pdds/pdd17_pmc.pod
   branches/gsoc_nci/docs/pdds/pdd19_pir.pod
   branches/gsoc_nci/docs/pdds/pdd23_exceptions.pod
   branches/gsoc_nci/docs/pdds/pdd28_strings.pod
   branches/gsoc_nci/docs/pmc/subs.pod
   branches/gsoc_nci/docs/project/release_manager_guide.pod
   branches/gsoc_nci/docs/tests.pod
   branches/gsoc_nci/docs/vtables.pod
   branches/gsoc_nci/editor/pir-mode.el
   branches/gsoc_nci/examples/compilers/japhc.c
   branches/gsoc_nci/examples/config/file/configcompiler
   branches/gsoc_nci/examples/config/file/configwithfatalstep
   branches/gsoc_nci/examples/io/httpd.pir
   branches/gsoc_nci/examples/io/post.pir
   branches/gsoc_nci/examples/json/postalcodes.pir
   branches/gsoc_nci/examples/languages/squaak/doc/tutorial_episode_1.pod
   branches/gsoc_nci/examples/languages/squaak/doc/tutorial_episode_2.pod
   branches/gsoc_nci/examples/languages/squaak/src/squaak.pir
   branches/gsoc_nci/examples/namespace/namespace_dump.pir
   branches/gsoc_nci/ext/nqp-rx/src/stage0/HLL-s0.pir
   branches/gsoc_nci/ext/nqp-rx/src/stage0/NQP-s0.pir
   branches/gsoc_nci/ext/nqp-rx/src/stage0/P6Regex-s0.pir
   branches/gsoc_nci/ext/nqp-rx/src/stage0/Regex-s0.pir
   branches/gsoc_nci/ext/nqp-rx/src/stage0/nqp-setting.nqp
   branches/gsoc_nci/include/parrot/call.h
   branches/gsoc_nci/include/parrot/context.h
   branches/gsoc_nci/include/parrot/debugger.h
   branches/gsoc_nci/include/parrot/encoding.h
   branches/gsoc_nci/include/parrot/gc_api.h
   branches/gsoc_nci/include/parrot/hash.h
   branches/gsoc_nci/include/parrot/interpreter.h
   branches/gsoc_nci/include/parrot/io.h
   branches/gsoc_nci/include/parrot/library.h
   branches/gsoc_nci/include/parrot/longopt.h
   branches/gsoc_nci/include/parrot/misc.h
   branches/gsoc_nci/include/parrot/nci.h
   branches/gsoc_nci/include/parrot/op.h
   branches/gsoc_nci/include/parrot/oplib.h
   branches/gsoc_nci/include/parrot/oplib/core_ops.h
   branches/gsoc_nci/include/parrot/packfile.h
   branches/gsoc_nci/include/parrot/parrot.h
   branches/gsoc_nci/include/parrot/platform_interface.h
   branches/gsoc_nci/include/parrot/pmc_freeze.h
   branches/gsoc_nci/include/parrot/pobj.h
   branches/gsoc_nci/include/parrot/runcore_api.h
   branches/gsoc_nci/include/parrot/scheduler_private.h
   branches/gsoc_nci/include/parrot/settings.h
   branches/gsoc_nci/include/parrot/string.h
   branches/gsoc_nci/include/parrot/string_funcs.h
   branches/gsoc_nci/include/parrot/sub.h
   branches/gsoc_nci/lib/Parrot/Configure/Compiler.pm
   branches/gsoc_nci/lib/Parrot/Configure/Options/Conf.pm
   branches/gsoc_nci/lib/Parrot/Configure/Options/Conf/Shared.pm
   branches/gsoc_nci/lib/Parrot/Configure/Step/List.pm
   branches/gsoc_nci/lib/Parrot/Docs/Section/Tools.pm
   branches/gsoc_nci/lib/Parrot/Harness/Smoke.pm
   branches/gsoc_nci/lib/Parrot/Headerizer.pm
   branches/gsoc_nci/lib/Parrot/Manifest.pm
   branches/gsoc_nci/lib/Parrot/Pmc2c/PMC.pm
   branches/gsoc_nci/lib/Parrot/Pmc2c/PMCEmitter.pm
   branches/gsoc_nci/lib/Parrot/Test.pm
   branches/gsoc_nci/ports/debian/rules
   branches/gsoc_nci/runtime/parrot/include/test_more.pir
   branches/gsoc_nci/runtime/parrot/library/Archive/Zip.pir
   branches/gsoc_nci/runtime/parrot/library/LWP/Protocol.pir
   branches/gsoc_nci/runtime/parrot/library/P6object.pir
   branches/gsoc_nci/runtime/parrot/library/Test/Builder.pir
   branches/gsoc_nci/runtime/parrot/library/Test/Builder/TestPlan.pir
   branches/gsoc_nci/runtime/parrot/library/Test/More.pir
   branches/gsoc_nci/runtime/parrot/library/URI/Escape.pir
   branches/gsoc_nci/runtime/parrot/library/distutils.pir
   branches/gsoc_nci/runtime/parrot/library/osutils.pir
   branches/gsoc_nci/runtime/parrot/library/pcre.pir
   branches/gsoc_nci/src/call/args.c
   branches/gsoc_nci/src/call/context.c
   branches/gsoc_nci/src/call/context_accessors.c
   branches/gsoc_nci/src/call/pcc.c
   branches/gsoc_nci/src/datatypes.c
   branches/gsoc_nci/src/debug.c
   branches/gsoc_nci/src/dynext.c
   branches/gsoc_nci/src/dynoplibs/math.ops
   branches/gsoc_nci/src/dynoplibs/sys.ops
   branches/gsoc_nci/src/dynoplibs/trans.ops
   branches/gsoc_nci/src/dynpmc/Defines.in
   branches/gsoc_nci/src/dynpmc/Rules.in
   branches/gsoc_nci/src/dynpmc/gziphandle.pmc
   branches/gsoc_nci/src/embed.c
   branches/gsoc_nci/src/exceptions.c
   branches/gsoc_nci/src/gc/alloc_resources.c
   branches/gsoc_nci/src/gc/api.c
   branches/gsoc_nci/src/gc/gc_ms.c
   branches/gsoc_nci/src/gc/gc_private.h
   branches/gsoc_nci/src/gc/mark_sweep.c
   branches/gsoc_nci/src/gc/system.c
   branches/gsoc_nci/src/global_setup.c
   branches/gsoc_nci/src/hash.c
   branches/gsoc_nci/src/hll.c
   branches/gsoc_nci/src/interp/inter_create.c
   branches/gsoc_nci/src/interp/inter_misc.c
   branches/gsoc_nci/src/io/api.c
   branches/gsoc_nci/src/io/buffer.c
   branches/gsoc_nci/src/io/filehandle.c
   branches/gsoc_nci/src/io/socket_api.c
   branches/gsoc_nci/src/io/socket_unix.c
   branches/gsoc_nci/src/io/socket_win32.c
   branches/gsoc_nci/src/io/utf8.c
   branches/gsoc_nci/src/key.c
   branches/gsoc_nci/src/library.c
   branches/gsoc_nci/src/longopt.c
   branches/gsoc_nci/src/main.c
   branches/gsoc_nci/src/misc.c
   branches/gsoc_nci/src/multidispatch.c
   branches/gsoc_nci/src/namespace.c
   branches/gsoc_nci/src/nci/core_thunks.c
   branches/gsoc_nci/src/nci/extra_thunks.c
   branches/gsoc_nci/src/oo.c
   branches/gsoc_nci/src/ops/cmp.ops
   branches/gsoc_nci/src/ops/core_ops.c
   branches/gsoc_nci/src/ops/experimental.ops
   branches/gsoc_nci/src/ops/object.ops
   branches/gsoc_nci/src/ops/pmc.ops
   branches/gsoc_nci/src/ops/set.ops
   branches/gsoc_nci/src/ops/string.ops
   branches/gsoc_nci/src/ops/sys.ops
   branches/gsoc_nci/src/ops/var.ops
   branches/gsoc_nci/src/packdump.c
   branches/gsoc_nci/src/packfile.c
   branches/gsoc_nci/src/packfile/pf_items.c
   branches/gsoc_nci/src/packout.c
   branches/gsoc_nci/src/parrot_debugger.c
   branches/gsoc_nci/src/pbc_dump.c
   branches/gsoc_nci/src/pbc_merge.c
   branches/gsoc_nci/src/pmc.c
   branches/gsoc_nci/src/pmc/addrregistry.pmc
   branches/gsoc_nci/src/pmc/bigint.pmc
   branches/gsoc_nci/src/pmc/bignum.pmc
   branches/gsoc_nci/src/pmc/boolean.pmc
   branches/gsoc_nci/src/pmc/bytebuffer.pmc
   branches/gsoc_nci/src/pmc/callcontext.pmc
   branches/gsoc_nci/src/pmc/capture.pmc
   branches/gsoc_nci/src/pmc/class.pmc
   branches/gsoc_nci/src/pmc/complex.pmc
   branches/gsoc_nci/src/pmc/continuation.pmc
   branches/gsoc_nci/src/pmc/default.pmc
   branches/gsoc_nci/src/pmc/eval.pmc
   branches/gsoc_nci/src/pmc/exception.pmc
   branches/gsoc_nci/src/pmc/exceptionhandler.pmc
   branches/gsoc_nci/src/pmc/filehandle.pmc
   branches/gsoc_nci/src/pmc/fixedbooleanarray.pmc
   branches/gsoc_nci/src/pmc/float.pmc
   branches/gsoc_nci/src/pmc/hash.pmc
   branches/gsoc_nci/src/pmc/hashiterator.pmc
   branches/gsoc_nci/src/pmc/imageiosize.pmc
   branches/gsoc_nci/src/pmc/imageiostrings.pmc
   branches/gsoc_nci/src/pmc/integer.pmc
   branches/gsoc_nci/src/pmc/key.pmc
   branches/gsoc_nci/src/pmc/lexinfo.pmc
   branches/gsoc_nci/src/pmc/lexpad.pmc
   branches/gsoc_nci/src/pmc/multisub.pmc
   branches/gsoc_nci/src/pmc/namespace.pmc
   branches/gsoc_nci/src/pmc/nci.pmc
   branches/gsoc_nci/src/pmc/null.pmc
   branches/gsoc_nci/src/pmc/object.pmc
   branches/gsoc_nci/src/pmc/oplib.pmc
   branches/gsoc_nci/src/pmc/orderedhash.pmc
   branches/gsoc_nci/src/pmc/packfile.pmc
   branches/gsoc_nci/src/pmc/packfileannotations.pmc
   branches/gsoc_nci/src/pmc/packfileconstanttable.pmc
   branches/gsoc_nci/src/pmc/packfiledirectory.pmc
   branches/gsoc_nci/src/pmc/parrotinterpreter.pmc
   branches/gsoc_nci/src/pmc/parrotlibrary.pmc
   branches/gsoc_nci/src/pmc/resizablestringarray.pmc
   branches/gsoc_nci/src/pmc/scalar.pmc
   branches/gsoc_nci/src/pmc/string.pmc
   branches/gsoc_nci/src/pmc/stringbuilder.pmc
   branches/gsoc_nci/src/pmc/stringhandle.pmc
   branches/gsoc_nci/src/pmc/stringiterator.pmc
   branches/gsoc_nci/src/pmc/sub.pmc
   branches/gsoc_nci/src/pmc/undef.pmc
   branches/gsoc_nci/src/pmc/unmanagedstruct.pmc
   branches/gsoc_nci/src/pmc_freeze.c
   branches/gsoc_nci/src/runcore/cores.c
   branches/gsoc_nci/src/runcore/main.c
   branches/gsoc_nci/src/runcore/trace.c
   branches/gsoc_nci/src/scheduler.c
   branches/gsoc_nci/src/spf_render.c
   branches/gsoc_nci/src/spf_vtable.c
   branches/gsoc_nci/src/string/api.c
   branches/gsoc_nci/src/string/encoding.c
   branches/gsoc_nci/src/string/encoding/ucs2.c
   branches/gsoc_nci/src/string/encoding/ucs4.c
   branches/gsoc_nci/src/string/encoding/utf16.c
   branches/gsoc_nci/src/string/encoding/utf8.c
   branches/gsoc_nci/src/string/primitives.c
   branches/gsoc_nci/src/sub.c
   branches/gsoc_nci/src/thread.c
   branches/gsoc_nci/src/vtable.tbl
   branches/gsoc_nci/t/codingstd/c_macro_args.t
   branches/gsoc_nci/t/codingstd/c_operator.t
   branches/gsoc_nci/t/codingstd/c_todo.t
   branches/gsoc_nci/t/codingstd/perlcritic.t
   branches/gsoc_nci/t/codingstd/pir_code_coda.t
   branches/gsoc_nci/t/codingstd/pmc_docs.t
   branches/gsoc_nci/t/compilers/imcc/syn/const.t
   branches/gsoc_nci/t/compilers/imcc/syn/regressions.t
   branches/gsoc_nci/t/compilers/opsc/07-emitter.t
   branches/gsoc_nci/t/compilers/pct/pct_hllcompiler.t
   branches/gsoc_nci/t/dynoplibs/debug.t
   branches/gsoc_nci/t/dynoplibs/sysinfo.t
   branches/gsoc_nci/t/dynoplibs/trans-infnan.t
   branches/gsoc_nci/t/dynoplibs/trans.t
   branches/gsoc_nci/t/dynpmc/gziphandle.t
   branches/gsoc_nci/t/dynpmc/rational.t
   branches/gsoc_nci/t/harness
   branches/gsoc_nci/t/harness.pir
   branches/gsoc_nci/t/library/archive_zip.t
   branches/gsoc_nci/t/library/osutils.t
   branches/gsoc_nci/t/native_pbc/integer.pbc
   branches/gsoc_nci/t/native_pbc/integer_4.pbc
   branches/gsoc_nci/t/native_pbc/number.pbc
   branches/gsoc_nci/t/native_pbc/number_4.pbc
   branches/gsoc_nci/t/native_pbc/string.pbc
   branches/gsoc_nci/t/native_pbc/string_4.pbc
   branches/gsoc_nci/t/oo/isa.t
   branches/gsoc_nci/t/oo/objects.t
   branches/gsoc_nci/t/op/calling.t
   branches/gsoc_nci/t/op/exceptions.t
   branches/gsoc_nci/t/op/integer.t
   branches/gsoc_nci/t/op/lexicals.t
   branches/gsoc_nci/t/op/string.t
   branches/gsoc_nci/t/op/string_cs.t
   branches/gsoc_nci/t/op/string_mem.t
   branches/gsoc_nci/t/op/stringu.t
   branches/gsoc_nci/t/pmc/bigint.t
   branches/gsoc_nci/t/pmc/bytebuffer.t
   branches/gsoc_nci/t/pmc/complex.t
   branches/gsoc_nci/t/pmc/eval.t
   branches/gsoc_nci/t/pmc/exception-old.t
   branches/gsoc_nci/t/pmc/exception.t
   branches/gsoc_nci/t/pmc/exceptionhandler.t
   branches/gsoc_nci/t/pmc/filehandle.t
   branches/gsoc_nci/t/pmc/float.t
   branches/gsoc_nci/t/pmc/hash.t
   branches/gsoc_nci/t/pmc/hashiterator.t
   branches/gsoc_nci/t/pmc/hashiteratorkey.t
   branches/gsoc_nci/t/pmc/imageio.t
   branches/gsoc_nci/t/pmc/io.t
   branches/gsoc_nci/t/pmc/key.t
   branches/gsoc_nci/t/pmc/lexinfo.t
   branches/gsoc_nci/t/pmc/object-meths.t
   branches/gsoc_nci/t/pmc/orderedhashiterator.t
   branches/gsoc_nci/t/pmc/packfile.t
   branches/gsoc_nci/t/pmc/packfileannotations.t
   branches/gsoc_nci/t/pmc/packfileconstanttable.t
   branches/gsoc_nci/t/pmc/packfiledirectory.t
   branches/gsoc_nci/t/pmc/packfilerawsegment.t
   branches/gsoc_nci/t/pmc/parrotinterpreter.t
   branches/gsoc_nci/t/pmc/string.t
   branches/gsoc_nci/t/pmc/stringbuilder.t
   branches/gsoc_nci/t/pmc/stringhandle.t
   branches/gsoc_nci/t/pmc/stringiterator.t
   branches/gsoc_nci/t/pmc/testlib/packfile_common.pir
   branches/gsoc_nci/t/pmc/timer.t
   branches/gsoc_nci/t/run/options.t
   branches/gsoc_nci/t/src/extend.t
   branches/gsoc_nci/t/src/warnings.t
   branches/gsoc_nci/t/steps/auto/pmc-01.t
   branches/gsoc_nci/t/steps/auto/readline-01.t
   branches/gsoc_nci/t/tools/dump_pbc.t
   branches/gsoc_nci/t/tools/parrot_debugger.t
   branches/gsoc_nci/t/tools/pbc_dump.t
   branches/gsoc_nci/tools/build/parrot_config_c.pl
   branches/gsoc_nci/tools/dev/as2c.pl   (contents, props changed)
   branches/gsoc_nci/tools/dev/faces.pl
   branches/gsoc_nci/tools/dev/fetch_languages.pl
   branches/gsoc_nci/tools/dev/gen_charset_tables.pl
   branches/gsoc_nci/tools/dev/mk_native_pbc
   branches/gsoc_nci/tools/dev/nci_thunk_gen.pir
   branches/gsoc_nci/tools/dev/pbc_to_exe.pir
   branches/gsoc_nci/tools/install/smoke_languages.pl

Modified: branches/gsoc_nci/CREDITS
==============================================================================
--- branches/gsoc_nci/CREDITS	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/CREDITS	Tue Sep 28 17:16:52 2010	(r49366)
@@ -402,7 +402,7 @@
 
 N: Gerd Pokorra
 E: pokorra at uni-siegen.de
-D: Release manager for 1.9.0, 2.3.0 and 2.5.0
+D: Release manager for 1.9.0, 2.3.0, 2.5.0 and 2.8.0
 
 N: Goplat
 D: Win98 and other fixes.
@@ -644,7 +644,7 @@
 
 N: Luben Karavelov
 U: luben
-E: luben at unixsol.org
+E: karavelov at spnet.net
 
 N: Luca Barbato
 D: fix to make installable
@@ -773,6 +773,11 @@
 N: Nick Kostirya
 D: Win32, FreeBSD build fixes
 
+N: Nick Wellnhofer
+D: String iterator rewrite, GC fixes
+E: wellnhofer at aevum.de
+U: nwellnhof
+
 N: Nikolay Ananiev
 D: Win32 build fix
 

Modified: branches/gsoc_nci/ChangeLog
==============================================================================
--- branches/gsoc_nci/ChangeLog	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/ChangeLog	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1,5 +1,13 @@
 #1 $Id$
 
+2010.09.21     Gerd
+	* Released 2.8.0
+	See NEWS for more.
+
+2010.08.17     mikehh
+	* Released 2.7.0
+	See NEWS for more.
+
 2010.07.10     coke
 	* Released 2.6.0
 	See NEWS for more.
@@ -3861,9 +3869,9 @@
 2002-01-04 16:09  dan
 
 	* classes/: genclass.pl, perlarray.pmc, perlint.pmc, perlnum.pmc,
-	perlstring.pmc, perlundef.pmc:	- genclass.pl attempts to put $Id$
+	perlstring.pmc, perlundef.pmc:	- genclass.pl attempts to put the Id mark
 	into generated files
-	   but the $Id$ string gets mangled when it's committed.
+	   but the Id mark string gets mangled when it's committed.
 	   This patch fixes the existing .pmc files and fixes genclass.pl.
 
 	 - Makes capitalization in .pmc header match actual filenames

Modified: branches/gsoc_nci/Configure.pl
==============================================================================
--- branches/gsoc_nci/Configure.pl	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/Configure.pl	Tue Sep 28 17:16:52 2010	(r49366)
@@ -604,8 +604,6 @@
     init::optimize
     inter::shlibs
     inter::libparrot
-    inter::charset
-    inter::encoding
     inter::types
     auto::ops
     auto::alignptrs

Modified: branches/gsoc_nci/DEPRECATED.pod
==============================================================================
--- branches/gsoc_nci/DEPRECATED.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/DEPRECATED.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -71,13 +71,6 @@
 
 L<https://trac.parrot.org/parrot/ticket/103>
 
-=item NCI without signature ("raw" pointers) [eligible in 2.4]
-
-No equivalent functionality is promised. You shouldn't be using this. Here be
-segfaults.
-
-L<https://trac.parrot.org/parrot/ticket/1549>
-
 =item UnManagedStruct handling nested structure [eligible in 2.4]
 
 UnManagedStruct will be simplified to only support flat structures. This means
@@ -139,13 +132,24 @@
 These can be replaced by C<get_bool> and intval ops unless you're using them for
 things that aren't really logical ops (don't do that!).
 
+Logical vtables are removed in r49012, and logical ops on PMCs are converted to
+use C<get_bool> internally. Rakudo seems to depend on logical ops on PMCs.
+
 L<https://trac.parrot.org/parrot/ticket/1655>
 
-=item Method is_tty in PMCs derived from Handle [eligible in 2.7]
+=item Method getpid on ParrotInterpreter [experimental]
+
+Used to test the experimental function Parrot_getpid
+
+L<https://trac.parrot.org/parrot/ticket/1564>
+
+=item Behavior of Parrot::Pmc2c::PMC::add_method() [eligible in 2.10]
 
-Use isatty instead.
+Duplicated vtable functions currently generate only a warning; after deadline,
+they will cause a C<die> and failure to build Parrot or any HLL
+using this method.
 
-L<https://trac.parrot.org/parrot/ticket/1689>
+L<http://trac.parrot.org/parrot/ticket/1785>
 
 =back
 
@@ -153,6 +157,21 @@
 
 =over 4
 
+=item charset, charsetname, find_charset, trans_charset [eligible in 2.10]
+
+L<https://trac.parrot.org/parrot/ticket/1778>
+
+These opcodes will be removed. The corresponding encoding opcodes should be
+used instead.
+
+=item fixed_8 encoding [eligible in 2.10]
+
+L<https://trac.parrot.org/parrot/ticket/1778>
+
+The 'fixed_8' encoding is going away. Use 'ascii' instead. If you want to test
+for a fixed_8 encoding, you have to compare the encoding to 'ascii',
+'iso-8859-1' and 'binary' separately.
+
 =item open and close opcodes will be removed [eligible in 2.7]
 
 L<https://trac.parrot.org/parrot/ticket/1697>
@@ -377,11 +396,11 @@
 
 L<https://trac.parrot.org/parrot/ticket/1628>
 
-=item Parrot_get_runtime_prefix [eligible in 2.7]
+=item Parrot_getpid [experimental]
 
-Use Parrot_get_runtime_path instead.
+Get process id, experimental.
 
-L<https://trac.parrot.org/parrot/ticket/1191>
+L<https://trac.parrot.org/parrot/ticket/1564>
 
 =back
 

Modified: branches/gsoc_nci/MANIFEST
==============================================================================
--- branches/gsoc_nci/MANIFEST	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/MANIFEST	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1,7 +1,7 @@
 # ex: set ro:
 # $Id$
 #
-# generated by tools/dev/mk_manifest_and_skip.pl Sun Aug  8 16:31:42 2010 UT
+# generated by tools/dev/mk_manifest_and_skip.pl Sat Sep 25 01:48:30 2010 UT
 #
 # See below for documentation on the format of this file.
 #
@@ -214,6 +214,8 @@
 config/auto/isreg.pm                                        []
 config/auto/isreg/test_c.in                                 []
 config/auto/jit.pm                                          []
+config/auto/llvm.pm                                         []
+config/auto/llvm/hello.c                                    []
 config/auto/memalign.pm                                     []
 config/auto/memalign/test2_c.in                             []
 config/auto/memalign/test_c.in                              []
@@ -275,6 +277,7 @@
 config/gen/platform/ansi/dl.c                               []
 config/gen/platform/ansi/exec.c                             []
 config/gen/platform/ansi/io.h                               []
+config/gen/platform/ansi/pid.c                              []
 config/gen/platform/ansi/time.c                             []
 config/gen/platform/cygwin/math.c                           []
 config/gen/platform/darwin/begin.c                          []
@@ -289,6 +292,7 @@
 config/gen/platform/generic/math.c                          []
 config/gen/platform/generic/math.h                          []
 config/gen/platform/generic/memexec.c                       []
+config/gen/platform/generic/pid.c                           []
 config/gen/platform/generic/platform_limits.h               []
 config/gen/platform/generic/signal.c                        []
 config/gen/platform/generic/signal.h                        []
@@ -313,6 +317,7 @@
 config/gen/platform/win32/io.h                              []
 config/gen/platform/win32/misc.c                            []
 config/gen/platform/win32/misc.h                            []
+config/gen/platform/win32/pid.c                             []
 config/gen/platform/win32/signal.c                          []
 config/gen/platform/win32/signal.h                          []
 config/gen/platform/win32/stat.c                            []
@@ -343,8 +348,6 @@
 config/init/install.pm                                      []
 config/init/manifest.pm                                     []
 config/init/optimize.pm                                     []
-config/inter/charset.pm                                     []
-config/inter/encoding.pm                                    []
 config/inter/lex.pm                                         []
 config/inter/libparrot.pm                                   []
 config/inter/make.pm                                        []
@@ -429,7 +432,6 @@
 docs/pdds/draft/pdd16_native_call.pod                       [doc]
 docs/pdds/draft/pdd29_compiler_tools.pod                    [doc]
 docs/pdds/draft/pdd31_hll.pod                               [doc]
-docs/pdds/draft/pdd31_hll_interop.pod                       [doc]
 docs/pdds/pdd00_pdd.pod                                     [doc]
 docs/pdds/pdd03_calling_conventions.pod                     [doc]
 docs/pdds/pdd07_codingstd.pod                               [doc]
@@ -508,6 +510,7 @@
 examples/benchmarks/arriter.rb                              [examples]
 examples/benchmarks/arriter_o1.pir                          [examples]
 examples/benchmarks/bench_newp.pasm                         [examples]
+examples/benchmarks/boolean.pir                             [examples]
 examples/benchmarks/fib.cs                                  [examples]
 examples/benchmarks/fib.pir                                 [examples]
 examples/benchmarks/fib.pl                                  [examples]
@@ -580,6 +583,7 @@
 examples/benchmarks/stress2.pl                              [examples]
 examples/benchmarks/stress2.rb                              [examples]
 examples/benchmarks/stress3.pasm                            [examples]
+examples/benchmarks/stress_integers.pir                     [examples]
 examples/benchmarks/stress_strings.pir                      [examples]
 examples/benchmarks/vpm.pir                                 [examples]
 examples/benchmarks/vpm.pl                                  [examples]
@@ -599,11 +603,6 @@
 examples/io/http.pir                                        [examples]
 examples/io/httpd.pir                                       [examples]
 examples/io/post.pir                                        [examples]
-examples/japh/README                                        [examples]
-examples/japh/japh1.pasm                                    [examples]
-examples/japh/japh3.pasm                                    [examples]
-examples/japh/japh4.pasm                                    [examples]
-examples/japh/japh5.pasm                                    [examples]
 examples/json/postalcodes.pir                               [examples]
 examples/json/test.pir                                      [examples]
 examples/languages/abc/MAINTAINER                           [examples]
@@ -821,6 +820,7 @@
 examples/tge/branch/transform.pir                           [examples]
 examples/tools/Makefile                                     [examples]
 examples/tools/pbc_checker.cpp                              [examples]
+examples/tools/pgegrep                                      [examples]
 examples/tutorial/00_README.pod                             [examples]
 examples/tutorial/01_temp_var.pir                           [examples]
 examples/tutorial/02_local_var.pir                          [examples]
@@ -946,7 +946,6 @@
 include/parrot/caches.h                                     [main]include
 include/parrot/call.h                                       [main]include
 include/parrot/cclass.h                                     [main]include
-include/parrot/charset.h                                    [main]include
 include/parrot/compiler.h                                   [main]include
 include/parrot/context.h                                    [main]include
 include/parrot/core_types.h                                 [main]include
@@ -963,6 +962,7 @@
 include/parrot/global_setup.h                               [main]include
 include/parrot/hash.h                                       [main]include
 include/parrot/hll.h                                        [main]include
+include/parrot/imageio.h                                    [main]include
 include/parrot/imcc.h                                       [main]include
 include/parrot/interpreter.h                                [main]include
 include/parrot/io.h                                         [main]include
@@ -971,6 +971,7 @@
 include/parrot/io_win32.h                                   [main]include
 include/parrot/key.h                                        [main]include
 include/parrot/library.h                                    [main]include
+include/parrot/list.h                                       [main]include
 include/parrot/longopt.h                                    [main]include
 include/parrot/memory.h                                     [main]include
 include/parrot/misc.h                                       [main]include
@@ -1242,7 +1243,6 @@
 runtime/parrot/library/yaml_dumper.pir                      [library]
 src/atomic/gcc_x86.c                                        []
 src/atomic/sparc_v9.s                                       []
-src/byteorder.c                                             []
 src/call/args.c                                             []
 src/call/context.c                                          []
 src/call/context_accessors.c                                []
@@ -1281,18 +1281,22 @@
 src/exceptions.c                                            []
 src/exit.c                                                  []
 src/extend.c                                                []
-src/frame_builder.c                                         []
-src/frame_builder.h                                         []
 src/gc/alloc_memory.c                                       []
 src/gc/alloc_resources.c                                    []
 src/gc/api.c                                                []
+src/gc/fixed_allocator.c                                    []
+src/gc/fixed_allocator.h                                    []
 src/gc/gc_inf.c                                             []
 src/gc/gc_ms.c                                              []
+src/gc/gc_ms2.c                                             []
 src/gc/gc_private.h                                         []
 src/gc/malloc.c                                             []
 src/gc/malloc_trace.c                                       []
 src/gc/mark_sweep.c                                         []
+src/gc/string_gc.c                                          []
 src/gc/system.c                                             []
+src/gc/variable_size_pool.c                                 []
+src/gc/variable_size_pool.h                                 []
 src/global_setup.c                                          []
 src/hash.c                                                  []
 src/hll.c                                                   []
@@ -1314,6 +1318,7 @@
 src/key.c                                                   []
 src/libnci_test.def                                         []
 src/library.c                                               []
+src/list.c                                                  []
 src/longopt.c                                               []
 src/main.c                                                  []
 src/misc.c                                                  []
@@ -1342,6 +1347,7 @@
 src/ops/var.ops                                             []
 src/packdump.c                                              []
 src/packfile.c                                              []
+src/packfile/byteorder.h                                    []
 src/packfile/pf_items.c                                     []
 src/packout.c                                               []
 src/parrot_debugger.c                                       []
@@ -1380,9 +1386,10 @@
 src/pmc/hash.pmc                                            []
 src/pmc/hashiterator.pmc                                    []
 src/pmc/hashiteratorkey.pmc                                 []
-src/pmc/imageio.pmc                                         []
+src/pmc/imageiofreeze.pmc                                   []
 src/pmc/imageiosize.pmc                                     []
 src/pmc/imageiostrings.pmc                                  []
+src/pmc/imageiothaw.pmc                                     []
 src/pmc/integer.pmc                                         []
 src/pmc/iterator.pmc                                        []
 src/pmc/key.pmc                                             []
@@ -1391,6 +1398,7 @@
 src/pmc/managedstruct.pmc                                   []
 src/pmc/multisub.pmc                                        []
 src/pmc/namespace.pmc                                       []
+src/pmc/nativepccmethod.pmc                                 []
 src/pmc/nci.pmc                                             []
 src/pmc/null.pmc                                            []
 src/pmc/object.pmc                                          []
@@ -1404,8 +1412,6 @@
 src/pmc/packfileconstanttable.pmc                           []
 src/pmc/packfiledebug.pmc                                   []
 src/pmc/packfiledirectory.pmc                               []
-src/pmc/packfilefixupentry.pmc                              []
-src/pmc/packfilefixuptable.pmc                              []
 src/pmc/packfilerawsegment.pmc                              []
 src/pmc/packfilesegment.pmc                                 []
 src/pmc/parrotinterpreter.pmc                               []
@@ -1444,28 +1450,18 @@
 src/spf_render.c                                            []
 src/spf_vtable.c                                            []
 src/string/api.c                                            []
-src/string/charset.c                                        []
-src/string/charset/ascii.c                                  []
-src/string/charset/ascii.h                                  []
-src/string/charset/binary.c                                 []
-src/string/charset/binary.h                                 []
-src/string/charset/iso-8859-1.c                             []
-src/string/charset/iso-8859-1.h                             []
-src/string/charset/tables.c                                 []
-src/string/charset/tables.h                                 []
-src/string/charset/unicode.c                                []
-src/string/charset/unicode.h                                []
 src/string/encoding.c                                       []
-src/string/encoding/fixed_8.c                               []
-src/string/encoding/fixed_8.h                               []
+src/string/encoding/ascii.c                                 []
+src/string/encoding/binary.c                                []
+src/string/encoding/latin1.c                                []
+src/string/encoding/shared.c                                []
+src/string/encoding/shared.h                                []
+src/string/encoding/tables.c                                []
+src/string/encoding/tables.h                                []
 src/string/encoding/ucs2.c                                  []
-src/string/encoding/ucs2.h                                  []
 src/string/encoding/ucs4.c                                  []
-src/string/encoding/ucs4.h                                  []
 src/string/encoding/utf16.c                                 []
-src/string/encoding/utf16.h                                 []
 src/string/encoding/utf8.c                                  []
-src/string/encoding/utf8.h                                  []
 src/string/primitives.c                                     []
 src/string/unicode.h                                        []
 src/sub.c                                                   []
@@ -1682,11 +1678,11 @@
 t/dynpmc/subclass_with_pir_method.t                         [test]
 t/dynpmc/subproxy.t                                         [test]
 t/examples/catchall.t                                       [test]
-t/examples/japh.t                                           [test]
 t/examples/library.t                                        [test]
 t/examples/namespace.t                                      [test]
 t/examples/pasm.t                                           [test]
 t/examples/past.t                                           [test]
+t/examples/pgegrep.t                                        [test]
 t/examples/pir.t                                            [test]
 t/examples/pod.t                                            [test]
 t/examples/shootout.t                                       [test]
@@ -1737,7 +1733,6 @@
 t/manifest/04-alt_file.t                                    [test]
 t/manifest/05-alt_skip.t                                    [test]
 t/manifest/README                                           []doc
-t/native_pbc/annotations.pbc                                [test]
 t/native_pbc/header.t                                       [test]
 t/native_pbc/integer.pbc                                    [test]
 t/native_pbc/integer.t                                      [test]
@@ -1766,7 +1761,6 @@
 t/native_pbc/string_6.pbc                                   [test]
 t/native_pbc/string_7.pbc                                   [test]
 t/native_pbc/testdata/README                                []doc
-t/native_pbc/testdata/annotations.pir                       [test]
 t/native_pbc/testdata/number.pasm                           [test]
 t/native_pbc/testdata/string.pasm                           [test]
 t/oo/attributes.t                                           [test]
@@ -1805,7 +1799,10 @@
 t/op/exceptions.t                                           [test]
 t/op/exit.t                                                 [test]
 t/op/fetch.t                                                [test]
-t/op/gc-leaky.t                                             [test]
+t/op/gc-active-buffers.t                                    [test]
+t/op/gc-leaky-box.t                                         [test]
+t/op/gc-leaky-call.t                                        [test]
+t/op/gc-non-recursive.t                                     [test]
 t/op/gc.t                                                   [test]
 t/op/globals.t                                              [test]
 t/op/ifunless.t                                             [test]
@@ -1830,6 +1827,7 @@
 t/op/string_cs.t                                            [test]
 t/op/string_mem.t                                           [test]
 t/op/stringu.t                                              [test]
+t/op/testlib/test_strings.pir                               [test]
 t/op/time.t                                                 [test]
 t/op/vivify.t                                               [test]
 t/perl/Parrot_Distribution.t                                [test]
@@ -1914,8 +1912,6 @@
 t/pmc/packfileannotations.t                                 [test]
 t/pmc/packfileconstanttable.t                               [test]
 t/pmc/packfiledirectory.t                                   [test]
-t/pmc/packfilefixupentry.t                                  [test]
-t/pmc/packfilefixuptable.t                                  [test]
 t/pmc/packfilerawsegment.t                                  [test]
 t/pmc/packfilesegment.t                                     [test]
 t/pmc/parrotclass.t                                         [test]
@@ -1948,6 +1944,8 @@
 t/pmc/sub.t                                                 [test]
 t/pmc/sys.t                                                 [test]
 t/pmc/task.t                                                [test]
+t/pmc/testlib/annotations.pir                               [test]
+t/pmc/testlib/number.pasm                                   [test]
 t/pmc/testlib/packfile_common.pir                           [test]
 t/pmc/threads.t                                             [test]
 t/pmc/timer.t                                               [test]
@@ -1987,6 +1985,7 @@
 t/steps/auto/inline-01.t                                    [test]
 t/steps/auto/isreg-01.t                                     [test]
 t/steps/auto/jit-01.t                                       [test]
+t/steps/auto/llvm-01.t                                      [test]
 t/steps/auto/memalign-01.t                                  [test]
 t/steps/auto/msvc-01.t                                      [test]
 t/steps/auto/neg_0-01.t                                     [test]
@@ -2022,8 +2021,6 @@
 t/steps/init/install-01.t                                   [test]
 t/steps/init/manifest-01.t                                  [test]
 t/steps/init/optimize-01.t                                  [test]
-t/steps/inter/charset-01.t                                  [test]
-t/steps/inter/encoding-01.t                                 [test]
 t/steps/inter/lex-01.t                                      [test]
 t/steps/inter/lex-02.t                                      [test]
 t/steps/inter/lex-03.t                                      [test]
@@ -2078,7 +2075,6 @@
 t/tools/pbc_disassemble.t                                   [test]
 t/tools/pbc_dump.t                                          [test]
 t/tools/pbc_merge.t                                         [test]
-t/tools/pgegrep.t                                           [test]
 t/tools/pmc2cutils/01-pmc2cutils.t                          [test]
 t/tools/pmc2cutils/02-find_file.t                           [test]
 t/tools/pmc2cutils/03-dump_vtable.t                         [test]
@@ -2087,11 +2083,10 @@
 t/tools/pmc2cutils/08-pmc-pm.t                              [test]
 t/tools/pmc2cutils/README                                   []doc
 t/tools/testdata                                            [test]
-tools/build/addopstags.pl                                   []
+tools/build/README                                          []doc
 tools/build/c2str.pl                                        []
 tools/build/fixup_gen_file.pl                               []
 tools/build/h2inc.pl                                        []
-tools/build/headerizer.pl                                   []
 tools/build/ops2c.pl                                        [devel]
 tools/build/parrot_config_c.pl                              []
 tools/build/pbcversion_h.pl                                 []
@@ -2099,18 +2094,22 @@
 tools/build/vtable_extend.pl                                []
 tools/build/vtable_h.pl                                     []
 tools/dev/.gdbinit                                          []
+tools/dev/README                                            []doc
+tools/dev/addopstags.pl                                     []
 tools/dev/as2c.pl                                           []
 tools/dev/bench_op.pir                                      []
 tools/dev/branch_status.pl                                  []
 tools/dev/checkdepend.pl                                    []
 tools/dev/create_language.pl                                [devel]
 tools/dev/debian_docs.sh                                    []
+tools/dev/dump_pbc.pl                                       []
 tools/dev/faces.pl                                          []
 tools/dev/fetch_languages.pl                                []
 tools/dev/gen_charset_tables.pl                             []
 tools/dev/gen_class.pl                                      []
 tools/dev/gen_makefile.pl                                   [devel]
 tools/dev/gen_valgrind_suppressions.pl                      []
+tools/dev/headerizer.pl                                     []
 tools/dev/install_dev_files.pl                              []
 tools/dev/install_doc_files.pl                              []
 tools/dev/install_files.pl                                  []
@@ -2120,7 +2119,7 @@
 tools/dev/mk_gitignore.pl                                   []
 tools/dev/mk_inno.pl                                        []
 tools/dev/mk_inno_language.pl                               []
-tools/dev/mk_language_shell.pl                              [devel]
+tools/dev/mk_language_shell.in                              []
 tools/dev/mk_manifest_and_skip.pl                           []
 tools/dev/mk_native_pbc                                     []
 tools/dev/mk_nci_thunks.pl                                  []
@@ -2128,9 +2127,11 @@
 tools/dev/mk_rpm_manifests.pl                               []
 tools/dev/nci_test_gen.pl                                   []
 tools/dev/nci_thunk_gen.pir                                 []
+tools/dev/ncidef2pasm.pl                                    []
 tools/dev/nm.pl                                             []
 tools/dev/nopaste.pl                                        []
 tools/dev/ops_not_tested.pl                                 []
+tools/dev/parrot-config.pir                                 []
 tools/dev/parrot-fuzzer                                     []
 tools/dev/parrot.supp                                       []
 tools/dev/parrot_api.pl                                     []
@@ -2139,6 +2140,9 @@
 tools/dev/parrotbench.pl                                    []
 tools/dev/pbc_header.pl                                     []
 tools/dev/pbc_to_exe.pir                                    [devel]
+tools/dev/perlcritic-cage.conf                              []
+tools/dev/perlcritic.conf                                   []
+tools/dev/perltidy.conf                                     []
 tools/dev/pmcrenumber.pl                                    []
 tools/dev/pmctree.pl                                        []
 tools/dev/pprof2cg.pl                                       [devel]
@@ -2146,6 +2150,7 @@
 tools/dev/search-ops.pl                                     []
 tools/dev/svnclobber.pl                                     []
 tools/dev/symlink.pl                                        []
+tools/dev/update_copyright.pl                               []
 tools/dev/vgp                                               []
 tools/dev/vgp_darwin                                        []
 tools/dev/vms-patch                                         []
@@ -2156,19 +2161,12 @@
 tools/docs/write_docs.pl                                    []
 tools/install/smoke.pl                                      []
 tools/install/smoke_languages.pl                            []
-tools/util/crow.pir                                         []
-tools/util/dump_pbc.pl                                      []
-tools/util/gen_release_info.pl                              []
-tools/util/inc_ver.pir                                      []
-tools/util/ncidef2pasm.pl                                   []
-tools/util/parrot-config.pir                                []
-tools/util/perlcritic-cage.conf                             []
-tools/util/perlcritic.conf                                  []
-tools/util/perltidy.conf                                    []
-tools/util/pgegrep                                          []
-tools/util/release.json                                     []
-tools/util/templates.json                                   []
-tools/util/update_copyright.pl                              []
+tools/release/README                                        []doc
+tools/release/crow.pir                                      []
+tools/release/gen_release_info.pl                           []
+tools/release/inc_ver.pir                                   []
+tools/release/release.json                                  []
+tools/release/templates.json                                []
 # Local variables:
 #   mode: text
 #   buffer-read-only: t

Modified: branches/gsoc_nci/MANIFEST.SKIP
==============================================================================
--- branches/gsoc_nci/MANIFEST.SKIP	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/MANIFEST.SKIP	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1,6 +1,6 @@
 # ex: set ro:
 # $Id$
-# generated by tools/dev/mk_manifest_and_skip.pl Thu Jun 24 14:06:33 2010 UT
+# generated by tools/dev/mk_manifest_and_skip.pl Thu Sep 23 09:20:45 2010 UT
 #
 # This file should contain a transcript of the svn:ignore properties
 # of the directories in the Parrot subversion repository. (Needed for
@@ -845,6 +845,8 @@
 ^src/packfile/.*\.o/
 ^src/packfile/.*\.obj$
 ^src/packfile/.*\.obj/
+^src/packfile/.*\.str$
+^src/packfile/.*\.str/
 # generated from svn:ignore of 'src/pmc/'
 ^src/pmc/.*\.c$
 ^src/pmc/.*\.c/
@@ -1030,6 +1032,9 @@
 ^t/op/.*\.pir/
 ^t/op/.*_pbcexe.*$
 ^t/op/.*_pbcexe.*/
+# generated from svn:ignore of 't/op/testlib/'
+^t/op/testlib/.*\.pbc$
+^t/op/testlib/.*\.pbc/
 # generated from svn:ignore of 't/perl/'
 ^t/perl/Parrot_Test_1\.pasm$
 ^t/perl/Parrot_Test_1\.pasm/
@@ -1046,6 +1051,9 @@
 ^t/pmc/.*\.pir/
 ^t/pmc/.*_pbcexe.*$
 ^t/pmc/.*_pbcexe.*/
+# generated from svn:ignore of 't/pmc/testlib/'
+^t/pmc/testlib/.*\.pbc$
+^t/pmc/testlib/.*\.pbc/
 # generated from svn:ignore of 't/src/'
 ^t/src/.*_.*$
 ^t/src/.*_.*/
@@ -1077,6 +1085,9 @@
 ^t/tools/pmc2c\..*\.h/
 ^t/tools/pmc2c\..*\.pmc$
 ^t/tools/pmc2c\..*\.pmc/
+# generated from svn:ignore of 'tools/dev/'
+^tools/dev/mk_language_shell\.pl$
+^tools/dev/mk_language_shell\.pl/
 # Local variables:
 #   mode: text
 #   buffer-read-only: t

Modified: branches/gsoc_nci/MANIFEST.generated
==============================================================================
--- branches/gsoc_nci/MANIFEST.generated	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/MANIFEST.generated	Tue Sep 28 17:16:52 2010	(r49366)
@@ -2,11 +2,11 @@
 # See tools/dev/install_files.pl for documentation on the
 # format of this file.
 # Please re-sort this file after *EVERY* modification
-blib/lib/libparrot.2.6.0.dylib                   [main]lib
+blib/lib/libparrot.2.8.0.dylib                   [main]lib
 blib/lib/libparrot.a                             [main]lib
 blib/lib/libparrot.dylib                         [main]lib
 blib/lib/libparrot.so                            [main]lib
-blib/lib/libparrot.so.2.6.0                      [main]lib
+blib/lib/libparrot.so.2.8.0                      [main]lib
 compilers/data_json/data_json.pbc                [data_json]
 config/gen/call_list/opengl.in                   []
 docs/ops/bit.pod                                 [doc]
@@ -69,9 +69,10 @@
 include/pmc/pmc_hash.h                           [devel]include
 include/pmc/pmc_hashiterator.h                   [devel]include
 include/pmc/pmc_hashiteratorkey.h                [devel]include
-include/pmc/pmc_imageio.h                        [devel]include
+include/pmc/pmc_imageiofreeze.h                  [devel]include
 include/pmc/pmc_imageiosize.h                    [devel]include
 include/pmc/pmc_imageiostrings.h                 [devel]include
+include/pmc/pmc_imageiothaw.h                    [devel]include
 include/pmc/pmc_integer.h                        [devel]include
 include/pmc/pmc_iterator.h                       [devel]include
 include/pmc/pmc_key.h                            [devel]include
@@ -80,6 +81,7 @@
 include/pmc/pmc_managedstruct.h                  [devel]include
 include/pmc/pmc_multisub.h                       [devel]include
 include/pmc/pmc_namespace.h                      [devel]include
+include/pmc/pmc_nativepccmethod.h                [devel]include
 include/pmc/pmc_nci.h                            [devel]include
 include/pmc/pmc_null.h                           [devel]include
 include/pmc/pmc_object.h                         [devel]include
@@ -363,9 +365,10 @@
 src/pmc/hash.dump                                [devel]src
 src/pmc/hashiterator.dump                        [devel]src
 src/pmc/hashiteratorkey.dump                     [devel]src
-src/pmc/imageio.dump                             [devel]src
+src/pmc/imageiofreeze.dump                       [devel]src
 src/pmc/imageiosize.dump                         [devel]src
 src/pmc/imageiostrings.dump                      [devel]src
+src/pmc/imageiothaw.dump                         [devel]src
 src/pmc/integer.dump                             [devel]src
 src/pmc/iterator.dump                            [devel]src
 src/pmc/key.dump                                 [devel]src
@@ -374,6 +377,7 @@
 src/pmc/managedstruct.dump                       [devel]src
 src/pmc/multisub.dump                            [devel]src
 src/pmc/namespace.dump                           [devel]src
+src/pmc/nativepccmethod.dump                     [devel]src
 src/pmc/nci.dump                                 [devel]src
 src/pmc/null.dump                                [devel]src
 src/pmc/object.dump                              [devel]src
@@ -419,4 +423,5 @@
 src/pmc/unmanagedstruct.dump                     [devel]src
 src/string_private_cstring.h                     []
 tools/build/dynpmc.pl                            []
+tools/dev/mk_language_shell.pl                   [devel]
 vtable.dump                                      [devel]src

Modified: branches/gsoc_nci/NEWS
==============================================================================
--- branches/gsoc_nci/NEWS	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/NEWS	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1,11 +1,63 @@
 # $Id$
 
+New in 2.9.0
+- Core
+  + New default garbage collector
+- Testing
+  + "make smoke" now respects TEST_JOBS
+- GitMigration
+- Compilers
+
+New in 2.8.0
+- Core
+  + Inlined hashing and comparison functions
+  + Hash memory allocation moved from system malloc to lazy allocated
+  + Avoided infinite catching of exceptions while dying from exception
+  + Some svn fixes
+  + Added a check for duplicate vtable entries in PMCs
+  + Building Parrot with Perl 5.12 and gcc-4.5 / g++-4.5
+  + Eliminated cruft left over after dynops_mapping
+  + Improved charset and string encoding
+  + Better organisation of programs by reposition it to "tools/build" and "tools/release"
+  + Implemented Exception clone vtable function
+  + Added experimental function Parrot_getpid and getpid method
+  + --gc-threshold command line argument added, which controls the % of memory wasted by the GC
+  + Closed a lot of tickets
+- Testing
+  + Added more core pmc tests
+  + Rearranged some tests with C coverage
+  + We now have Smolder back, at http://smolder.parrot.org . Submit reports with "make smoke"
+  + skip_all implementation in Parrot's Test::More completed
+- GitMigration
+  + Set up a test site for github trac plugin at http://mksig.org/trac/
+  + Code of Trac plugin at github is on http://github.com/cotto/github-trac
+  + Parrot is now mirrored on github at http://github.com/parrot/parrot
+- Compilers
+  + Fixed problem with imcc HLL in load_bytecode difference between loading a pbc and compiling a pir
+ 
+New in 2.7.0
+- Core
+  + cleanups in packfile and freeze/thaw handling
+  + Hash optimizations that improve HLL startup and run time
+  + As always, many bug fixes and other optimizations
+- Runtime
+  + some runtime library cleanups
+- Testing
+  + added more tests to improve coverage
+  + new codingstd test for documentation in .pmc files
+- Documentation
+  + added documentation to .pmc files (some still missing but headers in place)
+  + general documentation improvements and bringing up-to-date
+- NQP-rx
+  + Updated version included from http://github.com/perl6/nqp-rx includes
+    speed improvements
+
 New in 2.6.0
 - Core
   + Plug some memory leaks
   + As always, bug fixes and some optimizations
 - Runtime
-  + added (experimental) URI::Escape 
+  + added (experimental) URI::Escape
 - Testing
   + Improved test coverage of core parrot
 - Documentation
@@ -13,7 +65,7 @@
 - Platforms
   + The Fedora package 'parrot-devel' install the files for syntax-highlighting
     and automatic indenting for the vim editor
-- NQP-rx 
+- NQP-rx
   + Updated version included from http://github.com/perl6/nqp-rx includes
     new or improved: regex backtracking, named assertions, interactive mode,
     and setting (a minimal but useful runtime library)

Modified: branches/gsoc_nci/PBC_COMPAT
==============================================================================
--- branches/gsoc_nci/PBC_COMPAT	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/PBC_COMPAT	Tue Sep 28 17:16:52 2010	(r49366)
@@ -28,6 +28,10 @@
 
 # please insert tab separated entries at the top of the list
 
+8.5	2010.08.24	plobsing	eliminate fixup table
+8.4	2010.09.19	cotto	add imageiothaw and imageiofreeze PMCs (plobsing)
+8.3	2010.09.15	luben	removed logical vtables
+8.2	2010.08.19	cotto	minor version bump for 2.7.0
 8.1	2010.08.10	plobsing	merge dynop_mapping branch
 8.0	2010.07.20	coke	released 2.6.0
 7.0	2010.04.20	gerd	released 2.3.0 (version # added ex post facto, as all previous version #s were published)

Modified: branches/gsoc_nci/README
==============================================================================
--- branches/gsoc_nci/README	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/README	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1,4 +1,4 @@
-This is Parrot, version 2.6.0
+This is Parrot, version 2.8.0
 ------------------------------
 
 Parrot is Copyright (C) 2001-2010, Parrot Foundation.
@@ -11,6 +11,11 @@
 This code is distributed under the terms of the Artistic License 2.0.
 For more details, see the full text of the license in the file LICENSE.
 
+OVERVIEW
+--------
+Parrot is a virtual machine designed to efficiently compile and execute
+bytecode for dynamic languages.
+
 PREREQUISITES
 -------------
 

Modified: branches/gsoc_nci/RESPONSIBLE_PARTIES
==============================================================================
--- branches/gsoc_nci/RESPONSIBLE_PARTIES	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/RESPONSIBLE_PARTIES	Tue Sep 28 17:16:52 2010	(r49366)
@@ -28,6 +28,7 @@
                                 Christoph Otto
                                 Jonathan Leto
                                 Gerd Pokorra
+                                Michael Hind
 
 Metacommitter                   Allison Randal
                                 Jerry Gay
@@ -87,5 +88,6 @@
                                 Francois Perrad
                                 Mark Glines
                                 Bruce Gray
+                                Michael Hind
 
 General Contributor             See CREDITS

Modified: branches/gsoc_nci/VERSION
==============================================================================
--- branches/gsoc_nci/VERSION	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/VERSION	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1 +1 @@
-2.6.0
+2.8.0

Modified: branches/gsoc_nci/compilers/imcc/Rules.in
==============================================================================
--- branches/gsoc_nci/compilers/imcc/Rules.in	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/Rules.in	Tue Sep 28 17:16:52 2010	(r49366)
@@ -10,6 +10,8 @@
     compilers/imcc/symreg.h \
     compilers/imcc/unit.h \
     $(INC_DIR)/oplib/ops.h \
+    $(INC_DIR)/oplib/core_ops.h \
+    $(INC_DIR)/runcore_api.h \
     $(PARROT_H_HEADERS)
 
 compilers/imcc/instructions$(O) : \
@@ -24,6 +26,8 @@
     compilers/imcc/symreg.h \
     compilers/imcc/unit.h \
     $(INC_DIR)/oplib/ops.h \
+    $(INC_DIR)/oplib/core_ops.h \
+    $(INC_DIR)/runcore_api.h \
     $(PARROT_H_HEADERS)
 
 compilers/imcc/pbc$(O) : \
@@ -37,6 +41,8 @@
     compilers/imcc/symreg.h \
     compilers/imcc/unit.h \
     $(INC_DIR)/oplib/ops.h \
+    $(INC_DIR)/oplib/core_ops.h \
+    $(INC_DIR)/runcore_api.h \
     $(PARROT_H_HEADERS) \
     include/pmc/pmc_sub.h
 
@@ -83,6 +89,8 @@
     compilers/imcc/symreg.h \
     compilers/imcc/unit.h \
     $(INC_DIR)/oplib/ops.h \
+    $(INC_DIR)/oplib/core_ops.h \
+    $(INC_DIR)/runcore_api.h \
     $(PARROT_H_HEADERS)
 
 compilers/imcc/debug$(O) : \
@@ -163,6 +171,8 @@
     compilers/imcc/symreg.h \
     compilers/imcc/unit.h \
     $(INC_DIR)/oplib/ops.h \
+    $(INC_DIR)/oplib/core_ops.h \
+    $(INC_DIR)/runcore_api.h \
     $(PARROT_H_HEADERS)
 	$(CC) $(CFLAGS) @optimize::compilers/imcc/optimizer.c@ @ccwarn::compilers/imcc/optimizer.c@ @cc_shared@ -I$(@D) @cc_o_out@$@ -c compilers/imcc/optimizer.c
 

Modified: branches/gsoc_nci/compilers/imcc/cfg.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/cfg.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/cfg.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -29,6 +29,7 @@
 #include <string.h>
 #include "imc.h"
 #include "optimizer.h"
+#include "parrot/oplib/core_ops.h"
 
 /* HEADERIZER HFILE: compilers/imcc/cfg.h */
 
@@ -276,7 +277,7 @@
         ins->index   = ++i;
         ins->bbindex = unit->n_basic_blocks - 1;
 
-        if (ins->opnum == -1 && (ins->type & ITPCCSUB)) {
+        if (!ins->op && (ins->type & ITPCCSUB)) {
             if (first) {
                 if (ins->type & ITLABEL) {
                     expand_pcc_sub_ret(interp, unit, ins);
@@ -347,9 +348,10 @@
 {
     ASSERT_ARGS(bb_check_set_addr)
     const Instruction *ins;
+    op_lib_t *core_ops = PARROT_GET_CORE_OPLIB(interp);
 
     for (ins = unit->instructions; ins; ins = ins->next) {
-        if ((ins->opnum == PARROT_OP_set_addr_p_ic)
+        if ((ins->op == &core_ops->op_info_table[PARROT_OP_set_addr_p_ic])
         &&   STREQ(label->name, ins->symregs[1]->name)) {
             IMCC_debug(interp, DEBUG_CFG, "set_addr %s\n",
                     ins->symregs[1]->name);

Modified: branches/gsoc_nci/compilers/imcc/debug.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/debug.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/debug.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2009, Parrot Foundation.
+ * Copyright (C) 2002-2010, Parrot Foundation.
  * $Id$
  */
 
@@ -200,10 +200,10 @@
 
         if (bb) {
             Parrot_io_fprintf(interp, Parrot_io_STDERR(interp),
-                    "%4i %4d %4d %4d\t%x\t%8x %4d %4d %4d  %c ",
+                    "%4i %4d %4d %4d\t%x\t%8x %4d %4d %4d  ",
                      ins->index, ins->line, bb->index, bb->loop_depth,
-                     ins->flags, (ins->type & ~ITEXT), ins->opnum,
-                     ins->opsize, pc, ins->type & ITEXT ? 'X' : ' ');
+                     ins->flags, ins->type, OP_INFO_OPNUM(ins->op),
+                     ins->opsize, pc);
         }
         else {
              fprintf(stderr, "\t");

Modified: branches/gsoc_nci/compilers/imcc/imc.h
==============================================================================
--- branches/gsoc_nci/compilers/imcc/imc.h	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/imc.h	Tue Sep 28 17:16:52 2010	(r49366)
@@ -196,8 +196,8 @@
         __attribute__nonnull__(3)
         FUNC_MODIFIES(*error_message);
 
-PARROT_WARN_UNUSED_RESULT
-int check_op(PARROT_INTERP,
+void check_op(PARROT_INTERP,
+    ARGOUT(op_info_t **op_info),
     ARGOUT(char *fullname),
     ARGIN(const char *name),
     ARGIN(SymReg * const * r),
@@ -207,6 +207,8 @@
         __attribute__nonnull__(2)
         __attribute__nonnull__(3)
         __attribute__nonnull__(4)
+        __attribute__nonnull__(5)
+        FUNC_MODIFIES(*op_info)
         FUNC_MODIFIES(*fullname);
 
 PARROT_WARN_UNUSED_RESULT
@@ -316,27 +318,13 @@
 void register_compilers(PARROT_INTERP)
         __attribute__nonnull__(1);
 
-PARROT_WARN_UNUSED_RESULT
-int try_find_op(PARROT_INTERP,
-    ARGMOD(IMC_Unit *unit),
-    ARGIN(const char *name),
-    ARGMOD(SymReg **r),
-    int n,
-    int keyvec,
-    int emit)
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2)
-        __attribute__nonnull__(3)
-        __attribute__nonnull__(4)
-        FUNC_MODIFIES(*unit)
-        FUNC_MODIFIES(*r);
-
 #define ASSERT_ARGS_imcc_compile_file __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(fullname) \
     , PARROT_ASSERT_ARG(error_message))
 #define ASSERT_ARGS_check_op __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(op_info) \
     , PARROT_ASSERT_ARG(fullname) \
     , PARROT_ASSERT_ARG(name) \
     , PARROT_ASSERT_ARG(r))
@@ -386,11 +374,6 @@
     , PARROT_ASSERT_ARG(args))
 #define ASSERT_ARGS_register_compilers __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_try_find_op __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(interp) \
-    , PARROT_ASSERT_ARG(unit) \
-    , PARROT_ASSERT_ARG(name) \
-    , PARROT_ASSERT_ARG(r))
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 /* HEADERIZER END: compilers/imcc/parser_util.c */
 
@@ -562,7 +545,6 @@
     SymHash               ghash;
     jmp_buf               jump_buf;        /* The jump for error  handling */
     int                   IMCC_DEBUG;
-    int                   allocated;
     int                   cnr;
     int                   debug;
     int                   dont_optimize;

Modified: branches/gsoc_nci/compilers/imcc/imcc.l
==============================================================================
--- branches/gsoc_nci/compilers/imcc/imcc.l	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/imcc.l	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1457,7 +1457,7 @@
             if (((r->pcc_sub->pragma & P_METHOD)
             ||   (IMCC_INFO(interp)->cur_unit->is_vtable_method))
             &&   !strcmp(text, "self")) {
-                valp->sr = mk_ident(interp, "self", 'P');
+                valp->sr = mk_ident(interp, "self", 'P', VTIDENTIFIER);
                 IMCC_INFO(interp)->cur_unit->type |= IMC_HAS_SELF;
                 return VAR;
             }

Modified: branches/gsoc_nci/compilers/imcc/imcc.y
==============================================================================
--- branches/gsoc_nci/compilers/imcc/imcc.y	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/imcc.y	Tue Sep 28 17:16:52 2010	(r49366)
@@ -206,21 +206,6 @@
 
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
-static Instruction* mk_pmc_const(PARROT_INTERP,
-    ARGMOD(IMC_Unit *unit),
-    ARGIN(const char *type),
-    ARGMOD(SymReg *left),
-    ARGIN(const char *constant))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2)
-        __attribute__nonnull__(3)
-        __attribute__nonnull__(4)
-        __attribute__nonnull__(5)
-        FUNC_MODIFIES(*unit)
-        FUNC_MODIFIES(*left);
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
 static Instruction* mk_pmc_const_named(PARROT_INTERP,
     ARGMOD(IMC_Unit *unit),
     ARGIN(const char *name),
@@ -323,12 +308,6 @@
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit) \
     , PARROT_ASSERT_ARG(fmt))
-#define ASSERT_ARGS_mk_pmc_const __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(interp) \
-    , PARROT_ASSERT_ARG(unit) \
-    , PARROT_ASSERT_ARG(type) \
-    , PARROT_ASSERT_ARG(left) \
-    , PARROT_ASSERT_ARG(constant))
 #define ASSERT_ARGS_mk_pmc_const_named __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit) \
@@ -422,70 +401,6 @@
 
 /*
 
-=item C<static Instruction* mk_pmc_const(PARROT_INTERP, IMC_Unit *unit, const
-char *type, SymReg *left, const char *constant)>
-
-=cut
-
-*/
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-static Instruction*
-mk_pmc_const(PARROT_INTERP, ARGMOD(IMC_Unit *unit), ARGIN(const char *type),
-        ARGMOD(SymReg *left), ARGIN(const char *constant))
-{
-    ASSERT_ARGS(mk_pmc_const)
-    const int type_enum = atoi(type);
-    const int ascii = (*constant == '\'' || *constant == '"');
-    SymReg *rhs;
-    SymReg *r[3];
-    char   *name;
-
-    if (left->type == VTADDRESS) {      /* IDENTIFIER */
-        if (IMCC_INFO(interp)->state->pasm_file) {
-            IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
-                        "Ident as PMC constant",
-                        " %s\n", left->name);
-        }
-        left->type = VTIDENTIFIER;
-        left->set = 'P';
-    }
-    r[0] = left;
-    if (ascii) {
-        /* strip delimiters */
-        name                   = mem_sys_strdup(constant + 1);
-        name[strlen(name) - 1] = 0;
-    }
-    else {
-        name = mem_sys_strdup(constant);
-    }
-
-    switch (type_enum) {
-      case enum_class_Sub:
-      case enum_class_Coroutine:
-        rhs = mk_const(interp, name, 'p');
-
-        if (!ascii)
-            rhs->type |= VT_ENCODED;
-
-        rhs->usage    |= U_FIXUP | U_SUBID_LOOKUP;
-        break;
-      default:
-        rhs = mk_const(interp, name, 'P');
-        break;
-    }
-
-    r[1]          = rhs;
-    rhs->pmc_type = type_enum;
-
-    mem_sys_free(name);
-
-    return INS(interp, unit, "set_p_pc", "", r, 2, 0, 1);
-}
-
-/*
-
 =item C<static Instruction* mk_pmc_const_named(PARROT_INTERP, IMC_Unit *unit,
 const char *name, SymReg *left, const char *constant)>
 
@@ -1251,14 +1166,7 @@
    ;
 
 pmc_const:
-     CONST { IMCC_INFO(interp)->is_def = 1; } INTC var_or_i '=' any_string
-         {
-           $$ = mk_pmc_const(interp, IMCC_INFO(interp)->cur_unit, $3, $4, $6);
-           mem_sys_free($6);
-           IMCC_INFO(interp)->is_def = 0;
-         }
-
-     | CONST { IMCC_INFO(interp)->is_def = 1; } STRINGC var_or_i '=' any_string
+     CONST { IMCC_INFO(interp)->is_def = 1; } STRINGC var_or_i '=' any_string
          {
            $$ = mk_pmc_const_named(interp, IMCC_INFO(interp)->cur_unit, $3, $4, $6);
            mem_sys_free($3);
@@ -1447,7 +1355,7 @@
            }
            if ($3 & VT_NAMED && !($3 & VT_FLAT) && !IMCC_INFO(interp)->adv_named_id)
                adv_named_set(interp, $2);
-           $$ = mk_ident(interp, $2, $1);
+           $$ = mk_ident(interp, $2, $1, VTIDENTIFIER);
            $$->type |= $3;
            mem_sys_free($2);
           }
@@ -1730,7 +1638,7 @@
          {
            IdList * const l = $4;
            SymReg *ignored;
-           ignored = mk_ident(interp, l->id, $3);
+           ignored = mk_ident(interp, l->id, $3, VTIDENTIFIER);
            UNUSED(ignored);
            IMCC_INFO(interp)->is_def = 0;
            $$ = 0;
@@ -1959,7 +1867,7 @@
            IdList *l = $4;
            while (l) {
                IdList *l1;
-               mk_ident(interp, l->id, $3);
+               mk_ident(interp, l->id, $3, VTIDENTIFIER);
                l1 = l;
                l  = l->next;
                mem_sys_free(l1->id);
@@ -2269,9 +2177,8 @@
    | ADV_NAMED                 { $$ = VT_NAMED;    }
    | ADV_CALL_SIG              { $$ = VT_CALL_SIG; }
 
-   /* don't free $3 here; adv_named_set uses the pointer directly */
-   | ADV_NAMED '(' USTRINGC ')' { adv_named_set_u(interp, $3); $$ = 0; }
-   | ADV_NAMED '(' STRINGC  ')' { adv_named_set(interp, $3);   $$ = 0; }
+   | ADV_NAMED '(' USTRINGC ')' { adv_named_set_u(interp, $3); mem_sys_free($3); $$ = 0; }
+   | ADV_NAMED '(' STRINGC  ')' { adv_named_set(interp, $3);   mem_sys_free($3); $$ = 0; }
    ;
 
 result:

Modified: branches/gsoc_nci/compilers/imcc/imclexer.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/imclexer.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/imclexer.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -75,7 +75,6 @@
 typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
 
 /* Limits of integral types. */
 #ifndef INT8_MIN
@@ -106,6 +105,8 @@
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! C99 */
+
 #endif /* ! FLEXINT_H */
 
 #ifdef __cplusplus
@@ -179,7 +180,15 @@
 
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
 #define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
 #endif
 
 /* The state buf must be large enough to hold one state per character in the main buffer.
@@ -2514,7 +2523,7 @@
 
 
 
-#line 2518 "compilers/imcc/imclexer.c"
+#line 2527 "compilers/imcc/imclexer.c"
 
 #define INITIAL 0
 #define emit 1
@@ -2649,7 +2658,12 @@
     
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
 #define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
@@ -2657,7 +2671,7 @@
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO fwrite( yytext, yyleng, 1, yyout )
+#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -2668,7 +2682,7 @@
 	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
 		{ \
 		int c = '*'; \
-		int n; \
+		size_t n; \
 		for ( n = 0; n < max_size && \
 			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
 			buf[n] = (char) c; \
@@ -2773,7 +2787,7 @@
             return 0;
         }
 
-#line 2777 "compilers/imcc/imclexer.c"
+#line 2791 "compilers/imcc/imclexer.c"
 
 	if ( !yyg->yy_init )
 		{
@@ -3967,7 +3981,7 @@
 #line 725 "compilers/imcc/imcc.l"
 ECHO;
 	YY_BREAK
-#line 3971 "compilers/imcc/imclexer.c"
+#line 3985 "compilers/imcc/imclexer.c"
 case YY_STATE_EOF(pod):
 case YY_STATE_EOF(cmt1):
 case YY_STATE_EOF(cmt2):
@@ -4756,8 +4770,8 @@
 
 /** Setup the input buffer state to scan the given bytes. The next call to yylex() will
  * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
  * @param yyscanner The scanner object.
  * @return the newly allocated buffer state object.
  */
@@ -5914,7 +5928,7 @@
             if (((r->pcc_sub->pragma & P_METHOD)
             ||   (IMCC_INFO(interp)->cur_unit->is_vtable_method))
             &&   !strcmp(text, "self")) {
-                valp->sr = mk_ident(interp, "self", 'P');
+                valp->sr = mk_ident(interp, "self", 'P', VTIDENTIFIER);
                 IMCC_INFO(interp)->cur_unit->type |= IMC_HAS_SELF;
                 return VAR;
             }

Modified: branches/gsoc_nci/compilers/imcc/imcparser.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/imcparser.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/imcparser.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -9,13 +9,12 @@
  */
 /* HEADERIZER HFILE: none */
 /* HEADERIZER STOP */
-
-/* A Bison parser, made by GNU Bison 2.4.1.  */
+/* A Bison parser, made by GNU Bison 2.4.3.  */
 
 /* Skeleton implementation for Bison's Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+   2009, 2010 Free Software Foundation, Inc.
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -57,7 +56,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.4.1"
+#define YYBISON_VERSION "2.4.3"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -288,21 +287,6 @@
 
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
-static Instruction* mk_pmc_const(PARROT_INTERP,
-    ARGMOD(IMC_Unit *unit),
-    ARGIN(const char *type),
-    ARGMOD(SymReg *left),
-    ARGIN(const char *constant))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2)
-        __attribute__nonnull__(3)
-        __attribute__nonnull__(4)
-        __attribute__nonnull__(5)
-        FUNC_MODIFIES(*unit)
-        FUNC_MODIFIES(*left);
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
 static Instruction* mk_pmc_const_named(PARROT_INTERP,
     ARGMOD(IMC_Unit *unit),
     ARGIN(const char *name),
@@ -405,12 +389,6 @@
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit) \
     , PARROT_ASSERT_ARG(fmt))
-#define ASSERT_ARGS_mk_pmc_const __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(interp) \
-    , PARROT_ASSERT_ARG(unit) \
-    , PARROT_ASSERT_ARG(type) \
-    , PARROT_ASSERT_ARG(left) \
-    , PARROT_ASSERT_ARG(constant))
 #define ASSERT_ARGS_mk_pmc_const_named __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(unit) \
@@ -504,70 +482,6 @@
 
 /*
 
-=item C<static Instruction* mk_pmc_const(PARROT_INTERP, IMC_Unit *unit, const
-char *type, SymReg *left, const char *constant)>
-
-=cut
-
-*/
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-static Instruction*
-mk_pmc_const(PARROT_INTERP, ARGMOD(IMC_Unit *unit), ARGIN(const char *type),
-        ARGMOD(SymReg *left), ARGIN(const char *constant))
-{
-    ASSERT_ARGS(mk_pmc_const)
-    const int type_enum = atoi(type);
-    const int ascii = (*constant == '\'' || *constant == '"');
-    SymReg *rhs;
-    SymReg *r[3];
-    char   *name;
-
-    if (left->type == VTADDRESS) {      /* IDENTIFIER */
-        if (IMCC_INFO(interp)->state->pasm_file) {
-            IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
-                        "Ident as PMC constant",
-                        " %s\n", left->name);
-        }
-        left->type = VTIDENTIFIER;
-        left->set = 'P';
-    }
-    r[0] = left;
-    if (ascii) {
-        /* strip delimiters */
-        name                   = mem_sys_strdup(constant + 1);
-        name[strlen(name) - 1] = 0;
-    }
-    else {
-        name = mem_sys_strdup(constant);
-    }
-
-    switch (type_enum) {
-      case enum_class_Sub:
-      case enum_class_Coroutine:
-        rhs = mk_const(interp, name, 'p');
-
-        if (!ascii)
-            rhs->type |= VT_ENCODED;
-
-        rhs->usage    |= U_FIXUP | U_SUBID_LOOKUP;
-        break;
-      default:
-        rhs = mk_const(interp, name, 'P');
-        break;
-    }
-
-    r[1]          = rhs;
-    rhs->pmc_type = type_enum;
-
-    mem_sys_free(name);
-
-    return INS(interp, unit, "set_p_pc", "", r, 2, 0, 1);
-}
-
-/*
-
 =item C<static Instruction* mk_pmc_const_named(PARROT_INTERP, IMC_Unit *unit,
 const char *name, SymReg *left, const char *constant)>
 
@@ -1151,7 +1065,7 @@
 
 
 /* Line 189 of yacc.c  */
-#line 1144 "compilers/imcc/imcparser.c"
+#line 1058 "compilers/imcc/imcparser.c"
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
@@ -1424,7 +1338,7 @@
 {
 
 /* Line 214 of yacc.c  */
-#line 1071 "compilers/imcc/imcc.y"
+#line 986 "compilers/imcc/imcc.y"
 
     IdList * idlist;
     int t;
@@ -1435,7 +1349,7 @@
 
 
 /* Line 214 of yacc.c  */
-#line 1428 "compilers/imcc/imcparser.c"
+#line 1342 "compilers/imcc/imcparser.c"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -1447,7 +1361,7 @@
 
 
 /* Line 264 of yacc.c  */
-#line 1440 "compilers/imcc/imcparser.c"
+#line 1354 "compilers/imcc/imcparser.c"
 
 #ifdef short
 # undef short
@@ -1497,7 +1411,7 @@
 #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
 
 #ifndef YY_
-# if YYENABLE_NLS
+# if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
 #   define YY_(msgid) dgettext ("bison-runtime", msgid)
@@ -1662,16 +1576,16 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  31
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   662
+#define YYLAST   664
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  136
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  129
+#define YYNNTS  128
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  342
+#define YYNRULES  340
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  545
+#define YYNSTATES  540
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -1730,181 +1644,180 @@
 {
        0,     0,     3,     5,     7,    10,    12,    14,    16,    18,
       21,    23,    25,    27,    30,    34,    40,    44,    49,    52,
-      53,    60,    61,    68,    69,    76,    78,    80,    82,    85,
-      89,    92,    94,    96,    98,   100,   102,   103,   107,   108,
-     113,   116,   121,   122,   124,   125,   130,   131,   133,   137,
-     141,   144,   145,   148,   150,   154,   155,   156,   157,   168,
-     169,   172,   176,   177,   181,   185,   190,   195,   200,   202,
-     207,   209,   214,   216,   221,   226,   228,   233,   234,   238,
-     240,   242,   244,   246,   248,   250,   252,   256,   257,   259,
-     260,   270,   271,   274,   275,   279,   280,   282,   284,   287,
-     289,   291,   293,   295,   297,   299,   301,   303,   305,   307,
-     309,   311,   313,   315,   321,   325,   329,   333,   337,   343,
-     349,   350,   354,   357,   358,   362,   366,   367,   372,   373,
-     376,   378,   380,   382,   384,   389,   394,   396,   398,   399,
-     405,   407,   408,   414,   415,   418,   422,   423,   426,   430,
-     434,   438,   439,   445,   447,   449,   450,   452,   456,   460,
-     466,   468,   471,   472,   475,   478,   480,   482,   484,   486,
-     487,   489,   492,   494,   496,   500,   503,   505,   509,   512,
-     513,   515,   517,   519,   520,   525,   530,   535,   536,   543,
-     545,   546,   553,   556,   559,   562,   565,   567,   569,   571,
-     573,   574,   576,   578,   580,   582,   586,   591,   597,   604,
-     611,   615,   616,   626,   628,   630,   632,   636,   638,   640,
-     642,   644,   646,   648,   650,   652,   654,   656,   658,   660,
-     662,   664,   666,   668,   670,   672,   674,   676,   678,   680,
-     682,   684,   686,   688,   689,   695,   699,   701,   703,   705,
-     707,   709,   711,   713,   715,   717,   719,   721,   723,   725,
-     730,   732,   734,   736,   738,   742,   746,   750,   754,   755,
-     761,   762,   766,   768,   774,   778,   782,   785,   786,   789,
-     791,   793,   795,   800,   805,   808,   812,   818,   820,   824,
-     825,   827,   829,   836,   842,   847,   852,   859,   865,   867,
-     869,   871,   873,   875,   877,   879,   881,   883,   885,   886,
-     888,   892,   894,   896,   901,   905,   907,   909,   911,   913,
-     915,   917,   919,   921,   923,   925,   927,   928,   931,   932,
-     935,   937,   941,   943,   945,   947,   949,   951,   953,   955,
-     957,   959,   961
+      53,    60,    61,    68,    70,    72,    74,    77,    81,    84,
+      86,    88,    90,    92,    94,    95,    99,   100,   105,   108,
+     113,   114,   116,   117,   122,   123,   125,   129,   133,   136,
+     137,   140,   142,   146,   147,   148,   149,   160,   161,   164,
+     168,   169,   173,   177,   182,   187,   192,   194,   199,   201,
+     206,   208,   213,   218,   220,   225,   226,   230,   232,   234,
+     236,   238,   240,   242,   244,   248,   249,   251,   252,   262,
+     263,   266,   267,   271,   272,   274,   276,   279,   281,   283,
+     285,   287,   289,   291,   293,   295,   297,   299,   301,   303,
+     305,   307,   313,   317,   321,   325,   329,   335,   341,   342,
+     346,   349,   350,   354,   358,   359,   364,   365,   368,   370,
+     372,   374,   376,   381,   386,   388,   390,   391,   397,   399,
+     400,   406,   407,   410,   414,   415,   418,   422,   426,   430,
+     431,   437,   439,   441,   442,   444,   448,   452,   458,   460,
+     463,   464,   467,   470,   472,   474,   476,   478,   479,   481,
+     484,   486,   488,   492,   495,   497,   501,   504,   505,   507,
+     509,   511,   512,   517,   522,   527,   528,   535,   537,   538,
+     545,   548,   551,   554,   557,   559,   561,   563,   565,   566,
+     568,   570,   572,   574,   578,   583,   589,   596,   603,   607,
+     608,   618,   620,   622,   624,   628,   630,   632,   634,   636,
+     638,   640,   642,   644,   646,   648,   650,   652,   654,   656,
+     658,   660,   662,   664,   666,   668,   670,   672,   674,   676,
+     678,   680,   681,   687,   691,   693,   695,   697,   699,   701,
+     703,   705,   707,   709,   711,   713,   715,   717,   722,   724,
+     726,   728,   730,   734,   738,   742,   746,   747,   753,   754,
+     758,   760,   766,   770,   774,   777,   778,   781,   783,   785,
+     787,   792,   797,   800,   804,   810,   812,   816,   817,   819,
+     821,   828,   834,   839,   844,   851,   857,   859,   861,   863,
+     865,   867,   869,   871,   873,   875,   877,   878,   880,   884,
+     886,   888,   893,   897,   899,   901,   903,   905,   907,   909,
+     911,   913,   915,   917,   919,   920,   923,   924,   927,   929,
+     933,   935,   937,   939,   941,   943,   945,   947,   949,   951,
+     953
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int16 yyrhs[] =
 {
      137,     0,    -1,   138,    -1,   139,    -1,   138,   139,    -1,
-     159,    -1,   144,    -1,   164,    -1,   156,    -1,   109,     4,
+     158,    -1,   144,    -1,   163,    -1,   155,    -1,   109,     4,
       -1,   140,    -1,   141,    -1,     4,    -1,   143,     4,    -1,
       95,   111,     4,    -1,     8,   112,    70,   111,     4,    -1,
-       9,   111,     4,    -1,    32,   111,    70,   264,    -1,     7,
-     111,    -1,    -1,    31,   145,   223,   107,   121,   264,    -1,
-      -1,    31,   147,   112,   254,   121,   149,    -1,    -1,    31,
-     148,   111,   254,   121,   149,    -1,   111,    -1,   114,    -1,
-     151,    -1,   150,   151,    -1,   212,   152,     4,    -1,   109,
-       4,    -1,   118,    -1,   117,    -1,   159,    -1,   146,    -1,
-     140,    -1,    -1,   153,   115,   155,    -1,    -1,    76,   154,
-     186,   100,    -1,    14,   255,    -1,    30,   111,    70,   108,
-      -1,    -1,   248,    -1,    -1,   101,   157,   158,   102,    -1,
-      -1,   150,    -1,    25,   160,     4,    -1,   122,   161,   123,
-      -1,   122,   123,    -1,    -1,   162,   163,    -1,   263,    -1,
-     163,   124,   263,    -1,    -1,    -1,    -1,    27,   165,   251,
-     166,   186,     4,   167,   168,   181,    71,    -1,    -1,   168,
-       4,    -1,   168,   169,     4,    -1,    -1,     5,   170,   171,
-      -1,   223,   107,   195,    -1,    93,   125,   179,   126,    -1,
-      91,   125,   111,   126,    -1,    91,   125,   107,   126,    -1,
-      94,    -1,    94,   125,   111,   126,    -1,    89,    -1,    89,
-     125,   149,   126,    -1,    98,    -1,    98,   125,   149,   126,
-      -1,    96,   125,   111,   126,    -1,    97,    -1,    97,   125,
-     149,   126,    -1,    -1,   179,    70,   180,    -1,   180,    -1,
-      50,    -1,    51,    -1,    53,    -1,    52,    -1,   107,    -1,
-     111,    -1,   122,   256,   123,    -1,    -1,   209,    -1,    -1,
-      73,     4,   183,   190,   185,   189,   184,   192,    74,    -1,
-      -1,   214,     4,    -1,    -1,    83,   255,     4,    -1,    -1,
-     187,    -1,   188,    -1,   187,   188,    -1,    85,    -1,    86,
-      -1,    84,    -1,    87,    -1,    88,    -1,    90,    -1,    92,
-      -1,   172,    -1,   173,    -1,   174,    -1,   175,    -1,   176,
-      -1,   177,    -1,   178,    -1,    75,   255,    70,   255,     4,
-      -1,    75,   255,     4,    -1,    81,   255,     4,    -1,    82,
-     247,     4,    -1,    82,   111,     4,    -1,    82,   247,    70,
-     255,     4,    -1,    82,   111,    70,   255,     4,    -1,    -1,
-     190,   191,     4,    -1,    11,   237,    -1,    -1,   192,   193,
-       4,    -1,    61,   247,   195,    -1,    -1,    29,   194,   223,
-     217,    -1,    -1,   195,   196,    -1,    18,    -1,    19,    -1,
-      20,    -1,    21,    -1,    21,   125,   111,   126,    -1,    21,
-     125,   114,   126,    -1,    99,    -1,    24,    -1,    -1,    77,
-       4,   198,   201,    78,    -1,   205,    -1,    -1,    79,     4,
-     200,   202,    80,    -1,    -1,   201,     4,    -1,   201,   203,
-       4,    -1,    -1,   202,     4,    -1,   202,   204,     4,    -1,
-      15,   255,   238,    -1,    16,   255,   238,    -1,    -1,   207,
-     125,   206,   208,   126,    -1,    62,    -1,    64,    -1,    -1,
-     237,    -1,   111,    22,   255,    -1,   208,    70,   237,    -1,
-     208,    70,   111,    22,   255,    -1,   211,    -1,   209,   211,
-      -1,    -1,   210,   215,    -1,   109,     4,    -1,   118,    -1,
-     117,    -1,   141,    -1,   142,    -1,    -1,   213,    -1,   213,
-     214,    -1,   214,    -1,   100,    -1,   212,   219,     4,    -1,
-       1,     4,    -1,   217,    -1,   216,    70,   217,    -1,   107,
-     218,    -1,    -1,    99,    -1,   224,    -1,   242,    -1,    -1,
-      29,   220,   223,   216,    -1,    30,   111,    70,   247,    -1,
-      30,   114,    70,   247,    -1,    -1,    31,   221,   223,   107,
-     121,   264,    -1,   146,    -1,    -1,    33,   222,   223,   107,
-     121,   264,    -1,    63,   234,    -1,    10,   253,    -1,   115,
-     248,    -1,    14,   255,    -1,   234,    -1,   182,    -1,   197,
-      -1,   199,    -1,    -1,    50,    -1,    51,    -1,    52,    -1,
-      53,    -1,   247,   121,   255,    -1,   247,   121,   226,   255,
-      -1,   247,   121,   255,   227,   255,    -1,   247,   121,   255,
-     122,   256,   123,    -1,   247,   122,   256,   123,   121,   255,
-      -1,   247,   121,   234,    -1,    -1,   125,   225,   241,   126,
-     121,   233,   125,   236,   126,    -1,   228,    -1,   230,    -1,
-     232,    -1,   247,   121,    14,    -1,   127,    -1,   128,    -1,
-     129,    -1,   129,    -1,   130,    -1,   131,    -1,   132,    -1,
-     133,    -1,    42,    -1,    66,    -1,   120,    -1,    55,    -1,
-      56,    -1,    57,    -1,    58,    -1,    59,    -1,    60,    -1,
-      48,    -1,    49,    -1,    67,    -1,    68,    -1,    69,    -1,
-      54,    -1,   134,    -1,   135,    -1,   128,    -1,    -1,    65,
-     229,   125,   241,   126,    -1,   247,   231,   255,    -1,    34,
-      -1,    35,    -1,    36,    -1,    37,    -1,    44,    -1,    43,
-      -1,    38,    -1,    39,    -1,    40,    -1,    41,    -1,    45,
-      -1,    46,    -1,    47,    -1,   247,   121,   115,   155,    -1,
-     107,    -1,   111,    -1,   114,    -1,   247,    -1,   247,   119,
-     252,    -1,   247,   119,   114,    -1,   247,   119,   111,    -1,
-     247,   119,   247,    -1,    -1,   233,   235,   125,   236,   126,
-      -1,    -1,   236,    70,   237,    -1,   237,    -1,   236,    70,
-     111,    22,   255,    -1,   255,    22,   255,    -1,   111,    22,
-     255,    -1,   255,   238,    -1,    -1,   238,   239,    -1,    17,
-      -1,    21,    -1,    24,    -1,    21,   125,   114,   126,    -1,
-      21,   125,   111,   126,    -1,   247,   195,    -1,   241,    70,
-     240,    -1,   241,    70,   111,    22,   247,    -1,   240,    -1,
-     111,    22,   247,    -1,    -1,   244,    -1,   243,    -1,    13,
-     255,   246,   255,    10,   253,    -1,    13,    14,   255,    10,
-     253,    -1,    13,   255,   245,   253,    -1,    12,   255,   245,
-     253,    -1,    12,   255,   246,   255,    10,   253,    -1,    12,
-      14,   255,    10,   253,    -1,    70,    -1,    10,    -1,    55,
-      -1,    56,    -1,    57,    -1,    58,    -1,    59,    -1,    60,
-      -1,   116,    -1,   262,    -1,    -1,   249,    -1,   249,    70,
-     250,    -1,   250,    -1,   254,    -1,   247,   122,   256,   123,
-      -1,   122,   258,   123,    -1,   252,    -1,   111,    -1,   114,
-      -1,   107,    -1,   115,    -1,   107,    -1,   115,    -1,   253,
-      -1,   255,    -1,   247,    -1,   264,    -1,    -1,   257,   260,
-      -1,    -1,   259,   260,    -1,   261,    -1,   260,   124,   261,
-      -1,   255,    -1,   103,    -1,   104,    -1,   105,    -1,   106,
-      -1,   108,    -1,   111,    -1,   114,    -1,   112,    -1,   113,
-      -1,   263,    -1
+       9,   111,     4,    -1,    32,   111,    70,   263,    -1,     7,
+     111,    -1,    -1,    31,   145,   222,   107,   121,   263,    -1,
+      -1,    31,   147,   111,   253,   121,   148,    -1,   111,    -1,
+     114,    -1,   150,    -1,   149,   150,    -1,   211,   151,     4,
+      -1,   109,     4,    -1,   118,    -1,   117,    -1,   158,    -1,
+     146,    -1,   140,    -1,    -1,   152,   115,   154,    -1,    -1,
+      76,   153,   185,   100,    -1,    14,   254,    -1,    30,   111,
+      70,   108,    -1,    -1,   247,    -1,    -1,   101,   156,   157,
+     102,    -1,    -1,   149,    -1,    25,   159,     4,    -1,   122,
+     160,   123,    -1,   122,   123,    -1,    -1,   161,   162,    -1,
+     262,    -1,   162,   124,   262,    -1,    -1,    -1,    -1,    27,
+     164,   250,   165,   185,     4,   166,   167,   180,    71,    -1,
+      -1,   167,     4,    -1,   167,   168,     4,    -1,    -1,     5,
+     169,   170,    -1,   222,   107,   194,    -1,    93,   125,   178,
+     126,    -1,    91,   125,   111,   126,    -1,    91,   125,   107,
+     126,    -1,    94,    -1,    94,   125,   111,   126,    -1,    89,
+      -1,    89,   125,   148,   126,    -1,    98,    -1,    98,   125,
+     148,   126,    -1,    96,   125,   111,   126,    -1,    97,    -1,
+      97,   125,   148,   126,    -1,    -1,   178,    70,   179,    -1,
+     179,    -1,    50,    -1,    51,    -1,    53,    -1,    52,    -1,
+     107,    -1,   111,    -1,   122,   255,   123,    -1,    -1,   208,
+      -1,    -1,    73,     4,   182,   189,   184,   188,   183,   191,
+      74,    -1,    -1,   213,     4,    -1,    -1,    83,   254,     4,
+      -1,    -1,   186,    -1,   187,    -1,   186,   187,    -1,    85,
+      -1,    86,    -1,    84,    -1,    87,    -1,    88,    -1,    90,
+      -1,    92,    -1,   171,    -1,   172,    -1,   173,    -1,   174,
+      -1,   175,    -1,   176,    -1,   177,    -1,    75,   254,    70,
+     254,     4,    -1,    75,   254,     4,    -1,    81,   254,     4,
+      -1,    82,   246,     4,    -1,    82,   111,     4,    -1,    82,
+     246,    70,   254,     4,    -1,    82,   111,    70,   254,     4,
+      -1,    -1,   189,   190,     4,    -1,    11,   236,    -1,    -1,
+     191,   192,     4,    -1,    61,   246,   194,    -1,    -1,    29,
+     193,   222,   216,    -1,    -1,   194,   195,    -1,    18,    -1,
+      19,    -1,    20,    -1,    21,    -1,    21,   125,   111,   126,
+      -1,    21,   125,   114,   126,    -1,    99,    -1,    24,    -1,
+      -1,    77,     4,   197,   200,    78,    -1,   204,    -1,    -1,
+      79,     4,   199,   201,    80,    -1,    -1,   200,     4,    -1,
+     200,   202,     4,    -1,    -1,   201,     4,    -1,   201,   203,
+       4,    -1,    15,   254,   237,    -1,    16,   254,   237,    -1,
+      -1,   206,   125,   205,   207,   126,    -1,    62,    -1,    64,
+      -1,    -1,   236,    -1,   111,    22,   254,    -1,   207,    70,
+     236,    -1,   207,    70,   111,    22,   254,    -1,   210,    -1,
+     208,   210,    -1,    -1,   209,   214,    -1,   109,     4,    -1,
+     118,    -1,   117,    -1,   141,    -1,   142,    -1,    -1,   212,
+      -1,   212,   213,    -1,   213,    -1,   100,    -1,   211,   218,
+       4,    -1,     1,     4,    -1,   216,    -1,   215,    70,   216,
+      -1,   107,   217,    -1,    -1,    99,    -1,   223,    -1,   241,
+      -1,    -1,    29,   219,   222,   215,    -1,    30,   111,    70,
+     246,    -1,    30,   114,    70,   246,    -1,    -1,    31,   220,
+     222,   107,   121,   263,    -1,   146,    -1,    -1,    33,   221,
+     222,   107,   121,   263,    -1,    63,   233,    -1,    10,   252,
+      -1,   115,   247,    -1,    14,   254,    -1,   233,    -1,   181,
+      -1,   196,    -1,   198,    -1,    -1,    50,    -1,    51,    -1,
+      52,    -1,    53,    -1,   246,   121,   254,    -1,   246,   121,
+     225,   254,    -1,   246,   121,   254,   226,   254,    -1,   246,
+     121,   254,   122,   255,   123,    -1,   246,   122,   255,   123,
+     121,   254,    -1,   246,   121,   233,    -1,    -1,   125,   224,
+     240,   126,   121,   232,   125,   235,   126,    -1,   227,    -1,
+     229,    -1,   231,    -1,   246,   121,    14,    -1,   127,    -1,
+     128,    -1,   129,    -1,   129,    -1,   130,    -1,   131,    -1,
+     132,    -1,   133,    -1,    42,    -1,    66,    -1,   120,    -1,
+      55,    -1,    56,    -1,    57,    -1,    58,    -1,    59,    -1,
+      60,    -1,    48,    -1,    49,    -1,    67,    -1,    68,    -1,
+      69,    -1,    54,    -1,   134,    -1,   135,    -1,   128,    -1,
+      -1,    65,   228,   125,   240,   126,    -1,   246,   230,   254,
+      -1,    34,    -1,    35,    -1,    36,    -1,    37,    -1,    44,
+      -1,    43,    -1,    38,    -1,    39,    -1,    40,    -1,    41,
+      -1,    45,    -1,    46,    -1,    47,    -1,   246,   121,   115,
+     154,    -1,   107,    -1,   111,    -1,   114,    -1,   246,    -1,
+     246,   119,   251,    -1,   246,   119,   114,    -1,   246,   119,
+     111,    -1,   246,   119,   246,    -1,    -1,   232,   234,   125,
+     235,   126,    -1,    -1,   235,    70,   236,    -1,   236,    -1,
+     235,    70,   111,    22,   254,    -1,   254,    22,   254,    -1,
+     111,    22,   254,    -1,   254,   237,    -1,    -1,   237,   238,
+      -1,    17,    -1,    21,    -1,    24,    -1,    21,   125,   114,
+     126,    -1,    21,   125,   111,   126,    -1,   246,   194,    -1,
+     240,    70,   239,    -1,   240,    70,   111,    22,   246,    -1,
+     239,    -1,   111,    22,   246,    -1,    -1,   243,    -1,   242,
+      -1,    13,   254,   245,   254,    10,   252,    -1,    13,    14,
+     254,    10,   252,    -1,    13,   254,   244,   252,    -1,    12,
+     254,   244,   252,    -1,    12,   254,   245,   254,    10,   252,
+      -1,    12,    14,   254,    10,   252,    -1,    70,    -1,    10,
+      -1,    55,    -1,    56,    -1,    57,    -1,    58,    -1,    59,
+      -1,    60,    -1,   116,    -1,   261,    -1,    -1,   248,    -1,
+     248,    70,   249,    -1,   249,    -1,   253,    -1,   246,   122,
+     255,   123,    -1,   122,   257,   123,    -1,   251,    -1,   111,
+      -1,   114,    -1,   107,    -1,   115,    -1,   107,    -1,   115,
+      -1,   252,    -1,   254,    -1,   246,    -1,   263,    -1,    -1,
+     256,   259,    -1,    -1,   258,   259,    -1,   260,    -1,   259,
+     124,   260,    -1,   254,    -1,   103,    -1,   104,    -1,   105,
+      -1,   106,    -1,   108,    -1,   111,    -1,   114,    -1,   112,
+      -1,   113,    -1,   262,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,  1166,  1166,  1170,  1171,  1175,  1176,  1177,  1183,  1189,
-    1190,  1191,  1192,  1196,  1197,  1206,  1212,  1220,  1232,  1245,
-    1245,  1254,  1254,  1261,  1261,  1270,  1271,  1275,  1276,  1280,
-    1281,  1282,  1283,  1284,  1285,  1286,  1289,  1289,  1298,  1297,
-    1310,  1314,  1327,  1331,  1335,  1335,  1347,  1349,  1353,  1368,
-    1369,  1373,  1373,  1385,  1386,  1395,  1399,  1403,  1394,  1415,
-    1416,  1417,  1430,  1430,  1434,  1459,  1463,  1469,  1478,  1484,
-    1493,  1499,  1508,  1514,  1523,  1531,  1536,  1547,  1550,  1555,
-    1563,  1564,  1565,  1566,  1567,  1578,  1589,  1592,  1594,  1599,
-    1598,  1629,  1630,  1634,  1635,  1639,  1640,  1644,  1645,  1649,
-    1650,  1651,  1652,  1653,  1654,  1655,  1656,  1657,  1658,  1659,
-    1660,  1661,  1662,  1666,  1671,  1675,  1679,  1683,  1687,  1692,
-    1701,  1702,  1714,  1719,  1720,  1728,  1729,  1729,  1741,  1742,
-    1746,  1747,  1748,  1749,  1750,  1751,  1752,  1753,  1758,  1758,
-    1761,  1769,  1769,  1775,  1776,  1781,  1789,  1790,  1795,  1803,
-    1807,  1812,  1811,  1824,  1825,  1829,  1830,  1840,  1845,  1855,
-    1864,  1865,  1877,  1881,  1883,  1884,  1885,  1886,  1887,  1891,
-    1892,  1896,  1897,  1901,  1912,  1913,  1924,  1931,  1940,  1948,
-    1950,  1955,  1956,  1957,  1957,  1970,  1987,  2000,  2000,  2007,
-    2008,  2008,  2014,  2020,  2024,  2036,  2037,  2038,  2039,  2040,
-    2041,  2045,  2046,  2047,  2048,  2052,  2054,  2056,  2058,  2060,
-    2063,  2070,  2069,  2078,  2079,  2080,  2081,  2089,  2090,  2091,
-    2095,  2096,  2097,  2098,  2099,  2100,  2101,  2102,  2103,  2104,
-    2105,  2106,  2107,  2108,  2109,  2110,  2111,  2112,  2113,  2114,
-    2115,  2116,  2117,  2123,  2122,  2134,  2139,  2140,  2141,  2142,
-    2143,  2144,  2145,  2146,  2147,  2148,  2149,  2150,  2151,  2156,
-    2167,  2168,  2169,  2170,  2176,  2190,  2196,  2202,  2208,  2207,
-    2216,  2217,  2227,  2237,  2244,  2249,  2259,  2263,  2264,  2268,
-    2269,  2270,  2273,  2274,  2278,  2282,  2292,  2298,  2308,  2313,
-    2317,  2318,  2322,  2326,  2330,  2337,  2341,  2345,  2352,  2353,
-    2357,  2358,  2359,  2360,  2361,  2362,  2366,  2367,  2371,  2372,
-    2376,  2377,  2381,  2382,  2389,  2396,  2397,  2398,  2402,  2403,
-    2407,  2408,  2412,  2413,  2417,  2418,  2422,  2422,  2434,  2434,
-    2446,  2447,  2455,  2462,  2463,  2464,  2465,  2466,  2470,  2471,
-    2475,  2476,  2477
+       0,  1081,  1081,  1085,  1086,  1090,  1091,  1092,  1098,  1104,
+    1105,  1106,  1107,  1111,  1112,  1121,  1127,  1135,  1147,  1160,
+    1160,  1169,  1169,  1178,  1179,  1183,  1184,  1188,  1189,  1190,
+    1191,  1192,  1193,  1194,  1197,  1197,  1206,  1205,  1218,  1222,
+    1235,  1239,  1243,  1243,  1255,  1257,  1261,  1276,  1277,  1281,
+    1281,  1293,  1294,  1303,  1307,  1311,  1302,  1323,  1324,  1325,
+    1338,  1338,  1342,  1367,  1371,  1377,  1386,  1392,  1401,  1407,
+    1416,  1422,  1431,  1439,  1444,  1455,  1458,  1463,  1471,  1472,
+    1473,  1474,  1475,  1486,  1497,  1500,  1502,  1507,  1506,  1537,
+    1538,  1542,  1543,  1547,  1548,  1552,  1553,  1557,  1558,  1559,
+    1560,  1561,  1562,  1563,  1564,  1565,  1566,  1567,  1568,  1569,
+    1570,  1574,  1579,  1583,  1587,  1591,  1595,  1600,  1609,  1610,
+    1622,  1627,  1628,  1636,  1637,  1637,  1649,  1650,  1654,  1655,
+    1656,  1657,  1658,  1659,  1660,  1661,  1666,  1666,  1669,  1677,
+    1677,  1683,  1684,  1689,  1697,  1698,  1703,  1711,  1715,  1720,
+    1719,  1732,  1733,  1737,  1738,  1748,  1753,  1763,  1772,  1773,
+    1785,  1789,  1791,  1792,  1793,  1794,  1795,  1799,  1800,  1804,
+    1805,  1809,  1820,  1821,  1832,  1839,  1848,  1856,  1858,  1863,
+    1864,  1865,  1865,  1878,  1895,  1908,  1908,  1915,  1916,  1916,
+    1922,  1928,  1932,  1944,  1945,  1946,  1947,  1948,  1949,  1953,
+    1954,  1955,  1956,  1960,  1962,  1964,  1966,  1968,  1971,  1978,
+    1977,  1986,  1987,  1988,  1989,  1997,  1998,  1999,  2003,  2004,
+    2005,  2006,  2007,  2008,  2009,  2010,  2011,  2012,  2013,  2014,
+    2015,  2016,  2017,  2018,  2019,  2020,  2021,  2022,  2023,  2024,
+    2025,  2031,  2030,  2042,  2047,  2048,  2049,  2050,  2051,  2052,
+    2053,  2054,  2055,  2056,  2057,  2058,  2059,  2064,  2075,  2076,
+    2077,  2078,  2084,  2098,  2104,  2110,  2116,  2115,  2124,  2125,
+    2135,  2145,  2152,  2157,  2167,  2171,  2172,  2176,  2177,  2178,
+    2180,  2181,  2185,  2189,  2199,  2205,  2215,  2220,  2224,  2225,
+    2229,  2233,  2237,  2244,  2248,  2252,  2259,  2260,  2264,  2265,
+    2266,  2267,  2268,  2269,  2273,  2274,  2278,  2279,  2283,  2284,
+    2288,  2289,  2296,  2303,  2304,  2305,  2309,  2310,  2314,  2315,
+    2319,  2320,  2324,  2325,  2329,  2329,  2341,  2341,  2353,  2354,
+    2362,  2369,  2370,  2371,  2372,  2373,  2377,  2378,  2382,  2383,
+    2384
 };
 #endif
 
@@ -1937,27 +1850,27 @@
   "'-'", "'+'", "'*'", "'/'", "'%'", "'&'", "'|'", "$accept", "program",
   "compilation_units", "compilation_unit", "pragma", "location_directive",
   "annotate_directive", "hll_def", "constdef", "$@1", "pmc_const", "$@2",
-  "$@3", "any_string", "pasmcode", "pasmline", "pasm_inst", "$@4", "$@5",
-  "pasm_args", "emit", "$@6", "opt_pasmcode", "class_namespace",
-  "maybe_ns", "nslist", "$@7", "_nslist", "sub", "$@8", "$@9", "$@10",
-  "sub_params", "sub_param", "$@11", "sub_param_type_def", "multi",
+  "any_string", "pasmcode", "pasmline", "pasm_inst", "$@3", "$@4",
+  "pasm_args", "emit", "$@5", "opt_pasmcode", "class_namespace",
+  "maybe_ns", "nslist", "$@6", "_nslist", "sub", "$@7", "$@8", "$@9",
+  "sub_params", "sub_param", "$@10", "sub_param_type_def", "multi",
   "outer", "vtable", "method", "ns_entry_name", "instanceof", "subid",
-  "multi_types", "multi_type", "sub_body", "pcc_sub_call", "@12",
+  "multi_types", "multi_type", "sub_body", "pcc_sub_call", "@11",
   "opt_label", "opt_invocant", "sub_proto", "sub_proto_list", "proto",
-  "pcc_call", "pcc_args", "pcc_arg", "pcc_results", "pcc_result", "$@13",
-  "paramtype_list", "paramtype", "pcc_ret", "$@14", "pcc_yield", "$@15",
+  "pcc_call", "pcc_args", "pcc_arg", "pcc_results", "pcc_result", "$@12",
+  "paramtype_list", "paramtype", "pcc_ret", "$@13", "pcc_yield", "$@14",
   "pcc_returns", "pcc_yields", "pcc_return", "pcc_set_yield",
-  "pcc_return_many", "$@16", "return_or_yield", "var_returns",
+  "pcc_return_many", "$@15", "return_or_yield", "var_returns",
   "statements", "helper_clear_state", "statement", "labels", "_labels",
   "label", "instruction", "id_list", "id_list_id", "opt_unique_reg",
-  "labeled_inst", "$@17", "$@18", "$@19", "type", "assignment", "@20",
-  "un_op", "bin_op", "get_results", "@21", "op_assign", "assign_op",
-  "func_assign", "the_sub", "sub_call", "@22", "arglist", "arg",
+  "labeled_inst", "$@16", "$@17", "$@18", "type", "assignment", "@19",
+  "un_op", "bin_op", "get_results", "@20", "op_assign", "assign_op",
+  "func_assign", "the_sub", "sub_call", "@21", "arglist", "arg",
   "argtype_list", "argtype", "result", "targetlist",
   "conditional_statement", "unless_statement", "if_statement",
   "comma_or_goto", "relop", "target", "vars", "_vars", "_var_or_i",
   "sub_label_op_c", "sub_label_op", "label_op", "var_or_i", "var",
-  "keylist", "$@23", "keylist_force", "$@24", "_keylist", "key", "reg",
+  "keylist", "$@22", "keylist_force", "$@23", "_keylist", "key", "reg",
   "stringc", "const", 0
 };
 #endif
@@ -1989,39 +1902,39 @@
 {
        0,   136,   137,   138,   138,   139,   139,   139,   139,   139,
      139,   139,   139,   140,   140,   141,   141,   142,   143,   145,
-     144,   147,   146,   148,   146,   149,   149,   150,   150,   151,
-     151,   151,   151,   151,   151,   151,   153,   152,   154,   152,
-     152,   152,   152,   155,   157,   156,   158,   158,   159,   160,
-     160,   162,   161,   163,   163,   165,   166,   167,   164,   168,
-     168,   168,   170,   169,   171,   172,   173,   173,   174,   174,
-     175,   175,   176,   176,   177,   178,   178,   179,   179,   179,
-     180,   180,   180,   180,   180,   180,   180,   181,   181,   183,
-     182,   184,   184,   185,   185,   186,   186,   187,   187,   188,
-     188,   188,   188,   188,   188,   188,   188,   188,   188,   188,
-     188,   188,   188,   189,   189,   189,   189,   189,   189,   189,
-     190,   190,   191,   192,   192,   193,   194,   193,   195,   195,
-     196,   196,   196,   196,   196,   196,   196,   196,   198,   197,
-     197,   200,   199,   201,   201,   201,   202,   202,   202,   203,
-     204,   206,   205,   207,   207,   208,   208,   208,   208,   208,
-     209,   209,   210,   211,   211,   211,   211,   211,   211,   212,
-     212,   213,   213,   214,   215,   215,   216,   216,   217,   218,
-     218,   219,   219,   220,   219,   219,   219,   221,   219,   219,
-     222,   219,   219,   219,   219,   219,   219,   219,   219,   219,
-     219,   223,   223,   223,   223,   224,   224,   224,   224,   224,
-     224,   225,   224,   224,   224,   224,   224,   226,   226,   226,
-     227,   227,   227,   227,   227,   227,   227,   227,   227,   227,
-     227,   227,   227,   227,   227,   227,   227,   227,   227,   227,
-     227,   227,   227,   229,   228,   230,   231,   231,   231,   231,
-     231,   231,   231,   231,   231,   231,   231,   231,   231,   232,
-     233,   233,   233,   233,   233,   233,   233,   233,   235,   234,
-     236,   236,   236,   236,   236,   236,   237,   238,   238,   239,
-     239,   239,   239,   239,   240,   241,   241,   241,   241,   241,
-     242,   242,   243,   243,   243,   244,   244,   244,   245,   245,
-     246,   246,   246,   246,   246,   246,   247,   247,   248,   248,
-     249,   249,   250,   250,   250,   251,   251,   251,   252,   252,
-     253,   253,   254,   254,   255,   255,   257,   256,   259,   258,
-     260,   260,   261,   262,   262,   262,   262,   262,   263,   263,
-     264,   264,   264
+     144,   147,   146,   148,   148,   149,   149,   150,   150,   150,
+     150,   150,   150,   150,   152,   151,   153,   151,   151,   151,
+     151,   154,   156,   155,   157,   157,   158,   159,   159,   161,
+     160,   162,   162,   164,   165,   166,   163,   167,   167,   167,
+     169,   168,   170,   171,   172,   172,   173,   173,   174,   174,
+     175,   175,   176,   177,   177,   178,   178,   178,   179,   179,
+     179,   179,   179,   179,   179,   180,   180,   182,   181,   183,
+     183,   184,   184,   185,   185,   186,   186,   187,   187,   187,
+     187,   187,   187,   187,   187,   187,   187,   187,   187,   187,
+     187,   188,   188,   188,   188,   188,   188,   188,   189,   189,
+     190,   191,   191,   192,   193,   192,   194,   194,   195,   195,
+     195,   195,   195,   195,   195,   195,   197,   196,   196,   199,
+     198,   200,   200,   200,   201,   201,   201,   202,   203,   205,
+     204,   206,   206,   207,   207,   207,   207,   207,   208,   208,
+     209,   210,   210,   210,   210,   210,   210,   211,   211,   212,
+     212,   213,   214,   214,   215,   215,   216,   217,   217,   218,
+     218,   219,   218,   218,   218,   220,   218,   218,   221,   218,
+     218,   218,   218,   218,   218,   218,   218,   218,   218,   222,
+     222,   222,   222,   223,   223,   223,   223,   223,   223,   224,
+     223,   223,   223,   223,   223,   225,   225,   225,   226,   226,
+     226,   226,   226,   226,   226,   226,   226,   226,   226,   226,
+     226,   226,   226,   226,   226,   226,   226,   226,   226,   226,
+     226,   228,   227,   229,   230,   230,   230,   230,   230,   230,
+     230,   230,   230,   230,   230,   230,   230,   231,   232,   232,
+     232,   232,   232,   232,   232,   232,   234,   233,   235,   235,
+     235,   235,   235,   235,   236,   237,   237,   238,   238,   238,
+     238,   238,   239,   240,   240,   240,   240,   240,   241,   241,
+     242,   242,   242,   243,   243,   243,   244,   244,   245,   245,
+     245,   245,   245,   245,   246,   246,   247,   247,   248,   248,
+     249,   249,   249,   250,   250,   250,   251,   251,   252,   252,
+     253,   253,   254,   254,   256,   255,   258,   257,   259,   259,
+     260,   261,   261,   261,   261,   261,   262,   262,   263,   263,
+     263
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -2029,39 +1942,39 @@
 {
        0,     2,     1,     1,     2,     1,     1,     1,     1,     2,
        1,     1,     1,     2,     3,     5,     3,     4,     2,     0,
-       6,     0,     6,     0,     6,     1,     1,     1,     2,     3,
-       2,     1,     1,     1,     1,     1,     0,     3,     0,     4,
-       2,     4,     0,     1,     0,     4,     0,     1,     3,     3,
-       2,     0,     2,     1,     3,     0,     0,     0,    10,     0,
-       2,     3,     0,     3,     3,     4,     4,     4,     1,     4,
-       1,     4,     1,     4,     4,     1,     4,     0,     3,     1,
-       1,     1,     1,     1,     1,     1,     3,     0,     1,     0,
-       9,     0,     2,     0,     3,     0,     1,     1,     2,     1,
+       6,     0,     6,     1,     1,     1,     2,     3,     2,     1,
+       1,     1,     1,     1,     0,     3,     0,     4,     2,     4,
+       0,     1,     0,     4,     0,     1,     3,     3,     2,     0,
+       2,     1,     3,     0,     0,     0,    10,     0,     2,     3,
+       0,     3,     3,     4,     4,     4,     1,     4,     1,     4,
+       1,     4,     4,     1,     4,     0,     3,     1,     1,     1,
+       1,     1,     1,     1,     3,     0,     1,     0,     9,     0,
+       2,     0,     3,     0,     1,     1,     2,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     5,     3,     3,     3,     3,     5,     5,
-       0,     3,     2,     0,     3,     3,     0,     4,     0,     2,
-       1,     1,     1,     1,     4,     4,     1,     1,     0,     5,
-       1,     0,     5,     0,     2,     3,     0,     2,     3,     3,
-       3,     0,     5,     1,     1,     0,     1,     3,     3,     5,
-       1,     2,     0,     2,     2,     1,     1,     1,     1,     0,
-       1,     2,     1,     1,     3,     2,     1,     3,     2,     0,
-       1,     1,     1,     0,     4,     4,     4,     0,     6,     1,
-       0,     6,     2,     2,     2,     2,     1,     1,     1,     1,
-       0,     1,     1,     1,     1,     3,     4,     5,     6,     6,
-       3,     0,     9,     1,     1,     1,     3,     1,     1,     1,
+       1,     5,     3,     3,     3,     3,     5,     5,     0,     3,
+       2,     0,     3,     3,     0,     4,     0,     2,     1,     1,
+       1,     1,     4,     4,     1,     1,     0,     5,     1,     0,
+       5,     0,     2,     3,     0,     2,     3,     3,     3,     0,
+       5,     1,     1,     0,     1,     3,     3,     5,     1,     2,
+       0,     2,     2,     1,     1,     1,     1,     0,     1,     2,
+       1,     1,     3,     2,     1,     3,     2,     0,     1,     1,
+       1,     0,     4,     4,     4,     0,     6,     1,     0,     6,
+       2,     2,     2,     2,     1,     1,     1,     1,     0,     1,
+       1,     1,     1,     3,     4,     5,     6,     6,     3,     0,
+       9,     1,     1,     1,     3,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     0,     5,     3,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     4,
-       1,     1,     1,     1,     3,     3,     3,     3,     0,     5,
-       0,     3,     1,     5,     3,     3,     2,     0,     2,     1,
-       1,     1,     4,     4,     2,     3,     5,     1,     3,     0,
-       1,     1,     6,     5,     4,     4,     6,     5,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     0,     1,
-       3,     1,     1,     4,     3,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     0,     2,     0,     2,
-       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1
+       1,     0,     5,     3,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     4,     1,     1,
+       1,     1,     3,     3,     3,     3,     0,     5,     0,     3,
+       1,     5,     3,     3,     2,     0,     2,     1,     1,     1,
+       4,     4,     2,     3,     5,     1,     3,     0,     1,     1,
+       6,     5,     4,     4,     6,     5,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     0,     1,     3,     1,
+       1,     4,     3,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     0,     2,     0,     2,     1,     3,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -2069,306 +1982,304 @@
    means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       0,    12,     0,     0,     0,     0,    55,    19,     0,    44,
+       0,    12,     0,     0,     0,     0,    53,    19,     0,    42,
        0,     0,     2,     3,    10,    11,     0,     6,     8,     5,
-       7,    18,     0,     0,    51,     0,     0,     0,     0,   169,
-       9,     1,     4,    13,     0,    16,    50,     0,     0,    48,
-     318,   316,   317,   319,    56,   315,   201,   202,   203,   204,
-       0,    14,    21,   173,     0,    32,    31,    35,    34,   169,
-      27,     0,    33,    36,   170,   172,     0,    49,   338,   339,
-      52,    53,    95,     0,     0,     0,    30,    28,    45,     0,
-       0,    38,     0,     0,   171,    15,     0,   101,    99,   100,
-     102,   103,    70,   104,     0,   105,     0,    68,     0,    75,
-      72,   106,   107,   108,   109,   110,   111,   112,     0,    96,
-      97,     0,     0,     0,   333,   334,   335,   336,   337,   340,
-     341,   306,   324,    40,   307,   342,   325,     0,    95,    29,
-     308,    54,     0,     0,    77,     0,     0,     0,     0,    57,
-      98,    20,   320,   321,   322,     0,   323,     0,     0,     0,
-     328,    37,   324,    43,   309,   311,   312,    25,    26,     0,
-       0,     0,    80,    81,    83,    82,    84,    85,   326,     0,
-      79,     0,     0,     0,     0,    59,     0,     0,    41,    39,
-       0,     0,   326,     0,    71,    67,    66,     0,     0,     0,
-      65,    69,    74,    76,    73,   162,    22,    24,   314,   332,
-     329,   330,     0,   310,    86,   327,    78,    60,    62,     0,
-       0,   166,   165,   167,   168,     0,     0,   162,     0,   160,
-       0,   313,     0,     0,   164,    61,    58,   161,     0,   200,
-     163,   331,    63,     0,     0,   175,     0,     0,     0,     0,
-     183,     0,   187,   190,   153,     0,   154,   243,     0,     0,
-       0,   260,   261,   262,   308,   211,   189,   197,   198,   199,
-     140,     0,     0,   181,   213,   214,   215,   268,   196,   182,
-     291,   290,   263,   128,    17,   193,     0,     0,     0,     0,
-     195,     0,     0,     0,     0,     0,   192,   263,     0,    89,
-     138,   141,   194,   289,   151,   174,     0,   246,   247,   248,
-     249,   252,   253,   254,   255,   251,   250,   256,   257,   258,
-       0,     0,   326,     0,    64,     0,   299,   300,   301,   302,
-     303,   304,   305,   298,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   289,   120,   143,   146,     0,   287,
-       0,   128,   155,   270,   266,   265,   267,   264,   216,   338,
-     339,   308,   217,   218,   219,     0,   210,   324,   205,     0,
-     245,   130,   131,   132,   133,   137,   136,   129,     0,   295,
-       0,     0,   294,     0,   179,   184,   176,   185,   186,     0,
-       0,     0,    93,     0,     0,     0,     0,     0,   284,   338,
-       0,   156,   277,   338,     0,   272,   277,   259,   206,   225,
-     234,   235,   239,   228,   229,   230,   231,   232,   233,   226,
-     236,   237,   238,   227,   326,   242,   220,   221,   222,   223,
-     224,   240,   241,     0,     0,     0,   297,     0,   293,     0,
-     180,   178,     0,     0,     0,   244,     0,     0,     0,     0,
-     144,     0,   139,     0,   147,     0,   142,     0,   288,     0,
-     285,     0,     0,     0,   152,   276,     0,     0,   269,     0,
-       0,   207,     0,     0,     0,   296,   292,   177,   188,   191,
-     122,     0,     0,     0,     0,    91,   121,   277,   145,   277,
-     148,     0,     0,   157,   338,   158,   279,   280,   281,   278,
-     275,   338,   271,   274,   208,   209,   134,   135,    94,     0,
-       0,     0,     0,   123,     0,   149,   150,   286,   270,     0,
-       0,     0,   114,     0,   115,   117,     0,   116,     0,     0,
-      92,     0,   159,     0,     0,   273,     0,     0,     0,   126,
-       0,    90,     0,   212,   283,   282,   113,   119,   118,     0,
-     128,   124,     0,   125,   127
+       7,    18,     0,     0,    49,     0,     0,     0,     0,   167,
+       9,     1,     4,    13,     0,    16,    48,     0,     0,    46,
+     316,   314,   315,   317,    54,   313,   199,   200,   201,   202,
+       0,    14,    21,   171,     0,    30,    29,    33,    32,   167,
+      25,     0,    31,    34,   168,   170,     0,    47,   336,   337,
+      50,    51,    93,     0,     0,    28,    26,    43,     0,     0,
+      36,     0,     0,   169,    15,     0,    99,    97,    98,   100,
+     101,    68,   102,     0,   103,     0,    66,     0,    73,    70,
+     104,   105,   106,   107,   108,   109,   110,     0,    94,    95,
+       0,     0,   331,   332,   333,   334,   335,   338,   339,   304,
+     322,    38,   305,   340,   323,     0,    93,    27,   306,    52,
+       0,     0,    75,     0,     0,     0,     0,    55,    96,    20,
+     318,   319,   320,     0,   321,     0,     0,   326,    35,   322,
+      41,   307,   309,   310,    23,    24,     0,     0,     0,    78,
+      79,    81,    80,    82,    83,   324,     0,    77,     0,     0,
+       0,     0,    57,     0,    39,    37,     0,     0,   324,     0,
+      69,    65,    64,     0,     0,     0,    63,    67,    72,    74,
+      71,   160,    22,   312,   330,   327,   328,     0,   308,    84,
+     325,    76,    58,    60,     0,     0,   164,   163,   165,   166,
+       0,     0,   160,     0,   158,     0,   311,     0,     0,   162,
+      59,    56,   159,     0,   198,   161,   329,    61,     0,     0,
+     173,     0,     0,     0,     0,   181,     0,   185,   188,   151,
+       0,   152,   241,     0,     0,     0,   258,   259,   260,   306,
+     209,   187,   195,   196,   197,   138,     0,     0,   179,   211,
+     212,   213,   266,   194,   180,   289,   288,   261,   126,    17,
+     191,     0,     0,     0,     0,   193,     0,     0,     0,     0,
+       0,   190,   261,     0,    87,   136,   139,   192,   287,   149,
+     172,     0,   244,   245,   246,   247,   250,   251,   252,   253,
+     249,   248,   254,   255,   256,     0,     0,   324,     0,    62,
+       0,   297,   298,   299,   300,   301,   302,   303,   296,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   287,
+     118,   141,   144,     0,   285,     0,   126,   153,   268,   264,
+     263,   265,   262,   214,   336,   337,   306,   215,   216,   217,
+       0,   208,   322,   203,     0,   243,   128,   129,   130,   131,
+     135,   134,   127,     0,   293,     0,     0,   292,     0,   177,
+     182,   174,   183,   184,     0,     0,     0,    91,     0,     0,
+       0,     0,     0,   282,   336,     0,   154,   275,   336,     0,
+     270,   275,   257,   204,   223,   232,   233,   237,   226,   227,
+     228,   229,   230,   231,   224,   234,   235,   236,   225,   324,
+     240,   218,   219,   220,   221,   222,   238,   239,     0,     0,
+       0,   295,     0,   291,     0,   178,   176,     0,     0,     0,
+     242,     0,     0,     0,     0,   142,     0,   137,     0,   145,
+       0,   140,     0,   286,     0,   283,     0,     0,     0,   150,
+     274,     0,     0,   267,     0,     0,   205,     0,     0,     0,
+     294,   290,   175,   186,   189,   120,     0,     0,     0,     0,
+      89,   119,   275,   143,   275,   146,     0,     0,   155,   336,
+     156,   277,   278,   279,   276,   273,   336,   269,   272,   206,
+     207,   132,   133,    92,     0,     0,     0,     0,   121,     0,
+     147,   148,   284,   268,     0,     0,     0,   112,     0,   113,
+     115,     0,   114,     0,     0,    90,     0,   157,     0,     0,
+     271,     0,     0,     0,   124,     0,    88,     0,   210,   281,
+     280,   111,   117,   116,     0,   126,   122,     0,   123,   125
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,    11,    12,    13,    14,    15,   214,    16,    17,    27,
-      58,    74,    75,   159,    59,    60,    82,    83,   128,   151,
-      18,    29,    61,    19,    25,    37,    38,    70,    20,    26,
-      72,   175,   195,   215,   222,   232,   101,   102,   103,   104,
-     105,   106,   107,   169,   170,   216,   257,   335,   503,   438,
-     108,   109,   110,   475,   382,   439,   519,   532,   539,   314,
-     367,   258,   336,   259,   337,   383,   384,   443,   447,   260,
-     342,   261,   390,   217,   218,   219,    63,    64,    65,   230,
-     375,   376,   431,   262,   281,   284,   285,    50,   263,   293,
-     355,   423,   264,   288,   265,   313,   266,   267,   268,   296,
-     394,   395,   455,   489,   339,   340,   269,   270,   271,   324,
-     325,   122,   153,   154,   155,    44,    45,   144,   156,   146,
-     187,   188,   180,   181,   200,   201,   124,   125,   126
+      -1,    11,    12,    13,    14,    15,   209,    16,    17,    27,
+      58,    74,   156,    59,    60,    81,    82,   126,   148,    18,
+      29,    61,    19,    25,    37,    38,    70,    20,    26,    72,
+     172,   191,   210,   217,   227,   100,   101,   102,   103,   104,
+     105,   106,   166,   167,   211,   252,   330,   498,   433,   107,
+     108,   109,   470,   377,   434,   514,   527,   534,   309,   362,
+     253,   331,   254,   332,   378,   379,   438,   442,   255,   337,
+     256,   385,   212,   213,   214,    63,    64,    65,   225,   370,
+     371,   426,   257,   276,   279,   280,    50,   258,   288,   350,
+     418,   259,   283,   260,   308,   261,   262,   263,   291,   389,
+     390,   450,   484,   334,   335,   264,   265,   266,   319,   320,
+     120,   150,   151,   152,    44,    45,   142,   153,   144,   183,
+     184,   176,   177,   195,   196,   122,   123,   124
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -448
+#define YYPACT_NINF -413
 static const yytype_int16 yypact[] =
 {
-      69,  -448,   -70,   -51,   -44,   -48,  -448,  -448,    22,  -448,
-     136,   150,    69,  -448,  -448,  -448,   153,  -448,  -448,  -448,
-    -448,  -448,    91,   159,    51,   185,   200,   135,   191,   204,
-    -448,  -448,  -448,  -448,    90,  -448,  -448,    99,   -68,  -448,
-    -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,
-     117,  -448,   141,  -448,   251,  -448,  -448,  -448,  -448,   234,
-    -448,   154,  -448,    12,   160,  -448,   257,  -448,  -448,  -448,
-     138,  -448,   413,   151,   170,   162,  -448,  -448,  -448,   189,
-     164,  -448,   279,   171,  -448,  -448,   -68,  -448,  -448,  -448,
-    -448,  -448,   166,  -448,   183,  -448,   184,   187,   192,   193,
-     194,  -448,  -448,  -448,  -448,  -448,  -448,  -448,   281,   413,
-    -448,   101,   426,   426,  -448,  -448,  -448,  -448,  -448,  -448,
-    -448,  -448,  -448,  -448,  -448,  -448,  -448,   226,   413,  -448,
-     374,  -448,    96,   -24,    -3,   199,   213,    96,    96,  -448,
-    -448,  -448,  -448,  -448,  -448,   207,  -448,   209,   217,   231,
-    -448,  -448,   210,  -448,   265,  -448,  -448,  -448,  -448,   211,
-     212,   214,  -448,  -448,  -448,  -448,  -448,  -448,  -448,   -58,
-    -448,   215,   216,   219,   221,  -448,    96,    96,  -448,  -448,
-     225,   189,  -448,   374,  -448,  -448,  -448,   227,   189,    -3,
-    -448,  -448,  -448,  -448,  -448,    19,  -448,  -448,  -448,  -448,
-     230,  -448,   232,  -448,  -448,   230,  -448,  -448,  -448,   222,
-     335,  -448,  -448,  -448,  -448,   345,   285,   172,     7,  -448,
-     189,  -448,   135,   289,  -448,  -448,  -448,  -448,   356,   163,
-    -448,  -448,  -448,   254,   101,  -448,   -62,   284,   302,   189,
-    -448,   119,   127,  -448,  -448,   317,  -448,  -448,   359,   360,
-     361,  -448,  -448,  -448,   374,  -448,  -448,  -448,  -448,  -448,
-    -448,   242,   364,  -448,  -448,  -448,  -448,  -448,  -448,  -448,
-    -448,  -448,   429,  -448,  -448,  -448,   189,   161,   189,   161,
-    -448,   135,   299,   300,   135,   135,  -448,   252,   247,  -448,
-    -448,  -448,  -448,   519,  -448,  -448,   250,  -448,  -448,  -448,
-    -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,
-     449,    40,  -448,   189,    39,   366,  -448,  -448,  -448,  -448,
-    -448,  -448,  -448,  -448,   -62,   189,   369,   -62,   189,   274,
-     546,   546,   275,   277,   519,  -448,  -448,  -448,   363,  -448,
-     -35,  -448,   463,   477,  -448,  -448,  -448,  -448,  -448,   261,
-     266,   374,  -448,  -448,  -448,   189,  -448,   -40,   393,   276,
-    -448,  -448,  -448,  -448,   278,  -448,  -448,  -448,   -62,  -448,
-     391,   -62,  -448,   394,   310,   341,  -448,  -448,  -448,   296,
-     298,     5,    -1,    14,     9,   546,   528,   305,    39,   405,
-      23,  -448,  -448,   414,    36,  -448,   416,  -448,  -448,  -448,
-    -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,
-    -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,
-    -448,  -448,  -448,   189,   319,   139,  -448,   -62,  -448,   -62,
-    -448,  -448,   274,   101,   101,  -448,   189,   189,   109,   439,
-    -448,   189,  -448,   440,  -448,   189,  -448,   441,  -448,   424,
-    -448,   317,   189,   491,  -448,   263,   189,   505,  -448,   189,
-     331,  -448,   189,   329,   330,  -448,  -448,  -448,  -448,  -448,
-    -448,   453,   189,   189,   537,   160,  -448,  -448,  -448,  -448,
-    -448,   546,   333,  -448,   461,  -448,  -448,   346,  -448,  -448,
-    -448,   462,  -448,  -448,  -448,  -448,  -448,  -448,  -448,    27,
-     487,    29,    35,  -448,   488,   263,   263,  -448,   477,   189,
-     140,   189,  -448,   189,  -448,  -448,   189,  -448,   189,   105,
-    -448,    46,  -448,   367,   368,  -448,   504,   508,   510,  -448,
-     546,  -448,   512,  -448,  -448,  -448,  -448,  -448,  -448,   135,
-    -448,  -448,   274,    39,  -448
+     320,  -413,  -102,   -90,   -60,   -61,  -413,  -413,   -39,  -413,
+      70,    89,   320,  -413,  -413,  -413,    93,  -413,  -413,  -413,
+    -413,  -413,    41,   121,   -30,   135,   -44,   139,   144,    57,
+    -413,  -413,  -413,  -413,    50,  -413,  -413,    42,    72,  -413,
+    -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,
+      65,  -413,  -413,  -413,   172,  -413,  -413,  -413,  -413,   156,
+    -413,    75,  -413,    24,    78,  -413,   178,  -413,  -413,  -413,
+      60,  -413,   427,    80,    91,  -413,  -413,  -413,   455,    95,
+    -413,   208,   103,  -413,  -413,    72,  -413,  -413,  -413,  -413,
+    -413,   125,  -413,   137,  -413,   150,   151,   152,   153,   154,
+    -413,  -413,  -413,  -413,  -413,  -413,  -413,   233,   427,  -413,
+      97,   440,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,
+    -413,  -413,  -413,  -413,  -413,   173,   427,  -413,   388,  -413,
+     108,   -26,   118,   141,   142,   108,   108,  -413,  -413,  -413,
+    -413,  -413,  -413,   159,  -413,   174,   164,  -413,  -413,   161,
+    -413,   215,  -413,  -413,  -413,  -413,   160,   167,   168,  -413,
+    -413,  -413,  -413,  -413,  -413,  -413,   -53,  -413,   170,   171,
+     175,   176,  -413,   108,  -413,  -413,   181,   455,  -413,   388,
+    -413,  -413,  -413,   188,   455,   118,  -413,  -413,  -413,  -413,
+    -413,    25,  -413,  -413,  -413,   193,  -413,   189,  -413,  -413,
+     193,  -413,  -413,  -413,   214,   315,  -413,  -413,  -413,  -413,
+     322,   259,    23,   184,  -413,   455,  -413,   139,   267,  -413,
+    -413,  -413,  -413,   337,    13,  -413,  -413,  -413,   231,    97,
+    -413,   -49,   202,   334,   455,  -413,   112,   235,  -413,  -413,
+     228,  -413,  -413,   345,   348,   351,  -413,  -413,  -413,   388,
+    -413,  -413,  -413,  -413,  -413,  -413,   232,   352,  -413,  -413,
+    -413,  -413,  -413,  -413,  -413,  -413,  -413,   443,  -413,  -413,
+    -413,   455,   211,   455,   211,  -413,   139,   290,   291,   139,
+     139,  -413,   240,   238,  -413,  -413,  -413,  -413,   128,  -413,
+    -413,   239,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,
+    -413,  -413,  -413,  -413,  -413,   469,   289,  -413,   455,    -8,
+     355,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,   -49,
+     455,   356,   -49,   455,   260,   306,   306,   261,   264,   128,
+    -413,  -413,  -413,   350,  -413,   -31,  -413,   483,   497,  -413,
+    -413,  -413,  -413,  -413,   250,   252,   388,  -413,  -413,  -413,
+     455,  -413,    28,   407,   255,  -413,  -413,  -413,  -413,   256,
+    -413,  -413,  -413,   -49,  -413,   370,   -49,  -413,   372,   284,
+     314,  -413,  -413,  -413,   265,   266,   -22,    -3,    32,     3,
+     306,   539,   270,    -8,   363,   -18,  -413,  -413,   366,   -14,
+    -413,   376,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,
+    -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,
+    -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,   455,   285,
+     113,  -413,   -49,  -413,   -49,  -413,  -413,   260,    97,    97,
+    -413,   455,   455,    69,   404,  -413,   455,  -413,   409,  -413,
+     455,  -413,   415,  -413,   398,  -413,   228,   455,   511,  -413,
+     143,   455,   525,  -413,   455,   300,  -413,   455,   298,   301,
+    -413,  -413,  -413,  -413,  -413,  -413,   428,   455,   455,   548,
+      78,  -413,  -413,  -413,  -413,  -413,   306,   309,  -413,   414,
+    -413,  -413,   316,  -413,  -413,  -413,   421,  -413,  -413,  -413,
+    -413,  -413,  -413,  -413,    14,   447,    31,    33,  -413,   448,
+     143,   143,  -413,   497,   455,   127,   455,  -413,   455,  -413,
+    -413,   455,  -413,   455,    84,  -413,   -11,  -413,   305,   318,
+    -413,   449,   450,   453,  -413,   306,  -413,   454,  -413,  -413,
+    -413,  -413,  -413,  -413,   139,  -413,  -413,   260,    -8,  -413
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -448,  -448,  -448,   483,   -15,  -161,  -448,  -448,  -448,  -448,
-     288,  -448,  -448,    71,  -448,   459,  -448,  -448,  -448,   168,
-    -448,  -448,  -448,    -7,  -448,  -448,  -448,  -448,  -448,  -448,
-    -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,
-    -448,  -448,  -448,  -448,   347,  -448,  -448,  -448,  -448,  -448,
-     392,  -448,   434,  -448,  -448,  -448,  -448,  -448,  -448,  -335,
-    -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,  -448,
-    -448,  -448,  -448,  -448,  -448,   318,   326,  -448,   -63,  -448,
-    -448,  -417,  -448,  -448,  -448,  -448,  -448,  -219,  -448,  -448,
-    -448,  -448,  -448,  -448,  -448,  -448,  -448,    94,  -181,  -448,
-      38,  -333,  -447,  -448,   173,   224,  -448,  -448,  -448,   268,
-     270,  -128,   307,  -448,   379,  -448,   260,  -229,   132,   -79,
-    -177,  -448,  -448,  -448,   384,   353,  -448,    43,  -107
+    -413,  -413,  -413,   456,    -9,  -167,  -413,  -413,  -413,  -413,
+     236,  -413,     0,  -413,   400,  -413,  -413,  -413,   123,  -413,
+    -413,  -413,    20,  -413,  -413,  -413,  -413,  -413,  -413,  -413,
+    -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,
+    -413,  -413,  -413,   286,  -413,  -413,  -413,  -413,  -413,   344,
+    -413,   364,  -413,  -413,  -413,  -413,  -413,  -413,  -331,  -413,
+    -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,  -413,
+    -413,  -413,  -413,  -413,   273,   292,  -413,   -63,  -413,  -413,
+    -406,  -413,  -413,  -413,  -413,  -413,  -211,  -413,  -413,  -413,
+    -413,  -413,  -413,  -413,  -413,  -413,    51,  -199,  -413,    -5,
+    -322,  -412,  -413,   126,   177,  -413,  -413,  -413,   234,   248,
+    -126,   277,  -413,   330,  -413,   223,  -217,   419,   -78,  -174,
+    -413,  -413,  -413,   347,   317,  -413,     2,  -107
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -264
+#define YYTABLE_NINF -262
 static const yytype_int16 yytable[] =
 {
-     123,    84,   152,   233,   141,   202,   388,   275,   228,   391,
-     436,  -169,   189,   444,    57,   467,   -42,  -169,   440,  -169,
-    -169,  -169,    62,   207,   208,   445,    79,     3,     4,   441,
-     505,   512,   506,   515,   213,   386,  -169,  -169,  -169,   517,
-    -169,    21,    80,    68,    57,   142,    69,   162,   163,   164,
-     165,   209,    62,   143,   348,   152,   213,   361,   362,   363,
-     364,    22,   329,   365,   286,   332,   333,    23,   190,  -169,
-    -169,  -169,  -169,     1,    24,   386,     2,     3,     4,   310,
-    -169,    71,   437,   160,  -169,  -263,  -169,   161,    81,   446,
-     -87,   387,   442,   453,     5,   369,     6,   513,   372,   516,
-       7,   272,   199,   470,   166,   518,   457,    53,   167,   199,
-    -169,  -169,  -169,  -169,  -169,  -169,   457,   287,  -169,   168,
-     485,  -169,  -169,  -169,   492,   544,   152,   274,   210,   131,
-     356,   435,  -169,    28,   529,   359,   211,   212,   366,   426,
-      30,   199,   428,   114,   115,   116,   117,   251,   118,   454,
-      31,   349,   119,   120,   350,   351,   121,    33,   277,   279,
-     280,    34,   458,    35,     8,   341,   530,   352,   353,   354,
-       9,   316,   533,   236,    36,   237,   238,   239,    10,   531,
-       3,     4,   346,   357,   472,    46,    47,    48,    49,    39,
-     473,   474,   240,   241,   242,    51,   243,   315,   465,   326,
-     466,    66,   377,   378,   209,   543,   341,   157,   173,   174,
-     158,     2,    68,   119,   120,    69,   317,   318,   319,   320,
-     321,   322,    67,   152,    73,   244,   245,   246,   247,     5,
-     282,   323,   358,   283,   360,    52,   248,   460,   -23,   -21,
-     249,     2,   250,   -88,   145,   147,   370,   196,   197,   373,
-     463,   523,   -23,   464,   524,    76,    78,   448,   341,     5,
-      53,    85,    86,   392,   396,    52,   114,   115,   116,   117,
-     251,   118,   111,   113,   252,   127,   398,   253,   254,   121,
-     486,   210,   112,   129,   487,   139,   130,   488,   255,   211,
-     212,   132,   114,   115,   116,   117,   148,   118,   276,     8,
-      68,   119,   120,    69,    53,   121,   -46,    40,   133,   134,
-     171,    41,   135,    54,    42,    43,   278,   136,   137,   138,
-     542,    55,    56,   287,   172,   178,   468,   469,   176,     8,
-     177,   179,   182,   223,    53,   183,   -47,   184,   185,   224,
-     186,   191,   192,    54,   461,   193,   502,   194,   198,   225,
-     204,    55,    56,   507,   220,   221,   226,   392,   471,   234,
-     235,   273,   477,   289,   290,   291,   479,   294,   295,   330,
-     331,   310,   334,   483,   392,   343,   368,   490,   392,   371,
-     493,   374,   379,   495,   380,   385,  -261,   114,   115,   116,
-     117,  -262,   118,   499,   500,    68,   119,   120,    69,   424,
-     121,   427,   540,   425,   429,   114,   115,   116,   117,   430,
-     118,   432,   504,    68,   119,   120,    69,   433,   121,   434,
-     114,   115,   116,   117,   251,   118,   451,   452,   252,   396,
-     522,   253,   525,   121,   526,   399,   456,   527,   459,   528,
-     462,   400,   401,   476,   478,   480,   481,   402,   403,   404,
-     405,   406,   407,   408,   494,   496,   497,   498,   508,   409,
-     410,   411,   412,   297,   298,   299,   300,   301,   302,   303,
-     304,   510,   305,   306,   307,   308,   309,   114,   115,   116,
-     117,   142,   118,   509,   511,    68,   119,   120,    69,   143,
-     121,   514,   520,   534,   535,    32,   150,    87,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,   536,    98,
-      99,   100,   537,   413,   538,   414,   541,   256,    77,   397,
-     149,   415,   416,   417,   418,   419,   420,   421,   422,   114,
-     115,   116,   117,   142,   118,   227,   206,    68,   119,   120,
-      69,   143,   121,   140,   229,   482,   521,   327,   310,   328,
-     311,   312,   114,   115,   116,   117,    40,   118,   381,   450,
-     344,   292,   203,   345,    43,   121,   114,   115,   116,   117,
-     347,   118,   205,   231,   389,   119,   120,    69,     0,   121,
-     114,   115,   116,   117,     0,   118,     0,     0,   393,   119,
-     120,    69,     0,   121,   114,   115,   116,   117,     0,   118,
-       0,     0,   484,   119,   120,    69,     0,   121,   114,   115,
-     116,   117,     0,   118,     0,     0,   491,   119,   120,    69,
-       0,   121,   114,   115,   116,   117,     0,   118,     0,     0,
-     338,   114,   115,   116,   117,   121,   118,     0,     0,   449,
-     114,   115,   116,   117,   121,   118,     0,     0,   501,   114,
-     115,   116,   117,   121,   118,     0,     0,     0,     0,     0,
-       0,     0,   121
+     121,    83,   149,   139,   197,   383,   228,   439,   431,    21,
+     356,   357,   358,   359,   270,   386,   360,   185,   507,   440,
+      57,   462,    22,   231,   208,   232,   233,   234,   -40,   202,
+     203,     3,     4,     3,     4,   510,   435,   512,    78,   381,
+      71,   281,   235,   236,   237,   208,   238,   436,   381,    62,
+      57,    23,   448,   149,    79,   204,   452,   204,   140,   452,
+     500,    24,   501,    40,     2,   324,   141,    41,   327,   328,
+      42,    43,    28,   186,    30,   239,   240,   241,   242,    62,
+     432,   157,     5,   441,   508,   158,   243,   129,    52,    31,
+     244,   361,   245,    36,   -86,   382,   -85,    33,   267,   194,
+      80,   511,   364,   513,   430,   367,   194,   351,   449,   465,
+     437,    34,   453,   524,   282,   528,   112,   113,   114,   115,
+     246,   116,   269,   149,   247,    35,   480,   248,   249,   119,
+     487,   539,   205,   354,   205,   170,   171,   194,   250,    39,
+     206,   207,   206,   207,   467,   525,   421,   305,    51,   423,
+     468,   469,     8,  -261,   272,   274,   275,    53,   526,   -44,
+     481,    66,   336,     2,   482,    67,    54,   483,   159,   160,
+     161,   162,    73,   192,    55,    56,    75,    77,    53,   341,
+     352,     5,    84,    68,    85,   223,    69,    52,  -167,    46,
+      47,    48,    49,   310,  -167,   321,  -167,  -167,  -167,   372,
+     373,   110,   111,   336,   538,   460,   125,   461,    68,   117,
+     118,    69,   127,  -167,  -167,  -167,   271,  -167,   128,   154,
+     149,   311,   155,   277,   458,   163,   278,   459,   353,   164,
+     355,   112,   113,   114,   115,   455,   116,   137,   518,   333,
+     165,   519,   365,   145,   119,   368,  -167,  -167,  -167,  -167,
+     130,     8,   168,   169,   443,   336,    53,  -167,   -45,   387,
+     391,  -167,   131,  -167,   175,    54,   312,   313,   314,   315,
+     316,   317,   393,    55,    56,   132,   133,   134,   135,   136,
+     173,   318,   174,   178,    53,   179,   180,  -167,  -167,  -167,
+    -167,  -167,  -167,   181,   182,  -167,   187,   188,  -167,  -167,
+    -167,   189,   190,   343,   193,   112,   113,   114,   115,  -167,
+     116,   199,   216,    68,   117,   118,    69,   215,   119,   219,
+     282,   463,   464,   537,     1,   218,   220,     2,     3,     4,
+     221,   112,   113,   114,   115,   246,   116,   229,   268,   247,
+     456,   230,   248,   497,   119,     5,   -21,     6,   273,   284,
+     502,     7,   285,   387,   466,   286,   290,   289,   472,   305,
+     325,   326,   474,   329,   338,   363,   366,   369,   374,   478,
+     387,   375,   380,   485,   387,  -259,   488,  -260,   419,   490,
+     422,   420,   424,   425,   427,   447,   428,   429,   451,   494,
+     495,   446,   112,   113,   114,   115,   246,   116,   454,   535,
+     344,   117,   118,   345,   346,   119,   457,   499,   471,   112,
+     113,   114,   115,   473,   116,     8,   347,   348,   349,   475,
+     476,     9,   119,   489,   491,   391,   517,   492,   520,    10,
+     521,   529,   493,   522,   503,   523,   504,   112,   113,   114,
+     115,   505,   116,   506,   530,    68,   117,   118,    69,   394,
+     119,   509,   515,   531,   532,   395,   396,   533,   536,    76,
+     251,   397,   398,   399,   400,   401,   402,   403,    32,   392,
+     146,   201,   138,   404,   405,   406,   407,   292,   293,   294,
+     295,   296,   297,   298,   299,   222,   300,   301,   302,   303,
+     304,   112,   113,   114,   115,   140,   116,   477,   516,    68,
+     117,   118,    69,   141,   119,   224,   376,   445,   322,   198,
+     147,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,   323,    97,    98,    99,   287,   408,   342,   409,
+     143,   200,   226,     0,     0,   410,   411,   412,   413,   414,
+     415,   416,   417,   112,   113,   114,   115,   140,   116,     0,
+       0,    68,   117,   118,    69,   141,   119,     0,   112,   113,
+     114,   115,   305,   116,   306,   307,    68,   117,   118,    69,
+       0,   119,   112,   113,   114,   115,    40,   116,     0,     0,
+     339,     0,     0,   340,    43,   119,   112,   113,   114,   115,
+       0,   116,     0,     0,   384,   117,   118,    69,     0,   119,
+     112,   113,   114,   115,     0,   116,     0,     0,   388,   117,
+     118,    69,     0,   119,   112,   113,   114,   115,     0,   116,
+       0,     0,   479,   117,   118,    69,     0,   119,   112,   113,
+     114,   115,     0,   116,     0,     0,   486,   117,   118,    69,
+       0,   119,   112,   113,   114,   115,     0,   116,     0,     0,
+     444,   112,   113,   114,   115,   119,   116,     0,     0,   496,
+       0,     0,     0,     0,   119
 };
 
 static const yytype_int16 yycheck[] =
 {
-      79,    64,   130,   222,   111,   182,   341,   236,     1,   342,
-      11,     4,    70,     4,    29,   432,     4,    10,     4,    12,
-      13,    14,    29,     4,     5,    16,    14,     8,     9,    15,
-     477,     4,   479,     4,   195,    70,    29,    30,    31,     4,
-      33,   111,    30,   111,    59,   107,   114,    50,    51,    52,
-      53,    32,    59,   115,    14,   183,   217,    18,    19,    20,
-      21,   112,   281,    24,   245,   284,   285,   111,   126,    62,
-      63,    64,    65,     4,   122,    70,     7,     8,     9,   119,
-      73,    38,    83,   107,    77,   125,    79,   111,    76,    80,
-      71,   126,    78,    70,    25,   324,    27,    70,   327,    70,
-      31,   229,   181,   436,   107,    70,    70,   100,   111,   188,
-     103,   104,   105,   106,   107,   108,    70,   245,   111,   122,
-     453,   114,   115,   116,   457,   542,   254,   234,   109,    86,
-     311,   126,   125,   111,    29,   312,   117,   118,    99,   368,
-       4,   220,   371,   103,   104,   105,   106,   107,   108,   126,
-       0,   111,   112,   113,   114,   115,   116,     4,   237,   238,
-     239,    70,   126,     4,    95,   293,    61,   127,   128,   129,
-     101,    10,   126,    10,   123,    12,    13,    14,   109,    74,
-       8,     9,   310,   311,    75,    50,    51,    52,    53,     4,
-      81,    82,    29,    30,    31,     4,    33,   276,   427,   278,
-     429,   111,   330,   331,    32,   540,   334,   111,   137,   138,
-     114,     7,   111,   112,   113,   114,    55,    56,    57,    58,
-      59,    60,   123,   351,   107,    62,    63,    64,    65,    25,
-     111,    70,   311,   114,   313,    31,    73,   414,   111,   112,
-      77,     7,    79,    71,   112,   113,   325,   176,   177,   328,
-     111,   111,   111,   114,   114,     4,   102,   385,   386,    25,
-     100,     4,   124,   342,   343,    31,   103,   104,   105,   106,
-     107,   108,   121,   111,   111,   111,   355,   114,   115,   116,
-      17,   109,   112,     4,    21,     4,   115,    24,   125,   117,
-     118,   125,   103,   104,   105,   106,    70,   108,    14,    95,
-     111,   112,   113,   114,   100,   116,   102,   107,   125,   125,
-     111,   111,   125,   109,   114,   115,    14,   125,   125,   125,
-     539,   117,   118,   451,   111,   108,   433,   434,   121,    95,
-     121,   100,   122,   111,   100,    70,   102,   126,   126,     4,
-     126,   126,   126,   109,   423,   126,   474,   126,   123,     4,
-     123,   117,   118,   481,   124,   123,    71,   436,   437,    70,
-       4,   107,   441,     4,     4,     4,   445,   125,     4,    70,
-      70,   119,   125,   452,   453,   125,    10,   456,   457,    10,
-     459,   107,   107,   462,   107,    22,   125,   103,   104,   105,
-     106,   125,   108,   472,   473,   111,   112,   113,   114,   123,
-     116,    10,   530,   125,    10,   103,   104,   105,   106,    99,
-     108,    70,   475,   111,   112,   113,   114,   121,   116,   121,
-     103,   104,   105,   106,   107,   108,   121,    22,   111,   508,
-     509,   114,   511,   116,   513,    42,    22,   516,    22,   518,
-     121,    48,    49,     4,     4,     4,    22,    54,    55,    56,
-      57,    58,    59,    60,   123,   126,   126,     4,   125,    66,
-      67,    68,    69,    34,    35,    36,    37,    38,    39,    40,
-      41,   125,    43,    44,    45,    46,    47,   103,   104,   105,
-     106,   107,   108,    22,    22,   111,   112,   113,   114,   115,
-     116,     4,     4,   126,   126,    12,   122,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,     4,    96,
-      97,    98,     4,   120,     4,   122,     4,   229,    59,   351,
-     128,   128,   129,   130,   131,   132,   133,   134,   135,   103,
-     104,   105,   106,   107,   108,   217,   189,   111,   112,   113,
-     114,   115,   116,   109,   218,   451,   508,   279,   119,   279,
-     121,   122,   103,   104,   105,   106,   107,   108,   334,   386,
-     111,   254,   183,   114,   115,   116,   103,   104,   105,   106,
-     310,   108,   188,   220,   111,   112,   113,   114,    -1,   116,
+      78,    64,   128,   110,   178,   336,   217,     4,    11,   111,
+      18,    19,    20,    21,   231,   337,    24,    70,     4,    16,
+      29,   427,   112,    10,   191,    12,    13,    14,     4,     4,
+       5,     8,     9,     8,     9,     4,     4,     4,    14,    70,
+      38,   240,    29,    30,    31,   212,    33,    15,    70,    29,
+      59,   111,    70,   179,    30,    32,    70,    32,   107,    70,
+     472,   122,   474,   107,     7,   276,   115,   111,   279,   280,
+     114,   115,   111,   126,     4,    62,    63,    64,    65,    59,
+      83,   107,    25,    80,    70,   111,    73,    85,    31,     0,
+      77,    99,    79,   123,    71,   126,    71,     4,   224,   177,
+      76,    70,   319,    70,   126,   322,   184,   306,   126,   431,
+      78,    70,   126,    29,   240,   126,   103,   104,   105,   106,
+     107,   108,   229,   249,   111,     4,   448,   114,   115,   116,
+     452,   537,   109,   307,   109,   135,   136,   215,   125,     4,
+     117,   118,   117,   118,    75,    61,   363,   119,     4,   366,
+      81,    82,    95,   125,   232,   233,   234,   100,    74,   102,
+      17,   111,   288,     7,    21,   123,   109,    24,    50,    51,
+      52,    53,   107,   173,   117,   118,     4,   102,   100,   305,
+     306,    25,     4,   111,   124,     1,   114,    31,     4,    50,
+      51,    52,    53,   271,    10,   273,    12,    13,    14,   325,
+     326,   121,   111,   329,   535,   422,   111,   424,   111,   112,
+     113,   114,     4,    29,    30,    31,    14,    33,   115,   111,
+     346,    10,   114,   111,   111,   107,   114,   114,   306,   111,
+     308,   103,   104,   105,   106,   409,   108,     4,   111,   111,
+     122,   114,   320,    70,   116,   323,    62,    63,    64,    65,
+     125,    95,   111,   111,   380,   381,   100,    73,   102,   337,
+     338,    77,   125,    79,   100,   109,    55,    56,    57,    58,
+      59,    60,   350,   117,   118,   125,   125,   125,   125,   125,
+     121,    70,   108,   122,   100,    70,   126,   103,   104,   105,
+     106,   107,   108,   126,   126,   111,   126,   126,   114,   115,
+     116,   126,   126,    14,   123,   103,   104,   105,   106,   125,
+     108,   123,   123,   111,   112,   113,   114,   124,   116,     4,
+     446,   428,   429,   534,     4,   111,     4,     7,     8,     9,
+      71,   103,   104,   105,   106,   107,   108,    70,   107,   111,
+     418,     4,   114,   469,   116,    25,   111,    27,    14,     4,
+     476,    31,     4,   431,   432,     4,     4,   125,   436,   119,
+      70,    70,   440,   125,   125,    10,    10,   107,   107,   447,
+     448,   107,    22,   451,   452,   125,   454,   125,   123,   457,
+      10,   125,    10,    99,    70,    22,   121,   121,    22,   467,
+     468,   121,   103,   104,   105,   106,   107,   108,    22,   525,
+     111,   112,   113,   114,   115,   116,   121,   470,     4,   103,
+     104,   105,   106,     4,   108,    95,   127,   128,   129,     4,
+      22,   101,   116,   123,   126,   503,   504,   126,   506,   109,
+     508,   126,     4,   511,   125,   513,    22,   103,   104,   105,
+     106,   125,   108,    22,   126,   111,   112,   113,   114,    42,
+     116,     4,     4,     4,     4,    48,    49,     4,     4,    59,
+     224,    54,    55,    56,    57,    58,    59,    60,    12,   346,
+     126,   185,   108,    66,    67,    68,    69,    34,    35,    36,
+      37,    38,    39,    40,    41,   212,    43,    44,    45,    46,
+      47,   103,   104,   105,   106,   107,   108,   446,   503,   111,
+     112,   113,   114,   115,   116,   213,   329,   381,   274,   179,
+     122,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,   274,    96,    97,    98,   249,   120,   305,   122,
+     111,   184,   215,    -1,    -1,   128,   129,   130,   131,   132,
+     133,   134,   135,   103,   104,   105,   106,   107,   108,    -1,
+      -1,   111,   112,   113,   114,   115,   116,    -1,   103,   104,
+     105,   106,   119,   108,   121,   122,   111,   112,   113,   114,
+      -1,   116,   103,   104,   105,   106,   107,   108,    -1,    -1,
+     111,    -1,    -1,   114,   115,   116,   103,   104,   105,   106,
+      -1,   108,    -1,    -1,   111,   112,   113,   114,    -1,   116,
      103,   104,   105,   106,    -1,   108,    -1,    -1,   111,   112,
      113,   114,    -1,   116,   103,   104,   105,   106,    -1,   108,
       -1,    -1,   111,   112,   113,   114,    -1,   116,   103,   104,
      105,   106,    -1,   108,    -1,    -1,   111,   112,   113,   114,
       -1,   116,   103,   104,   105,   106,    -1,   108,    -1,    -1,
      111,   103,   104,   105,   106,   116,   108,    -1,    -1,   111,
-     103,   104,   105,   106,   116,   108,    -1,    -1,   111,   103,
-     104,   105,   106,   116,   108,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   116
+      -1,    -1,    -1,    -1,   116
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -2376,60 +2287,59 @@
 static const yytype_uint16 yystos[] =
 {
        0,     4,     7,     8,     9,    25,    27,    31,    95,   101,
-     109,   137,   138,   139,   140,   141,   143,   144,   156,   159,
-     164,   111,   112,   111,   122,   160,   165,   145,   111,   157,
-       4,     0,   139,     4,    70,     4,   123,   161,   162,     4,
-     107,   111,   114,   115,   251,   252,    50,    51,    52,    53,
-     223,     4,    31,   100,   109,   117,   118,   140,   146,   150,
-     151,   158,   159,   212,   213,   214,   111,   123,   111,   114,
-     163,   263,   166,   107,   147,   148,     4,   151,   102,    14,
-      30,    76,   152,   153,   214,     4,   124,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    96,    97,
-      98,   172,   173,   174,   175,   176,   177,   178,   186,   187,
-     188,   121,   112,   111,   103,   104,   105,   106,   108,   112,
-     113,   116,   247,   255,   262,   263,   264,   111,   154,     4,
-     115,   263,   125,   125,   125,   125,   125,   125,   125,     4,
-     188,   264,   107,   115,   253,   254,   255,   254,    70,   186,
-     122,   155,   247,   248,   249,   250,   254,   111,   114,   149,
-     107,   111,    50,    51,    52,    53,   107,   111,   122,   179,
-     180,   111,   111,   149,   149,   167,   121,   121,   108,   100,
-     258,   259,   122,    70,   126,   126,   126,   256,   257,    70,
-     126,   126,   126,   126,   126,   168,   149,   149,   123,   255,
-     260,   261,   256,   250,   123,   260,   180,     4,     5,    32,
-     109,   117,   118,   141,   142,   169,   181,   209,   210,   211,
-     124,   123,   170,   111,     4,     4,    71,   211,     1,   212,
-     215,   261,   171,   223,    70,     4,    10,    12,    13,    14,
-      29,    30,    31,    33,    62,    63,    64,    65,    73,    77,
-      79,   107,   111,   114,   115,   125,   146,   182,   197,   199,
-     205,   207,   219,   224,   228,   230,   232,   233,   234,   242,
-     243,   244,   247,   107,   264,   253,    14,   255,    14,   255,
-     255,   220,   111,   114,   221,   222,   234,   247,   229,     4,
-       4,     4,   248,   225,   125,     4,   235,    34,    35,    36,
-      37,    38,    39,    40,    41,    43,    44,    45,    46,    47,
-     119,   121,   122,   231,   195,   255,    10,    55,    56,    57,
-      58,    59,    60,    70,   245,   246,   255,   245,   246,   223,
-      70,    70,   223,   223,   125,   183,   198,   200,   111,   240,
-     241,   247,   206,   125,   111,   114,   247,   252,    14,   111,
-     114,   115,   127,   128,   129,   226,   234,   247,   255,   256,
-     255,    18,    19,    20,    21,    24,    99,   196,    10,   253,
-     255,    10,   253,   255,   107,   216,   217,   247,   247,   107,
-     107,   241,   190,   201,   202,    22,    70,   126,   195,   111,
-     208,   237,   255,   111,   236,   237,   255,   155,   255,    42,
-      48,    49,    54,    55,    56,    57,    58,    59,    60,    66,
-      67,    68,    69,   120,   122,   128,   129,   130,   131,   132,
-     133,   134,   135,   227,   123,   125,   253,    10,   253,    10,
-      99,   218,    70,   121,   121,   126,    11,    83,   185,   191,
-       4,    15,    78,   203,     4,    16,    80,   204,   247,   111,
-     240,   121,    22,    70,   126,   238,    22,    70,   126,    22,
-     256,   255,   121,   111,   114,   253,   253,   217,   264,   264,
-     237,   255,    75,    81,    82,   189,     4,   255,     4,   255,
-       4,    22,   233,   255,   111,   237,    17,    21,    24,   239,
-     255,   111,   237,   255,   123,   255,   126,   126,     4,   255,
-     255,   111,   247,   184,   214,   238,   238,   247,   125,    22,
-     125,    22,     4,    70,     4,     4,    70,     4,    70,   192,
-       4,   236,   255,   111,   114,   255,   255,   255,   255,    29,
-      61,    74,   193,   126,   126,   126,     4,     4,     4,   194,
-     247,     4,   223,   195,   217
+     109,   137,   138,   139,   140,   141,   143,   144,   155,   158,
+     163,   111,   112,   111,   122,   159,   164,   145,   111,   156,
+       4,     0,   139,     4,    70,     4,   123,   160,   161,     4,
+     107,   111,   114,   115,   250,   251,    50,    51,    52,    53,
+     222,     4,    31,   100,   109,   117,   118,   140,   146,   149,
+     150,   157,   158,   211,   212,   213,   111,   123,   111,   114,
+     162,   262,   165,   107,   147,     4,   150,   102,    14,    30,
+      76,   151,   152,   213,     4,   124,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    96,    97,    98,
+     171,   172,   173,   174,   175,   176,   177,   185,   186,   187,
+     121,   111,   103,   104,   105,   106,   108,   112,   113,   116,
+     246,   254,   261,   262,   263,   111,   153,     4,   115,   262,
+     125,   125,   125,   125,   125,   125,   125,     4,   187,   263,
+     107,   115,   252,   253,   254,    70,   185,   122,   154,   246,
+     247,   248,   249,   253,   111,   114,   148,   107,   111,    50,
+      51,    52,    53,   107,   111,   122,   178,   179,   111,   111,
+     148,   148,   166,   121,   108,   100,   257,   258,   122,    70,
+     126,   126,   126,   255,   256,    70,   126,   126,   126,   126,
+     126,   167,   148,   123,   254,   259,   260,   255,   249,   123,
+     259,   179,     4,     5,    32,   109,   117,   118,   141,   142,
+     168,   180,   208,   209,   210,   124,   123,   169,   111,     4,
+       4,    71,   210,     1,   211,   214,   260,   170,   222,    70,
+       4,    10,    12,    13,    14,    29,    30,    31,    33,    62,
+      63,    64,    65,    73,    77,    79,   107,   111,   114,   115,
+     125,   146,   181,   196,   198,   204,   206,   218,   223,   227,
+     229,   231,   232,   233,   241,   242,   243,   246,   107,   263,
+     252,    14,   254,    14,   254,   254,   219,   111,   114,   220,
+     221,   233,   246,   228,     4,     4,     4,   247,   224,   125,
+       4,   234,    34,    35,    36,    37,    38,    39,    40,    41,
+      43,    44,    45,    46,    47,   119,   121,   122,   230,   194,
+     254,    10,    55,    56,    57,    58,    59,    60,    70,   244,
+     245,   254,   244,   245,   222,    70,    70,   222,   222,   125,
+     182,   197,   199,   111,   239,   240,   246,   205,   125,   111,
+     114,   246,   251,    14,   111,   114,   115,   127,   128,   129,
+     225,   233,   246,   254,   255,   254,    18,    19,    20,    21,
+      24,    99,   195,    10,   252,   254,    10,   252,   254,   107,
+     215,   216,   246,   246,   107,   107,   240,   189,   200,   201,
+      22,    70,   126,   194,   111,   207,   236,   254,   111,   235,
+     236,   254,   154,   254,    42,    48,    49,    54,    55,    56,
+      57,    58,    59,    60,    66,    67,    68,    69,   120,   122,
+     128,   129,   130,   131,   132,   133,   134,   135,   226,   123,
+     125,   252,    10,   252,    10,    99,   217,    70,   121,   121,
+     126,    11,    83,   184,   190,     4,    15,    78,   202,     4,
+      16,    80,   203,   246,   111,   239,   121,    22,    70,   126,
+     237,    22,    70,   126,    22,   255,   254,   121,   111,   114,
+     252,   252,   216,   263,   263,   236,   254,    75,    81,    82,
+     188,     4,   254,     4,   254,     4,    22,   232,   254,   111,
+     236,    17,    21,    24,   238,   254,   111,   236,   254,   123,
+     254,   126,   126,     4,   254,   254,   111,   246,   183,   213,
+     237,   237,   246,   125,    22,   125,    22,     4,    70,     4,
+       4,    70,     4,    70,   191,     4,   235,   254,   111,   114,
+     254,   254,   254,   254,    29,    61,    74,   192,   126,   126,
+     126,     4,     4,     4,   193,   246,     4,   222,   194,   216
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -2444,9 +2354,18 @@
 
 /* Like YYERROR except do call yyerror.  This remains here temporarily
    to ease the transition to the new meaning of YYERROR, for GCC.
-   Once GCC version 2 has supplanted version 1, this can go.  */
+   Once GCC version 2 has supplanted version 1, this can go.  However,
+   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
+   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
+   discussed.  */
 
 #define YYFAIL		goto yyerrlab
+#if defined YYFAIL
+  /* This is here to suppress warnings from the GCC cpp's
+     -Wunused-macros.  Normally we don't worry about that warning, but
+     some users do, and we want to make it easy for users to remove
+     YYFAIL uses, which will produce warnings from Bison 2.5.  */
+#endif
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
@@ -2503,7 +2422,7 @@
    we won't break user code: when these are the locations we know.  */
 
 #ifndef YY_LOCATION_PRINT
-# if YYLTYPE_IS_TRIVIAL
+# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
 #  define YY_LOCATION_PRINT(File, Loc)			\
      fprintf (File, "%d.%d-%d.%d",			\
 	      (Loc).first_line, (Loc).first_column,	\
@@ -3254,29 +3173,29 @@
     {
         case 2:
 
-/* Line 1455 of yacc.c  */
-#line 1166 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1081 "compilers/imcc/imcc.y"
     { if (yynerrs) YYABORT; (yyval.i) = 0; }
     break;
 
   case 5:
 
-/* Line 1455 of yacc.c  */
-#line 1175 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1090 "compilers/imcc/imcc.y"
     { (yyval.i) = (yyvsp[(1) - (1)].i); }
     break;
 
   case 6:
 
-/* Line 1455 of yacc.c  */
-#line 1176 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1091 "compilers/imcc/imcc.y"
     { (yyval.i) = (yyvsp[(1) - (1)].i); }
     break;
 
   case 7:
 
-/* Line 1455 of yacc.c  */
-#line 1178 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1093 "compilers/imcc/imcc.y"
     {
            (yyval.i) = (yyvsp[(1) - (1)].i);
            imc_close_unit(interp, IMCC_INFO(interp)->cur_unit);
@@ -3286,8 +3205,8 @@
 
   case 8:
 
-/* Line 1455 of yacc.c  */
-#line 1184 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1099 "compilers/imcc/imcc.y"
     {
            (yyval.i) = (yyvsp[(1) - (1)].i);
            imc_close_unit(interp, IMCC_INFO(interp)->cur_unit);
@@ -3297,43 +3216,43 @@
 
   case 9:
 
-/* Line 1455 of yacc.c  */
-#line 1189 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1104 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
   case 10:
 
-/* Line 1455 of yacc.c  */
-#line 1190 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1105 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
   case 11:
 
-/* Line 1455 of yacc.c  */
-#line 1191 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1106 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
   case 12:
 
-/* Line 1455 of yacc.c  */
-#line 1192 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1107 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
   case 13:
 
-/* Line 1455 of yacc.c  */
-#line 1196 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1111 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
   case 14:
 
-/* Line 1455 of yacc.c  */
-#line 1198 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1113 "compilers/imcc/imcc.y"
     {
            (yyval.i) = 0;
            do_loadlib(interp, (yyvsp[(2) - (3)].s));
@@ -3343,8 +3262,8 @@
 
   case 15:
 
-/* Line 1455 of yacc.c  */
-#line 1207 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1122 "compilers/imcc/imcc.y"
     {
            IMCC_INFO(interp)->line = atoi((yyvsp[(2) - (5)].s));
            /* set_filename() frees the STRINGC */
@@ -3354,8 +3273,8 @@
 
   case 16:
 
-/* Line 1455 of yacc.c  */
-#line 1213 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1128 "compilers/imcc/imcc.y"
     {
            /* set_filename() frees the STRINGC */
            set_filename(interp, (yyvsp[(2) - (3)].s));
@@ -3364,8 +3283,8 @@
 
   case 17:
 
-/* Line 1455 of yacc.c  */
-#line 1221 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1136 "compilers/imcc/imcc.y"
     {
           /* We'll want to store an entry while emitting instructions, so just
            * store annotation like it's an instruction. */
@@ -3377,8 +3296,8 @@
 
   case 18:
 
-/* Line 1455 of yacc.c  */
-#line 1233 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1148 "compilers/imcc/imcc.y"
     {
             STRING * const hll_name = Parrot_str_unescape(interp, (yyvsp[(2) - (2)].s) + 1, '"', NULL);
             Parrot_pcc_set_HLL(interp, CURRENT_CONTEXT(interp),
@@ -3392,15 +3311,15 @@
 
   case 19:
 
-/* Line 1455 of yacc.c  */
-#line 1245 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1160 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->is_def = 1; }
     break;
 
   case 20:
 
-/* Line 1455 of yacc.c  */
-#line 1246 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1161 "compilers/imcc/imcc.y"
     {
              mk_const_ident(interp, (yyvsp[(4) - (6)].s), (yyvsp[(3) - (6)].t), (yyvsp[(6) - (6)].sr), 1);
              mem_sys_free((yyvsp[(4) - (6)].s));
@@ -3410,33 +3329,15 @@
 
   case 21:
 
-/* Line 1455 of yacc.c  */
-#line 1254 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1169 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->is_def = 1; }
     break;
 
   case 22:
 
-/* Line 1455 of yacc.c  */
-#line 1255 "compilers/imcc/imcc.y"
-    {
-           (yyval.i) = mk_pmc_const(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(3) - (6)].s), (yyvsp[(4) - (6)].sr), (yyvsp[(6) - (6)].s));
-           mem_sys_free((yyvsp[(6) - (6)].s));
-           IMCC_INFO(interp)->is_def = 0;
-         }
-    break;
-
-  case 23:
-
-/* Line 1455 of yacc.c  */
-#line 1261 "compilers/imcc/imcc.y"
-    { IMCC_INFO(interp)->is_def = 1; }
-    break;
-
-  case 24:
-
-/* Line 1455 of yacc.c  */
-#line 1262 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1170 "compilers/imcc/imcc.y"
     {
            (yyval.i) = mk_pmc_const_named(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(3) - (6)].s), (yyvsp[(4) - (6)].sr), (yyvsp[(6) - (6)].s));
            mem_sys_free((yyvsp[(3) - (6)].s));
@@ -3445,52 +3346,52 @@
          }
     break;
 
-  case 29:
+  case 27:
 
-/* Line 1455 of yacc.c  */
-#line 1280 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1188 "compilers/imcc/imcc.y"
     { (yyval.i) = 0;  }
     break;
 
-  case 30:
+  case 28:
 
-/* Line 1455 of yacc.c  */
-#line 1281 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1189 "compilers/imcc/imcc.y"
     { (yyval.i) = 0;  }
     break;
 
-  case 31:
+  case 29:
 
-/* Line 1455 of yacc.c  */
-#line 1282 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1190 "compilers/imcc/imcc.y"
     { (yyval.i) = 0;  }
     break;
 
-  case 32:
+  case 30:
 
-/* Line 1455 of yacc.c  */
-#line 1283 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1191 "compilers/imcc/imcc.y"
     { (yyval.i) = 0;  }
     break;
 
-  case 33:
+  case 31:
 
-/* Line 1455 of yacc.c  */
-#line 1284 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1192 "compilers/imcc/imcc.y"
     { (yyval.i) = (yyvsp[(1) - (1)].i); }
     break;
 
-  case 36:
+  case 34:
 
-/* Line 1455 of yacc.c  */
-#line 1289 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1197 "compilers/imcc/imcc.y"
     { clear_state(interp); }
     break;
 
-  case 37:
+  case 35:
 
-/* Line 1455 of yacc.c  */
-#line 1291 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1199 "compilers/imcc/imcc.y"
     {
            (yyval.i) = INS(interp, IMCC_INFO(interp)->cur_unit,
                     (yyvsp[(2) - (3)].s), 0, IMCC_INFO(interp)->regs,
@@ -3499,20 +3400,20 @@
          }
     break;
 
-  case 38:
+  case 36:
 
-/* Line 1455 of yacc.c  */
-#line 1298 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1206 "compilers/imcc/imcc.y"
     {
            imc_close_unit(interp, IMCC_INFO(interp)->cur_unit);
            IMCC_INFO(interp)->cur_unit = imc_open_unit(interp, IMC_PASM);
          }
     break;
 
-  case 39:
+  case 37:
 
-/* Line 1455 of yacc.c  */
-#line 1303 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1211 "compilers/imcc/imcc.y"
     {
            (yyval.i) = iSUBROUTINE(interp,
                     IMCC_INFO(interp)->cur_unit,
@@ -3522,19 +3423,19 @@
          }
     break;
 
-  case 40:
+  case 38:
 
-/* Line 1455 of yacc.c  */
-#line 1311 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1219 "compilers/imcc/imcc.y"
     {
            (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, "null", 1, (yyvsp[(2) - (2)].sr));
          }
     break;
 
-  case 41:
+  case 39:
 
-/* Line 1455 of yacc.c  */
-#line 1315 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1223 "compilers/imcc/imcc.y"
     {
            char   *name = mem_sys_strdup((yyvsp[(2) - (4)].s) + 1);
            SymReg *r    = mk_pasm_reg(interp, (yyvsp[(4) - (4)].s));
@@ -3549,24 +3450,24 @@
          }
     break;
 
-  case 42:
+  case 40:
 
-/* Line 1455 of yacc.c  */
-#line 1327 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1235 "compilers/imcc/imcc.y"
     { (yyval.i) = 0;}
     break;
 
-  case 44:
+  case 42:
 
-/* Line 1455 of yacc.c  */
-#line 1335 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1243 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->cur_unit = imc_open_unit(interp, IMC_PASM); }
     break;
 
-  case 45:
+  case 43:
 
-/* Line 1455 of yacc.c  */
-#line 1338 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1246 "compilers/imcc/imcc.y"
     {
            /* if (optimizer_level & OPT_PASM)
                          imc_compile_unit(interp, IMCC_INFO(interp)->cur_unit);
@@ -3576,10 +3477,10 @@
          }
     break;
 
-  case 48:
+  case 46:
 
-/* Line 1455 of yacc.c  */
-#line 1354 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1262 "compilers/imcc/imcc.y"
     {
            int re_open = 0;
            (yyval.i) = 0;
@@ -3593,33 +3494,33 @@
          }
     break;
 
-  case 49:
+  case 47:
 
-/* Line 1455 of yacc.c  */
-#line 1368 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1276 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(2) - (3)].sr); }
     break;
 
-  case 50:
+  case 48:
 
-/* Line 1455 of yacc.c  */
-#line 1369 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1277 "compilers/imcc/imcc.y"
     { (yyval.sr) = NULL; }
     break;
 
-  case 51:
+  case 49:
 
-/* Line 1455 of yacc.c  */
-#line 1373 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1281 "compilers/imcc/imcc.y"
     {
            IMCC_INFO(interp)->nkeys    = 0;
          }
     break;
 
-  case 52:
+  case 50:
 
-/* Line 1455 of yacc.c  */
-#line 1377 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1285 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = link_keys(interp,
                           IMCC_INFO(interp)->nkeys,
@@ -3627,45 +3528,45 @@
          }
     break;
 
-  case 53:
+  case 51:
 
-/* Line 1455 of yacc.c  */
-#line 1385 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1293 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->keys[IMCC_INFO(interp)->nkeys++] = (yyvsp[(1) - (1)].sr); }
     break;
 
-  case 54:
+  case 52:
 
-/* Line 1455 of yacc.c  */
-#line 1387 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1295 "compilers/imcc/imcc.y"
     {
            IMCC_INFO(interp)->keys[IMCC_INFO(interp)->nkeys++] = (yyvsp[(3) - (3)].sr);
            (yyval.sr) = IMCC_INFO(interp)->keys[0];
          }
     break;
 
-  case 55:
+  case 53:
 
-/* Line 1455 of yacc.c  */
-#line 1395 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1303 "compilers/imcc/imcc.y"
     {
            IMCC_INFO(interp)->cur_unit = imc_open_unit(interp, IMC_PCCSUB);
          }
     break;
 
-  case 56:
+  case 54:
 
-/* Line 1455 of yacc.c  */
-#line 1399 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1307 "compilers/imcc/imcc.y"
     {
            iSUBROUTINE(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(3) - (3)].sr));
          }
     break;
 
-  case 57:
+  case 55:
 
-/* Line 1455 of yacc.c  */
-#line 1403 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1311 "compilers/imcc/imcc.y"
     {
           IMCC_INFO(interp)->cur_call->pcc_sub->pragma = (yyvsp[(5) - (6)].t);
           if (!IMCC_INFO(interp)->cur_unit->instructions->symregs[0]->subid) {
@@ -3675,31 +3576,31 @@
         }
     break;
 
-  case 58:
+  case 56:
 
-/* Line 1455 of yacc.c  */
-#line 1411 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1319 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; IMCC_INFO(interp)->cur_call = NULL; }
     break;
 
-  case 59:
+  case 57:
 
-/* Line 1455 of yacc.c  */
-#line 1415 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1323 "compilers/imcc/imcc.y"
     { (yyval.sr) = 0; }
     break;
 
-  case 60:
+  case 58:
 
-/* Line 1455 of yacc.c  */
-#line 1416 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1324 "compilers/imcc/imcc.y"
     { (yyval.sr) = 0; }
     break;
 
-  case 61:
+  case 59:
 
-/* Line 1455 of yacc.c  */
-#line 1418 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1326 "compilers/imcc/imcc.y"
     {
            if (IMCC_INFO(interp)->adv_named_id) {
                  add_pcc_named_param(interp, IMCC_INFO(interp)->cur_call,
@@ -3711,24 +3612,24 @@
          }
     break;
 
-  case 62:
+  case 60:
 
-/* Line 1455 of yacc.c  */
-#line 1430 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1338 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->is_def = 1; }
     break;
 
-  case 63:
+  case 61:
 
-/* Line 1455 of yacc.c  */
-#line 1430 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1338 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(3) - (3)].sr); IMCC_INFO(interp)->is_def = 0; }
     break;
 
-  case 64:
+  case 62:
 
-/* Line 1455 of yacc.c  */
-#line 1435 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1343 "compilers/imcc/imcc.y"
     {
            if ((yyvsp[(3) - (3)].t) & VT_OPT_FLAG && (yyvsp[(1) - (3)].t) != 'I') {
                const char *type;
@@ -3744,23 +3645,23 @@
            }
            if ((yyvsp[(3) - (3)].t) & VT_NAMED && !((yyvsp[(3) - (3)].t) & VT_FLAT) && !IMCC_INFO(interp)->adv_named_id)
                adv_named_set(interp, (yyvsp[(2) - (3)].s));
-           (yyval.sr) = mk_ident(interp, (yyvsp[(2) - (3)].s), (yyvsp[(1) - (3)].t));
+           (yyval.sr) = mk_ident(interp, (yyvsp[(2) - (3)].s), (yyvsp[(1) - (3)].t), VTIDENTIFIER);
            (yyval.sr)->type |= (yyvsp[(3) - (3)].t);
            mem_sys_free((yyvsp[(2) - (3)].s));
           }
     break;
 
-  case 65:
+  case 63:
 
-/* Line 1455 of yacc.c  */
-#line 1459 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1367 "compilers/imcc/imcc.y"
     { (yyval.t) = 0; }
     break;
 
-  case 66:
+  case 64:
 
-/* Line 1455 of yacc.c  */
-#line 1464 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1372 "compilers/imcc/imcc.y"
     {
            (yyval.t) = 0;
            IMCC_INFO(interp)->cur_unit->outer = mk_sub_address_fromc(interp, (yyvsp[(3) - (4)].s));
@@ -3768,10 +3669,10 @@
          }
     break;
 
-  case 67:
+  case 65:
 
-/* Line 1455 of yacc.c  */
-#line 1470 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1378 "compilers/imcc/imcc.y"
     {
            (yyval.t) = 0;
            IMCC_INFO(interp)->cur_unit->outer = mk_const(interp, (yyvsp[(3) - (4)].s), 'S');
@@ -3779,10 +3680,10 @@
          }
     break;
 
-  case 68:
+  case 66:
 
-/* Line 1455 of yacc.c  */
-#line 1479 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1387 "compilers/imcc/imcc.y"
     {
            (yyval.t) = P_VTABLE;
            IMCC_INFO(interp)->cur_unit->vtable_name      = NULL;
@@ -3790,10 +3691,10 @@
          }
     break;
 
-  case 69:
+  case 67:
 
-/* Line 1455 of yacc.c  */
-#line 1485 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1393 "compilers/imcc/imcc.y"
     {
            (yyval.t) = P_VTABLE;
            IMCC_INFO(interp)->cur_unit->vtable_name      = (yyvsp[(3) - (4)].s);
@@ -3801,10 +3702,10 @@
          }
     break;
 
-  case 70:
+  case 68:
 
-/* Line 1455 of yacc.c  */
-#line 1494 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1402 "compilers/imcc/imcc.y"
     {
            (yyval.t) = P_METHOD;
            IMCC_INFO(interp)->cur_unit->method_name = NULL;
@@ -3812,10 +3713,10 @@
          }
     break;
 
-  case 71:
+  case 69:
 
-/* Line 1455 of yacc.c  */
-#line 1500 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1408 "compilers/imcc/imcc.y"
     {
            (yyval.t) = P_METHOD;
            IMCC_INFO(interp)->cur_unit->method_name = (yyvsp[(3) - (4)].s);
@@ -3823,10 +3724,10 @@
          }
     break;
 
-  case 72:
+  case 70:
 
-/* Line 1455 of yacc.c  */
-#line 1509 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1417 "compilers/imcc/imcc.y"
     {
            (yyval.t) = P_NSENTRY;
            IMCC_INFO(interp)->cur_unit->ns_entry_name     = NULL;
@@ -3834,10 +3735,10 @@
          }
     break;
 
-  case 73:
+  case 71:
 
-/* Line 1455 of yacc.c  */
-#line 1515 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1423 "compilers/imcc/imcc.y"
     {
            (yyval.t) = P_NSENTRY;
            IMCC_INFO(interp)->cur_unit->ns_entry_name = (yyvsp[(3) - (4)].s);
@@ -3845,30 +3746,30 @@
          }
     break;
 
-  case 74:
+  case 72:
 
-/* Line 1455 of yacc.c  */
-#line 1524 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1432 "compilers/imcc/imcc.y"
     {
            (yyval.t) = 0;
            IMCC_INFO(interp)->cur_unit->instance_of = (yyvsp[(3) - (4)].s);
          }
     break;
 
-  case 75:
+  case 73:
 
-/* Line 1455 of yacc.c  */
-#line 1532 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1440 "compilers/imcc/imcc.y"
     {
            (yyval.t) = 0;
            IMCC_INFO(interp)->cur_unit->subid = NULL;
          }
     break;
 
-  case 76:
+  case 74:
 
-/* Line 1455 of yacc.c  */
-#line 1537 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1445 "compilers/imcc/imcc.y"
     {
            (yyval.t) = 0;
            IMCC_INFO(interp)->cur_unit->subid = mk_const(interp, (yyvsp[(3) - (4)].s), 'S');
@@ -3877,67 +3778,67 @@
          }
     break;
 
-  case 77:
+  case 75:
 
-/* Line 1455 of yacc.c  */
-#line 1547 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1455 "compilers/imcc/imcc.y"
     {
            add_pcc_multi(interp, IMCC_INFO(interp)->cur_call, NULL);
          }
     break;
 
-  case 78:
+  case 76:
 
-/* Line 1455 of yacc.c  */
-#line 1551 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1459 "compilers/imcc/imcc.y"
     {
            (yyval.t) = 0;
            add_pcc_multi(interp, IMCC_INFO(interp)->cur_call, (yyvsp[(3) - (3)].sr));
          }
     break;
 
-  case 79:
+  case 77:
 
-/* Line 1455 of yacc.c  */
-#line 1556 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1464 "compilers/imcc/imcc.y"
     {
            (yyval.t) = 0;
            add_pcc_multi(interp, IMCC_INFO(interp)->cur_call, (yyvsp[(1) - (1)].sr));
          }
     break;
 
-  case 80:
+  case 78:
 
-/* Line 1455 of yacc.c  */
-#line 1563 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1471 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_const(interp, "INTVAL",   'S'); }
     break;
 
-  case 81:
+  case 79:
 
-/* Line 1455 of yacc.c  */
-#line 1564 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1472 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_const(interp, "FLOATVAL", 'S'); }
     break;
 
-  case 82:
+  case 80:
 
-/* Line 1455 of yacc.c  */
-#line 1565 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1473 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_const(interp, "PMC",      'S'); }
     break;
 
-  case 83:
+  case 81:
 
-/* Line 1455 of yacc.c  */
-#line 1566 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1474 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_const(interp, "STRING",   'S'); }
     break;
 
-  case 84:
+  case 82:
 
-/* Line 1455 of yacc.c  */
-#line 1568 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1476 "compilers/imcc/imcc.y"
     {
            SymReg *r;
            if (strcmp((yyvsp[(1) - (1)].s), "_") != 0)
@@ -3950,10 +3851,10 @@
          }
     break;
 
-  case 85:
+  case 83:
 
-/* Line 1455 of yacc.c  */
-#line 1579 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1487 "compilers/imcc/imcc.y"
     {
            SymReg *r;
            if (strcmp((yyvsp[(1) - (1)].s), "_") != 0)
@@ -3966,17 +3867,17 @@
          }
     break;
 
-  case 86:
+  case 84:
 
-/* Line 1455 of yacc.c  */
-#line 1589 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1497 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(2) - (3)].sr); }
     break;
 
-  case 89:
+  case 87:
 
-/* Line 1455 of yacc.c  */
-#line 1599 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1507 "compilers/imcc/imcc.y"
     {
            char name[128];
            SymReg *r, *r1;
@@ -4000,188 +3901,188 @@
          }
     break;
 
-  case 90:
+  case 88:
 
-/* Line 1455 of yacc.c  */
-#line 1625 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1533 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; IMCC_INFO(interp)->cur_call = NULL; }
     break;
 
-  case 91:
+  case 89:
 
-/* Line 1455 of yacc.c  */
-#line 1629 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1537 "compilers/imcc/imcc.y"
     { (yyval.i) = NULL; IMCC_INFO(interp)->cur_call->pcc_sub->label = 0; }
     break;
 
-  case 92:
+  case 90:
 
-/* Line 1455 of yacc.c  */
-#line 1630 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1538 "compilers/imcc/imcc.y"
     { (yyval.i) = NULL; IMCC_INFO(interp)->cur_call->pcc_sub->label = 1; }
     break;
 
-  case 93:
+  case 91:
 
-/* Line 1455 of yacc.c  */
-#line 1634 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1542 "compilers/imcc/imcc.y"
     { (yyval.i) = NULL; }
     break;
 
-  case 94:
+  case 92:
 
-/* Line 1455 of yacc.c  */
-#line 1635 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1543 "compilers/imcc/imcc.y"
     { (yyval.i) = NULL;  IMCC_INFO(interp)->cur_call->pcc_sub->object = (yyvsp[(2) - (3)].sr); }
     break;
 
-  case 95:
+  case 93:
 
-/* Line 1455 of yacc.c  */
-#line 1639 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1547 "compilers/imcc/imcc.y"
     { (yyval.t) = 0; }
     break;
 
-  case 97:
+  case 95:
 
-/* Line 1455 of yacc.c  */
-#line 1644 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1552 "compilers/imcc/imcc.y"
     { (yyval.t) = (yyvsp[(1) - (1)].t); }
     break;
 
-  case 98:
+  case 96:
 
-/* Line 1455 of yacc.c  */
-#line 1645 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1553 "compilers/imcc/imcc.y"
     { (yyval.t) = (yyvsp[(1) - (2)].t) | (yyvsp[(2) - (2)].t); }
     break;
 
-  case 99:
+  case 97:
 
-/* Line 1455 of yacc.c  */
-#line 1649 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1557 "compilers/imcc/imcc.y"
     { (yyval.t) = P_LOAD; }
     break;
 
-  case 100:
+  case 98:
 
-/* Line 1455 of yacc.c  */
-#line 1650 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1558 "compilers/imcc/imcc.y"
     { (yyval.t) = P_INIT; }
     break;
 
-  case 101:
+  case 99:
 
-/* Line 1455 of yacc.c  */
-#line 1651 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1559 "compilers/imcc/imcc.y"
     { (yyval.t) = P_MAIN; }
     break;
 
-  case 102:
+  case 100:
 
-/* Line 1455 of yacc.c  */
-#line 1652 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1560 "compilers/imcc/imcc.y"
     { (yyval.t) = P_IMMEDIATE; }
     break;
 
-  case 103:
+  case 101:
 
-/* Line 1455 of yacc.c  */
-#line 1653 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1561 "compilers/imcc/imcc.y"
     { (yyval.t) = P_POSTCOMP; }
     break;
 
-  case 104:
+  case 102:
 
-/* Line 1455 of yacc.c  */
-#line 1654 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1562 "compilers/imcc/imcc.y"
     { (yyval.t) = P_ANON; }
     break;
 
-  case 105:
+  case 103:
 
-/* Line 1455 of yacc.c  */
-#line 1655 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1563 "compilers/imcc/imcc.y"
     { (yyval.t) = P_NEED_LEX; }
     break;
 
-  case 113:
+  case 111:
 
-/* Line 1455 of yacc.c  */
-#line 1667 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1575 "compilers/imcc/imcc.y"
     {
            add_pcc_sub(IMCC_INFO(interp)->cur_call, (yyvsp[(2) - (5)].sr));
            add_pcc_cc(IMCC_INFO(interp)->cur_call, (yyvsp[(4) - (5)].sr));
          }
     break;
 
-  case 114:
+  case 112:
 
-/* Line 1455 of yacc.c  */
-#line 1672 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1580 "compilers/imcc/imcc.y"
     {
            add_pcc_sub(IMCC_INFO(interp)->cur_call, (yyvsp[(2) - (3)].sr));
          }
     break;
 
-  case 115:
+  case 113:
 
-/* Line 1455 of yacc.c  */
-#line 1676 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1584 "compilers/imcc/imcc.y"
     {
            add_pcc_sub(IMCC_INFO(interp)->cur_call, (yyvsp[(2) - (3)].sr));
          }
     break;
 
-  case 116:
+  case 114:
 
-/* Line 1455 of yacc.c  */
-#line 1680 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1588 "compilers/imcc/imcc.y"
     {
            add_pcc_sub(IMCC_INFO(interp)->cur_call, (yyvsp[(2) - (3)].sr));
          }
     break;
 
-  case 117:
+  case 115:
 
-/* Line 1455 of yacc.c  */
-#line 1684 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1592 "compilers/imcc/imcc.y"
     {
            add_pcc_sub(IMCC_INFO(interp)->cur_call, mk_const(interp, (yyvsp[(2) - (3)].s), 'S'));
          }
     break;
 
-  case 118:
+  case 116:
 
-/* Line 1455 of yacc.c  */
-#line 1688 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1596 "compilers/imcc/imcc.y"
     {
            add_pcc_sub(IMCC_INFO(interp)->cur_call, (yyvsp[(2) - (5)].sr));
            add_pcc_cc(IMCC_INFO(interp)->cur_call, (yyvsp[(4) - (5)].sr));
          }
     break;
 
-  case 119:
+  case 117:
 
-/* Line 1455 of yacc.c  */
-#line 1693 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1601 "compilers/imcc/imcc.y"
     {
            add_pcc_sub(IMCC_INFO(interp)->cur_call, mk_const(interp, (yyvsp[(2) - (5)].s), 'S'));
            add_pcc_cc(IMCC_INFO(interp)->cur_call, (yyvsp[(4) - (5)].sr));
          }
     break;
 
-  case 120:
+  case 118:
 
-/* Line 1455 of yacc.c  */
-#line 1701 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1609 "compilers/imcc/imcc.y"
     { (yyval.sr) = 0; }
     break;
 
-  case 121:
+  case 119:
 
-/* Line 1455 of yacc.c  */
-#line 1702 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1610 "compilers/imcc/imcc.y"
     {
                                  if (IMCC_INFO(interp)->adv_named_id) {
                                      add_pcc_named_param(interp, IMCC_INFO(interp)->cur_call,
@@ -4193,279 +4094,279 @@
                                }
     break;
 
-  case 122:
+  case 120:
 
-/* Line 1455 of yacc.c  */
-#line 1714 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1622 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(2) - (2)].sr); }
     break;
 
-  case 123:
+  case 121:
 
-/* Line 1455 of yacc.c  */
-#line 1719 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1627 "compilers/imcc/imcc.y"
     { (yyval.sr) = 0; }
     break;
 
-  case 124:
+  case 122:
 
-/* Line 1455 of yacc.c  */
-#line 1721 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1629 "compilers/imcc/imcc.y"
     {
            if ((yyvsp[(2) - (3)].sr))
                add_pcc_result(interp, IMCC_INFO(interp)->cur_call, (yyvsp[(2) - (3)].sr));
          }
     break;
 
-  case 125:
+  case 123:
 
-/* Line 1455 of yacc.c  */
-#line 1728 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1636 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(2) - (3)].sr); (yyval.sr)->type |= (yyvsp[(3) - (3)].t); }
     break;
 
-  case 126:
+  case 124:
 
-/* Line 1455 of yacc.c  */
-#line 1729 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1637 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->is_def = 1; }
     break;
 
-  case 127:
+  case 125:
 
-/* Line 1455 of yacc.c  */
-#line 1730 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1638 "compilers/imcc/imcc.y"
     {
            IdList * const l = (yyvsp[(4) - (4)].idlist);
            SymReg *ignored;
-           ignored = mk_ident(interp, l->id, (yyvsp[(3) - (4)].t));
+           ignored = mk_ident(interp, l->id, (yyvsp[(3) - (4)].t), VTIDENTIFIER);
            UNUSED(ignored);
            IMCC_INFO(interp)->is_def = 0;
            (yyval.sr) = 0;
          }
     break;
 
-  case 128:
+  case 126:
 
-/* Line 1455 of yacc.c  */
-#line 1741 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1649 "compilers/imcc/imcc.y"
     { (yyval.t) = 0; }
     break;
 
-  case 129:
+  case 127:
 
-/* Line 1455 of yacc.c  */
-#line 1742 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1650 "compilers/imcc/imcc.y"
     { (yyval.t) = (yyvsp[(1) - (2)].t) | (yyvsp[(2) - (2)].t); }
     break;
 
-  case 130:
+  case 128:
 
-/* Line 1455 of yacc.c  */
-#line 1746 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1654 "compilers/imcc/imcc.y"
     { (yyval.t) = VT_FLAT;   }
     break;
 
-  case 131:
+  case 129:
 
-/* Line 1455 of yacc.c  */
-#line 1747 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1655 "compilers/imcc/imcc.y"
     { (yyval.t) = VT_OPTIONAL; }
     break;
 
-  case 132:
+  case 130:
 
-/* Line 1455 of yacc.c  */
-#line 1748 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1656 "compilers/imcc/imcc.y"
     { (yyval.t) = VT_OPT_FLAG; }
     break;
 
-  case 133:
+  case 131:
 
-/* Line 1455 of yacc.c  */
-#line 1749 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1657 "compilers/imcc/imcc.y"
     { (yyval.t) = VT_NAMED; }
     break;
 
-  case 134:
+  case 132:
 
-/* Line 1455 of yacc.c  */
-#line 1750 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1658 "compilers/imcc/imcc.y"
     { adv_named_set(interp, (yyvsp[(3) - (4)].s));   (yyval.t) = VT_NAMED; mem_sys_free((yyvsp[(3) - (4)].s)); }
     break;
 
-  case 135:
+  case 133:
 
-/* Line 1455 of yacc.c  */
-#line 1751 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1659 "compilers/imcc/imcc.y"
     { adv_named_set_u(interp, (yyvsp[(3) - (4)].s)); (yyval.t) = VT_NAMED; mem_sys_free((yyvsp[(3) - (4)].s)); }
     break;
 
-  case 136:
+  case 134:
 
-/* Line 1455 of yacc.c  */
-#line 1752 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1660 "compilers/imcc/imcc.y"
     { (yyval.t) = 0; }
     break;
 
-  case 137:
+  case 135:
 
-/* Line 1455 of yacc.c  */
-#line 1753 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1661 "compilers/imcc/imcc.y"
     { (yyval.t) = VT_CALL_SIG; }
     break;
 
-  case 138:
+  case 136:
 
-/* Line 1455 of yacc.c  */
-#line 1758 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1666 "compilers/imcc/imcc.y"
     { begin_return_or_yield(interp, 0); }
     break;
 
-  case 139:
+  case 137:
 
-/* Line 1455 of yacc.c  */
-#line 1760 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1668 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; IMCC_INFO(interp)->asm_state = AsmDefault; }
     break;
 
-  case 140:
+  case 138:
 
-/* Line 1455 of yacc.c  */
-#line 1762 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1670 "compilers/imcc/imcc.y"
     {
            IMCC_INFO(interp)->asm_state = AsmDefault;
            (yyval.i) = 0;
          }
     break;
 
-  case 141:
+  case 139:
 
-/* Line 1455 of yacc.c  */
-#line 1769 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1677 "compilers/imcc/imcc.y"
     { begin_return_or_yield(interp, 1); }
     break;
 
-  case 142:
+  case 140:
 
-/* Line 1455 of yacc.c  */
-#line 1771 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1679 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; IMCC_INFO(interp)->asm_state = AsmDefault; }
     break;
 
-  case 143:
+  case 141:
 
-/* Line 1455 of yacc.c  */
-#line 1775 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1683 "compilers/imcc/imcc.y"
     { (yyval.sr) = 0; }
     break;
 
-  case 144:
+  case 142:
 
-/* Line 1455 of yacc.c  */
-#line 1777 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1685 "compilers/imcc/imcc.y"
     {
            if ((yyvsp[(1) - (2)].sr))
                add_pcc_result(interp, IMCC_INFO(interp)->sr_return, (yyvsp[(1) - (2)].sr));
          }
     break;
 
-  case 145:
+  case 143:
 
-/* Line 1455 of yacc.c  */
-#line 1782 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1690 "compilers/imcc/imcc.y"
     {
            if ((yyvsp[(2) - (3)].sr))
                add_pcc_result(interp, IMCC_INFO(interp)->sr_return, (yyvsp[(2) - (3)].sr));
          }
     break;
 
-  case 146:
+  case 144:
 
-/* Line 1455 of yacc.c  */
-#line 1789 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1697 "compilers/imcc/imcc.y"
     { (yyval.sr) = 0; }
     break;
 
-  case 147:
+  case 145:
 
-/* Line 1455 of yacc.c  */
-#line 1791 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1699 "compilers/imcc/imcc.y"
     {
            if ((yyvsp[(1) - (2)].sr))
                add_pcc_result(interp, IMCC_INFO(interp)->sr_return, (yyvsp[(1) - (2)].sr));
          }
     break;
 
-  case 148:
+  case 146:
 
-/* Line 1455 of yacc.c  */
-#line 1796 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1704 "compilers/imcc/imcc.y"
     {
            if ((yyvsp[(2) - (3)].sr))
                add_pcc_result(interp, IMCC_INFO(interp)->sr_return, (yyvsp[(2) - (3)].sr));
          }
     break;
 
-  case 149:
+  case 147:
 
-/* Line 1455 of yacc.c  */
-#line 1803 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1711 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(2) - (3)].sr); (yyval.sr)->type |= (yyvsp[(3) - (3)].t); }
     break;
 
-  case 150:
+  case 148:
 
-/* Line 1455 of yacc.c  */
-#line 1807 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1715 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(2) - (3)].sr); (yyval.sr)->type |= (yyvsp[(3) - (3)].t); }
     break;
 
-  case 151:
+  case 149:
 
-/* Line 1455 of yacc.c  */
-#line 1812 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1720 "compilers/imcc/imcc.y"
     {
           if (IMCC_INFO(interp)->asm_state == AsmDefault)
               begin_return_or_yield(interp, (yyvsp[(1) - (2)].t));
         }
     break;
 
-  case 152:
+  case 150:
 
-/* Line 1455 of yacc.c  */
-#line 1817 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1725 "compilers/imcc/imcc.y"
     {
           IMCC_INFO(interp)->asm_state = AsmDefault;
           (yyval.t) = 0;
         }
     break;
 
-  case 153:
+  case 151:
 
-/* Line 1455 of yacc.c  */
-#line 1824 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1732 "compilers/imcc/imcc.y"
     { (yyval.t) = 0; }
     break;
 
-  case 154:
+  case 152:
 
-/* Line 1455 of yacc.c  */
-#line 1825 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1733 "compilers/imcc/imcc.y"
     { (yyval.t) = 1; }
     break;
 
-  case 155:
+  case 153:
 
-/* Line 1455 of yacc.c  */
-#line 1829 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1737 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
-  case 156:
+  case 154:
 
-/* Line 1455 of yacc.c  */
-#line 1831 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1739 "compilers/imcc/imcc.y"
     {
            if (IMCC_INFO(interp)->adv_named_id) {
                add_pcc_named_return(interp, IMCC_INFO(interp)->sr_return,
@@ -4477,20 +4378,20 @@
          }
     break;
 
-  case 157:
+  case 155:
 
-/* Line 1455 of yacc.c  */
-#line 1841 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1749 "compilers/imcc/imcc.y"
     {
             SymReg * const name = mk_const(interp, (yyvsp[(1) - (3)].s), 'S');
             add_pcc_named_return(interp, IMCC_INFO(interp)->sr_return, name, (yyvsp[(3) - (3)].sr));
          }
     break;
 
-  case 158:
+  case 156:
 
-/* Line 1455 of yacc.c  */
-#line 1846 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1754 "compilers/imcc/imcc.y"
     {
            if (IMCC_INFO(interp)->adv_named_id) {
                add_pcc_named_return(interp, IMCC_INFO(interp)->sr_return,
@@ -4502,76 +4403,76 @@
          }
     break;
 
-  case 159:
+  case 157:
 
-/* Line 1455 of yacc.c  */
-#line 1856 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1764 "compilers/imcc/imcc.y"
     {
            SymReg * const name = mk_const(interp, (yyvsp[(3) - (5)].s), 'S');
            add_pcc_named_return(interp, IMCC_INFO(interp)->sr_return, name, (yyvsp[(5) - (5)].sr));
          }
     break;
 
-  case 162:
+  case 160:
 
-/* Line 1455 of yacc.c  */
-#line 1877 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1785 "compilers/imcc/imcc.y"
     { clear_state(interp); }
     break;
 
-  case 163:
+  case 161:
 
-/* Line 1455 of yacc.c  */
-#line 1882 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1790 "compilers/imcc/imcc.y"
     { (yyval.i) = (yyvsp[(2) - (2)].i); }
     break;
 
-  case 164:
+  case 162:
 
-/* Line 1455 of yacc.c  */
-#line 1883 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1791 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
-  case 165:
+  case 163:
 
-/* Line 1455 of yacc.c  */
-#line 1884 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1792 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
-  case 166:
+  case 164:
 
-/* Line 1455 of yacc.c  */
-#line 1885 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1793 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
-  case 167:
+  case 165:
 
-/* Line 1455 of yacc.c  */
-#line 1886 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1794 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
-  case 168:
+  case 166:
 
-/* Line 1455 of yacc.c  */
-#line 1887 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1795 "compilers/imcc/imcc.y"
     { (yyval.i) = (yyvsp[(1) - (1)].i); }
     break;
 
-  case 169:
+  case 167:
 
-/* Line 1455 of yacc.c  */
-#line 1891 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1799 "compilers/imcc/imcc.y"
     { (yyval.i) = NULL; }
     break;
 
-  case 173:
+  case 171:
 
-/* Line 1455 of yacc.c  */
-#line 1902 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1810 "compilers/imcc/imcc.y"
     {
              Instruction * const i = iLABEL(interp, IMCC_INFO(interp)->cur_unit, mk_local_label(interp, (yyvsp[(1) - (1)].s)));
              mem_sys_free((yyvsp[(1) - (1)].s));
@@ -4579,17 +4480,17 @@
          }
     break;
 
-  case 174:
+  case 172:
 
-/* Line 1455 of yacc.c  */
-#line 1912 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1820 "compilers/imcc/imcc.y"
     { (yyval.i) = (yyvsp[(2) - (3)].i); }
     break;
 
-  case 175:
+  case 173:
 
-/* Line 1455 of yacc.c  */
-#line 1914 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1822 "compilers/imcc/imcc.y"
     {
            if (yynerrs >= PARROT_MAX_RECOVER_ERRORS) {
                IMCC_warning(interp, "Too many errors. Correct some first.\n");
@@ -4599,10 +4500,10 @@
          }
     break;
 
-  case 176:
+  case 174:
 
-/* Line 1455 of yacc.c  */
-#line 1925 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1833 "compilers/imcc/imcc.y"
     {
            IdList* const l = (yyvsp[(1) - (1)].idlist);
            l->next = NULL;
@@ -4610,10 +4511,10 @@
          }
     break;
 
-  case 177:
+  case 175:
 
-/* Line 1455 of yacc.c  */
-#line 1932 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1840 "compilers/imcc/imcc.y"
     {
            IdList* const l = (yyvsp[(3) - (3)].idlist);
            l->next = (yyvsp[(1) - (3)].idlist);
@@ -4621,10 +4522,10 @@
          }
     break;
 
-  case 178:
+  case 176:
 
-/* Line 1455 of yacc.c  */
-#line 1941 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1849 "compilers/imcc/imcc.y"
     {
            IdList* const l = mem_gc_allocate_n_zeroed_typed(interp, 1, IdList);
            l->id           = (yyvsp[(1) - (2)].s);
@@ -4632,22 +4533,22 @@
          }
     break;
 
-  case 183:
+  case 181:
 
-/* Line 1455 of yacc.c  */
-#line 1957 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1865 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->is_def = 1; }
     break;
 
-  case 184:
+  case 182:
 
-/* Line 1455 of yacc.c  */
-#line 1958 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1866 "compilers/imcc/imcc.y"
     {
            IdList *l = (yyvsp[(4) - (4)].idlist);
            while (l) {
                IdList *l1;
-               mk_ident(interp, l->id, (yyvsp[(3) - (4)].t));
+               mk_ident(interp, l->id, (yyvsp[(3) - (4)].t), VTIDENTIFIER);
                l1 = l;
                l  = l->next;
                mem_sys_free(l1->id);
@@ -4657,10 +4558,10 @@
          }
     break;
 
-  case 185:
+  case 183:
 
-/* Line 1455 of yacc.c  */
-#line 1971 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1879 "compilers/imcc/imcc.y"
     {
             if ((yyvsp[(4) - (4)].sr)->set != 'P') {
                 mem_sys_free((yyvsp[(2) - (4)].s));
@@ -4679,10 +4580,10 @@
          }
     break;
 
-  case 186:
+  case 184:
 
-/* Line 1455 of yacc.c  */
-#line 1988 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1896 "compilers/imcc/imcc.y"
     {
             if ((yyvsp[(4) - (4)].sr)->set != 'P') {
                 mem_sys_free((yyvsp[(2) - (4)].s));
@@ -4697,17 +4598,17 @@
          }
     break;
 
-  case 187:
+  case 185:
 
-/* Line 1455 of yacc.c  */
-#line 2000 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1908 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->is_def = 1; }
     break;
 
-  case 188:
+  case 186:
 
-/* Line 1455 of yacc.c  */
-#line 2001 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1909 "compilers/imcc/imcc.y"
     {
            mk_const_ident(interp, (yyvsp[(4) - (6)].s), (yyvsp[(3) - (6)].t), (yyvsp[(6) - (6)].sr), 0);
            IMCC_INFO(interp)->is_def = 0;
@@ -4715,17 +4616,17 @@
          }
     break;
 
-  case 190:
+  case 188:
 
-/* Line 1455 of yacc.c  */
-#line 2008 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1916 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->is_def = 1; }
     break;
 
-  case 191:
+  case 189:
 
-/* Line 1455 of yacc.c  */
-#line 2009 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1917 "compilers/imcc/imcc.y"
     {
            mk_const_ident(interp, (yyvsp[(4) - (6)].s), (yyvsp[(3) - (6)].t), (yyvsp[(6) - (6)].sr), 1);
            IMCC_INFO(interp)->is_def = 0;
@@ -4733,10 +4634,10 @@
          }
     break;
 
-  case 192:
+  case 190:
 
-/* Line 1455 of yacc.c  */
-#line 2015 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1923 "compilers/imcc/imcc.y"
     {
            (yyval.i) = NULL;
            IMCC_INFO(interp)->cur_call->pcc_sub->tailcall = 1;
@@ -4744,19 +4645,19 @@
          }
     break;
 
-  case 193:
+  case 191:
 
-/* Line 1455 of yacc.c  */
-#line 2021 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1929 "compilers/imcc/imcc.y"
     {
             (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, "branch", 1, (yyvsp[(2) - (2)].sr));
          }
     break;
 
-  case 194:
+  case 192:
 
-/* Line 1455 of yacc.c  */
-#line 2025 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1933 "compilers/imcc/imcc.y"
     {
            (yyval.i) = INS(interp,
                     IMCC_INFO(interp)->cur_unit,
@@ -4770,101 +4671,101 @@
          }
     break;
 
-  case 195:
+  case 193:
 
-/* Line 1455 of yacc.c  */
-#line 2036 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1944 "compilers/imcc/imcc.y"
     { (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, "null", 1, (yyvsp[(2) - (2)].sr)); }
     break;
 
-  case 196:
+  case 194:
 
-/* Line 1455 of yacc.c  */
-#line 2037 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1945 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; IMCC_INFO(interp)->cur_call = NULL; }
     break;
 
-  case 197:
+  case 195:
 
-/* Line 1455 of yacc.c  */
-#line 2038 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1946 "compilers/imcc/imcc.y"
     { (yyval.i) = 0; }
     break;
 
-  case 200:
+  case 198:
 
-/* Line 1455 of yacc.c  */
-#line 2041 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1949 "compilers/imcc/imcc.y"
     { (yyval.i) = 0;}
     break;
 
-  case 201:
+  case 199:
 
-/* Line 1455 of yacc.c  */
-#line 2045 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1953 "compilers/imcc/imcc.y"
     { (yyval.t) = 'I'; }
     break;
 
-  case 202:
+  case 200:
 
-/* Line 1455 of yacc.c  */
-#line 2046 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1954 "compilers/imcc/imcc.y"
     { (yyval.t) = 'N'; }
     break;
 
-  case 203:
+  case 201:
 
-/* Line 1455 of yacc.c  */
-#line 2047 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1955 "compilers/imcc/imcc.y"
     { (yyval.t) = 'S'; }
     break;
 
-  case 204:
+  case 202:
 
-/* Line 1455 of yacc.c  */
-#line 2048 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1956 "compilers/imcc/imcc.y"
     { (yyval.t) = 'P'; }
     break;
 
-  case 205:
+  case 203:
 
-/* Line 1455 of yacc.c  */
-#line 2053 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1961 "compilers/imcc/imcc.y"
     { (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, "set", 2, (yyvsp[(1) - (3)].sr), (yyvsp[(3) - (3)].sr));  }
     break;
 
-  case 206:
+  case 204:
 
-/* Line 1455 of yacc.c  */
-#line 2055 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1963 "compilers/imcc/imcc.y"
     { (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(3) - (4)].s), 2, (yyvsp[(1) - (4)].sr), (yyvsp[(4) - (4)].sr));  }
     break;
 
-  case 207:
+  case 205:
 
-/* Line 1455 of yacc.c  */
-#line 2057 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1965 "compilers/imcc/imcc.y"
     { (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(4) - (5)].s), 3, (yyvsp[(1) - (5)].sr), (yyvsp[(3) - (5)].sr), (yyvsp[(5) - (5)].sr)); }
     break;
 
-  case 208:
+  case 206:
 
-/* Line 1455 of yacc.c  */
-#line 2059 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1967 "compilers/imcc/imcc.y"
     { (yyval.i) = iINDEXFETCH(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(1) - (6)].sr), (yyvsp[(3) - (6)].sr), (yyvsp[(5) - (6)].sr)); }
     break;
 
-  case 209:
+  case 207:
 
-/* Line 1455 of yacc.c  */
-#line 2061 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1969 "compilers/imcc/imcc.y"
     { (yyval.i) = iINDEXSET(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(1) - (6)].sr), (yyvsp[(3) - (6)].sr), (yyvsp[(6) - (6)].sr)); }
     break;
 
-  case 210:
+  case 208:
 
-/* Line 1455 of yacc.c  */
-#line 2064 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1972 "compilers/imcc/imcc.y"
     {
            add_pcc_result(interp, (yyvsp[(3) - (3)].i)->symregs[0], (yyvsp[(1) - (3)].sr));
            IMCC_INFO(interp)->cur_call = NULL;
@@ -4872,220 +4773,220 @@
          }
     break;
 
-  case 211:
+  case 209:
 
-/* Line 1455 of yacc.c  */
-#line 2070 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1978 "compilers/imcc/imcc.y"
     {
            (yyval.i) = IMCC_create_itcall_label(interp);
          }
     break;
 
-  case 212:
+  case 210:
 
-/* Line 1455 of yacc.c  */
-#line 2074 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1982 "compilers/imcc/imcc.y"
     {
            IMCC_itcall_sub(interp, (yyvsp[(6) - (9)].sr));
            IMCC_INFO(interp)->cur_call = NULL;
          }
     break;
 
-  case 216:
+  case 214:
 
-/* Line 1455 of yacc.c  */
-#line 2082 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1990 "compilers/imcc/imcc.y"
     {
            (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, "null", 1, (yyvsp[(1) - (3)].sr));
          }
     break;
 
-  case 217:
+  case 215:
 
-/* Line 1455 of yacc.c  */
-#line 2089 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1997 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"not"; }
     break;
 
-  case 218:
+  case 216:
 
-/* Line 1455 of yacc.c  */
-#line 2090 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1998 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"bnot"; }
     break;
 
-  case 219:
+  case 217:
 
-/* Line 1455 of yacc.c  */
-#line 2091 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 1999 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"neg"; }
     break;
 
-  case 220:
+  case 218:
 
-/* Line 1455 of yacc.c  */
-#line 2095 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2003 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"sub"; }
     break;
 
-  case 221:
+  case 219:
 
-/* Line 1455 of yacc.c  */
-#line 2096 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2004 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"add"; }
     break;
 
-  case 222:
+  case 220:
 
-/* Line 1455 of yacc.c  */
-#line 2097 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2005 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"mul"; }
     break;
 
-  case 223:
+  case 221:
 
-/* Line 1455 of yacc.c  */
-#line 2098 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2006 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"div"; }
     break;
 
-  case 224:
+  case 222:
 
-/* Line 1455 of yacc.c  */
-#line 2099 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2007 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"mod"; }
     break;
 
-  case 225:
+  case 223:
 
-/* Line 1455 of yacc.c  */
-#line 2100 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2008 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"fdiv"; }
     break;
 
-  case 226:
+  case 224:
 
-/* Line 1455 of yacc.c  */
-#line 2101 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2009 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"pow"; }
     break;
 
-  case 227:
+  case 225:
 
-/* Line 1455 of yacc.c  */
-#line 2102 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2010 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"concat"; }
     break;
 
-  case 228:
+  case 226:
 
-/* Line 1455 of yacc.c  */
-#line 2103 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2011 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"iseq"; }
     break;
 
-  case 229:
+  case 227:
 
-/* Line 1455 of yacc.c  */
-#line 2104 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2012 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"isne"; }
     break;
 
-  case 230:
+  case 228:
 
-/* Line 1455 of yacc.c  */
-#line 2105 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2013 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"isgt"; }
     break;
 
-  case 231:
+  case 229:
 
-/* Line 1455 of yacc.c  */
-#line 2106 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2014 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"isge"; }
     break;
 
-  case 232:
+  case 230:
 
-/* Line 1455 of yacc.c  */
-#line 2107 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2015 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"islt"; }
     break;
 
-  case 233:
+  case 231:
 
-/* Line 1455 of yacc.c  */
-#line 2108 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2016 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"isle"; }
     break;
 
-  case 234:
+  case 232:
 
-/* Line 1455 of yacc.c  */
-#line 2109 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2017 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"shl"; }
     break;
 
-  case 235:
+  case 233:
 
-/* Line 1455 of yacc.c  */
-#line 2110 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2018 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"shr"; }
     break;
 
-  case 236:
+  case 234:
 
-/* Line 1455 of yacc.c  */
-#line 2111 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2019 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"lsr"; }
     break;
 
-  case 237:
+  case 235:
 
-/* Line 1455 of yacc.c  */
-#line 2112 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2020 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"and"; }
     break;
 
-  case 238:
+  case 236:
 
-/* Line 1455 of yacc.c  */
-#line 2113 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2021 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"or"; }
     break;
 
-  case 239:
+  case 237:
 
-/* Line 1455 of yacc.c  */
-#line 2114 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2022 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"xor"; }
     break;
 
-  case 240:
+  case 238:
 
-/* Line 1455 of yacc.c  */
-#line 2115 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2023 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"band"; }
     break;
 
-  case 241:
+  case 239:
 
-/* Line 1455 of yacc.c  */
-#line 2116 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2024 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"bor"; }
     break;
 
-  case 242:
+  case 240:
 
-/* Line 1455 of yacc.c  */
-#line 2117 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2025 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"bxor"; }
     break;
 
-  case 243:
+  case 241:
 
-/* Line 1455 of yacc.c  */
-#line 2123 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2031 "compilers/imcc/imcc.y"
     {
            (yyval.i) = IMCC_create_itcall_label(interp);
            (yyval.i)->type &= ~ITCALL;
@@ -5093,115 +4994,115 @@
          }
     break;
 
-  case 244:
+  case 242:
 
-/* Line 1455 of yacc.c  */
-#line 2128 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2036 "compilers/imcc/imcc.y"
     {  (yyval.i) = 0; }
     break;
 
-  case 245:
+  case 243:
 
-/* Line 1455 of yacc.c  */
-#line 2135 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2043 "compilers/imcc/imcc.y"
     { (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(2) - (3)].s), 2, (yyvsp[(1) - (3)].sr), (yyvsp[(3) - (3)].sr)); }
     break;
 
-  case 246:
+  case 244:
 
-/* Line 1455 of yacc.c  */
-#line 2139 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2047 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"add"; }
     break;
 
-  case 247:
+  case 245:
 
-/* Line 1455 of yacc.c  */
-#line 2140 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2048 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"sub"; }
     break;
 
-  case 248:
+  case 246:
 
-/* Line 1455 of yacc.c  */
-#line 2141 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2049 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"mul"; }
     break;
 
-  case 249:
+  case 247:
 
-/* Line 1455 of yacc.c  */
-#line 2142 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2050 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"div"; }
     break;
 
-  case 250:
+  case 248:
 
-/* Line 1455 of yacc.c  */
-#line 2143 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2051 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"mod"; }
     break;
 
-  case 251:
+  case 249:
 
-/* Line 1455 of yacc.c  */
-#line 2144 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2052 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"fdiv"; }
     break;
 
-  case 252:
+  case 250:
 
-/* Line 1455 of yacc.c  */
-#line 2145 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2053 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"concat"; }
     break;
 
-  case 253:
+  case 251:
 
-/* Line 1455 of yacc.c  */
-#line 2146 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2054 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"band"; }
     break;
 
-  case 254:
+  case 252:
 
-/* Line 1455 of yacc.c  */
-#line 2147 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2055 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"bor"; }
     break;
 
-  case 255:
+  case 253:
 
-/* Line 1455 of yacc.c  */
-#line 2148 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2056 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"bxor"; }
     break;
 
-  case 256:
+  case 254:
 
-/* Line 1455 of yacc.c  */
-#line 2149 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2057 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"shr"; }
     break;
 
-  case 257:
+  case 255:
 
-/* Line 1455 of yacc.c  */
-#line 2150 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2058 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"shl"; }
     break;
 
-  case 258:
+  case 256:
 
-/* Line 1455 of yacc.c  */
-#line 2151 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2059 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"lsr"; }
     break;
 
-  case 259:
+  case 257:
 
-/* Line 1455 of yacc.c  */
-#line 2157 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2065 "compilers/imcc/imcc.y"
     {
         (yyval.i) = func_ins(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(1) - (4)].sr), (yyvsp[(3) - (4)].s),
                       IMCC_INFO(interp) -> regs,
@@ -5211,31 +5112,31 @@
        }
     break;
 
-  case 260:
+  case 258:
 
-/* Line 1455 of yacc.c  */
-#line 2167 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2075 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_sub_address(interp, (yyvsp[(1) - (1)].s));       mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 261:
+  case 259:
 
-/* Line 1455 of yacc.c  */
-#line 2168 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2076 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_sub_address_fromc(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 262:
+  case 260:
 
-/* Line 1455 of yacc.c  */
-#line 2169 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2077 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_sub_address_u(interp, (yyvsp[(1) - (1)].s));     mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 263:
+  case 261:
 
-/* Line 1455 of yacc.c  */
-#line 2171 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2079 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = (yyvsp[(1) - (1)].sr);
            if ((yyvsp[(1) - (1)].sr)->set != 'P')
@@ -5243,10 +5144,10 @@
          }
     break;
 
-  case 264:
+  case 262:
 
-/* Line 1455 of yacc.c  */
-#line 2177 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2085 "compilers/imcc/imcc.y"
     {
             /* disallow bareword method names; SREG name constants are fine */
             const char * const name = (yyvsp[(3) - (3)].sr)->name;
@@ -5262,10 +5163,10 @@
         }
     break;
 
-  case 265:
+  case 263:
 
-/* Line 1455 of yacc.c  */
-#line 2191 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2099 "compilers/imcc/imcc.y"
     {
             IMCC_INFO(interp)->cur_obj = (yyvsp[(1) - (3)].sr);
             (yyval.sr)                         = mk_const(interp, (yyvsp[(3) - (3)].s), 'U');
@@ -5273,10 +5174,10 @@
          }
     break;
 
-  case 266:
+  case 264:
 
-/* Line 1455 of yacc.c  */
-#line 2197 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2105 "compilers/imcc/imcc.y"
     {
             IMCC_INFO(interp)->cur_obj = (yyvsp[(1) - (3)].sr);
             (yyval.sr)                         = mk_const(interp, (yyvsp[(3) - (3)].s), 'S');
@@ -5284,41 +5185,41 @@
          }
     break;
 
-  case 267:
+  case 265:
 
-/* Line 1455 of yacc.c  */
-#line 2202 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2110 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->cur_obj = (yyvsp[(1) - (3)].sr); (yyval.sr) = (yyvsp[(3) - (3)].sr); }
     break;
 
-  case 268:
+  case 266:
 
-/* Line 1455 of yacc.c  */
-#line 2208 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2116 "compilers/imcc/imcc.y"
     {
            (yyval.i) = IMCC_create_itcall_label(interp);
            IMCC_itcall_sub(interp, (yyvsp[(1) - (1)].sr));
          }
     break;
 
-  case 269:
+  case 267:
 
-/* Line 1455 of yacc.c  */
-#line 2212 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2120 "compilers/imcc/imcc.y"
     { (yyval.i) = (yyvsp[(2) - (5)].i); }
     break;
 
-  case 270:
+  case 268:
 
-/* Line 1455 of yacc.c  */
-#line 2216 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2124 "compilers/imcc/imcc.y"
     { (yyval.sr) = 0; }
     break;
 
-  case 271:
+  case 269:
 
-/* Line 1455 of yacc.c  */
-#line 2218 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2126 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = 0;
            if (IMCC_INFO(interp)->adv_named_id) {
@@ -5330,10 +5231,10 @@
          }
     break;
 
-  case 272:
+  case 270:
 
-/* Line 1455 of yacc.c  */
-#line 2228 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2136 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = 0;
            if (IMCC_INFO(interp)->adv_named_id) {
@@ -5345,10 +5246,10 @@
          }
     break;
 
-  case 273:
+  case 271:
 
-/* Line 1455 of yacc.c  */
-#line 2238 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2146 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = 0;
            add_pcc_named_arg(interp, IMCC_INFO(interp)->cur_call,
@@ -5357,20 +5258,20 @@
          }
     break;
 
-  case 274:
+  case 272:
 
-/* Line 1455 of yacc.c  */
-#line 2245 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2153 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = 0;
            add_pcc_named_arg_var(interp, IMCC_INFO(interp)->cur_call, (yyvsp[(1) - (3)].sr), (yyvsp[(3) - (3)].sr));
          }
     break;
 
-  case 275:
+  case 273:
 
-/* Line 1455 of yacc.c  */
-#line 2250 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2158 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = 0;
            add_pcc_named_arg(interp, IMCC_INFO(interp)->cur_call,
@@ -5379,73 +5280,73 @@
          }
     break;
 
-  case 276:
+  case 274:
 
-/* Line 1455 of yacc.c  */
-#line 2259 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2167 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(1) - (2)].sr); (yyval.sr)->type |= (yyvsp[(2) - (2)].t); }
     break;
 
-  case 277:
+  case 275:
 
-/* Line 1455 of yacc.c  */
-#line 2263 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2171 "compilers/imcc/imcc.y"
     { (yyval.t) = 0; }
     break;
 
-  case 278:
+  case 276:
 
-/* Line 1455 of yacc.c  */
-#line 2264 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2172 "compilers/imcc/imcc.y"
     { (yyval.t) = (yyvsp[(1) - (2)].t) | (yyvsp[(2) - (2)].t); }
     break;
 
-  case 279:
+  case 277:
 
-/* Line 1455 of yacc.c  */
-#line 2268 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2176 "compilers/imcc/imcc.y"
     { (yyval.t) = VT_FLAT;     }
     break;
 
-  case 280:
+  case 278:
 
-/* Line 1455 of yacc.c  */
-#line 2269 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2177 "compilers/imcc/imcc.y"
     { (yyval.t) = VT_NAMED;    }
     break;
 
-  case 281:
+  case 279:
 
-/* Line 1455 of yacc.c  */
-#line 2270 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2178 "compilers/imcc/imcc.y"
     { (yyval.t) = VT_CALL_SIG; }
     break;
 
-  case 282:
+  case 280:
 
-/* Line 1455 of yacc.c  */
-#line 2273 "compilers/imcc/imcc.y"
-    { adv_named_set_u(interp, (yyvsp[(3) - (4)].s)); (yyval.t) = 0; }
+/* Line 1464 of yacc.c  */
+#line 2180 "compilers/imcc/imcc.y"
+    { adv_named_set_u(interp, (yyvsp[(3) - (4)].s)); mem_sys_free((yyvsp[(3) - (4)].s)); (yyval.t) = 0; }
     break;
 
-  case 283:
+  case 281:
 
-/* Line 1455 of yacc.c  */
-#line 2274 "compilers/imcc/imcc.y"
-    { adv_named_set(interp, (yyvsp[(3) - (4)].s));   (yyval.t) = 0; }
+/* Line 1464 of yacc.c  */
+#line 2181 "compilers/imcc/imcc.y"
+    { adv_named_set(interp, (yyvsp[(3) - (4)].s));   mem_sys_free((yyvsp[(3) - (4)].s)); (yyval.t) = 0; }
     break;
 
-  case 284:
+  case 282:
 
-/* Line 1455 of yacc.c  */
-#line 2278 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2185 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(1) - (2)].sr); (yyval.sr)->type |= (yyvsp[(2) - (2)].t); }
     break;
 
-  case 285:
+  case 283:
 
-/* Line 1455 of yacc.c  */
-#line 2283 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2190 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = 0;
            if (IMCC_INFO(interp)->adv_named_id) {
@@ -5457,10 +5358,10 @@
          }
     break;
 
-  case 286:
+  case 284:
 
-/* Line 1455 of yacc.c  */
-#line 2293 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2200 "compilers/imcc/imcc.y"
     {
             add_pcc_named_result(interp, IMCC_INFO(interp)->cur_call,
                     mk_const(interp, (yyvsp[(3) - (5)].s), 'S'), (yyvsp[(5) - (5)].sr));
@@ -5468,10 +5369,10 @@
          }
     break;
 
-  case 287:
+  case 285:
 
-/* Line 1455 of yacc.c  */
-#line 2299 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2206 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = 0;
            if (IMCC_INFO(interp)->adv_named_id) {
@@ -5483,179 +5384,179 @@
          }
     break;
 
-  case 288:
+  case 286:
 
-/* Line 1455 of yacc.c  */
-#line 2309 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2216 "compilers/imcc/imcc.y"
     {
            add_pcc_named_result(interp, IMCC_INFO(interp)->cur_call, mk_const(interp, (yyvsp[(1) - (3)].s), 'S'), (yyvsp[(3) - (3)].sr));
            mem_sys_free((yyvsp[(1) - (3)].s));
          }
     break;
 
-  case 289:
+  case 287:
 
-/* Line 1455 of yacc.c  */
-#line 2313 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2220 "compilers/imcc/imcc.y"
     { (yyval.sr) = 0; }
     break;
 
-  case 290:
+  case 288:
 
-/* Line 1455 of yacc.c  */
-#line 2317 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2224 "compilers/imcc/imcc.y"
     { (yyval.i) = (yyvsp[(1) - (1)].i); }
     break;
 
-  case 291:
+  case 289:
 
-/* Line 1455 of yacc.c  */
-#line 2318 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2225 "compilers/imcc/imcc.y"
     { (yyval.i) = (yyvsp[(1) - (1)].i); }
     break;
 
-  case 292:
+  case 290:
 
-/* Line 1455 of yacc.c  */
-#line 2323 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2230 "compilers/imcc/imcc.y"
     {
            (yyval.i) =MK_I(interp, IMCC_INFO(interp)->cur_unit, inv_op((yyvsp[(3) - (6)].s)), 3, (yyvsp[(2) - (6)].sr), (yyvsp[(4) - (6)].sr), (yyvsp[(6) - (6)].sr));
          }
     break;
 
-  case 293:
+  case 291:
 
-/* Line 1455 of yacc.c  */
-#line 2327 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2234 "compilers/imcc/imcc.y"
     {
            (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, "unless_null", 2, (yyvsp[(3) - (5)].sr), (yyvsp[(5) - (5)].sr));
          }
     break;
 
-  case 294:
+  case 292:
 
-/* Line 1455 of yacc.c  */
-#line 2331 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2238 "compilers/imcc/imcc.y"
     {
            (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, "unless", 2, (yyvsp[(2) - (4)].sr), (yyvsp[(4) - (4)].sr));
          }
     break;
 
-  case 295:
+  case 293:
 
-/* Line 1455 of yacc.c  */
-#line 2338 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2245 "compilers/imcc/imcc.y"
     {
            (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, "if", 2, (yyvsp[(2) - (4)].sr), (yyvsp[(4) - (4)].sr));
          }
     break;
 
-  case 296:
+  case 294:
 
-/* Line 1455 of yacc.c  */
-#line 2342 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2249 "compilers/imcc/imcc.y"
     {
            (yyval.i) =MK_I(interp, IMCC_INFO(interp)->cur_unit, (yyvsp[(3) - (6)].s), 3, (yyvsp[(2) - (6)].sr), (yyvsp[(4) - (6)].sr), (yyvsp[(6) - (6)].sr));
          }
     break;
 
-  case 297:
+  case 295:
 
-/* Line 1455 of yacc.c  */
-#line 2346 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2253 "compilers/imcc/imcc.y"
     {
            (yyval.i) = MK_I(interp, IMCC_INFO(interp)->cur_unit, "if_null", 2, (yyvsp[(3) - (5)].sr), (yyvsp[(5) - (5)].sr));
          }
     break;
 
-  case 298:
+  case 296:
 
-/* Line 1455 of yacc.c  */
-#line 2352 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2259 "compilers/imcc/imcc.y"
     { (yyval.t) = 0; }
     break;
 
-  case 299:
+  case 297:
 
-/* Line 1455 of yacc.c  */
-#line 2353 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2260 "compilers/imcc/imcc.y"
     { (yyval.t) = 0; }
     break;
 
-  case 300:
+  case 298:
 
-/* Line 1455 of yacc.c  */
-#line 2357 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2264 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"eq"; }
     break;
 
-  case 301:
+  case 299:
 
-/* Line 1455 of yacc.c  */
-#line 2358 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2265 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"ne"; }
     break;
 
-  case 302:
+  case 300:
 
-/* Line 1455 of yacc.c  */
-#line 2359 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2266 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"gt"; }
     break;
 
-  case 303:
+  case 301:
 
-/* Line 1455 of yacc.c  */
-#line 2360 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2267 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"ge"; }
     break;
 
-  case 304:
+  case 302:
 
-/* Line 1455 of yacc.c  */
-#line 2361 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2268 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"lt"; }
     break;
 
-  case 305:
+  case 303:
 
-/* Line 1455 of yacc.c  */
-#line 2362 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2269 "compilers/imcc/imcc.y"
     { (yyval.s) = (char *)"le"; }
     break;
 
-  case 308:
+  case 306:
 
-/* Line 1455 of yacc.c  */
-#line 2371 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2278 "compilers/imcc/imcc.y"
     { (yyval.sr) = NULL; }
     break;
 
-  case 309:
+  case 307:
 
-/* Line 1455 of yacc.c  */
-#line 2372 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2279 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(1) - (1)].sr); }
     break;
 
-  case 310:
+  case 308:
 
-/* Line 1455 of yacc.c  */
-#line 2376 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2283 "compilers/imcc/imcc.y"
     { (yyval.sr) = IMCC_INFO(interp)->regs[0]; }
     break;
 
-  case 312:
+  case 310:
 
-/* Line 1455 of yacc.c  */
-#line 2381 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2288 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->regs[IMCC_INFO(interp)->nargs++] = (yyvsp[(1) - (1)].sr); }
     break;
 
-  case 313:
+  case 311:
 
-/* Line 1455 of yacc.c  */
-#line 2383 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2290 "compilers/imcc/imcc.y"
     {
            IMCC_INFO(interp) -> regs[IMCC_INFO(interp)->nargs++] = (yyvsp[(1) - (4)].sr);
            IMCC_INFO(interp) -> keyvec |= KEY_BIT(IMCC_INFO(interp)->nargs);
@@ -5664,71 +5565,71 @@
          }
     break;
 
-  case 314:
+  case 312:
 
-/* Line 1455 of yacc.c  */
-#line 2390 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2297 "compilers/imcc/imcc.y"
     {
            IMCC_INFO(interp) -> regs[IMCC_INFO(interp)->nargs++] = (yyvsp[(2) - (3)].sr);
            (yyval.sr) = (yyvsp[(2) - (3)].sr);
          }
     break;
 
-  case 316:
+  case 314:
 
-/* Line 1455 of yacc.c  */
-#line 2397 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2304 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_sub_address_fromc(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 317:
+  case 315:
 
-/* Line 1455 of yacc.c  */
-#line 2398 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2305 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_sub_address_u(interp, (yyvsp[(1) - (1)].s));  mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 318:
+  case 316:
 
-/* Line 1455 of yacc.c  */
-#line 2402 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2309 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_sub_address(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 319:
+  case 317:
 
-/* Line 1455 of yacc.c  */
-#line 2403 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2310 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_sub_address(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 320:
+  case 318:
 
-/* Line 1455 of yacc.c  */
-#line 2407 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2314 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_label_address(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 321:
+  case 319:
 
-/* Line 1455 of yacc.c  */
-#line 2408 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2315 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_label_address(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 326:
+  case 324:
 
-/* Line 1455 of yacc.c  */
-#line 2422 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2329 "compilers/imcc/imcc.y"
     {
            IMCC_INFO(interp)->nkeys    = 0;
          }
     break;
 
-  case 327:
+  case 325:
 
-/* Line 1455 of yacc.c  */
-#line 2426 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2333 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = link_keys(interp,
                           IMCC_INFO(interp)->nkeys,
@@ -5736,19 +5637,19 @@
          }
     break;
 
-  case 328:
+  case 326:
 
-/* Line 1455 of yacc.c  */
-#line 2434 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2341 "compilers/imcc/imcc.y"
     {
            IMCC_INFO(interp)->nkeys = 0;
          }
     break;
 
-  case 329:
+  case 327:
 
-/* Line 1455 of yacc.c  */
-#line 2438 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2345 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = link_keys(interp,
                           IMCC_INFO(interp)->nkeys,
@@ -5756,106 +5657,106 @@
          }
     break;
 
-  case 330:
+  case 328:
 
-/* Line 1455 of yacc.c  */
-#line 2446 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2353 "compilers/imcc/imcc.y"
     { IMCC_INFO(interp)->keys[IMCC_INFO(interp)->nkeys++] = (yyvsp[(1) - (1)].sr); }
     break;
 
-  case 331:
+  case 329:
 
-/* Line 1455 of yacc.c  */
-#line 2448 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2355 "compilers/imcc/imcc.y"
     {
            IMCC_INFO(interp)->keys[IMCC_INFO(interp)->nkeys++] = (yyvsp[(3) - (3)].sr);
            (yyval.sr) = IMCC_INFO(interp)->keys[0];
          }
     break;
 
-  case 332:
+  case 330:
 
-/* Line 1455 of yacc.c  */
-#line 2456 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2363 "compilers/imcc/imcc.y"
     {
            (yyval.sr) = (yyvsp[(1) - (1)].sr);
          }
     break;
 
-  case 333:
+  case 331:
 
-/* Line 1455 of yacc.c  */
-#line 2462 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2369 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_symreg(interp, (yyvsp[(1) - (1)].s), 'I'); }
     break;
 
-  case 334:
+  case 332:
 
-/* Line 1455 of yacc.c  */
-#line 2463 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2370 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_symreg(interp, (yyvsp[(1) - (1)].s), 'N'); }
     break;
 
-  case 335:
+  case 333:
 
-/* Line 1455 of yacc.c  */
-#line 2464 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2371 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_symreg(interp, (yyvsp[(1) - (1)].s), 'S'); }
     break;
 
-  case 336:
+  case 334:
 
-/* Line 1455 of yacc.c  */
-#line 2465 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2372 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_symreg(interp, (yyvsp[(1) - (1)].s), 'P'); }
     break;
 
-  case 337:
+  case 335:
 
-/* Line 1455 of yacc.c  */
-#line 2466 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2373 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_pasm_reg(interp, (yyvsp[(1) - (1)].s)); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 338:
+  case 336:
 
-/* Line 1455 of yacc.c  */
-#line 2470 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2377 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'S'); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 339:
+  case 337:
 
-/* Line 1455 of yacc.c  */
-#line 2471 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2378 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'U'); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 340:
+  case 338:
 
-/* Line 1455 of yacc.c  */
-#line 2475 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2382 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'I'); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 341:
+  case 339:
 
-/* Line 1455 of yacc.c  */
-#line 2476 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2383 "compilers/imcc/imcc.y"
     { (yyval.sr) = mk_const(interp, (yyvsp[(1) - (1)].s), 'N'); mem_sys_free((yyvsp[(1) - (1)].s)); }
     break;
 
-  case 342:
+  case 340:
 
-/* Line 1455 of yacc.c  */
-#line 2477 "compilers/imcc/imcc.y"
+/* Line 1464 of yacc.c  */
+#line 2384 "compilers/imcc/imcc.y"
     { (yyval.sr) = (yyvsp[(1) - (1)].sr); }
     break;
 
 
 
-/* Line 1455 of yacc.c  */
-#line 5848 "compilers/imcc/imcparser.c"
+/* Line 1464 of yacc.c  */
+#line 5749 "compilers/imcc/imcparser.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -6066,8 +5967,8 @@
 
 
 
-/* Line 1675 of yacc.c  */
-#line 2483 "compilers/imcc/imcc.y"
+/* Line 1684 of yacc.c  */
+#line 2390 "compilers/imcc/imcc.y"
 
 
 /* I need this prototype somewhere... */

Modified: branches/gsoc_nci/compilers/imcc/imcparser.h
==============================================================================
--- branches/gsoc_nci/compilers/imcc/imcparser.h	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/imcparser.h	Tue Sep 28 17:16:52 2010	(r49366)
@@ -9,13 +9,12 @@
  */
 /* HEADERIZER HFILE: none */
 /* HEADERIZER STOP */
-
-/* A Bison parser, made by GNU Bison 2.4.1.  */
+/* A Bison parser, made by GNU Bison 2.4.3.  */
 
 /* Skeleton interface for Bison's Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+   2009, 2010 Free Software Foundation, Inc.
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -295,8 +294,8 @@
 typedef union YYSTYPE
 {
 
-/* Line 1676 of yacc.c  */
-#line 1071 "compilers/imcc/imcc.y"
+/* Line 1685 of yacc.c  */
+#line 986 "compilers/imcc/imcc.y"
 
     IdList * idlist;
     int t;
@@ -306,8 +305,8 @@
 
 
 
-/* Line 1676 of yacc.c  */
-#line 300 "compilers/imcc/imcparser.h"
+/* Line 1685 of yacc.c  */
+#line 299 "compilers/imcc/imcparser.h"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */

Modified: branches/gsoc_nci/compilers/imcc/instructions.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/instructions.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/instructions.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -10,6 +10,7 @@
 #include "pbc.h"
 #include "optimizer.h"
 #include "pmc/pmc_callcontext.h"
+#include "parrot/oplib/core_ops.h"
 
 /*
 
@@ -112,7 +113,7 @@
         ins->symregs[i]  = r[i];
 
     ins->flags = flags;
-    ins->opnum = -1;
+    ins->op    = NULL;
 
     return ins;
 }
@@ -133,19 +134,22 @@
 {
     ASSERT_ARGS(instruction_reads)
     int f, i;
+    op_lib_t *core_ops = PARROT_GET_CORE_OPLIB(NULL);
 
-    if (ins->opnum == PARROT_OP_set_args_pc
-    ||  ins->opnum == PARROT_OP_set_returns_pc) {
+    if (ins->op && ins->op->lib == core_ops) {
+        if (OP_INFO_OPNUM(ins->op) == PARROT_OP_set_args_pc
+        ||  OP_INFO_OPNUM(ins->op) == PARROT_OP_set_returns_pc) {
+
+            for (i = ins->symreg_count - 1; i >= 0; --i)
+                if (r == ins->symregs[i])
+                    return 1;
 
-        for (i = ins->symreg_count - 1; i >= 0; --i)
-            if (r == ins->symregs[i])
-                return 1;
-
-        return 0;
-    }
-    else if (ins->opnum == PARROT_OP_get_params_pc ||
-             ins->opnum == PARROT_OP_get_results_pc) {
-        return 0;
+            return 0;
+        }
+        else if (OP_INFO_OPNUM(ins->op) == PARROT_OP_get_params_pc ||
+                 OP_INFO_OPNUM(ins->op) == PARROT_OP_get_results_pc) {
+            return 0;
+        }
     }
 
     f = ins->flags;
@@ -172,7 +176,7 @@
 
     /* a sub call reads the previous args */
     if (ins->type & ITPCCSUB) {
-        while (ins && ins->opnum != PARROT_OP_set_args_pc)
+        while (ins && ins->op != &core_ops->op_info_table[PARROT_OP_set_args_pc])
             ins = ins->prev;
 
         if (!ins)
@@ -204,9 +208,10 @@
     ASSERT_ARGS(instruction_writes)
     const int f = ins->flags;
     int j;
+    op_lib_t *core_ops = PARROT_GET_CORE_OPLIB(NULL);
 
     /* a get_results opcode occurs after the actual sub call */
-    if (ins->opnum == PARROT_OP_get_results_pc) {
+    if (ins->op == &core_ops->op_info_table[PARROT_OP_get_results_pc]) {
         int i;
 
         /* but only if it isn't the get_results opcode of
@@ -231,7 +236,7 @@
          * and point to the most recent pcc_sub
          * structure
          */
-        while (ins && ins->opnum != PARROT_OP_get_results_pc)
+        while (ins && ins->op != &core_ops->op_info_table[PARROT_OP_get_results_pc])
             ins = ins->next;
 
         if (!ins)
@@ -245,7 +250,7 @@
         return 0;
     }
 
-    if (ins->opnum == PARROT_OP_get_params_pc) {
+    if (ins->op == &core_ops->op_info_table[PARROT_OP_get_params_pc]) {
         int i;
 
         for (i = ins->symreg_count - 1; i >= 0; --i) {
@@ -255,8 +260,8 @@
 
         return 0;
     }
-    else if (ins->opnum == PARROT_OP_set_args_pc
-         ||  ins->opnum == PARROT_OP_set_returns_pc) {
+    else if (ins->op == &core_ops->op_info_table[PARROT_OP_set_args_pc]
+         ||  ins->op == &core_ops->op_info_table[PARROT_OP_set_returns_pc]) {
         return 0;
     }
 
@@ -618,16 +623,6 @@
             snprintf(regb[i], REGB_SIZE, "%c%d", p->set, (int)p->color);
             regstr[i] = regb[i];
         }
-        else if (IMCC_INFO(interp)->allocated
-             && (IMCC_INFO(interp)->optimizer_level & OPT_J)
-             &&  p->set != 'K'
-             &&  p->color < 0
-             && REG_NEEDS_ALLOC(p)) {
-                    snprintf(regb[i], REGB_SIZE,
-                        "r%c%d", tolower((unsigned char)p->set),
-                        -1 -(int)p->color);
-                    regstr[i] = regb[i];
-        }
         else if (p->type & VTREGKEY) {
             const SymReg *k = p;
 
@@ -639,13 +634,6 @@
                 if (k->reg && k->reg->color >= 0)
                     snprintf(regb[i]+used, REGB_SIZE - used, "%c%d",
                             k->reg->set, (int)k->reg->color);
-                else if (IMCC_INFO(interp)->allocated
-                     && (IMCC_INFO(interp)->optimizer_level & OPT_J)
-                     && k->reg
-                     && k->reg->color < 0)
-                        snprintf(regb[i]+used, REGB_SIZE - used, "r%c%d",
-                            tolower((unsigned char)k->reg->set),
-                            -1 -(int)k->reg->color);
                 else
                     strncat(regb[i], k->name, REGB_SIZE - used - 1);
 

Modified: branches/gsoc_nci/compilers/imcc/instructions.h
==============================================================================
--- branches/gsoc_nci/compilers/imcc/instructions.h	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/instructions.h	Tue Sep 28 17:16:52 2010	(r49366)
@@ -16,10 +16,9 @@
     ITALIAS    =  0x100000, /*  set P,P  */
     ITADDR     =  0x200000, /*  set_addr P, addr*/
     ITRESULT   =  0x400000, /*  .get_results */
-    ITEXT      =  0x800000, /*  instruction is extcall in JIT */
-    ITSAVES    = 0x1000000, /*  saveall/restoreall in a bsr */
-    ITPCCSUB   = 0x2000000, /*  PCC sub call */
-    ITPCCYIELD = 0x4000000  /*  yield from PCC call instead of return */
+    ITSAVES    =  0x800000, /*  saveall/restoreall in a bsr */
+    ITPCCSUB   = 0x1000000, /*  PCC sub call */
+    ITPCCYIELD = 0x2000000  /*  yield from PCC call instead of return */
 };
 
 
@@ -35,7 +34,7 @@
     struct _Instruction *prev;
     struct _Instruction *next;
 
-    int     opnum;         /* parrot op number */
+    op_info_t *op;         /* parrot opcode */
     int     opsize;        /* parrot op size   */
     int     line;          /* source code line number */
     int     symreg_count;  /* count of regs in **symregs */

Modified: branches/gsoc_nci/compilers/imcc/optimizer.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/optimizer.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/optimizer.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -74,6 +74,7 @@
 #include "pbc.h"
 #include "optimizer.h"
 #include "pmc/pmc_callcontext.h"
+#include "parrot/oplib/core_ops.h"
 
 /* HEADERIZER HFILE: compilers/imcc/optimizer.h */
 
@@ -368,7 +369,7 @@
                     last->symregs[reg] = go;
                     tmp = INS(interp, unit, neg_op, "",
                               last->symregs, args, 0, 0);
-                    last->opnum = tmp->opnum;
+                    last->op = tmp->op;
                     last->opsize = tmp->opsize;
                     mem_sys_free(last->opname);
                     last->opname = mem_sys_strdup(tmp->opname);
@@ -409,6 +410,7 @@
     SymReg *r;
     int changes = 0;
     FLOATVAL f;
+    op_lib_t *core_ops = PARROT_GET_CORE_OPLIB(interp);
 
     IMCC_info(interp, 2, "\tstrength_reduce\n");
     for (ins = unit->instructions; ins; ins = ins->next) {
@@ -428,37 +430,37 @@
          * div Nx, Nx, Ny => sub Nx, Ny
          * fdiv Nx, Nx, Ny => sub Nx, Ny
          */
-        if (((ins->opnum == PARROT_OP_sub_i_i_i ||
-                ins->opnum == PARROT_OP_sub_i_i_ic ||
-                ins->opnum == PARROT_OP_sub_i_ic_i ||
-                ins->opnum == PARROT_OP_div_i_i_i ||
-                ins->opnum == PARROT_OP_div_i_i_ic ||
-                ins->opnum == PARROT_OP_div_i_ic_i ||
-                ins->opnum == PARROT_OP_fdiv_i_i_i ||
-                ins->opnum == PARROT_OP_fdiv_i_i_ic ||
-                ins->opnum == PARROT_OP_fdiv_i_ic_i ||
-                ins->opnum == PARROT_OP_sub_n_n_n ||
-                ins->opnum == PARROT_OP_sub_n_n_nc ||
-                ins->opnum == PARROT_OP_sub_n_nc_n ||
-                ins->opnum == PARROT_OP_div_n_n_n ||
-                ins->opnum == PARROT_OP_div_n_n_nc ||
-                ins->opnum == PARROT_OP_div_n_nc_n ||
-                ins->opnum == PARROT_OP_fdiv_n_n_n ||
-                ins->opnum == PARROT_OP_fdiv_n_n_nc ||
-                ins->opnum == PARROT_OP_fdiv_n_nc_n) &&
+        if (((ins->op == &core_ops->op_info_table[PARROT_OP_sub_i_i_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_i_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_i_ic_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_div_i_i_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_div_i_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_div_i_ic_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_fdiv_i_i_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_fdiv_i_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_fdiv_i_ic_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_n_n_n] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_n_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_n_nc_n] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_div_n_n_n] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_div_n_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_div_n_nc_n] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_fdiv_n_n_n] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_fdiv_n_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_fdiv_n_nc_n]) &&
              ins->symregs[0] == ins->symregs[1])
-          || ((ins->opnum == PARROT_OP_add_i_i_i ||
-                ins->opnum == PARROT_OP_add_i_i_ic ||
-                ins->opnum == PARROT_OP_add_i_ic_i ||
-                ins->opnum == PARROT_OP_mul_i_i_i ||
-                ins->opnum == PARROT_OP_mul_i_i_ic ||
-                ins->opnum == PARROT_OP_mul_i_ic_i ||
-                ins->opnum == PARROT_OP_add_n_n_n ||
-                ins->opnum == PARROT_OP_add_n_n_nc ||
-                ins->opnum == PARROT_OP_add_n_nc_n ||
-                ins->opnum == PARROT_OP_mul_n_n_n ||
-                ins->opnum == PARROT_OP_mul_n_n_nc ||
-                ins->opnum == PARROT_OP_mul_n_nc_n) &&
+          || ((ins->op == &core_ops->op_info_table[PARROT_OP_add_i_i_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_add_i_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_add_i_ic_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_mul_i_i_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_mul_i_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_mul_i_ic_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_add_n_n_n] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_add_n_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_add_n_nc_n] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_mul_n_n_n] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_mul_n_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_mul_n_nc_n]) &&
              (ins->symregs[0] == ins->symregs[1] ||
               ins->symregs[0] == ins->symregs[2]))) {
             IMCC_debug(interp, DEBUG_OPT1, "opt1 %d => ", ins);
@@ -483,19 +485,19 @@
          * div Nx, 1     => delete
          * fdiv Nx, 1    => delete
          */
-        if (((ins->opnum == PARROT_OP_add_i_ic ||
-                ins->opnum == PARROT_OP_sub_i_ic) &&
+        if (((ins->op == &core_ops->op_info_table[PARROT_OP_add_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_i_ic]) &&
                       IMCC_int_from_reg(interp, ins->symregs[1]) == 0)
-          || ((ins->opnum == PARROT_OP_mul_i_ic ||
-                ins->opnum == PARROT_OP_div_i_ic ||
-                ins->opnum == PARROT_OP_fdiv_i_ic) &&
+          || ((ins->op == &core_ops->op_info_table[PARROT_OP_mul_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_div_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_fdiv_i_ic]) &&
                       IMCC_int_from_reg(interp, ins->symregs[1]) == 1)
-          || ((ins->opnum == PARROT_OP_add_n_nc ||
-                ins->opnum == PARROT_OP_sub_n_nc) &&
+          || ((ins->op == &core_ops->op_info_table[PARROT_OP_add_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_n_nc]) &&
                 (f = atof(ins->symregs[1]->name), FLOAT_IS_ZERO(f)))
-          || ((ins->opnum  == PARROT_OP_mul_n_nc  ||
-                ins->opnum == PARROT_OP_div_n_nc ||
-                ins->opnum == PARROT_OP_fdiv_n_nc) &&
+          || ((ins->op  == &core_ops->op_info_table[PARROT_OP_mul_n_nc]  ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_div_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_fdiv_n_nc]) &&
                       atof(ins->symregs[1]->name) == 1.0)) {
             IMCC_debug(interp, DEBUG_OPT1, "opt1 %d => ", ins);
             ins = delete_ins(unit, ins);
@@ -513,16 +515,16 @@
          * sub Ix, 1     => dec Ix
          * sub Nx, 1     => dec Nx
          */
-        if (((ins->opnum == PARROT_OP_add_i_ic ||
-                ins->opnum == PARROT_OP_sub_i_ic) &&
+        if (((ins->op == &core_ops->op_info_table[PARROT_OP_add_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_i_ic]) &&
                       IMCC_int_from_reg(interp, ins->symregs[1]) == 1)
-          || ((ins->opnum == PARROT_OP_add_n_nc ||
-                ins->opnum == PARROT_OP_sub_n_nc) &&
+          || ((ins->op == &core_ops->op_info_table[PARROT_OP_add_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_n_nc]) &&
                       atof(ins->symregs[1]->name) == 1.0)) {
             IMCC_debug(interp, DEBUG_OPT1, "opt1 %d => ", ins);
             --ins->symregs[1]->use_count;
-            if (ins->opnum == PARROT_OP_add_i_ic ||
-                ins->opnum == PARROT_OP_add_n_nc)
+            if (ins->op == &core_ops->op_info_table[PARROT_OP_add_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_add_n_nc])
                 tmp = INS(interp, unit, "inc", "", ins->symregs, 1, 0, 0);
             else
                 tmp = INS(interp, unit, "dec", "", ins->symregs, 1, 0, 0);
@@ -548,27 +550,27 @@
          * div Nx, Ny, 1 => set Nx, Ny
          * fdiv Nx, Ny, 1 => set Nx, Ny
          */
-        if (((ins->opnum == PARROT_OP_add_i_i_ic ||
-                ins->opnum == PARROT_OP_sub_i_i_ic) &&
+        if (((ins->op == &core_ops->op_info_table[PARROT_OP_add_i_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_i_i_ic]) &&
                       IMCC_int_from_reg(interp, ins->symregs[2]) == 0)
-          || (ins->opnum == PARROT_OP_add_i_ic_i &&
+          || (ins->op == &core_ops->op_info_table[PARROT_OP_add_i_ic_i] &&
                       IMCC_int_from_reg(interp, ins->symregs[1]) == 0)
-          || ((ins->opnum == PARROT_OP_mul_i_i_ic ||
-                ins->opnum == PARROT_OP_div_i_i_ic ||
-                ins->opnum == PARROT_OP_fdiv_i_i_ic) &&
+          || ((ins->op == &core_ops->op_info_table[PARROT_OP_mul_i_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_div_i_i_ic] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_fdiv_i_i_ic]) &&
                       IMCC_int_from_reg(interp, ins->symregs[2]) == 1)
-          || (ins->opnum == PARROT_OP_mul_i_ic_i &&
+          || (ins->op == &core_ops->op_info_table[PARROT_OP_mul_i_ic_i] &&
                       IMCC_int_from_reg(interp, ins->symregs[1]) == 1)
-          || ((ins->opnum == PARROT_OP_add_n_n_nc ||
-                ins->opnum == PARROT_OP_sub_n_n_nc) &&
+          || ((ins->op == &core_ops->op_info_table[PARROT_OP_add_n_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_sub_n_n_nc]) &&
                 (f = atof(ins->symregs[2]->name), FLOAT_IS_ZERO(f)))
-          || (ins->opnum == PARROT_OP_add_n_nc_n &&
+          || (ins->op == &core_ops->op_info_table[PARROT_OP_add_n_nc_n] &&
              (f = atof(ins->symregs[1]->name), FLOAT_IS_ZERO(f)))
-          || ((ins->opnum == PARROT_OP_mul_n_n_nc ||
-                ins->opnum == PARROT_OP_div_n_n_nc ||
-                ins->opnum == PARROT_OP_fdiv_n_n_nc) &&
+          || ((ins->op == &core_ops->op_info_table[PARROT_OP_mul_n_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_div_n_n_nc] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_fdiv_n_n_nc]) &&
                       atof(ins->symregs[2]->name) == 1.0)
-          || (ins->opnum == PARROT_OP_mul_n_nc_n &&
+          || (ins->op == &core_ops->op_info_table[PARROT_OP_mul_n_nc_n] &&
                       atof(ins->symregs[1]->name) == 1.0)) {
             IMCC_debug(interp, DEBUG_OPT1, "opt1 %d => ", ins);
             if (ins->symregs[1]->type == VTCONST) {
@@ -590,15 +592,15 @@
          * mul Ix, 0, Iy => set Ix, 0
          * mul Ix, 0     => set Ix, 0
          */
-        if ((ins->opnum == PARROT_OP_mul_i_i_ic &&
+        if ((ins->op == &core_ops->op_info_table[PARROT_OP_mul_i_i_ic] &&
                       IMCC_int_from_reg(interp, ins->symregs[2]) == 0)
-          || ((ins->opnum == PARROT_OP_mul_i_ic_i ||
-                ins->opnum == PARROT_OP_mul_i_ic) &&
+          || ((ins->op == &core_ops->op_info_table[PARROT_OP_mul_i_ic_i] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_mul_i_ic]) &&
                       IMCC_int_from_reg(interp, ins->symregs[1]) == 0)
-          || (ins->opnum == PARROT_OP_mul_n_n_nc &&
+          || (ins->op == &core_ops->op_info_table[PARROT_OP_mul_n_n_nc] &&
              (f = atof(ins->symregs[2]->name), FLOAT_IS_ZERO(f)))
-          || ((ins->opnum == PARROT_OP_mul_n_nc_n ||
-                ins->opnum == PARROT_OP_mul_n_nc) &&
+          || ((ins->op == &core_ops->op_info_table[PARROT_OP_mul_n_nc_n] ||
+                ins->op == &core_ops->op_info_table[PARROT_OP_mul_n_nc]) &&
                 (f = atof(ins->symregs[1]->name), FLOAT_IS_ZERO(f)))) {
             IMCC_debug(interp, DEBUG_OPT1, "opt1 %d => ", ins);
             r = mk_const(interp, "0", ins->symregs[0]->set);
@@ -616,9 +618,9 @@
          * set Ix, 0     => null Ix
          * set Nx, 0     => null Nx
          */
-        if ((ins->opnum == PARROT_OP_set_i_ic &&
+        if ((ins->op == &core_ops->op_info_table[PARROT_OP_set_i_ic] &&
                       IMCC_int_from_reg(interp, ins->symregs[1]) == 0)
-          || (ins->opnum == PARROT_OP_set_n_nc &&
+          || (ins->op == &core_ops->op_info_table[PARROT_OP_set_n_nc] &&
              (f = atof(ins->symregs[1]->name), FLOAT_IS_ZERO(f)) &&
               ins->symregs[1]->name[0] != '-')) {
             IMCC_debug(interp, DEBUG_OPT1, "opt1 %d => ", ins);
@@ -714,16 +716,15 @@
                             }
                             else {
                                 char fullname[128];
-                                const int op = check_op(interp, fullname, ins2->opname,
+                                check_op(interp, &ins2->op, fullname, ins2->opname,
                                     ins2->symregs, ins2->symreg_count, ins2->keys);
-                                if (op < 0) {
+                                if (!ins2->op) {
                                     ins2->symregs[i] = old;
                                     IMCC_debug(interp, DEBUG_OPT2,
                                             " - no %s\n", fullname);
                                 }
                                 else {
                                     --old->use_count;
-                                    ins2->opnum = op;
                                     any = 1;
                                     IMCC_debug(interp, DEBUG_OPT2,
                                             " -> %d\n", ins2);
@@ -804,14 +805,11 @@
     opcode_t eval[4], *pc;
     int opnum;
     int i;
-    op_info_t *op_info;
-
-    opnum = interp->op_lib->op_code(interp, op, 1);
-    if (opnum < 0)
+    op_info_t *op_info = (op_info_t *)parrot_hash_get(interp, interp->op_hash, (void *)op);
+    if (!op_info || !STREQ(op_info->full_name, op))
         IMCC_fatal(interp, 1, "eval_ins: op '%s' not found\n", op);
-    op_info = interp->op_info_table + opnum;
     /* now fill registers */
-    eval[0] = opnum;
+    eval[0] = 0;
     for (i = 0; i < op_info->op_count - 1; i++) {
         switch (op_info->types[i]) {
           case PARROT_ARG_IC:
@@ -855,7 +853,7 @@
     if (setjmp(interp->current_runloop->resume))
         return -1;
 
-    pc = (interp->op_func_table[opnum]) (eval, interp);
+    pc = (OP_INFO_OPFUNC(op_info)) (eval, interp);
     free_runloop_jump_point(interp);
     /* the returned pc is either incremented by op_count or is eval,
      * as the branch offset is 0 - return true if it branched

Modified: branches/gsoc_nci/compilers/imcc/parser_util.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/parser_util.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/parser_util.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -64,6 +64,22 @@
 
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
+static op_info_t * try_find_op(PARROT_INTERP,
+    ARGMOD(IMC_Unit *unit),
+    ARGIN(const char *name),
+    ARGMOD(SymReg **r),
+    int n,
+    int keyvec,
+    int emit)
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
+        __attribute__nonnull__(3)
+        __attribute__nonnull__(4)
+        FUNC_MODIFIES(*unit)
+        FUNC_MODIFIES(*r);
+
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 static const char * try_rev_cmp(ARGIN(const char *name), ARGMOD(SymReg **r))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
@@ -91,6 +107,11 @@
     , PARROT_ASSERT_ARG(r))
 #define ASSERT_ARGS_imcc_destroy_macro_values __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(value))
+#define ASSERT_ARGS_try_find_op __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(unit) \
+    , PARROT_ASSERT_ARG(name) \
+    , PARROT_ASSERT_ARG(r))
 #define ASSERT_ARGS_try_rev_cmp __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(name) \
     , PARROT_ASSERT_ARG(r))
@@ -175,8 +196,8 @@
 
 /*
 
-=item C<int check_op(PARROT_INTERP, char *fullname, const char *name, SymReg *
-const * r, int narg, int keyvec)>
+=item C<void check_op(PARROT_INTERP, op_info_t **op_info, char *fullname, const
+char *name, SymReg * const * r, int narg, int keyvec)>
 
 Return opcode value for op name
 
@@ -184,15 +205,15 @@
 
 */
 
-PARROT_WARN_UNUSED_RESULT
-int
-check_op(PARROT_INTERP, ARGOUT(char *fullname), ARGIN(const char *name),
-        ARGIN(SymReg * const * r), int narg, int keyvec)
+void
+check_op(PARROT_INTERP, ARGOUT(op_info_t **op_info), ARGOUT(char *fullname),
+        ARGIN(const char *name), ARGIN(SymReg * const * r), int narg, int keyvec)
 {
     ASSERT_ARGS(check_op)
     op_fullname(fullname, name, r, narg, keyvec);
-
-    return interp->op_lib->op_code(interp, fullname, 1);
+    *op_info = (op_info_t *)parrot_hash_get(interp, interp->op_hash, fullname);
+    if (*op_info && !STREQ((*op_info)->full_name, fullname))
+        *op_info = NULL;
 }
 
 /*
@@ -210,8 +231,7 @@
 is_op(PARROT_INTERP, ARGIN(const char *name))
 {
     ASSERT_ARGS(is_op)
-    return interp->op_lib->op_code(interp, name, 0) >= 0
-        || interp->op_lib->op_code(interp, name, 1) >= 0;
+    return parrot_hash_exists(interp, interp->op_hash, (void *)name);
 }
 
 /*
@@ -234,7 +254,7 @@
         ARGMOD(SymReg **r), int n, int emit)
 {
     ASSERT_ARGS(var_arg_ins)
-    int op;
+    op_info_t *op;
     Instruction *ins;
     char fullname[64];
 
@@ -247,16 +267,18 @@
         IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                     "The opcode '%s' needs arguments", name);
 
-    r[0]           = mk_const(interp, r[0]->name, 'P');
-    r[0]->pmc_type = enum_class_FixedIntegerArray;
+    if (r[0]->set == 'S') {
+        r[0]           = mk_const(interp, r[0]->name, 'P');
+        r[0]->pmc_type = enum_class_FixedIntegerArray;
+    }
 
     op_fullname(fullname, name, r, 1, 0);
-    op = interp->op_lib->op_code(interp, fullname, 1);
+    op = (op_info_t *)parrot_hash_get(interp, interp->op_hash, fullname);
 
-    PARROT_ASSERT(op >= 0);
+    PARROT_ASSERT(op && STREQ(op->full_name, fullname));
 
     ins         = _mk_instruction(name, "", n, r, dirs);
-    ins->opnum  = op;
+    ins->op     = op;
     ins->opsize = n + 1;
 
     if (emit)
@@ -309,33 +331,40 @@
         return var_arg_ins(interp, unit, name, r, n, emit);
     else {
         Instruction *ins;
-        int i, op, len;
+        int i, len;
         int dirs = 0;
-        op_info_t   *op_info;
+        op_info_t *op;
         char fullname[64] = "", format[128] = "";
 
         op_fullname(fullname, name, r, n, keyvec);
-        op = interp->op_lib->op_code(interp, fullname, 1);
+        op = (op_info_t *)parrot_hash_get(interp, interp->op_hash, fullname);
+        if (op && !STREQ(op->full_name, fullname))
+            op = NULL;
 
         /* maybe we have a fullname */
-        if (op < 0)
-            op = interp->op_lib->op_code(interp, name, 1);
+        if (!op) {
+            op = (op_info_t *)parrot_hash_get(interp, interp->op_hash, name);
+            if (op && !STREQ(op->full_name, name))
+                op = NULL;
+        }
 
         /* still wrong, try reverse compare */
-        if (op < 0) {
+        if (!op) {
             const char * const n_name = try_rev_cmp(name, r);
             if (n_name) {
                 name = n_name;
                 op_fullname(fullname, name, r, n, keyvec);
-                op   = interp->op_lib->op_code(interp, fullname, 1);
+                op = (op_info_t *)parrot_hash_get(interp, interp->op_hash, fullname);
+                if (op && !STREQ(op->full_name, fullname))
+                    op = NULL;
             }
         }
 
         /* still wrong, try to find an existing op */
-        if (op < 0)
+        if (!op)
             op = try_find_op(interp, unit, name, r, n, keyvec, emit);
 
-        if (op < 0) {
+        if (!op) {
             int ok = 0;
 
             /* check mixed constants */
@@ -356,26 +385,25 @@
         else
             strcpy(fullname, name);
 
-        if (op < 0)
+        if (!op)
             IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                         "The opcode '%s' (%s<%d>) was not found. "
                         "Check the type and number of the arguments",
                         fullname, name, n);
 
-        op_info = &interp->op_info_table[op];
         *format = '\0';
 
         /* info->op_count is args + 1
          * build instruction format
          * set LV_in / out flags */
-        if (n != op_info->op_count - 1)
+        if (n != op->op_count - 1)
             IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                     "arg count mismatch: op #%d '%s' needs %d given %d",
-                    op, fullname, op_info->op_count-1, n);
+                    op, fullname, op->op_count-1, n);
 
         /* XXX Speed up some by keep track of the end of format ourselves */
         for (i = 0; i < n; i++) {
-            switch (op_info->dirs[i]) {
+            switch (op->dirs[i]) {
               case PARROT_ARGDIR_INOUT:
                 dirs |= 1 << (16 + i);
                 /* go on */
@@ -422,7 +450,7 @@
         ins->keys  |= keyvec;
 
         /* fill in oplib's info */
-        ins->opnum  = op;
+        ins->op  = op;
         ins->opsize = n + 1;
 
         /* mark end as absolute branch */
@@ -443,8 +471,8 @@
 
         /* set up branch flags
          * mark registers that are labels */
-        for (i = 0; i < op_info->op_count - 1; i++) {
-            if (op_info->labels[i])
+        for (i = 0; i < op->op_count - 1; i++) {
+            if (op->labels[i])
                 ins->type |= ITBRANCH | (1 << i);
             else {
                 if (r[i]->type == VTADDRESS)
@@ -453,7 +481,7 @@
             }
         }
 
-        if (op_info->jump) {
+        if (op->jump) {
             ins->type |= ITBRANCH;
             /* TODO use opnum constants */
             if (STREQ(name, "branch")
@@ -791,7 +819,7 @@
     const char                *ext;
     FILE                      *fp;
     STRING                    *fs;
-    PMC                       *ignored;
+    PMC                       *newcontext;
 
     /* need at least 3 regs for compilation of constant math e.g.
      * add_i_ic_ic - see also IMCC_subst_constants() */
@@ -805,7 +833,8 @@
         IMCC_INFO(interp) = imc_info;
     }
 
-    fs = string_make(interp, fullname, strlen(fullname), NULL, 0);
+    fs = Parrot_str_new_init(interp, fullname, strlen(fullname),
+            Parrot_default_encoding_ptr, 0);
 
     if (Parrot_stat_info_intval(interp, fs, STAT_ISDIR))
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_EXTERNAL_ERROR,
@@ -816,9 +845,6 @@
         IMCC_fatal(interp, EXCEPTION_EXTERNAL_ERROR,
                 "imcc_compile_file: couldn't open '%s'\n", fullname);
 
-    IMCC_INFO(interp)->cur_namespace = NULL;
-    interp->code                     = NULL;
-
     IMCC_push_parser_state(interp);
     {
         /* Store a copy, in order to know how to free it later */
@@ -835,8 +861,13 @@
      * which can destroy packfiles under construction
      */
     Parrot_block_GC_mark(interp);
-    ignored = Parrot_push_context(interp, regs_used);
-    UNUSED(ignored);
+
+    /* Activate a new context and reset it to initial values */
+    newcontext = Parrot_push_context(interp, regs_used);
+    Parrot_pcc_set_HLL(interp, newcontext, 0);
+    Parrot_pcc_set_sub(interp, newcontext, 0);
+    IMCC_INFO(interp)->cur_namespace = NULL;
+    interp->code                     = NULL;
 
     if (ext && STREQ(ext, ".pasm")) {
         void *yyscanner;
@@ -962,8 +993,8 @@
 
 /*
 
-=item C<int try_find_op(PARROT_INTERP, IMC_Unit *unit, const char *name, SymReg
-**r, int n, int keyvec, int emit)>
+=item C<static op_info_t * try_find_op(PARROT_INTERP, IMC_Unit *unit, const char
+*name, SymReg **r, int n, int keyvec, int emit)>
 
 Try to find valid op doing the same operation e.g.
 
@@ -978,7 +1009,8 @@
 */
 
 PARROT_WARN_UNUSED_RESULT
-int
+PARROT_CAN_RETURN_NULL
+static op_info_t *
 try_find_op(PARROT_INTERP, ARGMOD(IMC_Unit *unit), ARGIN(const char *name),
         ARGMOD(SymReg **r), int n, int keyvec, int emit)
 {
@@ -1014,11 +1046,15 @@
     }
 
     if (changed) {
+        op_info_t *op;
         op_fullname(fullname, name, r, n, keyvec);
-        return interp->op_lib->op_code(interp, fullname, 1);
+        op = (op_info_t *)parrot_hash_get(interp, interp->op_hash, fullname);
+        if (op && !STREQ(op->full_name, fullname))
+            op = NULL;
+        return op;
     }
 
-    return -1;
+    return NULL;
 }
 
 /*

Modified: branches/gsoc_nci/compilers/imcc/pbc.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/pbc.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/pbc.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -9,6 +9,8 @@
 #include "parrot/pmc_freeze.h"
 #include "pmc/pmc_sub.h"
 #include "pmc/pmc_callcontext.h"
+#include "parrot/oplib/core_ops.h"
+#include "pmc/pmc_key.h"
 
 /* HEADERIZER HFILE: compilers/imcc/pbc.h */
 
@@ -56,14 +58,6 @@
         __attribute__nonnull__(2)
         FUNC_MODIFIES(*r);
 
-static int add_const_key(PARROT_INTERP,
-    ARGIN(const opcode_t *key),
-    int size,
-    ARGIN(const char *s_key))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2)
-        __attribute__nonnull__(4);
-
 PARROT_WARN_UNUSED_RESULT
 static int add_const_num(PARROT_INTERP, ARGIN_NULLOK(const char *buf))
         __attribute__nonnull__(1);
@@ -83,13 +77,6 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
-static int add_const_table(PARROT_INTERP)
-        __attribute__nonnull__(1);
-
-static int add_const_table_key(PARROT_INTERP, ARGIN(PMC *key))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2);
-
 static int add_const_table_pmc(PARROT_INTERP, ARGIN(PMC *pmc))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
@@ -212,10 +199,6 @@
 #define ASSERT_ARGS_add_1_const __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(r))
-#define ASSERT_ARGS_add_const_key __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(interp) \
-    , PARROT_ASSERT_ARG(key) \
-    , PARROT_ASSERT_ARG(s_key))
 #define ASSERT_ARGS_add_const_num __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
 #define ASSERT_ARGS_add_const_pmc_sub __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
@@ -224,11 +207,6 @@
 #define ASSERT_ARGS_add_const_str __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(s))
-#define ASSERT_ARGS_add_const_table __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_add_const_table_key __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(interp) \
-    , PARROT_ASSERT_ARG(key))
 #define ASSERT_ARGS_add_const_table_pmc __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(pmc))
@@ -337,46 +315,6 @@
 
 /*
 
-=item C<static int add_const_table(PARROT_INTERP)>
-
-Adds an empty item to constant table, returning its position.
-
-=cut
-
-*/
-
-static int
-add_const_table(PARROT_INTERP)
-{
-    ASSERT_ARGS(add_const_table)
-    const size_t oldcount = interp->code->const_table->const_count;
-    const size_t newcount = oldcount + 1;
-
-    /* Update the constant count and reallocate */
-    if (interp->code->const_table->constants) {
-        interp->code->const_table->constants =
-            mem_gc_realloc_n_typed_zeroed(interp, interp->code->const_table->constants,
-                newcount, oldcount, PackFile_Constant);
-    }
-    else {
-        /* initialize rlookup cache */
-        interp->code->const_table->string_hash =
-            Parrot_pmc_new_init_int(interp, enum_class_Hash, enum_type_INTVAL);
-        ((Hash *)VTABLE_get_pointer(interp, interp->code->const_table->string_hash))->compare =
-            (hash_comp_fn)STRING_compare_distinct_cs_enc;
-
-        interp->code->const_table->constants =
-            mem_gc_allocate_n_zeroed_typed(interp, newcount, PackFile_Constant);
-    }
-
-    interp->code->const_table->const_count         = newcount;
-
-    return oldcount;
-}
-
-
-/*
-
 =item C<static int add_const_table_pmc(PARROT_INTERP, PMC *pmc)>
 
 Adds a PMC to the const table, returning its position.
@@ -389,37 +327,20 @@
 add_const_table_pmc(PARROT_INTERP, ARGIN(PMC *pmc))
 {
     ASSERT_ARGS(add_const_table_pmc)
-    const int newitem = add_const_table(interp);
-    PackFile_Constant * const constant = &interp->code->const_table->constants[newitem];
-
-    constant->type  = PFC_PMC;
-    constant->u.key = pmc;
-
-    return newitem;
-}
-
-
-/*
-
-=item C<static int add_const_table_key(PARROT_INTERP, PMC *key)>
+    PackFile_ConstTable *ct = interp->code->const_table;
 
-Adds a key to the const table, returning its position.
-
-=cut
-
-*/
+    if (!ct->pmc.constants)
+        ct->pmc.constants =
+            mem_gc_allocate_n_zeroed_typed(interp, 1, PMC *);
+    else
+        ct->pmc.constants =
+            mem_gc_realloc_n_typed_zeroed(interp, ct->pmc.constants,
+                ct->pmc.const_count + 1, ct->pmc.const_count, PMC *);
 
-static int
-add_const_table_key(PARROT_INTERP, ARGIN(PMC *key))
-{
-    ASSERT_ARGS(add_const_table_key)
-    const int newitem = add_const_table(interp);
-    PackFile_Constant * const constant = &interp->code->const_table->constants[newitem];
 
-    constant->type  = PFC_KEY;
-    constant->u.key = key;
+    ct->pmc.constants[ct->pmc.const_count++] = pmc;
 
-    return newitem;
+    return ct->pmc.const_count - 1;
 }
 
 
@@ -642,6 +563,7 @@
     ASSERT_ARGS(get_code_size)
     Instruction *ins = unit->instructions;
     size_t       code_size;
+    op_lib_t    *core_ops = PARROT_GET_CORE_OPLIB(interp);
 
     /* run through instructions:
      * - sanity check
@@ -664,12 +586,12 @@
         }
         else if (ins->opname && *ins->opname) {
             (*src_lines)++;
-            if (ins->opnum < 0)
+            if (!ins->op)
                 IMCC_fatal(interp, 1, "get_code_size: "
                         "no opnum ins#%d %d\n",
                         ins->index, ins);
 
-            if (ins->opnum == PARROT_OP_set_p_pc) {
+            if (ins->op == &core_ops->op_info_table[PARROT_OP_set_p_pc]) {
                 /* set_p_pc opcode */
                 IMCC_debug(interp, DEBUG_PBC_FIXUP, "PMC constant %s\n",
                         ins->symregs[1]->name);
@@ -702,13 +624,12 @@
 
 static
 opcode_t
-bytecode_map_op(PARROT_INTERP, opcode_t op) {
-    int i;
-    op_info_t         *info    = &interp->op_info_table[op];
+bytecode_map_op(PARROT_INTERP, op_info_t *info) {
     op_lib_t          *lib     = info->lib;
-    op_func_t         op_func  = interp->op_func_table[op];
+    op_func_t         op_func  = OP_INFO_OPFUNC(info);
     PackFile_ByteCode *bc      = interp->code;
     PackFile_ByteCode_OpMappingEntry *om;
+    opcode_t i;
 
     for (i = 0; i < bc->op_mapping.n_libs; i++) {
         if (lib == bc->op_mapping.libs[i].lib) {
@@ -739,11 +660,11 @@
     /* op not yet mapped */
     bc->op_count++;
     bc->op_func_table =
-        mem_gc_realloc_n_typed_zeroed(interp, bc->op_func_table, bc->op_count, bc->op_count,
+        mem_gc_realloc_n_typed_zeroed(interp, bc->op_func_table, bc->op_count, bc->op_count - 1,
                                         op_func_t);
     bc->op_func_table[bc->op_count - 1] = op_func;
     bc->op_info_table =
-        mem_gc_realloc_n_typed_zeroed(interp, bc->op_info_table, bc->op_count, bc->op_count,
+        mem_gc_realloc_n_typed_zeroed(interp, bc->op_info_table, bc->op_count, bc->op_count - 1,
                                         op_info_t *);
     bc->op_info_table[bc->op_count - 1] = info;
 
@@ -857,6 +778,7 @@
     ASSERT_ARGS(fixup_globals)
     subs_t *s;
     int     jumppc = 0;
+    op_lib_t *core_ops = PARROT_GET_CORE_OPLIB(interp);
 
     for (s = IMCC_INFO(interp)->globals->cs->first; s; s = s->next) {
         const SymHash * const hsh = &s->fixup;
@@ -912,7 +834,7 @@
                     SymReg * const nam = mk_const(interp, fixup->name,
                             fixup->type & VT_ENCODED ? 'U' : 'S');
 
-                    const int op = interp->op_lib->op_code(interp, "find_sub_not_null_p_sc", 1);
+                    op_info_t *op = &core_ops->op_info_table[PARROT_OP_find_sub_not_null_p_sc];
                     PARROT_ASSERT(op);
 
                     interp->code->base.data[addr] = bytecode_map_op(interp, op);
@@ -973,9 +895,8 @@
          * get first part as charset, rest as string
          */
         STRING     *s;
-        const CHARSET *s_charset;
-        const ENCODING *s_encoding = NULL;
-        const ENCODING *src_encoding;
+        const STR_VTABLE *s_encoding;
+        const STR_VTABLE *src_encoding;
         #define MAX_NAME 31
         char charset_name[MAX_NAME + 1];
         char encoding_name[MAX_NAME + 1];
@@ -983,38 +904,38 @@
         char * p2 = strchr(r->name, ':');
         PARROT_ASSERT(p && p[-1] == ':');
         if (p2 < p -1) {
+            /* Handle the old 'encoding:charset' format by trying
+             * encoding as well as charset */
             strncpy(encoding_name, buf, p2 - buf);
             encoding_name[p2-buf] = '\0';
             strncpy(charset_name, p2 +1, p - p2 - 2);
             charset_name[p- p2 - 2] = '\0';
             /*fprintf(stderr, "%s:%s\n", charset_name, encoding_name);*/
-            s_charset = Parrot_find_charset(interp, charset_name);
-            if (s_charset == NULL)
-                Parrot_ex_throw_from_c_args(interp, NULL,
-                        EXCEPTION_INVALID_STRING_REPRESENTATION,
-                        "Unknown charset '%s'", charset_name);
             s_encoding = Parrot_find_encoding(interp, encoding_name);
-            if (s_encoding == NULL)
-                Parrot_ex_throw_from_c_args(interp, NULL,
-                        EXCEPTION_INVALID_STRING_REPRESENTATION,
-                        "Unknown encoding '%s'", encoding_name);
+            if (s_encoding == NULL) {
+                s_encoding = Parrot_find_encoding(interp, charset_name);
+                if (s_encoding == NULL)
+                    Parrot_ex_throw_from_c_args(interp, NULL,
+                            EXCEPTION_INVALID_STRING_REPRESENTATION,
+                            "Unknown encoding '%s:%s'",
+                            encoding_name, charset_name);
+            }
         }
         else {
-            strncpy(charset_name, buf, p - buf - 1);
-            charset_name[p - buf - 1] = '\0';
-            /*fprintf(stderr, "%s\n", charset_name);*/
-            s_charset = Parrot_find_charset(interp, charset_name);
-            if (s_charset == NULL)
+            strncpy(encoding_name, buf, p - buf - 1);
+            encoding_name[p - buf - 1] = '\0';
+            charset_name[0] = '\0';
+            /*fprintf(stderr, "%s\n", encoding_name);*/
+            s_encoding = Parrot_find_encoding(interp, encoding_name);
+            if (s_encoding == NULL)
                 Parrot_ex_throw_from_c_args(interp, NULL,
                         EXCEPTION_INVALID_STRING_REPRESENTATION,
-                        "Unknown charset '%s'", charset_name);
+                        "Unknown encoding '%s'", encoding_name);
         }
-        if (strcmp(charset_name, "unicode") == 0)
-            src_encoding = Parrot_utf8_encoding_ptr;
+        if (s_encoding->max_bytes_per_codepoint == 1)
+            src_encoding = Parrot_ascii_encoding_ptr;
         else
-            src_encoding = Parrot_fixed_8_encoding_ptr;
-        if (s_encoding == NULL)
-            s_encoding = src_encoding;
+            src_encoding = Parrot_utf8_encoding_ptr;
 
         /* past delim */
         buf     = p + 1;
@@ -1032,10 +953,10 @@
             }
             {
                 STRING * aux = Parrot_str_new_init(interp, buf, p - buf,
-                        src_encoding, s_charset, 0);
+                        src_encoding, 0);
                 s = Parrot_str_unescape_string(interp, aux,
-                        s_charset, s_encoding, PObj_constant_FLAG);
-                if (!CHARSET_VALIDATE(interp, s))
+                        s_encoding, PObj_constant_FLAG);
+                if (!STRING_validate(interp, s))
                        Parrot_ex_throw_from_c_args(interp, NULL,
                                EXCEPTION_INVALID_STRING_REPRESENTATION,
                                "Malformed string");
@@ -1049,12 +970,13 @@
     }
     else if (*buf == '\'') {   /* TODO handle python raw strings */
         buf++;
-        return string_make(interp, buf, strlen(buf) - 1, "ascii",
-                PObj_constant_FLAG);
+        return Parrot_str_new_init(interp, buf, strlen(buf) - 1,
+                Parrot_ascii_encoding_ptr, PObj_constant_FLAG);
     }
 
     /* unquoted bare name - ASCII only don't unescape it */
-    return string_make(interp, buf, strlen(buf), "ascii", PObj_constant_FLAG);
+    return Parrot_str_new_init(interp, buf, strlen(buf),
+            Parrot_ascii_encoding_ptr, PObj_constant_FLAG);
 }
 
 /*
@@ -1102,7 +1024,8 @@
     }
     else if (*buf == '\'') {
         buf++;
-        return string_make(interp, buf, strlen(buf) - 1, "ascii", PObj_constant_FLAG);
+        return Parrot_str_new_init(interp, buf, strlen(buf) - 1,
+                Parrot_ascii_encoding_ptr, PObj_constant_FLAG);
     }
     else {
         IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR, "Unknown STRING format: '%s'\n", buf);
@@ -1126,9 +1049,8 @@
 {
     ASSERT_ARGS(add_const_str)
 
-    PMC *s_pmc = key_new_string(interp, s);
-    PackFile_ConstTable *table = interp->code->const_table;
-    int i = PackFile_ConstTable_rlookup(interp, table, s_pmc, PFC_STRING);
+    PackFile_ConstTable *ct = interp->code->const_table;
+    int i = PackFile_ConstTable_rlookup_str(interp, ct, s);
 
     if (i >= 0)
         return i;
@@ -1136,14 +1058,27 @@
 
     /* otherwise... */
     {
-        int                k        = add_const_table(interp);
-        PackFile_Constant *constant = &table->constants[k];
-        constant->type              = PFC_STRING;
-        constant->u.string          = s;
+        if (!ct->str.constants)
+            ct->str.constants =
+                mem_gc_allocate_n_zeroed_typed(interp, 1, STRING *);
 
-        VTABLE_set_integer_keyed_str(interp, table->string_hash, s, k);
+        else
+            ct->str.constants =
+                mem_gc_realloc_n_typed_zeroed(interp, ct->str.constants,
+                    ct->str.const_count + 1, ct->str.const_count, STRING *);
 
-        return k;
+        /* initialize rlookup cache */
+        if (!ct->string_hash)
+            ct->string_hash = parrot_create_hash(interp,
+                    enum_type_INTVAL,
+                    Hash_key_type_STRING_enc);
+
+        ct->str.constants[ct->str.const_count] = s;
+
+        parrot_hash_put(interp, ct->string_hash, s,
+            (void *)ct->str.const_count);
+
+        return ct->str.const_count++;
     }
 }
 
@@ -1163,15 +1098,20 @@
 add_const_num(PARROT_INTERP, ARGIN_NULLOK(const char *buf))
 {
     ASSERT_ARGS(add_const_num)
-    const int      k = add_const_table(interp);
-    STRING * const s = Parrot_str_new(interp, buf, 0);
+    PackFile_ConstTable *ct = interp->code->const_table;
+    STRING * const s        = Parrot_str_new(interp, buf, 0);
 
-    PackFile_Constant * const constant = &interp->code->const_table->constants[k];
+    if (!ct->num.constants)
+        ct->num.constants =
+            mem_gc_allocate_n_zeroed_typed(interp, 1, FLOATVAL);
+    else
+        ct->num.constants =
+            mem_gc_realloc_n_typed_zeroed(interp, ct->num.constants,
+                ct->num.const_count + 1, ct->num.const_count, FLOATVAL);
 
-    constant->type     = PFC_NUMBER;
-    constant->u.number = Parrot_str_to_num(interp, s);
+    ct->num.constants[ct->num.const_count] = Parrot_str_to_num(interp, s);
 
-    return k;
+    return ct->num.const_count++;
 }
 
 
@@ -1211,7 +1151,7 @@
         r = pcc_sub->multi[i];
 
         if (r->set == 'S') {
-            STRING * const type_name = ct->constants[r->color].u.string;
+            STRING * const type_name = ct->str.constants[r->color];
             const INTVAL type_num    = Parrot_pmc_get_type_str(interp, type_name);
 
             if (type_num == enum_type_undef) {
@@ -1224,7 +1164,7 @@
         }
         else {
             PARROT_ASSERT(r->set == 'K');
-            sig_pmc = ct->constants[r->color].u.key;
+            sig_pmc = ct->pmc.constants[r->color];
         }
 
         VTABLE_set_pmc_keyed_int(interp, multi_sig, i, sig_pmc);
@@ -1255,10 +1195,10 @@
                int need_lex)
 {
     ASSERT_ARGS(create_lexinfo)
-    PMC               *lex_info    = NULL;
-    SymHash           *hsh         = &unit->hash;
-    PackFile_Constant *constants   = interp->code->const_table->constants;
-    const INTVAL       lex_info_id = Parrot_get_ctx_HLL_type(interp,
+    PMC                 *lex_info    = NULL;
+    SymHash             *hsh         = &unit->hash;
+    PackFile_ConstTable *ct          = interp->code->const_table;
+    const INTVAL         lex_info_id = Parrot_get_ctx_HLL_type(interp,
                                         enum_class_LexInfo);
     unsigned int        i;
 
@@ -1283,7 +1223,7 @@
                     Parrot_Sub_attributes *sub;
                     PARROT_ASSERT(k >= 0);
 
-                    lex_name = constants[k].u.string;
+                    lex_name = ct->str.constants[k];
                     PARROT_ASSERT(PObj_is_string_TEST(lex_name));
 
                     PMC_get_sub(interp, sub_pmc, sub);
@@ -1305,7 +1245,7 @@
         }
     }
 
-    if (!lex_info && (unit->outer || need_lex)) {
+    if (!lex_info && need_lex) {
         lex_info = Parrot_pmc_new_noinit(interp, lex_info_id);
         VTABLE_init_pmc(interp, lex_info, sub_pmc);
     }
@@ -1410,9 +1350,9 @@
 
     int                  i;
     int                  ns_const = -1;
+    SymReg     * const ns = unit->_namespace ? unit->_namespace->reg : NULL;
 
     if (unit->_namespace) {
-        SymReg     * const ns = unit->_namespace->reg;
 
         /* strip namespace off from front */
         static const char ns_sep[]  = "@@@";
@@ -1478,7 +1418,7 @@
     Sub_comp_get_FLAGS(sub) |= (r->pcc_sub->pragma & SUB_COMP_FLAG_MASK);
 
     r->color  = add_const_str(interp, IMCC_string_from_reg(interp, r));
-    sub->name = ct->constants[r->color].u.string;
+    sub->name = ct->str.constants[r->color];
 
     /* If the unit has no subid, set the subid to match the name. */
     if (!unit->subid)
@@ -1495,18 +1435,21 @@
             IMCC_string_from_reg(interp, unit->subid));
     }
 
-    sub->subid = ct->constants[unit->subid->color].u.string;
+    sub->subid = ct->str.constants[unit->subid->color];
     ns_pmc     = NULL;
 
-    if (ns_const >= 0 && ns_const < ct->const_count) {
-        switch (ct->constants[ns_const].type) {
-          case PFC_KEY:
-            ns_pmc = ct->constants[ns_const].u.key;
+    if (ns) {
+        switch (ns->set) {
+          case 'K':
+            if (ns_const >= 0 && ns_const < ct->pmc.const_count)
+                ns_pmc = ct->pmc.constants[ns_const];
             break;
-          case PFC_STRING:
-            ns_pmc = Parrot_pmc_new_constant(interp, enum_class_String);
-            VTABLE_set_string_native(interp, ns_pmc,
-                ct->constants[ns_const].u.string);
+          case 'S':
+            if (ns_const >= 0 && ns_const < ct->str.const_count) {
+                ns_pmc = Parrot_pmc_new_constant(interp, enum_class_String);
+                VTABLE_set_string_native(interp, ns_pmc,
+                    ct->str.constants[ns_const]);
+            }
             break;
           default:
             break;
@@ -1599,11 +1542,7 @@
 
     /* store the sub */
     {
-        const int                   k = add_const_table(interp);
-        PackFile_Constant * const pfc = &ct->constants[k];
-
-        pfc->type     = PFC_PMC;
-        pfc->u.key    = sub_pmc;
+        const int k = add_const_table_pmc(interp, sub_pmc);
         unit->sub_pmc = sub_pmc;
 
         IMCC_INFO(interp)->globals->cs->subs->pmc_const = k;
@@ -1623,12 +1562,6 @@
                                    : Parrot_str_new(interp, "*none*", 0));
         }
 
-        /*
-         * create entry in our fixup (=symbol) table
-         * the offset is the index in the constant table of this Sub
-         */
-        PackFile_FixupTable_new_entry(interp, r->name, enum_fixup_sub, k);
-
         return k;
     }
 }
@@ -1636,56 +1569,6 @@
 
 /*
 
-=item C<static int add_const_key(PARROT_INTERP, const opcode_t *key, int size,
-const char *s_key)>
-
-Adds a constant key to constant_table.
-
-=cut
-
-*/
-
-static int
-add_const_key(PARROT_INTERP, ARGIN(const opcode_t *key), int size, ARGIN(const char *s_key))
-{
-    ASSERT_ARGS(add_const_key)
-    const SymReg * const r =
-        _get_sym(&IMCC_INFO(interp)->globals->cs->key_consts, s_key);
-    const opcode_t      *rc;
-    PackFile_Constant   *pfc;
-    int                  k;
-
-    if (r)
-        return r->color;
-
-    pfc = mem_gc_allocate_typed(interp, PackFile_Constant);
-    rc  = PackFile_Constant_unpack_key(interp,
-            interp->code->const_table, pfc, key);
-
-    if (!rc) {
-        mem_sys_free(pfc);
-        IMCC_fatal(interp, 1,
-            "add_const_key: PackFile_Constant error\n");
-    }
-
-    k = add_const_table_key(interp, pfc->u.key);
-
-    store_key_const(interp, s_key, k);
-
-    IMCC_debug(interp, DEBUG_PBC_CONST, "\t=> %s #%d size %d\n",
-               s_key, k, size);
-
-    IMCC_debug(interp, DEBUG_PBC_CONST, "\t %x /%x %x/ /%x %x/\n",
-               key[0], key[1], key[2], key[3], key[4]);
-
-    mem_sys_free(pfc);
-
-    return k;
-}
-
-
-/*
-
 =item C<static opcode_t build_key(PARROT_INTERP, SymReg *key_reg)>
 
 Builds a Key PMC from the given SymReg.
@@ -1702,30 +1585,23 @@
 build_key(PARROT_INTERP, ARGIN(SymReg *key_reg))
 {
     ASSERT_ARGS(build_key)
-#define MAX_KEY_LEN 10
-#define MAX_KEYNAME_LEN 20
-    SymReg   *reg = key_reg->set == 'K' ? key_reg->nextkey : key_reg;
-
-    char      s_key[MAX_KEY_LEN * MAX_KEYNAME_LEN];
-    opcode_t  key[MAX_KEY_LEN * 2 + 1];
-    opcode_t  size;
-    int       key_length = 0;     /* P0["hi;there"; S0; 2] has length 3 */
-    int       k;
-
-    /* 0 is length */
-    opcode_t *pc = key + 1;
 
-    /* stringified key */
-    char     *s  = s_key;
+    PackFile_ConstTable *ct = interp->code->const_table;
+    SymReg *reg  = key_reg->set == 'K' ? key_reg->nextkey : key_reg;
+    PMC    *head = NULL;
+    PMC    *tail = NULL;
+    opcode_t regno, k;
 
-    *s           = 0;
-
-    for (key_length = 0; reg ; reg = reg->nextkey, key_length++) {
+    for (; reg; reg = reg->nextkey) {
         SymReg *r = reg;
 
-        if (key_length >= MAX_KEY_LEN)
-            IMCC_fatal(interp, 1, "build_key:"
-                    "Key too long, increase MAX_KEY_LEN.\n");
+        if (tail) {
+            SETATTR_Key_next_key(interp, tail, Parrot_pmc_new_constant(interp, enum_class_Key));
+            GETATTR_Key_next_key(interp, tail, tail);
+        }
+        else {
+            head = tail = Parrot_pmc_new_constant(interp, enum_class_Key);
+        }
 
         switch (r->type) {
           case VTIDENTIFIER:       /* P[S0] */
@@ -1736,21 +1612,16 @@
             if (r->reg)
                 r = r->reg;
 
+            /* don't emit mapped regs in key parts */
+            regno = r->color >= 0 ? r->color : -1 - r->color;
+
             if (r->set == 'I')
-                *pc++ = PARROT_ARG_I;    /* register type */
+                key_set_register(interp, tail, regno, KEY_integer_FLAG);
             else if (r->set == 'S')
-                *pc++ = PARROT_ARG_S;
+                key_set_register(interp, tail, regno, KEY_string_FLAG);
             else
                 IMCC_fatal(interp, 1, "build_key: wrong register set\n");
 
-            /* don't emit mapped regs in key parts */
-            if (r->color < 0)
-                *pc++ = -1 - r->color;
-            else
-                *pc++ = r->color;
-
-            sprintf(s+strlen(s), "%c%d", r->set, (int)r->color);
-
             IMCC_debug(interp, DEBUG_PBC_CONST,
                     " keypart reg %s %c%d\n",
                     r->name, r->set, (int)r->color);
@@ -1763,30 +1634,15 @@
             switch (r->set) {
               case 'S':                       /* P["key"] */
                 /* str constant */
-                *pc++ = PARROT_ARG_SC;
-
-                /* constant idx */
-                *pc++ = r->color;
-
-                IMCC_debug(interp, DEBUG_PBC_CONST,
-                        " keypart SC %s #%d\n",
-                        r->name, r->color);
+                key_set_string(interp, tail, ct->str.constants[r->color]);
                 break;
               case 'I':                       /* P[;42;..] */
                 /* int constant */
-                *pc++ = PARROT_ARG_IC;
-
-                /* value */
-                *pc++ = r->color = atol(r->name);
-
-                IMCC_debug(interp, DEBUG_PBC_CONST,
-                        " keypart IC %s #%d\n",
-                        r->name, r->color);
+                key_set_integer(interp, tail, atol(r->name));
                 break;
               default:
                 IMCC_fatal(interp, 1, "build_key: unknown set\n");
             }
-            sprintf(s+strlen(s), "%cc" INTVAL_FMT, r->set, r->color);
             break;
           default:
             IMCC_fatal(interp, 1, "build_key: "
@@ -1794,13 +1650,21 @@
         }
     }
 
-    key[0] = key_length;
-    size   = pc - key;
+    {
+        STRING *name      = key_set_to_string(interp, head);
+        const char *cname = Parrot_str_to_cstring(interp, name);
+        SymReg * const r  = _get_sym(&IMCC_INFO(interp)->globals->cs->key_consts, cname);
 
-    /* now we have a packed key, which packfile can work on */
-    /* XXX endianess? probably no, we pack/unpack on the very
-     * same computer */
-    k      = add_const_key(interp, key, size, s_key);
+        if (r) {
+            k = r->color;
+        }
+        else {
+            k = add_const_table_pmc(interp, head);
+            store_key_const(interp, cname, k);
+        }
+
+        Parrot_str_free_cstring((char *)cname);
+    }
 
     /* single 'S' keys already have their color assigned */
     if (key_reg->set == 'K')
@@ -1882,7 +1746,7 @@
     char   *src, *chr, *start;
     int     base;
 
-    if (s->encoding != Parrot_fixed_8_encoding_ptr)
+    if (STRING_max_bytes_per_codepoint(s) != 1)
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_ENCODING,
             "unhandled string encoding in FixedIntegerArray initialization");
 
@@ -2225,10 +2089,11 @@
 {
     ASSERT_ARGS(verify_signature)
     PMC    *changed_sig    = NULL;
-    PMC    * const sig_arr = interp->code->const_table->constants[pc[-1]].u.key;
+    PMC    * const sig_arr = interp->code->const_table->pmc.constants[pc[-1]];
+    op_lib_t *core_ops = PARROT_GET_CORE_OPLIB(interp);
     int     needed         = 0;
-    int     no_consts      = (ins->opnum == PARROT_OP_get_results_pc
-                           || ins->opnum == PARROT_OP_get_params_pc);
+    int     no_consts      = (ins->op == &core_ops->op_info_table[PARROT_OP_get_results_pc]
+                           || ins->op == &core_ops->op_info_table[PARROT_OP_get_params_pc]);
 
     INTVAL  i, n;
 
@@ -2304,7 +2169,8 @@
 {
     ASSERT_ARGS(e_pbc_emit)
     int        ok = 0;
-    int        op, i;
+    int        i;
+    op_lib_t *core_ops = PARROT_GET_CORE_OPLIB(interp);
 
     /* first instruction, do initialisation ... */
     if (ins == unit->instructions) {
@@ -2376,7 +2242,7 @@
                     &interp->initial_pf->directory;
             interp->code->annotations = (PackFile_Annotations *)
                     PackFile_Segment_new_seg(interp, dir,
-                        PF_ANNOTATIONS_SEG, name, add);
+                        PF_ANNOTATIONS_SEG, name, 1);
             interp->code->annotations->code = interp->code;
 
             /* Create initial group. */
@@ -2428,16 +2294,14 @@
             IMCC_INFO(interp)->debug_seg->base.data[IMCC_INFO(interp)->ins_line++] =
                 (opcode_t)ins->line;
 
-        op = (opcode_t)ins->opnum;
-
         /* Get the info for that opcode */
-        op_info = &interp->op_info_table[op];
+        op_info = ins->op;
 
         IMCC_debug(interp, DEBUG_PBC, "%d %s", IMCC_INFO(interp)->npc,
             op_info->full_name);
 
         /* Start generating the bytecode */
-        *(IMCC_INFO(interp)->pc)++ = bytecode_map_op(interp, op);
+        *(IMCC_INFO(interp)->pc)++ = bytecode_map_op(interp, op_info);
 
         for (i = 0; i < op_info->op_count-1; i++) {
             switch (op_info->types[i]) {
@@ -2489,10 +2353,10 @@
                 break;
             }
         }
-        if (ins->opnum == PARROT_OP_set_args_pc
-        ||  ins->opnum == PARROT_OP_get_results_pc
-        ||  ins->opnum == PARROT_OP_get_params_pc
-        ||  ins->opnum == PARROT_OP_set_returns_pc) {
+        if (ins->op == &core_ops->op_info_table[PARROT_OP_set_args_pc]
+        ||  ins->op == &core_ops->op_info_table[PARROT_OP_get_results_pc]
+        ||  ins->op == &core_ops->op_info_table[PARROT_OP_get_params_pc]
+        ||  ins->op == &core_ops->op_info_table[PARROT_OP_set_returns_pc]) {
 
             /* TODO get rid of verify_signature - PIR call sigs are already
              * fixed, but PASM still needs it */

Modified: branches/gsoc_nci/compilers/imcc/pcc.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/pcc.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/pcc.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -29,6 +29,7 @@
 #include <string.h>
 #include "imc.h"
 #include "parser.h"
+#include "parrot/oplib/core_ops.h"
 
 /* HEADERIZER HFILE: compilers/imcc/imc.h */
 
@@ -353,7 +354,8 @@
         bufpos--;
     memcpy(buf+bufpos, subf, lensubf);
 
-    regs[0] = mk_const(interp, buf, 'S');
+    regs[0] = mk_const(interp, buf, 'P');
+    regs[0]->pmc_type = enum_class_FixedIntegerArray;
     ins     = insINS(interp, unit, ins, op_name, regs, n + 1);
 
     if (n >= PCC_GET_ARGS_LIMIT) {
@@ -675,6 +677,7 @@
     SymReg *regs[2];
     Instruction *get_params, *tmp_ins, *unused_ins;
     char *buf;
+    op_lib_t *core_ops = PARROT_GET_CORE_OPLIB(interp);
 
     if (!(unit->instructions->type & ITLABEL))
         return 0;
@@ -696,7 +699,7 @@
 
     get_params = unit->instructions->next;
 
-    if (get_params->opnum != PARROT_OP_get_params_pc)
+    if (get_params->op != &core_ops->op_info_table[PARROT_OP_get_params_pc])
         return 0;
 
     buf = (char *)malloc(strlen(this_sub->name) + 3);
@@ -749,7 +752,13 @@
         ins     = insINS(interp, unit, ins, "tailcall", regs, 1);
     }
 
+    /* don't leak this sub SymReg; it gets detached here */
+    if (regs[0]->pcc_sub)
+        free_pcc_sub(regs[0]->pcc_sub);
+
+    /* this register is always the symbol "self", global to this IMC_Unit */
     regs[0]->pcc_sub  = sub->pcc_sub;
+
     sub->pcc_sub      = NULL;
     ins->type        |= ITPCCSUB;
 }

Modified: branches/gsoc_nci/compilers/imcc/reg_alloc.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/reg_alloc.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/reg_alloc.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -167,8 +167,6 @@
                 (OPT_PRE|OPT_CFG|OPT_PASM)) && unit->pasm_file)
         goto done;
 
-    IMCC_INFO(interp)->allocated = 0;
-
     if (unit->instructions->symreg_count)
       function = unit->instructions->symregs[0]->name;
     else

Modified: branches/gsoc_nci/compilers/imcc/sets.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/sets.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/sets.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -154,6 +154,7 @@
 
 */
 
+PARROT_PURE_FUNCTION
 int
 set_equal(ARGIN(const Set *s1), ARGIN(const Set *s2))
 {

Modified: branches/gsoc_nci/compilers/imcc/sets.h
==============================================================================
--- branches/gsoc_nci/compilers/imcc/sets.h	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/sets.h	Tue Sep 28 17:16:52 2010	(r49366)
@@ -33,6 +33,7 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
+PARROT_PURE_FUNCTION
 int set_equal(ARGIN(const Set *s1), ARGIN(const Set *s2))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);

Modified: branches/gsoc_nci/compilers/imcc/symreg.c
==============================================================================
--- branches/gsoc_nci/compilers/imcc/symreg.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/symreg.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -634,7 +634,7 @@
 
 /*
 
-=item C<SymReg * mk_ident(PARROT_INTERP, const char *name, int t)>
+=item C<SymReg * mk_ident(PARROT_INTERP, const char *name, int t, INTVAL type)>
 
 Makes a new identifier.
 
@@ -645,18 +645,17 @@
 PARROT_CANNOT_RETURN_NULL
 PARROT_IGNORABLE_RESULT
 SymReg *
-mk_ident(PARROT_INTERP, ARGIN(const char *name), int t)
+mk_ident(PARROT_INTERP, ARGIN(const char *name), int t, INTVAL type)
 {
     ASSERT_ARGS(mk_ident)
     char   * const fullname = _mk_fullname(interp, IMCC_INFO(interp)->namespace_stack, name);
     SymReg *r = get_sym_by_name(&(IMCC_INFO(interp)->cur_unit->hash), name);
-    if (r && r->set != t)
+    if (r && (r->set != t || r->type != type))
         IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
                 "syntax error, duplicated IDENTIFIER '%s'\n", fullname);
 
     r = mk_symreg(interp, fullname, t);
-    r->type = VTIDENTIFIER;
-
+    r->type = type;
 
     if (IMCC_INFO(interp)->namespace_stack) {
         Identifier * const ident = mem_gc_allocate_zeroed_typed(interp, Identifier);
@@ -768,16 +767,17 @@
                     "global PMC constant not allowed");
 
         r = _mk_symreg(interp, &IMCC_INFO(interp)->ghash, name, t);
+
+        r->type = VT_CONSTP;
     }
     else {
-        r = mk_ident(interp, name, t);
+        r = mk_ident(interp, name, t, VT_CONSTP);
 
         if (t == 'P')
             return mk_pmc_const_2(interp, IMCC_INFO(interp)->cur_unit, r, val);
     }
 
-    r->type = VT_CONSTP;
-    r->reg  = val;
+    r->reg = val;
 
     return r;
 }
@@ -859,11 +859,14 @@
     }
 
     errno = 0;
+
     if (base == 10) {
-        (void)strtol(digits, NULL, base);
+        long int unused = strtol(digits, NULL, base);
+        UNUSED(unused);
     }
     else {
-        (void)strtoul(digits + 2, NULL, base);
+        unsigned long int unused = strtoul(digits + 2, NULL, base);
+        UNUSED(unused);
     }
 
     return errno ? 1 : 0;
@@ -1256,6 +1259,30 @@
 
 /*
 
+=item C<void free_pcc_sub(pcc_sub_t *sub)>
+
+Frees all memory of the given pcc_sub_t.
+
+=cut
+
+*/
+
+void
+free_pcc_sub(ARGMOD(pcc_sub_t *sub))
+{
+    ASSERT_ARGS(free_pcc_sub)
+
+    mem_sys_free(sub->multi);
+    mem_sys_free(sub->args);
+    mem_sys_free(sub->arg_flags);
+    mem_sys_free(sub->ret);
+    mem_sys_free(sub->ret_flags);
+    mem_sys_free(sub);
+}
+
+
+/*
+
 =item C<void free_sym(SymReg *r)>
 
 Frees all memory of the specified SymReg.  If it has a pcc_sub_t entry, frees
@@ -1271,14 +1298,8 @@
     ASSERT_ARGS(free_sym)
     pcc_sub_t * const sub = r->pcc_sub;
 
-    if (sub) {
-        mem_sys_free(sub->multi);
-        mem_sys_free(sub->args);
-        mem_sys_free(sub->arg_flags);
-        mem_sys_free(sub->ret);
-        mem_sys_free(sub->ret_flags);
-        mem_sys_free(sub);
-    }
+    if (sub)
+        free_pcc_sub(sub);
 
     if (r->set == 'K') {
         SymReg *key     = r->nextkey;

Modified: branches/gsoc_nci/compilers/imcc/symreg.h
==============================================================================
--- branches/gsoc_nci/compilers/imcc/symreg.h	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/imcc/symreg.h	Tue Sep 28 17:16:52 2010	(r49366)
@@ -84,6 +84,45 @@
     Identifier *idents;
 };
 
+typedef enum {
+    P_NONE           = 0x00,                  /* 0<<0 */
+    P_NEED_LEX       = 0x01,                  /* 1<<0 */
+    P_VTABLE         = SUB_COMP_FLAG_VTABLE,  /* 1<<1 0x2 */
+    P_METHOD         = SUB_COMP_FLAG_METHOD,  /* 1<<2 0x4 */
+    P_ANON           = SUB_FLAG_PF_ANON,      /* 1<<3 0x8    - private3 */
+    P_MAIN           = SUB_FLAG_PF_MAIN,      /* 1<<4 0x10   - private4 */
+    P_LOAD           = SUB_FLAG_PF_LOAD,      /* 1<<5 0x20   - private5 */
+    P_IMMEDIATE      = SUB_FLAG_PF_IMMEDIATE, /* 1<<6 0x40   - private6 */
+    P_POSTCOMP       = SUB_FLAG_PF_POSTCOMP,  /* 1<<7 0x80   - private7 */
+    P_INIT           = SUB_COMP_FLAG_PF_INIT, /* 1<<10 0x400 - 10       */
+    P_NSENTRY        = SUB_COMP_FLAG_NSENTRY  /* 1<<11 0x800 - 11       */
+} pragma_enum_t;
+
+typedef struct pcc_sub_t {
+    SymReg *sub;
+    SymReg *cc;
+    SymReg **args;
+    SymReg **multi;
+    SymReg **ret;
+    SymReg *object;
+    int    *arg_flags;    /* :slurpy, :optional, ... */
+    int    *ret_flags;    /* :slurpy, :optional, ... */
+    int     nargs;
+    int     nret;
+    int     nmulti;
+    int     yield;
+    int     tailcall;
+    int     label;
+    INTVAL  pragma;
+} pcc_sub_t;
+
+enum uniq_t {
+    U_add_once,
+    U_add_uniq_label,
+    U_add_uniq_sub,
+    U_add_all
+};
+
 /* functions */
 
 /* HEADERIZER BEGIN: compilers/imcc/symreg.c */
@@ -195,6 +234,10 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
+void free_pcc_sub(ARGMOD(pcc_sub_t *sub))
+        __attribute__nonnull__(1)
+        FUNC_MODIFIES(*sub);
+
 void free_sym(ARGMOD(SymReg *r))
         __attribute__nonnull__(1)
         FUNC_MODIFIES(*r);
@@ -239,7 +282,10 @@
 
 PARROT_CANNOT_RETURN_NULL
 PARROT_IGNORABLE_RESULT
-SymReg * mk_ident(PARROT_INTERP, ARGIN(const char *name), int t)
+SymReg * mk_ident(PARROT_INTERP,
+    ARGIN(const char *name),
+    int t,
+    INTVAL type)
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
@@ -362,6 +408,8 @@
 #define ASSERT_ARGS_find_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(name))
+#define ASSERT_ARGS_free_pcc_sub __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+       PARROT_ASSERT_ARG(sub))
 #define ASSERT_ARGS_free_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(r))
 #define ASSERT_ARGS_get_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
@@ -419,45 +467,6 @@
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 /* HEADERIZER END: compilers/imcc/symreg.c */
 
-typedef enum {
-    P_NONE           = 0x00,                  /* 0<<0 */
-    P_NEED_LEX       = 0x01,                  /* 1<<0 */
-    P_VTABLE         = SUB_COMP_FLAG_VTABLE,  /* 1<<1 0x2 */
-    P_METHOD         = SUB_COMP_FLAG_METHOD,  /* 1<<2 0x4 */
-    P_ANON           = SUB_FLAG_PF_ANON,      /* 1<<3 0x8    - private3 */
-    P_MAIN           = SUB_FLAG_PF_MAIN,      /* 1<<4 0x10   - private4 */
-    P_LOAD           = SUB_FLAG_PF_LOAD,      /* 1<<5 0x20   - private5 */
-    P_IMMEDIATE      = SUB_FLAG_PF_IMMEDIATE, /* 1<<6 0x40   - private6 */
-    P_POSTCOMP       = SUB_FLAG_PF_POSTCOMP,  /* 1<<7 0x80   - private7 */
-    P_INIT           = SUB_COMP_FLAG_PF_INIT, /* 1<<10 0x400 - 10       */
-    P_NSENTRY        = SUB_COMP_FLAG_NSENTRY  /* 1<<11 0x800 - 11       */
-} pragma_enum_t;
-
-typedef struct pcc_sub_t {
-    SymReg *sub;
-    SymReg *cc;
-    SymReg **args;
-    SymReg **multi;
-    SymReg **ret;
-    SymReg *object;
-    int    *arg_flags;    /* :slurpy, :optional, ... */
-    int    *ret_flags;    /* :slurpy, :optional, ... */
-    int     nargs;
-    int     nret;
-    int     nmulti;
-    int     yield;
-    int     tailcall;
-    int     label;
-    INTVAL  pragma;
-} pcc_sub_t;
-
-enum uniq_t {
-    U_add_once,
-    U_add_uniq_label,
-    U_add_uniq_sub,
-    U_add_all
-};
-
 #endif /* PARROT_IMCC_SYMREG_H_GUARD */
 
 /*

Modified: branches/gsoc_nci/compilers/opsc/ops2c.nqp
==============================================================================
--- branches/gsoc_nci/compilers/opsc/ops2c.nqp	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/opsc/ops2c.nqp	Tue Sep 28 17:16:52 2010	(r49366)
@@ -75,7 +75,7 @@
  -h --help                print this usage information
  -n --no-lines            do not print #line directives in generated C code (line numbers are not currently supported)
 
-#debugging options:
+debugging options:
  -g --debug               perform all processing but do not write to any files
 ");
     pir::exit(0);

Modified: branches/gsoc_nci/compilers/opsc/src/Ops/Emitter.pm
==============================================================================
--- branches/gsoc_nci/compilers/opsc/src/Ops/Emitter.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/opsc/src/Ops/Emitter.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -256,7 +256,7 @@
     my $dispatch := self.trans.init_func_disaptch;
 
     # TODO There is a bug in NQP about \{
-    $fh.print(q|
+    $fh.print((self.flags<core> ?? 'PARROT_EXPORT' !! '') ~ q|
 op_lib_t *
 | ~ self.init_func ~ q|(PARROT_INTERP, long init) {
     /* initialize and return op_lib ptr */
@@ -359,7 +359,8 @@
 #include "parrot/oplib.h"
 #include "parrot/runcore_api.h"
 
-{self.sym_export} op_lib_t *{self.init_func}(PARROT_INTERP, long init);
+| ~ (self.flags<core> ?? 'PARROT_EXPORT' !! '') ~ qq|
+op_lib_t *{self.init_func}(PARROT_INTERP, long init);
 
 |);
 }
@@ -374,7 +375,7 @@
  * .ops files). by {self<script>}.
  *
  * Any changes made here will be lost!  To regenerate this file after making
- * changes to any ops, use the bootstap-ops makefile target.
+ * changes to any ops, use the bootstrap-ops makefile target.
  *
  */
 |);

Modified: branches/gsoc_nci/compilers/opsc/src/Ops/File.pm
==============================================================================
--- branches/gsoc_nci/compilers/opsc/src/Ops/File.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/opsc/src/Ops/File.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -296,13 +296,37 @@
 
 method _set_version() {
     my $config := _config();
-    my $version := $config<VERSION>;
+    my $version_filename;
+    if $config<installed> {
+        $version_filename :=
+            $config<libdir> ~
+            $config<versiondir> ~
+            $config<slash> ~
+            'VERSION';
+    }
+    else {
+        $version_filename :=
+            $config<prefix> ~
+            $config<slash> ~
+            'VERSION';
+    }
+
+    grammar VERSION {
+        rule TOP { <version> }
+        rule version { $<major>=(\d+) '.' $<minor>=(\d+) '.' $<patch>=(\d+) }
+    }
+
+    my $version       := slurp($version_filename);
+    my $version_match := VERSION.parse($version);
     #say("# $version");
-    my @bits := split('.', $version);
-    self<version_major> := @bits[0];
-    self<version_minor> := @bits[1];
-    self<version_patch> := @bits[2];
-    self<version>       := @bits;
+    self<version_major> := +$version_match<version><major>;
+    self<version_minor> := +$version_match<version><minor>;
+    self<version_patch> := +$version_match<version><patch>;
+    self<version>       := [
+        +self<version_major>,
+        +self<version_minor>,
+        +self<version_match>,
+    ];
 }
 
 # Local Variables:

Modified: branches/gsoc_nci/compilers/opsc/src/Ops/Trans/C.pm
==============================================================================
--- branches/gsoc_nci/compilers/opsc/src/Ops/Trans/C.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/opsc/src/Ops/Trans/C.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -24,12 +24,12 @@
         :k("PREG(NUM)"),
         :ki("IREG(NUM)"),
 
-        :ic("cur_opcode[NUM]"),
-        :nc("CONST(NUM).u.number"),
-        :pc("CONST(NUM).u.key"),
-        :sc("CONST(NUM).u.string"),
-        :kc("CONST(NUM).u.key"),
-        :kic("cur_opcode[NUM]")
+        :ic("ICONST(NUM)"),
+        :nc("NCONST(NUM)"),
+        :pc("PCONST(NUM)"),
+        :sc("SCONST(NUM)"),
+        :kc("PCONST(NUM)"),
+        :kic("ICONST(NUM)")
     );
 
     self;
@@ -108,14 +108,17 @@
 method defines($emitter) {
     return qq|
 /* defines - Ops::Trans::C */
-#undef CONST
 #define REL_PC     ((size_t)(cur_opcode - (opcode_t *)interp->code->base.data))
 #define CUR_OPCODE cur_opcode
 #define IREG(i) (CUR_CTX->bp.regs_i[cur_opcode[i]])
 #define NREG(i) (CUR_CTX->bp.regs_n[-1L - cur_opcode[i]])
 #define PREG(i) (CUR_CTX->bp_ps.regs_p[-1L - cur_opcode[i]])
 #define SREG(i) (CUR_CTX->bp_ps.regs_s[cur_opcode[i]])
-#define CONST(i) Parrot_pcc_get_constants(interp, interp->ctx)[cur_opcode[i]]
+#define ICONST(i) cur_opcode[i]
+#define NCONST(i) Parrot_pcc_get_num_constants(interp, interp->ctx)[cur_opcode[i]]
+#define SCONST(i) Parrot_pcc_get_str_constants(interp, interp->ctx)[cur_opcode[i]]
+#undef  PCONST
+#define PCONST(i) Parrot_pcc_get_pmc_constants(interp, interp->ctx)[cur_opcode[i]]
 
 static int get_op(PARROT_INTERP, const char * name, int full);
 |;
@@ -356,7 +359,7 @@
     HOP *hops = hop_buckets =
         mem_gc_allocate_n_zeroed_typed(interp, [[BS]]op_lib.op_count * 2, HOP );
 
-    size_t i;
+    opcode_t i;
 
     /* store full names */
     for (i = 0; i < [[BS]]op_lib.op_count; i++) {

Modified: branches/gsoc_nci/compilers/pct/src/PAST/Compiler.pir
==============================================================================
--- branches/gsoc_nci/compilers/pct/src/PAST/Compiler.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/pct/src/PAST/Compiler.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -812,7 +812,7 @@
     unshift blockpast, node
 
     .local string name, pirflags, blocktype
-    .local pmc nsentry, subid, ns, hll, multi
+    .local pmc nsentry, subid, ns, hll, multi, loadlibs
     name = node.'name'()
     pirflags = node.'pirflags'()
     blocktype = node.'blocktype'()
@@ -821,6 +821,7 @@
     ns = node.'namespace'()
     hll = node.'hll'()
     multi = node.'multi'()
+    loadlibs = node.'loadlibs'()
 
     ##  handle nsentry attribute
     $I0 = defined nsentry
@@ -846,7 +847,7 @@
     ##  create a POST::Sub node for this block
     .local pmc bpost
     $P0 = get_hll_global ['POST'], 'Sub'
-    bpost = $P0.'new'('node'=>node, 'name'=>name, 'blocktype'=>blocktype, 'namespace'=>ns, 'hll'=>hll, 'subid'=>subid, 'multi'=>multi)
+    bpost = $P0.'new'('node'=>node, 'name'=>name, 'blocktype'=>blocktype, 'namespace'=>ns, 'hll'=>hll, 'subid'=>subid, 'multi'=>multi, 'loadlibs'=>loadlibs)
     unless pirflags goto pirflags_done
     bpost.'pirflags'(pirflags)
   pirflags_done:
@@ -931,9 +932,8 @@
     $S0 = self.'unique'('control_')
     ctrllabel = $P0.'new'('result'=>$S0)
     $S0 = self.'uniquereg'('P')
-    bpost.'push_pirop'('new', $S0, "'ExceptionHandler'")
+    bpost.'push_pirop'('new', $S0, "['ExceptionHandler']", '.CONTROL_RETURN')
     bpost.'push_pirop'('set_addr', $S0, ctrllabel)
-    bpost.'push_pirop'('callmethod', '"handle_types"', $S0, '.CONTROL_RETURN')
     bpost.'push_pirop'('push_eh', $S0)
     bpost.'add_directive'('.include "except_types.pasm"')
 
@@ -2087,7 +2087,7 @@
     $S0 = files
     sourceline = concat ' (', $S0
     concat sourceline, ':'
-    $I0 = source.'lineof'(pos)
+    $I0 = self.'lineof'(pos)
     inc $I0
     $S0 = $I0
     concat sourceline, $S0
@@ -2391,11 +2391,19 @@
     name = node.'name'()
     name = self.'escape'(name)
 
+    # We have three cases here.
+    #   0 children = use self
+    #   1 child    = object to look up on
+    #   2 children = object to look up on + class handle
+    # In the last case, we need to generate a different form of the op that
+    # has the extra argument.
     .local pmc call_on
+    $I0 = elements node
+    if $I0 == 0 goto use_self
     call_on = node[0]
-    if null call_on goto use_self
     call_on = self.'as_post'(call_on, 'rtype'=>'P')
     ops.'push'(call_on)
+    if $I0 == 2 goto have_class_handle
     goto invocant_done
   use_self:
     call_on = box 'self'
@@ -2414,6 +2422,25 @@
     ops.'push_pirop'('setattribute', call_on, name, bindpost)
     ops.'result'(bindpost)
     .return (ops)
+
+  have_class_handle:
+    .local pmc handle
+    handle = node[1]
+    handle = self.'as_post'(handle, 'rtype'=>'P')
+    ops.'push'(handle)
+
+    if bindpost goto attribute_bind_handle
+
+    .local pmc fetchop, storeop
+    $P0 = get_hll_global ['POST'], 'Op'
+    fetchop = $P0.'new'(ops, call_on, handle, name, 'pirop'=>'getattribute')
+    storeop = $P0.'new'(call_on, handle, name, ops, 'pirop'=>'setattribute')
+    .tailcall self.'vivify'(node, ops, fetchop, storeop)
+
+  attribute_bind_handle:
+    ops.'push_pirop'('setattribute', call_on, handle, name, bindpost)
+    ops.'result'(bindpost)
+    .return (ops)
 .end
 
 

Modified: branches/gsoc_nci/compilers/pct/src/PAST/Node.pir
==============================================================================
--- branches/gsoc_nci/compilers/pct/src/PAST/Node.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/pct/src/PAST/Node.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -601,6 +601,21 @@
 .end
 
 
+=item loadlibs([lib1, lib2, ...])
+
+Get/set the libraries to be loaded at startup. EXPERIMENTAL (not subject to
+deprecation policy, yet).
+
+=cut
+
+.sub 'loadlibs' :method
+    .param pmc libs :slurpy
+    .local int has_value
+    has_value = elements libs
+    .tailcall self.'attr'('loadlibs', libs, has_value)
+.end
+
+
 =item nsentry([nsentry])
 
 Get/set the C<nsentry> for this block.

Modified: branches/gsoc_nci/compilers/pct/src/PCT/HLLCompiler.pir
==============================================================================
--- branches/gsoc_nci/compilers/pct/src/PCT/HLLCompiler.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/pct/src/PCT/HLLCompiler.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -26,10 +26,9 @@
 
 .include 'cclass.pasm'
 .include 'stdio.pasm'
+.include 'iglobals.pasm'
 
 .sub 'init' :vtable :method
-    load_bytecode 'config.pir'
-
     $P0 = split ' ', 'parse past post pir evalpmc'
     setattribute self, '@stages', $P0
 
@@ -56,7 +55,8 @@
 
     $S0  = '???'
     push_eh _handler
-    $P0  = _config()
+    $P0 = getinterp
+    $P0 = $P0[.IGLOBALS_CONFIG_HASH]
     $S0  = $P0['revision']   # also $I0 = P0['installed'] could be used
   _handler:
     pop_eh
@@ -955,6 +955,70 @@
     .return ($P0)
 .end
 
+=item lineof(target, pos [, cache :named('cache')])
+
+Return the line number of offset C<pos> within C<target>.  The return
+value uses zero for the first line.  If C<cache> is true, then
+memoize the line offsets as a C<!lineof> property on C<target>.
+
+=cut
+
+.sub 'lineof' :method
+    .param pmc target
+    .param int pos
+    .param int cache           :optional :named('cache')
+    .local pmc linepos
+
+    # If we've previously cached C<linepos> for target, we use it.
+    unless cache goto linepos_build
+    linepos = getprop '!linepos', target
+    unless null linepos goto linepos_done
+
+    # calculate a new linepos array.
+  linepos_build:
+    linepos = new ['ResizableIntegerArray']
+    unless cache goto linepos_build_1
+    setprop target, '!linepos', linepos
+  linepos_build_1:
+    .local string s
+    .local int jpos, eos
+    s = target
+    eos = length s
+    jpos = 0
+    # Search for all of the newline markers in C<target>.  When we
+    # find one, mark the ending offset of the line in C<linepos>.
+  linepos_loop:
+    jpos = find_cclass .CCLASS_NEWLINE, s, jpos, eos
+    unless jpos < eos goto linepos_done
+    $I0 = ord s, jpos
+    inc jpos
+    push linepos, jpos
+    # Treat \r\n as a single logical newline.
+    if $I0 != 13 goto linepos_loop
+    $I0 = ord s, jpos
+    if $I0 != 10 goto linepos_loop
+    inc jpos
+    goto linepos_loop
+  linepos_done:
+
+    # We have C<linepos>, so now we search the array for the largest
+    # element that is not greater than C<pos>.  The index of that
+    # element is the line number to be returned.
+    # (Potential optimization: use a binary search.)
+    .local int line, count
+    count = elements linepos
+    line = 0
+  line_loop:
+    if line >= count goto line_done
+    $I0 = linepos[line]
+    if $I0 > pos goto line_done
+    inc line
+    goto line_loop
+  line_done:
+    .return (line)
+.end
+
+
 =item dumper(obj, name, options)
 
 Dump C<obj> with C<name> according to C<options>.

Modified: branches/gsoc_nci/compilers/pct/src/POST/Compiler.pir
==============================================================================
--- branches/gsoc_nci/compilers/pct/src/POST/Compiler.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/pct/src/POST/Compiler.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -363,9 +363,20 @@
     goto subpir_done
 
   subpir_post:
-    unless hll goto subpir_ns
+    unless hll goto subpir_loadlibs
     $P0 = self.'escape'(hll)
     subpir.'append_format'("\n.HLL %0\n", $P0)
+  subpir_loadlibs:
+    $P0 = node.'loadlibs'()
+    if null $P0 goto subpir_ns
+    unless $P0 goto subpir_ns
+    $P1 = iter $P0
+  subpir_loadlibs_loop:
+    unless $P1 goto subpir_ns
+    $P2 = shift $P1
+    $P2 = self.'escape'($P2)
+    subpir.'append_format'("\n.loadlib %0\n", $P2)
+    goto subpir_loadlibs_loop
   subpir_ns:
     subpir.'append_format'("\n.namespace %0\n", nskey)
   subpir_directives:

Modified: branches/gsoc_nci/compilers/pct/src/POST/Node.pir
==============================================================================
--- branches/gsoc_nci/compilers/pct/src/POST/Node.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/compilers/pct/src/POST/Node.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -194,6 +194,13 @@
 .end
 
 
+.sub 'loadlibs' :method
+    .param pmc value           :optional
+    .param int has_value       :opt_flag
+    .tailcall self.'attr'('loadlibs', value, has_value)
+.end
+
+
 .sub 'outer' :method
     .param pmc value           :optional
     .param int has_value       :opt_flag

Modified: branches/gsoc_nci/config/auto/gcc.pm
==============================================================================
--- branches/gsoc_nci/config/auto/gcc.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/auto/gcc.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -86,6 +86,7 @@
 
     $conf->data->set( sym_export => '__attribute__ ((visibility("default")))' )
         if $gccversion >= 4.0 && !$conf->data->get('sym_export');
+    $conf->data->set( noinline => '__attribute__ ((noinline))' );
 
     # sneaky check for g++
     my $gpp = (index($conf->data->get('cc'), '++') > 0) ? 1 : 0;

Added: branches/gsoc_nci/config/auto/llvm.pm
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/gsoc_nci/config/auto/llvm.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -0,0 +1,247 @@
+# Copyright (C) 2009, Parrot Foundation.
+# $Id$
+
+=head1 NAME
+
+config/auto/llvm - Check whether the Low Level Virtual Machine is present
+
+=head1 DESCRIPTION
+
+Determines whether the Low Level Virtual Machine (LLVM) is installed and
+functional on the system.  It is OK when it
+doesn't exist.
+
+=cut
+
+package auto::llvm;
+
+use strict;
+use warnings;
+
+use base qw(Parrot::Configure::Step);
+
+use Parrot::Configure::Utils ':auto';
+
+sub _init {
+    my $self = shift;
+    my %data;
+    $data{description} = q{Is LLVM installed};
+    $data{result}      = q{};
+    $data{llvm_components} = [
+        [ 'llvm-gcc'    => 'llvm-gcc' ],
+        [ 'lli'         => 'Low Level Virtual Machine' ],
+        [ 'llc'         => 'Low Level Virtual Machine' ],
+    ];
+    return \%data;
+}
+
+sub runstep {
+    my ( $self, $conf ) = @_;
+
+    my $verbose = $conf->options->get( 'verbose' );
+
+    # We start by seeing whether we can run three LLVM component executables,
+    # each with the '--version' option, and get the expected output.
+
+    my $llvm_lacking = 0;
+    foreach my $prog ( @{ $self->{llvm_components} } ) {
+        my $output = capture_output( $prog->[0], '--version' );
+        $llvm_lacking = _handle_component_version_output(
+          $prog, $output, $llvm_lacking, $verbose
+        );
+    }
+    my $output = q{};
+    $output = capture_output( 'llvm-gcc', '--version' );
+
+    # Next, we make sure we have at least major version 4 of 'llvm-gcc'
+    $llvm_lacking = _examine_llvm_gcc_version(
+        $output, $llvm_lacking, $verbose
+    );
+
+    # Finally, we see whether our LLVM actually works.
+    if ( $llvm_lacking ) {
+        $self->_handle_result( $conf, 0 );
+    }
+    else {
+
+        # Here we will take a simple C file, compile it into an LLVM bitcode
+        # file, execute it as bitcode, then compile it to native assembly
+        # using the LLC code generator, then assemble the native assembly
+        # language file into a program and execute it.  Cf.:
+        # http://llvm.org/releases/2.5/docs/GettingStarted.html#overview
+
+        my $stem = q|hello|;
+        my $cfile = qq|$stem.c|;
+        my $fullcfile = qq|config/auto/llvm/$cfile|;
+        my $bcfile = qq|$stem.bc|;
+        my $sfile = qq|$stem.s|;
+        my $nativefile = qq|$stem.native|;
+        eval {
+            system(qq{llvm-gcc -O3 -emit-llvm $fullcfile -c -o $bcfile});
+        };
+        if ($@) {
+            $self->_handle_failure_to_compile_into_bitcode( $conf, $verbose );
+        }
+        else {
+            my $output;
+            eval {
+                $output = capture_output( 'lli', $bcfile );
+            };
+            if ( $@ or $output !~ /hello world/ ) {
+                $self->_handle_failure_to_execute_bitcode( $conf, $verbose );
+            }
+            else {
+                eval {
+                    system(qq{llc $bcfile -o $sfile});
+                };
+                if ( $@ or (! -e $sfile) ) {
+                    $self->_handle_failure_to_compile_to_assembly(
+                        $conf, $verbose );
+                }
+                else {
+                    eval {
+                        my $cc = $conf->data->get('cc');
+                        system(qq{$cc $sfile -o $nativefile});
+                    };
+                    if ( $@ or (! -e $nativefile) ) {
+                        $self->_handle_failure_to_assemble_assembly(
+                            $conf, $verbose );
+                    }
+                    else {
+                        eval {
+                            $output = capture_output(qq{./$nativefile});
+                        };
+                        $self->_handle_native_assembly_output(
+                            $conf, $output, $verbose
+                        );
+                    }
+                }
+            }
+        }
+        my $count_unlinked = _cleanup_llvm_files(
+            $bcfile, $sfile, $nativefile
+        );
+        $conf->cc_clean();
+    }
+
+    return 1;
+}
+
+sub _handle_component_version_output {
+    my ($prog, $output, $llvm_lacking, $verbose) = @_;
+    my $exp = $prog->[1];
+    unless ( defined($output) and $output =~ m/$exp/s ) {
+        $llvm_lacking++;
+        print "Could not get expected '--version' output for $prog->[0]\n"
+            if $verbose;
+    }
+    else {
+        print $output, "\n" if $verbose;
+    }
+    return $llvm_lacking;
+}
+
+sub _examine_llvm_gcc_version {
+    my ( $output, $llvm_lacking, $verbose ) = @_;
+    if (! $output) {
+        $llvm_lacking++;
+    }
+    else {
+        my @line = split /\n+/, $output;
+        if ( $line[0] =~ m/\b(\d+)\.(\d+)\.(\d+)\b/ ) {
+            my @version = ($1, $2, $3);
+            if ($version[0] < 4) {
+                print "llvm-gcc must be at least major version 4\n"
+                    if $verbose;
+                $llvm_lacking++;
+            }
+        }
+        else {
+            print "Unable to extract llvm-gcc major, minor and patch versions\n"
+                if $verbose;
+            $llvm_lacking++;
+        }
+    }
+    return $llvm_lacking;
+}
+
+sub _handle_failure_to_compile_into_bitcode {
+    my ($self, $conf, $verbose ) = @_;
+    print "Unable to compile C file into LLVM bitcode file\n"
+        if $verbose;
+    $self->_handle_result( $conf, 0 );
+}
+
+sub _handle_failure_to_execute_bitcode {
+    my ($self, $conf, $verbose ) = @_;
+    print "Unable to run LLVM bitcode file with 'lli'\n"
+    if $verbose;
+    $self->_handle_result( $conf, 0 );
+}
+
+sub _handle_failure_to_compile_to_assembly {
+    my ($self, $conf, $verbose ) = @_;
+    print "Unable to compile program to native assembly using 'llc'\n"
+        if $verbose;
+    $self->_handle_result( $conf, 0 );
+}
+
+sub _handle_failure_to_assemble_assembly {
+    my ($self, $conf, $verbose ) = @_;
+    print "Unable to assemble native assembly into program\n"
+         if $verbose;
+    $self->_handle_result( $conf, 0 );
+}
+
+sub _handle_result {
+    my ($self, $conf, $result) = @_;
+    if ( $result ) {
+        $self->set_result('yes');
+        $conf->data->set( has_llvm => 1 );
+    }
+    else {
+        $self->set_result('no');
+        $conf->data->set( has_llvm => '' );
+    }
+    return 1;
+}
+
+sub _handle_native_assembly_output {
+    my ($self, $conf, $output, $verbose) = @_;
+    if ( $@ or ( $output !~ /hello world/ ) ) {
+        print "Unable to execute native assembly program successfully\n"
+            if $verbose;
+        $self->_handle_result( $conf, 0 );
+    }
+    else {
+        $self->_handle_result( $conf, 1 );
+    }
+}
+
+sub _cleanup_llvm_files {
+   my @llvm_files = @_;
+   my $count_unlinked = 0;
+   foreach my $f ( @llvm_files ) {
+      if ( defined($f) and ( -e $f ) ) {
+          unlink $f;
+          $count_unlinked++;
+      }
+   }
+   return $count_unlinked;
+};
+
+1;
+
+=head1 AUTHOR
+
+James E Keenan
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+

Added: branches/gsoc_nci/config/auto/llvm/hello.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/gsoc_nci/config/auto/llvm/hello.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -0,0 +1,41 @@
+/*
+ *
+Copyright (C) 2009, Parrot Foundation.
+$Id$
+
+=head1
+
+Test file only.
+
+=over 4
+
+=item C<int main()>
+
+Test file only.
+
+=cut
+
+*/
+
+#include <stdio.h>
+
+int main() {
+  printf("hello world\n");
+  return 0;
+}
+
+/*
+
+=back
+
+=cut
+
+*/
+
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Modified: branches/gsoc_nci/config/auto/msvc.pm
==============================================================================
--- branches/gsoc_nci/config/auto/msvc.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/auto/msvc.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -89,6 +89,9 @@
         # for details.
         $conf->data->add( " ", "ccflags", "-D_CRT_SECURE_NO_DEPRECATE" );
     }
+
+    $conf->data->set( noinline   => '__declspec(noinline)' );
+
     return 1;
 }
 

Modified: branches/gsoc_nci/config/auto/pcre.pm
==============================================================================
--- branches/gsoc_nci/config/auto/pcre.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/auto/pcre.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -35,11 +35,10 @@
 
     my $without = $conf->options->get( qw| without-pcre | );
 
-    if ($without) {
-        $conf->data->set( HAS_PCRE => 0 );
-        $self->set_result('no');
-        return 1;
-    }
+    $self->set_result('no');
+    $conf->data->set( HAS_PCRE => 0 );
+
+    return 1 if ($without);
 
     my $osname = $conf->data->get('osname');
 
@@ -53,12 +52,12 @@
 
     $conf->cc_gen('config/auto/pcre/pcre_c.in');
     eval { $conf->cc_build( q{}, $extra_libs ) };
-    my $has_pcre = 0;
     if ( !$@ ) {
         my $test = $conf->cc_run();
-        $has_pcre = $self->_evaluate_cc_run($conf, $test);
+        if ( my $has_pcre = $self->_evaluate_cc_run($conf, $test) ) {
+        $conf->data->set( HAS_PCRE => $has_pcre);
+        }
     }
-    $conf->data->set( HAS_PCRE => $has_pcre);
 
     return 1;
 }

Modified: branches/gsoc_nci/config/auto/pmc.pm
==============================================================================
--- branches/gsoc_nci/config/auto/pmc.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/auto/pmc.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -36,9 +36,12 @@
 sub runstep {
     my ( $self, $conf ) = @_;
 
-    my @pmc = sort_pmcs( @{ $self->{srcpmc} } );
-
-    my $pmc_list = join( ' ', grep { defined $_ } @pmc );
+    # $pmc_list is a string holding a space-delimited list of currently active
+    # PMCs, sorted (largely) on the basis of src/pmc/pmc.num.
+    # (By 'current', we take into account the fact that there are PMCs listed
+    # in src/pmc/pmc.num that no longer exist but whose index numbers are
+    # never deleted.)
+    my $pmc_list = get_sorted_pmc_str( @{ $self->{srcpmc} } );
 
     # names of class files for src/pmc/Makefile
     ( my $TEMP_pmc_o   = $pmc_list ) =~ s/\.pmc/\$(O)/g;
@@ -216,23 +219,20 @@
     return @parents;
 }
 
+# Internal sub get_pmc_order parses src/pmc/pmc.num.  The hash it builds
+# includes both active and deactivated PMCs.
 sub get_pmc_order {
     open my $IN, '<', 'src/pmc/pmc.num' or die "Can't read src/pmc/pmc.num";
     my %order;
     while (<$IN>) {
-        next if /^#/;
-
-        if (/(\w+\.\w+)\s+(\d+)/) {
-            $order{$1} = $2;
-        }
+        next unless (/^(\w+\.\w+)\s+(\d+)$/);
+        $order{$1} = $2;
     }
-
     close $IN;
-
     return \%order;
 }
 
-sub sort_pmcs {
+sub get_sorted_pmc_str {
     my @pmcs      = @_;
     my $pmc_order = get_pmc_order();
     my $n         = keys %$pmc_order;
@@ -247,7 +247,41 @@
         }
     }
 
-    return @sorted_pmcs;
+    # With the test for definedness below, we account for PMCs which have been
+    # deactivated but whose index numbers remain in src/pmc/pmc.num.
+    my $active_pmcs = [ grep { defined $_ } @sorted_pmcs ];
+
+    # At this point we check to see whether any active_pmcs are missing from
+    # the MANIFEST.  We warn about any such missing PMCs but (for the time
+    # being at least) we proceed to compose $pmc_str.
+    my $seen_manifest = pmcs_in_manifest();
+    check_pmcs_against_manifest( $active_pmcs, $seen_manifest );
+    return join(' ' => @{ $active_pmcs });
+}
+
+sub pmcs_in_manifest {
+    my $manifest = shift || 'MANIFEST';
+    my %seen_manifest = ();
+    open my $MAN, '<', $manifest
+        or die "Unable to open MANIFEST: $!";
+    while (my $f = <$MAN>) {
+        chomp $f;
+        if ($f =~ m{^src/pmc/(.*\.pmc)}) {
+            my $pmc = $1;
+            $seen_manifest{$pmc}++;
+        }
+    }
+    close $MAN or die "Unable to close MANIFEST: $!";
+    return \%seen_manifest;
+}
+
+sub check_pmcs_against_manifest {
+    my ($active_pmcs, $seen_manifest) = @_;
+    my @missing_from_manifest = grep { ! exists $seen_manifest->{$_} }
+        @{ $active_pmcs };
+    if (@missing_from_manifest) {
+        warn "PMCs found in /src/pmc not found in MANIFEST: @missing_from_manifest";
+    }
 }
 
 sub contains_pccmethod {

Modified: branches/gsoc_nci/config/auto/readline.pm
==============================================================================
--- branches/gsoc_nci/config/auto/readline.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/auto/readline.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -36,6 +36,14 @@
 sub runstep {
     my ( $self, $conf ) = @_;
 
+    my $without_opt = $conf->options->get('without-readline');
+
+    if ($without_opt) {
+        $conf->data->set('HAS_READLINE' => 0);
+        $self->set_result('not requested');
+        return 1;
+    }
+
     my $cc     = $conf->data->get('cc');
     my $osname = $conf->data->get('osname');
 

Modified: branches/gsoc_nci/config/gen/config_h/config_h.in
==============================================================================
--- branches/gsoc_nci/config/gen/config_h/config_h.in	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/gen/config_h/config_h.in	Tue Sep 28 17:16:52 2010	(r49366)
@@ -84,6 +84,8 @@
 #endif
 #endif
 
+#define PARROT_NOINLINE @noinline@
+
 #if defined(PARROT_IN_CORE)
 
 /* Put any other symbols here. */
@@ -150,8 +152,10 @@
 #define PARROT_ at jitcpu@ 1
 
 /* Oplib and dynamic ops related. */
-#define PARROT_CORE_OPLIB_NAME "core_ops"
-#define PARROT_CORE_OPLIB_INIT Parrot_DynOp_core_ at MAJOR@_ at MINOR@_ at PATCH@
+#define PARROT_CORE_OPLIB_NAME    "core_ops"
+#define PARROT_CORE_OPLIB_INIT    Parrot_DynOp_core_ at MAJOR@_ at MINOR@_ at PATCH@
+
+#define  PARROT_GET_CORE_OPLIB(i)  PARROT_CORE_OPLIB_INIT((i), 1)
 
 /* ICU. */
 #define PARROT_HAS_ICU @has_icu@

Modified: branches/gsoc_nci/config/gen/makefiles.pm
==============================================================================
--- branches/gsoc_nci/config/gen/makefiles.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/gen/makefiles.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2009, Parrot Foundation.
+# Copyright (C) 2001-2010, Parrot Foundation.
 # $Id$
 
 =head1 NAME
@@ -68,6 +68,9 @@
 
     $self->makefiles($conf);
 
+    $conf->shebang_mod( 'tools/dev/mk_language_shell.in'
+                         => 'tools/dev/mk_language_shell.pl', );
+
     return 1;
 }
 

Modified: branches/gsoc_nci/config/gen/makefiles/root.in
==============================================================================
--- branches/gsoc_nci/config/gen/makefiles/root.in	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/gen/makefiles/root.in	Tue Sep 28 17:16:52 2010	(r49366)
@@ -47,8 +47,13 @@
 # where we're building parrot from (needed for pbc_to_exe)
 BUILD_DIR = @build_dir@
 
-# directory for build tools
+# directory for build tools:
+# programs, templates, configuration files invoked by 'make all'
+# (with or without command-line options)
 BUILD_TOOLS_DIR = tools/build
+# directory for developers' tools
+# programs, templates, configuration files NOT invoked by 'make all'
+DEV_TOOLS_DIR = tools/dev
 
 # directory for header files
 INC_DIR         = @inc@
@@ -116,7 +121,7 @@
 NONGEN_HEADERS   = @TEMP_nongen_headers@
 
 # The headerizer
-HEADERIZER       = $(PERL) $(BUILD_TOOLS_DIR)/headerizer.pl
+HEADERIZER       = $(PERL) $(DEV_TOOLS_DIR)/headerizer.pl
 
 include src/dynpmc/Defines.mak
 include src/dynoplibs/Defines.mak
@@ -197,7 +202,6 @@
 	runtime/parrot/include/dlopenflags.pasm \
 	runtime/parrot/include/longopt.pasm \
 	runtime/parrot/include/packfile_segments.pasm \
-	runtime/parrot/include/packfile_constants.pasm \
 	runtime/parrot/include/packfile_annotation_key_type.pasm \
 	runtime/parrot/include/stat.pasm \
 	runtime/parrot/include/stringinfo.pasm \
@@ -220,7 +224,8 @@
     .parrot_current_rev \
 #IF(has_opengl):    runtime/parrot/include/opengl_defines.pasm \
 #IF(has_opengl):    runtime/parrot/library/OpenGL_funcs.pir \
-    runtime/parrot/include/signal.pasm
+    runtime/parrot/include/signal.pasm \
+    tools/dev/mk_language_shell.pl
 
 
 ###############################################################################
@@ -362,7 +367,6 @@
 	$(INC_DIR)/interpreter.h \
 	$(INC_DIR)/datatypes.h \
 	$(INC_DIR)/encoding.h \
-	$(INC_DIR)/charset.h \
 	$(INC_DIR)/string.h \
 	$(INC_DIR)/string_primitives.h \
 	$(INC_DIR)/hash.h \
@@ -405,17 +409,27 @@
 	$(INC_DIR)/core_pmcs.h \
 	$(INC_DIR)/compiler.h \
 	$(INC_DIR)/cclass.h \
+	$(INC_DIR)/list.h \
 	include/pmc/pmc_callcontext.h
 
 # generated list of header files
 GENERAL_H_FILES   = $(NONGEN_HEADERS) $(GEN_HEADERS) \
 
 
-CHARSET_O_FILES   = @TEMP_charset_o@
 CLASS_PMC_FILES   = @TEMP_pmc_classes_pmc@
 CLASS_O_FILES     = @TEMP_pmc_classes_o@
 CLASS_STR_FILES   = @TEMP_pmc_classes_str@
-ENCODING_O_FILES  = @TEMP_encoding_o@
+
+ENCODING_O_FILES = \
+    src/string/encoding/shared$(O) \
+    src/string/encoding/tables$(O) \
+    src/string/encoding/ascii$(O) \
+    src/string/encoding/latin1$(O) \
+    src/string/encoding/binary$(O) \
+    src/string/encoding/utf8$(O) \
+    src/string/encoding/utf16$(O) \
+    src/string/encoding/ucs2$(O) \
+    src/string/encoding/ucs4$(O)
 
 IO_O_FILES = \
     src/io/core$(O) \
@@ -434,8 +448,6 @@
     src/string/api$(O) \
     src/ops/core_ops$(O) \
 #IF(i386_has_gcc_cmpxchg):    src/atomic/gcc_x86$(O) \
-    src/byteorder$(O) \
-    src/string/charset$(O) \
     src/core_pmcs$(O) \
     src/datatypes$(O) \
     src/debug$(O) \
@@ -450,8 +462,12 @@
     src/gc/api$(O) \
     src/gc/gc_ms$(O) \
     src/gc/gc_inf$(O) \
+    src/gc/gc_ms2$(O) \
     src/gc/mark_sweep$(O) \
     src/gc/system$(O) \
+    src/gc/fixed_allocator$(O) \
+    src/gc/variable_size_pool$(O) \
+    src/gc/string_gc$(O) \
     src/global_setup$(O) \
     src/hash$(O) \
     src/hll$(O) \
@@ -465,11 +481,11 @@
     src/call/context_accessors$(O) \
     src/key$(O) \
     src/library$(O) \
+    src/list$(O) \
     src/longopt$(O) \
     src/misc$(O) \
     src/multidispatch$(O) \
     src/namespace$(O) \
-    src/frame_builder$(O) \
     src/nci/api$(O) \
     src/nci/core_thunks$(O) \
 #IF(has_extra_nci_thunks): src/nci/extra_thunks$(O) \
@@ -675,11 +691,11 @@
     src/library.str \
     src/multidispatch.str \
     src/namespace.str \
-    src/frame_builder.str \
     src/nci/api.str \
     src/nci/core_thunks.str \
 #IF(has_extra_nci_thunks): src/nci/extra_thunks.str \
     src/packfile.str \
+    src/packfile/pf_items.str \
     src/pmc.str \
     src/pmc_freeze.str \
     src/oo.str \
@@ -844,12 +860,12 @@
 	@rpath_blib@ $(ALL_PARROT_LIBS) $(LINKFLAGS) $(LINK_DYNAMIC)
 #IF(win32):	if exist $@.manifest mt.exe -nologo -manifest $@.manifest -outputresource:$@;1
 
-$(PBC_TO_EXE) : tools/dev/pbc_to_exe.pir runtime/parrot/library/config.pir $(PARROT) $(DYNEXT_DIR)/os$(LOAD_EXT) $(DYNEXT_DIR)/file$(LOAD_EXT)
-	$(PARROT) -o pbc_to_exe.pbc tools/dev/pbc_to_exe.pir
+$(PBC_TO_EXE) : $(DEV_TOOLS_DIR)/pbc_to_exe.pir runtime/parrot/library/config.pir $(PARROT) $(DYNEXT_DIR)/os$(LOAD_EXT) $(DYNEXT_DIR)/file$(LOAD_EXT)
+	$(PARROT) -o pbc_to_exe.pbc $(DEV_TOOLS_DIR)/pbc_to_exe.pir
 	$(PARROT) pbc_to_exe.pbc pbc_to_exe.pbc
 
-parrot_nci_thunk_gen.pbc : tools/dev/nci_thunk_gen.pir $(DATA_JSON_LIB_PBCS) $(PARROT)
-	$(PARROT) -o parrot_nci_thunk_gen.pbc tools/dev/nci_thunk_gen.pir
+parrot_nci_thunk_gen.pbc : $(DEV_TOOLS_DIR)/nci_thunk_gen.pir $(DATA_JSON_LIB_PBCS) $(PARROT)
+	$(PARROT) -o parrot_nci_thunk_gen.pbc $(DEV_TOOLS_DIR)/nci_thunk_gen.pir
 
 $(NCI_THUNK_GEN) : parrot_nci_thunk_gen.pbc $(PBC_TO_EXE)
 	$(PBC_TO_EXE) parrot_nci_thunk_gen.pbc
@@ -860,8 +876,8 @@
 $(PROVE) : parrot-prove.pbc $(PARROT) $(PBC_TO_EXE)
 	$(PBC_TO_EXE) parrot-prove.pbc
 
-$(PARROT_CONFIG) : tools/util/parrot-config.pir $(PARROT) $(PBC_TO_EXE)
-	$(PARROT) -o parrot_config.pbc tools/util/parrot-config.pir
+$(PARROT_CONFIG) : $(DEV_TOOLS_DIR)/parrot-config.pir $(PARROT) $(PBC_TO_EXE)
+	$(PARROT) -o parrot_config.pbc $(DEV_TOOLS_DIR)/parrot-config.pir
 	$(PARROT) pbc_to_exe.pbc parrot_config.pbc
 
 $(MINIPARROT) : src/main$(O) $(GEN_HEADERS) $(LIBPARROT) \
@@ -907,14 +923,22 @@
 
 src/null_config$(O) : $(PARROT_H_HEADERS) src/null_config.c
 
+src/list$(O): $(PARROT_H_HEADERS) include/pmc/pmc_callcontext.h src/list.c
+
 src/oo$(O) : $(PARROT_H_HEADERS) include/pmc/pmc_class.h src/oo.c \
     include/pmc/pmc_object.h src/oo.str $(INC_DIR)/oo_private.h
 
-src/scheduler$(O) : $(PARROT_H_HEADERS) src/scheduler.str src/scheduler.c \
-	include/pmc/pmc_scheduler.h include/pmc/pmc_task.h \
-	include/pmc/pmc_timer.h \
-	$(INC_DIR)/scheduler_private.h \
-	$(INC_DIR)/runcore_api.h
+src/scheduler$(O) : \
+    $(PARROT_H_HEADERS) \
+    src/scheduler.str \
+    src/scheduler.c \
+    include/pmc/pmc_scheduler.h \
+    include/pmc/pmc_task.h \
+    include/pmc/pmc_timer.h \
+    $(INC_DIR)/extend.h \
+    $(INC_DIR)/extend_vtable.h \
+    $(INC_DIR)/scheduler_private.h \
+    $(INC_DIR)/runcore_api.h
 
 src/io/core$(O) : $(PARROT_H_HEADERS) src/io/io_private.h src/io/core.c
 
@@ -931,17 +955,16 @@
 
 O_FILES = \
     $(INTERP_O_FILES) \
-    $(CHARSET_O_FILES) \
     $(IO_O_FILES) \
     $(CLASS_O_FILES) \
     $(ENCODING_O_FILES) \
     $(IMCC_O_FILES)
 
 lib_deps_object : $(O_FILES)
-	$(PERL) tools/dev/lib_deps.pl object $(O_FILES)
+	$(PERL) $(DEV_TOOLS_DIR)/lib_deps.pl object $(O_FILES)
 
 lib_deps_source : $(GENERAL_H_FILES)
-	$(PERL) tools/dev/lib_deps.pl source all_source
+	$(PERL) $(DEV_TOOLS_DIR)/lib_deps.pl source all_source
 
 lib_deps : lib_deps_object lib_deps_source
 
@@ -971,7 +994,7 @@
 
 
 $(INSTALLABLECONFIG) : src/install_config$(O) $(PARROT_CONFIG) $(PBC_TO_EXE)
-	$(PARROT) -o parrot_config.pbc tools/util/parrot-config.pir
+	$(PARROT) -o parrot_config.pbc $(DEV_TOOLS_DIR)/parrot-config.pir
 	$(PBC_TO_EXE) parrot_config.pbc --install
 
 $(INSTALLABLEPBCTOEXE) : $(PBC_TO_EXE) src/install_config$(O)
@@ -1037,8 +1060,13 @@
     src/packdump$(O) @rpath_blib@ $(ALL_PARROT_LIBS) $(LINKFLAGS)
 #IF(win32):	if exist $@.manifest mt.exe -nologo -manifest $@.manifest -outputresource:$@;1
 
-src/pbc_dump$(O) : $(INC_DIR)/embed.h  $(INC_DIR)/oplib/ops.h \
-	$(PARROT_H_HEADERS) src/pbc_dump.c
+src/pbc_dump$(O) : \
+    $(INC_DIR)/embed.h \
+    $(INC_DIR)/oplib/ops.h \
+    $(INC_DIR)/oplib/core_ops.h \
+    $(PARROT_H_HEADERS) \
+    $(INC_DIR)/runcore_api.h \
+    src/pbc_dump.c
 
 $(INSTALLABLEPDUMP) : src/pbc_dump$(O) src/packdump$(O) \
 	src/install_config$(O) $(LIBPARROT)
@@ -1178,8 +1206,6 @@
 
 runtime/parrot/include/packfile_segments.pasm : $(INC_DIR)/packfile.h $(H2INC)
 	$(PERL) $(H2INC) $(INC_DIR)/packfile.h $@
-runtime/parrot/include/packfile_constants.pasm : $(INC_DIR)/packfile.h $(H2INC)
-	$(PERL) $(H2INC) $(INC_DIR)/packfile.h $@
 runtime/parrot/include/packfile_annotation_key_type.pasm : $(INC_DIR)/packfile.h $(H2INC)
 	$(PERL) $(H2INC) $(INC_DIR)/packfile.h $@
 
@@ -1238,14 +1264,16 @@
 #
 ###############################################################################
 
-src/byteorder$(O) : $(PARROT_H_HEADERS) src/byteorder.c
-
 src/datatypes$(O) : $(PARROT_H_HEADERS) src/datatypes.c
 
 src/extend_vtable$(O) : $(PARROT_H_HEADERS) \
 	$(INC_DIR)/extend.h $(INC_DIR)/extend_vtable.h src/extend_vtable.c
 
-src/global_setup$(O) : $(PARROT_H_HEADERS) src/global_setup.str src/global_setup.c
+src/global_setup$(O) : $(PARROT_H_HEADERS) \
+    src/global_setup.str \
+    src/global_setup.c \
+    $(INC_DIR)/runcore_api.h \
+    $(INC_DIR)/oplib/core_ops.h
 
 src/namespace$(O) : $(PARROT_H_HEADERS) src/namespace.str src/namespace.c \
 	include/pmc/pmc_sub.h
@@ -1255,7 +1283,7 @@
 
 src/pmc_freeze$(O) : $(PARROT_H_HEADERS) src/pmc_freeze.str src/pmc_freeze.c
 
-src/hash$(O) : $(PARROT_H_HEADERS) include/pmc/pmc_key.h src/hash.c
+src/hash$(O) : $(PARROT_H_HEADERS) src/hash.c
 
 src/library$(O) : $(PARROT_H_HEADERS) src/library.str src/library.c\
 	$(INC_DIR)/dynext.h
@@ -1272,11 +1300,22 @@
 
 src/gc/gc_inf$(O) : $(PARROT_H_HEADERS) src/gc/gc_private.h src/gc/gc_inf.c
 
+src/gc/gc_ms2$(O) : $(PARROT_H_HEADERS) src/gc/gc_private.h src/gc/fixed_allocator.h src/gc/gc_ms2.c
+
 src/gc/api$(O) : $(PARROT_H_HEADERS) src/gc/gc_private.h src/gc/api.c
 
 src/gc/alloc_resources$(O) : $(PARROT_H_HEADERS) \
 	src/gc/gc_private.h src/gc/alloc_resources.c
 
+src/gc/fixed_allocator$(O) : $(PARROT_H_HEADERS) \
+	src/gc/fixed_allocator.h src/gc/fixed_allocator.c
+
+src/gc/variable_size_pool$(O) : $(PARROT_H_HEADERS) \
+	src/gc/variable_size_pool.h src/gc/variable_size_pool.c
+
+src/gc/string_gc$(O) : $(PARROT_H_HEADERS) \
+	src/gc/gc_private.h src/gc/string_gc.c
+
 src/hll$(O) : $(PARROT_H_HEADERS) src/hll.str $(INC_DIR)/dynext.h src/hll.c
 
 src/platform$(O) : $(PARROT_H_HEADERS) src/platform.c
@@ -1292,14 +1331,21 @@
 src/debug$(O) : $(INC_DIR)/embed.h $(INC_DIR)/extend.h \
 	$(PARROT_H_HEADERS) src/debug.c \
 	$(INC_DIR)/oplib/ops.h \
+        $(INC_DIR)/oplib/core_ops.h \
 	$(INC_DIR)/runcore_api.h $(INC_DIR)/runcore_trace.h \
 	src/debug.str include/pmc/pmc_key.h \
 	include/pmc/pmc_continuation.h \
 	$(INC_DIR)/extend_vtable.h
 
-src/sub$(O) : $(PARROT_H_HEADERS) $(INC_DIR)/oplib/ops.h \
-	src/sub.str src/sub.c \
-	include/pmc/pmc_sub.h include/pmc/pmc_continuation.h
+src/sub$(O) : \
+    $(PARROT_H_HEADERS) \
+    $(INC_DIR)/oplib/ops.h \
+    $(INC_DIR)/oplib/core_ops.h \
+    $(INC_DIR)/runcore_api.h \
+    src/sub.str \
+    src/sub.c \
+    include/pmc/pmc_sub.h \
+    include/pmc/pmc_continuation.h
 
 src/string/api$(O) : $(PARROT_H_HEADERS) src/string/api.str \
 	src/string/private_cstring.h src/string/api.c
@@ -1315,10 +1361,15 @@
 	src/exceptions.str src/exceptions.c \
 	include/pmc/pmc_continuation.h
 
-src/thread$(O) : $(PARROT_H_HEADERS) $(INC_DIR)/atomic.h src/thread.c \
-	include/pmc/pmc_sub.h \
-	include/pmc/pmc_parrotinterpreter.h \
-	$(INC_DIR)/runcore_api.h
+src/thread$(O) : \
+    $(PARROT_H_HEADERS) \
+    $(INC_DIR)/atomic.h \
+    $(INC_DIR)/extend.h \
+    $(INC_DIR)/extend_vtable.h \
+    src/thread.c \
+    include/pmc/pmc_sub.h \
+    include/pmc/pmc_parrotinterpreter.h \
+    $(INC_DIR)/runcore_api.h
 
 ## SUFFIX OVERRIDE - dynloaded files need cc_shared
 src/extend$(O) : $(PARROT_H_HEADERS) $(INC_DIR)/extend.h \
@@ -1363,6 +1414,8 @@
 
 src/interp/inter_cb$(O) : $(PARROT_H_HEADERS) \
 	include/pmc/pmc_parrotinterpreter.h \
+        $(INC_DIR)/extend.h \
+        $(INC_DIR)/extend_vtable.h \
 	src/interp/inter_cb.str src/interp/inter_cb.c
 
 src/interp/inter_misc$(O) : $(PARROT_H_HEADERS) \
@@ -1424,26 +1477,41 @@
 	src/main.c
 
 src/multidispatch$(O) : \
-	src/multidispatch.c \
-	src/multidispatch.str \
-	$(INC_DIR)/oplib/ops.h $(PARROT_H_HEADERS) \
-	include/pmc/pmc_nci.h include/pmc/pmc_sub.h
-
-src/packfile$(O) : src/packfile.str \
-	src/packfile.c \
-	include/pmc/pmc_sub.h include/pmc/pmc_key.h \
-	compilers/imcc/imc.h \
-	compilers/imcc/cfg.h \
-	compilers/imcc/debug.h \
-	compilers/imcc/instructions.h \
-	compilers/imcc/sets.h \
-	compilers/imcc/symreg.h \
-	compilers/imcc/unit.h \
-	$(INC_DIR)/oplib/ops.h \
-	$(INC_DIR)/embed.h $(INC_DIR)/extend.h $(INC_DIR)/extend_vtable.h \
-	$(PARROT_H_HEADERS) $(INC_DIR)/runcore_api.h
+    src/multidispatch.c \
+    src/multidispatch.str \
+    $(INC_DIR)/oplib/ops.h \
+    $(PARROT_H_HEADERS) \
+    include/pmc/pmc_nativepccmethod.h \
+    include/pmc/pmc_nci.h \
+    include/pmc/pmc_sub.h
 
-src/packfile/pf_items$(O) : $(PARROT_H_HEADERS) src/packfile/pf_items.c
+src/packfile$(O) : \
+    src/packfile.str \
+    src/packfile.c \
+    include/pmc/pmc_sub.h \
+    include/pmc/pmc_key.h \
+    include/pmc/pmc_parrotlibrary.h \
+    compilers/imcc/imc.h \
+    compilers/imcc/cfg.h \
+    compilers/imcc/debug.h \
+    compilers/imcc/instructions.h \
+    compilers/imcc/sets.h \
+    compilers/imcc/symreg.h \
+    compilers/imcc/unit.h \
+    $(INC_DIR)/oplib/ops.h \
+    $(INC_DIR)/oplib/core_ops.h \
+    $(INC_DIR)/dynext.h \
+    $(INC_DIR)/embed.h \
+    $(INC_DIR)/extend.h \
+    $(INC_DIR)/extend_vtable.h \
+    $(PARROT_H_HEADERS) \
+    $(INC_DIR)/runcore_api.h
+
+src/packfile/pf_items$(O) : \
+    $(PARROT_H_HEADERS) \
+    src/packfile/byteorder.h \
+    src/packfile/pf_items.str \
+    src/packfile/pf_items.c
 
 src/packout$(O) : $(PARROT_H_HEADERS) include/pmc/pmc_key.h src/packout.c
 
@@ -1460,6 +1528,9 @@
 src/embed$(O) : $(PARROT_H_HEADERS) $(INC_DIR)/embed.h \
         src/embed.c src/embed.str \
         $(INC_DIR)/oplib/ops.h $(INC_DIR)/runcore_api.h \
+        $(INC_DIR)/extend.h \
+        $(INC_DIR)/extend_vtable.h \
+        $(INC_DIR)/oplib/core_ops.h \
         compilers/imcc/imc.h \
         compilers/imcc/cfg.h \
         compilers/imcc/debug.h \
@@ -1488,13 +1559,6 @@
     src/nci/extra_thunks.c
 	$(CC) $(CFLAGS) @optimize::src/nci/extra_thunks.c@ @ccwarn::src/nci/extra_thunks.c@ @cc_shared@ -I$(@D) @cc_o_out@$@ -c src/nci/extra_thunks.c
 
-src/frame_builder$(O) : $(PARROT_H_HEADERS) src/frame_builder.h \
-	src/frame_builder.c \
-	include/pmc/pmc_fixedintegerarray.h \
-	include/pmc/pmc_unmanagedstruct.h \
-	include/pmc/pmc_managedstruct.h \
-	$(INC_DIR)/oplib/ops.h
-
 src/vtables$(O) : $(PARROT_H_HEADERS) src/vtables.c
 
 ## SUFFIX OVERRIDE
@@ -1509,7 +1573,12 @@
 
 src/misc$(O) : $(PARROT_H_HEADERS) src/misc.c
 
-src/utils$(O) : $(PARROT_H_HEADERS) include/pmc/pmc_nci.h src/utils.c
+src/utils$(O) : \
+    $(PARROT_H_HEADERS) \
+    include/pmc/pmc_nci.h \
+    src/utils.c \
+    $(INC_DIR)/extend.h \
+    $(INC_DIR)/extend_vtable.h
 
 ## SUFFIX OVERRIDE
 src/spf_render$(O) : $(PARROT_H_HEADERS) src/spf_render.str src/spf_render.c
@@ -1519,19 +1588,37 @@
 
 src/string/encoding$(O) : $(PARROT_H_HEADERS) src/string/encoding.c
 
-src/string/charset$(O) : $(PARROT_H_HEADERS) src/string/charset.c \
-	src/string/encoding/fixed_8.h \
-	src/string/encoding/utf8.h \
-	src/string/encoding/utf16.h \
-	src/string/encoding/ucs2.h \
-	src/string/encoding/ucs4.h \
-	src/string/charset/ascii.h \
-	src/string/charset/binary.h \
-	src/string/charset/iso-8859-1.h \
-	src/string/charset/unicode.h
-
-src/pbc_merge$(O) : $(INC_DIR)/embed.h src/pbc_merge.c \
-	include/pmc/pmc_sub.h $(INC_DIR)/oplib/ops.h $(PARROT_H_HEADERS)
+src/string/encoding/tables$(O) : $(PARROT_H_HEADERS) \
+    src/string/encoding/tables.h
+src/string/encoding/shared$(O) : $(PARROT_H_HEADERS) \
+    src/string/encoding/shared.h \
+    src/string/encoding/tables.h
+src/string/encoding/ascii$(O) : $(PARROT_H_HEADERS) \
+    src/string/encoding/shared.h \
+    src/string/encoding/tables.h
+src/string/encoding/latin1$(O) : $(PARROT_H_HEADERS) \
+    src/string/encoding/shared.h \
+    src/string/encoding/tables.h
+src/string/encoding/binary$(O) : $(PARROT_H_HEADERS) \
+    src/string/encoding/shared.h
+src/string/encoding/utf8$(O) : $(PARROT_H_HEADERS) \
+    src/string/encoding/shared.h \
+    src/string/unicode.h
+src/string/encoding/utf16$(O) : $(PARROT_H_HEADERS) \
+    src/string/encoding/shared.h
+src/string/encoding/ucs2$(O) : $(PARROT_H_HEADERS) \
+    src/string/encoding/shared.h
+src/string/encoding/ucs4$(O) : $(PARROT_H_HEADERS) \
+    src/string/encoding/shared.h
+
+src/pbc_merge$(O) : \
+    $(INC_DIR)/embed.h \
+    src/pbc_merge.c \
+    include/pmc/pmc_sub.h \
+    $(INC_DIR)/oplib/ops.h \
+    $(INC_DIR)/oplib/core_ops.h \
+    $(INC_DIR)/runcore_api.h \
+    $(PARROT_H_HEADERS)
 
 src/io/filehandle$(O) : $(PARROT_H_HEADERS) include/pmc/pmc_filehandle.h \
     src/io/io_private.h src/io/filehandle.c
@@ -1559,10 +1646,6 @@
 
 @TEMP_pmc_build@
 
- at TEMP_charset_build@
-
- at TEMP_encoding_build@
-
 # $(CONFIGURE_GENERATED_FILES) : Configure.pl
 #	$(PERL) Configure.pl
 
@@ -1676,10 +1759,27 @@
 CONFIGURE_TEST_FILES = \
     t/configure/*.t \
     t/steps/*.t
+PBC_TEST_FILES = \
+#IF(has_icu):    t/op/testlib/test_strings.pbc \
+    t/pmc/testlib/annotations.pbc \
+    t/pmc/testlib/number.pbc
+
+# pbc files used for several tests;
+# not needed for build, hence this target is not included in 'all'
+pbctestfiles: $(PARROT) $(PBC_TEST_FILES)
+
+t/pmc/testlib/number.pbc: t/pmc/testlib/number.pasm
+	$(PARROT) -o t/pmc/testlib/number.pbc t/pmc/testlib/number.pasm
+
+t/pmc/testlib/annotations.pbc: t/pmc/testlib/annotations.pir
+	$(PARROT) -o t/pmc/testlib/annotations.pbc t/pmc/testlib/annotations.pir
+
+t/op/testlib/test_strings.pbc: t/op/testlib/test_strings.pir
+	$(PARROT) -o t/op/testlib/test_strings.pbc t/op/testlib/test_strings.pir
 
 # Common prep for all test targets.
 # We probably need a complete build before running the tests.
-test_prep : all
+test_prep : all pbctestfiles
 
 # Run test cases with a single call of t/harness. Users have to look at only
 # one report. The default set of tests to run is contained in t/harness,
@@ -1703,7 +1803,7 @@
 smoke : smolder_test
 
 # "core tests" -- test basic functionality but not ancillaries
-coretest : corevm
+coretest : corevm pbctestfiles
 	$(PERL) t/harness $(EXTRA_TEST_ARGS) --core-tests
 
 # automake compatibility
@@ -1953,6 +2053,7 @@
 	$(RM_F) t/compilers/pge/*.pir
 	$(RM_F) t/compilers/tge/*.pir
 	$(RM_F) \
+    $(PBC_TEST_FILES) \
     "t/*/*$(O)" \
     "t/*/*.out" \
     "t/*/*.pasm" \
@@ -1995,19 +2096,19 @@
 # Require .svn to exist first
 # Otherwise it'll remove every last file
 svnclobber : .svn
-	$(PERL) tools/dev/svnclobber.pl
+	$(PERL) $(DEV_TOOLS_DIR)/svnclobber.pl
 
 reconfig : realclean
 	$(PERL) Configure.pl $(CONFIG_ARGS)
 
 manitest :
-	$(PERL) tools/dev/manicheck.pl
+	$(PERL) $(DEV_TOOLS_DIR)/manicheck.pl
 
 opsrenumber :
-	$(PERL) tools/dev/opsrenumber.pl $(OPS_FILES)
+	$(PERL) $(DEV_TOOLS_DIR)/opsrenumber.pl $(OPS_FILES)
 
 pmcrenumber :
-	$(PERL) tools/dev/pmcrenumber.pl src/pmc/pmc.num
+	$(PERL) $(DEV_TOOLS_DIR)/pmcrenumber.pl src/pmc/pmc.num
 
 ###############################################################################
 #
@@ -2269,7 +2370,6 @@
     src/pmc \
     src/runcore \
     src/string \
-    src/string/charset \
     src/string/encoding \
     $(BUILD_DIR) \
     $(BUILD_DIR)/t/perl \
@@ -2359,7 +2459,7 @@
 install-dev: install
 
 install-bin: installable
-	$(PERL) tools/dev/install_files.pl \
+	$(PERL) $(DEV_TOOLS_DIR)/install_files.pl \
     --buildprefix=$(BUILDPREFIX) \
     --prefix=$(PREFIX) \
     --exec-prefix=$(EXEC_PREFIX) \
@@ -2373,7 +2473,7 @@
     MANIFEST MANIFEST.generated
 
 install-dev-only: installable
-	$(PERL) tools/dev/install_dev_files.pl \
+	$(PERL) $(DEV_TOOLS_DIR)/install_dev_files.pl \
     --buildprefix=$(BUILDPREFIX) \
     --prefix=$(PREFIX) \
     --exec-prefix=$(EXEC_PREFIX) \
@@ -2388,7 +2488,7 @@
     MANIFEST MANIFEST.generated
 
 install-doc:
-	$(PERL) tools/dev/install_doc_files.pl \
+	$(PERL) $(DEV_TOOLS_DIR)/install_doc_files.pl \
     --buildprefix=$(BUILDPREFIX) \
     --prefix=$(PREFIX) \
     --docdir=$(DOC_DIR) \
@@ -2417,7 +2517,7 @@
 	rm parrot-$(VERSION)
 
 win32-inno-installer : world installable
-	$(PERL) tools/dev/mk_inno.pl
+	$(PERL) $(DEV_TOOLS_DIR)/mk_inno.pl
 	$(INNO_SETUP) parrot.iss
 
 ###############################################################################
@@ -2436,7 +2536,7 @@
 src/nci_test$(O): $(PARROT_H_HEADERS) src/nci_test.c
 	$(CC) $(CFLAGS) @optimize::src/nci_test.c@ @ccwarn::src/nci_test.c@ @cc_shared@ -I$(@D) @cc_o_out@$@ -c src/nci_test.c
 
-$(LIBNCI_TEST_SO): src/nci_test$(O) $(LIBPARROT)
+$(LIBNCI_TEST_SO): src/nci_test$(O)
 	$(LD) $(LD_LOAD_FLAGS) @ncilib_link_extra@ $(LDFLAGS) \
     @ld_out@$@ src/nci_test$(O) $(C_LIBS)
 
@@ -2511,7 +2611,7 @@
 	--languages=c,perl --langmap=c:+.h,c:+.pmc,c:+.ops \
 	-I NOTNULL,NULLOK,ARGIN,ARGMOD,ARGOUT,ARGINOUT,ARGIN_NULLOK,ARGOUT_NULLOK,ARGMOD_NULLOK,ARGFREE,ARGFREE_NOTNULL \
 	.
-	$(PERL) $(BUILD_TOOLS_DIR)/addopstags.pl $(OPS_FILES)
+	$(PERL) $(DEV_TOOLS_DIR)/addopstags.pl $(OPS_FILES)
 
 tags.vi.dummy:
 
@@ -2523,12 +2623,12 @@
 CRITIC_FILES = 'lib/Parrot'
 
 perlcritic:
-	perlcritic --profile tools/util/perlcritic.conf $(CRITIC_FILES)
+	perlcritic --profile $(DEV_TOOLS_DIR)/perlcritic.conf $(CRITIC_FILES)
 
 # Andy's extra-cranky Perl::Critic checking for cage cleaners
 cagecritic:
 	@perl -MPerl::Critic::Bangs -e'$$min=q{1.04};die qq{You need Bangs $$min} unless $$Perl::Critic::Bangs::VERSION ge $$min'
-	perlcritic -1 --profile tools/util/perlcritic-cage.conf $(CRITIC_FILES)
+	perlcritic -1 --profile $(DEV_TOOLS_DIR)/perlcritic-cage.conf $(CRITIC_FILES)
 
 # This target will eventually create all the headers automatically.  If you
 # are having problems with linkage in Win32 (or elsewhere), because something

Modified: branches/gsoc_nci/config/gen/platform.pm
==============================================================================
--- branches/gsoc_nci/config/gen/platform.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/gen/platform.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -197,6 +197,7 @@
         exec.c
         misc.c
         hires_timer.c
+        pid.c
         /;
 
     my $plat_c = q{src/platform.c};

Added: branches/gsoc_nci/config/gen/platform/ansi/pid.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/gsoc_nci/config/gen/platform/ansi/pid.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -0,0 +1,50 @@
+/* $Id$
+ * Copyright (C) 2010, Parrot Foundation.
+ */
+
+/*
+
+=head1 NAME
+
+config/gen/platform/ansi/pid.c
+
+=head1 DESCRIPTION
+
+Parrot process id functions.
+
+=head2 Functions
+
+=over 4
+
+=cut
+
+=item C<UINTVAL Parrot_getpid(void)>
+
+Parrot wrapper around standard library C<getpid()> function, returning an UINTVAL.
+
+=cut
+
+*/
+
+UINTVAL
+Parrot_getpid(void)
+{
+    Parrot_warn(NULL, PARROT_WARNINGS_PLATFORM_FLAG, "Parrot_getpid unuseful in this platform");
+    return 0;
+}
+
+
+/*
+
+=back
+
+=cut
+
+*/
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Added: branches/gsoc_nci/config/gen/platform/generic/pid.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/gsoc_nci/config/gen/platform/generic/pid.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -0,0 +1,56 @@
+/* $Id$
+ * Copyright (C) 2010, Parrot Foundation.
+ */
+
+/*
+
+=head1 NAME
+
+config/gen/platform/generic/pid.c
+
+=head1 DESCRIPTION
+
+Parrot process id functions.
+
+=head2 Functions
+
+=over 4
+
+=cut
+
+*/
+
+#include <sys/types.h>
+#include <unistd.h>
+
+/*
+
+=item C<UINTVAL Parrot_getpid(void)>
+
+Parrot wrapper around standard library C<getpid()> function, returning an UINTVAL.
+
+=cut
+
+*/
+
+UINTVAL
+Parrot_getpid(void)
+{
+    return getpid();
+}
+
+
+/*
+
+=back
+
+=cut
+
+*/
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Added: branches/gsoc_nci/config/gen/platform/win32/pid.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/gsoc_nci/config/gen/platform/win32/pid.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -0,0 +1,50 @@
+/* $Id$
+ * Copyright (C) 2010, Parrot Foundation.
+ */
+
+/*
+
+=head1 NAME
+
+config/gen/platform/win32/pid.c
+
+=head1 DESCRIPTION
+
+Parrot process id functions.
+
+=head2 Functions
+
+=over 4
+
+=cut
+
+=item C<UINTVAL Parrot_getpid(void)>
+
+Parrot wrapper around standard library C<getpid()> function, returning an UINTVAL.
+
+=cut
+
+*/
+
+UINTVAL
+Parrot_getpid(void)
+{
+    Parrot_warn(NULL, PARROT_WARNINGS_PLATFORM_FLAG, "Parrot_getpid unuseful in this platform");
+    return 0;
+}
+
+
+/*
+
+=back
+
+=cut
+
+*/
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Modified: branches/gsoc_nci/config/init/hints/mswin32.pm
==============================================================================
--- branches/gsoc_nci/config/init/hints/mswin32.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/init/hints/mswin32.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -98,6 +98,7 @@
             libs                => 'kernel32.lib ws2_32.lib msvcrt.lib oldnames.lib ',
             libparrot_static    => 'libparrot' . $conf->data->get('a'),
             libparrot_shared    => "libparrot$share_ext",
+            ar                  => 'lib',
             ar_flags            => '',
             ar_out              => '-out:',
             slash               => '\\',

Deleted: branches/gsoc_nci/config/inter/charset.pm
==============================================================================
--- branches/gsoc_nci/config/inter/charset.pm	Tue Sep 28 17:16:52 2010	(r49365)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,96 +0,0 @@
-# Copyright (C) 2001-2003, Parrot Foundation.
-# $Id$
-
-=head1 NAME
-
-config/inter/charset.pm - charset files
-
-=head1 DESCRIPTION
-
-Asks the user to select which charset files to include.
-
-=cut
-
-package inter::charset;
-
-use strict;
-use warnings;
-
-use File::Basename qw/basename/;
-
-use base qw(Parrot::Configure::Step);
-
-use Parrot::Configure::Utils ':inter';
-
-
-sub _init {
-    my $self = shift;
-    my %data;
-    $data{description} = q{Which charset files should be compiled in};
-    $data{result}      = q{};
-    return \%data;
-}
-
-my @charsets_defaults =
-    defined( $ENV{TEST_CHARSET} )
-    ? $ENV{TEST_CHARSET}
-    : sort map { basename($_) } glob "./src/string/charset/*.c";
-
-sub runstep {
-    my ( $self, $conf ) = @_;
-
-    my @charset = @charsets_defaults;
-
-    my $charset_list = join ( ' ', grep { defined $_ } @charset );
-
-    if ( $conf->options->get('ask') ) {
-        print <<"END";
-
-
-The following charsets are available:
-  @charset
-END
-        $charset_list = prompt(
-            'Which charsets would you like?',
-            $charset_list
-        );
-    }
-
-    # names of class files for src/pmc/Makefile
-    ( my $TEMP_charset_o = $charset_list ) =~ s/\.c/\$(O)/g;
-
-    my $TEMP_charset_build = <<"E_NOTE";
-
-# the following part of the Makefile was built by 'config/inter/charset.pm'
-
-E_NOTE
-
-    foreach my $charset ( split( /\s+/, $charset_list ) ) {
-        $charset =~ s/\.c$//;
-        $TEMP_charset_build .= <<END
-src/string/charset/$charset\$(O): src/string/charset/$charset.h src/string/charset/ascii.h src/string/charset/$charset.c src/string/charset/tables.h \$(NONGEN_HEADERS)
-
-
-END
-    }
-
-    # build list of libraries for link line in Makefile
-    $TEMP_charset_o =~ s{^| }{ src/string/charset/}g;
-
-    $conf->data->set(
-        charset            => $charset_list,
-        TEMP_charset_o     => $TEMP_charset_o,
-        TEMP_charset_build => $TEMP_charset_build,
-    );
-
-    return 1;
-}
-
-1;
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/gsoc_nci/config/inter/encoding.pm
==============================================================================
--- branches/gsoc_nci/config/inter/encoding.pm	Tue Sep 28 17:16:52 2010	(r49365)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,96 +0,0 @@
-# Copyright (C) 2001-2003, Parrot Foundation.
-# $Id$
-
-=head1 NAME
-
-config/inter/encoding.pm - encoding files
-
-=head1 DESCRIPTION
-
-Asks the user to select which encoding files to include.
-
-=cut
-
-package inter::encoding;
-
-use strict;
-use warnings;
-
-use base qw(Parrot::Configure::Step);
-
-use File::Basename qw/basename/;
-
-use Parrot::Configure::Utils ':inter';
-
-
-sub _init {
-    my $self = shift;
-    my %data;
-    $data{description} = q{Which encoding files should be compiled in};
-    $data{result}      = q{};
-    return \%data;
-}
-
-my @encodings_defaults =
-    defined( $ENV{TEST_ENCODING} )
-    ? $ENV{TEST_ENCODING}
-    : sort map { basename($_) } glob "./src/string/encoding/*.c";
-
-sub runstep {
-    my ( $self, $conf ) = @_;
-
-    my @encodings = @encodings_defaults;
-
-    my $encoding_list = join( ' ', grep { defined $_ } @encodings );
-
-    if ( $conf->options->get('ask') ) {
-        print <<"END";
-
-
-The following encodings are available:
-  @encodings
-END
-        $encoding_list = prompt(
-            'Which encodings would you like?',
-            $encoding_list
-        );
-    }
-
-    # names of class files for src/pmc/Makefile
-    ( my $TEMP_encoding_o = $encoding_list ) =~ s/\.c/\$(O)/g;
-
-    my $TEMP_encoding_build = <<"E_NOTE";
-
-# the following part of the Makefile was built by 'config/inter/encoding.pm'
-
-E_NOTE
-
-    foreach my $encoding ( split( /\s+/, $encoding_list ) ) {
-        $encoding =~ s/\.c$//;
-        $TEMP_encoding_build .= <<END
-src/string/encoding/$encoding\$(O): src/string/encoding/$encoding.h src/string/encoding/$encoding.c src/string/unicode.h \$(NONGEN_HEADERS)
-
-
-END
-    }
-
-    # build list of libraries for link line in Makefile
-    $TEMP_encoding_o =~ s{^| }{ src/string/encoding/}g;
-
-    $conf->data->set(
-        encoding            => $encoding_list,
-        TEMP_encoding_o     => $TEMP_encoding_o,
-        TEMP_encoding_build => $TEMP_encoding_build,
-    );
-
-    return 1;
-}
-
-1;
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Modified: branches/gsoc_nci/config/inter/progs.pm
==============================================================================
--- branches/gsoc_nci/config/inter/progs.pm	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/config/inter/progs.pm	Tue Sep 28 17:16:52 2010	(r49366)
@@ -103,13 +103,16 @@
     $conf->debug("\nccflags: $ccflags\n");
 
     $linkflags = $conf->data->get('linkflags');
-    $linkflags =~ s/-libpath:\S+//g;    # TT #854: No idea why.
+    # Remove the path to the Perl library (from Win32 config).
+    # See TT #854.
+    $linkflags =~ s/-libpath:\S+//g;
     $linkflags = integrate( $linkflags, $conf->options->get('linkflags') );
     $linkflags = prompt( "And flags for your linker?", $linkflags ) if $ask;
     $conf->data->set( linkflags => $linkflags );
 
     $ldflags = $conf->data->get('ldflags');
-    $ldflags =~ s/-libpath:\S+//g;      # TT #854: No idea why.
+    # For substitution below, see comment for $linkflags above.
+    $ldflags =~ s/-libpath:\S+//g;
     $ldflags = integrate( $ldflags, $conf->options->get('ldflags') );
     $ldflags = prompt( "And your $ld flags for building shared libraries?", $ldflags )
         if $ask;

Modified: branches/gsoc_nci/docs/book/pct/ch04_pge.pod
==============================================================================
--- branches/gsoc_nci/docs/book/pct/ch04_pge.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/book/pct/ch04_pge.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -30,12 +30,12 @@
   sub <function_name> { <function_body> }
 
 A grammar is a collection of rules like the ones above that specify all the
-acceptable patterns in a language. Grammars group together these rules in
-much the same way that a groups together related data fields and methods
-N<In languages like Perl 6 for instance, a grammar is just a special kind
-of class and a rule is just a special kind of method.>. Each rule defines
-a pattern for matching one unit of text, and can be made up of various other
-rules which are called recursively to make a complete match.
+acceptable patterns in a language. Grammars group together these rules in much
+the same way that a class groups together related data fields and methods N<In
+languages like Perl 6 for instance, a grammar is just a special kind of class
+and a rule is just a special kind of method.>. Each rule defines a pattern for
+matching one unit of text, and can be made up of various other rules which are
+called recursively to make a complete match.
 
 A rule can contain regular expressions to match patterns of characters:
 

Modified: branches/gsoc_nci/docs/book/pir/ch04_variables.pod
==============================================================================
--- branches/gsoc_nci/docs/book/pir/ch04_variables.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/book/pir/ch04_variables.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -966,17 +966,17 @@
 ways to represent various charsets in memory and on disk.
 
 Every string in Parrot has an associated encoding and character set. The default
-charset is 8-bit ASCII, which is almost universally supported.  Double-quoted
-string constants can have an optional prefix specifying the string's encoding
-and charset.N<As you might suspect, single-quoted strings do not support this.>
+format is 8-bit ASCII, which is almost universally supported.  Double-quoted
+string constants can have an optional prefix specifying the string's
+format.N<As you might suspect, single-quoted strings do not support this.>
 Parrot tracks information about encoding and charset internally, and
 automatically converts strings when necessary to preserve these
-characteristics. Strings constants may have prefixes of the form C<encoding:charset:>.
+characteristics. Strings constants may have prefixes of the form C<format:>.
 
 =begin PIR_FRAGMENT
 
-  $S0 = utf8:unicode:"Hello UTF-8 Unicode World!"
-  $S1 = utf16:unicode:"Hello UTF-16 Unicode World!"
+  $S0 = utf8:"Hello UTF-8 Unicode World!"
+  $S1 = utf16:"Hello UTF-16 Unicode World!"
   $S2 = ascii:"This is 8-bit ASCII"
   $S3 = binary:"This is raw, unformatted binary data"
 
@@ -987,11 +987,10 @@
 X<UCS-2 encoding>
 X<UTF-8 encoding>
 X<UTF-16 encoding>
-Parrot supports the character sets C<ascii>, C<binary>, C<iso-8859-1>
-(Latin 1), and C<unicode> and the encodings C<fixed_8>, C<ucs2>,
-C<utf8>, and C<utf16>.
+Parrot supports the formats C<ascii>, C<binary>, C<iso-8859-1>
+(Latin 1), C<utf8>, C<utf16>, C<ucs2>, and C<ucs4>.
 
-The C<binary> charset treats the string as a buffer of raw unformatted
+The C<binary> format treats the string as a buffer of raw unformatted
 binary data. It isn't really a string per se, because binary data
 contains no readable characters. This exists to support libraries which
 manipulate binary data that doesn't easily fit into any other primitive

Modified: branches/gsoc_nci/docs/embed.pod
==============================================================================
--- branches/gsoc_nci/docs/embed.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/embed.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -298,20 +298,10 @@
 Search the namespace PMC C<namespace> for an object with name C<globalname>.
 Return the object, or NULL if not found.
 
-=item C<Parrot_PMC Parrot_find_global_s(PARROT_INTERP, Parrot_String namespace, Parrot_String name)>
-
-Find and return a global called C<name> in the namespace C<namespace>.  Returns
-C<PMCNULL> if not found.
-
 =item C<void Parrot_ns_store_global(PARROT_INTERP, PMC namespace, Parrot_String name, Parrot_PMC val)>
 
 Store the PMC C<val> into the namespace PMC C<namespace> with name C<globalname>.
 
-=item C<void Parrot_store_global_s(PARROT_INTERP, Parrot_String namespace, Parrot_String name, Parrot_PMC val)>
-
-Sets the value of a global called C<name> in the namespace C<namespace>.  Does
-nothing if the global is not found.
-
 =back
 
 =head3 Lexicals
@@ -539,8 +529,6 @@
 
 =item C<PackFile_destroy>
 
-=item C<PackFile_find_in_const>
-
 =item C<PackFile_fixup_subs>
 
 =item C<PackFile_new>
@@ -569,18 +557,6 @@
 
 =item C<Parrot_char_digit_value>
 
-=item C<Parrot_charset_c_name>
-
-=item C<Parrot_charset_name>
-
-=item C<Parrot_charset_number>
-
-=item C<Parrot_charset_number_of_str>
-
-=item C<Parrot_charsets_encodings_deinit>
-
-=item C<Parrot_charsets_encodings_init>
-
 =item C<Parrot_clear_debug>
 
 =item C<Parrot_clear_flag>
@@ -653,8 +629,6 @@
 
 =item C<Parrot_cx_send_message>
 
-=item C<Parrot_default_charset>
-
 =item C<Parrot_default_encoding>
 
 =item C<Parrot_del_timer_event>
@@ -701,14 +675,8 @@
 
 =item C<Parrot_ex_throw_from_op_args>
 
-=item C<Parrot_find_charset>
-
-=item C<Parrot_find_charset_converter>
-
 =item C<Parrot_find_encoding>
 
-=item C<Parrot_find_encoding_converter>
-
 =item C<Parrot_ns_find_current_namespace_global>
 
 =item C<Parrot_find_global_k>
@@ -717,8 +685,6 @@
 
 =item C<Parrot_ns_find_global_from_op>
 
-=item C<Parrot_find_global_s>
-
 =item C<Parrot_find_language>
 
 =item C<Parrot_find_method_direct>
@@ -749,8 +715,6 @@
 
 =item C<Parrot_gc_mark_PObj_alive>
 
-=item C<Parrot_get_charset>
-
 =item C<Parrot_get_ctx_HLL_namespace>
 
 =item C<Parrot_get_ctx_HLL_type>
@@ -787,8 +751,6 @@
 
 =item C<Parrot_get_runtime_path>
 
-=item C<Parrot_get_runtime_prefix>
-
 =item C<Parrot_get_strreg>
 
 =item C<Parrot_get_vtable>
@@ -931,8 +893,6 @@
 
 =item C<Parrot_load_bytecode>
 
-=item C<Parrot_load_charset>
-
 =item C<Parrot_load_encoding>
 
 =item C<Parrot_load_language>
@@ -945,8 +905,6 @@
 
 =item C<Parrot_make_cb>
 
-=item C<Parrot_make_default_charset>
-
 =item C<Parrot_make_default_encoding>
 
 =item C<Parrot_ns_make_namespace_autobase>
@@ -969,8 +927,6 @@
 
 =item C<Parrot_new_cb_event>
 
-=item C<Parrot_new_charset>
-
 =item C<Parrot_new_encoding>
 
 =item C<Parrot_new_string>
@@ -1183,8 +1139,6 @@
 
 =item C<Parrot_PMC_i_floor_divide_int>
 
-=item C<Parrot_PMC_i_logical_not>
-
 =item C<Parrot_PMC_i_modulus>
 
 =item C<Parrot_PMC_i_modulus_float>
@@ -1241,14 +1195,6 @@
 
 =item C<Parrot_PMC_i_subtract_int>
 
-=item C<Parrot_PMC_logical_and>
-
-=item C<Parrot_PMC_logical_not>
-
-=item C<Parrot_PMC_logical_or>
-
-=item C<Parrot_PMC_logical_xor>
-
 =item C<Parrot_PMC_mark>
 
 =item C<Parrot_PMC_modulus>
@@ -1459,10 +1405,6 @@
 
 =item C<Parrot_regenerate_HLL_namespaces>
 
-=item C<Parrot_register_charset>
-
-=item C<Parrot_register_charset_converter>
-
 =item C<Parrot_register_encoding>
 
 =item C<Parrot_register_HLL>
@@ -1529,22 +1471,16 @@
 
 =item C<Parrot_ns_store_global>
 
-=item C<Parrot_store_global_s>
-
 =item C<Parrot_ns_store_sub>
 
 =item C<Parrot_str_boolean>
 
 =item C<Parrot_str_byte_length>
 
-=item C<Parrot_str_change_charset>
-
 =item C<Parrot_str_change_encoding>
 
 =item C<Parrot_str_chopn>
 
-=item C<Parrot_str_chopn_inplace>
-
 =item C<Parrot_str_compare>
 
 =item C<Parrot_str_compose>
@@ -1555,8 +1491,6 @@
 
 =item C<Parrot_str_downcase>
 
-=item C<Parrot_str_downcase_inplace>
-
 =item C<Parrot_str_equal>
 
 =item C<Parrot_str_escape>
@@ -1595,8 +1529,6 @@
 
 =item C<Parrot_str_new_constant>
 
-=item C<Parrot_str_new_COW>
-
 =item C<Parrot_str_new_init>
 
 =item C<Parrot_str_new_noinit>
@@ -1609,20 +1541,12 @@
 
 =item C<Parrot_str_replace>
 
-=item C<Parrot_str_resize>
-
-=item C<Parrot_str_reuse_COW>
-
-=item C<Parrot_str_set>
-
 =item C<Parrot_str_split>
 
 =item C<Parrot_str_substr>
 
 =item C<Parrot_str_titlecase>
 
-=item C<Parrot_str_titlecase_inplace>
-
 =item C<Parrot_str_to_cstring>
 
 =item C<Parrot_str_to_hashval>
@@ -1637,10 +1561,6 @@
 
 =item C<Parrot_str_upcase>
 
-=item C<Parrot_str_upcase_inplace>
-
-=item C<Parrot_str_write_COW>
-
 =item C<Parrot_sub_new_from_c_func>
 
 =item C<Parrot_test_debug>
@@ -1681,20 +1601,14 @@
 
 =item C<PObj_custom_mark_SET>
 
-=item C<string_capacity>
-
 =item C<string_chr>
 
 =item C<string_make>
 
-=item C<string_make_from_charset>
-
 =item C<string_max_bytes>
 
 =item C<string_ord>
 
-=item C<string_primary_encoding_for_representation>
-
 =item C<string_rep_compatible>
 
 =item C<string_to_cstring_nullable>

Modified: branches/gsoc_nci/docs/parrothist.pod
==============================================================================
--- branches/gsoc_nci/docs/parrothist.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/parrothist.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -11,7 +11,7 @@
 Simon Cozens, Jeff Goff, Steve Fink, Leo Toetsch, Chip Salzenberg, Jerry Gay,
 Patrick Michaud, Will "coke" Coleda, Matt Diephouse, chromatic, Allison Randal,
 Jonathan Worthington, Bob Rogers, Bernhard Schmalhofer, Andrew Whitworth,
-Francois Perrad, Jonathan Leto.
+Francois Perrad, Jonathan Leto, Michael Hind.
 
 
 =head1 THE RECORDS
@@ -112,5 +112,7 @@
  Gerd        2.5.0          2010-Jun-15     "Cheops"
 
  coke        2.6.0 *        2010-Jul-20     "Red-rumped"
+ mikehh      2.7.0          2010-Aug-17     "Australian King"
+ Gerd        2.8.0          2010-Sep-21     "Tui Parakeet"
 
 =cut

Deleted: branches/gsoc_nci/docs/pdds/draft/pdd31_hll_interop.pod
==============================================================================
--- branches/gsoc_nci/docs/pdds/draft/pdd31_hll_interop.pod	Tue Sep 28 17:16:52 2010	(r49365)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,606 +0,0 @@
-# Copyright (C) 2008-2010, Parrot Foundation.
-# $Id$
-
-=head1 [DRAFT] PDD 31: Inter-Language Calling
-
-=head2 Abstract
-
-This PDD describes Parrot's conventions and support for communication between
-high-level languages (HLLs).  It is focused mostly on what implementors should
-do in order to provide this capability to their users.
-
-=head2 Version
-
-$Revision$
-
-=head2 Description
-
-The ability to mix different high-level languages at runtime has always been
-an important design goal of Parrot.  Another important goal, that of
-supporting all dynamic languages, makes language interoperability especially
-interesting -- where "interesting" means the same as it does in the Chinese
-curse, "May you live in interesting times."  It is expected that language
-implementers, package authors, and package users will have to be aware of
-language boundaries when writing their code.  It is hoped that this will not
-become too burdensome.
-
-None of what follows is binding on language implementors, who may do whatever
-they please.  Nevertheless, we hope they will at least follow the spirit of
-this document so that the code they produce can be used by the rest of the
-Parrot community, and save the fancy footwork for intra-language calling.
-However, this PDD B<is> binding on Parrot implementors, who must provide a
-stable platform for language interoperability to the language implementors.
-
-=head3 Ground rules
-
-In order to avoid N**2 complexity and the resulting coordination headaches,
-each language compiler provides an interface as a target for other languages
-that should be designed to require a minimum of translation.  In the general
-case, some translation may be required by both the calling language and the
-called language:
-
-{{ There seems to be an implied basic assumption here that language
-interoperability is the responsibility of the language implementor. It is not.
-We cannot require that language implementors design and implement their
-languages according to some global specification. Any interoperability
-infrastructure must be provide by Parrot, and must work for all languages.
---allison }}
-
-        |
-        |
-        |                        Calling sub
-        |                             |
-        |   Language X                |
-        |                             V
-        |                        Calling stub
-        +================             |
-                                      |
-          "plain Parrot"              |
-                                      |
-        +================             |
-        |                              V
-        |                        Called wrapper
-        |                             |
-        |                             |
-        |   Language Y                V
-        |                         Called sub
-        |
-
-Where necessary, a language may need to provide a "wrapper" sub to interface
-external calls to the language's internal calling and data representation
-requirements.  Such wrappers are free to do whatever translation is required.
-
-Similarly, the caller may need to emit a stub that converts an internal call
-into something more generic.
-
-{{ Of course, "stub" is really too close to "sub", so we should find a better
-word.  Doesn't the C community call these "bounce routines"?  Or something?
--- rgr, 31-Jul-08.
-
-The language will never provide a wrapper for its subs. For the most part,
-wrappers will be unnecessary. Where a wrapper is desired to make a library
-from some other language act more like a "native" library, the person who
-desires the native behavior can implement the wrapper and make it publicly
-available.  --allison }}
-
-{{ I am discovering that there are five different viewpoints here,
-corresponding to the five layers (including "plain Parrot") of the diagram
-above.  I need to make these viewpoints clearer, and describe the
-responsibilities of each of these parties to each other.  -- rgr, 31-Jul-08.
-}}
-
-Languages are free to implement the stub and wrapper layers (collectively
-called "glue") as they see fit.  In particular, they may be inlined in the
-caller, or integral to the callee.
-
-Ideally, of course, the "plain Parrot" layer will be close enough to the
-semantics of both languages that glue code is unnecessary, and the call can be
-made directly.  Language implementors are encouraged to dispense with glue
-whenever possible, even if glue is sometimes required for the general case.
-
-In summary:
-
-=over 4
-
-=item *
-
-Each HLL gets its own namespace subtree, within which C<get_hll_global> and
-C<set_hll_global> operate.  In order to make external calls, the HLL must
-provide a means of identifying the language, the function, and enough
-information about the arguments and return values for the calling language to
-generate the call correctly.  This is necessarily language-dependent, and is
-beyond the scope of this document.
-
-=item *
-
-When calling across languages, both the caller and the callee should try to
-use "plain Parrot semantics" to the extent possible.  This is explained in
-more detail below, but essentially means to use the simplest calling
-conventions and PMC classes possible.  Ideally, if an API uses only PMCs that
-are provided by a "bare Parrot" (i.e. one without any HLL runtime code), then
-it should be possible to use this API from any other language.
-
-{{ This is unnecessarily restrictive --allison }}
-
-=item *
-
-It is acceptable for languages to define subs for internal calling that are
-not suitable for external calling.  Such subs should be marked as such, and
-other languages should respect those distinctions.  (Or, if they choose to
-call intra-language subs, they should be very sure they understand that
-language's calling conventions.
-
-{{ It's not possible to define a sub that can't be called externally
---allison }}
-
-=back
-
-=head2 Half-Baked Ideas
-
-{{ Every draft PDD should have one of these.  ;-}  -- rgr, 28-Jul-08.  }}
-
-=head3 Common syntax for declaring exported functions?
-
-I assume we will need some additional namespace support.  Not clear yet
-whether it's better to mark the ones that or OK for external calling, or the
-ones that are not.
-
-(As you can guess, I don't have a strong suggestion for what to call these
-functions yet.  Do we call them "external"?  Would that get confused with
-intra-language public interfaces?)
-
-Beyond that, we probably need additional metainformation on the external subs
-so that calling compilers will know what code to emit.  Putting them on the
-subs means that the calling compiler just needs to load the PBC in order to
-access the module API (though it may need additional hints).  Of course, that
-also requires a PIR API for accessing this metainformation . . .
-
-{{ Exporting is very much a Perl idea, not much applicability for exporting
-outside of Perl. --allison}}
-
-Crazy idea:  This is more or less the same information (typing) required for
-multimethods.  If we encourage the export of multisubs, then the exporting
-language could provide multiple interfaces, and the calling compiler could
-query the set of methods for the one most suitable.
-
-{{ Proposal rejected, because we aren't going with "external" and "internal"
-subroutine variants, so it's not needed. --allison }}
-
-=head3 More namespace complexity?
-
-{{ Proposal rejected, because we aren't going with "external" and "internal"
-subroutine variants, so it's not needed. --allison }}
-
-It might be good to have some way for HLLs to define a separate external
-definition for a given sub (i.e. one that provides the wrapper) that can be
-done without too much namespace hair.  I.e.
-
-        .sub foo :extern
-
-defines the version that is used by interlanguage calling, and
-
-        .sub foo
-
-defines the version that is seen by other code written in that language
-(i.e. via C<get_hll_global>).  If there is no plain C<foo>, the C<:extern>
-version is used for internal calls.  That way, the compiler can emit both
-wrapper code and internal code without having to do anything special (much),
-even if different calling conventions and/or data conversions are required.
-
-{{ Of course, this wouldn't be necessary if all external subs were multisubs.
--- rgr, 31-Jul-08. }}
-
-=head3 Multiple type hierarchies?
-
-Different languages will have to "dress up" the Parrot type/class hierarchy
-differently.  For example, Common Lisp specifies that C<STRING> is a subtype
-of C<VECTOR>, which in turn is a subtype of C<ARRAY>.  This is not likely to
-be acceptable to other languages, so Lisp needs its own view of type
-relationships, which must affect multimethod dispatch for Lisp generic
-functions, i.e. a method defined for C<VECTOR> must be considered when passed
-a string as a parameter.
-
-{{ Common Lisp (for example) will have its own set of type relationships,
-because it will have its own set of types. There will be no "remapping" of
-core types --allison }}
-
-The language that owns the multisub gets to define the type hierarchy and
-dispatch rules used when it gets called.  In order to handle objects from
-foreign languages, the "owning" language must decide where to graft the
-foreign class inheritance graph into its own graph.  {{ It would be nice if
-some Parrot class, e.g. C<Object>, could be defined as the conventional place
-to root language-specific object class hierarchies; that way, a language would
-only have to include C<Object> in order to incorporate objects from all other
-conforming languages.  -- rgr, 26-Aug-08. }}
-
-{{ The language that owns the multisub does get to define the dispatch rules
-for the multisub. But, it doesn't get to alter the type hierarchy of objects
-from other languages. --allison }}
-
-Note that common Parrot classes will in general appear in different places in
-different languages' dispatch hierarchies, so it is important to bear in mind
-which language "owns" the dispatch.
-
-{{ Absolutely not true. --allison }}
-
-=head2 Definitions
-
-{{ Collect definitions of new jargon words here, once we figure out what they
-should be.  -- rgr, 29-Jul-08. }}
-
-=head2 Implementation
-
-=head3 Plain Parrot Semantics
-
-Fortunately, "plain Parrot" is pretty powerful, so the "common denominator" is
-not in fact the lowest possible.  For example, not all Parrot languages
-support named, optional, or repeated arguments.  For the called language, this
-is never a problem; calling module can only use the subset API anyway.
-Implementers of subset calling languages are encouraged to provide their users
-with an extended API for the interlanguage call; typically, this is only
-required for named arguments.
-
-{{ This needs more?  -- rgr, 28-Jul-08. }}
-
-=head3 Strings
-
-    {{ I am probably not competent to write this section.  At the very least,
-    it requires discussion of languages that expect strings to be mutable
-    versus . . . Java.  -- rgr, 28-Jul-08. }}
-
-=head3 Other scalar data types
-
-All Parrot language implementations should stick to native Parrot PMC types
-for scalar data, except in case of dire need.  To see with this is so, take
-the particular case of integer division, which differs significantly between
-languages.
-
-{{ No, this is completely backwards. Languages are heartily encouraged to
-create their own PMCs for any and all common variable types found in the
-language. --allison }}
-
-In Tcl, "the integer three divided by the integer five" produces the integer
-value 0.
-
-In Perl 5 and Lua, this division produces the floating-point value 0.6.  (This
-happens to be Parrot's native behavior as well.)
-
-In Common Lisp, this division produces "3/5", a number of type C<RATIO> with
-numerator 3 and denominator 5 that represents the mathematically-exact result.
-
-Furthermore, no Perl 5 code, when given two integers to divide, will expect a
-Common Lisp ratio as a result.  Any Perl 5 implementation that does this has a
-bug, even if both those integers happen to come from Common Lisp.  Ditto for a
-floating-point result from Common Lisp code that happens to get two integers
-from Perl or Lua (or both!).
-
-{{ Not a bug, it's the expected result. Divide operations are
-multi-dispatched.  If you pass two Common Lisp integers into a divide
-operation in Perl 5, it'll search for the best matching multi, and if it finds
-one for Common Lisp integers (an exact match), it'll run that and return a
-Common Lisp ratio.  --allison }}
-
-Even though these languages all use "/" to represent division, they do not all
-mean the same thing by it, and similarly for most (if not all) other built-in
-arithmetic operators.  However, they pretty clearly B<do> mean the same thing
-by (e.g.) "the integer with value five," so there is no need to represent the
-inputs to these operations differently; they can all be represented by the
-same C<Integer> PMC class.
-
-{{ The whole point of having sets of PMCs in different languages is to handle
-the case where "it's an integer, but has a different division operation than
-other languages" --allison}}
-
-{{ Must also discuss morphing:  If some languages do it and other do not, then
-care must be taken at the boundaries.  -- rgr, 31-Jul-08. }}
-
-=head4 Defining new scalar data types
-
-There will be cases where existing Parrot PMC classes cannot represent a
-primitive HLL scalar type, and so a new PMC class is required.  In this case,
-interoperability cannot be guaranteed, since it may not be possible to define
-behavior for such objects in other languages.  But the choice of a new PMC is
-forced, so we must make the best of it.
-
-{{ Yes, except this is the common case, and interoperability will still work
---allison }}
-
-A good case in point is that of complex rational numbers in Common Lisp.  The
-C<Complex> type provided by Parrot assumes that its components are
-floating-point numbers.  This is a suitable representation type for C<(COMPLEX
-REAL)>, but CL partitions "COMPLEX" into C<(COMPLEX REAL)> and C<(COMPLEX
-RATIONAL)>, with the latter being further divided into C<(COMPLEX RATIO)>,
-C<(COMPLEX INTEGER)>, etc.  The straightforward way to provide this
-functionality is to define a C<ComplexRational> PMC that is built on
-C<Complex> and has real and imaginary PMC components that are constrained to
-be Integer, Bigint, or Ratio PMCs.
-
-So how do we make C<(COMPLEX RATIONAL)> arithmetic work as broadly as
-possible?
-
-The first aspect is defining how the new type actually works within its own
-language.  The Lisp arithmetic operators will usually return a ComplexRational
-if given one, but need to return a RATIONAL subtype if the imaginary part is
-zero, and that may not be suitable for other languages, so Lisp needs its own
-set of basic arithmetic operators.  We must therefore define methods on these
-multis that specialize ComplexRational (and probably the generic arithmetic to
-redispatch on the type of the real and imaginary parts; you know the drill).
-But, in case we are also passed another operand that is another language's
-exotic type, we should take care to use the most general possible class to
-specialize the other operands, in the hope that other exotics are subclasses
-of these.
-
-{{ It is perfectly fine for a Lisp arithmetic operator to return a RATIONAL
-subtype. Please don't define methods for a pile of operations that already
-have vtable functions --allison }}
-
-The other aspect is extending other languages' arithmetic to do something
-reasonable with our exotic types.  If we're lucky, Parrot will provide a basic
-multisub that takes care of most cases, and we just need to add method(s) to
-that.  If not, we will have to add specialized methods on the other language's
-multisub, trying to redispatch to the other language's arithmetic ops passing
-the (hopefully more generic) component PMCs.  Doing so is still the
-responsibility of the language that defines the exotic class, since it is in
-charge of its internal representation.
-
-{{ The default multi for a common operation like division will call the PMC's
-C<get_number> vtable function, perform a standard division operation, and
-return a standard Integer/Number/BigNum. --allison }}
-
-{{ We can define multimethods on another language without loading it, can't
-we?  If not, then making this work may require negotiation between language
-implementors, if it is feasible at all.  -- rgr, 31-Jul-08. }}
-
-{{ I'm not sure what you mean by defining multimethods on another language.
-Perhaps you're asking if it's possible to declare a multisub for a type that
-doesn't exist yet?  --allison }}
-
-This brings us to a number of guidelines for defining language-specific
-arithmetic so as to maximize interoperability:
-
-=over 4
-
-=item 1.
-
-Define language-specific operations using multimethods (to avoid conflict with
-other languages).
-
-{{ Clarify? How would non-multi's conflict?  --allison }}
-
-=item 2.
-
-Define them on the highest (most general) possible PMC classes (in order that
-they continue to work if passed a subclass by a call from a different
-language).
-
-{{ Define them on the class that makes sense. There's no point in targeting
-any particular level of the inheritance hierarchy. --allison }}
-
-=item 3.
-
-Don't define a language-specific PMC class unless there is clear need for a
-different internal representation.  (And even then, you might consider
-donating it to become part of the Parrot core.)
-
-{{ This is definitely not true. --allison }}
-
-=back
-
-{{ The fundamental rule is to implement your language in the way that makes
-the most sense for your language. Language implementors don't have to think
-about interoperability. --allison }}
-
-The rest of this section details exceptions and caveats in dealing with scalar
-data types.
-
-=head4 "Fuzzy" scalars
-
-Some languages are willing to coerce strings to numbers and vice versa without
-any special action on the part of the programmer and others are not.  The
-problem arises when such "fuzzy" scalars are passed (or returned) to languages
-that do not support "fuzzy" coercion . . .
-
-{{ This section is meant to answer Geoffrey's "What does Lisp do with a Perl 5
-Scalar?" question.  I gotta think about this more.  -- rgr, 29-Jul-08.  }}
-
-{{ The scalar decides when to morph, not the language. All the languages that
-have morphing scalars implement them in such a way that they know how to
-handle, for example, morphing when a string value is assigned to an integer
-scalar, and what to do if that value is later used as an integer again.
---allison }}
-
-=head4 C<Complex> numbers
-
-Not all languages support complex numbers, so if an exported function requires
-a complex argument, it should either throw a suitable error, or coerce an
-acceptable numeric argument.  In the latter case, be sure to advertise this in
-the documentation, so that callers without complex numbers can tell their
-compiler that acceptable numeric type.
-
-{{ All documentation for a library should state what argument types it accepts
-and what results it returns, there's nothing unique about complex numbers.
---allison }}
-
-=head4 C<Ratio> numbers
-
-Not all languages support ratios (rather few, actually), so if an exported
-function requires a ratio as an argument, it should either throw a suitable
-error, or convert an acceptable numeric value.
-
-However, since ratios are rare (and it is rather eccentric for a program to
-insist on a ratio as a parameter), it is strongly advised to accept a floating
-point or integer value, and convert it in the wrapper.
-
-{{ All documentation for a library should state what argument types it accepts
-and what results it returns, there's nothing unique about ratios. --allison }}
-
-
-    {{ Parrot does not support these yet, so this is not a current issue.  --
-    rgr, 28-Jul-08. }}
-
-=head3 Aggregate data types
-
-{{ I probably haven't done these issues justice; I don't know enough Java or
-Tcl to grok this part of the list discussion.  -- rgr, 28-Jul-08. }}
-
-Aggregates (hashes, arrays, and struct-like thingies) can either be passed
-directly, or mapped by wrapper or caller code into something different.  The
-problem with mapping, besides being slow, is that if I<either> the caller or
-the callee does this, the aggregate is effectively read-only.  (It is possible
-for the wrapper to stuff the changes back in the original structure by side
-effect, but this has its own set of problems.)
-
-{{ Mapping is generally discouraged, but I don't see any reason it would make
-the aggregate read-only. You can certainly convert a Python dictionary to a
-Perl hash, use it in your Perl code, and then either return it as a Perl hash,
-or convert it back to a Python dictionary. --allison }}
-
-In other words, if the mapping is not straightforward, it may not be possible.
-If the mapping C<is> straightforward it may not be necessary -- and an
-unnecessary mapping may limit use of the called module's API.
-
-Struct-like objects are problematic.  They are normally considered as
-low-level and language-specific, and handled by emitting special code for slot
-accessor/setter function, which other language compilers won't necessarily
-know how to do.  The choices are therefore to (a) treat them like black boxes
-in the other language, or (b) provide a separate functional or OO API (or
-both) for calling from other languages.
-
-{{ (a) is generally preferred --allison }}
-
-Several questions arise for languages with multiple representations for
-aggregate types.  Typically, this is because these types are more restricted
-in some fashion.  [finish.  -- rgr, 29-Jul-08.]
-
-{{ Not clear where you're going with this --allison }}
-
-=head3 Functional data types
-
-In a sense, functional types (i.e. callable objects) are the easiest things to
-pass across languages, since they require no mapping at all.  On the other
-hand, if a language doesn't support functional arguments, then there is no
-hope of using an API written in another language that requires them.
-
-{{ Hmmm? They're just subs, how would they not be callable from another
-language? --allison }}
-
-=head3 Datum vs. object
-
-Some languages present everything to the programmer as an object; in such
-languages, code only exists in methods.  A few languages have no methods, only
-functions (and/or subroutines) and "passive" data.  The remainder have both,
-and pose no problem calling into the others.
-
-But how does an obligate OO language call a non-OO language, or vice versa?
-An extreme case would be Ruby (which has only objects) and Scheme (which (as
-far as Ruby is concerned) has none).  What good is a Ruby object as a datum to
-a Scheme program if Scheme can't access any of the methods?  Similarly, what
-could Ruby do with a Scheme list when it can't even get to the Scheme C<car>
-function?
-
-{{ Except that Ruby would never even get a Scheme list in the first place if
-it hadn't loaded a Scheme library of some sort. And, being a list, the Scheme
-list would still support the standard vtable functions for lists. --allison }}
-
-{{ Methinks the right thing would be to define a common introspection API (a
-good thing in its own right).  Scheme and Ruby should each define their own
-implementation of the same in "plain Parrot semantics" terms, independently.
-The caller can then use his/her language's binding of the introspection API to
-poke around in the other module, and find the necessary tools to call the
-other.  For Scheme, this would mean functions for finding Ruby classes and
-providing functional wrappers around methods.  For Ruby, I admit this would
-probably be even weirder.  In any case, it is important that the calling user
-not need anything out of the ordinary, from either language or the called
-module author.  -- rgr, 29-Jul-08. }}
-
-{{ There is a common introspection API, the 'inspect' vtable function. But
-what you're describing here isn't introspection, it's actually the standard
-vtable functions.  --allison }}
-
-=head4 Defining methods across language boundaries
-
-{{ Is the term "unimethod" acceptable here?  -- rgr, 29-Jul-08.  They're just
-methods or subroutines, and it's just "single dispatch". --allison}}
-
-There will be cases where a module user wants to extend that module by
-defining a new method on an externally-defined class, or add a multimethod to
-an externally-defined multisub.  Since a class with unimethod dispatch belongs
-wholly to the external language, the calling language (i.e. the one adding the
-method) must use the semantics of the external language.  If the external
-language uses a significantly different metamodel, simply adding the
-C<:method> pragma may not cut it.
-
-{{ No, the C<:method> flag is always all you need to define a method. The
-class object you add the method to determines what it does with that method.
---allison }}
-
-There are two cases:  (1) The calling language is adding a new method, which
-cannot therefore interfere with existing usage in the called language; and (2)
-the calling language is attempting to extend an existing interface provided by
-the called language.  In the first case, the calling compiler has the option
-of treating the new method as part of the calling language, and dispensing
-with the glue altogether.  In the second case, the compiler must treat the new
-method as part of the foreign language, and provide B<both> glue layers (as
-necessary) around it.  It is therefore not expected that all compilers will
-provide a way to define methods on all foreign classes for all language pairs.
-
-{{ These should generally be handled by subclassing the parent language class,
-and adding your method to the subclass. Monkeypatching is certainly possible,
-but not encouraged. And, there really isn't any distinction between "treating
-the new method as part of the calling language" and "treat[ing] the new method
-as part of the foreign language". It's a method, you call it on an object, the
-class of the object determines how it's found and invoked. --allison }}
-
-Multimethods are easier; although the multisub does belong conceptually to one
-language (from whose namespace the caller must find the multisub), multis are
-more loosely coupled to their original language.
-
-{{ Well, the semantics of the language that defined the multisub also
-determine how it is found and invoked. --allison }}
-
-The cases for multimethods are similar, though:  (1) If the calling language
-method is specialized to classes that appear only in the calling module, then
-other uses of the multisub will never call the new method, and the calling
-language can choose to treat as internal.  (2) If the calling method is
-specialized only on Parrot or called-language classes, then the compiler
-should take care to make it generally usable.
-
-{{ Not sure what you mean here. --allison }}
-
-=head4 Subclassing across language boundaries
-
-{{ This is an important feature, but requires compatible metamodels.  -- rgr,
-29-Jul-08.
-
-Or Proxy PMCs, which is how we're currently handling inheritance across
-metamodel boundaries. --allison
-}}
-
-=head4 Method vs. multimethod
-
-{{ This is the issue where some languages (e.g. Common Lisp) use only
-multimethods, where others (e.g. Ruby) use only unimethods.  (S04 says
-something about MMD "falling back" to unimethods, but so far this is not
-described in Parrot.)  Calling is easy; multimethods look like functions, so
-the MM language just has to create a function (or MM) wrapper for the UM
-language, and a UM language can similarly treat a MM call as a normal function
-call.  (Which will require the normal "make the function look like a method"
-hack for obligate OO languages like Ruby.)  Defining methods across the
-boundary is harder, and may not be worth the trouble.  -- rgr, 29-Jul-08. }}
-
-{{ That's "multiple dispatch" and "single dispatch". In general, defining code
-in one language and injecting it into the namespace of another language isn't
-the primary focus of language interoperability. Using libraries from other
-languages is. --allison }}
-
-=head2 References
-
-None.
-
-=cut
-
-__END__
-Local Variables:
-  fill-column:78
-End:
-vim: expandtab shiftwidth=4:

Modified: branches/gsoc_nci/docs/pdds/pdd09_gc.pod
==============================================================================
--- branches/gsoc_nci/docs/pdds/pdd09_gc.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/pdds/pdd09_gc.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -5,7 +5,8 @@
 
 =head2 Abstract
 
-This PDD specifies Parrot's garbage collection subsystems.
+This PDD specifies Parrot's garbage collection and memory management
+subsystems.
 
 =head2 Version
 
@@ -19,14 +20,15 @@
 the interpreter, by determining which objects will not be referenced again and
 can be reclaimed.
 
-=head3 Simple mark
+=head3 Mark and sweep (MS)
 
-All reachable objects are marked as alive, first marking a root set, and then
-recursively marking objects reachable from other reachable objects. Objects
-not reached are considered dead. After collection, all objects are reset to
-unmarked, and the process starts again.
+Starting from a known root set, the GC traces all reachable memory objects by
+following pointers. Objects reached in this way, and therefore visible for
+use by the program, are alive. Objects which are not reached in the trace are
+marked dead. In the second stage, sweep, all dead objects are destroyed and
+reclaimed.
 
-=head3 Tri-color mark
+=head3 Tri-color mark and sweep
 
 Instead of a simple separation of marked (as live) and unmarked (dead), the
 object set is divided into three parts: white, gray, and black. The white
@@ -44,30 +46,27 @@
 The advantage of a tri-color mark over a simple mark is that it can be broken
 into smaller stages.
 
-=head3 Mark-and-sweep
-
-In this GC scheme, after all reachable objects are marked as live, a sweep
-through the object arenas collects all unmarked objects.
-
 =head3 Copying collection
 
-In this scheme, live objects are copied into a new memory region. The entire
-old memory region can then be reclaimed.
+A copying GC copies objects from one memory region to another during the mark
+phase. At the end of the mark, all memory in the old region is dead and the
+whole region can be reclaimed at once.
 
 =head3 Compacting collection
 
-In this scheme, live objects are moved closer together, eliminating fragments
-of free space between live objects. This compaction makes later allocation of
-new objects faster, since the allocator doesn't have to scan for fragments of
-free space.
-
-=head3 Reference counting
-
-In this scheme, all objects have a count of how often they are referred to by
-other objects. If that count reaches zero, the object's memory can be
-reclaimed. This scheme doesn't cope well with reference loops--loops of dead
-objects, all referencing one another but not reachable from elsewhere, never
-get collected.
+The compacting GC moves live objects close together in a single region in
+memory. This helps to elimianate fragmented free space and allows the
+allocation of large live objects. Compacting and copying collectors are often
+similar or even identical in implementation.
+
+=head3 Uncooperative
+
+An uncooperative GC is implemented as a separate module, often without
+affecting the remainder of the program. The programmer can write software
+without needing to be aware of the operations or implementation of the GC.
+The alternative is a cooperative GC, which is often implemented as a reference
+counting scheme and requires GC-related logic to be dispersed throughout the
+entire program.
 
 =head3 Stop-the-world
 
@@ -79,9 +78,10 @@
 
 =head3 Incremental
 
-Rather than suspending the system for marking and collection, GC is done in
-small increments intermittent with normal program operation. Some
-implementations perform the marking as part of ordinary object access.
+In order to alleviate the arbitrarily long pauses in a stop-the-world GC, the
+incremental GC breaks the mark and sweep process up into smaller, shorter
+phases. Each GC phase may still require the entire program to pause, but the
+pauses are shorter and more frequent.
 
 =head3 Real-time
 
@@ -91,13 +91,8 @@
 
 The object space is divided between a young generation (short-lived
 temporaries) and one or more old generations. Only young generations are reset
-to white (presumed dead). Avoiding scanning the old generations repeatedly can
-considerably speed up GC.
-
-Generational collection does not guarantee that all unreachable objects will
-be reclaimed, so in large systems it is sometimes combined with a
-mark-and-sweep or copying collection scheme, one for light collection runs
-performed frequently, and the other for more complete runs performed rarely.
+to white (presumed dead). The older generations are scanned less often because
+it is assumed that long-lived objects tend to live longer.
 
 =head3 Concurrent
 
@@ -105,47 +100,47 @@
 threads participating in GC. On a multi-processor machine, concurrent GC may
 be truly parallel.
 
+=head3 Conservative
+
+A conservative GC traces through memory looking for pointers to living
+objects. The GC does not necessarily have information about the layout of
+memory, so it cannot differentiate between an actual pointer and an integral
+value which has the characteristics of a pointer. The Conservative GC follows
+a policy of "no false negatives" and traces any value which appears to be a
+pointer.
+
+=head3 Precise
+
+A precise GC has intimate knowledge of the memory layout of the system and
+knows where to find pointers. In this way the precise collector never has
+any false positives.
+
 =head2 Synopsis
 
 Not applicable.
 
 =head2 Description
 
-=over 4
-
-=item - Parrot provides swappable garbage collection schemes. The GC scheme
-can be selected at configure/compile time.  The GC scheme cannot be changed
-on-the-fly at runtime, but in the future may be selected with a command-line
-option at execution time.
-
-=item - All live PMCs must be reachable from the root set of objects in the
-interpreter.
-
-=item - Garbage collection must be safe for objects shared across multiple
-interpreters/threads.
-
-=item - The phrase "dead object detection" and abbreviation "DOD" are
-deprecated.
-
-=back
+No GC algorithm is ideal for all workloads. To support multiple workloads,
+Parrot provides support for pluggable uncooperative GC cores. Parrot will
+attempt to provide a default core which has reasonable performance for most
+programs. Parrot provides no built-in support for cooperative GCs.
+
+Parrot uses two separate memory allocation mechanisms: a fixed-size system for
+small objects of fixed size (PMC and STRING headers, etc), and a buffer
+allocator for arbitrary-sized objects, such as string contents. The default
+fixed-size memory allocator uses a SLAB-like algorithm to allocate objects
+from large pre-allocated pools. The default buffer allocator uses a compacting
+algorithm.
 
 =head2 Implementation
 
-Parrot supports pluggable garbage collection cores, so ultimately any garbage
-collection model devised can run on it. However, different GC models are more
-or less appropriate for different application areas. The current default
-stop-the-world mark-and-sweep model is not well suited for concurrent/parallel
-execution. We will keep the simple mark-and-sweep implementation, but it will
-no longer be primary.
+Parrot supports pluggable garbage collection cores, so ultimately any
+uncooperative garbage collection model devised can run on it.
 
 Parrot really has two independent GC models, one used for objects (PMCs) and
 the other used for buffers (including strings). The core difference is that
 buffers cannot contain other buffers, so incremental marking is unnecessary.
-Currently, PMCs are not allowed to move after creation, so the GC model used
-there is not copying nor compacting.
-
-The primary GC model for PMCs, at least for the 1.0 release, will use a
-tri-color incremental marking scheme, combined with a concurrent sweep scheme.
 
 =head3 Terminology
 
@@ -153,134 +148,228 @@
 dead (the "trace" or "mark" phase) and freeing dead objects for later reuse
 (the "sweep" phase). The sweep phase is also known as the collection phase.
 The trace phase is less frequently known as the "dead object detection" phase.
-The use of the term "dead object detection" and its acronym DOD has been
-deprecated.
 
-=head3 Initial Marking
+=head3 Marking
+
+Each PMC and STRING has a C<flags> member which is a bitfield of various
+flags. Three flags in particular are important for GC operation.
+C<PObj_live_FLAG> is set if the object is currently alive and active.
+C<PObj_on_free_list_FLAG> is set if the object is currently on the free list
+and is available for reallocation. A third flag, C<PObj_grey_FLAG> can be used
+to support tricolor mark. Despite the given names of these flags, they can be
+used by the active GC core for almost any purpose, or they can be ignored
+entirely if the GC provides another mechanism for marking the various life
+stages of the object. These flags are typically not used outside the GC
+subsystem.
+
+=head4 Special PMCs
+
+=head4 Root Set
+
+The root set for the GC mark is the interpreter object and, if necessary,
+the C system stack. If the C system stack is traced, the GC is conservative.
+
+=head4 Initiating a mark and sweep
+
+Depending on the core in use, the mark and sweep phases may be initiated in
+different ways. A concurrent core would always be running in the background.
+The most common mechanism for a non-concurrent core is to initiate a run of
+the GC system when an attempt is made to allocate
+
+=head4 Object marking
+
+To mark a PMC, the C<Parrot_gc_mark_pmc_alive> function is called. To mark a
+STRING, the C<Parrot_gc_mark_string_alive> function is called. These functions
+mark the object alive, typically by setting the C<PObj_live_FLAG> flag.
+
+If the PMC contains references to other PMCs and STRINGS, it must have the
+C<PObj_custom_mark_FLAG> flag set. If this flag is set, the C<mark> VTABLE
+for that PMC is called to mark the pointers in that PMC. The custom_mark flag
+is ignored in STRINGs.
+
+=head4 Buffer Marking
+
+Buffers are always attached to a fixed-size header, or several headers. During
+the mark phase of the fixed-size objects, owned buffers are flagged as alive.
+At somet time after the fixed-size objects are marked, the buffer pool is
+compacted by moving all alive buffers to a new pool and then freeing the old
+pool back to the operating system.
+
+=head3 Collection
+
+When all objects have been marked, the collection phase begins.
+
+=head4 Collecting objects
+
+During the sweep phase, objects which had previously been alive but were not
+traced in the most recent mark phase are dead and are collected. If the
+C<PObj_custom_destroy_FLAG> is set on a PMC, the GC will call the C<destroy>
+VTABLE on that PMC to do custom cleanup. This flag is ignored in STRINGs.
+
+The GC does not collect dead PMCs in any particular order and does not
+guarantee any ordering of collection between dependant PMCs. Some GC cores may
+enforce some ordering or dependency recognition, but this is not guaranteed.
 
-Each PMC has a C<flags> member which, among other things, facilitates garbage
-collection. At the beginning of the mark phase, the C<PObj_is_live_FLAG> and
-C<PObj_is_fully_marked_FLAG> are both unset, which flags the PMC as presumed
-dead (white). The initial mark phase of the collection cycle goes through each
-PMC in the root set and sets the C<PObj_is_live_FLAG> bit in the C<flags>
-member (the PMC is gray).  It does not set the C<PObj_is_fully_marked_FLAG>
-bit (changing the PMC to black), because in the initial mark, the PMCs or
-buffers contained by a PMC are not marked. It also appends the PMC to the end
-of a list used for further marking. However, if the PMC has already been
-marked as black, the current end of list is returned (instead of appending the
-already processed PMC) to prevent endless looping.
-
-The fourth combination of the two flags, where C<PObj_is_live_FLAG> is unset
-and C<PObj_is_fully_marked_FLAG> is set, is reserved for PMCs of an older
-generation not actively participating in the GC run.
+=head3 Finalization
 
-The root set for the initial marking phase includes the following core storage
-locations:
+When the interpreter object is destroyed, the GC system is finalized. During
+finalization, all living PMCs in the system are destroyed unconditionally and
+all memory owned by the interpreter is freed back to the operating system.
+
+=head3 Internal Structures
+
+A GC core is defined in memory by a structure of function pointers to various
+routines that perform the primitive operations of the GC. A GC core must
+define most of the pointers in the C<< interp->gc_sys >> structure, which is
+a C<GC_Subsystem> structure.
+
+C<GC_Subsystem> has the following fields:
 
 =over 4
 
-=item Global stash
+=item C<void (*finalize_gc_system) (PARROT_INTERP)>
 
-=item System stack and processor registers
+Function to finalize the GC system, by freeing all PMCs and returning all
+allocated memory to the operating system.
 
-=item Current PMC register set
+=item C<void (*destroy_child_interp)(Interp *dest_interp,
+Interp *child_interp)>
 
-=item Stashes
+=item C<void (*do_gc_mark)(PARROT_INTERP, UINTVAL flags)>
 
-=item PMC register stack
+Perform a GC mark and sweep run, or at least run a single increment of it.
 
-=back
+=item C<void (*compact_string_pool)(PARROT_INTERP)>
 
-=head3 Incremental Marking
+Compact the string pool and destroy all unused buffers.
 
-After the root set of PMCs have been marked, a series of incremental mark runs
-are performed. These may be performed frequently, between other operations.
-The incremental mark runs work to move gray PMCs to black. They take a PMC
-from the list for further marking, mark any PMCs or buffers it contains as
-gray (the C<PObj_is_live_FLAG> is set and the C<PObj_is_fully_marked_FLAG> is
-left unset), and add the contained PMCs or buffers to the list for further
-marking.  If the PMC has a custom mark function in its vtable, it is called at
-this point.
-
-After all contained PMCs or buffers have been marked, the PMC itself is marked
-as black (the C<PObj_is_live_FLAG> and C<PObj_is_fully_marked_FLAG> are both
-set). A limit may be placed on the number of PMCs handled in each incremental
-mark run.
-
-=head3 Buffer Marking
-
-The initial marking phase also marks the root set of buffers. Because buffers
-cannot contain other buffers, they are immediately marked as black and not
-added to the list for further marking. Because PMCs may contain buffers, the
-buffer collection phase can't run until the incremental marking of PMCs is
-completed.
+=item C<void (*mark_special)(PARROT_INTERP, PMC *)>
 
-The root set for buffers includes the following locations:
+Mark a special PMC. A PMC is special if it has the C<PObj_is_special_FLAG>
+flag set.
 
-=over 4
+=item C<void (*pmc_needs_early_collection)(PARROT_INTERP, PMC *)>
 
-=item Current String register set
+Flag a PMC as needing early collection.
 
-=item String register set stack
+=item C<void (*init_pool)(PARROT_INTERP, struct Fixed_Size_Pool *)>
 
-=item Control stack
+Initialize a new memory pool.
 
-=back
+=item C<PMC* (*allocate_pmc_header)(PARROT_INTERP, UINTVAL flags)>
 
-Once a buffer is found to be live, the C<flags> member of the buffer structure
-has the C<PObj_live_FLAG> and C<PObj_is_fully_marked_FLAG> bits set.
+Allocate a new PMC object from the system.
 
-=head3 Collection
+=item C<void (*free_pmc_header)(PARROT_INTERP, PMC *)>
 
-When the list for further marking is empty (all gray PMCs have changed to
-black), the collection stage is started. First, PMCs are collected, followed
-by buffers. In both cases (PMC and buffer), the "live" and "fully_marked"
-flags are reset after examination for reclamation.
-
-=head4 Collecting PMCs
-
-To collect PMCs, each PMC arena is examined from the most recently created
-backwards.  Each PMC is examined to see if it is live, already on the free
-list, or constant.  If it is not, then it is added to the free list and marked
-as being on the free list with the C<PObj_on_free_list_FLAG>.
-
-=for question
-Are the PMCs in the arena examined back-to-front as well?  How about Buffers?
-Order of destruction can be important.
-
-=head4 Collecting buffers
-
-To collect buffers, each Buffer arena is examined from the most recently
-created backwards.  If the buffer is not live, not already on the free list
-and it is not a constant or copy on write, then it is added to the free pool
-for reuse and marked with the C<PObj_on_free_list_FLAG>.
-
-=head4 Concurrent collection
-
-For the most part, the variable sets between concurrent tasks don't interact.
-They have independent root sets and don't require information on memory usage
-from other tasks before performing a collection phase. In Parrot, tasks tend
-to be short-lived, and their variables can be considered young generations
-from a generational GC perspective. Because of this, a full heavyweight task
-will maintain its own small memory pools, quickly born and quickly dying.
-
-Shared variables, on the other hand, do require information from multiple
-concurrent tasks before they can be collected. Because of this, they live in
-the parent interpreter's global pools, and can only be collected after all
-concurrent tasks have completed a full mark phase without marking the shared
-variable as live. Because GC in the concurrent tasks happens incrementally
-between operations, a full collection of the shared variables can happen
-lazily, and does not require a stop-the-world sweep through all concurrent
-tasks simultaneously.
+Free a PMC object back to the system.
 
-=head3 Internal Structures
+=item C<STRING* (*allocate_string_header)(PARROT_INTERP, UINTVAL flags)>
+
+Allocate a new STRING header from the system.
+
+=item C<void (*free_string_header)(PARROT_INTERP, STRING*)>
+
+Free a STRING object back to the system.
+
+=item C<Buffer* (*allocate_bufferlike_header)(PARROT_INTERP, size_t size)>
+
+=item C<void (*free_bufferlike_header)(PARROT_INTERP, Buffer*, size_t size)>
+
+=item C<int  (*is_pmc_ptr)(PARROT_INTERP, void*)>
+
+Determine if the given pointer is or resembles a valid PMC pointer.
+
+=item C<int  (*is_string_ptr)(PARROT_INTERP, void*)>
+
+Determine if the given pointer is or resembles a valid STRING pointer.
+
+=item C<void (*mark_pobj_header)(PARROT_INTERP, PObj*)>
 
-The different GC cores are independent, but they share some code and
-resources.  The arena structures and arena creation routines are common across
-most GC cores, and some GC cores also share mark routines.
+=item C<void (*mark_pmc_header)(PARROT_INTERP, PMC *)>
 
-The main interpreter structure has an mem_pools member, which is a pointer to
-an Memory_Pools struct.
+Mark a PMC alive.
+
+=item C<void* (*allocate_pmc_attributes)(PARROT_INTERP, PMC *)>
+
+Allocate attribute storage for a PMC. The size of the attributes structure is
+determined from the PMCs VTABLE.
+
+=item C<void (*free_pmc_attributes)(PARROT_INTERP, PMC *)>
+
+Free an attribute structure back to the system.
+
+=item C<void (*allocate_string_storage)
+(PARROT_INTERP, STRING *str, size_t size)>
+
+Allocate buffer storage for a string.
+
+=item C<void (*reallocate_string_storage)
+(PARROT_INTERP, STRING *str, size_t size)>
+
+Resize existing string storage to fit data of the new size.
+
+=item C<void (*allocate_buffer_storage)
+(PARROT_INTERP, ARGMOD(Buffer *buffer), size_t nsize)>
+
+Allocate buffer storage for any purpose.
+
+=item C<void (*reallocate_buffer_storage)
+(PARROT_INTERP, ARGMOD(Buffer *buffer), size_t newsize)>
+
+Reallocate or resize existing buffer storage.
+
+=item C<void* (*allocate_fixed_size_storage)(PARROT_INTERP, size_t size)>
+
+Allocate storage for a fixed-size header which is not a PMC or a STRING. The
+contents of this structure are not marked automatically by GC.
+
+=item C<void (*free_fixed_size_storage)(PARROT_INTERP, size_t size, void *)>
+
+Free a fixed-size structure back to the system.
+
+=item C<void* (*allocate_memory_chunk)(PARROT_INTERP, size_t size)>
+
+=item C<void* (*reallocate_memory_chunk)(PARROT_INTERP, void *data,
+size_t newsize)>
+
+=item C<void* (*allocate_memory_chunk_with_interior_pointers)(PARROT_INTERP,
+size_t size)>
+
+=item C<void* (*reallocate_memory_chunk_with_interior_pointers)(PARROT_INTERP,
+void *data, size_t oldsize, size_t newsize)>
+
+=item C<void (*free_memory_chunk)(PARROT_INTERP, void *data)>
+
+=item C<void (*block_mark)(PARROT_INTERP)>
+
+Block the GC mark from occuring.
+
+=item C<void (*unblock_mark)(PARROT_INTERP)>
+
+Unblock the GC mark.
+
+=item C<unsigned int (*is_blocked_mark)(PARROT_INTERP)>
+
+Query the blocked state of the GC mark.
+
+=item C<void (*block_sweep)(PARROT_INTERP)>
+
+Block the GC sweep phase.
+
+=item C<void (*unblock_sweep)(PARROT_INTERP)>
+
+Unblock the GC sweep phase.
+
+=item C<unsigned int (*is_blocked_sweep)(PARROT_INTERP)>
+
+Query the blocked state of the GC sweep.
+
+=item C<size_t (*get_gc_info)(PARROT_INTERP, Interpinfo_enum)>
+
+Query information about the GC core.
+
+=back
 
 =head4 The Memory_Pools structure
 
@@ -320,14 +409,6 @@
 
 =head3 Internal API
 
-Currently only one GC system is active at a time, selected at configure or
-compile time. Future versions will support switching GC systems at
-execution-time to accommodate different work loads.
-
-=for question
-Does "execution-time" mean "before starting a runcore" or "at some point after
-starting a runcore"?
-
 Each GC core provides a standard interface for interaction with the core.
 
 =head4 Initialization

Modified: branches/gsoc_nci/docs/pdds/pdd17_pmc.pod
==============================================================================
--- branches/gsoc_nci/docs/pdds/pdd17_pmc.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/pdds/pdd17_pmc.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1327,40 +1327,6 @@
 greater). The C<_num> version performs a numeric comparison, while the
 C<_string> version performs a string comparison.
 
-=item logical_or
-
-  PMC* logical_or(INTERP, PMC *self, PMC *value, PMC *dest)
-
-Performs a logical OR, returning I<self> if it is true, and I<value>
-otherwise.
-
-=item logical_and
-
-  PMC* logical_and(INTERP, PMC *self, PMC *value, PMC *dest)
-
-Performs a logical AND, returning a true value if both I<self> and
-I<value> are true, and a false value otherwise. (Currently implemented
-as: If I<self> is false, return it, since the entire expression is
-false. If I<self> is true, return value, since the truth or falsehood of
-I<value> will determine the truth or falsehood of the whole expression.)
-
-=item logical_xor
-
-  PMC* logical_xor(INTERP, PMC *self, PMC *value, PMC *dest)
-
-Performs a logical XOR, returning I<self> if it is true and I<value> is
-false, returning I<value> if it is true and I<self> is false, and
-returning a false value (PMC of the same type as I<self>, with the
-boolean value 0) if both are true or neither are true.
-
-=item logical_not
-
-  PMC* logical_not(INTERP, PMC *self, PMC *dest)
-  void i_logical_not(INTERP, PMC *self)
-
-Returns the logical negation of I<self>. The C<i_> variant performs an
-inplace negation, modifying the value of I<self>.
-
 =back
 
 =head4 String Vtable Functions

Modified: branches/gsoc_nci/docs/pdds/pdd19_pir.pod
==============================================================================
--- branches/gsoc_nci/docs/pdds/pdd19_pir.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/pdds/pdd19_pir.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -134,9 +134,9 @@
 =item "double-quoted string constants"
 
 Are delimited by double-quotes (C<">). A C<"> inside a string must be escaped
-by C<\>. The default encoding for a double-quoted string constant is 7-bit
+by C<\>. The default format for a double-quoted string constant is 7-bit
 ASCII, other character sets and encodings must be marked explicitly using a
-charset or encoding flag.
+format flag.
 
 =item <<"heredoc",  <<'heredoc'
 
@@ -190,11 +190,18 @@
 
 =end PIR_FRAGMENT_TODO
 
-=item charset:"string constant"
+=item format:"string constant"
 
-Like above with a character set attached to the string. Valid character
-sets are currently: C<ascii> (the default), C<binary>, C<unicode>
-(with UTF-8 as the default encoding), and C<iso-8859-1>.
+Like above with a format attached to the string. Valid formats are
+currently: C<ascii> (the default), C<binary>, C<iso-8859-1>, C<utf8>,
+C<utf16>, C<ucs2>, and C<ucs4>.
+
+The format is attached to the string constant, and
+adopted by any string container the constant is assigned to.
+
+The standard escape sequences are honored within strings with an
+alternate format, so you can include a particular Unicode character
+as either a literal sequence of bytes, or as an escape sequence.
 
 =back
 
@@ -212,20 +219,6 @@
 
 =over 4
 
-=item encoding:charset:"string constant"
-
-Like above with an extra encoding attached to the string. For example:
-
-  set S0, utf8:unicode:"«"
-
-The encoding and charset are attached to the string constant, and
-adopted by any string container the constant is assigned to.
-
-The standard escape sequences are honored within strings with an
-alternate encoding, so in the example above, you can include a
-particular Unicode character as either a literal sequence of bytes, or
-as an escape sequence.
-
 =item numeric constants
 
 Both integers (C<42>) and numbers (C<3.14159>) may appear as constants.

Modified: branches/gsoc_nci/docs/pdds/pdd23_exceptions.pod
==============================================================================
--- branches/gsoc_nci/docs/pdds/pdd23_exceptions.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/pdds/pdd23_exceptions.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -310,16 +310,6 @@
 argument or a string index that's outside the length of the string.  Payload
 is an array, first element being the string 'ord'.
 
-The C<find_charset> opcode throws C<exception;domain> if the charset name it's
-looking up doesn't exist.  Payload is an array: [0] string 'find_charset', [1]
-charset name that was not found.
-
-The C<trans_charset> opcode throws C<exception;domain> on "information loss"
-(presumably, this means when one charset doesn't have a one-to-one
-correspondence in the other charset).  Payload is an array: [0] string
-'trans_charset', [1] source charset name, [2] destination charset name, [3]
-untranslatable code point.
-
 The C<find_encoding> opcode throws C<exception;domain> if the encoding name
 it's looking up doesn't exist.  Payload is an array: [0] string
 'find_encoding', [1] encoding name that was not found.

Modified: branches/gsoc_nci/docs/pdds/pdd28_strings.pod
==============================================================================
--- branches/gsoc_nci/docs/pdds/pdd28_strings.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/pdds/pdd28_strings.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -266,7 +266,6 @@
 	UINTVAL     strlen;
 	UINTVAL     hashval;
 	const struct _encoding *encoding;
-	const struct _charset  *charset;
 };
 
 The fields are:
@@ -302,23 +301,14 @@
 
 =item encoding
 
-How the data is encoded (e.g. fixed 8-bit characters, UTF-8, or UTF-32).  Note
-that this specifies encoding only -- it's valid to encode  EBCDIC characters
-with the UTF-8 algorithm. Silly, but valid.
+What sort of string data is in the buffer, for example ASCII, ISO-8859-1,
+UTF-8 or UTF-16.
 
 The encoding structure specifies the encoding (by index number and by name,
 for ease of lookup), the maximum number of bytes that a single character will
 occupy in that encoding, as well as functions for manipulating strings with
 that encoding.
 
-=item charset
-
-What sort of string data is in the buffer, for example ASCII, EBCDIC, or
-Unicode.
-
-The charset structure specifies the character set (by index number and by
-name) and provides functions for transcoding to and from that character set.
-
 =back
 
 {{DEPRECATION NOTE: the enum C<parrot_string_representation_t> will be removed
@@ -352,32 +342,9 @@
 Parrot's external API will be renamed for the standard "Parrot_*" naming
 conventions.
 
-=head4 Parrot_str_set (was string_set)
-
-Set one string to a copy of the value of another string.
-
-=head4 Parrot_str_new_COW (was Parrot_make_COW_reference)
-
-Create a new copy-on-write string. Creating a new string header, clone the
-struct members of the original string, and point to the same string buffer as
-the original string.
-
-=head4 Parrot_str_reuse_COW (was Parrot_reuse_COW_reference)
-
-Create a new copy-on-write string. Clone the struct members of the original
-string into a passed in string header, and point the reused string header to
-the same string buffer as the original string.
-
-=head4 Parrot_str_write_COW (was Parrot_unmake_COW)
-
-If the specified Parrot string is copy-on-write, copy the string's contents
-to a new string buffer and clear the copy-on-write flag.
-
 =head4 Parrot_str_concat (was string_concat)
 
-Concatenate two strings. Takes three arguments: two strings, and one integer
-value of flags. If both string arguments are null, return a new string created
-according to the integer flags.
+Concatenate two strings. Takes two strings as arguments.
 
 =head4 Parrot_str_new (was string_from_cstring)
 
@@ -397,11 +364,10 @@
 
 Returns a new string of the requested encoding, character set, and
 normalization form, initializing the string value to the value passed in.  The
-five arguments are a C string (C<char *>), an integer length of the string
-argument in bytes, and struct pointers for encoding, character set, and
-normalization form structs. If the C string (C<char *>) value is not passed,
-returns an empty string. If the encoding, character set, or normalization form
-are passed as null values, default values are used.
+three arguments are a C string (C<char *>), an integer length of the string
+argument in bytes, and a struct pointer for the encoding struct. If the C
+string (C<char *>) value is not passed, returns an empty string. If the
+encoding is passed as null value, a default value is used.
 
 {{ NOTE: the crippled version of this function, C<string_make>, used to accept
 a string name for the character set. This behavior is no longer supported, but
@@ -414,13 +380,6 @@
 *>) as an argument, the value of the constant string. The length of the C
 string is calculated internally.
 
-=head4 Parrot_str_resize (was string_grow)
-
-Resize the string buffer of the given string adding the number of bytes passed
-in the integer argument. If the argument is negative, remove the given number
-of bytes. Throws an exception if shrinking the string buffer size will
-truncate the string (if C<strlen> will be longer than C<buflen>).
-
 =head4 Parrot_str_length (was string_compute_strlen)
 
 Returns the number of characters in the string. Combining characters are each
@@ -505,11 +464,6 @@
 Chop the requested number of characters off the end of a string without
 modifying the original string.
 
-=head4 Parrot_str_chopn_inplace (was string_chopn_inplace).
-
-Chop the requested number of characters off the end of a string, modifying the
-original string.
-
 =head4 Parrot_str_grapheme_chopn
 
 Chop the requested number of graphemes off the end of a string without
@@ -545,6 +499,10 @@
 Compare two strings using NFG normalization, return 1 if they are equal, 0 if
 they are not equal.
 
+=head4 Parrot_str_split
+
+Splits the string C<str> at the delimiter C<delim>.
+
 =head3 Internal String Functions
 
 The following functions are used internally and are not part of the public
@@ -560,6 +518,10 @@
 Terminate and clean up Parrot's string subsystem, including string allocation
 and garbage collection.
 
+=head3 Deprecated String Functions
+
+The following string functions are slated to be deprecated.
+
 =head4 string_max_bytes
 
 Calculate the number of bytes needed to hold a given number of characters in a
@@ -568,10 +530,6 @@
 
 {{NOTE: pretty primitive and not very useful. May be deprecated.}}
 
-=head3 Deprecated String Functions
-
-The following string functions are slated to be deprecated.
-
 =head4 string_primary_encoding_for_representation
 
 Not useful, it only ever returned ASCII.
@@ -618,10 +576,6 @@
 
 Unsafe, and behavior handled by Parrot_str_to_cstring.
 
-=head4 Parrot_str_split
-
-Splits the string C<str> at the delimiter C<delim>.
-
 =head4 Parrot_str_free (was string_free)
 
 Unsafe and unuseful, let the garbage collector take care.

Modified: branches/gsoc_nci/docs/pmc/subs.pod
==============================================================================
--- branches/gsoc_nci/docs/pmc/subs.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/pmc/subs.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -27,7 +27,6 @@
     Coroutine
     Eval
   Continuation
-    RetContinuation
     ExceptionHandler
 
 By "invokable" we mean that they can be supplied as the first argument to the

Modified: branches/gsoc_nci/docs/project/release_manager_guide.pod
==============================================================================
--- branches/gsoc_nci/docs/project/release_manager_guide.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/project/release_manager_guide.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -84,7 +84,7 @@
 
 =item c
 
-Update release-related information in F<tools/util/release.json>. This will be
+Update release-related information in F<tools/release/release.json>. This will be
 used later when making release announcements.  There are a few essential
 fields that must be updated at each release:
 
@@ -118,16 +118,10 @@
 
 =item f
 
-In the two files F<src/ops/core_ops.c> and F<include/parrot/oplib/core_ops.h>
-is the function C<Parrot_DynOp_core_a_b_c>, which has a name that includes
-the version number. a_b_c is the version number. You have to update this
-version number on two places in the file F<src/ops/core_ops.c>.
-In the file F<include/parrot/oplib/core_ops.h> you have to change this line:
-
- op_lib_t *Parrot_DynOp_core_a_b_c(PARROT_INTERP, long init);
-
-Ignore the warning to not edit this files. It is necessary to edit this files,
-so that "make" builds with the increased version number.
+To have parrot configured and have run C<make> with the old version number is
+condition for this step. Run C<./ops2c --core> (or C<make bootstrap-ops>,
+ignoring errors) followed by C<make reconfig> and C<make> to update the names
+of version-specific internal functions.
 
 =item g
 
@@ -251,11 +245,11 @@
 
 =item 9.
 
-Compose the release announcement.  Use F<tools/util/crow.pir> to make
+Compose the release announcement.  Use F<tools/release/crow.pir> to make
 this part easier.  You can specify the format of your announcements like so:
 
-  $ ./parrot tools/util/crow.pir --type=text
-  $ ./parrot tools/util/crow.pir --type=html
+  $ ./parrot tools/release/crow.pir --type=text
+  $ ./parrot tools/release/crow.pir --type=html
 
 Take the screen output and paste it into the application you need.  HTML
 works well for use Perl and PerlMonks, and text for the rest.  It is not a
@@ -413,12 +407,16 @@
 visible at
 L<http://www.google.com/calendar/render?cid=ldhctdamsgfg5a1cord52po9h8@group.calendar.google.com>.
 
- - Aug 17, 2010 - 2.7   - mikehh
- - Sep 21, 2010 - 2.8   - gerd
  - Oct 19, 2010 - 2.9*  - gerd
- - Nov 16, 2010 - 2.10  - ??
- - Dec 21, 2010 - 2.11  - ??
- - Jan 18, 2010 - 3.0*  - ??
+ - Nov 16, 2010 - 2.10  - tcurtis
+ - Dec 21, 2010 - 2.11  - whiteknight
+ - Jan 18, 2011 - 3.0*  - cotto
+ - Feb 15, 2011 - 3.1   - mikehh
+ - Mar 15, 2011 - 3.2   - ??
+ - Apr 19, 2011 - 3.3*  - ??
+ - May 17, 2011 - 3.4   - ??
+ - Jun 21, 2011 - 3.5   - ??
+ - Jul 19, 2011 - 3.6*  - kid51
 
 =cut
 

Modified: branches/gsoc_nci/docs/tests.pod
==============================================================================
--- branches/gsoc_nci/docs/tests.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/tests.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -24,7 +24,7 @@
 =head2 Submitting smolder test results
 
 Parrot has a status page with smoke test results at
-L<http://smolder.plusthree.com/app/public_projects/details/8>.
+L<http://smolder.parrot.org/app/projects/smoke_reports/1>.
 
 You can supply new tests results by just running C<make smoke>.  It will run the
 same tests as C<make test> would, but will upload the test results to the

Modified: branches/gsoc_nci/docs/vtables.pod
==============================================================================
--- branches/gsoc_nci/docs/vtables.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/docs/vtables.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -280,17 +280,6 @@
 result in C<dest>. (Probably by calling its C<set_string> method) This is a
 string multimethod.
 
-=item C<logical_or>
-
-=item C<logical_and>
-
-Perform the given short-circuiting logical operations between your boolean
-value and the value passed in, storing the result in C<dest>.
-
-=item C<logical_not>
-
-Set yourself to be a logical negation of the value passed in.
-
 =item C<repeat>
 
 Repeat your string representation C<value> times and store the result in

Modified: branches/gsoc_nci/editor/pir-mode.el
==============================================================================
--- branches/gsoc_nci/editor/pir-mode.el	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/editor/pir-mode.el	Tue Sep 28 17:16:52 2010	(r49366)
@@ -155,7 +155,7 @@
     "ParrotIO" "ParrotInterpreter" "ParrotLibrary" "ParrotObject"
     "ParrotThread" "Pointer"
     "ResizableBooleanArray" "ResizableFloatArray" "ResizableIntegerArray"
-    "ResizablePMCArray" "ResizableStringArray" "RetContinuation"
+    "ResizablePMCArray" "ResizableStringArray"
     "Role" "Scalar" "String" "Sub" "Super"
     "Timer" "UnManagedStruct" "Undef" "VtableCache"))
 

Added: branches/gsoc_nci/examples/benchmarks/boolean.pir
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/gsoc_nci/examples/benchmarks/boolean.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -0,0 +1,63 @@
+# Copyright (C) 2010, Parrot Foundation.
+# $Id$
+
+=head1 NAME
+
+examples/benchmarks/boolean.pir: Manipulate the Boolean PMC
+
+=head1 SYNOPSIS
+
+parrot examples/benchmarks/boolean.pir
+
+=head1 DESCRIPTION
+
+This benchmark operates on the Boolean PMC, allocating new ones, setting them,
+and performing logical operations on them.
+
+=cut
+
+.const num iterations = 10e6                    # Number of iterations.
+
+.sub main :main
+
+  .local num start_time, end_time
+  .local int counter
+  .local pmc a, b, c, result
+
+  print "Perform "
+  print iterations
+  say " iterations of various Boolean operations"
+
+  a = new 'Boolean', 1
+  start_time = time
+
+  counter = iterations
+LOOP:
+  b = new 'Boolean'
+  b = 1
+  c = new 'Boolean', b
+  result = not a
+  result = and result, b
+  result = or result, c
+  not result
+  if result goto TRUE
+  a = 0
+  goto NEXT
+TRUE:
+  a = 1
+NEXT:
+  dec counter
+  if counter > 0 goto LOOP
+
+  end_time = time
+  end_time = end_time - start_time
+  end_time = end_time / iterations
+  print "Elapsed time per iteration: "
+  say end_time
+.end
+
+# Local Variables:
+#   mode: pir
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4 ft=pir:

Added: branches/gsoc_nci/examples/benchmarks/stress_integers.pir
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/gsoc_nci/examples/benchmarks/stress_integers.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -0,0 +1,45 @@
+# Copyright (C) 2010, Parrot Foundation.
+# $Id$
+
+=head1 NAME
+
+examples/benchmarks/stress_strings.pir - GC strings stress-testing
+
+=head1 SYNOPSIS
+
+    % time ./parrot examples/benchmarks/stress_strings.pir
+
+=head1 DESCRIPTION
+
+Create a lots of strings. Some of them are long-lived, most of them are short lived.
+
+Main purpose - test compact_pool performance.
+
+=cut
+
+.sub 'main' :main
+    .local pmc rsa # array of long lived strings.
+
+    .local int i
+
+    rsa = new ['ResizablePMCArray']
+    i = 0
+  loop:
+    $I0 = i % 10    # every 10th string is longlived
+    if $I0 goto inc_i
+    push rsa, i
+    $I0 = i % 1000
+    if $I0 goto inc_i
+    sweep 1
+  inc_i:
+    inc i
+    if i < 100000 goto loop
+
+.end
+
+
+# Local Variables:
+#   mode: pir
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4 ft=pir:

Modified: branches/gsoc_nci/examples/compilers/japhc.c
==============================================================================
--- branches/gsoc_nci/examples/compilers/japhc.c	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/examples/compilers/japhc.c	Tue Sep 28 17:16:52 2010	(r49366)
@@ -147,8 +147,8 @@
     /* Allocate a new constant */
     consts->constants[--k] = PackFile_Constant_new(interp);
     consts->constants[k]->type = PFC_STRING;
-    consts->constants[k]->u.string =
-        string_make(interp, buf, (UINTVAL) l, "iso-8859-1", 0);
+    consts->constants[k]->u.string = Parrot_str_new_init(interp, buf,
+            (UINTVAL) l, Parrot_latin1_encoding_ptr, 0);
     free(o);
     return k;
 }

Modified: branches/gsoc_nci/examples/config/file/configcompiler
==============================================================================
--- branches/gsoc_nci/examples/config/file/configcompiler	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/examples/config/file/configcompiler	Tue Sep 28 17:16:52 2010	(r49366)
@@ -34,8 +34,6 @@
 init::optimize
 inter::shlibs
 inter::libparrot
-inter::charset
-inter::encoding
 inter::types
 auto::ops
 auto::pmc

Modified: branches/gsoc_nci/examples/config/file/configwithfatalstep
==============================================================================
--- branches/gsoc_nci/examples/config/file/configwithfatalstep	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/examples/config/file/configwithfatalstep	Tue Sep 28 17:16:52 2010	(r49366)
@@ -26,8 +26,6 @@
 init::optimize
 inter::shlibs
 inter::libparrot
-inter::charset
-inter::encoding
 inter::types
 auto::ops
 auto::pmc

Modified: branches/gsoc_nci/examples/io/httpd.pir
==============================================================================
--- branches/gsoc_nci/examples/io/httpd.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/examples/io/httpd.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -142,11 +142,11 @@
     req = ""
 MORE:
     buf = work.'recv'()
-    # charset I0, buf
-    # charsetname S1, I0
+    # encoding I0, buf
+    # encodingname S1, I0
     # print "\nret: "
     # print ret
-    # print "\ncharset of buf: "
+    # print "\nencoding of buf: "
     # print S1
     # print "\nbuf:"
     # print buf

Modified: branches/gsoc_nci/examples/io/post.pir
==============================================================================
--- branches/gsoc_nci/examples/io/post.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/examples/io/post.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -22,7 +22,7 @@
     push contents, 'username'
     push contents, 'parrot-autobot'
     push contents, 'password'
-    push contents, 'squ at wk'
+    push contents, 'qa_rocks'
     push contents, 'comments'
     push contents, "EXPERIMENTAL LWP.pir"
     push contents, 'report_file'
@@ -31,7 +31,7 @@
     $P0[0] = 'parrot_test_run.tar.gz'
     push contents, $P0
     load_bytecode 'LWP/UserAgent.pir'
-    .const string url = 'http://smolder.plusthree.com/app/projects/process_add_report/8'
+    .const string url = 'http://smolder.parrot.org/app/projects/process_add_report/1'
     .local pmc ua, response
     ua = new ['LWP';'UserAgent']
     ua.'env_proxy'()

Deleted: branches/gsoc_nci/examples/japh/README
==============================================================================
--- branches/gsoc_nci/examples/japh/README	Tue Sep 28 17:16:52 2010	(r49365)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,13 +0,0 @@
-# Copyright (C) 2001-2005, Parrot Foundation.
-$Id$
-
-These programs show very different ways how to print a simple
-string. Some are obfuscated, some are horribly platform dependent.
-
-To run them all (from the top level directory)
-
-$ make
-$ for f in examples/japh/japh*.pasm; do ./parrot $f ; done
-
-These JAPHs are also tested by 'make test' in the Parrot root directory.
-The test file is 't/examples/japh.t'.

Deleted: branches/gsoc_nci/examples/japh/japh1.pasm
==============================================================================
--- branches/gsoc_nci/examples/japh/japh1.pasm	Tue Sep 28 17:16:52 2010	(r49365)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,29 +0,0 @@
-# Copyright (C) 2004-2009, Parrot Foundation.
-# $Id$
-
-	newclass P0, "Japh"
-	new P0, "Japh"
-	set I0, 0
-	set S0, P0[I0]
-	print S0
-	inc I0
-	set S0, P0[I0]
-	print S0
-	end
-.namespace ["Japh"]
-.pcc_sub :vtable get_string_keyed:
-	get_params "0,0", P1, I1
-	unless I1, x
-	set S1, "Parrot Hacker\n"
-	set_returns "0", S1
-	returncc
-x:
-	set S1, "Just another "
-	set_returns "0", S1
-	returncc
-
-# Local Variables:
-#   mode: pir
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4 ft=pir:

Deleted: branches/gsoc_nci/examples/japh/japh3.pasm
==============================================================================
--- branches/gsoc_nci/examples/japh/japh3.pasm	Tue Sep 28 17:16:52 2010	(r49365)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,19 +0,0 @@
-# Copyright (C) 2004-2010, Parrot Foundation.
-# $Id$
-
-# the substr JaPH
-    set S0, "Hacker\n"
-    set S1, "Parrot "
-    set S2, "another "
-    set S3, "Just "
-    replace S3, S3, 5,  1, S2
-    replace S3, S3, 13, 1, S1
-    replace S3, S3, 20, 1, S0
-    print S3
-    end
-
-# Local Variables:
-#   mode: pir
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4 ft=pir:

Deleted: branches/gsoc_nci/examples/japh/japh4.pasm
==============================================================================
--- branches/gsoc_nci/examples/japh/japh4.pasm	Tue Sep 28 17:16:52 2010	(r49365)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,19 +0,0 @@
-# Copyright (C) 2004-2009, Parrot Foundation.
-# $Id$
-
-newclass P1, "Japh"
-new P2, "Japh"
-print P2
-end
-
-.namespace ["Japh"]
-.pcc_sub :vtable get_string:
-	set S3, "Just another Parrot Hacker\n"
-	set_returns "0", S3
-	returncc
-
-# Local Variables:
-#   mode: pir
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4 ft=pir:

Deleted: branches/gsoc_nci/examples/japh/japh5.pasm
==============================================================================
--- branches/gsoc_nci/examples/japh/japh5.pasm	Tue Sep 28 17:16:52 2010	(r49365)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,27 +0,0 @@
-# Copyright (C) 2004-2009, Parrot Foundation.
-# $Id$
-
-# JaPH utilizing an object
-    newclass P0, "Japh"
-    new P0, "Japh"
-    set P0[1], "Just"
-    set P0[2], "another"
-    set P0[3], "Parrot"
-    set P0[0], "Hacker"
-    end
-.namespace ["Japh"]
-.pcc_sub :vtable set_string_keyed:
-    get_params "0,0,0", P5, I5, S5
-    print S5
-    if I5, sp
-    print "\n"
-    returncc
-sp:
-    print " "
-    returncc
-
-# Local Variables:
-#   mode: pir
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4 ft=pir:

Modified: branches/gsoc_nci/examples/json/postalcodes.pir
==============================================================================
--- branches/gsoc_nci/examples/json/postalcodes.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/examples/json/postalcodes.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -64,8 +64,8 @@
 END:
     close sock
 
-    $I1 = find_charset 'unicode'
-    json_result = trans_charset json_result, $I1
+    $I1 = find_encoding 'utf8'
+    json_result = trans_encoding json_result, $I1
 
     # Strip off http headers.
     $I0 = index json_result, "\r\n\r\n"

Modified: branches/gsoc_nci/examples/languages/squaak/doc/tutorial_episode_1.pod
==============================================================================
--- branches/gsoc_nci/examples/languages/squaak/doc/tutorial_episode_1.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/examples/languages/squaak/doc/tutorial_episode_1.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -30,7 +30,7 @@
 
 The Facts: 1) Parrot is suitable for running virtually any dynamic language
 known, but before doing so, compilers must be written, and 2) writing compilers
-is rather difficult.
+from scratch is rather difficult.
 
 =head2 The Parrot Compiler Toolkit
 
@@ -42,24 +42,28 @@
 designed to do just that: provide powerful tools to make writing a compiler for
 Parrot childishly easy.
 
-This tutorial will introduce the PCT by demonstrating the ease with which a
-(simple) language can be implemented for Parrot. The case study language is not
-as complex as a real-world language, but this tutorial is written to whet your
-appetite and show the power of the PCT. This tutorial will also present some
+This tutorial introduces the PCT by showing how a simple case study language is
+implemented for Parrot. The sample language is not
+as complex as a real-world language, but is interesting enough to whet your
+appetite and show the power of the PCT.
+
+This tutorial also presents some
 exercises which you can explore in order to learn more details of the PCT not
 covered in this tutorial.
 
 =head2 Squaak: A Simple Language
 
-The case study language, named Squaak, that we will be implementing on Parrot
-will be a full-fledged compiler that can compile a program from source into
-Parrot Intermediate Representation (PIR) (or run the PIR immediately). It can
-also be used as a command-line interpreter. Squaak demonstrates some common
-language constructs, but at the same time is lacking some other, seemingly
-simple features. For instance, our language will not have return, break or
+The case study language is named Squaak. We will be implementing on Parrot
+a full-fledged compiler that can compile a Squaak program from source into
+Parrot Intermediate Representation (PIR) or run a Squaak program immediately.
+The compiler can also be used as an interactive interpreter, REPL, for Squaak.
+
+Squaak demonstrates some common language constructs,
+but is lacking some other, seemingly simple, features.
+For instance, our language will have no return, break or
 continue statements (or equivalents in your favorite syntax).
 
-Squaak will have the following features:
+Squaak has the following features:
 
 =over 4
 
@@ -92,20 +96,19 @@
 
 =back
 
-=head2 The Compiler Tools
+=head2 The Tools
 
-The Parrot Compiler Tools we'll use to implement Squaak consist of the following
-parts:
+The Parrot Compiler Toolkit consists of the following tools:
 
 =over 4
 
 =item B<N>ot B<Q>uite B<P>erl (6) (NQP-rx).
 
-NQP is a lightweight language inspired by Perl 6 and can be used to write the
+NQP is a lightweight language inspired by Perl 6 which can be used to write the
 methods that must be executed during the parsing phase, just as you can write
-actions in a Yacc/Bison input file. It also provides the regular expression engine we'll use to 
+actions in a Yacc/Bison input file. It also provides the regular expression engine we'll use to
 write our grammar. In addition to the capabilities of Perl 5's regexes, the Perl 6 regexes that NQP
- implements can be used to define language grammars. (Check the references for the specification.)
+implements can be used to define language grammars. (Check the references for the specification.)
 
 =item B<P>arrot B<A>bstract B<S>yntax B<T>ree (PAST).
 
@@ -121,30 +124,33 @@
 =head2 Getting Started
 
 For this tutorial, it is assumed you have successfully compiled parrot
-(and maybe even run the test suite). If, after reading this tutorial, you feel like
-contributing to one of these languages, you can check out the mailing list or
+(and maybe even run the test suite).
+
+If, after reading this tutorial, you feel like
+contributing to one of the already implemented languages, you can check out the mailing list or
 join IRC (see the references section for details).
 
-The languages subdirectory is the right spot to put our language implementation.
-Parrot comes with a special shell script to generate the necessary files for a
-language implementation. In order to generate these files for our language,
-type (assuming you're in Parrot's root directory):
+Parrot comes with a Perl 5  script that generates the necessary files for a
+language implementation. In order to generate these files for our sample language,
+go the Parrot's root directory and type:
 
  $ perl tools/dev/mk_language_shell.pl Squaak ~/src/squaak
 
 (Note: if you're on Windows, you should use backslashes.) This will generate the
-files in a directory F<~/src/squaak>, and use the name Squaak as the language's
-name.
+files in the directory F<~/src/squaak>. The name of the language will be Squaak.
 
 After this, go to the directory F<~/src/squaak> and type:
 
  $ parrot setup.pir test
 
-This will compile the generated files and run the test suite. If you want more
+This will compile the grammar and the actions and run the test suite.
+For running F<setup.pir> you can either use an installed parrot executable
+from your distribution or the one you have just compiled.
+
+If you want more
 information on what files are being generated, please check out the references
 at the end of this episode or read the documentation included in the file
-F<mk_language_shell.pl>. For that you can use an installed parrot executable
-from your distribution or one you have just compiled.
+F<tools/dev/mk_language_shell.pl>.
 
 Note that we didn't write a single line of code, and already we have the basic
 infrastructure in place to get us started. Of course, the generated compiler
@@ -213,8 +219,9 @@
 
 The exercises are provided at the end of each episode of this tutorial. In
 order to keep the length of this tutorial somewhat acceptable, not everything
-can be discussed in full detail. The answers and/or solutions to these exercises
-will be posted several days after the episode.
+can be discussed in full detail. With episode 3 the answers and/or solutions
+to these exercises are at the end of each episode. The answer of the exercise
+from episode 1 is at the end of episode 2.
 
 =head3 Advanced interactive mode.
 
@@ -267,7 +274,8 @@
 
 =item * Perl 6/NQP rules syntax: Synopsis 5 at http://perlcabal.org/syn/S05.html or http://svn.pugscode.org/pugs/docs/Perl6/Spec/S05-regex.pod
 
-=back
+=item * List of HLL projects: http://trac.parrot.org/parrot/wiki/Languages
 
+=back
 
 =cut

Modified: branches/gsoc_nci/examples/languages/squaak/doc/tutorial_episode_2.pod
==============================================================================
--- branches/gsoc_nci/examples/languages/squaak/doc/tutorial_episode_2.pod	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/examples/languages/squaak/doc/tutorial_episode_2.pod	Tue Sep 28 17:16:52 2010	(r49366)
@@ -24,7 +24,7 @@
 compiler enters the interactive mode. Consider the first case, passing the file
 test.sq, just as we did before:
 
- $ ./installable_squeak test.sq
+ $ ./installable_squaak test.sq
 
 When invoking our compiler like this, the file test.sq is compiled and the
 generated code (bytecode) is executed immediately by Parrot. How does this work,
@@ -50,7 +50,7 @@
 This is an example of using the target option set to "parse", which will print
 the parse tree of the input to stdout:
 
- $ ./installable_squeak --target=parse test.sq
+ $ ./installable_squaak --target=parse test.sq
 
 In interactive mode, giving this input:
 
@@ -235,9 +235,8 @@
 
 =over 4
 
-=item 1. PIR language specification: docs/pdds/draft/PDD19_pir.pod
+=item 1. PIR language specification: docs/pdds/pdd19_pir.pod
 
 =back
 
 =cut
-

Modified: branches/gsoc_nci/examples/languages/squaak/src/squaak.pir
==============================================================================
--- branches/gsoc_nci/examples/languages/squaak/src/squaak.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/examples/languages/squaak/src/squaak.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -10,7 +10,7 @@
 This is the base file for the Squaak compiler.
 
 This file includes the parsing and grammar rules from
-the src/ directory, loads the relevant PGE libraries,
+the src/ directory, loads the relevant PCT libraries,
 and registers the compiler under the name 'Squaak'.
 
 =head2 Functions

Modified: branches/gsoc_nci/examples/namespace/namespace_dump.pir
==============================================================================
--- branches/gsoc_nci/examples/namespace/namespace_dump.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/examples/namespace/namespace_dump.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -1,12 +1,13 @@
 # Copyright (C) 2006-2009, Parrot Foundation.
 # $Id$
 
+.include "interpinfo.pasm"
+.include "iterator.pasm"
+
 #
 # dump all namespaces and the contents recursively
 #
 .sub main :main
-    .include "interpinfo.pasm"
-    .include "iterator.pasm"
     .local pmc ns
     ns = get_root_namespace
     dump(ns, 0)
@@ -14,55 +15,82 @@
 
 # dump one namespace
 .sub dump
-    .param pmc ns
-    .param int lev
-    .local pmc it
-    .local string spac
+    .param pmc    ns
+    .param int    lev
+    .local pmc    it
+    .local string indent
+
+    $I0 = lev * 4
+    indent = repeat " ", $I0
 
     it = iter ns
     it = .ITERATE_FROM_START
-    $I2 = lev * 4
-    spac = repeat " ", $I2
-lp:
-    unless it goto ex
-    $S0 = shift it
-    $P0 = it[$S0]
-    # there might be a smy with the same name as a namespace
-    $P1 = ns.'get_sym'($S0)
-    if null $P1 goto no_sym
-    eq_addr $P0, $P1, no_sym
-    print spac
-    print $S0
-    print " => "
-    print $P1
-    print "\n"
-no_sym:
-    $I0 = isa $P0, 'NCI'
-    unless $I0 goto no_nci
-    $P0 = new 'String'
-    $P0 = "NCI"
-no_nci:
-    print spac
-    print $S0
+
+loop:
+    unless it goto return
+
+    .local string name
+    .local pmc    entry, sym_entry
+    name      = shift it
+    entry     = it[name]
+    # there might be a sym with the same name as a namespace
+    sym_entry = ns.'get_sym'(name)
+
+    if_null sym_entry,        done_sym
+    eq_addr sym_entry, entry, done_sym
+    dump_simple(name, sym_entry, indent)
+done_sym:
+
+    $I0 = isa entry, 'MultiSub'
+    if $I0 goto handle_multi
+
+    $I0 = isa entry, 'NameSpace'
+    if $I0 goto handle_ns
+
+    dump_simple(name, entry, indent)
+    goto loop
+
+handle_multi:
+    print indent
+    print name
     print " => "
-    $I0 = isa $P0, 'MultiSub'
-    unless $I0 goto no_multi
-    $I1 = lev + 1
+    $I0 = lev + 1
     print " Multi [\n"
-    dump_multi($P0, $I1)
-    print spac
+    dump_multi(entry, $I0)
+    print indent
     print "]\n"
-    goto lp
-no_multi:
-    print $P0
+    goto loop
+
+handle_ns:
+    dump_simple(name, entry, indent)
+    $I0 = lev + 1
+    dump(entry, $I0)
+    goto loop
+
+return:
+.end
+
+.sub dump_simple
+    .param string name
+    .param pmc    x
+    .param string indent
+    print indent
+    print name
+    print " => "
+
+    .local string val_str
+    push_eh no_get_string
+    val_str = x
+
+got_val_str:
+    pop_eh
+    print val_str
     print "\n"
-    $I0 = isa $P0, 'NameSpace'
-    unless $I0 goto no_ns
-    $I1 = lev + 1
-    dump($P0, $I1)
-no_ns:
-    goto lp
-ex:
+    .return ()
+
+no_get_string:
+    val_str = typeof x
+    goto got_val_str
 .end
 
 # dump the types of a MultiSub

Copied and modified: branches/gsoc_nci/examples/tools/pgegrep (from r48555, branches/gsoc_nci/tools/util/pgegrep)
==============================================================================

Modified: branches/gsoc_nci/ext/nqp-rx/src/stage0/HLL-s0.pir
==============================================================================
--- branches/gsoc_nci/ext/nqp-rx/src/stage0/HLL-s0.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/ext/nqp-rx/src/stage0/HLL-s0.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -18,6 +18,7 @@
 ### .include 'src/cheats/hll-compiler.pir'
 # we have to overload PCT::HLLCompiler's parse method to support P6Regex grammars
 
+.include 'cclass.pasm'
 
 .namespace ['HLL';'Compiler']
 
@@ -123,6 +124,80 @@
 .end
 
 
+# Temporarily backport PCT::HLLCompiler's 'lineof' method
+# from Parrot r48866 into HLL::Compiler, so that nqp-rx can
+# continue to build from an older Parrot until parrot's trunk
+# is working again.  When we're able to bump PARROT_REVISION,
+# this code can go away to fall back to Parrot's version (DRY).
+
+=over 4
+
+=item lineof(target, pos [, cache :named('cache')])
+
+Return the line number of offset C<pos> within C<target>.  The return
+value uses zero for the first line.  If C<cache> is true, then
+memoize the line offsets as a C<!lineof> property on C<target>.
+
+=back
+
+=cut
+
+.sub 'lineof' :method
+    .param pmc target
+    .param int pos
+    .param int cache           :optional :named('cache')
+    .local pmc linepos
+
+    # If we've previously cached C<linepos> for target, we use it.
+    unless cache goto linepos_build
+    linepos = getprop '!linepos', target
+    unless null linepos goto linepos_done
+
+    # calculate a new linepos array.
+  linepos_build:
+    linepos = new ['ResizableIntegerArray']
+    unless cache goto linepos_build_1
+    setprop target, '!linepos', linepos
+  linepos_build_1:
+    .local string s
+    .local int jpos, eos
+    s = target
+    eos = length s
+    jpos = 0
+    # Search for all of the newline markers in C<target>.  When we
+    # find one, mark the ending offset of the line in C<linepos>.
+  linepos_loop:
+    jpos = find_cclass .CCLASS_NEWLINE, s, jpos, eos
+    unless jpos < eos goto linepos_done
+    $I0 = ord s, jpos
+    inc jpos
+    push linepos, jpos
+    # Treat \r\n as a single logical newline.
+    if $I0 != 13 goto linepos_loop
+    $I0 = ord s, jpos
+    if $I0 != 10 goto linepos_loop
+    inc jpos
+    goto linepos_loop
+  linepos_done:
+
+    # We have C<linepos>, so now we search the array for the largest
+    # element that is not greater than C<pos>.  The index of that
+    # element is the line number to be returned.
+    # (Potential optimization: use a binary search.)
+    .local int line, count
+    count = elements linepos
+    line = 0
+  line_loop:
+    if line >= count goto line_done
+    $I0 = linepos[line]
+    if $I0 > pos goto line_done
+    inc line
+    goto line_loop
+  line_done:
+    .return (line)
+.end
+
+
 # This sub serves as a cumulative "outer context" for code
 # executed in HLL::Compiler's interactive REPL.  It's invoked
 # exactly once upon load/init to obtain a context, and its
@@ -354,7 +429,8 @@
     pos = self.'pos'()
     target = getattribute self, '$!target'
 
-    $I1 = target.'lineof'(pos)
+    $P0 = get_hll_global ['HLL'], 'Compiler'
+    $I1 = $P0.'lineof'(target, pos)
     inc $I1
     push args, ' at line '
     push args, $I1
@@ -438,6 +514,16 @@
 .sub 'quote_EXPR' :method
     .param pmc args            :slurpy
 
+    .local pmc cur, debug
+    .local string target
+    .local int pos
+
+    (cur, pos, target) = self.'!cursor_start'()
+    debug = getattribute cur, '$!debug'
+    if null debug goto debug_1
+    cur.'!cursor_debug'('START', 'quote_EXPR')
+  debug_1:
+
     .local pmc quotemod, true
     .lex '%*QUOTEMOD', quotemod
     quotemod = new ['Hash']
@@ -466,11 +552,6 @@
     goto args_loop
   args_done:
 
-    .local pmc cur
-    .local string target
-    .local int pos
-
-    (cur, pos, target) = self.'!cursor_start'()
 
     .local pmc start, stop
     (start, stop) = self.'peek_delimiters'(target, pos)
@@ -484,7 +565,13 @@
     $P10.'!cursor_names'('quote_delimited')
     pos = $P10.'pos'()
     cur.'!cursor_pass'(pos, 'quote_EXPR')
+    if null debug goto done
+    cur.'!cursor_debug'('PASS', 'quote_EXPR')
+    goto done
   fail:
+    if null debug goto done
+    cur.'!cursor_debug'('FAIL', 'quote_EXPR')
+  done:
     .return (cur)
 .end
 
@@ -574,6 +661,13 @@
     .param string preclim      :optional
     .param int has_preclim     :opt_flag
 
+    .local pmc here, pos, debug
+    (here, pos) = self.'!cursor_start'()
+    debug = getattribute here, '$!debug'
+    if null debug goto debug_1
+    here.'!cursor_debug'('START', 'EXPR')
+  debug_1:
+
     if has_preclim goto have_preclim
     preclim = ''
   have_preclim:
@@ -588,9 +682,6 @@
     termstack = new ['ResizablePMCArray']
     .lex '@termstack', termstack
 
-    .local pmc here, from, pos
-    (here, pos) = self.'!cursor_start'()
-
   term_loop:
     here = here.termishrx()
     unless here goto fail
@@ -678,6 +769,11 @@
     if inprec <= preclim goto term_done
     inassoc = inO['assoc']
 
+    $P0 = inO['sub']
+    if null $P0 goto subprec_done
+    inO['prec'] = $P0
+  subprec_done:
+
   reduce_loop:
     unless opstack goto reduce_done
     $P0 = opstack[-1]
@@ -718,7 +814,14 @@
     setattribute here, '$!pos', pos
     setattribute here, '$!match', term
     here.'!reduce'('EXPR')
+    if null debug goto done
+    here.'!cursor_debug'('PASS', 'EXPR')
+    goto done
+
   fail:
+    if null debug goto done
+    here.'!cursor_debug'('FAIL', 'EXPR')
+  done:
     .return (here)
 
   err_internal:
@@ -809,7 +912,7 @@
 
     .local pmc pos
     pos = self.'pos'()
-    self.'!cursor_debug'('START MARKER name=', markname, ', pos=', pos)
+    self.'!cursor_debug'('START', 'MARKER name=', markname, ', pos=', pos)
 
     .local pmc markhash
     markhash = get_global '%!MARKHASH'
@@ -818,7 +921,7 @@
     set_global '%!MARKHASH', markhash
   have_markhash:
     markhash[markname] = pos
-    self.'!cursor_debug'('PASS  MARKER')
+    self.'!cursor_debug'('PASS', 'MARKER')
     .return (1)
 .end
 
@@ -826,7 +929,7 @@
 .sub 'MARKED' :method
     .param pmc markname
 
-    self.'!cursor_debug'('START MARKED name=', markname)
+    self.'!cursor_debug'('START','MARKED name=', markname)
 
     .local pmc markhash
     markhash = get_global '%!MARKHASH'
@@ -835,10 +938,10 @@
     if null $P0 goto fail
     $P1 = self.'pos'()
     unless $P0 == $P1 goto fail
-    self.'!cursor_debug'('PASS  MARKED')
+    self.'!cursor_debug'('PASS','MARKED')
     .return (1)
   fail:
-    self.'!cursor_debug'('FAIL  MARKED')
+    self.'!cursor_debug'('FAIL','MARKED')
     .return (0)
 .end
 
@@ -902,7 +1005,7 @@
 ### .include 'gen/hllgrammar-grammar.pir'
 
 .namespace []
-.sub "_block11"  :anon :subid("10_1280467467.13603")
+.sub "_block11"  :anon :subid("10_1284728468.35267")
 .annotate 'line', 0
     get_hll_global $P14, ["HLL";"Grammar"], "_block13" 
     capture_lex $P14
@@ -919,15 +1022,15 @@
     $P332 = $P14()
 .annotate 'line', 1
     .return ($P332)
-    .const 'Sub' $P334 = "106_1280467467.13603" 
+    .const 'Sub' $P334 = "106_1284728468.35267" 
     .return ($P334)
 .end
 
 
 .namespace []
-.sub "" :load :init :subid("post107") :outer("10_1280467467.13603")
+.sub "" :load :init :subid("post107") :outer("10_1284728468.35267")
 .annotate 'line', 0
-    .const 'Sub' $P12 = "10_1280467467.13603" 
+    .const 'Sub' $P12 = "10_1284728468.35267" 
     .local pmc block
     set block, $P12
     $P337 = get_root_global ["parrot"], "P6metaclass"
@@ -936,83 +1039,83 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "_block13"  :subid("11_1280467467.13603") :outer("10_1280467467.13603")
+.sub "_block13"  :subid("11_1284728468.35267") :outer("10_1284728468.35267")
 .annotate 'line', 5
-    .const 'Sub' $P319 = "103_1280467467.13603" 
+    .const 'Sub' $P319 = "103_1284728468.35267" 
     capture_lex $P319
-    .const 'Sub' $P313 = "101_1280467467.13603" 
+    .const 'Sub' $P313 = "101_1284728468.35267" 
     capture_lex $P313
-    .const 'Sub' $P300 = "98_1280467467.13603" 
+    .const 'Sub' $P300 = "98_1284728468.35267" 
     capture_lex $P300
-    .const 'Sub' $P268 = "93_1280467467.13603" 
+    .const 'Sub' $P268 = "93_1284728468.35267" 
     capture_lex $P268
-    .const 'Sub' $P262 = "91_1280467467.13603" 
+    .const 'Sub' $P262 = "91_1284728468.35267" 
     capture_lex $P262
-    .const 'Sub' $P257 = "89_1280467467.13603" 
+    .const 'Sub' $P257 = "89_1284728468.35267" 
     capture_lex $P257
-    .const 'Sub' $P251 = "87_1280467467.13603" 
+    .const 'Sub' $P251 = "87_1284728468.35267" 
     capture_lex $P251
-    .const 'Sub' $P245 = "85_1280467467.13603" 
+    .const 'Sub' $P245 = "85_1284728468.35267" 
     capture_lex $P245
-    .const 'Sub' $P240 = "83_1280467467.13603" 
+    .const 'Sub' $P240 = "83_1284728468.35267" 
     capture_lex $P240
-    .const 'Sub' $P235 = "81_1280467467.13603" 
+    .const 'Sub' $P235 = "81_1284728468.35267" 
     capture_lex $P235
-    .const 'Sub' $P230 = "79_1280467467.13603" 
+    .const 'Sub' $P230 = "79_1284728468.35267" 
     capture_lex $P230
-    .const 'Sub' $P225 = "77_1280467467.13603" 
+    .const 'Sub' $P225 = "77_1284728468.35267" 
     capture_lex $P225
-    .const 'Sub' $P220 = "75_1280467467.13603" 
+    .const 'Sub' $P220 = "75_1284728468.35267" 
     capture_lex $P220
-    .const 'Sub' $P215 = "73_1280467467.13603" 
+    .const 'Sub' $P215 = "73_1284728468.35267" 
     capture_lex $P215
-    .const 'Sub' $P210 = "71_1280467467.13603" 
+    .const 'Sub' $P210 = "71_1284728468.35267" 
     capture_lex $P210
-    .const 'Sub' $P205 = "69_1280467467.13603" 
+    .const 'Sub' $P205 = "69_1284728468.35267" 
     capture_lex $P205
-    .const 'Sub' $P195 = "65_1280467467.13603" 
+    .const 'Sub' $P195 = "65_1284728468.35267" 
     capture_lex $P195
-    .const 'Sub' $P182 = "63_1280467467.13603" 
+    .const 'Sub' $P182 = "63_1284728468.35267" 
     capture_lex $P182
-    .const 'Sub' $P170 = "61_1280467467.13603" 
+    .const 'Sub' $P170 = "61_1284728468.35267" 
     capture_lex $P170
-    .const 'Sub' $P164 = "59_1280467467.13603" 
+    .const 'Sub' $P164 = "59_1284728468.35267" 
     capture_lex $P164
-    .const 'Sub' $P157 = "57_1280467467.13603" 
+    .const 'Sub' $P157 = "57_1284728468.35267" 
     capture_lex $P157
-    .const 'Sub' $P151 = "55_1280467467.13603" 
+    .const 'Sub' $P151 = "55_1284728468.35267" 
     capture_lex $P151
-    .const 'Sub' $P144 = "53_1280467467.13603" 
+    .const 'Sub' $P144 = "53_1284728468.35267" 
     capture_lex $P144
-    .const 'Sub' $P138 = "51_1280467467.13603" 
+    .const 'Sub' $P138 = "51_1284728468.35267" 
     capture_lex $P138
-    .const 'Sub' $P131 = "49_1280467467.13603" 
+    .const 'Sub' $P131 = "49_1284728468.35267" 
     capture_lex $P131
-    .const 'Sub' $P125 = "47_1280467467.13603" 
+    .const 'Sub' $P125 = "47_1284728468.35267" 
     capture_lex $P125
-    .const 'Sub' $P119 = "45_1280467467.13603" 
+    .const 'Sub' $P119 = "45_1284728468.35267" 
     capture_lex $P119
-    .const 'Sub' $P110 = "43_1280467467.13603" 
+    .const 'Sub' $P110 = "43_1284728468.35267" 
     capture_lex $P110
-    .const 'Sub' $P102 = "41_1280467467.13603" 
+    .const 'Sub' $P102 = "41_1284728468.35267" 
     capture_lex $P102
-    .const 'Sub' $P92 = "40_1280467467.13603" 
+    .const 'Sub' $P92 = "40_1284728468.35267" 
     capture_lex $P92
-    .const 'Sub' $P86 = "38_1280467467.13603" 
+    .const 'Sub' $P86 = "38_1284728468.35267" 
     capture_lex $P86
-    .const 'Sub' $P81 = "36_1280467467.13603" 
+    .const 'Sub' $P81 = "36_1284728468.35267" 
     capture_lex $P81
-    .const 'Sub' $P73 = "34_1280467467.13603" 
+    .const 'Sub' $P73 = "34_1284728468.35267" 
     capture_lex $P73
-    .const 'Sub' $P67 = "32_1280467467.13603" 
+    .const 'Sub' $P67 = "32_1284728468.35267" 
     capture_lex $P67
-    .const 'Sub' $P61 = "30_1280467467.13603" 
+    .const 'Sub' $P61 = "30_1284728468.35267" 
     capture_lex $P61
-    .const 'Sub' $P55 = "28_1280467467.13603" 
+    .const 'Sub' $P55 = "28_1284728468.35267" 
     capture_lex $P55
-    .const 'Sub' $P22 = "14_1280467467.13603" 
+    .const 'Sub' $P22 = "14_1284728468.35267" 
     capture_lex $P22
-    .const 'Sub' $P15 = "12_1280467467.13603" 
+    .const 'Sub' $P15 = "12_1284728468.35267" 
     capture_lex $P15
     $P0 = find_dynamic_lex "$*CTXSAVE"
     if null $P0 goto ctxsave_done
@@ -1021,17 +1124,17 @@
     $P0."ctxsave"()
   ctxsave_done:
 .annotate 'line', 33
-    .const 'Sub' $P319 = "103_1280467467.13603" 
+    .const 'Sub' $P319 = "103_1284728468.35267" 
     capture_lex $P319
 .annotate 'line', 5
     .return ($P319)
-    .const 'Sub' $P329 = "105_1280467467.13603" 
+    .const 'Sub' $P329 = "105_1284728468.35267" 
     .return ($P329)
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "ws"  :subid("12_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "ws"  :subid("12_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 5
     .local string rx16_tgt
     .local int rx16_pos
@@ -1039,7 +1142,9 @@
     .local int rx16_eos
     .local int rx16_rep
     .local pmc rx16_cur
+    .local pmc rx16_debug
     (rx16_cur, rx16_pos, rx16_tgt, $I10) = self."!cursor_start"()
+    getattribute rx16_debug, rx16_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx16_cur
     .local pmc match
     .lex "$/", match
@@ -1051,7 +1156,9 @@
     substr rx16_tgt, rx16_tgt, rx16_off
   rx16_start:
     eq $I10, 1, rx16_restart
-    rx16_cur."!cursor_debug"("START ", "ws")
+    if_null rx16_debug, debug_108
+    rx16_cur."!cursor_debug"("START", "ws")
+  debug_108:
     $I10 = self.'from'()
     ne $I10, -1, rxscan19_done
     goto rxscan19_scan
@@ -1087,8 +1194,8 @@
     add $I11, rx16_pos, 1
     gt $I11, rx16_eos, rx16_fail
     sub $I11, rx16_pos, rx16_off
-    substr $S10, rx16_tgt, $I11, 1
-    ne $S10, "#", rx16_fail
+    ord $I11, rx16_tgt, $I11
+    ne $I11, 35, rx16_fail
     add rx16_pos, 1
   # rx charclass_q N r 0..-1
     sub $I10, rx16_pos, rx16_off
@@ -1103,10 +1210,14 @@
   rxquantr20_done:
   # rx pass
     rx16_cur."!cursor_pass"(rx16_pos, "ws")
-    rx16_cur."!cursor_debug"("PASS  ", "ws", " at pos=", rx16_pos)
+    if_null rx16_debug, debug_109
+    rx16_cur."!cursor_debug"("PASS", "ws", " at pos=", rx16_pos)
+  debug_109:
     .return (rx16_cur)
   rx16_restart:
-    rx16_cur."!cursor_debug"("NEXT ", "ws")
+    if_null rx16_debug, debug_110
+    rx16_cur."!cursor_debug"("NEXT", "ws")
+  debug_110:
   rx16_fail:
     (rx16_rep, rx16_pos, $I10, $P10) = rx16_cur."!mark_fail"(0)
     lt rx16_pos, -1, rx16_done
@@ -1114,14 +1225,16 @@
     jump $I10
   rx16_done:
     rx16_cur."!cursor_fail"()
-    rx16_cur."!cursor_debug"("FAIL  ", "ws")
+    if_null rx16_debug, debug_111
+    rx16_cur."!cursor_debug"("FAIL", "ws")
+  debug_111:
     .return (rx16_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__ws"  :subid("13_1280467467.13603") :method
+.sub "!PREFIX__ws"  :subid("13_1284728468.35267") :method
 .annotate 'line', 5
     new $P18, "ResizablePMCArray"
     push $P18, ""
@@ -1130,7 +1243,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "termish"  :subid("14_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "termish"  :subid("14_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 5
     .local string rx23_tgt
     .local int rx23_pos
@@ -1138,8 +1251,10 @@
     .local int rx23_eos
     .local int rx23_rep
     .local pmc rx23_cur
+    .local pmc rx23_debug
     (rx23_cur, rx23_pos, rx23_tgt, $I10) = self."!cursor_start"()
-    rx23_cur."!cursor_caparray"("prefixish", "postfixish")
+    rx23_cur."!cursor_caparray"("postfixish", "prefixish")
+    getattribute rx23_debug, rx23_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx23_cur
     .local pmc match
     .lex "$/", match
@@ -1151,7 +1266,9 @@
     substr rx23_tgt, rx23_tgt, rx23_off
   rx23_start:
     eq $I10, 1, rx23_restart
-    rx23_cur."!cursor_debug"("START ", "termish")
+    if_null rx23_debug, debug_112
+    rx23_cur."!cursor_debug"("START", "termish")
+  debug_112:
     $I10 = self.'from'()
     ne $I10, -1, rxscan26_done
     goto rxscan26_scan
@@ -1223,11 +1340,15 @@
 .annotate 'line', 7
   # rx pass
     rx23_cur."!cursor_pass"(rx23_pos, "termish")
-    rx23_cur."!cursor_debug"("PASS  ", "termish", " at pos=", rx23_pos)
+    if_null rx23_debug, debug_113
+    rx23_cur."!cursor_debug"("PASS", "termish", " at pos=", rx23_pos)
+  debug_113:
     .return (rx23_cur)
   rx23_restart:
 .annotate 'line', 5
-    rx23_cur."!cursor_debug"("NEXT ", "termish")
+    if_null rx23_debug, debug_114
+    rx23_cur."!cursor_debug"("NEXT", "termish")
+  debug_114:
   rx23_fail:
     (rx23_rep, rx23_pos, $I10, $P10) = rx23_cur."!mark_fail"(0)
     lt rx23_pos, -1, rx23_done
@@ -1235,14 +1356,16 @@
     jump $I10
   rx23_done:
     rx23_cur."!cursor_fail"()
-    rx23_cur."!cursor_debug"("FAIL  ", "termish")
+    if_null rx23_debug, debug_115
+    rx23_cur."!cursor_debug"("FAIL", "termish")
+  debug_115:
     .return (rx23_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__termish"  :subid("15_1280467467.13603") :method
+.sub "!PREFIX__termish"  :subid("15_1284728468.35267") :method
 .annotate 'line', 5
     new $P25, "ResizablePMCArray"
     push $P25, ""
@@ -1251,7 +1374,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "term"  :subid("16_1280467467.13603") :method
+.sub "term"  :subid("16_1284728468.35267") :method
 .annotate 'line', 13
     $P32 = self."!protoregex"("term")
     .return ($P32)
@@ -1259,7 +1382,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__term"  :subid("17_1280467467.13603") :method
+.sub "!PREFIX__term"  :subid("17_1284728468.35267") :method
 .annotate 'line', 13
     $P34 = self."!PREFIX__!protoregex"("term")
     .return ($P34)
@@ -1267,7 +1390,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "infix"  :subid("18_1280467467.13603") :method
+.sub "infix"  :subid("18_1284728468.35267") :method
 .annotate 'line', 14
     $P36 = self."!protoregex"("infix")
     .return ($P36)
@@ -1275,7 +1398,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__infix"  :subid("19_1280467467.13603") :method
+.sub "!PREFIX__infix"  :subid("19_1284728468.35267") :method
 .annotate 'line', 14
     $P38 = self."!PREFIX__!protoregex"("infix")
     .return ($P38)
@@ -1283,7 +1406,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "prefix"  :subid("20_1280467467.13603") :method
+.sub "prefix"  :subid("20_1284728468.35267") :method
 .annotate 'line', 15
     $P40 = self."!protoregex"("prefix")
     .return ($P40)
@@ -1291,7 +1414,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__prefix"  :subid("21_1280467467.13603") :method
+.sub "!PREFIX__prefix"  :subid("21_1284728468.35267") :method
 .annotate 'line', 15
     $P42 = self."!PREFIX__!protoregex"("prefix")
     .return ($P42)
@@ -1299,7 +1422,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "postfix"  :subid("22_1280467467.13603") :method
+.sub "postfix"  :subid("22_1284728468.35267") :method
 .annotate 'line', 16
     $P44 = self."!protoregex"("postfix")
     .return ($P44)
@@ -1307,7 +1430,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__postfix"  :subid("23_1280467467.13603") :method
+.sub "!PREFIX__postfix"  :subid("23_1284728468.35267") :method
 .annotate 'line', 16
     $P46 = self."!PREFIX__!protoregex"("postfix")
     .return ($P46)
@@ -1315,7 +1438,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "circumfix"  :subid("24_1280467467.13603") :method
+.sub "circumfix"  :subid("24_1284728468.35267") :method
 .annotate 'line', 17
     $P48 = self."!protoregex"("circumfix")
     .return ($P48)
@@ -1323,7 +1446,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__circumfix"  :subid("25_1280467467.13603") :method
+.sub "!PREFIX__circumfix"  :subid("25_1284728468.35267") :method
 .annotate 'line', 17
     $P50 = self."!PREFIX__!protoregex"("circumfix")
     .return ($P50)
@@ -1331,7 +1454,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "postcircumfix"  :subid("26_1280467467.13603") :method
+.sub "postcircumfix"  :subid("26_1284728468.35267") :method
 .annotate 'line', 18
     $P52 = self."!protoregex"("postcircumfix")
     .return ($P52)
@@ -1339,7 +1462,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__postcircumfix"  :subid("27_1280467467.13603") :method
+.sub "!PREFIX__postcircumfix"  :subid("27_1284728468.35267") :method
 .annotate 'line', 18
     $P54 = self."!PREFIX__!protoregex"("postcircumfix")
     .return ($P54)
@@ -1347,7 +1470,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "term:sym<circumfix>"  :subid("28_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "term:sym<circumfix>"  :subid("28_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 5
     .local string rx56_tgt
     .local int rx56_pos
@@ -1355,7 +1478,9 @@
     .local int rx56_eos
     .local int rx56_rep
     .local pmc rx56_cur
+    .local pmc rx56_debug
     (rx56_cur, rx56_pos, rx56_tgt, $I10) = self."!cursor_start"()
+    getattribute rx56_debug, rx56_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx56_cur
     .local pmc match
     .lex "$/", match
@@ -1367,7 +1492,9 @@
     substr rx56_tgt, rx56_tgt, rx56_off
   rx56_start:
     eq $I10, 1, rx56_restart
-    rx56_cur."!cursor_debug"("START ", "term:sym<circumfix>")
+    if_null rx56_debug, debug_116
+    rx56_cur."!cursor_debug"("START", "term:sym<circumfix>")
+  debug_116:
     $I10 = self.'from'()
     ne $I10, -1, rxscan60_done
     goto rxscan60_scan
@@ -1390,11 +1517,15 @@
     rx56_pos = $P10."pos"()
   # rx pass
     rx56_cur."!cursor_pass"(rx56_pos, "term:sym<circumfix>")
-    rx56_cur."!cursor_debug"("PASS  ", "term:sym<circumfix>", " at pos=", rx56_pos)
+    if_null rx56_debug, debug_117
+    rx56_cur."!cursor_debug"("PASS", "term:sym<circumfix>", " at pos=", rx56_pos)
+  debug_117:
     .return (rx56_cur)
   rx56_restart:
 .annotate 'line', 5
-    rx56_cur."!cursor_debug"("NEXT ", "term:sym<circumfix>")
+    if_null rx56_debug, debug_118
+    rx56_cur."!cursor_debug"("NEXT", "term:sym<circumfix>")
+  debug_118:
   rx56_fail:
     (rx56_rep, rx56_pos, $I10, $P10) = rx56_cur."!mark_fail"(0)
     lt rx56_pos, -1, rx56_done
@@ -1402,14 +1533,16 @@
     jump $I10
   rx56_done:
     rx56_cur."!cursor_fail"()
-    rx56_cur."!cursor_debug"("FAIL  ", "term:sym<circumfix>")
+    if_null rx56_debug, debug_119
+    rx56_cur."!cursor_debug"("FAIL", "term:sym<circumfix>")
+  debug_119:
     .return (rx56_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__term:sym<circumfix>"  :subid("29_1280467467.13603") :method
+.sub "!PREFIX__term:sym<circumfix>"  :subid("29_1284728468.35267") :method
 .annotate 'line', 5
     $P58 = self."!PREFIX__!subrule"("circumfix", "")
     new $P59, "ResizablePMCArray"
@@ -1419,7 +1552,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "infixish"  :subid("30_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "infixish"  :subid("30_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 5
     .local string rx62_tgt
     .local int rx62_pos
@@ -1427,7 +1560,9 @@
     .local int rx62_eos
     .local int rx62_rep
     .local pmc rx62_cur
+    .local pmc rx62_debug
     (rx62_cur, rx62_pos, rx62_tgt, $I10) = self."!cursor_start"()
+    getattribute rx62_debug, rx62_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx62_cur
     .local pmc match
     .lex "$/", match
@@ -1439,7 +1574,9 @@
     substr rx62_tgt, rx62_tgt, rx62_off
   rx62_start:
     eq $I10, 1, rx62_restart
-    rx62_cur."!cursor_debug"("START ", "infixish")
+    if_null rx62_debug, debug_120
+    rx62_cur."!cursor_debug"("START", "infixish")
+  debug_120:
     $I10 = self.'from'()
     ne $I10, -1, rxscan66_done
     goto rxscan66_scan
@@ -1462,11 +1599,15 @@
     rx62_pos = $P10."pos"()
   # rx pass
     rx62_cur."!cursor_pass"(rx62_pos, "infixish")
-    rx62_cur."!cursor_debug"("PASS  ", "infixish", " at pos=", rx62_pos)
+    if_null rx62_debug, debug_121
+    rx62_cur."!cursor_debug"("PASS", "infixish", " at pos=", rx62_pos)
+  debug_121:
     .return (rx62_cur)
   rx62_restart:
 .annotate 'line', 5
-    rx62_cur."!cursor_debug"("NEXT ", "infixish")
+    if_null rx62_debug, debug_122
+    rx62_cur."!cursor_debug"("NEXT", "infixish")
+  debug_122:
   rx62_fail:
     (rx62_rep, rx62_pos, $I10, $P10) = rx62_cur."!mark_fail"(0)
     lt rx62_pos, -1, rx62_done
@@ -1474,14 +1615,16 @@
     jump $I10
   rx62_done:
     rx62_cur."!cursor_fail"()
-    rx62_cur."!cursor_debug"("FAIL  ", "infixish")
+    if_null rx62_debug, debug_123
+    rx62_cur."!cursor_debug"("FAIL", "infixish")
+  debug_123:
     .return (rx62_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__infixish"  :subid("31_1280467467.13603") :method
+.sub "!PREFIX__infixish"  :subid("31_1284728468.35267") :method
 .annotate 'line', 5
     $P64 = self."!PREFIX__!subrule"("infix", "")
     new $P65, "ResizablePMCArray"
@@ -1491,7 +1634,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "prefixish"  :subid("32_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "prefixish"  :subid("32_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 5
     .local string rx68_tgt
     .local int rx68_pos
@@ -1499,7 +1642,9 @@
     .local int rx68_eos
     .local int rx68_rep
     .local pmc rx68_cur
+    .local pmc rx68_debug
     (rx68_cur, rx68_pos, rx68_tgt, $I10) = self."!cursor_start"()
+    getattribute rx68_debug, rx68_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx68_cur
     .local pmc match
     .lex "$/", match
@@ -1511,7 +1656,9 @@
     substr rx68_tgt, rx68_tgt, rx68_off
   rx68_start:
     eq $I10, 1, rx68_restart
-    rx68_cur."!cursor_debug"("START ", "prefixish")
+    if_null rx68_debug, debug_124
+    rx68_cur."!cursor_debug"("START", "prefixish")
+  debug_124:
     $I10 = self.'from'()
     ne $I10, -1, rxscan72_done
     goto rxscan72_scan
@@ -1539,11 +1686,15 @@
     rx68_pos = $P10."pos"()
   # rx pass
     rx68_cur."!cursor_pass"(rx68_pos, "prefixish")
-    rx68_cur."!cursor_debug"("PASS  ", "prefixish", " at pos=", rx68_pos)
+    if_null rx68_debug, debug_125
+    rx68_cur."!cursor_debug"("PASS", "prefixish", " at pos=", rx68_pos)
+  debug_125:
     .return (rx68_cur)
   rx68_restart:
 .annotate 'line', 5
-    rx68_cur."!cursor_debug"("NEXT ", "prefixish")
+    if_null rx68_debug, debug_126
+    rx68_cur."!cursor_debug"("NEXT", "prefixish")
+  debug_126:
   rx68_fail:
     (rx68_rep, rx68_pos, $I10, $P10) = rx68_cur."!mark_fail"(0)
     lt rx68_pos, -1, rx68_done
@@ -1551,14 +1702,16 @@
     jump $I10
   rx68_done:
     rx68_cur."!cursor_fail"()
-    rx68_cur."!cursor_debug"("FAIL  ", "prefixish")
+    if_null rx68_debug, debug_127
+    rx68_cur."!cursor_debug"("FAIL", "prefixish")
+  debug_127:
     .return (rx68_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__prefixish"  :subid("33_1280467467.13603") :method
+.sub "!PREFIX__prefixish"  :subid("33_1284728468.35267") :method
 .annotate 'line', 5
     $P70 = self."!PREFIX__!subrule"("prefix", "")
     new $P71, "ResizablePMCArray"
@@ -1568,7 +1721,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "postfixish"  :subid("34_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "postfixish"  :subid("34_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 5
     .local string rx74_tgt
     .local int rx74_pos
@@ -1576,7 +1729,9 @@
     .local int rx74_eos
     .local int rx74_rep
     .local pmc rx74_cur
+    .local pmc rx74_debug
     (rx74_cur, rx74_pos, rx74_tgt, $I10) = self."!cursor_start"()
+    getattribute rx74_debug, rx74_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx74_cur
     .local pmc match
     .lex "$/", match
@@ -1588,7 +1743,9 @@
     substr rx74_tgt, rx74_tgt, rx74_off
   rx74_start:
     eq $I10, 1, rx74_restart
-    rx74_cur."!cursor_debug"("START ", "postfixish")
+    if_null rx74_debug, debug_128
+    rx74_cur."!cursor_debug"("START", "postfixish")
+  debug_128:
     $I10 = self.'from'()
     ne $I10, -1, rxscan79_done
     goto rxscan79_scan
@@ -1627,11 +1784,15 @@
 .annotate 'line', 24
   # rx pass
     rx74_cur."!cursor_pass"(rx74_pos, "postfixish")
-    rx74_cur."!cursor_debug"("PASS  ", "postfixish", " at pos=", rx74_pos)
+    if_null rx74_debug, debug_129
+    rx74_cur."!cursor_debug"("PASS", "postfixish", " at pos=", rx74_pos)
+  debug_129:
     .return (rx74_cur)
   rx74_restart:
 .annotate 'line', 5
-    rx74_cur."!cursor_debug"("NEXT ", "postfixish")
+    if_null rx74_debug, debug_130
+    rx74_cur."!cursor_debug"("NEXT", "postfixish")
+  debug_130:
   rx74_fail:
     (rx74_rep, rx74_pos, $I10, $P10) = rx74_cur."!mark_fail"(0)
     lt rx74_pos, -1, rx74_done
@@ -1639,14 +1800,16 @@
     jump $I10
   rx74_done:
     rx74_cur."!cursor_fail"()
-    rx74_cur."!cursor_debug"("FAIL  ", "postfixish")
+    if_null rx74_debug, debug_131
+    rx74_cur."!cursor_debug"("FAIL", "postfixish")
+  debug_131:
     .return (rx74_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__postfixish"  :subid("35_1280467467.13603") :method
+.sub "!PREFIX__postfixish"  :subid("35_1284728468.35267") :method
 .annotate 'line', 5
     $P76 = self."!PREFIX__!subrule"("postcircumfix", "")
     $P77 = self."!PREFIX__!subrule"("postfix", "")
@@ -1658,7 +1821,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "nullterm"  :subid("36_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "nullterm"  :subid("36_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 5
     .local string rx82_tgt
     .local int rx82_pos
@@ -1666,7 +1829,9 @@
     .local int rx82_eos
     .local int rx82_rep
     .local pmc rx82_cur
+    .local pmc rx82_debug
     (rx82_cur, rx82_pos, rx82_tgt, $I10) = self."!cursor_start"()
+    getattribute rx82_debug, rx82_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx82_cur
     .local pmc match
     .lex "$/", match
@@ -1678,7 +1843,9 @@
     substr rx82_tgt, rx82_tgt, rx82_off
   rx82_start:
     eq $I10, 1, rx82_restart
-    rx82_cur."!cursor_debug"("START ", "nullterm")
+    if_null rx82_debug, debug_132
+    rx82_cur."!cursor_debug"("START", "nullterm")
+  debug_132:
     $I10 = self.'from'()
     ne $I10, -1, rxscan85_done
     goto rxscan85_scan
@@ -1694,11 +1861,15 @@
 .annotate 'line', 29
   # rx pass
     rx82_cur."!cursor_pass"(rx82_pos, "nullterm")
-    rx82_cur."!cursor_debug"("PASS  ", "nullterm", " at pos=", rx82_pos)
+    if_null rx82_debug, debug_133
+    rx82_cur."!cursor_debug"("PASS", "nullterm", " at pos=", rx82_pos)
+  debug_133:
     .return (rx82_cur)
   rx82_restart:
 .annotate 'line', 5
-    rx82_cur."!cursor_debug"("NEXT ", "nullterm")
+    if_null rx82_debug, debug_134
+    rx82_cur."!cursor_debug"("NEXT", "nullterm")
+  debug_134:
   rx82_fail:
     (rx82_rep, rx82_pos, $I10, $P10) = rx82_cur."!mark_fail"(0)
     lt rx82_pos, -1, rx82_done
@@ -1706,14 +1877,16 @@
     jump $I10
   rx82_done:
     rx82_cur."!cursor_fail"()
-    rx82_cur."!cursor_debug"("FAIL  ", "nullterm")
+    if_null rx82_debug, debug_135
+    rx82_cur."!cursor_debug"("FAIL", "nullterm")
+  debug_135:
     .return (rx82_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__nullterm"  :subid("37_1280467467.13603") :method
+.sub "!PREFIX__nullterm"  :subid("37_1284728468.35267") :method
 .annotate 'line', 5
     new $P84, "ResizablePMCArray"
     push $P84, ""
@@ -1722,7 +1895,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "nullterm_alt"  :subid("38_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "nullterm_alt"  :subid("38_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 5
     .local string rx87_tgt
     .local int rx87_pos
@@ -1730,7 +1903,9 @@
     .local int rx87_eos
     .local int rx87_rep
     .local pmc rx87_cur
+    .local pmc rx87_debug
     (rx87_cur, rx87_pos, rx87_tgt, $I10) = self."!cursor_start"()
+    getattribute rx87_debug, rx87_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx87_cur
     .local pmc match
     .lex "$/", match
@@ -1742,7 +1917,9 @@
     substr rx87_tgt, rx87_tgt, rx87_off
   rx87_start:
     eq $I10, 1, rx87_restart
-    rx87_cur."!cursor_debug"("START ", "nullterm_alt")
+    if_null rx87_debug, debug_136
+    rx87_cur."!cursor_debug"("START", "nullterm_alt")
+  debug_136:
     $I10 = self.'from'()
     ne $I10, -1, rxscan91_done
     goto rxscan91_scan
@@ -1765,11 +1942,15 @@
     rx87_pos = $P10."pos"()
   # rx pass
     rx87_cur."!cursor_pass"(rx87_pos, "nullterm_alt")
-    rx87_cur."!cursor_debug"("PASS  ", "nullterm_alt", " at pos=", rx87_pos)
+    if_null rx87_debug, debug_137
+    rx87_cur."!cursor_debug"("PASS", "nullterm_alt", " at pos=", rx87_pos)
+  debug_137:
     .return (rx87_cur)
   rx87_restart:
 .annotate 'line', 5
-    rx87_cur."!cursor_debug"("NEXT ", "nullterm_alt")
+    if_null rx87_debug, debug_138
+    rx87_cur."!cursor_debug"("NEXT", "nullterm_alt")
+  debug_138:
   rx87_fail:
     (rx87_rep, rx87_pos, $I10, $P10) = rx87_cur."!mark_fail"(0)
     lt rx87_pos, -1, rx87_done
@@ -1777,14 +1958,16 @@
     jump $I10
   rx87_done:
     rx87_cur."!cursor_fail"()
-    rx87_cur."!cursor_debug"("FAIL  ", "nullterm_alt")
+    if_null rx87_debug, debug_139
+    rx87_cur."!cursor_debug"("FAIL", "nullterm_alt")
+  debug_139:
     .return (rx87_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__nullterm_alt"  :subid("39_1280467467.13603") :method
+.sub "!PREFIX__nullterm_alt"  :subid("39_1284728468.35267") :method
 .annotate 'line', 5
     $P89 = self."!PREFIX__!subrule"("nullterm", "")
     new $P90, "ResizablePMCArray"
@@ -1795,7 +1978,7 @@
 
 .namespace ["HLL";"Grammar"]
 .include "except_types.pasm"
-.sub "nulltermish"  :subid("40_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "nulltermish"  :subid("40_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     new $P94, 'ExceptionHandler'
     set_addr $P94, control_93
@@ -1822,7 +2005,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_delimited"  :subid("41_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_delimited"  :subid("41_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx103_tgt
     .local int rx103_pos
@@ -1830,8 +2013,10 @@
     .local int rx103_eos
     .local int rx103_rep
     .local pmc rx103_cur
+    .local pmc rx103_debug
     (rx103_cur, rx103_pos, rx103_tgt, $I10) = self."!cursor_start"()
     rx103_cur."!cursor_caparray"("quote_atom")
+    getattribute rx103_debug, rx103_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx103_cur
     .local pmc match
     .lex "$/", match
@@ -1843,7 +2028,9 @@
     substr rx103_tgt, rx103_tgt, rx103_off
   rx103_start:
     eq $I10, 1, rx103_restart
-    rx103_cur."!cursor_debug"("START ", "quote_delimited")
+    if_null rx103_debug, debug_140
+    rx103_cur."!cursor_debug"("START", "quote_delimited")
+  debug_140:
     $I10 = self.'from'()
     ne $I10, -1, rxscan107_done
     goto rxscan107_scan
@@ -1897,11 +2084,15 @@
 .annotate 'line', 36
   # rx pass
     rx103_cur."!cursor_pass"(rx103_pos, "quote_delimited")
-    rx103_cur."!cursor_debug"("PASS  ", "quote_delimited", " at pos=", rx103_pos)
+    if_null rx103_debug, debug_141
+    rx103_cur."!cursor_debug"("PASS", "quote_delimited", " at pos=", rx103_pos)
+  debug_141:
     .return (rx103_cur)
   rx103_restart:
 .annotate 'line', 33
-    rx103_cur."!cursor_debug"("NEXT ", "quote_delimited")
+    if_null rx103_debug, debug_142
+    rx103_cur."!cursor_debug"("NEXT", "quote_delimited")
+  debug_142:
   rx103_fail:
     (rx103_rep, rx103_pos, $I10, $P10) = rx103_cur."!mark_fail"(0)
     lt rx103_pos, -1, rx103_done
@@ -1909,14 +2100,16 @@
     jump $I10
   rx103_done:
     rx103_cur."!cursor_fail"()
-    rx103_cur."!cursor_debug"("FAIL  ", "quote_delimited")
+    if_null rx103_debug, debug_143
+    rx103_cur."!cursor_debug"("FAIL", "quote_delimited")
+  debug_143:
     .return (rx103_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_delimited"  :subid("42_1280467467.13603") :method
+.sub "!PREFIX__quote_delimited"  :subid("42_1284728468.35267") :method
 .annotate 'line', 33
     $P105 = self."!PREFIX__!subrule"("starter", "")
     new $P106, "ResizablePMCArray"
@@ -1926,7 +2119,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_atom"  :subid("43_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_atom"  :subid("43_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx111_tgt
     .local int rx111_pos
@@ -1934,7 +2127,9 @@
     .local int rx111_eos
     .local int rx111_rep
     .local pmc rx111_cur
+    .local pmc rx111_debug
     (rx111_cur, rx111_pos, rx111_tgt, $I10) = self."!cursor_start"()
+    getattribute rx111_debug, rx111_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx111_cur
     .local pmc match
     .lex "$/", match
@@ -1946,7 +2141,9 @@
     substr rx111_tgt, rx111_tgt, rx111_off
   rx111_start:
     eq $I10, 1, rx111_restart
-    rx111_cur."!cursor_debug"("START ", "quote_atom")
+    if_null rx111_debug, debug_144
+    rx111_cur."!cursor_debug"("START", "quote_atom")
+  debug_144:
     $I10 = self.'from'()
     ne $I10, -1, rxscan114_done
     goto rxscan114_scan
@@ -2004,11 +2201,15 @@
 .annotate 'line', 40
   # rx pass
     rx111_cur."!cursor_pass"(rx111_pos, "quote_atom")
-    rx111_cur."!cursor_debug"("PASS  ", "quote_atom", " at pos=", rx111_pos)
+    if_null rx111_debug, debug_145
+    rx111_cur."!cursor_debug"("PASS", "quote_atom", " at pos=", rx111_pos)
+  debug_145:
     .return (rx111_cur)
   rx111_restart:
 .annotate 'line', 33
-    rx111_cur."!cursor_debug"("NEXT ", "quote_atom")
+    if_null rx111_debug, debug_146
+    rx111_cur."!cursor_debug"("NEXT", "quote_atom")
+  debug_146:
   rx111_fail:
     (rx111_rep, rx111_pos, $I10, $P10) = rx111_cur."!mark_fail"(0)
     lt rx111_pos, -1, rx111_done
@@ -2016,14 +2217,16 @@
     jump $I10
   rx111_done:
     rx111_cur."!cursor_fail"()
-    rx111_cur."!cursor_debug"("FAIL  ", "quote_atom")
+    if_null rx111_debug, debug_147
+    rx111_cur."!cursor_debug"("FAIL", "quote_atom")
+  debug_147:
     .return (rx111_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_atom"  :subid("44_1280467467.13603") :method
+.sub "!PREFIX__quote_atom"  :subid("44_1284728468.35267") :method
 .annotate 'line', 33
     new $P113, "ResizablePMCArray"
     push $P113, ""
@@ -2032,7 +2235,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "decint"  :subid("45_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "decint"  :subid("45_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx120_tgt
     .local int rx120_pos
@@ -2040,7 +2243,9 @@
     .local int rx120_eos
     .local int rx120_rep
     .local pmc rx120_cur
+    .local pmc rx120_debug
     (rx120_cur, rx120_pos, rx120_tgt, $I10) = self."!cursor_start"()
+    getattribute rx120_debug, rx120_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx120_cur
     .local pmc match
     .lex "$/", match
@@ -2052,7 +2257,9 @@
     substr rx120_tgt, rx120_tgt, rx120_off
   rx120_start:
     eq $I10, 1, rx120_restart
-    rx120_cur."!cursor_debug"("START ", "decint")
+    if_null rx120_debug, debug_148
+    rx120_cur."!cursor_debug"("START", "decint")
+  debug_148:
     $I10 = self.'from'()
     ne $I10, -1, rxscan123_done
     goto rxscan123_scan
@@ -2084,18 +2291,22 @@
     add $I11, rx120_pos, 1
     gt $I11, rx120_eos, rx120_fail
     sub $I11, rx120_pos, rx120_off
-    substr $S10, rx120_tgt, $I11, 1
-    ne $S10, "_", rx120_fail
+    ord $I11, rx120_tgt, $I11
+    ne $I11, 95, rx120_fail
     add rx120_pos, 1
     goto rxquantr124_loop
   rxquantr124_done:
   # rx pass
     rx120_cur."!cursor_pass"(rx120_pos, "decint")
-    rx120_cur."!cursor_debug"("PASS  ", "decint", " at pos=", rx120_pos)
+    if_null rx120_debug, debug_149
+    rx120_cur."!cursor_debug"("PASS", "decint", " at pos=", rx120_pos)
+  debug_149:
     .return (rx120_cur)
   rx120_restart:
 .annotate 'line', 33
-    rx120_cur."!cursor_debug"("NEXT ", "decint")
+    if_null rx120_debug, debug_150
+    rx120_cur."!cursor_debug"("NEXT", "decint")
+  debug_150:
   rx120_fail:
     (rx120_rep, rx120_pos, $I10, $P10) = rx120_cur."!mark_fail"(0)
     lt rx120_pos, -1, rx120_done
@@ -2103,14 +2314,16 @@
     jump $I10
   rx120_done:
     rx120_cur."!cursor_fail"()
-    rx120_cur."!cursor_debug"("FAIL  ", "decint")
+    if_null rx120_debug, debug_151
+    rx120_cur."!cursor_debug"("FAIL", "decint")
+  debug_151:
     .return (rx120_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__decint"  :subid("46_1280467467.13603") :method
+.sub "!PREFIX__decint"  :subid("46_1284728468.35267") :method
 .annotate 'line', 33
     new $P122, "ResizablePMCArray"
     push $P122, ""
@@ -2119,7 +2332,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "decints"  :subid("47_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "decints"  :subid("47_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx126_tgt
     .local int rx126_pos
@@ -2127,8 +2340,10 @@
     .local int rx126_eos
     .local int rx126_rep
     .local pmc rx126_cur
+    .local pmc rx126_debug
     (rx126_cur, rx126_pos, rx126_tgt, $I10) = self."!cursor_start"()
     rx126_cur."!cursor_caparray"("decint")
+    getattribute rx126_debug, rx126_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx126_cur
     .local pmc match
     .lex "$/", match
@@ -2140,7 +2355,9 @@
     substr rx126_tgt, rx126_tgt, rx126_off
   rx126_start:
     eq $I10, 1, rx126_restart
-    rx126_cur."!cursor_debug"("START ", "decints")
+    if_null rx126_debug, debug_152
+    rx126_cur."!cursor_debug"("START", "decints")
+  debug_152:
     $I10 = self.'from'()
     ne $I10, -1, rxscan129_done
     goto rxscan129_scan
@@ -2183,18 +2400,22 @@
     add $I11, rx126_pos, 1
     gt $I11, rx126_eos, rx126_fail
     sub $I11, rx126_pos, rx126_off
-    substr $S10, rx126_tgt, $I11, 1
-    ne $S10, ",", rx126_fail
+    ord $I11, rx126_tgt, $I11
+    ne $I11, 44, rx126_fail
     add rx126_pos, 1
     goto rxquantr130_loop
   rxquantr130_done:
   # rx pass
     rx126_cur."!cursor_pass"(rx126_pos, "decints")
-    rx126_cur."!cursor_debug"("PASS  ", "decints", " at pos=", rx126_pos)
+    if_null rx126_debug, debug_153
+    rx126_cur."!cursor_debug"("PASS", "decints", " at pos=", rx126_pos)
+  debug_153:
     .return (rx126_cur)
   rx126_restart:
 .annotate 'line', 33
-    rx126_cur."!cursor_debug"("NEXT ", "decints")
+    if_null rx126_debug, debug_154
+    rx126_cur."!cursor_debug"("NEXT", "decints")
+  debug_154:
   rx126_fail:
     (rx126_rep, rx126_pos, $I10, $P10) = rx126_cur."!mark_fail"(0)
     lt rx126_pos, -1, rx126_done
@@ -2202,14 +2423,16 @@
     jump $I10
   rx126_done:
     rx126_cur."!cursor_fail"()
-    rx126_cur."!cursor_debug"("FAIL  ", "decints")
+    if_null rx126_debug, debug_155
+    rx126_cur."!cursor_debug"("FAIL", "decints")
+  debug_155:
     .return (rx126_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__decints"  :subid("48_1280467467.13603") :method
+.sub "!PREFIX__decints"  :subid("48_1284728468.35267") :method
 .annotate 'line', 33
     new $P128, "ResizablePMCArray"
     push $P128, ""
@@ -2218,7 +2441,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "hexint"  :subid("49_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "hexint"  :subid("49_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx132_tgt
     .local int rx132_pos
@@ -2226,7 +2449,9 @@
     .local int rx132_eos
     .local int rx132_rep
     .local pmc rx132_cur
+    .local pmc rx132_debug
     (rx132_cur, rx132_pos, rx132_tgt, $I10) = self."!cursor_start"()
+    getattribute rx132_debug, rx132_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx132_cur
     .local pmc match
     .lex "$/", match
@@ -2238,7 +2463,9 @@
     substr rx132_tgt, rx132_tgt, rx132_off
   rx132_start:
     eq $I10, 1, rx132_restart
-    rx132_cur."!cursor_debug"("START ", "hexint")
+    if_null rx132_debug, debug_156
+    rx132_cur."!cursor_debug"("START", "hexint")
+  debug_156:
     $I10 = self.'from'()
     ne $I10, -1, rxscan135_done
     goto rxscan135_scan
@@ -2256,23 +2483,22 @@
     set_addr $I10, rxquantr136_done
     rx132_cur."!mark_push"(0, -1, $I10)
   rxquantr136_loop:
-  # rx rxquantr137 ** 1..*
-    set_addr $I10, rxquantr137_done
-    rx132_cur."!mark_push"(0, -1, $I10)
-  rxquantr137_loop:
-  # rx enumcharlist negate=0 
-    ge rx132_pos, rx132_eos, rx132_fail
+  # rx enumcharlist_q negate=0  r 1..-1
     sub $I10, rx132_pos, rx132_off
+    set rx132_rep, 0
+    sub $I12, rx132_eos, rx132_pos
+  rxenumcharlistq137_loop:
+    le $I12, 0, rxenumcharlistq137_done
     substr $S10, rx132_tgt, $I10, 1
     index $I11, "0123456789abcdefABCDEF", $S10
-    lt $I11, 0, rx132_fail
-    inc rx132_pos
-    set_addr $I10, rxquantr137_done
-    (rx132_rep) = rx132_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr137_done
-    rx132_cur."!mark_push"(rx132_rep, rx132_pos, $I10)
-    goto rxquantr137_loop
-  rxquantr137_done:
+    lt $I11, 0, rxenumcharlistq137_done
+    inc rx132_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq137_loop
+  rxenumcharlistq137_done:
+    lt rx132_rep, 1, rx132_fail
+    add rx132_pos, rx132_pos, rx132_rep
     set_addr $I10, rxquantr136_done
     (rx132_rep) = rx132_cur."!mark_commit"($I10)
     set_addr $I10, rxquantr136_done
@@ -2281,18 +2507,22 @@
     add $I11, rx132_pos, 1
     gt $I11, rx132_eos, rx132_fail
     sub $I11, rx132_pos, rx132_off
-    substr $S10, rx132_tgt, $I11, 1
-    ne $S10, "_", rx132_fail
+    ord $I11, rx132_tgt, $I11
+    ne $I11, 95, rx132_fail
     add rx132_pos, 1
     goto rxquantr136_loop
   rxquantr136_done:
   # rx pass
     rx132_cur."!cursor_pass"(rx132_pos, "hexint")
-    rx132_cur."!cursor_debug"("PASS  ", "hexint", " at pos=", rx132_pos)
+    if_null rx132_debug, debug_157
+    rx132_cur."!cursor_debug"("PASS", "hexint", " at pos=", rx132_pos)
+  debug_157:
     .return (rx132_cur)
   rx132_restart:
 .annotate 'line', 33
-    rx132_cur."!cursor_debug"("NEXT ", "hexint")
+    if_null rx132_debug, debug_158
+    rx132_cur."!cursor_debug"("NEXT", "hexint")
+  debug_158:
   rx132_fail:
     (rx132_rep, rx132_pos, $I10, $P10) = rx132_cur."!mark_fail"(0)
     lt rx132_pos, -1, rx132_done
@@ -2300,14 +2530,16 @@
     jump $I10
   rx132_done:
     rx132_cur."!cursor_fail"()
-    rx132_cur."!cursor_debug"("FAIL  ", "hexint")
+    if_null rx132_debug, debug_159
+    rx132_cur."!cursor_debug"("FAIL", "hexint")
+  debug_159:
     .return (rx132_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__hexint"  :subid("50_1280467467.13603") :method
+.sub "!PREFIX__hexint"  :subid("50_1284728468.35267") :method
 .annotate 'line', 33
     new $P134, "ResizablePMCArray"
     push $P134, ""
@@ -2316,7 +2548,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "hexints"  :subid("51_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "hexints"  :subid("51_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx139_tgt
     .local int rx139_pos
@@ -2324,8 +2556,10 @@
     .local int rx139_eos
     .local int rx139_rep
     .local pmc rx139_cur
+    .local pmc rx139_debug
     (rx139_cur, rx139_pos, rx139_tgt, $I10) = self."!cursor_start"()
     rx139_cur."!cursor_caparray"("hexint")
+    getattribute rx139_debug, rx139_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx139_cur
     .local pmc match
     .lex "$/", match
@@ -2337,7 +2571,9 @@
     substr rx139_tgt, rx139_tgt, rx139_off
   rx139_start:
     eq $I10, 1, rx139_restart
-    rx139_cur."!cursor_debug"("START ", "hexints")
+    if_null rx139_debug, debug_160
+    rx139_cur."!cursor_debug"("START", "hexints")
+  debug_160:
     $I10 = self.'from'()
     ne $I10, -1, rxscan142_done
     goto rxscan142_scan
@@ -2380,18 +2616,22 @@
     add $I11, rx139_pos, 1
     gt $I11, rx139_eos, rx139_fail
     sub $I11, rx139_pos, rx139_off
-    substr $S10, rx139_tgt, $I11, 1
-    ne $S10, ",", rx139_fail
+    ord $I11, rx139_tgt, $I11
+    ne $I11, 44, rx139_fail
     add rx139_pos, 1
     goto rxquantr143_loop
   rxquantr143_done:
   # rx pass
     rx139_cur."!cursor_pass"(rx139_pos, "hexints")
-    rx139_cur."!cursor_debug"("PASS  ", "hexints", " at pos=", rx139_pos)
+    if_null rx139_debug, debug_161
+    rx139_cur."!cursor_debug"("PASS", "hexints", " at pos=", rx139_pos)
+  debug_161:
     .return (rx139_cur)
   rx139_restart:
 .annotate 'line', 33
-    rx139_cur."!cursor_debug"("NEXT ", "hexints")
+    if_null rx139_debug, debug_162
+    rx139_cur."!cursor_debug"("NEXT", "hexints")
+  debug_162:
   rx139_fail:
     (rx139_rep, rx139_pos, $I10, $P10) = rx139_cur."!mark_fail"(0)
     lt rx139_pos, -1, rx139_done
@@ -2399,14 +2639,16 @@
     jump $I10
   rx139_done:
     rx139_cur."!cursor_fail"()
-    rx139_cur."!cursor_debug"("FAIL  ", "hexints")
+    if_null rx139_debug, debug_163
+    rx139_cur."!cursor_debug"("FAIL", "hexints")
+  debug_163:
     .return (rx139_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__hexints"  :subid("52_1280467467.13603") :method
+.sub "!PREFIX__hexints"  :subid("52_1284728468.35267") :method
 .annotate 'line', 33
     new $P141, "ResizablePMCArray"
     push $P141, ""
@@ -2415,7 +2657,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "octint"  :subid("53_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "octint"  :subid("53_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx145_tgt
     .local int rx145_pos
@@ -2423,7 +2665,9 @@
     .local int rx145_eos
     .local int rx145_rep
     .local pmc rx145_cur
+    .local pmc rx145_debug
     (rx145_cur, rx145_pos, rx145_tgt, $I10) = self."!cursor_start"()
+    getattribute rx145_debug, rx145_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx145_cur
     .local pmc match
     .lex "$/", match
@@ -2435,7 +2679,9 @@
     substr rx145_tgt, rx145_tgt, rx145_off
   rx145_start:
     eq $I10, 1, rx145_restart
-    rx145_cur."!cursor_debug"("START ", "octint")
+    if_null rx145_debug, debug_164
+    rx145_cur."!cursor_debug"("START", "octint")
+  debug_164:
     $I10 = self.'from'()
     ne $I10, -1, rxscan148_done
     goto rxscan148_scan
@@ -2453,23 +2699,22 @@
     set_addr $I10, rxquantr149_done
     rx145_cur."!mark_push"(0, -1, $I10)
   rxquantr149_loop:
-  # rx rxquantr150 ** 1..*
-    set_addr $I10, rxquantr150_done
-    rx145_cur."!mark_push"(0, -1, $I10)
-  rxquantr150_loop:
-  # rx enumcharlist negate=0 
-    ge rx145_pos, rx145_eos, rx145_fail
+  # rx enumcharlist_q negate=0  r 1..-1
     sub $I10, rx145_pos, rx145_off
+    set rx145_rep, 0
+    sub $I12, rx145_eos, rx145_pos
+  rxenumcharlistq150_loop:
+    le $I12, 0, rxenumcharlistq150_done
     substr $S10, rx145_tgt, $I10, 1
     index $I11, "01234567", $S10
-    lt $I11, 0, rx145_fail
-    inc rx145_pos
-    set_addr $I10, rxquantr150_done
-    (rx145_rep) = rx145_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr150_done
-    rx145_cur."!mark_push"(rx145_rep, rx145_pos, $I10)
-    goto rxquantr150_loop
-  rxquantr150_done:
+    lt $I11, 0, rxenumcharlistq150_done
+    inc rx145_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq150_loop
+  rxenumcharlistq150_done:
+    lt rx145_rep, 1, rx145_fail
+    add rx145_pos, rx145_pos, rx145_rep
     set_addr $I10, rxquantr149_done
     (rx145_rep) = rx145_cur."!mark_commit"($I10)
     set_addr $I10, rxquantr149_done
@@ -2478,18 +2723,22 @@
     add $I11, rx145_pos, 1
     gt $I11, rx145_eos, rx145_fail
     sub $I11, rx145_pos, rx145_off
-    substr $S10, rx145_tgt, $I11, 1
-    ne $S10, "_", rx145_fail
+    ord $I11, rx145_tgt, $I11
+    ne $I11, 95, rx145_fail
     add rx145_pos, 1
     goto rxquantr149_loop
   rxquantr149_done:
   # rx pass
     rx145_cur."!cursor_pass"(rx145_pos, "octint")
-    rx145_cur."!cursor_debug"("PASS  ", "octint", " at pos=", rx145_pos)
+    if_null rx145_debug, debug_165
+    rx145_cur."!cursor_debug"("PASS", "octint", " at pos=", rx145_pos)
+  debug_165:
     .return (rx145_cur)
   rx145_restart:
 .annotate 'line', 33
-    rx145_cur."!cursor_debug"("NEXT ", "octint")
+    if_null rx145_debug, debug_166
+    rx145_cur."!cursor_debug"("NEXT", "octint")
+  debug_166:
   rx145_fail:
     (rx145_rep, rx145_pos, $I10, $P10) = rx145_cur."!mark_fail"(0)
     lt rx145_pos, -1, rx145_done
@@ -2497,14 +2746,16 @@
     jump $I10
   rx145_done:
     rx145_cur."!cursor_fail"()
-    rx145_cur."!cursor_debug"("FAIL  ", "octint")
+    if_null rx145_debug, debug_167
+    rx145_cur."!cursor_debug"("FAIL", "octint")
+  debug_167:
     .return (rx145_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__octint"  :subid("54_1280467467.13603") :method
+.sub "!PREFIX__octint"  :subid("54_1284728468.35267") :method
 .annotate 'line', 33
     new $P147, "ResizablePMCArray"
     push $P147, ""
@@ -2513,7 +2764,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "octints"  :subid("55_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "octints"  :subid("55_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx152_tgt
     .local int rx152_pos
@@ -2521,8 +2772,10 @@
     .local int rx152_eos
     .local int rx152_rep
     .local pmc rx152_cur
+    .local pmc rx152_debug
     (rx152_cur, rx152_pos, rx152_tgt, $I10) = self."!cursor_start"()
     rx152_cur."!cursor_caparray"("octint")
+    getattribute rx152_debug, rx152_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx152_cur
     .local pmc match
     .lex "$/", match
@@ -2534,7 +2787,9 @@
     substr rx152_tgt, rx152_tgt, rx152_off
   rx152_start:
     eq $I10, 1, rx152_restart
-    rx152_cur."!cursor_debug"("START ", "octints")
+    if_null rx152_debug, debug_168
+    rx152_cur."!cursor_debug"("START", "octints")
+  debug_168:
     $I10 = self.'from'()
     ne $I10, -1, rxscan155_done
     goto rxscan155_scan
@@ -2577,18 +2832,22 @@
     add $I11, rx152_pos, 1
     gt $I11, rx152_eos, rx152_fail
     sub $I11, rx152_pos, rx152_off
-    substr $S10, rx152_tgt, $I11, 1
-    ne $S10, ",", rx152_fail
+    ord $I11, rx152_tgt, $I11
+    ne $I11, 44, rx152_fail
     add rx152_pos, 1
     goto rxquantr156_loop
   rxquantr156_done:
   # rx pass
     rx152_cur."!cursor_pass"(rx152_pos, "octints")
-    rx152_cur."!cursor_debug"("PASS  ", "octints", " at pos=", rx152_pos)
+    if_null rx152_debug, debug_169
+    rx152_cur."!cursor_debug"("PASS", "octints", " at pos=", rx152_pos)
+  debug_169:
     .return (rx152_cur)
   rx152_restart:
 .annotate 'line', 33
-    rx152_cur."!cursor_debug"("NEXT ", "octints")
+    if_null rx152_debug, debug_170
+    rx152_cur."!cursor_debug"("NEXT", "octints")
+  debug_170:
   rx152_fail:
     (rx152_rep, rx152_pos, $I10, $P10) = rx152_cur."!mark_fail"(0)
     lt rx152_pos, -1, rx152_done
@@ -2596,14 +2855,16 @@
     jump $I10
   rx152_done:
     rx152_cur."!cursor_fail"()
-    rx152_cur."!cursor_debug"("FAIL  ", "octints")
+    if_null rx152_debug, debug_171
+    rx152_cur."!cursor_debug"("FAIL", "octints")
+  debug_171:
     .return (rx152_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__octints"  :subid("56_1280467467.13603") :method
+.sub "!PREFIX__octints"  :subid("56_1284728468.35267") :method
 .annotate 'line', 33
     new $P154, "ResizablePMCArray"
     push $P154, ""
@@ -2612,7 +2873,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "binint"  :subid("57_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "binint"  :subid("57_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx158_tgt
     .local int rx158_pos
@@ -2620,7 +2881,9 @@
     .local int rx158_eos
     .local int rx158_rep
     .local pmc rx158_cur
+    .local pmc rx158_debug
     (rx158_cur, rx158_pos, rx158_tgt, $I10) = self."!cursor_start"()
+    getattribute rx158_debug, rx158_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx158_cur
     .local pmc match
     .lex "$/", match
@@ -2632,7 +2895,9 @@
     substr rx158_tgt, rx158_tgt, rx158_off
   rx158_start:
     eq $I10, 1, rx158_restart
-    rx158_cur."!cursor_debug"("START ", "binint")
+    if_null rx158_debug, debug_172
+    rx158_cur."!cursor_debug"("START", "binint")
+  debug_172:
     $I10 = self.'from'()
     ne $I10, -1, rxscan161_done
     goto rxscan161_scan
@@ -2650,23 +2915,22 @@
     set_addr $I10, rxquantr162_done
     rx158_cur."!mark_push"(0, -1, $I10)
   rxquantr162_loop:
-  # rx rxquantr163 ** 1..*
-    set_addr $I10, rxquantr163_done
-    rx158_cur."!mark_push"(0, -1, $I10)
-  rxquantr163_loop:
-  # rx enumcharlist negate=0 
-    ge rx158_pos, rx158_eos, rx158_fail
+  # rx enumcharlist_q negate=0  r 1..-1
     sub $I10, rx158_pos, rx158_off
+    set rx158_rep, 0
+    sub $I12, rx158_eos, rx158_pos
+  rxenumcharlistq163_loop:
+    le $I12, 0, rxenumcharlistq163_done
     substr $S10, rx158_tgt, $I10, 1
     index $I11, "01", $S10
-    lt $I11, 0, rx158_fail
-    inc rx158_pos
-    set_addr $I10, rxquantr163_done
-    (rx158_rep) = rx158_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr163_done
-    rx158_cur."!mark_push"(rx158_rep, rx158_pos, $I10)
-    goto rxquantr163_loop
-  rxquantr163_done:
+    lt $I11, 0, rxenumcharlistq163_done
+    inc rx158_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq163_loop
+  rxenumcharlistq163_done:
+    lt rx158_rep, 1, rx158_fail
+    add rx158_pos, rx158_pos, rx158_rep
     set_addr $I10, rxquantr162_done
     (rx158_rep) = rx158_cur."!mark_commit"($I10)
     set_addr $I10, rxquantr162_done
@@ -2675,18 +2939,22 @@
     add $I11, rx158_pos, 1
     gt $I11, rx158_eos, rx158_fail
     sub $I11, rx158_pos, rx158_off
-    substr $S10, rx158_tgt, $I11, 1
-    ne $S10, "_", rx158_fail
+    ord $I11, rx158_tgt, $I11
+    ne $I11, 95, rx158_fail
     add rx158_pos, 1
     goto rxquantr162_loop
   rxquantr162_done:
   # rx pass
     rx158_cur."!cursor_pass"(rx158_pos, "binint")
-    rx158_cur."!cursor_debug"("PASS  ", "binint", " at pos=", rx158_pos)
+    if_null rx158_debug, debug_173
+    rx158_cur."!cursor_debug"("PASS", "binint", " at pos=", rx158_pos)
+  debug_173:
     .return (rx158_cur)
   rx158_restart:
 .annotate 'line', 33
-    rx158_cur."!cursor_debug"("NEXT ", "binint")
+    if_null rx158_debug, debug_174
+    rx158_cur."!cursor_debug"("NEXT", "binint")
+  debug_174:
   rx158_fail:
     (rx158_rep, rx158_pos, $I10, $P10) = rx158_cur."!mark_fail"(0)
     lt rx158_pos, -1, rx158_done
@@ -2694,14 +2962,16 @@
     jump $I10
   rx158_done:
     rx158_cur."!cursor_fail"()
-    rx158_cur."!cursor_debug"("FAIL  ", "binint")
+    if_null rx158_debug, debug_175
+    rx158_cur."!cursor_debug"("FAIL", "binint")
+  debug_175:
     .return (rx158_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__binint"  :subid("58_1280467467.13603") :method
+.sub "!PREFIX__binint"  :subid("58_1284728468.35267") :method
 .annotate 'line', 33
     new $P160, "ResizablePMCArray"
     push $P160, ""
@@ -2710,7 +2980,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "binints"  :subid("59_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "binints"  :subid("59_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx165_tgt
     .local int rx165_pos
@@ -2718,8 +2988,10 @@
     .local int rx165_eos
     .local int rx165_rep
     .local pmc rx165_cur
+    .local pmc rx165_debug
     (rx165_cur, rx165_pos, rx165_tgt, $I10) = self."!cursor_start"()
     rx165_cur."!cursor_caparray"("binint")
+    getattribute rx165_debug, rx165_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx165_cur
     .local pmc match
     .lex "$/", match
@@ -2731,7 +3003,9 @@
     substr rx165_tgt, rx165_tgt, rx165_off
   rx165_start:
     eq $I10, 1, rx165_restart
-    rx165_cur."!cursor_debug"("START ", "binints")
+    if_null rx165_debug, debug_176
+    rx165_cur."!cursor_debug"("START", "binints")
+  debug_176:
     $I10 = self.'from'()
     ne $I10, -1, rxscan168_done
     goto rxscan168_scan
@@ -2774,18 +3048,22 @@
     add $I11, rx165_pos, 1
     gt $I11, rx165_eos, rx165_fail
     sub $I11, rx165_pos, rx165_off
-    substr $S10, rx165_tgt, $I11, 1
-    ne $S10, ",", rx165_fail
+    ord $I11, rx165_tgt, $I11
+    ne $I11, 44, rx165_fail
     add rx165_pos, 1
     goto rxquantr169_loop
   rxquantr169_done:
   # rx pass
     rx165_cur."!cursor_pass"(rx165_pos, "binints")
-    rx165_cur."!cursor_debug"("PASS  ", "binints", " at pos=", rx165_pos)
+    if_null rx165_debug, debug_177
+    rx165_cur."!cursor_debug"("PASS", "binints", " at pos=", rx165_pos)
+  debug_177:
     .return (rx165_cur)
   rx165_restart:
 .annotate 'line', 33
-    rx165_cur."!cursor_debug"("NEXT ", "binints")
+    if_null rx165_debug, debug_178
+    rx165_cur."!cursor_debug"("NEXT", "binints")
+  debug_178:
   rx165_fail:
     (rx165_rep, rx165_pos, $I10, $P10) = rx165_cur."!mark_fail"(0)
     lt rx165_pos, -1, rx165_done
@@ -2793,14 +3071,16 @@
     jump $I10
   rx165_done:
     rx165_cur."!cursor_fail"()
-    rx165_cur."!cursor_debug"("FAIL  ", "binints")
+    if_null rx165_debug, debug_179
+    rx165_cur."!cursor_debug"("FAIL", "binints")
+  debug_179:
     .return (rx165_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__binints"  :subid("60_1280467467.13603") :method
+.sub "!PREFIX__binints"  :subid("60_1284728468.35267") :method
 .annotate 'line', 33
     new $P167, "ResizablePMCArray"
     push $P167, ""
@@ -2809,7 +3089,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "integer"  :subid("61_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "integer"  :subid("61_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx171_tgt
     .local int rx171_pos
@@ -2817,7 +3097,9 @@
     .local int rx171_eos
     .local int rx171_rep
     .local pmc rx171_cur
+    .local pmc rx171_debug
     (rx171_cur, rx171_pos, rx171_tgt, $I10) = self."!cursor_start"()
+    getattribute rx171_debug, rx171_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx171_cur
     .local pmc match
     .lex "$/", match
@@ -2829,7 +3111,9 @@
     substr rx171_tgt, rx171_tgt, rx171_off
   rx171_start:
     eq $I10, 1, rx171_restart
-    rx171_cur."!cursor_debug"("START ", "integer")
+    if_null rx171_debug, debug_180
+    rx171_cur."!cursor_debug"("START", "integer")
+  debug_180:
     $I10 = self.'from'()
     ne $I10, -1, rxscan179_done
     goto rxscan179_scan
@@ -2851,8 +3135,8 @@
     add $I11, rx171_pos, 1
     gt $I11, rx171_eos, rx171_fail
     sub $I11, rx171_pos, rx171_off
-    substr $S10, rx171_tgt, $I11, 1
-    ne $S10, "0", rx171_fail
+    ord $I11, rx171_tgt, $I11
+    ne $I11, 48, rx171_fail
     add rx171_pos, 1
   alt181_0:
     set_addr $I10, alt181_1
@@ -2861,8 +3145,8 @@
     add $I11, rx171_pos, 1
     gt $I11, rx171_eos, rx171_fail
     sub $I11, rx171_pos, rx171_off
-    substr $S10, rx171_tgt, $I11, 1
-    ne $S10, "b", rx171_fail
+    ord $I11, rx171_tgt, $I11
+    ne $I11, 98, rx171_fail
     add rx171_pos, 1
   # rx subrule "binint" subtype=capture negate=
     rx171_cur."!cursor_pos"(rx171_pos)
@@ -2880,8 +3164,8 @@
     add $I11, rx171_pos, 1
     gt $I11, rx171_eos, rx171_fail
     sub $I11, rx171_pos, rx171_off
-    substr $S10, rx171_tgt, $I11, 1
-    ne $S10, "o", rx171_fail
+    ord $I11, rx171_tgt, $I11
+    ne $I11, 111, rx171_fail
     add rx171_pos, 1
   # rx subrule "octint" subtype=capture negate=
     rx171_cur."!cursor_pos"(rx171_pos)
@@ -2899,8 +3183,8 @@
     add $I11, rx171_pos, 1
     gt $I11, rx171_eos, rx171_fail
     sub $I11, rx171_pos, rx171_off
-    substr $S10, rx171_tgt, $I11, 1
-    ne $S10, "x", rx171_fail
+    ord $I11, rx171_tgt, $I11
+    ne $I11, 120, rx171_fail
     add rx171_pos, 1
   # rx subrule "hexint" subtype=capture negate=
     rx171_cur."!cursor_pos"(rx171_pos)
@@ -2916,8 +3200,8 @@
     add $I11, rx171_pos, 1
     gt $I11, rx171_eos, rx171_fail
     sub $I11, rx171_pos, rx171_off
-    substr $S10, rx171_tgt, $I11, 1
-    ne $S10, "d", rx171_fail
+    ord $I11, rx171_tgt, $I11
+    ne $I11, 100, rx171_fail
     add rx171_pos, 1
   # rx subrule "decint" subtype=capture negate=
     rx171_cur."!cursor_pos"(rx171_pos)
@@ -2942,11 +3226,15 @@
 .annotate 'line', 60
   # rx pass
     rx171_cur."!cursor_pass"(rx171_pos, "integer")
-    rx171_cur."!cursor_debug"("PASS  ", "integer", " at pos=", rx171_pos)
+    if_null rx171_debug, debug_181
+    rx171_cur."!cursor_debug"("PASS", "integer", " at pos=", rx171_pos)
+  debug_181:
     .return (rx171_cur)
   rx171_restart:
 .annotate 'line', 33
-    rx171_cur."!cursor_debug"("NEXT ", "integer")
+    if_null rx171_debug, debug_182
+    rx171_cur."!cursor_debug"("NEXT", "integer")
+  debug_182:
   rx171_fail:
     (rx171_rep, rx171_pos, $I10, $P10) = rx171_cur."!mark_fail"(0)
     lt rx171_pos, -1, rx171_done
@@ -2954,14 +3242,16 @@
     jump $I10
   rx171_done:
     rx171_cur."!cursor_fail"()
-    rx171_cur."!cursor_debug"("FAIL  ", "integer")
+    if_null rx171_debug, debug_183
+    rx171_cur."!cursor_debug"("FAIL", "integer")
+  debug_183:
     .return (rx171_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__integer"  :subid("62_1280467467.13603") :method
+.sub "!PREFIX__integer"  :subid("62_1284728468.35267") :method
 .annotate 'line', 33
     $P173 = self."!PREFIX__!subrule"("decint", "")
     $P174 = self."!PREFIX__!subrule"("decint", "0d")
@@ -2979,7 +3269,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "dec_number"  :subid("63_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "dec_number"  :subid("63_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx183_tgt
     .local int rx183_pos
@@ -2987,8 +3277,10 @@
     .local int rx183_eos
     .local int rx183_rep
     .local pmc rx183_cur
+    .local pmc rx183_debug
     (rx183_cur, rx183_pos, rx183_tgt, $I10) = self."!cursor_start"()
     rx183_cur."!cursor_caparray"("escale")
+    getattribute rx183_debug, rx183_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx183_cur
     .local pmc match
     .lex "$/", match
@@ -3000,7 +3292,9 @@
     substr rx183_tgt, rx183_tgt, rx183_off
   rx183_start:
     eq $I10, 1, rx183_restart
-    rx183_cur."!cursor_debug"("START ", "dec_number")
+    if_null rx183_debug, debug_184
+    rx183_cur."!cursor_debug"("START", "dec_number")
+  debug_184:
     $I10 = self.'from'()
     ne $I10, -1, rxscan186_done
     goto rxscan186_scan
@@ -3025,8 +3319,8 @@
     add $I11, rx183_pos, 1
     gt $I11, rx183_eos, rx183_fail
     sub $I11, rx183_pos, rx183_off
-    substr $S10, rx183_tgt, $I11, 1
-    ne $S10, ".", rx183_fail
+    ord $I11, rx183_tgt, $I11
+    ne $I11, 46, rx183_fail
     add rx183_pos, 1
   # rx charclass_q d r 1..-1
     sub $I10, rx183_pos, rx183_off
@@ -3083,8 +3377,8 @@
     add $I11, rx183_pos, 1
     gt $I11, rx183_eos, rx183_fail
     sub $I11, rx183_pos, rx183_off
-    substr $S10, rx183_tgt, $I11, 1
-    ne $S10, ".", rx183_fail
+    ord $I11, rx183_tgt, $I11
+    ne $I11, 46, rx183_fail
     add rx183_pos, 1
   # rx charclass_q d r 1..-1
     sub $I10, rx183_pos, rx183_off
@@ -3157,11 +3451,15 @@
 .annotate 'line', 71
   # rx pass
     rx183_cur."!cursor_pass"(rx183_pos, "dec_number")
-    rx183_cur."!cursor_debug"("PASS  ", "dec_number", " at pos=", rx183_pos)
+    if_null rx183_debug, debug_185
+    rx183_cur."!cursor_debug"("PASS", "dec_number", " at pos=", rx183_pos)
+  debug_185:
     .return (rx183_cur)
   rx183_restart:
 .annotate 'line', 33
-    rx183_cur."!cursor_debug"("NEXT ", "dec_number")
+    if_null rx183_debug, debug_186
+    rx183_cur."!cursor_debug"("NEXT", "dec_number")
+  debug_186:
   rx183_fail:
     (rx183_rep, rx183_pos, $I10, $P10) = rx183_cur."!mark_fail"(0)
     lt rx183_pos, -1, rx183_done
@@ -3169,14 +3467,16 @@
     jump $I10
   rx183_done:
     rx183_cur."!cursor_fail"()
-    rx183_cur."!cursor_debug"("FAIL  ", "dec_number")
+    if_null rx183_debug, debug_187
+    rx183_cur."!cursor_debug"("FAIL", "dec_number")
+  debug_187:
     .return (rx183_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__dec_number"  :subid("64_1280467467.13603") :method
+.sub "!PREFIX__dec_number"  :subid("64_1284728468.35267") :method
 .annotate 'line', 33
     new $P185, "ResizablePMCArray"
     push $P185, ""
@@ -3187,7 +3487,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "escale"  :subid("65_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "escale"  :subid("65_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx196_tgt
     .local int rx196_pos
@@ -3195,7 +3495,9 @@
     .local int rx196_eos
     .local int rx196_rep
     .local pmc rx196_cur
+    .local pmc rx196_debug
     (rx196_cur, rx196_pos, rx196_tgt, $I10) = self."!cursor_start"()
+    getattribute rx196_debug, rx196_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx196_cur
     .local pmc match
     .lex "$/", match
@@ -3207,7 +3509,9 @@
     substr rx196_tgt, rx196_tgt, rx196_off
   rx196_start:
     eq $I10, 1, rx196_restart
-    rx196_cur."!cursor_debug"("START ", "escale")
+    if_null rx196_debug, debug_188
+    rx196_cur."!cursor_debug"("START", "escale")
+  debug_188:
     $I10 = self.'from'()
     ne $I10, -1, rxscan199_done
     goto rxscan199_scan
@@ -3228,20 +3532,20 @@
     index $I11, "Ee", $S10
     lt $I11, 0, rx196_fail
     inc rx196_pos
-  # rx rxquantr200 ** 0..1
-    set_addr $I10, rxquantr200_done
-    rx196_cur."!mark_push"(0, rx196_pos, $I10)
-  rxquantr200_loop:
-  # rx enumcharlist negate=0 
-    ge rx196_pos, rx196_eos, rx196_fail
+  # rx enumcharlist_q negate=0  r 0..1
     sub $I10, rx196_pos, rx196_off
+    set rx196_rep, 0
+    sub $I12, rx196_eos, rx196_pos
+    le $I12, 1, rxenumcharlistq200_loop
+    set $I12, 1
+  rxenumcharlistq200_loop:
+    le $I12, 0, rxenumcharlistq200_done
     substr $S10, rx196_tgt, $I10, 1
     index $I11, "+-", $S10
-    lt $I11, 0, rx196_fail
-    inc rx196_pos
-    set_addr $I10, rxquantr200_done
-    (rx196_rep) = rx196_cur."!mark_commit"($I10)
-  rxquantr200_done:
+    lt $I11, 0, rxenumcharlistq200_done
+    inc rx196_rep
+  rxenumcharlistq200_done:
+    add rx196_pos, rx196_pos, rx196_rep
   # rx charclass_q d r 1..-1
     sub $I10, rx196_pos, rx196_off
     find_not_cclass $I11, 8, rx196_tgt, $I10, rx196_eos
@@ -3250,11 +3554,15 @@
     add rx196_pos, rx196_off, $I11
   # rx pass
     rx196_cur."!cursor_pass"(rx196_pos, "escale")
-    rx196_cur."!cursor_debug"("PASS  ", "escale", " at pos=", rx196_pos)
+    if_null rx196_debug, debug_189
+    rx196_cur."!cursor_debug"("PASS", "escale", " at pos=", rx196_pos)
+  debug_189:
     .return (rx196_cur)
   rx196_restart:
 .annotate 'line', 33
-    rx196_cur."!cursor_debug"("NEXT ", "escale")
+    if_null rx196_debug, debug_190
+    rx196_cur."!cursor_debug"("NEXT", "escale")
+  debug_190:
   rx196_fail:
     (rx196_rep, rx196_pos, $I10, $P10) = rx196_cur."!mark_fail"(0)
     lt rx196_pos, -1, rx196_done
@@ -3262,14 +3570,16 @@
     jump $I10
   rx196_done:
     rx196_cur."!cursor_fail"()
-    rx196_cur."!cursor_debug"("FAIL  ", "escale")
+    if_null rx196_debug, debug_191
+    rx196_cur."!cursor_debug"("FAIL", "escale")
+  debug_191:
     .return (rx196_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__escale"  :subid("66_1280467467.13603") :method
+.sub "!PREFIX__escale"  :subid("66_1284728468.35267") :method
 .annotate 'line', 33
     new $P198, "ResizablePMCArray"
     push $P198, "e"
@@ -3279,7 +3589,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape"  :subid("67_1280467467.13603") :method
+.sub "quote_escape"  :subid("67_1284728468.35267") :method
 .annotate 'line', 79
     $P202 = self."!protoregex"("quote_escape")
     .return ($P202)
@@ -3287,7 +3597,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape"  :subid("68_1280467467.13603") :method
+.sub "!PREFIX__quote_escape"  :subid("68_1284728468.35267") :method
 .annotate 'line', 79
     $P204 = self."!PREFIX__!protoregex"("quote_escape")
     .return ($P204)
@@ -3295,7 +3605,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<backslash>"  :subid("69_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<backslash>"  :subid("69_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx206_tgt
     .local int rx206_pos
@@ -3303,7 +3613,9 @@
     .local int rx206_eos
     .local int rx206_rep
     .local pmc rx206_cur
+    .local pmc rx206_debug
     (rx206_cur, rx206_pos, rx206_tgt, $I10) = self."!cursor_start"()
+    getattribute rx206_debug, rx206_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx206_cur
     .local pmc match
     .lex "$/", match
@@ -3315,7 +3627,9 @@
     substr rx206_tgt, rx206_tgt, rx206_off
   rx206_start:
     eq $I10, 1, rx206_restart
-    rx206_cur."!cursor_debug"("START ", "quote_escape:sym<backslash>")
+    if_null rx206_debug, debug_192
+    rx206_cur."!cursor_debug"("START", "quote_escape:sym<backslash>")
+  debug_192:
     $I10 = self.'from'()
     ne $I10, -1, rxscan209_done
     goto rxscan209_scan
@@ -3342,11 +3656,15 @@
     unless $P10, rx206_fail
   # rx pass
     rx206_cur."!cursor_pass"(rx206_pos, "quote_escape:sym<backslash>")
-    rx206_cur."!cursor_debug"("PASS  ", "quote_escape:sym<backslash>", " at pos=", rx206_pos)
+    if_null rx206_debug, debug_193
+    rx206_cur."!cursor_debug"("PASS", "quote_escape:sym<backslash>", " at pos=", rx206_pos)
+  debug_193:
     .return (rx206_cur)
   rx206_restart:
 .annotate 'line', 33
-    rx206_cur."!cursor_debug"("NEXT ", "quote_escape:sym<backslash>")
+    if_null rx206_debug, debug_194
+    rx206_cur."!cursor_debug"("NEXT", "quote_escape:sym<backslash>")
+  debug_194:
   rx206_fail:
     (rx206_rep, rx206_pos, $I10, $P10) = rx206_cur."!mark_fail"(0)
     lt rx206_pos, -1, rx206_done
@@ -3354,14 +3672,16 @@
     jump $I10
   rx206_done:
     rx206_cur."!cursor_fail"()
-    rx206_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<backslash>")
+    if_null rx206_debug, debug_195
+    rx206_cur."!cursor_debug"("FAIL", "quote_escape:sym<backslash>")
+  debug_195:
     .return (rx206_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<backslash>"  :subid("70_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<backslash>"  :subid("70_1284728468.35267") :method
 .annotate 'line', 33
     new $P208, "ResizablePMCArray"
     push $P208, "\\\\"
@@ -3370,7 +3690,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<stopper>"  :subid("71_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<stopper>"  :subid("71_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx211_tgt
     .local int rx211_pos
@@ -3378,7 +3698,9 @@
     .local int rx211_eos
     .local int rx211_rep
     .local pmc rx211_cur
+    .local pmc rx211_debug
     (rx211_cur, rx211_pos, rx211_tgt, $I10) = self."!cursor_start"()
+    getattribute rx211_debug, rx211_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx211_cur
     .local pmc match
     .lex "$/", match
@@ -3390,7 +3712,9 @@
     substr rx211_tgt, rx211_tgt, rx211_off
   rx211_start:
     eq $I10, 1, rx211_restart
-    rx211_cur."!cursor_debug"("START ", "quote_escape:sym<stopper>")
+    if_null rx211_debug, debug_196
+    rx211_cur."!cursor_debug"("START", "quote_escape:sym<stopper>")
+  debug_196:
     $I10 = self.'from'()
     ne $I10, -1, rxscan214_done
     goto rxscan214_scan
@@ -3408,8 +3732,8 @@
     add $I11, rx211_pos, 1
     gt $I11, rx211_eos, rx211_fail
     sub $I11, rx211_pos, rx211_off
-    substr $S10, rx211_tgt, $I11, 1
-    ne $S10, "\\", rx211_fail
+    ord $I11, rx211_tgt, $I11
+    ne $I11, 92, rx211_fail
     add rx211_pos, 1
   # rx subrule "quotemod_check" subtype=zerowidth negate=
     rx211_cur."!cursor_pos"(rx211_pos)
@@ -3424,11 +3748,15 @@
     rx211_pos = $P10."pos"()
   # rx pass
     rx211_cur."!cursor_pass"(rx211_pos, "quote_escape:sym<stopper>")
-    rx211_cur."!cursor_debug"("PASS  ", "quote_escape:sym<stopper>", " at pos=", rx211_pos)
+    if_null rx211_debug, debug_197
+    rx211_cur."!cursor_debug"("PASS", "quote_escape:sym<stopper>", " at pos=", rx211_pos)
+  debug_197:
     .return (rx211_cur)
   rx211_restart:
 .annotate 'line', 33
-    rx211_cur."!cursor_debug"("NEXT ", "quote_escape:sym<stopper>")
+    if_null rx211_debug, debug_198
+    rx211_cur."!cursor_debug"("NEXT", "quote_escape:sym<stopper>")
+  debug_198:
   rx211_fail:
     (rx211_rep, rx211_pos, $I10, $P10) = rx211_cur."!mark_fail"(0)
     lt rx211_pos, -1, rx211_done
@@ -3436,14 +3764,16 @@
     jump $I10
   rx211_done:
     rx211_cur."!cursor_fail"()
-    rx211_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<stopper>")
+    if_null rx211_debug, debug_199
+    rx211_cur."!cursor_debug"("FAIL", "quote_escape:sym<stopper>")
+  debug_199:
     .return (rx211_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<stopper>"  :subid("72_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<stopper>"  :subid("72_1284728468.35267") :method
 .annotate 'line', 33
     new $P213, "ResizablePMCArray"
     push $P213, "\\"
@@ -3452,7 +3782,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<bs>"  :subid("73_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<bs>"  :subid("73_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx216_tgt
     .local int rx216_pos
@@ -3460,7 +3790,9 @@
     .local int rx216_eos
     .local int rx216_rep
     .local pmc rx216_cur
+    .local pmc rx216_debug
     (rx216_cur, rx216_pos, rx216_tgt, $I10) = self."!cursor_start"()
+    getattribute rx216_debug, rx216_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx216_cur
     .local pmc match
     .lex "$/", match
@@ -3472,7 +3804,9 @@
     substr rx216_tgt, rx216_tgt, rx216_off
   rx216_start:
     eq $I10, 1, rx216_restart
-    rx216_cur."!cursor_debug"("START ", "quote_escape:sym<bs>")
+    if_null rx216_debug, debug_200
+    rx216_cur."!cursor_debug"("START", "quote_escape:sym<bs>")
+  debug_200:
     $I10 = self.'from'()
     ne $I10, -1, rxscan219_done
     goto rxscan219_scan
@@ -3499,11 +3833,15 @@
     unless $P10, rx216_fail
   # rx pass
     rx216_cur."!cursor_pass"(rx216_pos, "quote_escape:sym<bs>")
-    rx216_cur."!cursor_debug"("PASS  ", "quote_escape:sym<bs>", " at pos=", rx216_pos)
+    if_null rx216_debug, debug_201
+    rx216_cur."!cursor_debug"("PASS", "quote_escape:sym<bs>", " at pos=", rx216_pos)
+  debug_201:
     .return (rx216_cur)
   rx216_restart:
 .annotate 'line', 33
-    rx216_cur."!cursor_debug"("NEXT ", "quote_escape:sym<bs>")
+    if_null rx216_debug, debug_202
+    rx216_cur."!cursor_debug"("NEXT", "quote_escape:sym<bs>")
+  debug_202:
   rx216_fail:
     (rx216_rep, rx216_pos, $I10, $P10) = rx216_cur."!mark_fail"(0)
     lt rx216_pos, -1, rx216_done
@@ -3511,14 +3849,16 @@
     jump $I10
   rx216_done:
     rx216_cur."!cursor_fail"()
-    rx216_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<bs>")
+    if_null rx216_debug, debug_203
+    rx216_cur."!cursor_debug"("FAIL", "quote_escape:sym<bs>")
+  debug_203:
     .return (rx216_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<bs>"  :subid("74_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<bs>"  :subid("74_1284728468.35267") :method
 .annotate 'line', 33
     new $P218, "ResizablePMCArray"
     push $P218, "\\b"
@@ -3527,7 +3867,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<nl>"  :subid("75_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<nl>"  :subid("75_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx221_tgt
     .local int rx221_pos
@@ -3535,7 +3875,9 @@
     .local int rx221_eos
     .local int rx221_rep
     .local pmc rx221_cur
+    .local pmc rx221_debug
     (rx221_cur, rx221_pos, rx221_tgt, $I10) = self."!cursor_start"()
+    getattribute rx221_debug, rx221_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx221_cur
     .local pmc match
     .lex "$/", match
@@ -3547,7 +3889,9 @@
     substr rx221_tgt, rx221_tgt, rx221_off
   rx221_start:
     eq $I10, 1, rx221_restart
-    rx221_cur."!cursor_debug"("START ", "quote_escape:sym<nl>")
+    if_null rx221_debug, debug_204
+    rx221_cur."!cursor_debug"("START", "quote_escape:sym<nl>")
+  debug_204:
     $I10 = self.'from'()
     ne $I10, -1, rxscan224_done
     goto rxscan224_scan
@@ -3574,11 +3918,15 @@
     unless $P10, rx221_fail
   # rx pass
     rx221_cur."!cursor_pass"(rx221_pos, "quote_escape:sym<nl>")
-    rx221_cur."!cursor_debug"("PASS  ", "quote_escape:sym<nl>", " at pos=", rx221_pos)
+    if_null rx221_debug, debug_205
+    rx221_cur."!cursor_debug"("PASS", "quote_escape:sym<nl>", " at pos=", rx221_pos)
+  debug_205:
     .return (rx221_cur)
   rx221_restart:
 .annotate 'line', 33
-    rx221_cur."!cursor_debug"("NEXT ", "quote_escape:sym<nl>")
+    if_null rx221_debug, debug_206
+    rx221_cur."!cursor_debug"("NEXT", "quote_escape:sym<nl>")
+  debug_206:
   rx221_fail:
     (rx221_rep, rx221_pos, $I10, $P10) = rx221_cur."!mark_fail"(0)
     lt rx221_pos, -1, rx221_done
@@ -3586,14 +3934,16 @@
     jump $I10
   rx221_done:
     rx221_cur."!cursor_fail"()
-    rx221_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<nl>")
+    if_null rx221_debug, debug_207
+    rx221_cur."!cursor_debug"("FAIL", "quote_escape:sym<nl>")
+  debug_207:
     .return (rx221_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<nl>"  :subid("76_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<nl>"  :subid("76_1284728468.35267") :method
 .annotate 'line', 33
     new $P223, "ResizablePMCArray"
     push $P223, "\\n"
@@ -3602,7 +3952,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<cr>"  :subid("77_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<cr>"  :subid("77_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx226_tgt
     .local int rx226_pos
@@ -3610,7 +3960,9 @@
     .local int rx226_eos
     .local int rx226_rep
     .local pmc rx226_cur
+    .local pmc rx226_debug
     (rx226_cur, rx226_pos, rx226_tgt, $I10) = self."!cursor_start"()
+    getattribute rx226_debug, rx226_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx226_cur
     .local pmc match
     .lex "$/", match
@@ -3622,7 +3974,9 @@
     substr rx226_tgt, rx226_tgt, rx226_off
   rx226_start:
     eq $I10, 1, rx226_restart
-    rx226_cur."!cursor_debug"("START ", "quote_escape:sym<cr>")
+    if_null rx226_debug, debug_208
+    rx226_cur."!cursor_debug"("START", "quote_escape:sym<cr>")
+  debug_208:
     $I10 = self.'from'()
     ne $I10, -1, rxscan229_done
     goto rxscan229_scan
@@ -3649,11 +4003,15 @@
     unless $P10, rx226_fail
   # rx pass
     rx226_cur."!cursor_pass"(rx226_pos, "quote_escape:sym<cr>")
-    rx226_cur."!cursor_debug"("PASS  ", "quote_escape:sym<cr>", " at pos=", rx226_pos)
+    if_null rx226_debug, debug_209
+    rx226_cur."!cursor_debug"("PASS", "quote_escape:sym<cr>", " at pos=", rx226_pos)
+  debug_209:
     .return (rx226_cur)
   rx226_restart:
 .annotate 'line', 33
-    rx226_cur."!cursor_debug"("NEXT ", "quote_escape:sym<cr>")
+    if_null rx226_debug, debug_210
+    rx226_cur."!cursor_debug"("NEXT", "quote_escape:sym<cr>")
+  debug_210:
   rx226_fail:
     (rx226_rep, rx226_pos, $I10, $P10) = rx226_cur."!mark_fail"(0)
     lt rx226_pos, -1, rx226_done
@@ -3661,14 +4019,16 @@
     jump $I10
   rx226_done:
     rx226_cur."!cursor_fail"()
-    rx226_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<cr>")
+    if_null rx226_debug, debug_211
+    rx226_cur."!cursor_debug"("FAIL", "quote_escape:sym<cr>")
+  debug_211:
     .return (rx226_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<cr>"  :subid("78_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<cr>"  :subid("78_1284728468.35267") :method
 .annotate 'line', 33
     new $P228, "ResizablePMCArray"
     push $P228, "\\r"
@@ -3677,7 +4037,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<tab>"  :subid("79_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<tab>"  :subid("79_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx231_tgt
     .local int rx231_pos
@@ -3685,7 +4045,9 @@
     .local int rx231_eos
     .local int rx231_rep
     .local pmc rx231_cur
+    .local pmc rx231_debug
     (rx231_cur, rx231_pos, rx231_tgt, $I10) = self."!cursor_start"()
+    getattribute rx231_debug, rx231_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx231_cur
     .local pmc match
     .lex "$/", match
@@ -3697,7 +4059,9 @@
     substr rx231_tgt, rx231_tgt, rx231_off
   rx231_start:
     eq $I10, 1, rx231_restart
-    rx231_cur."!cursor_debug"("START ", "quote_escape:sym<tab>")
+    if_null rx231_debug, debug_212
+    rx231_cur."!cursor_debug"("START", "quote_escape:sym<tab>")
+  debug_212:
     $I10 = self.'from'()
     ne $I10, -1, rxscan234_done
     goto rxscan234_scan
@@ -3724,11 +4088,15 @@
     unless $P10, rx231_fail
   # rx pass
     rx231_cur."!cursor_pass"(rx231_pos, "quote_escape:sym<tab>")
-    rx231_cur."!cursor_debug"("PASS  ", "quote_escape:sym<tab>", " at pos=", rx231_pos)
+    if_null rx231_debug, debug_213
+    rx231_cur."!cursor_debug"("PASS", "quote_escape:sym<tab>", " at pos=", rx231_pos)
+  debug_213:
     .return (rx231_cur)
   rx231_restart:
 .annotate 'line', 33
-    rx231_cur."!cursor_debug"("NEXT ", "quote_escape:sym<tab>")
+    if_null rx231_debug, debug_214
+    rx231_cur."!cursor_debug"("NEXT", "quote_escape:sym<tab>")
+  debug_214:
   rx231_fail:
     (rx231_rep, rx231_pos, $I10, $P10) = rx231_cur."!mark_fail"(0)
     lt rx231_pos, -1, rx231_done
@@ -3736,14 +4104,16 @@
     jump $I10
   rx231_done:
     rx231_cur."!cursor_fail"()
-    rx231_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<tab>")
+    if_null rx231_debug, debug_215
+    rx231_cur."!cursor_debug"("FAIL", "quote_escape:sym<tab>")
+  debug_215:
     .return (rx231_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<tab>"  :subid("80_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<tab>"  :subid("80_1284728468.35267") :method
 .annotate 'line', 33
     new $P233, "ResizablePMCArray"
     push $P233, "\\t"
@@ -3752,7 +4122,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<ff>"  :subid("81_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<ff>"  :subid("81_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx236_tgt
     .local int rx236_pos
@@ -3760,7 +4130,9 @@
     .local int rx236_eos
     .local int rx236_rep
     .local pmc rx236_cur
+    .local pmc rx236_debug
     (rx236_cur, rx236_pos, rx236_tgt, $I10) = self."!cursor_start"()
+    getattribute rx236_debug, rx236_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx236_cur
     .local pmc match
     .lex "$/", match
@@ -3772,7 +4144,9 @@
     substr rx236_tgt, rx236_tgt, rx236_off
   rx236_start:
     eq $I10, 1, rx236_restart
-    rx236_cur."!cursor_debug"("START ", "quote_escape:sym<ff>")
+    if_null rx236_debug, debug_216
+    rx236_cur."!cursor_debug"("START", "quote_escape:sym<ff>")
+  debug_216:
     $I10 = self.'from'()
     ne $I10, -1, rxscan239_done
     goto rxscan239_scan
@@ -3799,11 +4173,15 @@
     unless $P10, rx236_fail
   # rx pass
     rx236_cur."!cursor_pass"(rx236_pos, "quote_escape:sym<ff>")
-    rx236_cur."!cursor_debug"("PASS  ", "quote_escape:sym<ff>", " at pos=", rx236_pos)
+    if_null rx236_debug, debug_217
+    rx236_cur."!cursor_debug"("PASS", "quote_escape:sym<ff>", " at pos=", rx236_pos)
+  debug_217:
     .return (rx236_cur)
   rx236_restart:
 .annotate 'line', 33
-    rx236_cur."!cursor_debug"("NEXT ", "quote_escape:sym<ff>")
+    if_null rx236_debug, debug_218
+    rx236_cur."!cursor_debug"("NEXT", "quote_escape:sym<ff>")
+  debug_218:
   rx236_fail:
     (rx236_rep, rx236_pos, $I10, $P10) = rx236_cur."!mark_fail"(0)
     lt rx236_pos, -1, rx236_done
@@ -3811,14 +4189,16 @@
     jump $I10
   rx236_done:
     rx236_cur."!cursor_fail"()
-    rx236_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<ff>")
+    if_null rx236_debug, debug_219
+    rx236_cur."!cursor_debug"("FAIL", "quote_escape:sym<ff>")
+  debug_219:
     .return (rx236_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<ff>"  :subid("82_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<ff>"  :subid("82_1284728468.35267") :method
 .annotate 'line', 33
     new $P238, "ResizablePMCArray"
     push $P238, "\\f"
@@ -3827,7 +4207,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<esc>"  :subid("83_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<esc>"  :subid("83_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx241_tgt
     .local int rx241_pos
@@ -3835,7 +4215,9 @@
     .local int rx241_eos
     .local int rx241_rep
     .local pmc rx241_cur
+    .local pmc rx241_debug
     (rx241_cur, rx241_pos, rx241_tgt, $I10) = self."!cursor_start"()
+    getattribute rx241_debug, rx241_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx241_cur
     .local pmc match
     .lex "$/", match
@@ -3847,7 +4229,9 @@
     substr rx241_tgt, rx241_tgt, rx241_off
   rx241_start:
     eq $I10, 1, rx241_restart
-    rx241_cur."!cursor_debug"("START ", "quote_escape:sym<esc>")
+    if_null rx241_debug, debug_220
+    rx241_cur."!cursor_debug"("START", "quote_escape:sym<esc>")
+  debug_220:
     $I10 = self.'from'()
     ne $I10, -1, rxscan244_done
     goto rxscan244_scan
@@ -3874,11 +4258,15 @@
     unless $P10, rx241_fail
   # rx pass
     rx241_cur."!cursor_pass"(rx241_pos, "quote_escape:sym<esc>")
-    rx241_cur."!cursor_debug"("PASS  ", "quote_escape:sym<esc>", " at pos=", rx241_pos)
+    if_null rx241_debug, debug_221
+    rx241_cur."!cursor_debug"("PASS", "quote_escape:sym<esc>", " at pos=", rx241_pos)
+  debug_221:
     .return (rx241_cur)
   rx241_restart:
 .annotate 'line', 33
-    rx241_cur."!cursor_debug"("NEXT ", "quote_escape:sym<esc>")
+    if_null rx241_debug, debug_222
+    rx241_cur."!cursor_debug"("NEXT", "quote_escape:sym<esc>")
+  debug_222:
   rx241_fail:
     (rx241_rep, rx241_pos, $I10, $P10) = rx241_cur."!mark_fail"(0)
     lt rx241_pos, -1, rx241_done
@@ -3886,14 +4274,16 @@
     jump $I10
   rx241_done:
     rx241_cur."!cursor_fail"()
-    rx241_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<esc>")
+    if_null rx241_debug, debug_223
+    rx241_cur."!cursor_debug"("FAIL", "quote_escape:sym<esc>")
+  debug_223:
     .return (rx241_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<esc>"  :subid("84_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<esc>"  :subid("84_1284728468.35267") :method
 .annotate 'line', 33
     new $P243, "ResizablePMCArray"
     push $P243, "\\e"
@@ -3902,7 +4292,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<hex>"  :subid("85_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<hex>"  :subid("85_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx246_tgt
     .local int rx246_pos
@@ -3910,7 +4300,9 @@
     .local int rx246_eos
     .local int rx246_rep
     .local pmc rx246_cur
+    .local pmc rx246_debug
     (rx246_cur, rx246_pos, rx246_tgt, $I10) = self."!cursor_start"()
+    getattribute rx246_debug, rx246_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx246_cur
     .local pmc match
     .lex "$/", match
@@ -3922,7 +4314,9 @@
     substr rx246_tgt, rx246_tgt, rx246_off
   rx246_start:
     eq $I10, 1, rx246_restart
-    rx246_cur."!cursor_debug"("START ", "quote_escape:sym<hex>")
+    if_null rx246_debug, debug_224
+    rx246_cur."!cursor_debug"("START", "quote_escape:sym<hex>")
+  debug_224:
     $I10 = self.'from'()
     ne $I10, -1, rxscan249_done
     goto rxscan249_scan
@@ -3964,8 +4358,8 @@
     add $I11, rx246_pos, 1
     gt $I11, rx246_eos, rx246_fail
     sub $I11, rx246_pos, rx246_off
-    substr $S10, rx246_tgt, $I11, 1
-    ne $S10, "[", rx246_fail
+    ord $I11, rx246_tgt, $I11
+    ne $I11, 91, rx246_fail
     add rx246_pos, 1
   # rx subrule "hexints" subtype=capture negate=
     rx246_cur."!cursor_pos"(rx246_pos)
@@ -3978,18 +4372,22 @@
     add $I11, rx246_pos, 1
     gt $I11, rx246_eos, rx246_fail
     sub $I11, rx246_pos, rx246_off
-    substr $S10, rx246_tgt, $I11, 1
-    ne $S10, "]", rx246_fail
+    ord $I11, rx246_tgt, $I11
+    ne $I11, 93, rx246_fail
     add rx246_pos, 1
   alt250_end:
 .annotate 'line', 89
   # rx pass
     rx246_cur."!cursor_pass"(rx246_pos, "quote_escape:sym<hex>")
-    rx246_cur."!cursor_debug"("PASS  ", "quote_escape:sym<hex>", " at pos=", rx246_pos)
+    if_null rx246_debug, debug_225
+    rx246_cur."!cursor_debug"("PASS", "quote_escape:sym<hex>", " at pos=", rx246_pos)
+  debug_225:
     .return (rx246_cur)
   rx246_restart:
 .annotate 'line', 33
-    rx246_cur."!cursor_debug"("NEXT ", "quote_escape:sym<hex>")
+    if_null rx246_debug, debug_226
+    rx246_cur."!cursor_debug"("NEXT", "quote_escape:sym<hex>")
+  debug_226:
   rx246_fail:
     (rx246_rep, rx246_pos, $I10, $P10) = rx246_cur."!mark_fail"(0)
     lt rx246_pos, -1, rx246_done
@@ -3997,14 +4395,16 @@
     jump $I10
   rx246_done:
     rx246_cur."!cursor_fail"()
-    rx246_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<hex>")
+    if_null rx246_debug, debug_227
+    rx246_cur."!cursor_debug"("FAIL", "quote_escape:sym<hex>")
+  debug_227:
     .return (rx246_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<hex>"  :subid("86_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<hex>"  :subid("86_1284728468.35267") :method
 .annotate 'line', 33
     new $P248, "ResizablePMCArray"
     push $P248, unicode:"\\x"
@@ -4013,7 +4413,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<oct>"  :subid("87_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<oct>"  :subid("87_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx252_tgt
     .local int rx252_pos
@@ -4021,7 +4421,9 @@
     .local int rx252_eos
     .local int rx252_rep
     .local pmc rx252_cur
+    .local pmc rx252_debug
     (rx252_cur, rx252_pos, rx252_tgt, $I10) = self."!cursor_start"()
+    getattribute rx252_debug, rx252_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx252_cur
     .local pmc match
     .lex "$/", match
@@ -4033,7 +4435,9 @@
     substr rx252_tgt, rx252_tgt, rx252_off
   rx252_start:
     eq $I10, 1, rx252_restart
-    rx252_cur."!cursor_debug"("START ", "quote_escape:sym<oct>")
+    if_null rx252_debug, debug_228
+    rx252_cur."!cursor_debug"("START", "quote_escape:sym<oct>")
+  debug_228:
     $I10 = self.'from'()
     ne $I10, -1, rxscan255_done
     goto rxscan255_scan
@@ -4075,8 +4479,8 @@
     add $I11, rx252_pos, 1
     gt $I11, rx252_eos, rx252_fail
     sub $I11, rx252_pos, rx252_off
-    substr $S10, rx252_tgt, $I11, 1
-    ne $S10, "[", rx252_fail
+    ord $I11, rx252_tgt, $I11
+    ne $I11, 91, rx252_fail
     add rx252_pos, 1
   # rx subrule "octints" subtype=capture negate=
     rx252_cur."!cursor_pos"(rx252_pos)
@@ -4089,18 +4493,22 @@
     add $I11, rx252_pos, 1
     gt $I11, rx252_eos, rx252_fail
     sub $I11, rx252_pos, rx252_off
-    substr $S10, rx252_tgt, $I11, 1
-    ne $S10, "]", rx252_fail
+    ord $I11, rx252_tgt, $I11
+    ne $I11, 93, rx252_fail
     add rx252_pos, 1
   alt256_end:
 .annotate 'line', 93
   # rx pass
     rx252_cur."!cursor_pass"(rx252_pos, "quote_escape:sym<oct>")
-    rx252_cur."!cursor_debug"("PASS  ", "quote_escape:sym<oct>", " at pos=", rx252_pos)
+    if_null rx252_debug, debug_229
+    rx252_cur."!cursor_debug"("PASS", "quote_escape:sym<oct>", " at pos=", rx252_pos)
+  debug_229:
     .return (rx252_cur)
   rx252_restart:
 .annotate 'line', 33
-    rx252_cur."!cursor_debug"("NEXT ", "quote_escape:sym<oct>")
+    if_null rx252_debug, debug_230
+    rx252_cur."!cursor_debug"("NEXT", "quote_escape:sym<oct>")
+  debug_230:
   rx252_fail:
     (rx252_rep, rx252_pos, $I10, $P10) = rx252_cur."!mark_fail"(0)
     lt rx252_pos, -1, rx252_done
@@ -4108,14 +4516,16 @@
     jump $I10
   rx252_done:
     rx252_cur."!cursor_fail"()
-    rx252_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<oct>")
+    if_null rx252_debug, debug_231
+    rx252_cur."!cursor_debug"("FAIL", "quote_escape:sym<oct>")
+  debug_231:
     .return (rx252_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<oct>"  :subid("88_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<oct>"  :subid("88_1284728468.35267") :method
 .annotate 'line', 33
     new $P254, "ResizablePMCArray"
     push $P254, "\\o"
@@ -4124,7 +4534,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<chr>"  :subid("89_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<chr>"  :subid("89_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx258_tgt
     .local int rx258_pos
@@ -4132,7 +4542,9 @@
     .local int rx258_eos
     .local int rx258_rep
     .local pmc rx258_cur
+    .local pmc rx258_debug
     (rx258_cur, rx258_pos, rx258_tgt, $I10) = self."!cursor_start"()
+    getattribute rx258_debug, rx258_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx258_cur
     .local pmc match
     .lex "$/", match
@@ -4144,7 +4556,9 @@
     substr rx258_tgt, rx258_tgt, rx258_off
   rx258_start:
     eq $I10, 1, rx258_restart
-    rx258_cur."!cursor_debug"("START ", "quote_escape:sym<chr>")
+    if_null rx258_debug, debug_232
+    rx258_cur."!cursor_debug"("START", "quote_escape:sym<chr>")
+  debug_232:
     $I10 = self.'from'()
     ne $I10, -1, rxscan261_done
     goto rxscan261_scan
@@ -4178,11 +4592,15 @@
     rx258_pos = $P10."pos"()
   # rx pass
     rx258_cur."!cursor_pass"(rx258_pos, "quote_escape:sym<chr>")
-    rx258_cur."!cursor_debug"("PASS  ", "quote_escape:sym<chr>", " at pos=", rx258_pos)
+    if_null rx258_debug, debug_233
+    rx258_cur."!cursor_debug"("PASS", "quote_escape:sym<chr>", " at pos=", rx258_pos)
+  debug_233:
     .return (rx258_cur)
   rx258_restart:
 .annotate 'line', 33
-    rx258_cur."!cursor_debug"("NEXT ", "quote_escape:sym<chr>")
+    if_null rx258_debug, debug_234
+    rx258_cur."!cursor_debug"("NEXT", "quote_escape:sym<chr>")
+  debug_234:
   rx258_fail:
     (rx258_rep, rx258_pos, $I10, $P10) = rx258_cur."!mark_fail"(0)
     lt rx258_pos, -1, rx258_done
@@ -4190,14 +4608,16 @@
     jump $I10
   rx258_done:
     rx258_cur."!cursor_fail"()
-    rx258_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<chr>")
+    if_null rx258_debug, debug_235
+    rx258_cur."!cursor_debug"("FAIL", "quote_escape:sym<chr>")
+  debug_235:
     .return (rx258_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<chr>"  :subid("90_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<chr>"  :subid("90_1284728468.35267") :method
 .annotate 'line', 33
     new $P260, "ResizablePMCArray"
     push $P260, "\\c"
@@ -4206,7 +4626,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<0>"  :subid("91_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<0>"  :subid("91_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx263_tgt
     .local int rx263_pos
@@ -4214,7 +4634,9 @@
     .local int rx263_eos
     .local int rx263_rep
     .local pmc rx263_cur
+    .local pmc rx263_debug
     (rx263_cur, rx263_pos, rx263_tgt, $I10) = self."!cursor_start"()
+    getattribute rx263_debug, rx263_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx263_cur
     .local pmc match
     .lex "$/", match
@@ -4226,7 +4648,9 @@
     substr rx263_tgt, rx263_tgt, rx263_off
   rx263_start:
     eq $I10, 1, rx263_restart
-    rx263_cur."!cursor_debug"("START ", "quote_escape:sym<0>")
+    if_null rx263_debug, debug_236
+    rx263_cur."!cursor_debug"("START", "quote_escape:sym<0>")
+  debug_236:
     $I10 = self.'from'()
     ne $I10, -1, rxscan266_done
     goto rxscan266_scan
@@ -4244,8 +4668,8 @@
     add $I11, rx263_pos, 1
     gt $I11, rx263_eos, rx263_fail
     sub $I11, rx263_pos, rx263_off
-    substr $S10, rx263_tgt, $I11, 1
-    ne $S10, "\\", rx263_fail
+    ord $I11, rx263_tgt, $I11
+    ne $I11, 92, rx263_fail
     add rx263_pos, 1
   # rx subcapture "sym"
     set_addr $I10, rxcap_267_fail
@@ -4254,8 +4678,8 @@
     add $I11, rx263_pos, 1
     gt $I11, rx263_eos, rx263_fail
     sub $I11, rx263_pos, rx263_off
-    substr $S10, rx263_tgt, $I11, 1
-    ne $S10, "0", rx263_fail
+    ord $I11, rx263_tgt, $I11
+    ne $I11, 48, rx263_fail
     add rx263_pos, 1
     set_addr $I10, rxcap_267_fail
     ($I12, $I11) = rx263_cur."!mark_peek"($I10)
@@ -4274,11 +4698,15 @@
     unless $P10, rx263_fail
   # rx pass
     rx263_cur."!cursor_pass"(rx263_pos, "quote_escape:sym<0>")
-    rx263_cur."!cursor_debug"("PASS  ", "quote_escape:sym<0>", " at pos=", rx263_pos)
+    if_null rx263_debug, debug_237
+    rx263_cur."!cursor_debug"("PASS", "quote_escape:sym<0>", " at pos=", rx263_pos)
+  debug_237:
     .return (rx263_cur)
   rx263_restart:
 .annotate 'line', 33
-    rx263_cur."!cursor_debug"("NEXT ", "quote_escape:sym<0>")
+    if_null rx263_debug, debug_238
+    rx263_cur."!cursor_debug"("NEXT", "quote_escape:sym<0>")
+  debug_238:
   rx263_fail:
     (rx263_rep, rx263_pos, $I10, $P10) = rx263_cur."!mark_fail"(0)
     lt rx263_pos, -1, rx263_done
@@ -4286,14 +4714,16 @@
     jump $I10
   rx263_done:
     rx263_cur."!cursor_fail"()
-    rx263_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<0>")
+    if_null rx263_debug, debug_239
+    rx263_cur."!cursor_debug"("FAIL", "quote_escape:sym<0>")
+  debug_239:
     .return (rx263_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<0>"  :subid("92_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<0>"  :subid("92_1284728468.35267") :method
 .annotate 'line', 33
     new $P265, "ResizablePMCArray"
     push $P265, "\\0"
@@ -4302,13 +4732,13 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "quote_escape:sym<misc>"  :subid("93_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "quote_escape:sym<misc>"  :subid("93_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
-    .const 'Sub' $P288 = "97_1280467467.13603" 
+    .const 'Sub' $P288 = "97_1284728468.35267" 
     capture_lex $P288
-    .const 'Sub' $P281 = "96_1280467467.13603" 
+    .const 'Sub' $P281 = "96_1284728468.35267" 
     capture_lex $P281
-    .const 'Sub' $P276 = "95_1280467467.13603" 
+    .const 'Sub' $P276 = "95_1284728468.35267" 
     capture_lex $P276
     .local string rx269_tgt
     .local int rx269_pos
@@ -4316,7 +4746,9 @@
     .local int rx269_eos
     .local int rx269_rep
     .local pmc rx269_cur
+    .local pmc rx269_debug
     (rx269_cur, rx269_pos, rx269_tgt, $I10) = self."!cursor_start"()
+    getattribute rx269_debug, rx269_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx269_cur
     .local pmc match
     .lex "$/", match
@@ -4328,7 +4760,9 @@
     substr rx269_tgt, rx269_tgt, rx269_off
   rx269_start:
     eq $I10, 1, rx269_restart
-    rx269_cur."!cursor_debug"("START ", "quote_escape:sym<misc>")
+    if_null rx269_debug, debug_240
+    rx269_cur."!cursor_debug"("START", "quote_escape:sym<misc>")
+  debug_240:
     $I10 = self.'from'()
     ne $I10, -1, rxscan272_done
     goto rxscan272_scan
@@ -4346,15 +4780,15 @@
     find_lex $P273, unicode:"$\x{a2}"
     $P274 = $P273."MATCH"()
     store_lex "$/", $P274
-    .const 'Sub' $P276 = "95_1280467467.13603" 
+    .const 'Sub' $P276 = "95_1284728468.35267" 
     capture_lex $P276
     $P277 = $P276()
   # rx literal  "\\"
     add $I11, rx269_pos, 1
     gt $I11, rx269_eos, rx269_fail
     sub $I11, rx269_pos, rx269_off
-    substr $S10, rx269_tgt, $I11, 1
-    ne $S10, "\\", rx269_fail
+    ord $I11, rx269_tgt, $I11
+    ne $I11, 92, rx269_fail
     add rx269_pos, 1
   alt278_0:
 .annotate 'line', 101
@@ -4372,7 +4806,7 @@
 .annotate 'line', 104
   # rx subrule $P281 subtype=capture negate=
     rx269_cur."!cursor_pos"(rx269_pos)
-    .const 'Sub' $P281 = "96_1280467467.13603" 
+    .const 'Sub' $P281 = "96_1284728468.35267" 
     capture_lex $P281
     $P10 = rx269_cur.$P281()
     unless $P10, rx269_fail
@@ -4406,7 +4840,7 @@
     find_lex $P285, unicode:"$\x{a2}"
     $P286 = $P285."MATCH"()
     store_lex "$/", $P286
-    .const 'Sub' $P288 = "97_1280467467.13603" 
+    .const 'Sub' $P288 = "97_1284728468.35267" 
     capture_lex $P288
     $P298 = $P288()
   alt279_end:
@@ -4435,11 +4869,15 @@
 .annotate 'line', 99
   # rx pass
     rx269_cur."!cursor_pass"(rx269_pos, "quote_escape:sym<misc>")
-    rx269_cur."!cursor_debug"("PASS  ", "quote_escape:sym<misc>", " at pos=", rx269_pos)
+    if_null rx269_debug, debug_247
+    rx269_cur."!cursor_debug"("PASS", "quote_escape:sym<misc>", " at pos=", rx269_pos)
+  debug_247:
     .return (rx269_cur)
   rx269_restart:
 .annotate 'line', 33
-    rx269_cur."!cursor_debug"("NEXT ", "quote_escape:sym<misc>")
+    if_null rx269_debug, debug_248
+    rx269_cur."!cursor_debug"("NEXT", "quote_escape:sym<misc>")
+  debug_248:
   rx269_fail:
     (rx269_rep, rx269_pos, $I10, $P10) = rx269_cur."!mark_fail"(0)
     lt rx269_pos, -1, rx269_done
@@ -4447,14 +4885,16 @@
     jump $I10
   rx269_done:
     rx269_cur."!cursor_fail"()
-    rx269_cur."!cursor_debug"("FAIL  ", "quote_escape:sym<misc>")
+    if_null rx269_debug, debug_249
+    rx269_cur."!cursor_debug"("FAIL", "quote_escape:sym<misc>")
+  debug_249:
     .return (rx269_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__quote_escape:sym<misc>"  :subid("94_1280467467.13603") :method
+.sub "!PREFIX__quote_escape:sym<misc>"  :subid("94_1284728468.35267") :method
 .annotate 'line', 33
     new $P271, "ResizablePMCArray"
     push $P271, ""
@@ -4463,14 +4903,14 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "_block275"  :anon :subid("95_1280467467.13603") :outer("93_1280467467.13603")
+.sub "_block275"  :anon :subid("95_1284728468.35267") :outer("93_1284728468.35267")
 .annotate 'line', 100
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "_block280"  :anon :subid("96_1280467467.13603") :method :outer("93_1280467467.13603")
+.sub "_block280"  :anon :subid("96_1284728468.35267") :method :outer("93_1284728468.35267")
 .annotate 'line', 104
     .local string rx282_tgt
     .local int rx282_pos
@@ -4478,7 +4918,9 @@
     .local int rx282_eos
     .local int rx282_rep
     .local pmc rx282_cur
+    .local pmc rx282_debug
     (rx282_cur, rx282_pos, rx282_tgt, $I10) = self."!cursor_start"()
+    getattribute rx282_debug, rx282_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx282_cur
     .local pmc match
     .lex "$/", match
@@ -4490,7 +4932,9 @@
     substr rx282_tgt, rx282_tgt, rx282_off
   rx282_start:
     eq $I10, 1, rx282_restart
-    rx282_cur."!cursor_debug"("START ", "")
+    if_null rx282_debug, debug_241
+    rx282_cur."!cursor_debug"("START", "")
+  debug_241:
     $I10 = self.'from'()
     ne $I10, -1, rxscan283_done
     goto rxscan283_scan
@@ -4511,10 +4955,14 @@
     inc rx282_pos
   # rx pass
     rx282_cur."!cursor_pass"(rx282_pos, "")
-    rx282_cur."!cursor_debug"("PASS  ", "", " at pos=", rx282_pos)
+    if_null rx282_debug, debug_242
+    rx282_cur."!cursor_debug"("PASS", "", " at pos=", rx282_pos)
+  debug_242:
     .return (rx282_cur)
   rx282_restart:
-    rx282_cur."!cursor_debug"("NEXT ", "")
+    if_null rx282_debug, debug_243
+    rx282_cur."!cursor_debug"("NEXT", "")
+  debug_243:
   rx282_fail:
     (rx282_rep, rx282_pos, $I10, $P10) = rx282_cur."!mark_fail"(0)
     lt rx282_pos, -1, rx282_done
@@ -4522,27 +4970,29 @@
     jump $I10
   rx282_done:
     rx282_cur."!cursor_fail"()
-    rx282_cur."!cursor_debug"("FAIL  ", "")
+    if_null rx282_debug, debug_244
+    rx282_cur."!cursor_debug"("FAIL", "")
+  debug_244:
     .return (rx282_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "_block287"  :anon :subid("97_1280467467.13603") :outer("93_1280467467.13603")
+.sub "_block287"  :anon :subid("97_1284728468.35267") :outer("93_1284728468.35267")
 .annotate 'line', 105
     find_lex $P289, "$/"
     $P290 = $P289."CURSOR"()
     new $P291, "String"
     assign $P291, "Unrecognized backslash sequence: '\\"
     find_lex $P292, "$/"
-    unless_null $P292, vivify_108
+    unless_null $P292, vivify_245
     $P292 = root_new ['parrot';'Hash']
-  vivify_108:
+  vivify_245:
     set $P293, $P292["x"]
-    unless_null $P293, vivify_109
+    unless_null $P293, vivify_246
     new $P293, "Undef"
-  vivify_109:
+  vivify_246:
     $S294 = $P293."Str"()
     concat $P295, $P291, $S294
     concat $P296, $P295, "'"
@@ -4552,9 +5002,9 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "charname"  :subid("98_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "charname"  :subid("98_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
-    .const 'Sub' $P310 = "100_1280467467.13603" 
+    .const 'Sub' $P310 = "100_1284728468.35267" 
     capture_lex $P310
     .local string rx301_tgt
     .local int rx301_pos
@@ -4562,7 +5012,9 @@
     .local int rx301_eos
     .local int rx301_rep
     .local pmc rx301_cur
+    .local pmc rx301_debug
     (rx301_cur, rx301_pos, rx301_tgt, $I10) = self."!cursor_start"()
+    getattribute rx301_debug, rx301_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx301_cur
     .local pmc match
     .lex "$/", match
@@ -4574,7 +5026,9 @@
     substr rx301_tgt, rx301_tgt, rx301_off
   rx301_start:
     eq $I10, 1, rx301_restart
-    rx301_cur."!cursor_debug"("START ", "charname")
+    if_null rx301_debug, debug_250
+    rx301_cur."!cursor_debug"("START", "charname")
+  debug_250:
     $I10 = self.'from'()
     ne $I10, -1, rxscan305_done
     goto rxscan305_scan
@@ -4634,7 +5088,7 @@
 .annotate 'line', 114
   # rx subrule "before" subtype=zerowidth negate=
     rx301_cur."!cursor_pos"(rx301_pos)
-    .const 'Sub' $P310 = "100_1280467467.13603" 
+    .const 'Sub' $P310 = "100_1284728468.35267" 
     capture_lex $P310
     $P10 = rx301_cur."before"($P310)
     unless $P10, rx301_fail
@@ -4642,11 +5096,15 @@
 .annotate 'line', 111
   # rx pass
     rx301_cur."!cursor_pass"(rx301_pos, "charname")
-    rx301_cur."!cursor_debug"("PASS  ", "charname", " at pos=", rx301_pos)
+    if_null rx301_debug, debug_255
+    rx301_cur."!cursor_debug"("PASS", "charname", " at pos=", rx301_pos)
+  debug_255:
     .return (rx301_cur)
   rx301_restart:
 .annotate 'line', 33
-    rx301_cur."!cursor_debug"("NEXT ", "charname")
+    if_null rx301_debug, debug_256
+    rx301_cur."!cursor_debug"("NEXT", "charname")
+  debug_256:
   rx301_fail:
     (rx301_rep, rx301_pos, $I10, $P10) = rx301_cur."!mark_fail"(0)
     lt rx301_pos, -1, rx301_done
@@ -4654,14 +5112,16 @@
     jump $I10
   rx301_done:
     rx301_cur."!cursor_fail"()
-    rx301_cur."!cursor_debug"("FAIL  ", "charname")
+    if_null rx301_debug, debug_257
+    rx301_cur."!cursor_debug"("FAIL", "charname")
+  debug_257:
     .return (rx301_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__charname"  :subid("99_1280467467.13603") :method
+.sub "!PREFIX__charname"  :subid("99_1284728468.35267") :method
 .annotate 'line', 33
     $P303 = self."!PREFIX__!subrule"("integer", "")
     new $P304, "ResizablePMCArray"
@@ -4723,7 +5183,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "_block309"  :anon :subid("100_1280467467.13603") :method :outer("98_1280467467.13603")
+.sub "_block309"  :anon :subid("100_1284728468.35267") :method :outer("98_1284728468.35267")
 .annotate 'line', 114
     .local string rx311_tgt
     .local int rx311_pos
@@ -4731,7 +5191,9 @@
     .local int rx311_eos
     .local int rx311_rep
     .local pmc rx311_cur
+    .local pmc rx311_debug
     (rx311_cur, rx311_pos, rx311_tgt, $I10) = self."!cursor_start"()
+    getattribute rx311_debug, rx311_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx311_cur
     .local pmc match
     .lex "$/", match
@@ -4743,7 +5205,9 @@
     substr rx311_tgt, rx311_tgt, rx311_off
   rx311_start:
     eq $I10, 1, rx311_restart
-    rx311_cur."!cursor_debug"("START ", "")
+    if_null rx311_debug, debug_251
+    rx311_cur."!cursor_debug"("START", "")
+  debug_251:
     $I10 = self.'from'()
     ne $I10, -1, rxscan312_done
     goto rxscan312_scan
@@ -4769,10 +5233,14 @@
     inc rx311_pos
   # rx pass
     rx311_cur."!cursor_pass"(rx311_pos, "")
-    rx311_cur."!cursor_debug"("PASS  ", "", " at pos=", rx311_pos)
+    if_null rx311_debug, debug_252
+    rx311_cur."!cursor_debug"("PASS", "", " at pos=", rx311_pos)
+  debug_252:
     .return (rx311_cur)
   rx311_restart:
-    rx311_cur."!cursor_debug"("NEXT ", "")
+    if_null rx311_debug, debug_253
+    rx311_cur."!cursor_debug"("NEXT", "")
+  debug_253:
   rx311_fail:
     (rx311_rep, rx311_pos, $I10, $P10) = rx311_cur."!mark_fail"(0)
     lt rx311_pos, -1, rx311_done
@@ -4780,14 +5248,16 @@
     jump $I10
   rx311_done:
     rx311_cur."!cursor_fail"()
-    rx311_cur."!cursor_debug"("FAIL  ", "")
+    if_null rx311_debug, debug_254
+    rx311_cur."!cursor_debug"("FAIL", "")
+  debug_254:
     .return (rx311_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "charnames"  :subid("101_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "charnames"  :subid("101_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx314_tgt
     .local int rx314_pos
@@ -4795,8 +5265,10 @@
     .local int rx314_eos
     .local int rx314_rep
     .local pmc rx314_cur
+    .local pmc rx314_debug
     (rx314_cur, rx314_pos, rx314_tgt, $I10) = self."!cursor_start"()
     rx314_cur."!cursor_caparray"("charname")
+    getattribute rx314_debug, rx314_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx314_cur
     .local pmc match
     .lex "$/", match
@@ -4808,7 +5280,9 @@
     substr rx314_tgt, rx314_tgt, rx314_off
   rx314_start:
     eq $I10, 1, rx314_restart
-    rx314_cur."!cursor_debug"("START ", "charnames")
+    if_null rx314_debug, debug_258
+    rx314_cur."!cursor_debug"("START", "charnames")
+  debug_258:
     $I10 = self.'from'()
     ne $I10, -1, rxscan317_done
     goto rxscan317_scan
@@ -4851,18 +5325,22 @@
     add $I11, rx314_pos, 1
     gt $I11, rx314_eos, rx314_fail
     sub $I11, rx314_pos, rx314_off
-    substr $S10, rx314_tgt, $I11, 1
-    ne $S10, ",", rx314_fail
+    ord $I11, rx314_tgt, $I11
+    ne $I11, 44, rx314_fail
     add rx314_pos, 1
     goto rxquantr318_loop
   rxquantr318_done:
   # rx pass
     rx314_cur."!cursor_pass"(rx314_pos, "charnames")
-    rx314_cur."!cursor_debug"("PASS  ", "charnames", " at pos=", rx314_pos)
+    if_null rx314_debug, debug_259
+    rx314_cur."!cursor_debug"("PASS", "charnames", " at pos=", rx314_pos)
+  debug_259:
     .return (rx314_cur)
   rx314_restart:
 .annotate 'line', 33
-    rx314_cur."!cursor_debug"("NEXT ", "charnames")
+    if_null rx314_debug, debug_260
+    rx314_cur."!cursor_debug"("NEXT", "charnames")
+  debug_260:
   rx314_fail:
     (rx314_rep, rx314_pos, $I10, $P10) = rx314_cur."!mark_fail"(0)
     lt rx314_pos, -1, rx314_done
@@ -4870,14 +5348,16 @@
     jump $I10
   rx314_done:
     rx314_cur."!cursor_fail"()
-    rx314_cur."!cursor_debug"("FAIL  ", "charnames")
+    if_null rx314_debug, debug_261
+    rx314_cur."!cursor_debug"("FAIL", "charnames")
+  debug_261:
     .return (rx314_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__charnames"  :subid("102_1280467467.13603") :method
+.sub "!PREFIX__charnames"  :subid("102_1284728468.35267") :method
 .annotate 'line', 33
     new $P316, "ResizablePMCArray"
     push $P316, ""
@@ -4886,7 +5366,7 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "charspec"  :subid("103_1280467467.13603") :method :outer("11_1280467467.13603")
+.sub "charspec"  :subid("103_1284728468.35267") :method :outer("11_1284728468.35267")
 .annotate 'line', 33
     .local string rx320_tgt
     .local int rx320_pos
@@ -4894,7 +5374,9 @@
     .local int rx320_eos
     .local int rx320_rep
     .local pmc rx320_cur
+    .local pmc rx320_debug
     (rx320_cur, rx320_pos, rx320_tgt, $I10) = self."!cursor_start"()
+    getattribute rx320_debug, rx320_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx320_cur
     .local pmc match
     .lex "$/", match
@@ -4906,7 +5388,9 @@
     substr rx320_tgt, rx320_tgt, rx320_off
   rx320_start:
     eq $I10, 1, rx320_restart
-    rx320_cur."!cursor_debug"("START ", "charspec")
+    if_null rx320_debug, debug_262
+    rx320_cur."!cursor_debug"("START", "charspec")
+  debug_262:
     $I10 = self.'from'()
     ne $I10, -1, rxscan325_done
     goto rxscan325_scan
@@ -4928,8 +5412,8 @@
     add $I11, rx320_pos, 1
     gt $I11, rx320_eos, rx320_fail
     sub $I11, rx320_pos, rx320_off
-    substr $S10, rx320_tgt, $I11, 1
-    ne $S10, "[", rx320_fail
+    ord $I11, rx320_tgt, $I11
+    ne $I11, 91, rx320_fail
     add rx320_pos, 1
   # rx subrule "charnames" subtype=capture negate=
     rx320_cur."!cursor_pos"(rx320_pos)
@@ -4942,8 +5426,8 @@
     add $I11, rx320_pos, 1
     gt $I11, rx320_eos, rx320_fail
     sub $I11, rx320_pos, rx320_off
-    substr $S10, rx320_tgt, $I11, 1
-    ne $S10, "]", rx320_fail
+    ord $I11, rx320_tgt, $I11
+    ne $I11, 93, rx320_fail
     add rx320_pos, 1
     goto alt326_end
   alt326_1:
@@ -4964,8 +5448,8 @@
     add $I11, rx320_pos, 1
     gt $I11, rx320_eos, rx320_fail
     sub $I11, rx320_pos, rx320_off
-    substr $S10, rx320_tgt, $I11, 1
-    ne $S10, "_", rx320_fail
+    ord $I11, rx320_tgt, $I11
+    ne $I11, 95, rx320_fail
     add rx320_pos, 1
   # rx charclass_q d r 1..-1
     sub $I10, rx320_pos, rx320_off
@@ -5003,11 +5487,15 @@
 .annotate 'line', 117
   # rx pass
     rx320_cur."!cursor_pass"(rx320_pos, "charspec")
-    rx320_cur."!cursor_debug"("PASS  ", "charspec", " at pos=", rx320_pos)
+    if_null rx320_debug, debug_263
+    rx320_cur."!cursor_debug"("PASS", "charspec", " at pos=", rx320_pos)
+  debug_263:
     .return (rx320_cur)
   rx320_restart:
 .annotate 'line', 33
-    rx320_cur."!cursor_debug"("NEXT ", "charspec")
+    if_null rx320_debug, debug_264
+    rx320_cur."!cursor_debug"("NEXT", "charspec")
+  debug_264:
   rx320_fail:
     (rx320_rep, rx320_pos, $I10, $P10) = rx320_cur."!mark_fail"(0)
     lt rx320_pos, -1, rx320_done
@@ -5015,14 +5503,16 @@
     jump $I10
   rx320_done:
     rx320_cur."!cursor_fail"()
-    rx320_cur."!cursor_debug"("FAIL  ", "charspec")
+    if_null rx320_debug, debug_265
+    rx320_cur."!cursor_debug"("FAIL", "charspec")
+  debug_265:
     .return (rx320_cur)
     .return ()
 .end
 
 
 .namespace ["HLL";"Grammar"]
-.sub "!PREFIX__charspec"  :subid("104_1280467467.13603") :method
+.sub "!PREFIX__charspec"  :subid("104_1284728468.35267") :method
 .annotate 'line', 33
     $P322 = self."!PREFIX__!subrule"("panic", "")
     $P323 = self."!PREFIX__!subrule"("charnames", "[")
@@ -5063,18 +5553,18 @@
 
 
 .namespace ["HLL";"Grammar"]
-.sub "_block328" :load :anon :subid("105_1280467467.13603")
+.sub "_block328" :load :anon :subid("105_1284728468.35267")
 .annotate 'line', 5
-    .const 'Sub' $P330 = "11_1280467467.13603" 
+    .const 'Sub' $P330 = "11_1284728468.35267" 
     $P331 = $P330()
     .return ($P331)
 .end
 
 
 .namespace []
-.sub "_block333" :load :anon :subid("106_1280467467.13603")
+.sub "_block333" :load :anon :subid("106_1284728468.35267")
 .annotate 'line', 1
-    .const 'Sub' $P335 = "10_1280467467.13603" 
+    .const 'Sub' $P335 = "10_1284728468.35267" 
     $P336 = $P335()
     .return ($P336)
 .end
@@ -5082,7 +5572,7 @@
 ### .include 'gen/hllgrammar-actions.pir'
 
 .namespace []
-.sub "_block11"  :anon :subid("10_1280467468.44761")
+.sub "_block11"  :anon :subid("10_1284728469.44803")
 .annotate 'line', 0
     get_hll_global $P14, ["HLL";"Actions"], "_block13" 
     capture_lex $P14
@@ -5099,15 +5589,15 @@
     $P627 = $P14()
 .annotate 'line', 1
     .return ($P627)
-    .const 'Sub' $P629 = "55_1280467468.44761" 
+    .const 'Sub' $P629 = "55_1284728469.44803" 
     .return ($P629)
 .end
 
 
 .namespace []
-.sub "" :load :init :subid("post56") :outer("10_1280467468.44761")
+.sub "" :load :init :subid("post56") :outer("10_1284728469.44803")
 .annotate 'line', 0
-    .const 'Sub' $P12 = "10_1280467468.44761" 
+    .const 'Sub' $P12 = "10_1284728469.44803" 
     .local pmc block
     set block, $P12
     $P632 = get_root_global ["parrot"], "P6metaclass"
@@ -5116,75 +5606,75 @@
 
 
 .namespace ["HLL";"Actions"]
-.sub "_block13"  :subid("11_1280467468.44761") :outer("10_1280467468.44761")
+.sub "_block13"  :subid("11_1284728469.44803") :outer("10_1284728469.44803")
 .annotate 'line', 3
-    .const 'Sub' $P605 = "53_1280467468.44761" 
+    .const 'Sub' $P605 = "53_1284728469.44803" 
     capture_lex $P605
-    .const 'Sub' $P580 = "51_1280467468.44761" 
+    .const 'Sub' $P580 = "51_1284728469.44803" 
     capture_lex $P580
-    .const 'Sub' $P550 = "50_1280467468.44761" 
+    .const 'Sub' $P550 = "50_1284728469.44803" 
     capture_lex $P550
-    .const 'Sub' $P531 = "49_1280467468.44761" 
+    .const 'Sub' $P531 = "49_1284728469.44803" 
     capture_lex $P531
-    .const 'Sub' $P524 = "48_1280467468.44761" 
+    .const 'Sub' $P524 = "48_1284728469.44803" 
     capture_lex $P524
-    .const 'Sub' $P514 = "47_1280467468.44761" 
+    .const 'Sub' $P514 = "47_1284728469.44803" 
     capture_lex $P514
-    .const 'Sub' $P497 = "46_1280467468.44761" 
+    .const 'Sub' $P497 = "46_1284728469.44803" 
     capture_lex $P497
-    .const 'Sub' $P480 = "45_1280467468.44761" 
+    .const 'Sub' $P480 = "45_1284728469.44803" 
     capture_lex $P480
-    .const 'Sub' $P473 = "44_1280467468.44761" 
+    .const 'Sub' $P473 = "44_1284728469.44803" 
     capture_lex $P473
-    .const 'Sub' $P466 = "43_1280467468.44761" 
+    .const 'Sub' $P466 = "43_1284728469.44803" 
     capture_lex $P466
-    .const 'Sub' $P459 = "42_1280467468.44761" 
+    .const 'Sub' $P459 = "42_1284728469.44803" 
     capture_lex $P459
-    .const 'Sub' $P452 = "41_1280467468.44761" 
+    .const 'Sub' $P452 = "41_1284728469.44803" 
     capture_lex $P452
-    .const 'Sub' $P445 = "40_1280467468.44761" 
+    .const 'Sub' $P445 = "40_1284728469.44803" 
     capture_lex $P445
-    .const 'Sub' $P438 = "39_1280467468.44761" 
+    .const 'Sub' $P438 = "39_1284728469.44803" 
     capture_lex $P438
-    .const 'Sub' $P428 = "38_1280467468.44761" 
+    .const 'Sub' $P428 = "38_1284728469.44803" 
     capture_lex $P428
-    .const 'Sub' $P421 = "37_1280467468.44761" 
+    .const 'Sub' $P421 = "37_1284728469.44803" 
     capture_lex $P421
-    .const 'Sub' $P405 = "36_1280467468.44761" 
+    .const 'Sub' $P405 = "36_1284728469.44803" 
     capture_lex $P405
-    .const 'Sub' $P330 = "34_1280467468.44761" 
+    .const 'Sub' $P330 = "34_1284728469.44803" 
     capture_lex $P330
-    .const 'Sub' $P267 = "31_1280467468.44761" 
+    .const 'Sub' $P267 = "31_1284728469.44803" 
     capture_lex $P267
-    .const 'Sub' $P258 = "30_1280467468.44761" 
+    .const 'Sub' $P258 = "30_1284728469.44803" 
     capture_lex $P258
-    .const 'Sub' $P249 = "29_1280467468.44761" 
+    .const 'Sub' $P249 = "29_1284728469.44803" 
     capture_lex $P249
-    .const 'Sub' $P240 = "28_1280467468.44761" 
+    .const 'Sub' $P240 = "28_1284728469.44803" 
     capture_lex $P240
-    .const 'Sub' $P231 = "27_1280467468.44761" 
+    .const 'Sub' $P231 = "27_1284728469.44803" 
     capture_lex $P231
-    .const 'Sub' $P222 = "26_1280467468.44761" 
+    .const 'Sub' $P222 = "26_1284728469.44803" 
     capture_lex $P222
-    .const 'Sub' $P212 = "25_1280467468.44761" 
+    .const 'Sub' $P212 = "25_1284728469.44803" 
     capture_lex $P212
-    .const 'Sub' $P202 = "24_1280467468.44761" 
+    .const 'Sub' $P202 = "24_1284728469.44803" 
     capture_lex $P202
-    .const 'Sub' $P194 = "23_1280467468.44761" 
+    .const 'Sub' $P194 = "23_1284728469.44803" 
     capture_lex $P194
-    .const 'Sub' $P184 = "22_1280467468.44761" 
+    .const 'Sub' $P184 = "22_1284728469.44803" 
     capture_lex $P184
-    .const 'Sub' $P174 = "21_1280467468.44761" 
+    .const 'Sub' $P174 = "21_1284728469.44803" 
     capture_lex $P174
-    .const 'Sub' $P73 = "18_1280467468.44761" 
+    .const 'Sub' $P73 = "18_1284728469.44803" 
     capture_lex $P73
-    .const 'Sub' $P35 = "15_1280467468.44761" 
+    .const 'Sub' $P35 = "15_1284728469.44803" 
     capture_lex $P35
-    .const 'Sub' $P28 = "14_1280467468.44761" 
+    .const 'Sub' $P28 = "14_1284728469.44803" 
     capture_lex $P28
-    .const 'Sub' $P22 = "13_1280467468.44761" 
+    .const 'Sub' $P22 = "13_1284728469.44803" 
     capture_lex $P22
-    .const 'Sub' $P15 = "12_1280467468.44761" 
+    .const 'Sub' $P15 = "12_1284728469.44803" 
     capture_lex $P15
     $P0 = find_dynamic_lex "$*CTXSAVE"
     if null $P0 goto ctxsave_done
@@ -5193,18 +5683,18 @@
     $P0."ctxsave"()
   ctxsave_done:
 .annotate 'line', 225
-    .const 'Sub' $P605 = "53_1280467468.44761" 
+    .const 'Sub' $P605 = "53_1284728469.44803" 
     newclosure $P622, $P605
 .annotate 'line', 3
     .return ($P622)
-    .const 'Sub' $P624 = "54_1280467468.44761" 
+    .const 'Sub' $P624 = "54_1284728469.44803" 
     .return ($P624)
 .end
 
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "string_to_int"  :subid("12_1280467468.44761") :outer("11_1280467468.44761")
+.sub "string_to_int"  :subid("12_1284728469.44803") :outer("11_1284728469.44803")
     .param pmc param_18
     .param pmc param_19
 .annotate 'line', 3
@@ -5258,7 +5748,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "ints_to_string"  :subid("13_1280467468.44761") :outer("11_1280467468.44761")
+.sub "ints_to_string"  :subid("13_1284728469.44803") :outer("11_1284728469.44803")
     .param pmc param_25
 .annotate 'line', 37
     new $P24, 'ExceptionHandler'
@@ -5300,7 +5790,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "CTXSAVE"  :subid("14_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "CTXSAVE"  :subid("14_1284728469.44803") :method :outer("11_1284728469.44803")
 .annotate 'line', 62
     new $P30, 'ExceptionHandler'
     set_addr $P30, control_29
@@ -5330,10 +5820,10 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "SET_BLOCK_OUTER_CTX"  :subid("15_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "SET_BLOCK_OUTER_CTX"  :subid("15_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_38
 .annotate 'line', 76
-    .const 'Sub' $P48 = "16_1280467468.44761" 
+    .const 'Sub' $P48 = "16_1284728469.44803" 
     capture_lex $P48
     new $P37, 'ExceptionHandler'
     set_addr $P37, control_36
@@ -5368,7 +5858,7 @@
     set $P43, $I46
     goto if_44_end
   if_44:
-    .const 'Sub' $P48 = "16_1280467468.44761" 
+    .const 'Sub' $P48 = "16_1284728469.44803" 
     capture_lex $P48
     $P71 = $P48()
     set $P43, $P71
@@ -5385,9 +5875,9 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "_block47"  :anon :subid("16_1280467468.44761") :outer("15_1280467468.44761")
+.sub "_block47"  :anon :subid("16_1284728469.44803") :outer("15_1284728469.44803")
 .annotate 'line', 78
-    .const 'Sub' $P62 = "17_1280467468.44761" 
+    .const 'Sub' $P62 = "17_1284728469.44803" 
     capture_lex $P62
 .annotate 'line', 79
     $P49 = root_new ['parrot';'ResizablePMCArray']
@@ -5417,7 +5907,7 @@
     unless $P56, loop68_done
     shift $P60, $P56
   loop68_redo:
-    .const 'Sub' $P62 = "17_1280467468.44761" 
+    .const 'Sub' $P62 = "17_1284728469.44803" 
     capture_lex $P62
     $P62($P60)
   loop68_next:
@@ -5437,7 +5927,7 @@
 
 
 .namespace ["HLL";"Actions"]
-.sub "_block61"  :anon :subid("17_1280467468.44761") :outer("16_1280467468.44761")
+.sub "_block61"  :anon :subid("17_1284728469.44803") :outer("16_1284728469.44803")
     .param pmc param_63
 .annotate 'line', 82
     .lex "$_", param_63
@@ -5453,14 +5943,14 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "EXPR"  :subid("18_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "EXPR"  :subid("18_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_76
     .param pmc param_77 :optional
     .param int has_param_77 :opt_flag
 .annotate 'line', 89
-    .const 'Sub' $P156 = "20_1280467468.44761" 
+    .const 'Sub' $P156 = "20_1284728469.44803" 
     capture_lex $P156
-    .const 'Sub' $P123 = "19_1280467468.44761" 
+    .const 'Sub' $P123 = "19_1284728469.44803" 
     capture_lex $P123
     new $P75, 'ExceptionHandler'
     set_addr $P75, control_74
@@ -5595,7 +6085,7 @@
     find_lex $P120, "$past"
     $P121 = $P120."name"()
     if $P121, unless_119_end
-    .const 'Sub' $P123 = "19_1280467468.44761" 
+    .const 'Sub' $P123 = "19_1284728469.44803" 
     capture_lex $P123
     $P123()
   unless_119_end:
@@ -5619,7 +6109,7 @@
     unless $P150, loop167_done
     shift $P154, $P150
   loop167_redo:
-    .const 'Sub' $P156 = "20_1280467468.44761" 
+    .const 'Sub' $P156 = "20_1284728469.44803" 
     capture_lex $P156
     $P156($P154)
   loop167_next:
@@ -5664,7 +6154,7 @@
 
 
 .namespace ["HLL";"Actions"]
-.sub "_block122"  :anon :subid("19_1280467468.44761") :outer("18_1280467468.44761")
+.sub "_block122"  :anon :subid("19_1284728469.44803") :outer("18_1284728469.44803")
 .annotate 'line', 98
     new $P124, "Undef"
     .lex "$name", $P124
@@ -5714,7 +6204,7 @@
 
 
 .namespace ["HLL";"Actions"]
-.sub "_block155"  :anon :subid("20_1280467468.44761") :outer("18_1280467468.44761")
+.sub "_block155"  :anon :subid("20_1284728469.44803") :outer("18_1284728469.44803")
     .param pmc param_157
 .annotate 'line', 109
     .lex "$_", param_157
@@ -5738,7 +6228,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "term:sym<circumfix>"  :subid("21_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "term:sym<circumfix>"  :subid("21_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_177
 .annotate 'line', 114
     new $P176, 'ExceptionHandler'
@@ -5769,7 +6259,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "termish"  :subid("22_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "termish"  :subid("22_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_187
 .annotate 'line', 116
     new $P186, 'ExceptionHandler'
@@ -5800,7 +6290,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "nullterm"  :subid("23_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "nullterm"  :subid("23_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_197
 .annotate 'line', 117
     new $P196, 'ExceptionHandler'
@@ -5823,7 +6313,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "nullterm_alt"  :subid("24_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "nullterm_alt"  :subid("24_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_205
 .annotate 'line', 118
     new $P204, 'ExceptionHandler'
@@ -5854,7 +6344,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "integer"  :subid("25_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "integer"  :subid("25_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_215
 .annotate 'line', 120
     new $P214, 'ExceptionHandler'
@@ -5885,7 +6375,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "dec_number"  :subid("26_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "dec_number"  :subid("26_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_225
 .annotate 'line', 122
     new $P224, 'ExceptionHandler'
@@ -5909,7 +6399,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "decint"  :subid("27_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "decint"  :subid("27_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_234
 .annotate 'line', 124
     new $P233, 'ExceptionHandler'
@@ -5933,7 +6423,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "hexint"  :subid("28_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "hexint"  :subid("28_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_243
 .annotate 'line', 125
     new $P242, 'ExceptionHandler'
@@ -5957,7 +6447,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "octint"  :subid("29_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "octint"  :subid("29_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_252
 .annotate 'line', 126
     new $P251, 'ExceptionHandler'
@@ -5981,7 +6471,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "binint"  :subid("30_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "binint"  :subid("30_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_261
 .annotate 'line', 127
     new $P260, 'ExceptionHandler'
@@ -6005,10 +6495,10 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_EXPR"  :subid("31_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_EXPR"  :subid("31_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_270
 .annotate 'line', 129
-    .const 'Sub' $P286 = "32_1280467468.44761" 
+    .const 'Sub' $P286 = "32_1284728469.44803" 
     capture_lex $P286
     new $P269, 'ExceptionHandler'
     set_addr $P269, control_268
@@ -6040,7 +6530,7 @@
     $P282 = $P280."ACCEPTS"($P281)
     if $P282, if_279
 .annotate 'line', 135
-    .const 'Sub' $P286 = "32_1280467468.44761" 
+    .const 'Sub' $P286 = "32_1284728469.44803" 
     capture_lex $P286
     $P286()
     goto if_279_end
@@ -6080,9 +6570,9 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "_block285"  :anon :subid("32_1280467468.44761") :outer("31_1280467468.44761")
+.sub "_block285"  :anon :subid("32_1284728469.44803") :outer("31_1284728469.44803")
 .annotate 'line', 135
-    .const 'Sub' $P305 = "33_1280467468.44761" 
+    .const 'Sub' $P305 = "33_1284728469.44803" 
     capture_lex $P305
 .annotate 'line', 136
     $P287 = root_new ['parrot';'ResizablePMCArray']
@@ -6133,7 +6623,7 @@
     unless $P300, loop310_done
     shift $P303, $P300
   loop310_redo:
-    .const 'Sub' $P305 = "33_1280467468.44761" 
+    .const 'Sub' $P305 = "33_1284728469.44803" 
     capture_lex $P305
     $P305($P303)
   loop310_next:
@@ -6156,7 +6646,7 @@
 
 
 .namespace ["HLL";"Actions"]
-.sub "_block304"  :anon :subid("33_1280467468.44761") :outer("32_1280467468.44761")
+.sub "_block304"  :anon :subid("33_1284728469.44803") :outer("32_1284728469.44803")
     .param pmc param_306
 .annotate 'line', 139
     .lex "$_", param_306
@@ -6169,10 +6659,10 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_delimited"  :subid("34_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_delimited"  :subid("34_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_333
 .annotate 'line', 152
-    .const 'Sub' $P345 = "35_1280467468.44761" 
+    .const 'Sub' $P345 = "35_1284728469.44803" 
     capture_lex $P345
     new $P332, 'ExceptionHandler'
     set_addr $P332, control_331
@@ -6215,7 +6705,7 @@
     unless $P339, loop377_done
     shift $P343, $P339
   loop377_redo:
-    .const 'Sub' $P345 = "35_1280467468.44761" 
+    .const 'Sub' $P345 = "35_1284728469.44803" 
     capture_lex $P345
     $P345($P343)
   loop377_next:
@@ -6293,7 +6783,7 @@
 
 
 .namespace ["HLL";"Actions"]
-.sub "_block344"  :anon :subid("35_1280467468.44761") :outer("34_1280467468.44761")
+.sub "_block344"  :anon :subid("35_1284728469.44803") :outer("34_1284728469.44803")
     .param pmc param_347
 .annotate 'line', 156
     new $P346, "Undef"
@@ -6363,7 +6853,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_atom"  :subid("36_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_atom"  :subid("36_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_408
 .annotate 'line', 177
     new $P407, 'ExceptionHandler'
@@ -6413,7 +6903,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<backslash>"  :subid("37_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<backslash>"  :subid("37_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_424
 .annotate 'line', 181
     new $P423, 'ExceptionHandler'
@@ -6435,7 +6925,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<stopper>"  :subid("38_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<stopper>"  :subid("38_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_431
 .annotate 'line', 182
     new $P430, 'ExceptionHandler'
@@ -6466,7 +6956,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<bs>"  :subid("39_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<bs>"  :subid("39_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_441
 .annotate 'line', 184
     new $P440, 'ExceptionHandler'
@@ -6488,7 +6978,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<nl>"  :subid("40_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<nl>"  :subid("40_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_448
 .annotate 'line', 185
     new $P447, 'ExceptionHandler'
@@ -6510,7 +7000,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<cr>"  :subid("41_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<cr>"  :subid("41_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_455
 .annotate 'line', 186
     new $P454, 'ExceptionHandler'
@@ -6532,7 +7022,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<tab>"  :subid("42_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<tab>"  :subid("42_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_462
 .annotate 'line', 187
     new $P461, 'ExceptionHandler'
@@ -6554,7 +7044,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<ff>"  :subid("43_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<ff>"  :subid("43_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_469
 .annotate 'line', 188
     new $P468, 'ExceptionHandler'
@@ -6576,7 +7066,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<esc>"  :subid("44_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<esc>"  :subid("44_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_476
 .annotate 'line', 189
     new $P475, 'ExceptionHandler'
@@ -6598,7 +7088,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<hex>"  :subid("45_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<hex>"  :subid("45_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_483
 .annotate 'line', 191
     new $P482, 'ExceptionHandler'
@@ -6657,7 +7147,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<oct>"  :subid("46_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<oct>"  :subid("46_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_500
 .annotate 'line', 195
     new $P499, 'ExceptionHandler'
@@ -6716,7 +7206,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<chr>"  :subid("47_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<chr>"  :subid("47_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_517
 .annotate 'line', 199
     new $P516, 'ExceptionHandler'
@@ -6749,7 +7239,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<0>"  :subid("48_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<0>"  :subid("48_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_527
 .annotate 'line', 203
     new $P526, 'ExceptionHandler'
@@ -6773,7 +7263,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "quote_escape:sym<misc>"  :subid("49_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "quote_escape:sym<misc>"  :subid("49_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_534
 .annotate 'line', 207
     new $P533, 'ExceptionHandler'
@@ -6832,7 +7322,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "charname"  :subid("50_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "charname"  :subid("50_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_553
 .annotate 'line', 211
     new $P552, 'ExceptionHandler'
@@ -6906,10 +7396,10 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "charnames"  :subid("51_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "charnames"  :subid("51_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_583
 .annotate 'line', 219
-    .const 'Sub' $P592 = "52_1280467468.44761" 
+    .const 'Sub' $P592 = "52_1284728469.44803" 
     capture_lex $P592
     new $P582, 'ExceptionHandler'
     set_addr $P582, control_581
@@ -6943,7 +7433,7 @@
     unless $P586, loop598_done
     shift $P590, $P586
   loop598_redo:
-    .const 'Sub' $P592 = "52_1280467468.44761" 
+    .const 'Sub' $P592 = "52_1284728469.44803" 
     capture_lex $P592
     $P592($P590)
   loop598_next:
@@ -6972,7 +7462,7 @@
 
 
 .namespace ["HLL";"Actions"]
-.sub "_block591"  :anon :subid("52_1280467468.44761") :outer("51_1280467468.44761")
+.sub "_block591"  :anon :subid("52_1284728469.44803") :outer("51_1284728469.44803")
     .param pmc param_593
 .annotate 'line', 221
     .lex "$_", param_593
@@ -6987,7 +7477,7 @@
 
 .namespace ["HLL";"Actions"]
 .include "except_types.pasm"
-.sub "charspec"  :subid("53_1280467468.44761") :method :outer("11_1280467468.44761")
+.sub "charspec"  :subid("53_1284728469.44803") :method :outer("11_1284728469.44803")
     .param pmc param_608
 .annotate 'line', 225
     new $P607, 'ExceptionHandler'
@@ -7037,18 +7527,18 @@
 
 
 .namespace ["HLL";"Actions"]
-.sub "_block623" :load :anon :subid("54_1280467468.44761")
+.sub "_block623" :load :anon :subid("54_1284728469.44803")
 .annotate 'line', 3
-    .const 'Sub' $P625 = "11_1280467468.44761" 
+    .const 'Sub' $P625 = "11_1284728469.44803" 
     $P626 = $P625()
     .return ($P626)
 .end
 
 
 .namespace []
-.sub "_block628" :load :anon :subid("55_1280467468.44761")
+.sub "_block628" :load :anon :subid("55_1284728469.44803")
 .annotate 'line', 1
-    .const 'Sub' $P630 = "10_1280467468.44761" 
+    .const 'Sub' $P630 = "10_1284728469.44803" 
     $P631 = $P630()
     .return ($P631)
 .end
@@ -7056,7 +7546,7 @@
 ### .include 'gen/hllcompiler.pir'
 
 .namespace []
-.sub "_block11"  :anon :subid("10_1280467469.30058")
+.sub "_block11"  :anon :subid("10_1284728470.10282")
 .annotate 'line', 0
     get_hll_global $P14, ["HLL";"Compiler"], "_block13" 
     capture_lex $P14
@@ -7073,15 +7563,15 @@
     $P497 = $P14()
 .annotate 'line', 1
     .return ($P497)
-    .const 'Sub' $P499 = "36_1280467469.30058" 
+    .const 'Sub' $P499 = "36_1284728470.10282" 
     .return ($P499)
 .end
 
 
 .namespace []
-.sub "" :load :init :subid("post37") :outer("10_1280467469.30058")
+.sub "" :load :init :subid("post37") :outer("10_1284728470.10282")
 .annotate 'line', 0
-    .const 'Sub' $P12 = "10_1280467469.30058" 
+    .const 'Sub' $P12 = "10_1284728470.10282" 
     .local pmc block
     set block, $P12
 .annotate 'line', 2
@@ -7095,36 +7585,36 @@
 
 
 .namespace ["HLL";"Compiler"]
-.sub "_block13"  :subid("11_1280467469.30058") :outer("10_1280467469.30058")
+.sub "_block13"  :subid("11_1284728470.10282") :outer("10_1284728470.10282")
 .annotate 'line', 6
-    .const 'Sub' $P489 = "35_1280467469.30058" 
+    .const 'Sub' $P489 = "35_1284728470.10282" 
     capture_lex $P489
-    .const 'Sub' $P447 = "33_1280467469.30058" 
+    .const 'Sub' $P447 = "33_1284728470.10282" 
     capture_lex $P447
-    .const 'Sub' $P298 = "26_1280467469.30058" 
+    .const 'Sub' $P298 = "26_1284728470.10282" 
     capture_lex $P298
-    .const 'Sub' $P283 = "25_1280467469.30058" 
+    .const 'Sub' $P283 = "25_1284728470.10282" 
     capture_lex $P283
-    .const 'Sub' $P188 = "20_1280467469.30058" 
+    .const 'Sub' $P188 = "20_1284728470.10282" 
     capture_lex $P188
-    .const 'Sub' $P153 = "18_1280467469.30058" 
+    .const 'Sub' $P153 = "18_1284728470.10282" 
     capture_lex $P153
-    .const 'Sub' $P138 = "17_1280467469.30058" 
+    .const 'Sub' $P138 = "17_1284728470.10282" 
     capture_lex $P138
-    .const 'Sub' $P122 = "16_1280467469.30058" 
+    .const 'Sub' $P122 = "16_1284728470.10282" 
     capture_lex $P122
-    .const 'Sub' $P33 = "13_1280467469.30058" 
+    .const 'Sub' $P33 = "13_1284728470.10282" 
     capture_lex $P33
-    .const 'Sub' $P15 = "12_1280467469.30058" 
+    .const 'Sub' $P15 = "12_1284728470.10282" 
     capture_lex $P15
 .annotate 'line', 14
-    .const 'Sub' $P15 = "12_1280467469.30058" 
+    .const 'Sub' $P15 = "12_1284728470.10282" 
     newclosure $P31, $P15
     .lex "value_type", $P31
 .annotate 'line', 10
     find_lex $P32, "value_type"
 .annotate 'line', 165
-    .const 'Sub' $P489 = "35_1280467469.30058" 
+    .const 'Sub' $P489 = "35_1284728470.10282" 
     newclosure $P495, $P489
 .annotate 'line', 6
     .return ($P495)
@@ -7132,7 +7622,7 @@
 
 
 .namespace ["HLL";"Compiler"]
-.sub "" :load :init :subid("post38") :outer("11_1280467469.30058")
+.sub "" :load :init :subid("post38") :outer("11_1284728470.10282")
 .annotate 'line', 6
     get_hll_global $P14, ["HLL";"Compiler"], "_block13" 
     .local pmc block
@@ -7145,7 +7635,7 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "value_type"  :subid("12_1280467469.30058") :outer("11_1280467469.30058")
+.sub "value_type"  :subid("12_1284728470.10282") :outer("11_1284728470.10282")
     .param pmc param_18
 .annotate 'line', 14
     new $P17, 'ExceptionHandler'
@@ -7190,15 +7680,15 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "get_exports"  :subid("13_1280467469.30058") :method :outer("11_1280467469.30058")
+.sub "get_exports"  :subid("13_1284728470.10282") :method :outer("11_1284728470.10282")
     .param pmc param_36
     .param pmc param_39 :slurpy
     .param pmc param_37 :optional :named("tagset")
     .param int has_param_37 :opt_flag
 .annotate 'line', 20
-    .const 'Sub' $P105 = "15_1280467469.30058" 
+    .const 'Sub' $P105 = "15_1284728470.10282" 
     capture_lex $P105
-    .const 'Sub' $P84 = "14_1280467469.30058" 
+    .const 'Sub' $P84 = "14_1284728470.10282" 
     capture_lex $P84
     new $P35, 'ExceptionHandler'
     set_addr $P35, control_34
@@ -7304,7 +7794,7 @@
     unless $P100, loop117_done
     shift $P103, $P100
   loop117_redo:
-    .const 'Sub' $P105 = "15_1280467469.30058" 
+    .const 'Sub' $P105 = "15_1284728470.10282" 
     capture_lex $P105
     $P105($P103)
   loop117_next:
@@ -7334,7 +7824,7 @@
     unless $P79, loop97_done
     shift $P82, $P79
   loop97_redo:
-    .const 'Sub' $P84 = "14_1280467469.30058" 
+    .const 'Sub' $P84 = "14_1284728470.10282" 
     capture_lex $P84
     $P84($P82)
   loop97_next:
@@ -7362,7 +7852,7 @@
 
 
 .namespace ["HLL";"Compiler"]
-.sub "_block104"  :anon :subid("15_1280467469.30058") :outer("13_1280467469.30058")
+.sub "_block104"  :anon :subid("15_1284728470.10282") :outer("13_1284728470.10282")
     .param pmc param_107
 .annotate 'line', 40
     new $P106, "Undef"
@@ -7394,7 +7884,7 @@
 
 
 .namespace ["HLL";"Compiler"]
-.sub "_block83"  :anon :subid("14_1280467469.30058") :outer("13_1280467469.30058")
+.sub "_block83"  :anon :subid("14_1284728470.10282") :outer("13_1284728470.10282")
     .param pmc param_86
 .annotate 'line', 34
     new $P85, "Undef"
@@ -7434,7 +7924,7 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "get_module"  :subid("16_1280467469.30058") :method :outer("11_1280467469.30058")
+.sub "get_module"  :subid("16_1284728470.10282") :method :outer("11_1284728470.10282")
     .param pmc param_125
 .annotate 'line', 47
     new $P124, 'ExceptionHandler'
@@ -7475,7 +7965,7 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "language"  :subid("17_1280467469.30058") :method :outer("11_1280467469.30058")
+.sub "language"  :subid("17_1284728470.10282") :method :outer("11_1284728470.10282")
     .param pmc param_141 :optional
     .param int has_param_141 :opt_flag
 .annotate 'line', 53
@@ -7520,10 +8010,10 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "load_module"  :subid("18_1280467469.30058") :method :outer("11_1280467469.30058")
+.sub "load_module"  :subid("18_1284728470.10282") :method :outer("11_1284728470.10282")
     .param pmc param_156
 .annotate 'line', 61
-    .const 'Sub' $P166 = "19_1280467469.30058" 
+    .const 'Sub' $P166 = "19_1284728470.10282" 
     capture_lex $P166
     new $P155, 'ExceptionHandler'
     set_addr $P155, control_154
@@ -7550,7 +8040,7 @@
     assign $P164, 0
     store_lex "$loaded", $P164
 .annotate 'line', 64
-    .const 'Sub' $P166 = "19_1280467469.30058" 
+    .const 'Sub' $P166 = "19_1284728470.10282" 
     capture_lex $P166
     $P166()
 .annotate 'line', 65
@@ -7580,7 +8070,7 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "_block165"  :anon :subid("19_1280467469.30058") :outer("18_1280467469.30058")
+.sub "_block165"  :anon :subid("19_1284728470.10282") :outer("18_1284728470.10282")
 .annotate 'line', 64
     new $P173, 'ExceptionHandler'
     set_addr $P173, control_172
@@ -7614,11 +8104,11 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "import"  :subid("20_1280467469.30058") :method :outer("11_1280467469.30058")
+.sub "import"  :subid("20_1284728470.10282") :method :outer("11_1284728470.10282")
     .param pmc param_191
     .param pmc param_192
 .annotate 'line', 69
-    .const 'Sub' $P198 = "21_1280467469.30058" 
+    .const 'Sub' $P198 = "21_1284728470.10282" 
     capture_lex $P198
     new $P190, 'ExceptionHandler'
     set_addr $P190, control_189
@@ -7640,7 +8130,7 @@
     unless $P193, loop279_done
     shift $P196, $P193
   loop279_redo:
-    .const 'Sub' $P198 = "21_1280467469.30058" 
+    .const 'Sub' $P198 = "21_1284728470.10282" 
     capture_lex $P198
     $P198($P196)
   loop279_next:
@@ -7666,14 +8156,14 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "_block197"  :anon :subid("21_1280467469.30058") :outer("20_1280467469.30058")
+.sub "_block197"  :anon :subid("21_1284728470.10282") :outer("20_1284728470.10282")
     .param pmc param_201
 .annotate 'line', 70
-    .const 'Sub' $P268 = "24_1280467469.30058" 
+    .const 'Sub' $P268 = "24_1284728470.10282" 
     capture_lex $P268
-    .const 'Sub' $P248 = "23_1280467469.30058" 
+    .const 'Sub' $P248 = "23_1284728470.10282" 
     capture_lex $P248
-    .const 'Sub' $P219 = "22_1280467469.30058" 
+    .const 'Sub' $P219 = "22_1284728470.10282" 
     capture_lex $P219
 .annotate 'line', 71
     new $P199, "Undef"
@@ -7721,7 +8211,7 @@
     unless $P263, loop276_done
     shift $P266, $P263
   loop276_redo:
-    .const 'Sub' $P268 = "24_1280467469.30058" 
+    .const 'Sub' $P268 = "24_1284728470.10282" 
     capture_lex $P268
     $P268($P266)
   loop276_next:
@@ -7753,7 +8243,7 @@
     unless $P243, loop260_done
     shift $P246, $P243
   loop260_redo:
-    .const 'Sub' $P248 = "23_1280467469.30058" 
+    .const 'Sub' $P248 = "23_1284728470.10282" 
     capture_lex $P248
     $P248($P246)
   loop260_next:
@@ -7787,7 +8277,7 @@
     unless $P214, loop232_done
     shift $P217, $P214
   loop232_redo:
-    .const 'Sub' $P219 = "22_1280467469.30058" 
+    .const 'Sub' $P219 = "22_1284728470.10282" 
     capture_lex $P219
     $P219($P217)
   loop232_next:
@@ -7810,7 +8300,7 @@
 
 
 .namespace ["HLL";"Compiler"]
-.sub "_block267"  :anon :subid("24_1280467469.30058") :outer("21_1280467469.30058")
+.sub "_block267"  :anon :subid("24_1284728470.10282") :outer("21_1284728470.10282")
     .param pmc param_269
 .annotate 'line', 80
     .lex "$_", param_269
@@ -7830,7 +8320,7 @@
 
 
 .namespace ["HLL";"Compiler"]
-.sub "_block247"  :anon :subid("23_1280467469.30058") :outer("21_1280467469.30058")
+.sub "_block247"  :anon :subid("23_1284728470.10282") :outer("21_1284728470.10282")
     .param pmc param_249
 .annotate 'line', 77
     .lex "$_", param_249
@@ -7850,7 +8340,7 @@
 
 
 .namespace ["HLL";"Compiler"]
-.sub "_block218"  :anon :subid("22_1280467469.30058") :outer("21_1280467469.30058")
+.sub "_block218"  :anon :subid("22_1284728470.10282") :outer("21_1284728470.10282")
     .param pmc param_220
 .annotate 'line', 74
     .lex "$_", param_220
@@ -7872,7 +8362,7 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "autoprint"  :subid("25_1280467469.30058") :method :outer("11_1280467469.30058")
+.sub "autoprint"  :subid("25_1284728470.10282") :method :outer("11_1284728470.10282")
     .param pmc param_286
 .annotate 'line', 85
     new $P285, 'ExceptionHandler'
@@ -7916,10 +8406,10 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "interactive"  :subid("26_1280467469.30058") :method :outer("11_1280467469.30058")
+.sub "interactive"  :subid("26_1284728470.10282") :method :outer("11_1284728470.10282")
     .param pmc param_301 :slurpy :named
 .annotate 'line', 90
-    .const 'Sub' $P333 = "27_1280467469.30058" 
+    .const 'Sub' $P333 = "27_1284728470.10282" 
     capture_lex $P333
     new $P300, 'ExceptionHandler'
     set_addr $P300, control_299
@@ -8006,7 +8496,7 @@
     assign $P331, 1
     unless $P331, loop443_done
   loop443_redo:
-    .const 'Sub' $P333 = "27_1280467469.30058" 
+    .const 'Sub' $P333 = "27_1284728470.10282" 
     capture_lex $P333
     $P333()
   loop443_next:
@@ -8031,9 +8521,9 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "_block332"  :anon :subid("27_1280467469.30058") :outer("26_1280467469.30058")
+.sub "_block332"  :anon :subid("27_1284728470.10282") :outer("26_1284728470.10282")
 .annotate 'line', 102
-    .const 'Sub' $P365 = "28_1280467469.30058" 
+    .const 'Sub' $P365 = "28_1284728470.10282" 
     capture_lex $P365
 .annotate 'line', 105
     new $P334, "Undef"
@@ -8101,7 +8591,7 @@
     set $P361, $P363
     goto if_362_end
   if_362:
-    .const 'Sub' $P365 = "28_1280467469.30058" 
+    .const 'Sub' $P365 = "28_1284728470.10282" 
     capture_lex $P365
     $P442 = $P365()
     set $P361, $P442
@@ -8113,11 +8603,11 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "_block364"  :anon :subid("28_1280467469.30058") :outer("27_1280467469.30058")
+.sub "_block364"  :anon :subid("28_1284728470.10282") :outer("27_1284728470.10282")
 .annotate 'line', 115
-    .const 'Sub' $P398 = "31_1280467469.30058" 
+    .const 'Sub' $P398 = "31_1284728470.10282" 
     capture_lex $P398
-    .const 'Sub' $P371 = "29_1280467469.30058" 
+    .const 'Sub' $P371 = "29_1284728470.10282" 
     capture_lex $P371
 .annotate 'line', 117
     new $P366, "Undef"
@@ -8128,7 +8618,7 @@
     store_lex "$code", $P368
     find_lex $P369, "$output"
 .annotate 'line', 118
-    .const 'Sub' $P371 = "29_1280467469.30058" 
+    .const 'Sub' $P371 = "29_1284728470.10282" 
     capture_lex $P371
     $P371()
 .annotate 'line', 125
@@ -8141,7 +8631,7 @@
   vivify_67:
     defined $I396, $P395
     unless $I396, if_394_end
-    .const 'Sub' $P398 = "31_1280467469.30058" 
+    .const 'Sub' $P398 = "31_1284728470.10282" 
     capture_lex $P398
     $P398()
   if_394_end:
@@ -8195,9 +8685,9 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "_block370"  :anon :subid("29_1280467469.30058") :outer("28_1280467469.30058")
+.sub "_block370"  :anon :subid("29_1284728470.10282") :outer("28_1284728470.10282")
 .annotate 'line', 118
-    .const 'Sub' $P383 = "30_1280467469.30058" 
+    .const 'Sub' $P383 = "30_1284728470.10282" 
     capture_lex $P383
     new $P379, 'ExceptionHandler'
     set_addr $P379, control_378
@@ -8217,7 +8707,7 @@
 .annotate 'line', 120
     .local pmc exception 
     .get_results (exception) 
-    .const 'Sub' $P383 = "30_1280467469.30058" 
+    .const 'Sub' $P383 = "30_1284728470.10282" 
     newclosure $P391, $P383
     $P391(exception)
     new $P392, 'Integer'
@@ -8237,7 +8727,7 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "_block382"  :anon :subid("30_1280467469.30058") :outer("29_1280467469.30058")
+.sub "_block382"  :anon :subid("30_1284728470.10282") :outer("29_1284728470.10282")
     .param pmc param_384
 .annotate 'line', 120
     .lex "$_", param_384
@@ -8260,9 +8750,9 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "_block397"  :anon :subid("31_1280467469.30058") :outer("28_1280467469.30058")
+.sub "_block397"  :anon :subid("31_1284728470.10282") :outer("28_1284728470.10282")
 .annotate 'line', 125
-    .const 'Sub' $P409 = "32_1280467469.30058" 
+    .const 'Sub' $P409 = "32_1284728470.10282" 
     capture_lex $P409
 .annotate 'line', 126
     get_global $P399, "$interactive_ctx"
@@ -8299,7 +8789,7 @@
     unless $P403, loop416_done
     shift $P407, $P403
   loop416_redo:
-    .const 'Sub' $P409 = "32_1280467469.30058" 
+    .const 'Sub' $P409 = "32_1284728470.10282" 
     capture_lex $P409
     $P409($P407)
   loop416_next:
@@ -8322,7 +8812,7 @@
 
 
 .namespace ["HLL";"Compiler"]
-.sub "_block408"  :anon :subid("32_1280467469.30058") :outer("31_1280467469.30058")
+.sub "_block408"  :anon :subid("32_1284728470.10282") :outer("31_1284728470.10282")
     .param pmc param_410
 .annotate 'line', 128
     .lex "$_", param_410
@@ -8344,12 +8834,12 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "eval"  :subid("33_1280467469.30058") :method :outer("11_1280467469.30058")
+.sub "eval"  :subid("33_1284728470.10282") :method :outer("11_1284728470.10282")
     .param pmc param_450
     .param pmc param_451 :slurpy
     .param pmc param_452 :slurpy :named
 .annotate 'line', 146
-    .const 'Sub' $P471 = "34_1280467469.30058" 
+    .const 'Sub' $P471 = "34_1284728470.10282" 
     capture_lex $P471
     new $P449, 'ExceptionHandler'
     set_addr $P449, control_448
@@ -8396,7 +8886,7 @@
     set $P460, $I469
   if_461_end:
     unless $P460, if_459_end
-    .const 'Sub' $P471 = "34_1280467469.30058" 
+    .const 'Sub' $P471 = "34_1284728470.10282" 
     capture_lex $P471
     $P471()
   if_459_end:
@@ -8413,7 +8903,7 @@
 
 
 .namespace ["HLL";"Compiler"]
-.sub "_block470"  :anon :subid("34_1280467469.30058") :outer("33_1280467469.30058")
+.sub "_block470"  :anon :subid("34_1284728470.10282") :outer("33_1284728470.10282")
 .annotate 'line', 152
     new $P472, "Undef"
     .lex "$outer_ctx", $P472
@@ -8467,7 +8957,7 @@
 
 .namespace ["HLL";"Compiler"]
 .include "except_types.pasm"
-.sub "ctxsave"  :subid("35_1280467469.30058") :method :outer("11_1280467469.30058")
+.sub "ctxsave"  :subid("35_1284728470.10282") :method :outer("11_1284728470.10282")
 .annotate 'line', 165
     new $P491, 'ExceptionHandler'
     set_addr $P491, control_490
@@ -8495,9 +8985,9 @@
 
 
 .namespace []
-.sub "_block498" :load :anon :subid("36_1280467469.30058")
+.sub "_block498" :load :anon :subid("36_1284728470.10282")
 .annotate 'line', 1
-    .const 'Sub' $P500 = "10_1280467469.30058" 
+    .const 'Sub' $P500 = "10_1284728470.10282" 
     $P501 = $P500()
     .return ($P501)
 .end

Modified: branches/gsoc_nci/ext/nqp-rx/src/stage0/NQP-s0.pir
==============================================================================
--- branches/gsoc_nci/ext/nqp-rx/src/stage0/NQP-s0.pir	Tue Sep 28 11:02:56 2010	(r49365)
+++ branches/gsoc_nci/ext/nqp-rx/src/stage0/NQP-s0.pir	Tue Sep 28 17:16:52 2010	(r49366)
@@ -15,7 +15,7 @@
 ### .include 'gen/nqp-grammar.pir'
 
 .namespace []
-.sub "_block11"  :anon :subid("10_1280467477.44751")
+.sub "_block11"  :anon :subid("10_1284728478.15265")
 .annotate 'line', 0
     get_hll_global $P14, ["NQP";"Grammar"], "_block13" 
     capture_lex $P14
@@ -29,341 +29,345 @@
 .annotate 'line', 4
     get_hll_global $P14, ["NQP";"Grammar"], "_block13" 
     capture_lex $P14
-    $P1423 = $P14()
+    $P1452 = $P14()
 .annotate 'line', 1
-    .return ($P1423)
-    .const 'Sub' $P1425 = "371_1280467477.44751" 
-    .return ($P1425)
+    .return ($P1452)
+    .const 'Sub' $P1454 = "377_1284728478.15265" 
+    .return ($P1454)
 .end
 
 
 .namespace []
-.sub "" :load :init :subid("post372") :outer("10_1280467477.44751")
+.sub "" :load :init :subid("post378") :outer("10_1284728478.15265")
 .annotate 'line', 0
-    .const 'Sub' $P12 = "10_1280467477.44751" 
+    .const 'Sub' $P12 = "10_1284728478.15265" 
     .local pmc block
     set block, $P12
-    $P1428 = get_root_global ["parrot"], "P6metaclass"
-    $P1428."new_class"("NQP::Grammar", "HLL::Grammar" :named("parent"))
+    $P1457 = get_root_global ["parrot"], "P6metaclass"
+    $P1457."new_class"("NQP::Grammar", "HLL::Grammar" :named("parent"))
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "_block13"  :subid("11_1280467477.44751") :outer("10_1280467477.44751")
+.sub "_block13"  :subid("11_1284728478.15265") :outer("10_1284728478.15265")
 .annotate 'line', 4
-    get_hll_global $P1340, ["NQP";"Regex"], "_block1339" 
-    capture_lex $P1340
-    .const 'Sub' $P1326 = "348_1280467477.44751" 
-    capture_lex $P1326
-    .const 'Sub' $P1320 = "346_1280467477.44751" 
-    capture_lex $P1320
-    .const 'Sub' $P1314 = "344_1280467477.44751" 
-    capture_lex $P1314
-    .const 'Sub' $P1308 = "342_1280467477.44751" 
-    capture_lex $P1308
-    .const 'Sub' $P1302 = "340_1280467477.44751" 
-    capture_lex $P1302
-    .const 'Sub' $P1296 = "338_1280467477.44751" 
-    capture_lex $P1296
-    .const 'Sub' $P1289 = "336_1280467477.44751" 
-    capture_lex $P1289
-    .const 'Sub' $P1282 = "334_1280467477.44751" 
-    capture_lex $P1282
-    .const 'Sub' $P1275 = "332_1280467477.44751" 
-    capture_lex $P1275
-    .const 'Sub' $P1268 = "330_1280467477.44751" 
-    capture_lex $P1268
-    .const 'Sub' $P1262 = "328_1280467477.44751" 
-    capture_lex $P1262
-    .const 'Sub' $P1255 = "326_1280467477.44751" 
-    capture_lex $P1255
-    .const 'Sub' $P1248 = "324_1280467477.44751" 
-    capture_lex $P1248
-    .const 'Sub' $P1241 = "322_1280467477.44751" 
-    capture_lex $P1241
-    .const 'Sub' $P1234 = "320_1280467477.44751" 
-    capture_lex $P1234
-    .const 'Sub' $P1227 = "318_1280467477.44751" 
-    capture_lex $P1227
-    .const 'Sub' $P1220 = "316_1280467477.44751" 
-    capture_lex $P1220
-    .const 'Sub' $P1213 = "314_1280467477.44751" 
-    capture_lex $P1213
-    .const 'Sub' $P1206 = "312_1280467477.44751" 
-    capture_lex $P1206
-    .const 'Sub' $P1199 = "310_1280467477.44751" 
-    capture_lex $P1199
-    .const 'Sub' $P1192 = "308_1280467477.44751" 
-    capture_lex $P1192
-    .const 'Sub' $P1185 = "306_1280467477.44751" 
-    capture_lex $P1185
-    .const 'Sub' $P1178 = "304_1280467477.44751" 
-    capture_lex $P1178
-    .const 'Sub' $P1171 = "302_1280467477.44751" 
-    capture_lex $P1171
-    .const 'Sub' $P1164 = "300_1280467477.44751" 
-    capture_lex $P1164
-    .const 'Sub' $P1157 = "298_1280467477.44751" 
-    capture_lex $P1157
-    .const 'Sub' $P1150 = "296_1280467477.44751" 
-    capture_lex $P1150
-    .const 'Sub' $P1143 = "294_1280467477.44751" 
-    capture_lex $P1143
-    .const 'Sub' $P1136 = "292_1280467477.44751" 
-    capture_lex $P1136
-    .const 'Sub' $P1129 = "290_1280467477.44751" 
-    capture_lex $P1129
-    .const 'Sub' $P1122 = "288_1280467477.44751" 
-    capture_lex $P1122
-    .const 'Sub' $P1115 = "286_1280467477.44751" 
-    capture_lex $P1115
-    .const 'Sub' $P1108 = "284_1280467477.44751" 
-    capture_lex $P1108
-    .const 'Sub' $P1101 = "282_1280467477.44751" 
-    capture_lex $P1101
-    .const 'Sub' $P1094 = "280_1280467477.44751" 
-    capture_lex $P1094
-    .const 'Sub' $P1087 = "278_1280467477.44751" 
-    capture_lex $P1087
-    .const 'Sub' $P1080 = "276_1280467477.44751" 
-    capture_lex $P1080
-    .const 'Sub' $P1073 = "274_1280467477.44751" 
-    capture_lex $P1073
-    .const 'Sub' $P1066 = "272_1280467477.44751" 
-    capture_lex $P1066
-    .const 'Sub' $P1059 = "270_1280467477.44751" 
-    capture_lex $P1059
-    .const 'Sub' $P1053 = "268_1280467477.44751" 
-    capture_lex $P1053
-    .const 'Sub' $P1046 = "266_1280467477.44751" 
-    capture_lex $P1046
-    .const 'Sub' $P1039 = "264_1280467477.44751" 
-    capture_lex $P1039
-    .const 'Sub' $P1032 = "262_1280467477.44751" 
-    capture_lex $P1032
-    .const 'Sub' $P1025 = "260_1280467477.44751" 
-    capture_lex $P1025
-    .const 'Sub' $P1018 = "258_1280467477.44751" 
-    capture_lex $P1018
-    .const 'Sub' $P1011 = "256_1280467477.44751" 
-    capture_lex $P1011
-    .const 'Sub' $P1004 = "254_1280467477.44751" 
+    get_hll_global $P1369, ["NQP";"Regex"], "_block1368" 
+    capture_lex $P1369
+    .const 'Sub' $P1355 = "354_1284728478.15265" 
+    capture_lex $P1355
+    .const 'Sub' $P1349 = "352_1284728478.15265" 
+    capture_lex $P1349
+    .const 'Sub' $P1343 = "350_1284728478.15265" 
+    capture_lex $P1343
+    .const 'Sub' $P1337 = "348_1284728478.15265" 
+    capture_lex $P1337
+    .const 'Sub' $P1331 = "346_1284728478.15265" 
+    capture_lex $P1331
+    .const 'Sub' $P1325 = "344_1284728478.15265" 
+    capture_lex $P1325
+    .const 'Sub' $P1318 = "342_1284728478.15265" 
+    capture_lex $P1318
+    .const 'Sub' $P1311 = "340_1284728478.15265" 
+    capture_lex $P1311
+    .const 'Sub' $P1304 = "338_1284728478.15265" 
+    capture_lex $P1304
+    .const 'Sub' $P1297 = "336_1284728478.15265" 
+    capture_lex $P1297
+    .const 'Sub' $P1291 = "334_1284728478.15265" 
+    capture_lex $P1291
+    .const 'Sub' $P1284 = "332_1284728478.15265" 
+    capture_lex $P1284
+    .const 'Sub' $P1277 = "330_1284728478.15265" 
+    capture_lex $P1277
+    .const 'Sub' $P1270 = "328_1284728478.15265" 
+    capture_lex $P1270
+    .const 'Sub' $P1263 = "326_1284728478.15265" 
+    capture_lex $P1263
+    .const 'Sub' $P1256 = "324_1284728478.15265" 
+    capture_lex $P1256
+    .const 'Sub' $P1249 = "322_1284728478.15265" 
+    capture_lex $P1249
+    .const 'Sub' $P1242 = "320_1284728478.15265" 
+    capture_lex $P1242
+    .const 'Sub' $P1235 = "318_1284728478.15265" 
+    capture_lex $P1235
+    .const 'Sub' $P1228 = "316_1284728478.15265" 
+    capture_lex $P1228
+    .const 'Sub' $P1221 = "314_1284728478.15265" 
+    capture_lex $P1221
+    .const 'Sub' $P1214 = "312_1284728478.15265" 
+    capture_lex $P1214
+    .const 'Sub' $P1207 = "310_1284728478.15265" 
+    capture_lex $P1207
+    .const 'Sub' $P1200 = "308_1284728478.15265" 
+    capture_lex $P1200
+    .const 'Sub' $P1193 = "306_1284728478.15265" 
+    capture_lex $P1193
+    .const 'Sub' $P1186 = "304_1284728478.15265" 
+    capture_lex $P1186
+    .const 'Sub' $P1179 = "302_1284728478.15265" 
+    capture_lex $P1179
+    .const 'Sub' $P1172 = "300_1284728478.15265" 
+    capture_lex $P1172
+    .const 'Sub' $P1165 = "298_1284728478.15265" 
+    capture_lex $P1165
+    .const 'Sub' $P1158 = "296_1284728478.15265" 
+    capture_lex $P1158
+    .const 'Sub' $P1151 = "294_1284728478.15265" 
+    capture_lex $P1151
+    .const 'Sub' $P1144 = "292_1284728478.15265" 
+    capture_lex $P1144
+    .const 'Sub' $P1137 = "290_1284728478.15265" 
+    capture_lex $P1137
+    .const 'Sub' $P1130 = "288_1284728478.15265" 
+    capture_lex $P1130
+    .const 'Sub' $P1123 = "286_1284728478.15265" 
+    capture_lex $P1123
+    .const 'Sub' $P1116 = "284_1284728478.15265" 
+    capture_lex $P1116
+    .const 'Sub' $P1109 = "282_1284728478.15265" 
+    capture_lex $P1109
+    .const 'Sub' $P1102 = "280_1284728478.15265" 
+    capture_lex $P1102
+    .const 'Sub' $P1095 = "278_1284728478.15265" 
+    capture_lex $P1095
+    .const 'Sub' $P1088 = "276_1284728478.15265" 
+    capture_lex $P1088
+    .const 'Sub' $P1082 = "274_1284728478.15265" 
+    capture_lex $P1082
+    .const 'Sub' $P1075 = "272_1284728478.15265" 
+    capture_lex $P1075
+    .const 'Sub' $P1068 = "270_1284728478.15265" 
+    capture_lex $P1068
+    .const 'Sub' $P1061 = "268_1284728478.15265" 
+    capture_lex $P1061
+    .const 'Sub' $P1054 = "266_1284728478.15265" 
+    capture_lex $P1054
+    .const 'Sub' $P1047 = "264_1284728478.15265" 
+    capture_lex $P1047
+    .const 'Sub' $P1040 = "262_1284728478.15265" 
+    capture_lex $P1040
+    .const 'Sub' $P1033 = "260_1284728478.15265" 
+    capture_lex $P1033
+    .const 'Sub' $P1027 = "258_1284728478.15265" 
+    capture_lex $P1027
+    .const 'Sub' $P1021 = "256_1284728478.15265" 
+    capture_lex $P1021
+    .const 'Sub' $P1016 = "254_1284728478.15265" 
+    capture_lex $P1016
+    .const 'Sub' $P1010 = "252_1284728478.15265" 
+    capture_lex $P1010
+    .const 'Sub' $P1004 = "250_1284728478.15265" 
     capture_lex $P1004
-    .const 'Sub' $P998 = "252_1280467477.44751" 
-    capture_lex $P998
-    .const 'Sub' $P992 = "250_1280467477.44751" 
-    capture_lex $P992
-    .const 'Sub' $P987 = "248_1280467477.44751" 
-    capture_lex $P987
-    .const 'Sub' $P981 = "246_1280467477.44751" 
-    capture_lex $P981
-    .const 'Sub' $P975 = "244_1280467477.44751" 
-    capture_lex $P975
-    .const 'Sub' $P970 = "242_1280467477.44751" 
-    capture_lex $P970
-    .const 'Sub' $P965 = "240_1280467477.44751" 
-    capture_lex $P965
-    .const 'Sub' $P957 = "238_1280467477.44751" 
-    capture_lex $P957
-    .const 'Sub' $P948 = "236_1280467477.44751" 
-    capture_lex $P948
-    .const 'Sub' $P943 = "234_1280467477.44751" 
-    capture_lex $P943
-    .const 'Sub' $P938 = "232_1280467477.44751" 
-    capture_lex $P938
-    .const 'Sub' $P933 = "230_1280467477.44751" 
-    capture_lex $P933
-    .const 'Sub' $P925 = "228_1280467477.44751" 
+    .const 'Sub' $P999 = "248_1284728478.15265" 
+    capture_lex $P999
+    .const 'Sub' $P994 = "246_1284728478.15265" 
+    capture_lex $P994
+    .const 'Sub' $P986 = "244_1284728478.15265" 
+    capture_lex $P986
+    .const 'Sub' $P977 = "242_1284728478.15265" 
+    capture_lex $P977
+    .const 'Sub' $P972 = "240_1284728478.15265" 
+    capture_lex $P972
+    .const 'Sub' $P967 = "238_1284728478.15265" 
+    capture_lex $P967
+    .const 'Sub' $P962 = "236_1284728478.15265" 
+    capture_lex $P962
+    .const 'Sub' $P954 = "234_1284728478.15265" 
+    capture_lex $P954
+    .const 'Sub' $P946 = "232_1284728478.15265" 
+    capture_lex $P946
+    .const 'Sub' $P941 = "230_1284728478.15265" 
+    capture_lex $P941
+    .const 'Sub' $P936 = "228_1284728478.15265" 
+    capture_lex $P936
+    .const 'Sub' $P931 = "226_1284728478.15265" 
+    capture_lex $P931
+    .const 'Sub' $P925 = "224_1284728478.15265" 
     capture_lex $P925
-    .const 'Sub' $P917 = "226_1280467477.44751" 
-    capture_lex $P917
-    .const 'Sub' $P912 = "224_1280467477.44751" 
-    capture_lex $P912
-    .const 'Sub' $P907 = "222_1280467477.44751" 
+    .const 'Sub' $P919 = "222_1284728478.15265" 
+    capture_lex $P919
+    .const 'Sub' $P913 = "220_1284728478.15265" 
+    capture_lex $P913
+    .const 'Sub' $P907 = "218_1284728478.15265" 
     capture_lex $P907
-    .const 'Sub' $P902 = "220_1280467477.44751" 
-    capture_lex $P902
-    .const 'Sub' $P896 = "218_1280467477.44751" 
+    .const 'Sub' $P901 = "216_1284728478.15265" 
+    capture_lex $P901
+    .const 'Sub' $P896 = "214_1284728478.15265" 
     capture_lex $P896
-    .const 'Sub' $P890 = "216_1280467477.44751" 
-    capture_lex $P890
-    .const 'Sub' $P884 = "214_1280467477.44751" 
-    capture_lex $P884
-    .const 'Sub' $P878 = "212_1280467477.44751" 
-    capture_lex $P878
-    .const 'Sub' $P872 = "210_1280467477.44751" 
-    capture_lex $P872
-    .const 'Sub' $P867 = "208_1280467477.44751" 
-    capture_lex $P867
-    .const 'Sub' $P862 = "206_1280467477.44751" 
-    capture_lex $P862
-    .const 'Sub' $P850 = "202_1280467477.44751" 
-    capture_lex $P850
-    .const 'Sub' $P842 = "200_1280467477.44751" 
-    capture_lex $P842
-    .const 'Sub' $P836 = "198_1280467477.44751" 
+    .const 'Sub' $P891 = "212_1284728478.15265" 
+    capture_lex $P891
+    .const 'Sub' $P879 = "208_1284728478.15265" 
+    capture_lex $P879
+    .const 'Sub' $P871 = "206_1284728478.15265" 
+    capture_lex $P871
+    .const 'Sub' $P865 = "204_1284728478.15265" 
+    capture_lex $P865
+    .const 'Sub' $P858 = "202_1284728478.15265" 
+    capture_lex $P858
+    .const 'Sub' $P852 = "200_1284728478.15265" 
+    capture_lex $P852
+    .const 'Sub' $P844 = "198_1284728478.15265" 
+    capture_lex $P844
+    .const 'Sub' $P836 = "196_1284728478.15265" 
     capture_lex $P836
-    .const 'Sub' $P829 = "196_1280467477.44751" 
-    capture_lex $P829
-    .const 'Sub' $P823 = "194_1280467477.44751" 
-    capture_lex $P823
-    .const 'Sub' $P815 = "192_1280467477.44751" 
-    capture_lex $P815
-    .const 'Sub' $P807 = "190_1280467477.44751" 
-    capture_lex $P807
-    .const 'Sub' $P801 = "188_1280467477.44751" 
-    capture_lex $P801
-    .const 'Sub' $P795 = "186_1280467477.44751" 
-    capture_lex $P795
-    .const 'Sub' $P781 = "182_1280467477.44751" 
-    capture_lex $P781
-    .const 'Sub' $P744 = "180_1280467477.44751" 
-    capture_lex $P744
-    .const 'Sub' $P735 = "178_1280467477.44751" 
+    .const 'Sub' $P830 = "194_1284728478.15265" 
+    capture_lex $P830
+    .const 'Sub' $P824 = "192_1284728478.15265" 
+    capture_lex $P824
+    .const 'Sub' $P810 = "188_1284728478.15265" 
+    capture_lex $P810
+    .const 'Sub' $P773 = "186_1284728478.15265" 
+    capture_lex $P773
+    .const 'Sub' $P762 = "184_1284728478.15265" 
+    capture_lex $P762
+    .const 'Sub' $P750 = "180_1284728478.15265" 
+    capture_lex $P750
+    .const 'Sub' $P741 = "178_1284728478.15265" 
+    capture_lex $P741
+    .const 'Sub' $P735 = "176_1284728478.15265" 
     capture_lex $P735
-    .const 'Sub' $P729 = "176_1280467477.44751" 
-    capture_lex $P729
-    .const 'Sub' $P719 = "174_1280467477.44751" 
-    capture_lex $P719
-    .const 'Sub' $P706 = "172_1280467477.44751" 
-    capture_lex $P706
-    .const 'Sub' $P699 = "170_1280467477.44751" 
-    capture_lex $P699
-    .const 'Sub' $P691 = "168_1280467477.44751" 
-    capture_lex $P691
-    .const 'Sub' $P681 = "166_1280467477.44751" 
-    capture_lex $P681
-    .const 'Sub' $P657 = "162_1280467477.44751" 
-    capture_lex $P657
-    .const 'Sub' $P634 = "160_1280467477.44751" 
+    .const 'Sub' $P725 = "174_1284728478.15265" 
+    capture_lex $P725
+    .const 'Sub' $P712 = "172_1284728478.15265" 
+    capture_lex $P712
+    .const 'Sub' $P705 = "170_1284728478.15265" 
+    capture_lex $P705
+    .const 'Sub' $P697 = "168_1284728478.15265" 
+    capture_lex $P697
+    .const 'Sub' $P687 = "166_1284728478.15265" 
+    capture_lex $P687
+    .const 'Sub' $P660 = "162_1284728478.15265" 
+    capture_lex $P660
+    .const 'Sub' $P634 = "160_1284728478.15265" 
     capture_lex $P634
-    .const 'Sub' $P627 = "158_1280467477.44751" 
+    .const 'Sub' $P627 = "158_1284728478.15265" 
     capture_lex $P627
-    .const 'Sub' $P620 = "156_1280467477.44751" 
+    .const 'Sub' $P620 = "156_1284728478.15265" 
     capture_lex $P620
-    .const 'Sub' $P610 = "152_1280467477.44751" 
+    .const 'Sub' $P610 = "152_1284728478.15265" 
     capture_lex $P610
-    .const 'Sub' $P602 = "150_1280467477.44751" 
+    .const 'Sub' $P602 = "150_1284728478.15265" 
     capture_lex $P602
-    .const 'Sub' $P596 = "148_1280467477.44751" 
+    .const 'Sub' $P596 = "148_1284728478.15265" 
     capture_lex $P596
-    .const 'Sub' $P583 = "146_1280467477.44751" 
+    .const 'Sub' $P583 = "146_1284728478.15265" 
     capture_lex $P583
-    .const 'Sub' $P576 = "144_1280467477.44751" 
+    .const 'Sub' $P576 = "144_1284728478.15265" 
     capture_lex $P576
-    .const 'Sub' $P569 = "142_1280467477.44751" 
+    .const 'Sub' $P569 = "142_1284728478.15265" 
     capture_lex $P569
-    .const 'Sub' $P562 = "140_1280467477.44751" 
+    .const 'Sub' $P562 = "140_1284728478.15265" 
     capture_lex $P562
-    .const 'Sub' $P535 = "136_1280467477.44751" 
+    .const 'Sub' $P535 = "136_1284728478.15265" 
     capture_lex $P535
-    .const 'Sub' $P526 = "134_1280467477.44751" 
+    .const 'Sub' $P526 = "134_1284728478.15265" 
     capture_lex $P526
-    .const 'Sub' $P519 = "132_1280467477.44751" 
+    .const 'Sub' $P519 = "132_1284728478.15265" 
     capture_lex $P519
-    .const 'Sub' $P510 = "128_1280467477.44751" 
+    .const 'Sub' $P510 = "128_1284728478.15265" 
     capture_lex $P510
-    .const 'Sub' $P505 = "126_1280467477.44751" 
+    .const 'Sub' $P505 = "126_1284728478.15265" 
     capture_lex $P505
-    .const 'Sub' $P493 = "124_1280467477.44751" 
+    .const 'Sub' $P493 = "124_1284728478.15265" 
     capture_lex $P493
-    .const 'Sub' $P481 = "122_1280467477.44751" 
+    .const 'Sub' $P481 = "122_1284728478.15265" 
     capture_lex $P481
-    .const 'Sub' $P474 = "120_1280467477.44751" 
+    .const 'Sub' $P474 = "120_1284728478.15265" 
     capture_lex $P474
-    .const 'Sub' $P469 = "118_1280467477.44751" 
+    .const 'Sub' $P469 = "118_1284728478.15265" 
     capture_lex $P469
-    .const 'Sub' $P463 = "116_1280467477.44751" 
+    .const 'Sub' $P463 = "116_1284728478.15265" 
     capture_lex $P463
-    .const 'Sub' $P457 = "114_1280467477.44751" 
+    .const 'Sub' $P457 = "114_1284728478.15265" 
     capture_lex $P457
-    .const 'Sub' $P447 = "111_1280467477.44751" 
+    .const 'Sub' $P447 = "111_1284728478.15265" 
     capture_lex $P447
-    .const 'Sub' $P441 = "109_1280467477.44751" 
+    .const 'Sub' $P441 = "109_1284728478.15265" 
     capture_lex $P441
-    .const 'Sub' $P435 = "107_1280467477.44751" 
+    .const 'Sub' $P435 = "107_1284728478.15265" 
     capture_lex $P435
-    .const 'Sub' $P429 = "105_1280467477.44751" 
+    .const 'Sub' $P429 = "105_1284728478.15265" 
     capture_lex $P429
-    .const 'Sub' $P423 = "103_1280467477.44751" 
+    .const 'Sub' $P423 = "103_1284728478.15265" 
     capture_lex $P423
-    .const 'Sub' $P417 = "101_1280467477.44751" 
+    .const 'Sub' $P417 = "101_1284728478.15265" 
     capture_lex $P417
-    .const 'Sub' $P411 = "99_1280467477.44751" 
+    .const 'Sub' $P411 = "99_1284728478.15265" 
     capture_lex $P411
-    .const 'Sub' $P402 = "97_1280467477.44751" 
+    .const 'Sub' $P402 = "97_1284728478.15265" 
     capture_lex $P402
-    .const 'Sub' $P393 = "95_1280467477.44751" 
+    .const 'Sub' $P393 = "95_1284728478.15265" 
     capture_lex $P393
-    .const 'Sub' $P384 = "93_1280467477.44751" 
+    .const 'Sub' $P384 = "93_1284728478.15265" 
     capture_lex $P384
-    .const 'Sub' $P371 = "89_1280467477.44751" 
+    .const 'Sub' $P371 = "89_1284728478.15265" 
     capture_lex $P371
-    .const 'Sub' $P362 = "87_1280467477.44751" 
+    .const 'Sub' $P362 = "87_1284728478.15265" 
     capture_lex $P362
-    .const 'Sub' $P352 = "83_1280467477.44751" 
+    .const 'Sub' $P352 = "83_1284728478.15265" 
     capture_lex $P352
-    .const 'Sub' $P345 = "81_1280467477.44751" 
+    .const 'Sub' $P345 = "81_1284728478.15265" 
     capture_lex $P345
-    .const 'Sub' $P338 = "79_1280467477.44751" 
+    .const 'Sub' $P338 = "79_1284728478.15265" 
     capture_lex $P338
-    .const 'Sub' $P326 = "75_1280467477.44751" 
+    .const 'Sub' $P326 = "75_1284728478.15265" 
     capture_lex $P326
-    .const 'Sub' $P318 = "73_1280467477.44751" 
+    .const 'Sub' $P318 = "73_1284728478.15265" 
     capture_lex $P318
-    .const 'Sub' $P310 = "71_1280467477.44751" 
+    .const 'Sub' $P310 = "71_1284728478.15265" 
     capture_lex $P310
-    .const 'Sub' $P290 = "69_1280467477.44751" 
+    .const 'Sub' $P290 = "69_1284728478.15265" 
     capture_lex $P290
-    .const 'Sub' $P281 = "67_1280467477.44751" 
+    .const 'Sub' $P281 = "67_1284728478.15265" 
     capture_lex $P281
-    .const 'Sub' $P263 = "64_1280467477.44751" 
+    .const 'Sub' $P263 = "64_1284728478.15265" 
     capture_lex $P263
-    .const 'Sub' $P245 = "62_1280467477.44751" 
+    .const 'Sub' $P245 = "62_1284728478.15265" 
     capture_lex $P245
-    .const 'Sub' $P236 = "58_1280467477.44751" 
+    .const 'Sub' $P236 = "58_1284728478.15265" 
     capture_lex $P236
-    .const 'Sub' $P231 = "56_1280467477.44751" 
+    .const 'Sub' $P231 = "56_1284728478.15265" 
     capture_lex $P231
-    .const 'Sub' $P222 = "52_1280467477.44751" 
+    .const 'Sub' $P222 = "52_1284728478.15265" 
     capture_lex $P222
-    .const 'Sub' $P217 = "50_1280467477.44751" 
+    .const 'Sub' $P217 = "50_1284728478.15265" 
     capture_lex $P217
-    .const 'Sub' $P212 = "48_1280467477.44751" 
+    .const 'Sub' $P212 = "48_1284728478.15265" 
     capture_lex $P212
-    .const 'Sub' $P203 = "46_1280467477.44751" 
+    .const 'Sub' $P203 = "46_1284728478.15265" 
     capture_lex $P203
-    .const 'Sub' $P196 = "44_1280467477.44751" 
+    .const 'Sub' $P196 = "44_1284728478.15265" 
     capture_lex $P196
-    .const 'Sub' $P190 = "42_1280467477.44751" 
+    .const 'Sub' $P190 = "42_1284728478.15265" 
     capture_lex $P190
-    .const 'Sub' $P182 = "40_1280467477.44751" 
+    .const 'Sub' $P182 = "40_1284728478.15265" 
     capture_lex $P182
-    .const 'Sub' $P176 = "38_1280467477.44751" 
+    .const 'Sub' $P176 = "38_1284728478.15265" 
     capture_lex $P176
-    .const 'Sub' $P170 = "36_1280467477.44751" 
+    .const 'Sub' $P170 = "36_1284728478.15265" 
     capture_lex $P170
-    .const 'Sub' $P155 = "33_1280467477.44751" 
+    .const 'Sub' $P155 = "33_1284728478.15265" 
     capture_lex $P155
-    .const 'Sub' $P141 = "31_1280467477.44751" 
+    .const 'Sub' $P141 = "31_1284728478.15265" 
     capture_lex $P141
-    .const 'Sub' $P134 = "29_1280467477.44751" 
+    .const 'Sub' $P134 = "29_1284728478.15265" 
     capture_lex $P134
-    .const 'Sub' $P95 = "26_1280467477.44751" 
+    .const 'Sub' $P95 = "26_1284728478.15265" 
     capture_lex $P95
-    .const 'Sub' $P80 = "23_1280467477.44751" 
+    .const 'Sub' $P80 = "23_1284728478.15265" 
     capture_lex $P80
-    .const 'Sub' $P69 = "21_1280467477.44751" 
+    .const 'Sub' $P69 = "21_1284728478.15265" 
     capture_lex $P69
-    .const 'Sub' $P57 = "19_1280467477.44751" 
+    .const 'Sub' $P57 = "19_1284728478.15265" 
     capture_lex $P57
-    .const 'Sub' $P49 = "17_1280467477.44751" 
+    .const 'Sub' $P49 = "17_1284728478.15265" 
     capture_lex $P49
-    .const 'Sub' $P42 = "15_1280467477.44751" 
+    .const 'Sub' $P42 = "15_1284728478.15265" 
     capture_lex $P42
-    .const 'Sub' $P35 = "13_1280467477.44751" 
+    .const 'Sub' $P35 = "13_1284728478.15265" 
     capture_lex $P35
-    .const 'Sub' $P15 = "12_1280467477.44751" 
+    .const 'Sub' $P15 = "12_1284728478.15265" 
     capture_lex $P15
     $P0 = find_dynamic_lex "$*CTXSAVE"
     if null $P0 goto ctxsave_done
@@ -371,77 +375,77 @@
     unless $I0 goto ctxsave_done
     $P0."ctxsave"()
   ctxsave_done:
-.annotate 'line', 567
-    get_hll_global $P1340, ["NQP";"Regex"], "_block1339" 
-    capture_lex $P1340
-    $P1402 = $P1340()
+.annotate 'line', 574
+    get_hll_global $P1369, ["NQP";"Regex"], "_block1368" 
+    capture_lex $P1369
+    $P1431 = $P1369()
 .annotate 'line', 4
-    .return ($P1402)
-    .const 'Sub' $P1404 = "370_1280467477.44751" 
-    .return ($P1404)
+    .return ($P1431)
+    .const 'Sub' $P1433 = "376_1284728478.15265" 
+    .return ($P1433)
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "" :load :init :subid("post373") :outer("11_1280467477.44751")
+.sub "" :load :init :subid("post379") :outer("11_1284728478.15265")
 .annotate 'line', 4
     get_hll_global $P14, ["NQP";"Grammar"], "_block13" 
     .local pmc block
     set block, $P14
-.annotate 'line', 448
-    get_hll_global $P1407, ["NQP"], "Grammar"
-    $P1407."O"(":prec<y=>, :assoc<unary>", "%methodop")
-.annotate 'line', 449
-    get_hll_global $P1408, ["NQP"], "Grammar"
-    $P1408."O"(":prec<x=>, :assoc<unary>", "%autoincrement")
-.annotate 'line', 450
-    get_hll_global $P1409, ["NQP"], "Grammar"
-    $P1409."O"(":prec<w=>, :assoc<left>", "%exponentiation")
-.annotate 'line', 451
-    get_hll_global $P1410, ["NQP"], "Grammar"
-    $P1410."O"(":prec<v=>, :assoc<unary>", "%symbolic_unary")
-.annotate 'line', 452
-    get_hll_global $P1411, ["NQP"], "Grammar"
-    $P1411."O"(":prec<u=>, :assoc<left>", "%multiplicative")
-.annotate 'line', 453
-    get_hll_global $P1412, ["NQP"], "Grammar"
-    $P1412."O"(":prec<t=>, :assoc<left>", "%additive")
-.annotate 'line', 454
-    get_hll_global $P1413, ["NQP"], "Grammar"
-    $P1413."O"(":prec<r=>, :assoc<left>", "%concatenation")
 .annotate 'line', 455
-    get_hll_global $P1414, ["NQP"], "Grammar"
-    $P1414."O"(":prec<m=>, :assoc<left>", "%relational")
+    get_hll_global $P1436, ["NQP"], "Grammar"
+    $P1436."O"(":prec<y=>, :assoc<unary>", "%methodop")
 .annotate 'line', 456
-    get_hll_global $P1415, ["NQP"], "Grammar"
-    $P1415."O"(":prec<l=>, :assoc<left>", "%tight_and")
+    get_hll_global $P1437, ["NQP"], "Grammar"
+    $P1437."O"(":prec<x=>, :assoc<unary>", "%autoincrement")
 .annotate 'line', 457
-    get_hll_global $P1416, ["NQP"], "Grammar"
-    $P1416."O"(":prec<k=>, :assoc<left>", "%tight_or")
+    get_hll_global $P1438, ["NQP"], "Grammar"
+    $P1438."O"(":prec<w=>, :assoc<left>", "%exponentiation")
 .annotate 'line', 458
-    get_hll_global $P1417, ["NQP"], "Grammar"
-    $P1417."O"(":prec<j=>, :assoc<right>", "%conditional")
+    get_hll_global $P1439, ["NQP"], "Grammar"
+    $P1439."O"(":prec<v=>, :assoc<unary>", "%symbolic_unary")
 .annotate 'line', 459
-    get_hll_global $P1418, ["NQP"], "Grammar"
-    $P1418."O"(":prec<i=>, :assoc<right>", "%assignment")
+    get_hll_global $P1440, ["NQP"], "Grammar"
+    $P1440."O"(":prec<u=>, :assoc<left>", "%multiplicative")
 .annotate 'line', 460
-    get_hll_global $P1419, ["NQP"], "Grammar"
-    $P1419."O"(":prec<g=>, :assoc<list>, :nextterm<nulltermish>", "%comma")
+    get_hll_global $P1441, ["NQP"], "Grammar"
+    $P1441."O"(":prec<t=>, :assoc<left>", "%additive")
 .annotate 'line', 461
-    get_hll_global $P1420, ["NQP"], "Grammar"
-    $P1420."O"(":prec<f=>, :assoc<list>", "%list_infix")
+    get_hll_global $P1442, ["NQP"], "Grammar"
+    $P1442."O"(":prec<r=>, :assoc<left>", "%concatenation")
 .annotate 'line', 462
-    get_hll_global $P1421, ["NQP"], "Grammar"
-    $P1421."O"(":prec<e=>, :assoc<unary>", "%list_prefix")
-.annotate 'line', 447
-    $P1422 = get_root_global ["parrot"], "P6metaclass"
-    $P1422."new_class"("NQP::Regex", "Regex::P6Regex::Grammar" :named("parent"))
+    get_hll_global $P1443, ["NQP"], "Grammar"
+    $P1443."O"(":prec<m=>, :assoc<left>", "%relational")
+.annotate 'line', 463
+    get_hll_global $P1444, ["NQP"], "Grammar"
+    $P1444."O"(":prec<l=>, :assoc<left>", "%tight_and")
+.annotate 'line', 464
+    get_hll_global $P1445, ["NQP"], "Grammar"
+    $P1445."O"(":prec<k=>, :assoc<left>", "%tight_or")
+.annotate 'line', 465
+    get_hll_global $P1446, ["NQP"], "Grammar"
+    $P1446."O"(":prec<j=>, :assoc<right>", "%conditional")
+.annotate 'line', 466
+    get_hll_global $P1447, ["NQP"], "Grammar"
+    $P1447."O"(":prec<i=>, :assoc<right>", "%assignment")
+.annotate 'line', 467
+    get_hll_global $P1448, ["NQP"], "Grammar"
+    $P1448."O"(":prec<g=>, :assoc<list>, :nextterm<nulltermish>", "%comma")
+.annotate 'line', 468
+    get_hll_global $P1449, ["NQP"], "Grammar"
+    $P1449."O"(":prec<f=>, :assoc<list>", "%list_infix")
+.annotate 'line', 469
+    get_hll_global $P1450, ["NQP"], "Grammar"
+    $P1450."O"(":prec<e=>, :assoc<unary>", "%list_prefix")
+.annotate 'line', 454
+    $P1451 = get_root_global ["parrot"], "P6metaclass"
+    $P1451."new_class"("NQP::Regex", "Regex::P6Regex::Grammar" :named("parent"))
 .end
 
 
 .namespace ["NQP";"Grammar"]
 .include "except_types.pasm"
-.sub "TOP"  :subid("12_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "TOP"  :subid("12_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     new $P17, 'ExceptionHandler'
     set_addr $P17, control_16
@@ -459,55 +463,55 @@
     .lex "$*MULTINESS", $P20
 .annotate 'line', 4
     find_lex $P21, "%*LANG"
-    unless_null $P21, vivify_374
+    unless_null $P21, vivify_380
     get_hll_global $P21, "%LANG"
-    unless_null $P21, vivify_375
+    unless_null $P21, vivify_381
     die "Contextual %*LANG not found"
-  vivify_375:
-  vivify_374:
+  vivify_381:
+  vivify_380:
 .annotate 'line', 6
     get_hll_global $P22, ["NQP"], "Regex"
     find_lex $P23, "%*LANG"
-    unless_null $P23, vivify_376
+    unless_null $P23, vivify_382
     get_hll_global $P23, "%LANG"
-    unless_null $P23, vivify_377
+    unless_null $P23, vivify_383
     die "Contextual %*LANG not found"
-  vivify_377:
+  vivify_383:
     store_lex "%*LANG", $P23
-  vivify_376:
+  vivify_382:
     set $P23["Regex"], $P22
 .annotate 'line', 7
     get_hll_global $P24, ["NQP"], "RegexActions"
     find_lex $P25, "%*LANG"
-    unless_null $P25, vivify_378
+    unless_null $P25, vivify_384
     get_hll_global $P25, "%LANG"
-    unless_null $P25, vivify_379
+    unless_null $P25, vivify_385
     die "Contextual %*LANG not found"
-  vivify_379:
+  vivify_385:
     store_lex "%*LANG", $P25
-  vivify_378:
+  vivify_384:
     set $P25["Regex-actions"], $P24
 .annotate 'line', 8
     get_hll_global $P26, ["NQP"], "Grammar"
     find_lex $P27, "%*LANG"
-    unless_null $P27, vivify_380
+    unless_null $P27, vivify_386
     get_hll_global $P27, "%LANG"
-    unless_null $P27, vivify_381
+    unless_null $P27, vivify_387
     die "Contextual %*LANG not found"
-  vivify_381:
+  vivify_387:
     store_lex "%*LANG", $P27
-  vivify_380:
+  vivify_386:
     set $P27["MAIN"], $P26
 .annotate 'line', 9
     get_hll_global $P28, ["NQP"], "Actions"
     find_lex $P29, "%*LANG"
-    unless_null $P29, vivify_382
+    unless_null $P29, vivify_388
     get_hll_global $P29, "%LANG"
-    unless_null $P29, vivify_383
+    unless_null $P29, vivify_389
     die "Contextual %*LANG not found"
-  vivify_383:
+  vivify_389:
     store_lex "%*LANG", $P29
-  vivify_382:
+  vivify_388:
     set $P29["MAIN-actions"], $P28
 .annotate 'line', 10
     new $P30, "String"
@@ -531,7 +535,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "identifier"  :subid("13_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "identifier"  :subid("13_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx36_tgt
     .local int rx36_pos
@@ -539,7 +543,9 @@
     .local int rx36_eos
     .local int rx36_rep
     .local pmc rx36_cur
+    .local pmc rx36_debug
     (rx36_cur, rx36_pos, rx36_tgt, $I10) = self."!cursor_start"()
+    getattribute rx36_debug, rx36_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx36_cur
     .local pmc match
     .lex "$/", match
@@ -551,7 +557,9 @@
     substr rx36_tgt, rx36_tgt, rx36_off
   rx36_start:
     eq $I10, 1, rx36_restart
-    rx36_cur."!cursor_debug"("START ", "identifier")
+    if_null rx36_debug, debug_390
+    rx36_cur."!cursor_debug"("START", "identifier")
+  debug_390:
     $I10 = self.'from'()
     ne $I10, -1, rxscan40_done
     goto rxscan40_scan
@@ -594,11 +602,15 @@
   rxquantr41_done:
   # rx pass
     rx36_cur."!cursor_pass"(rx36_pos, "identifier")
-    rx36_cur."!cursor_debug"("PASS  ", "identifier", " at pos=", rx36_pos)
+    if_null rx36_debug, debug_391
+    rx36_cur."!cursor_debug"("PASS", "identifier", " at pos=", rx36_pos)
+  debug_391:
     .return (rx36_cur)
   rx36_restart:
 .annotate 'line', 4
-    rx36_cur."!cursor_debug"("NEXT ", "identifier")
+    if_null rx36_debug, debug_392
+    rx36_cur."!cursor_debug"("NEXT", "identifier")
+  debug_392:
   rx36_fail:
     (rx36_rep, rx36_pos, $I10, $P10) = rx36_cur."!mark_fail"(0)
     lt rx36_pos, -1, rx36_done
@@ -606,14 +618,16 @@
     jump $I10
   rx36_done:
     rx36_cur."!cursor_fail"()
-    rx36_cur."!cursor_debug"("FAIL  ", "identifier")
+    if_null rx36_debug, debug_393
+    rx36_cur."!cursor_debug"("FAIL", "identifier")
+  debug_393:
     .return (rx36_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__identifier"  :subid("14_1280467477.44751") :method
+.sub "!PREFIX__identifier"  :subid("14_1284728478.15265") :method
 .annotate 'line', 4
     $P38 = self."!PREFIX__!subrule"("ident", "")
     new $P39, "ResizablePMCArray"
@@ -623,7 +637,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "name"  :subid("15_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "name"  :subid("15_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx43_tgt
     .local int rx43_pos
@@ -631,8 +645,10 @@
     .local int rx43_eos
     .local int rx43_rep
     .local pmc rx43_cur
+    .local pmc rx43_debug
     (rx43_cur, rx43_pos, rx43_tgt, $I10) = self."!cursor_start"()
     rx43_cur."!cursor_caparray"("identifier")
+    getattribute rx43_debug, rx43_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx43_cur
     .local pmc match
     .lex "$/", match
@@ -644,7 +660,9 @@
     substr rx43_tgt, rx43_tgt, rx43_off
   rx43_start:
     eq $I10, 1, rx43_restart
-    rx43_cur."!cursor_debug"("START ", "name")
+    if_null rx43_debug, debug_394
+    rx43_cur."!cursor_debug"("START", "name")
+  debug_394:
     $I10 = self.'from'()
     ne $I10, -1, rxscan46_done
     goto rxscan46_scan
@@ -690,11 +708,15 @@
   rxquantr47_done:
   # rx pass
     rx43_cur."!cursor_pass"(rx43_pos, "name")
-    rx43_cur."!cursor_debug"("PASS  ", "name", " at pos=", rx43_pos)
+    if_null rx43_debug, debug_395
+    rx43_cur."!cursor_debug"("PASS", "name", " at pos=", rx43_pos)
+  debug_395:
     .return (rx43_cur)
   rx43_restart:
 .annotate 'line', 4
-    rx43_cur."!cursor_debug"("NEXT ", "name")
+    if_null rx43_debug, debug_396
+    rx43_cur."!cursor_debug"("NEXT", "name")
+  debug_396:
   rx43_fail:
     (rx43_rep, rx43_pos, $I10, $P10) = rx43_cur."!mark_fail"(0)
     lt rx43_pos, -1, rx43_done
@@ -702,14 +724,16 @@
     jump $I10
   rx43_done:
     rx43_cur."!cursor_fail"()
-    rx43_cur."!cursor_debug"("FAIL  ", "name")
+    if_null rx43_debug, debug_397
+    rx43_cur."!cursor_debug"("FAIL", "name")
+  debug_397:
     .return (rx43_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__name"  :subid("16_1280467477.44751") :method
+.sub "!PREFIX__name"  :subid("16_1284728478.15265") :method
 .annotate 'line', 4
     new $P45, "ResizablePMCArray"
     push $P45, ""
@@ -718,7 +742,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "deflongname"  :subid("17_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "deflongname"  :subid("17_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx50_tgt
     .local int rx50_pos
@@ -726,8 +750,10 @@
     .local int rx50_eos
     .local int rx50_rep
     .local pmc rx50_cur
+    .local pmc rx50_debug
     (rx50_cur, rx50_pos, rx50_tgt, $I10) = self."!cursor_start"()
     rx50_cur."!cursor_caparray"("colonpair")
+    getattribute rx50_debug, rx50_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx50_cur
     .local pmc match
     .lex "$/", match
@@ -739,7 +765,9 @@
     substr rx50_tgt, rx50_tgt, rx50_off
   rx50_start:
     eq $I10, 1, rx50_restart
-    rx50_cur."!cursor_debug"("START ", "deflongname")
+    if_null rx50_debug, debug_398
+    rx50_cur."!cursor_debug"("START", "deflongname")
+  debug_398:
     $I10 = self.'from'()
     ne $I10, -1, rxscan54_done
     goto rxscan54_scan
@@ -783,11 +811,15 @@
 .annotate 'line', 21
   # rx pass
     rx50_cur."!cursor_pass"(rx50_pos, "deflongname")
-    rx50_cur."!cursor_debug"("PASS  ", "deflongname", " at pos=", rx50_pos)
+    if_null rx50_debug, debug_399
+    rx50_cur."!cursor_debug"("PASS", "deflongname", " at pos=", rx50_pos)
+  debug_399:
     .return (rx50_cur)
   rx50_restart:
 .annotate 'line', 4
-    rx50_cur."!cursor_debug"("NEXT ", "deflongname")
+    if_null rx50_debug, debug_400
+    rx50_cur."!cursor_debug"("NEXT", "deflongname")
+  debug_400:
   rx50_fail:
     (rx50_rep, rx50_pos, $I10, $P10) = rx50_cur."!mark_fail"(0)
     lt rx50_pos, -1, rx50_done
@@ -795,14 +827,16 @@
     jump $I10
   rx50_done:
     rx50_cur."!cursor_fail"()
-    rx50_cur."!cursor_debug"("FAIL  ", "deflongname")
+    if_null rx50_debug, debug_401
+    rx50_cur."!cursor_debug"("FAIL", "deflongname")
+  debug_401:
     .return (rx50_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__deflongname"  :subid("18_1280467477.44751") :method
+.sub "!PREFIX__deflongname"  :subid("18_1284728478.15265") :method
 .annotate 'line', 4
     $P52 = self."!PREFIX__!subrule"("identifier", "")
     new $P53, "ResizablePMCArray"
@@ -812,7 +846,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "ENDSTMT"  :subid("19_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "ENDSTMT"  :subid("19_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx58_tgt
     .local int rx58_pos
@@ -820,7 +854,9 @@
     .local int rx58_eos
     .local int rx58_rep
     .local pmc rx58_cur
+    .local pmc rx58_debug
     (rx58_cur, rx58_pos, rx58_tgt, $I10) = self."!cursor_start"()
+    getattribute rx58_debug, rx58_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx58_cur
     .local pmc match
     .lex "$/", match
@@ -832,7 +868,9 @@
     substr rx58_tgt, rx58_tgt, rx58_off
   rx58_start:
     eq $I10, 1, rx58_restart
-    rx58_cur."!cursor_debug"("START ", "ENDSTMT")
+    if_null rx58_debug, debug_402
+    rx58_cur."!cursor_debug"("START", "ENDSTMT")
+  debug_402:
     $I10 = self.'from'()
     ne $I10, -1, rxscan61_done
     goto rxscan61_scan
@@ -855,23 +893,21 @@
     set_addr $I10, alt63_1
     rx58_cur."!mark_push"(0, rx58_pos, $I10)
 .annotate 'line', 27
-  # rx rxquantr64 ** 0..*
-    set_addr $I10, rxquantr64_done
-    rx58_cur."!mark_push"(0, rx58_pos, $I10)
-  rxquantr64_loop:
-  # rx enumcharlist negate=0 
-    ge rx58_pos, rx58_eos, rx58_fail
+  # rx enumcharlist_q negate=0  r 0..-1
     sub $I10, rx58_pos, rx58_off
+    set rx58_rep, 0
+    sub $I12, rx58_eos, rx58_pos
+  rxenumcharlistq64_loop:
+    le $I12, 0, rxenumcharlistq64_done
     substr $S10, rx58_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx58_fail
-    inc rx58_pos
-    set_addr $I10, rxquantr64_done
-    (rx58_rep) = rx58_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr64_done
-    rx58_cur."!mark_push"(rx58_rep, rx58_pos, $I10)
-    goto rxquantr64_loop
-  rxquantr64_done:
+    lt $I11, 0, rxenumcharlistq64_done
+    inc rx58_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq64_loop
+  rxenumcharlistq64_done:
+    add rx58_pos, rx58_pos, rx58_rep
   # rxanchor eol
     sub $I10, rx58_pos, rx58_off
     is_cclass $I11, 4096, rx58_tgt, $I10
@@ -940,11 +976,15 @@
 .annotate 'line', 25
   # rx pass
     rx58_cur."!cursor_pass"(rx58_pos, "ENDSTMT")
-    rx58_cur."!cursor_debug"("PASS  ", "ENDSTMT", " at pos=", rx58_pos)
+    if_null rx58_debug, debug_403
+    rx58_cur."!cursor_debug"("PASS", "ENDSTMT", " at pos=", rx58_pos)
+  debug_403:
     .return (rx58_cur)
   rx58_restart:
 .annotate 'line', 4
-    rx58_cur."!cursor_debug"("NEXT ", "ENDSTMT")
+    if_null rx58_debug, debug_404
+    rx58_cur."!cursor_debug"("NEXT", "ENDSTMT")
+  debug_404:
   rx58_fail:
     (rx58_rep, rx58_pos, $I10, $P10) = rx58_cur."!mark_fail"(0)
     lt rx58_pos, -1, rx58_done
@@ -952,14 +992,16 @@
     jump $I10
   rx58_done:
     rx58_cur."!cursor_fail"()
-    rx58_cur."!cursor_debug"("FAIL  ", "ENDSTMT")
+    if_null rx58_debug, debug_405
+    rx58_cur."!cursor_debug"("FAIL", "ENDSTMT")
+  debug_405:
     .return (rx58_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__ENDSTMT"  :subid("20_1280467477.44751") :method
+.sub "!PREFIX__ENDSTMT"  :subid("20_1284728478.15265") :method
 .annotate 'line', 4
     new $P60, "ResizablePMCArray"
     push $P60, ""
@@ -968,7 +1010,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "ws"  :subid("21_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "ws"  :subid("21_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx70_tgt
     .local int rx70_pos
@@ -976,7 +1018,9 @@
     .local int rx70_eos
     .local int rx70_rep
     .local pmc rx70_cur
+    .local pmc rx70_debug
     (rx70_cur, rx70_pos, rx70_tgt, $I10) = self."!cursor_start"()
+    getattribute rx70_debug, rx70_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx70_cur
     .local pmc match
     .lex "$/", match
@@ -988,7 +1032,9 @@
     substr rx70_tgt, rx70_tgt, rx70_off
   rx70_start:
     eq $I10, 1, rx70_restart
-    rx70_cur."!cursor_debug"("START ", "ws")
+    if_null rx70_debug, debug_406
+    rx70_cur."!cursor_debug"("START", "ws")
+  debug_406:
     $I10 = self.'from'()
     ne $I10, -1, rxscan73_done
     goto rxscan73_scan
@@ -1026,23 +1072,22 @@
 .annotate 'line', 35
     set_addr $I10, alt76_1
     rx70_cur."!mark_push"(0, rx70_pos, $I10)
-  # rx rxquantr77 ** 1..*
-    set_addr $I10, rxquantr77_done
-    rx70_cur."!mark_push"(0, -1, $I10)
-  rxquantr77_loop:
-  # rx enumcharlist negate=0 
-    ge rx70_pos, rx70_eos, rx70_fail
+  # rx enumcharlist_q negate=0  r 1..-1
     sub $I10, rx70_pos, rx70_off
+    set rx70_rep, 0
+    sub $I12, rx70_eos, rx70_pos
+  rxenumcharlistq77_loop:
+    le $I12, 0, rxenumcharlistq77_done
     substr $S10, rx70_tgt, $I10, 1
     index $I11, unicode:"\n\x{b}\f\r\x{85}\u2028\u2029", $S10
-    lt $I11, 0, rx70_fail
-    inc rx70_pos
-    set_addr $I10, rxquantr77_done
-    (rx70_rep) = rx70_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr77_done
-    rx70_cur."!mark_push"(rx70_rep, rx70_pos, $I10)
-    goto rxquantr77_loop
-  rxquantr77_done:
+    lt $I11, 0, rxenumcharlistq77_done
+    inc rx70_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq77_loop
+  rxenumcharlistq77_done:
+    lt rx70_rep, 1, rx70_fail
+    add rx70_pos, rx70_pos, rx70_rep
     goto alt76_end
   alt76_1:
     set_addr $I10, alt76_2
@@ -1052,8 +1097,8 @@
     add $I11, rx70_pos, 1
     gt $I11, rx70_eos, rx70_fail
     sub $I11, rx70_pos, rx70_off
-    substr $S10, rx70_tgt, $I11, 1
-    ne $S10, "#", rx70_fail
+    ord $I11, rx70_tgt, $I11
+    ne $I11, 35, rx70_fail
     add rx70_pos, 1
   # rx charclass_q N r 0..-1
     sub $I10, rx70_pos, rx70_off
@@ -1080,23 +1125,22 @@
     goto alt76_end
   alt76_3:
 .annotate 'line', 38
-  # rx rxquantr79 ** 1..*
-    set_addr $I10, rxquantr79_done
-    rx70_cur."!mark_push"(0, -1, $I10)
-  rxquantr79_loop:
-  # rx enumcharlist negate=0 
-    ge rx70_pos, rx70_eos, rx70_fail
+  # rx enumcharlist_q negate=0  r 1..-1
     sub $I10, rx70_pos, rx70_off
+    set rx70_rep, 0
+    sub $I12, rx70_eos, rx70_pos
+  rxenumcharlistq79_loop:
+    le $I12, 0, rxenumcharlistq79_done
     substr $S10, rx70_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx70_fail
-    inc rx70_pos
-    set_addr $I10, rxquantr79_done
-    (rx70_rep) = rx70_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr79_done
-    rx70_cur."!mark_push"(rx70_rep, rx70_pos, $I10)
-    goto rxquantr79_loop
-  rxquantr79_done:
+    lt $I11, 0, rxenumcharlistq79_done
+    inc rx70_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq79_loop
+  rxenumcharlistq79_done:
+    lt rx70_rep, 1, rx70_fail
+    add rx70_pos, rx70_pos, rx70_rep
   alt76_end:
 .annotate 'line', 39
     set_addr $I10, rxquantr75_done
@@ -1114,11 +1158,15 @@
 .annotate 'line', 32
   # rx pass
     rx70_cur."!cursor_pass"(rx70_pos, "ws")
-    rx70_cur."!cursor_debug"("PASS  ", "ws", " at pos=", rx70_pos)
+    if_null rx70_debug, debug_407
+    rx70_cur."!cursor_debug"("PASS", "ws", " at pos=", rx70_pos)
+  debug_407:
     .return (rx70_cur)
   rx70_restart:
 .annotate 'line', 4
-    rx70_cur."!cursor_debug"("NEXT ", "ws")
+    if_null rx70_debug, debug_408
+    rx70_cur."!cursor_debug"("NEXT", "ws")
+  debug_408:
   rx70_fail:
     (rx70_rep, rx70_pos, $I10, $P10) = rx70_cur."!mark_fail"(0)
     lt rx70_pos, -1, rx70_done
@@ -1126,14 +1174,16 @@
     jump $I10
   rx70_done:
     rx70_cur."!cursor_fail"()
-    rx70_cur."!cursor_debug"("FAIL  ", "ws")
+    if_null rx70_debug, debug_409
+    rx70_cur."!cursor_debug"("FAIL", "ws")
+  debug_409:
     .return (rx70_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__ws"  :subid("22_1280467477.44751") :method
+.sub "!PREFIX__ws"  :subid("22_1284728478.15265") :method
 .annotate 'line', 4
     new $P72, "ResizablePMCArray"
     push $P72, ""
@@ -1143,9 +1193,9 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "unv"  :subid("23_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "unv"  :subid("23_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
-    .const 'Sub' $P88 = "25_1280467477.44751" 
+    .const 'Sub' $P88 = "25_1284728478.15265" 
     capture_lex $P88
     .local string rx81_tgt
     .local int rx81_pos
@@ -1153,7 +1203,9 @@
     .local int rx81_eos
     .local int rx81_rep
     .local pmc rx81_cur
+    .local pmc rx81_debug
     (rx81_cur, rx81_pos, rx81_tgt, $I10) = self."!cursor_start"()
+    getattribute rx81_debug, rx81_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx81_cur
     .local pmc match
     .lex "$/", match
@@ -1165,7 +1217,9 @@
     substr rx81_tgt, rx81_tgt, rx81_off
   rx81_start:
     eq $I10, 1, rx81_restart
-    rx81_cur."!cursor_debug"("START ", "unv")
+    if_null rx81_debug, debug_410
+    rx81_cur."!cursor_debug"("START", "unv")
+  debug_410:
     $I10 = self.'from'()
     ne $I10, -1, rxscan84_done
     goto rxscan84_scan
@@ -1193,7 +1247,7 @@
   rxanchor86_done:
   # rx subrule "before" subtype=zerowidth negate=
     rx81_cur."!cursor_pos"(rx81_pos)
-    .const 'Sub' $P88 = "25_1280467477.44751" 
+    .const 'Sub' $P88 = "25_1284728478.15265" 
     capture_lex $P88
     $P10 = rx81_cur."before"($P88)
     unless $P10, rx81_fail
@@ -1207,29 +1261,27 @@
     set_addr $I10, alt85_2
     rx81_cur."!mark_push"(0, rx81_pos, $I10)
 .annotate 'line', 47
-  # rx rxquantr93 ** 0..*
-    set_addr $I10, rxquantr93_done
-    rx81_cur."!mark_push"(0, rx81_pos, $I10)
-  rxquantr93_loop:
-  # rx enumcharlist negate=0 
-    ge rx81_pos, rx81_eos, rx81_fail
+  # rx enumcharlist_q negate=0  r 0..-1
     sub $I10, rx81_pos, rx81_off
+    set rx81_rep, 0
+    sub $I12, rx81_eos, rx81_pos
+  rxenumcharlistq93_loop:
+    le $I12, 0, rxenumcharlistq93_done
     substr $S10, rx81_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx81_fail
-    inc rx81_pos
-    set_addr $I10, rxquantr93_done
-    (rx81_rep) = rx81_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr93_done
-    rx81_cur."!mark_push"(rx81_rep, rx81_pos, $I10)
-    goto rxquantr93_loop
-  rxquantr93_done:
+    lt $I11, 0, rxenumcharlistq93_done
+    inc rx81_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq93_loop
+  rxenumcharlistq93_done:
+    add rx81_pos, rx81_pos, rx81_rep
   # rx literal  "#"
     add $I11, rx81_pos, 1
     gt $I11, rx81_eos, rx81_fail
     sub $I11, rx81_pos, rx81_off
-    substr $S10, rx81_tgt, $I11, 1
-    ne $S10, "#", rx81_fail
+    ord $I11, rx81_tgt, $I11
+    ne $I11, 35, rx81_fail
     add rx81_pos, 1
   # rx charclass_q N r 0..-1
     sub $I10, rx81_pos, rx81_off
@@ -1238,32 +1290,35 @@
     goto alt85_end
   alt85_2:
 .annotate 'line', 48
-  # rx rxquantr94 ** 1..*
-    set_addr $I10, rxquantr94_done
-    rx81_cur."!mark_push"(0, -1, $I10)
-  rxquantr94_loop:
-  # rx enumcharlist negate=0 
-    ge rx81_pos, rx81_eos, rx81_fail
+  # rx enumcharlist_q negate=0  r 1..-1
     sub $I10, rx81_pos, rx81_off
+    set rx81_rep, 0
+    sub $I12, rx81_eos, rx81_pos
+  rxenumcharlistq94_loop:
+    le $I12, 0, rxenumcharlistq94_done
     substr $S10, rx81_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx81_fail
-    inc rx81_pos
-    set_addr $I10, rxquantr94_done
-    (rx81_rep) = rx81_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr94_done
-    rx81_cur."!mark_push"(rx81_rep, rx81_pos, $I10)
-    goto rxquantr94_loop
-  rxquantr94_done:
+    lt $I11, 0, rxenumcharlistq94_done
+    inc rx81_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq94_loop
+  rxenumcharlistq94_done:
+    lt rx81_rep, 1, rx81_fail
+    add rx81_pos, rx81_pos, rx81_rep
   alt85_end:
 .annotate 'line', 43
   # rx pass
     rx81_cur."!cursor_pass"(rx81_pos, "unv")
-    rx81_cur."!cursor_debug"("PASS  ", "unv", " at pos=", rx81_pos)
+    if_null rx81_debug, debug_415
+    rx81_cur."!cursor_debug"("PASS", "unv", " at pos=", rx81_pos)
+  debug_415:
     .return (rx81_cur)
   rx81_restart:
 .annotate 'line', 4
-    rx81_cur."!cursor_debug"("NEXT ", "unv")
+    if_null rx81_debug, debug_416
+    rx81_cur."!cursor_debug"("NEXT", "unv")
+  debug_416:
   rx81_fail:
     (rx81_rep, rx81_pos, $I10, $P10) = rx81_cur."!mark_fail"(0)
     lt rx81_pos, -1, rx81_done
@@ -1271,14 +1326,16 @@
     jump $I10
   rx81_done:
     rx81_cur."!cursor_fail"()
-    rx81_cur."!cursor_debug"("FAIL  ", "unv")
+    if_null rx81_debug, debug_417
+    rx81_cur."!cursor_debug"("FAIL", "unv")
+  debug_417:
     .return (rx81_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__unv"  :subid("24_1280467477.44751") :method
+.sub "!PREFIX__unv"  :subid("24_1284728478.15265") :method
 .annotate 'line', 4
     new $P83, "ResizablePMCArray"
     push $P83, ""
@@ -1289,7 +1346,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "_block87"  :anon :subid("25_1280467477.44751") :method :outer("23_1280467477.44751")
+.sub "_block87"  :anon :subid("25_1284728478.15265") :method :outer("23_1284728478.15265")
 .annotate 'line', 46
     .local string rx89_tgt
     .local int rx89_pos
@@ -1297,7 +1354,9 @@
     .local int rx89_eos
     .local int rx89_rep
     .local pmc rx89_cur
+    .local pmc rx89_debug
     (rx89_cur, rx89_pos, rx89_tgt, $I10) = self."!cursor_start"()
+    getattribute rx89_debug, rx89_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx89_cur
     .local pmc match
     .lex "$/", match
@@ -1309,7 +1368,9 @@
     substr rx89_tgt, rx89_tgt, rx89_off
   rx89_start:
     eq $I10, 1, rx89_restart
-    rx89_cur."!cursor_debug"("START ", "")
+    if_null rx89_debug, debug_411
+    rx89_cur."!cursor_debug"("START", "")
+  debug_411:
     $I10 = self.'from'()
     ne $I10, -1, rxscan90_done
     goto rxscan90_scan
@@ -1322,29 +1383,27 @@
     set_addr $I10, rxscan90_loop
     rx89_cur."!mark_push"(0, rx89_pos, $I10)
   rxscan90_done:
-  # rx rxquantr91 ** 0..*
-    set_addr $I10, rxquantr91_done
-    rx89_cur."!mark_push"(0, rx89_pos, $I10)
-  rxquantr91_loop:
-  # rx enumcharlist negate=0 
-    ge rx89_pos, rx89_eos, rx89_fail
+  # rx enumcharlist_q negate=0  r 0..-1
     sub $I10, rx89_pos, rx89_off
+    set rx89_rep, 0
+    sub $I12, rx89_eos, rx89_pos
+  rxenumcharlistq91_loop:
+    le $I12, 0, rxenumcharlistq91_done
     substr $S10, rx89_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx89_fail
-    inc rx89_pos
-    set_addr $I10, rxquantr91_done
-    (rx89_rep) = rx89_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr91_done
-    rx89_cur."!mark_push"(rx89_rep, rx89_pos, $I10)
-    goto rxquantr91_loop
-  rxquantr91_done:
+    lt $I11, 0, rxenumcharlistq91_done
+    inc rx89_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq91_loop
+  rxenumcharlistq91_done:
+    add rx89_pos, rx89_pos, rx89_rep
   # rx literal  "="
     add $I11, rx89_pos, 1
     gt $I11, rx89_eos, rx89_fail
     sub $I11, rx89_pos, rx89_off
-    substr $S10, rx89_tgt, $I11, 1
-    ne $S10, "=", rx89_fail
+    ord $I11, rx89_tgt, $I11
+    ne $I11, 61, rx89_fail
     add rx89_pos, 1
   alt92_0:
     set_addr $I10, alt92_1
@@ -1361,16 +1420,20 @@
     add $I11, rx89_pos, 1
     gt $I11, rx89_eos, rx89_fail
     sub $I11, rx89_pos, rx89_off
-    substr $S10, rx89_tgt, $I11, 1
-    ne $S10, "\\", rx89_fail
+    ord $I11, rx89_tgt, $I11
+    ne $I11, 92, rx89_fail
     add rx89_pos, 1
   alt92_end:
   # rx pass
     rx89_cur."!cursor_pass"(rx89_pos, "")
-    rx89_cur."!cursor_debug"("PASS  ", "", " at pos=", rx89_pos)
+    if_null rx89_debug, debug_412
+    rx89_cur."!cursor_debug"("PASS", "", " at pos=", rx89_pos)
+  debug_412:
     .return (rx89_cur)
   rx89_restart:
-    rx89_cur."!cursor_debug"("NEXT ", "")
+    if_null rx89_debug, debug_413
+    rx89_cur."!cursor_debug"("NEXT", "")
+  debug_413:
   rx89_fail:
     (rx89_rep, rx89_pos, $I10, $P10) = rx89_cur."!mark_fail"(0)
     lt rx89_pos, -1, rx89_done
@@ -1378,16 +1441,18 @@
     jump $I10
   rx89_done:
     rx89_cur."!cursor_fail"()
-    rx89_cur."!cursor_debug"("FAIL  ", "")
+    if_null rx89_debug, debug_414
+    rx89_cur."!cursor_debug"("FAIL", "")
+  debug_414:
     .return (rx89_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "pod_comment"  :subid("26_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "pod_comment"  :subid("26_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
-    .const 'Sub' $P127 = "28_1280467477.44751" 
+    .const 'Sub' $P127 = "28_1284728478.15265" 
     capture_lex $P127
     .local string rx96_tgt
     .local int rx96_pos
@@ -1395,7 +1460,9 @@
     .local int rx96_eos
     .local int rx96_rep
     .local pmc rx96_cur
+    .local pmc rx96_debug
     (rx96_cur, rx96_pos, rx96_tgt, $I10) = self."!cursor_start"()
+    getattribute rx96_debug, rx96_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx96_cur
     .local pmc match
     .lex "$/", match
@@ -1407,7 +1474,9 @@
     substr rx96_tgt, rx96_tgt, rx96_off
   rx96_start:
     eq $I10, 1, rx96_restart
-    rx96_cur."!cursor_debug"("START ", "pod_comment")
+    if_null rx96_debug, debug_418
+    rx96_cur."!cursor_debug"("START", "pod_comment")
+  debug_418:
     $I10 = self.'from'()
     ne $I10, -1, rxscan99_done
     goto rxscan99_scan
@@ -1429,29 +1498,27 @@
     is_cclass $I11, 4096, rx96_tgt, $I10
     unless $I11, rx96_fail
   rxanchor100_done:
-  # rx rxquantr101 ** 0..*
-    set_addr $I10, rxquantr101_done
-    rx96_cur."!mark_push"(0, rx96_pos, $I10)
-  rxquantr101_loop:
-  # rx enumcharlist negate=0 
-    ge rx96_pos, rx96_eos, rx96_fail
+  # rx enumcharlist_q negate=0  r 0..-1
     sub $I10, rx96_pos, rx96_off
+    set rx96_rep, 0
+    sub $I12, rx96_eos, rx96_pos
+  rxenumcharlistq101_loop:
+    le $I12, 0, rxenumcharlistq101_done
     substr $S10, rx96_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx96_fail
-    inc rx96_pos
-    set_addr $I10, rxquantr101_done
-    (rx96_rep) = rx96_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr101_done
-    rx96_cur."!mark_push"(rx96_rep, rx96_pos, $I10)
-    goto rxquantr101_loop
-  rxquantr101_done:
+    lt $I11, 0, rxenumcharlistq101_done
+    inc rx96_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq101_loop
+  rxenumcharlistq101_done:
+    add rx96_pos, rx96_pos, rx96_rep
   # rx literal  "="
     add $I11, rx96_pos, 1
     gt $I11, rx96_eos, rx96_fail
     sub $I11, rx96_pos, rx96_off
-    substr $S10, rx96_tgt, $I11, 1
-    ne $S10, "=", rx96_fail
+    ord $I11, rx96_tgt, $I11
+    ne $I11, 61, rx96_fail
     add rx96_pos, 1
   alt102_0:
 .annotate 'line', 54
@@ -1465,23 +1532,22 @@
     substr $S10, rx96_tgt, $I11, 5
     ne $S10, "begin", rx96_fail
     add rx96_pos, 5
-  # rx rxquantr103 ** 1..*
-    set_addr $I10, rxquantr103_done
-    rx96_cur."!mark_push"(0, -1, $I10)
-  rxquantr103_loop:
-  # rx enumcharlist negate=0 
-    ge rx96_pos, rx96_eos, rx96_fail
+  # rx enumcharlist_q negate=0  r 1..-1
     sub $I10, rx96_pos, rx96_off
+    set rx96_rep, 0
+    sub $I12, rx96_eos, rx96_pos
+  rxenumcharlistq103_loop:
+    le $I12, 0, rxenumcharlistq103_done
     substr $S10, rx96_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx96_fail
-    inc rx96_pos
-    set_addr $I10, rxquantr103_done
-    (rx96_rep) = rx96_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr103_done
-    rx96_cur."!mark_push"(rx96_rep, rx96_pos, $I10)
-    goto rxquantr103_loop
-  rxquantr103_done:
+    lt $I11, 0, rxenumcharlistq103_done
+    inc rx96_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq103_loop
+  rxenumcharlistq103_done:
+    lt rx96_rep, 1, rx96_fail
+    add rx96_pos, rx96_pos, rx96_rep
   # rx literal  "END"
     add $I11, rx96_pos, 3
     gt $I11, rx96_eos, rx96_fail
@@ -1521,23 +1587,21 @@
     iseq $I11, $S10, "\r\n"
     add rx96_pos, $I11
     inc rx96_pos
-  # rx rxquantr107 ** 0..*
-    set_addr $I10, rxquantr107_done
-    rx96_cur."!mark_push"(0, rx96_pos, $I10)
-  rxquantr107_loop:
-  # rx enumcharlist negate=0 
-    ge rx96_pos, rx96_eos, rx96_fail
+  # rx enumcharlist_q negate=0  r 0..-1
     sub $I10, rx96_pos, rx96_off
+    set rx96_rep, 0
+    sub $I12, rx96_eos, rx96_pos
+  rxenumcharlistq107_loop:
+    le $I12, 0, rxenumcharlistq107_done
     substr $S10, rx96_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx96_fail
-    inc rx96_pos
-    set_addr $I10, rxquantr107_done
-    (rx96_rep) = rx96_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr107_done
-    rx96_cur."!mark_push"(rx96_rep, rx96_pos, $I10)
-    goto rxquantr107_loop
-  rxquantr107_done:
+    lt $I11, 0, rxenumcharlistq107_done
+    inc rx96_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq107_loop
+  rxenumcharlistq107_done:
+    add rx96_pos, rx96_pos, rx96_rep
   # rx literal  "=end"
     add $I11, rx96_pos, 4
     gt $I11, rx96_eos, rx96_fail
@@ -1545,23 +1609,22 @@
     substr $S10, rx96_tgt, $I11, 4
     ne $S10, "=end", rx96_fail
     add rx96_pos, 4
-  # rx rxquantr108 ** 1..*
-    set_addr $I10, rxquantr108_done
-    rx96_cur."!mark_push"(0, -1, $I10)
-  rxquantr108_loop:
-  # rx enumcharlist negate=0 
-    ge rx96_pos, rx96_eos, rx96_fail
+  # rx enumcharlist_q negate=0  r 1..-1
     sub $I10, rx96_pos, rx96_off
+    set rx96_rep, 0
+    sub $I12, rx96_eos, rx96_pos
+  rxenumcharlistq108_loop:
+    le $I12, 0, rxenumcharlistq108_done
     substr $S10, rx96_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx96_fail
-    inc rx96_pos
-    set_addr $I10, rxquantr108_done
-    (rx96_rep) = rx96_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr108_done
-    rx96_cur."!mark_push"(rx96_rep, rx96_pos, $I10)
-    goto rxquantr108_loop
-  rxquantr108_done:
+    lt $I11, 0, rxenumcharlistq108_done
+    inc rx96_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq108_loop
+  rxenumcharlistq108_done:
+    lt rx96_rep, 1, rx96_fail
+    add rx96_pos, rx96_pos, rx96_rep
   # rx literal  "END"
     add $I11, rx96_pos, 3
     gt $I11, rx96_eos, rx96_fail
@@ -1601,23 +1664,22 @@
     substr $S10, rx96_tgt, $I11, 5
     ne $S10, "begin", rx96_fail
     add rx96_pos, 5
-  # rx rxquantr109 ** 1..*
-    set_addr $I10, rxquantr109_done
-    rx96_cur."!mark_push"(0, -1, $I10)
-  rxquantr109_loop:
-  # rx enumcharlist negate=0 
-    ge rx96_pos, rx96_eos, rx96_fail
+  # rx enumcharlist_q negate=0  r 1..-1
     sub $I10, rx96_pos, rx96_off
+    set rx96_rep, 0
+    sub $I12, rx96_eos, rx96_pos
+  rxenumcharlistq109_loop:
+    le $I12, 0, rxenumcharlistq109_done
     substr $S10, rx96_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx96_fail
-    inc rx96_pos
-    set_addr $I10, rxquantr109_done
-    (rx96_rep) = rx96_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr109_done
-    rx96_cur."!mark_push"(rx96_rep, rx96_pos, $I10)
-    goto rxquantr109_loop
-  rxquantr109_done:
+    lt $I11, 0, rxenumcharlistq109_done
+    inc rx96_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq109_loop
+  rxenumcharlistq109_done:
+    lt rx96_rep, 1, rx96_fail
+    add rx96_pos, rx96_pos, rx96_rep
   # rx subrule "identifier" subtype=capture negate=
     rx96_cur."!cursor_pos"(rx96_pos)
     $P10 = rx96_cur."identifier"()
@@ -1650,23 +1712,21 @@
     iseq $I11, $S10, "\r\n"
     add rx96_pos, $I11
     inc rx96_pos
-  # rx rxquantr113 ** 0..*
-    set_addr $I10, rxquantr113_done
-    rx96_cur."!mark_push"(0, rx96_pos, $I10)
-  rxquantr113_loop:
-  # rx enumcharlist negate=0 
-    ge rx96_pos, rx96_eos, rx96_fail
+  # rx enumcharlist_q negate=0  r 0..-1
     sub $I10, rx96_pos, rx96_off
+    set rx96_rep, 0
+    sub $I12, rx96_eos, rx96_pos
+  rxenumcharlistq113_loop:
+    le $I12, 0, rxenumcharlistq113_done
     substr $S10, rx96_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx96_fail
-    inc rx96_pos
-    set_addr $I10, rxquantr113_done
-    (rx96_rep) = rx96_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr113_done
-    rx96_cur."!mark_push"(rx96_rep, rx96_pos, $I10)
-    goto rxquantr113_loop
-  rxquantr113_done:
+    lt $I11, 0, rxenumcharlistq113_done
+    inc rx96_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq113_loop
+  rxenumcharlistq113_done:
+    add rx96_pos, rx96_pos, rx96_rep
   # rx literal  "=end"
     add $I11, rx96_pos, 4
     gt $I11, rx96_eos, rx96_fail
@@ -1674,23 +1734,22 @@
     substr $S10, rx96_tgt, $I11, 4
     ne $S10, "=end", rx96_fail
     add rx96_pos, 4
-  # rx rxquantr114 ** 1..*
-    set_addr $I10, rxquantr114_done
-    rx96_cur."!mark_push"(0, -1, $I10)
-  rxquantr114_loop:
-  # rx enumcharlist negate=0 
-    ge rx96_pos, rx96_eos, rx96_fail
+  # rx enumcharlist_q negate=0  r 1..-1
     sub $I10, rx96_pos, rx96_off
+    set rx96_rep, 0
+    sub $I12, rx96_eos, rx96_pos
+  rxenumcharlistq114_loop:
+    le $I12, 0, rxenumcharlistq114_done
     substr $S10, rx96_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx96_fail
-    inc rx96_pos
-    set_addr $I10, rxquantr114_done
-    (rx96_rep) = rx96_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr114_done
-    rx96_cur."!mark_push"(rx96_rep, rx96_pos, $I10)
-    goto rxquantr114_loop
-  rxquantr114_done:
+    lt $I11, 0, rxenumcharlistq114_done
+    inc rx96_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq114_loop
+  rxenumcharlistq114_done:
+    lt rx96_rep, 1, rx96_fail
+    add rx96_pos, rx96_pos, rx96_rep
   # rx subrule "!BACKREF" subtype=method negate=
     rx96_cur."!cursor_pos"(rx96_pos)
     $P10 = rx96_cur."!BACKREF"("identifier")
@@ -1738,23 +1797,21 @@
     dec $I10
     is_cclass $I11, 8192, rx96_tgt, $I10
     unless $I11, rx96_fail
-  # rx rxquantr116 ** 0..*
-    set_addr $I10, rxquantr116_done
-    rx96_cur."!mark_push"(0, rx96_pos, $I10)
-  rxquantr116_loop:
-  # rx enumcharlist negate=0 
-    ge rx96_pos, rx96_eos, rx96_fail
+  # rx enumcharlist_q negate=0  r 0..-1
     sub $I10, rx96_pos, rx96_off
+    set rx96_rep, 0
+    sub $I12, rx96_eos, rx96_pos
+  rxenumcharlistq116_loop:
+    le $I12, 0, rxenumcharlistq116_done
     substr $S10, rx96_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx96_fail
-    inc rx96_pos
-    set_addr $I10, rxquantr116_done
-    (rx96_rep) = rx96_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr116_done
-    rx96_cur."!mark_push"(rx96_rep, rx96_pos, $I10)
-    goto rxquantr116_loop
-  rxquantr116_done:
+    lt $I11, 0, rxenumcharlistq116_done
+    inc rx96_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq116_loop
+  rxenumcharlistq116_done:
+    add rx96_pos, rx96_pos, rx96_rep
   alt117_0:
 .annotate 'line', 63
     set_addr $I10, alt117_1
@@ -1777,8 +1834,8 @@
     add $I11, rx96_pos, 1
     gt $I11, rx96_eos, rx96_fail
     sub $I11, rx96_pos, rx96_off
-    substr $S10, rx96_tgt, $I11, 1
-    ne $S10, "#", rx96_fail
+    ord $I11, rx96_tgt, $I11
+    ne $I11, 35, rx96_fail
     add rx96_pos, 1
     goto alt117_end
   alt117_2:
@@ -1813,23 +1870,21 @@
     iseq $I11, $S10, "\r\n"
     add rx96_pos, $I11
     inc rx96_pos
-  # rx rxquantr122 ** 0..*
-    set_addr $I10, rxquantr122_done
-    rx96_cur."!mark_push"(0, rx96_pos, $I10)
-  rxquantr122_loop:
-  # rx enumcharlist negate=0 
-    ge rx96_pos, rx96_eos, rx96_fail
+  # rx enumcharlist_q negate=0  r 0..-1
     sub $I10, rx96_pos, rx96_off
+    set rx96_rep, 0
+    sub $I12, rx96_eos, rx96_pos
+  rxenumcharlistq122_loop:
+    le $I12, 0, rxenumcharlistq122_done
     substr $S10, rx96_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx96_fail
-    inc rx96_pos
-    set_addr $I10, rxquantr122_done
-    (rx96_rep) = rx96_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr122_done
-    rx96_cur."!mark_push"(rx96_rep, rx96_pos, $I10)
-    goto rxquantr122_loop
-  rxquantr122_done:
+    lt $I11, 0, rxenumcharlistq122_done
+    inc rx96_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq122_loop
+  rxenumcharlistq122_done:
+    add rx96_pos, rx96_pos, rx96_rep
   # rx literal  "=end"
     add $I11, rx96_pos, 4
     gt $I11, rx96_eos, rx96_fail
@@ -1893,7 +1948,7 @@
   rxanchor125_done:
   # rx subrule "before" subtype=zerowidth negate=
     rx96_cur."!cursor_pos"(rx96_pos)
-    .const 'Sub' $P127 = "28_1280467477.44751" 
+    .const 'Sub' $P127 = "28_1284728478.15265" 
     capture_lex $P127
     $P10 = rx96_cur."before"($P127)
     unless $P10, rx96_fail
@@ -1927,11 +1982,15 @@
 .annotate 'line', 52
   # rx pass
     rx96_cur."!cursor_pass"(rx96_pos, "pod_comment")
-    rx96_cur."!cursor_debug"("PASS  ", "pod_comment", " at pos=", rx96_pos)
+    if_null rx96_debug, debug_423
+    rx96_cur."!cursor_debug"("PASS", "pod_comment", " at pos=", rx96_pos)
+  debug_423:
     .return (rx96_cur)
   rx96_restart:
 .annotate 'line', 4
-    rx96_cur."!cursor_debug"("NEXT ", "pod_comment")
+    if_null rx96_debug, debug_424
+    rx96_cur."!cursor_debug"("NEXT", "pod_comment")
+  debug_424:
   rx96_fail:
     (rx96_rep, rx96_pos, $I10, $P10) = rx96_cur."!mark_fail"(0)
     lt rx96_pos, -1, rx96_done
@@ -1939,14 +1998,16 @@
     jump $I10
   rx96_done:
     rx96_cur."!cursor_fail"()
-    rx96_cur."!cursor_debug"("FAIL  ", "pod_comment")
+    if_null rx96_debug, debug_425
+    rx96_cur."!cursor_debug"("FAIL", "pod_comment")
+  debug_425:
     .return (rx96_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__pod_comment"  :subid("27_1280467477.44751") :method
+.sub "!PREFIX__pod_comment"  :subid("27_1284728478.15265") :method
 .annotate 'line', 4
     new $P98, "ResizablePMCArray"
     push $P98, ""
@@ -1955,7 +2016,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "_block126"  :anon :subid("28_1280467477.44751") :method :outer("26_1280467477.44751")
+.sub "_block126"  :anon :subid("28_1284728478.15265") :method :outer("26_1284728478.15265")
 .annotate 'line', 69
     .local string rx128_tgt
     .local int rx128_pos
@@ -1963,7 +2024,9 @@
     .local int rx128_eos
     .local int rx128_rep
     .local pmc rx128_cur
+    .local pmc rx128_debug
     (rx128_cur, rx128_pos, rx128_tgt, $I10) = self."!cursor_start"()
+    getattribute rx128_debug, rx128_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx128_cur
     .local pmc match
     .lex "$/", match
@@ -1975,7 +2038,9 @@
     substr rx128_tgt, rx128_tgt, rx128_off
   rx128_start:
     eq $I10, 1, rx128_restart
-    rx128_cur."!cursor_debug"("START ", "")
+    if_null rx128_debug, debug_419
+    rx128_cur."!cursor_debug"("START", "")
+  debug_419:
     $I10 = self.'from'()
     ne $I10, -1, rxscan129_done
     goto rxscan129_scan
@@ -1988,23 +2053,21 @@
     set_addr $I10, rxscan129_loop
     rx128_cur."!mark_push"(0, rx128_pos, $I10)
   rxscan129_done:
-  # rx rxquantr130 ** 0..*
-    set_addr $I10, rxquantr130_done
-    rx128_cur."!mark_push"(0, rx128_pos, $I10)
-  rxquantr130_loop:
-  # rx enumcharlist negate=0 
-    ge rx128_pos, rx128_eos, rx128_fail
+  # rx enumcharlist_q negate=0  r 0..-1
     sub $I10, rx128_pos, rx128_off
+    set rx128_rep, 0
+    sub $I12, rx128_eos, rx128_pos
+  rxenumcharlistq130_loop:
+    le $I12, 0, rxenumcharlistq130_done
     substr $S10, rx128_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx128_fail
-    inc rx128_pos
-    set_addr $I10, rxquantr130_done
-    (rx128_rep) = rx128_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr130_done
-    rx128_cur."!mark_push"(rx128_rep, rx128_pos, $I10)
-    goto rxquantr130_loop
-  rxquantr130_done:
+    lt $I11, 0, rxenumcharlistq130_done
+    inc rx128_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq130_loop
+  rxenumcharlistq130_done:
+    add rx128_pos, rx128_pos, rx128_rep
   alt131_0:
     set_addr $I10, alt131_1
     rx128_cur."!mark_push"(0, rx128_pos, $I10)
@@ -2013,8 +2076,8 @@
     add $I11, rx128_pos, 1
     gt $I11, rx128_eos, rx128_fail
     sub $I11, rx128_pos, rx128_off
-    substr $S10, rx128_tgt, $I11, 1
-    ne $S10, "=", rx128_fail
+    ord $I11, rx128_tgt, $I11
+    ne $I11, 61, rx128_fail
     add rx128_pos, 1
 .annotate 'line', 72
   # rx rxquantr132 ** 0..1
@@ -2063,10 +2126,14 @@
 .annotate 'line', 69
   # rx pass
     rx128_cur."!cursor_pass"(rx128_pos, "")
-    rx128_cur."!cursor_debug"("PASS  ", "", " at pos=", rx128_pos)
+    if_null rx128_debug, debug_420
+    rx128_cur."!cursor_debug"("PASS", "", " at pos=", rx128_pos)
+  debug_420:
     .return (rx128_cur)
   rx128_restart:
-    rx128_cur."!cursor_debug"("NEXT ", "")
+    if_null rx128_debug, debug_421
+    rx128_cur."!cursor_debug"("NEXT", "")
+  debug_421:
   rx128_fail:
     (rx128_rep, rx128_pos, $I10, $P10) = rx128_cur."!mark_fail"(0)
     lt rx128_pos, -1, rx128_done
@@ -2074,14 +2141,16 @@
     jump $I10
   rx128_done:
     rx128_cur."!cursor_fail"()
-    rx128_cur."!cursor_debug"("FAIL  ", "")
+    if_null rx128_debug, debug_422
+    rx128_cur."!cursor_debug"("FAIL", "")
+  debug_422:
     .return (rx128_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "comp_unit"  :subid("29_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "comp_unit"  :subid("29_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx135_tgt
     .local int rx135_pos
@@ -2089,7 +2158,9 @@
     .local int rx135_eos
     .local int rx135_rep
     .local pmc rx135_cur
+    .local pmc rx135_debug
     (rx135_cur, rx135_pos, rx135_tgt, $I10) = self."!cursor_start"()
+    getattribute rx135_debug, rx135_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx135_cur
     .local pmc match
     .lex "$/", match
@@ -2101,7 +2172,9 @@
     substr rx135_tgt, rx135_tgt, rx135_off
   rx135_start:
     eq $I10, 1, rx135_restart
-    rx135_cur."!cursor_debug"("START ", "comp_unit")
+    if_null rx135_debug, debug_426
+    rx135_cur."!cursor_debug"("START", "comp_unit")
+  debug_426:
     $I10 = self.'from'()
     ne $I10, -1, rxscan139_done
     goto rxscan139_scan
@@ -2151,11 +2224,15 @@
 .annotate 'line', 83
   # rx pass
     rx135_cur."!cursor_pass"(rx135_pos, "comp_unit")
-    rx135_cur."!cursor_debug"("PASS  ", "comp_unit", " at pos=", rx135_pos)
+    if_null rx135_debug, debug_427
+    rx135_cur."!cursor_debug"("PASS", "comp_unit", " at pos=", rx135_pos)
+  debug_427:
     .return (rx135_cur)
   rx135_restart:
 .annotate 'line', 4
-    rx135_cur."!cursor_debug"("NEXT ", "comp_unit")
+    if_null rx135_debug, debug_428
+    rx135_cur."!cursor_debug"("NEXT", "comp_unit")
+  debug_428:
   rx135_fail:
     (rx135_rep, rx135_pos, $I10, $P10) = rx135_cur."!mark_fail"(0)
     lt rx135_pos, -1, rx135_done
@@ -2163,14 +2240,16 @@
     jump $I10
   rx135_done:
     rx135_cur."!cursor_fail"()
-    rx135_cur."!cursor_debug"("FAIL  ", "comp_unit")
+    if_null rx135_debug, debug_429
+    rx135_cur."!cursor_debug"("FAIL", "comp_unit")
+  debug_429:
     .return (rx135_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__comp_unit"  :subid("30_1280467477.44751") :method
+.sub "!PREFIX__comp_unit"  :subid("30_1284728478.15265") :method
 .annotate 'line', 4
     $P137 = self."!PREFIX__!subrule"("newpad", "")
     new $P138, "ResizablePMCArray"
@@ -2180,7 +2259,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statementlist"  :subid("31_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statementlist"  :subid("31_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx142_tgt
     .local int rx142_pos
@@ -2188,8 +2267,10 @@
     .local int rx142_eos
     .local int rx142_rep
     .local pmc rx142_cur
+    .local pmc rx142_debug
     (rx142_cur, rx142_pos, rx142_tgt, $I10) = self."!cursor_start"()
     rx142_cur."!cursor_caparray"("statement")
+    getattribute rx142_debug, rx142_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx142_cur
     .local pmc match
     .lex "$/", match
@@ -2201,7 +2282,9 @@
     substr rx142_tgt, rx142_tgt, rx142_off
   rx142_start:
     eq $I10, 1, rx142_restart
-    rx142_cur."!cursor_debug"("START ", "statementlist")
+    if_null rx142_debug, debug_430
+    rx142_cur."!cursor_debug"("START", "statementlist")
+  debug_430:
     $I10 = self.'from'()
     ne $I10, -1, rxscan147_done
     goto rxscan147_scan
@@ -2275,11 +2358,15 @@
 .annotate 'line', 90
   # rx pass
     rx142_cur."!cursor_pass"(rx142_pos, "statementlist")
-    rx142_cur."!cursor_debug"("PASS  ", "statementlist", " at pos=", rx142_pos)
+    if_null rx142_debug, debug_431
+    rx142_cur."!cursor_debug"("PASS", "statementlist", " at pos=", rx142_pos)
+  debug_431:
     .return (rx142_cur)
   rx142_restart:
 .annotate 'line', 4
-    rx142_cur."!cursor_debug"("NEXT ", "statementlist")
+    if_null rx142_debug, debug_432
+    rx142_cur."!cursor_debug"("NEXT", "statementlist")
+  debug_432:
   rx142_fail:
     (rx142_rep, rx142_pos, $I10, $P10) = rx142_cur."!mark_fail"(0)
     lt rx142_pos, -1, rx142_done
@@ -2287,14 +2374,16 @@
     jump $I10
   rx142_done:
     rx142_cur."!cursor_fail"()
-    rx142_cur."!cursor_debug"("FAIL  ", "statementlist")
+    if_null rx142_debug, debug_433
+    rx142_cur."!cursor_debug"("FAIL", "statementlist")
+  debug_433:
     .return (rx142_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statementlist"  :subid("32_1280467477.44751") :method
+.sub "!PREFIX__statementlist"  :subid("32_1284728478.15265") :method
 .annotate 'line', 4
     $P144 = self."!PREFIX__!subrule"("ws", "")
     $P145 = self."!PREFIX__!subrule"("ws", "")
@@ -2306,9 +2395,9 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement"  :subid("33_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement"  :subid("33_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
-    .const 'Sub' $P161 = "35_1280467477.44751" 
+    .const 'Sub' $P161 = "35_1284728478.15265" 
     capture_lex $P161
     .local string rx156_tgt
     .local int rx156_pos
@@ -2316,8 +2405,10 @@
     .local int rx156_eos
     .local int rx156_rep
     .local pmc rx156_cur
+    .local pmc rx156_debug
     (rx156_cur, rx156_pos, rx156_tgt, $I10) = self."!cursor_start"()
     rx156_cur."!cursor_caparray"("statement_mod_loop", "statement_mod_cond")
+    getattribute rx156_debug, rx156_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx156_cur
     .local pmc match
     .lex "$/", match
@@ -2329,7 +2420,9 @@
     substr rx156_tgt, rx156_tgt, rx156_off
   rx156_start:
     eq $I10, 1, rx156_restart
-    rx156_cur."!cursor_debug"("START ", "statement")
+    if_null rx156_debug, debug_434
+    rx156_cur."!cursor_debug"("START", "statement")
+  debug_434:
     $I10 = self.'from'()
     ne $I10, -1, rxscan159_done
     goto rxscan159_scan
@@ -2345,7 +2438,7 @@
 .annotate 'line', 96
   # rx subrule "before" subtype=zerowidth negate=1
     rx156_cur."!cursor_pos"(rx156_pos)
-    .const 'Sub' $P161 = "35_1280467477.44751" 
+    .const 'Sub' $P161 = "35_1284728478.15265" 
     capture_lex $P161
     $P10 = rx156_cur."before"($P161)
     if $P10, rx156_fail
@@ -2441,11 +2534,15 @@
 .annotate 'line', 95
   # rx pass
     rx156_cur."!cursor_pass"(rx156_pos, "statement")
-    rx156_cur."!cursor_debug"("PASS  ", "statement", " at pos=", rx156_pos)
+    if_null rx156_debug, debug_439
+    rx156_cur."!cursor_debug"("PASS", "statement", " at pos=", rx156_pos)
+  debug_439:
     .return (rx156_cur)
   rx156_restart:
 .annotate 'line', 4
-    rx156_cur."!cursor_debug"("NEXT ", "statement")
+    if_null rx156_debug, debug_440
+    rx156_cur."!cursor_debug"("NEXT", "statement")
+  debug_440:
   rx156_fail:
     (rx156_rep, rx156_pos, $I10, $P10) = rx156_cur."!mark_fail"(0)
     lt rx156_pos, -1, rx156_done
@@ -2453,14 +2550,16 @@
     jump $I10
   rx156_done:
     rx156_cur."!cursor_fail"()
-    rx156_cur."!cursor_debug"("FAIL  ", "statement")
+    if_null rx156_debug, debug_441
+    rx156_cur."!cursor_debug"("FAIL", "statement")
+  debug_441:
     .return (rx156_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement"  :subid("34_1280467477.44751") :method
+.sub "!PREFIX__statement"  :subid("34_1284728478.15265") :method
 .annotate 'line', 4
     new $P158, "ResizablePMCArray"
     push $P158, ""
@@ -2469,7 +2568,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "_block160"  :anon :subid("35_1280467477.44751") :method :outer("33_1280467477.44751")
+.sub "_block160"  :anon :subid("35_1284728478.15265") :method :outer("33_1284728478.15265")
 .annotate 'line', 96
     .local string rx162_tgt
     .local int rx162_pos
@@ -2477,7 +2576,9 @@
     .local int rx162_eos
     .local int rx162_rep
     .local pmc rx162_cur
+    .local pmc rx162_debug
     (rx162_cur, rx162_pos, rx162_tgt, $I10) = self."!cursor_start"()
+    getattribute rx162_debug, rx162_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx162_cur
     .local pmc match
     .lex "$/", match
@@ -2489,7 +2590,9 @@
     substr rx162_tgt, rx162_tgt, rx162_off
   rx162_start:
     eq $I10, 1, rx162_restart
-    rx162_cur."!cursor_debug"("START ", "")
+    if_null rx162_debug, debug_435
+    rx162_cur."!cursor_debug"("START", "")
+  debug_435:
     $I10 = self.'from'()
     ne $I10, -1, rxscan163_done
     goto rxscan163_scan
@@ -2519,10 +2622,14 @@
   alt164_end:
   # rx pass
     rx162_cur."!cursor_pass"(rx162_pos, "")
-    rx162_cur."!cursor_debug"("PASS  ", "", " at pos=", rx162_pos)
+    if_null rx162_debug, debug_436
+    rx162_cur."!cursor_debug"("PASS", "", " at pos=", rx162_pos)
+  debug_436:
     .return (rx162_cur)
   rx162_restart:
-    rx162_cur."!cursor_debug"("NEXT ", "")
+    if_null rx162_debug, debug_437
+    rx162_cur."!cursor_debug"("NEXT", "")
+  debug_437:
   rx162_fail:
     (rx162_rep, rx162_pos, $I10, $P10) = rx162_cur."!mark_fail"(0)
     lt rx162_pos, -1, rx162_done
@@ -2530,14 +2637,16 @@
     jump $I10
   rx162_done:
     rx162_cur."!cursor_fail"()
-    rx162_cur."!cursor_debug"("FAIL  ", "")
+    if_null rx162_debug, debug_438
+    rx162_cur."!cursor_debug"("FAIL", "")
+  debug_438:
     .return (rx162_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "eat_terminator"  :subid("36_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "eat_terminator"  :subid("36_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx171_tgt
     .local int rx171_pos
@@ -2545,7 +2654,9 @@
     .local int rx171_eos
     .local int rx171_rep
     .local pmc rx171_cur
+    .local pmc rx171_debug
     (rx171_cur, rx171_pos, rx171_tgt, $I10) = self."!cursor_start"()
+    getattribute rx171_debug, rx171_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx171_cur
     .local pmc match
     .lex "$/", match
@@ -2557,7 +2668,9 @@
     substr rx171_tgt, rx171_tgt, rx171_off
   rx171_start:
     eq $I10, 1, rx171_restart
-    rx171_cur."!cursor_debug"("START ", "eat_terminator")
+    if_null rx171_debug, debug_442
+    rx171_cur."!cursor_debug"("START", "eat_terminator")
+  debug_442:
     $I10 = self.'from'()
     ne $I10, -1, rxscan174_done
     goto rxscan174_scan
@@ -2579,8 +2692,8 @@
     add $I11, rx171_pos, 1
     gt $I11, rx171_eos, rx171_fail
     sub $I11, rx171_pos, rx171_off
-    substr $S10, rx171_tgt, $I11, 1
-    ne $S10, ";", rx171_fail
+    ord $I11, rx171_tgt, $I11
+    ne $I11, 59, rx171_fail
     add rx171_pos, 1
     goto alt175_end
   alt175_1:
@@ -2609,11 +2722,15 @@
 .annotate 'line', 108
   # rx pass
     rx171_cur."!cursor_pass"(rx171_pos, "eat_terminator")
-    rx171_cur."!cursor_debug"("PASS  ", "eat_terminator", " at pos=", rx171_pos)
+    if_null rx171_debug, debug_443
+    rx171_cur."!cursor_debug"("PASS", "eat_terminator", " at pos=", rx171_pos)
+  debug_443:
     .return (rx171_cur)
   rx171_restart:
 .annotate 'line', 4
-    rx171_cur."!cursor_debug"("NEXT ", "eat_terminator")
+    if_null rx171_debug, debug_444
+    rx171_cur."!cursor_debug"("NEXT", "eat_terminator")
+  debug_444:
   rx171_fail:
     (rx171_rep, rx171_pos, $I10, $P10) = rx171_cur."!mark_fail"(0)
     lt rx171_pos, -1, rx171_done
@@ -2621,14 +2738,16 @@
     jump $I10
   rx171_done:
     rx171_cur."!cursor_fail"()
-    rx171_cur."!cursor_debug"("FAIL  ", "eat_terminator")
+    if_null rx171_debug, debug_445
+    rx171_cur."!cursor_debug"("FAIL", "eat_terminator")
+  debug_445:
     .return (rx171_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__eat_terminator"  :subid("37_1280467477.44751") :method
+.sub "!PREFIX__eat_terminator"  :subid("37_1284728478.15265") :method
 .annotate 'line', 4
     new $P173, "ResizablePMCArray"
     push $P173, ""
@@ -2640,7 +2759,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "xblock"  :subid("38_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "xblock"  :subid("38_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx177_tgt
     .local int rx177_pos
@@ -2648,7 +2767,9 @@
     .local int rx177_eos
     .local int rx177_rep
     .local pmc rx177_cur
+    .local pmc rx177_debug
     (rx177_cur, rx177_pos, rx177_tgt, $I10) = self."!cursor_start"()
+    getattribute rx177_debug, rx177_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx177_cur
     .local pmc match
     .lex "$/", match
@@ -2660,7 +2781,9 @@
     substr rx177_tgt, rx177_tgt, rx177_off
   rx177_start:
     eq $I10, 1, rx177_restart
-    rx177_cur."!cursor_debug"("START ", "xblock")
+    if_null rx177_debug, debug_446
+    rx177_cur."!cursor_debug"("START", "xblock")
+  debug_446:
     $I10 = self.'from'()
     ne $I10, -1, rxscan181_done
     goto rxscan181_scan
@@ -2696,11 +2819,15 @@
 .annotate 'line', 115
   # rx pass
     rx177_cur."!cursor_pass"(rx177_pos, "xblock")
-    rx177_cur."!cursor_debug"("PASS  ", "xblock", " at pos=", rx177_pos)
+    if_null rx177_debug, debug_447
+    rx177_cur."!cursor_debug"("PASS", "xblock", " at pos=", rx177_pos)
+  debug_447:
     .return (rx177_cur)
   rx177_restart:
 .annotate 'line', 4
-    rx177_cur."!cursor_debug"("NEXT ", "xblock")
+    if_null rx177_debug, debug_448
+    rx177_cur."!cursor_debug"("NEXT", "xblock")
+  debug_448:
   rx177_fail:
     (rx177_rep, rx177_pos, $I10, $P10) = rx177_cur."!mark_fail"(0)
     lt rx177_pos, -1, rx177_done
@@ -2708,14 +2835,16 @@
     jump $I10
   rx177_done:
     rx177_cur."!cursor_fail"()
-    rx177_cur."!cursor_debug"("FAIL  ", "xblock")
+    if_null rx177_debug, debug_449
+    rx177_cur."!cursor_debug"("FAIL", "xblock")
+  debug_449:
     .return (rx177_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__xblock"  :subid("39_1280467477.44751") :method
+.sub "!PREFIX__xblock"  :subid("39_1284728478.15265") :method
 .annotate 'line', 4
     $P179 = self."!PREFIX__!subrule"("EXPR", "")
     new $P180, "ResizablePMCArray"
@@ -2725,7 +2854,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "pblock"  :subid("40_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "pblock"  :subid("40_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx183_tgt
     .local int rx183_pos
@@ -2733,7 +2862,9 @@
     .local int rx183_eos
     .local int rx183_rep
     .local pmc rx183_cur
+    .local pmc rx183_debug
     (rx183_cur, rx183_pos, rx183_tgt, $I10) = self."!cursor_start"()
+    getattribute rx183_debug, rx183_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx183_cur
     .local pmc match
     .lex "$/", match
@@ -2745,7 +2876,9 @@
     substr rx183_tgt, rx183_tgt, rx183_off
   rx183_start:
     eq $I10, 1, rx183_restart
-    rx183_cur."!cursor_debug"("START ", "pblock")
+    if_null rx183_debug, debug_450
+    rx183_cur."!cursor_debug"("START", "pblock")
+  debug_450:
     $I10 = self.'from'()
     ne $I10, -1, rxscan188_done
     goto rxscan188_scan
@@ -2797,7 +2930,6 @@
     rx183_cur."!mark_push"(0, rx183_pos, $I10)
 .annotate 'line', 124
   # rx enumcharlist negate=0 zerowidth
-    ge rx183_pos, rx183_eos, rx183_fail
     sub $I10, rx183_pos, rx183_off
     substr $S10, rx183_tgt, $I10, 1
     index $I11, "{", $S10
@@ -2829,11 +2961,15 @@
 .annotate 'line', 119
   # rx pass
     rx183_cur."!cursor_pass"(rx183_pos, "pblock")
-    rx183_cur."!cursor_debug"("PASS  ", "pblock", " at pos=", rx183_pos)
+    if_null rx183_debug, debug_451
+    rx183_cur."!cursor_debug"("PASS", "pblock", " at pos=", rx183_pos)
+  debug_451:
     .return (rx183_cur)
   rx183_restart:
 .annotate 'line', 4
-    rx183_cur."!cursor_debug"("NEXT ", "pblock")
+    if_null rx183_debug, debug_452
+    rx183_cur."!cursor_debug"("NEXT", "pblock")
+  debug_452:
   rx183_fail:
     (rx183_rep, rx183_pos, $I10, $P10) = rx183_cur."!mark_fail"(0)
     lt rx183_pos, -1, rx183_done
@@ -2841,14 +2977,16 @@
     jump $I10
   rx183_done:
     rx183_cur."!cursor_fail"()
-    rx183_cur."!cursor_debug"("FAIL  ", "pblock")
+    if_null rx183_debug, debug_453
+    rx183_cur."!cursor_debug"("FAIL", "pblock")
+  debug_453:
     .return (rx183_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__pblock"  :subid("41_1280467477.44751") :method
+.sub "!PREFIX__pblock"  :subid("41_1284728478.15265") :method
 .annotate 'line', 4
     $P185 = self."!PREFIX__!subrule"("panic", "")
     $P186 = self."!PREFIX__!subrule"("lambda", "")
@@ -2861,7 +2999,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "lambda"  :subid("42_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "lambda"  :subid("42_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx191_tgt
     .local int rx191_pos
@@ -2869,7 +3007,9 @@
     .local int rx191_eos
     .local int rx191_rep
     .local pmc rx191_cur
+    .local pmc rx191_debug
     (rx191_cur, rx191_pos, rx191_tgt, $I10) = self."!cursor_start"()
+    getattribute rx191_debug, rx191_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx191_cur
     .local pmc match
     .lex "$/", match
@@ -2881,7 +3021,9 @@
     substr rx191_tgt, rx191_tgt, rx191_off
   rx191_start:
     eq $I10, 1, rx191_restart
-    rx191_cur."!cursor_debug"("START ", "lambda")
+    if_null rx191_debug, debug_454
+    rx191_cur."!cursor_debug"("START", "lambda")
+  debug_454:
     $I10 = self.'from'()
     ne $I10, -1, rxscan194_done
     goto rxscan194_scan
@@ -2917,11 +3059,15 @@
   alt195_end:
   # rx pass
     rx191_cur."!cursor_pass"(rx191_pos, "lambda")
-    rx191_cur."!cursor_debug"("PASS  ", "lambda", " at pos=", rx191_pos)
+    if_null rx191_debug, debug_455
+    rx191_cur."!cursor_debug"("PASS", "lambda", " at pos=", rx191_pos)
+  debug_455:
     .return (rx191_cur)
   rx191_restart:
 .annotate 'line', 4
-    rx191_cur."!cursor_debug"("NEXT ", "lambda")
+    if_null rx191_debug, debug_456
+    rx191_cur."!cursor_debug"("NEXT", "lambda")
+  debug_456:
   rx191_fail:
     (rx191_rep, rx191_pos, $I10, $P10) = rx191_cur."!mark_fail"(0)
     lt rx191_pos, -1, rx191_done
@@ -2929,14 +3075,16 @@
     jump $I10
   rx191_done:
     rx191_cur."!cursor_fail"()
-    rx191_cur."!cursor_debug"("FAIL  ", "lambda")
+    if_null rx191_debug, debug_457
+    rx191_cur."!cursor_debug"("FAIL", "lambda")
+  debug_457:
     .return (rx191_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__lambda"  :subid("43_1280467477.44751") :method
+.sub "!PREFIX__lambda"  :subid("43_1284728478.15265") :method
 .annotate 'line', 4
     new $P193, "ResizablePMCArray"
     push $P193, "<->"
@@ -2946,7 +3094,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "block"  :subid("44_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "block"  :subid("44_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx197_tgt
     .local int rx197_pos
@@ -2954,7 +3102,9 @@
     .local int rx197_eos
     .local int rx197_rep
     .local pmc rx197_cur
+    .local pmc rx197_debug
     (rx197_cur, rx197_pos, rx197_tgt, $I10) = self."!cursor_start"()
+    getattribute rx197_debug, rx197_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx197_cur
     .local pmc match
     .lex "$/", match
@@ -2966,7 +3116,9 @@
     substr rx197_tgt, rx197_tgt, rx197_off
   rx197_start:
     eq $I10, 1, rx197_restart
-    rx197_cur."!cursor_debug"("START ", "block")
+    if_null rx197_debug, debug_458
+    rx197_cur."!cursor_debug"("START", "block")
+  debug_458:
     $I10 = self.'from'()
     ne $I10, -1, rxscan201_done
     goto rxscan201_scan
@@ -2984,7 +3136,6 @@
     set_addr $I10, alt202_1
     rx197_cur."!mark_push"(0, rx197_pos, $I10)
   # rx enumcharlist negate=0 zerowidth
-    ge rx197_pos, rx197_eos, rx197_fail
     sub $I10, rx197_pos, rx197_off
     substr $S10, rx197_tgt, $I10, 1
     index $I11, "{", $S10
@@ -3014,11 +3165,15 @@
 .annotate 'line', 132
   # rx pass
     rx197_cur."!cursor_pass"(rx197_pos, "block")
-    rx197_cur."!cursor_debug"("PASS  ", "block", " at pos=", rx197_pos)
+    if_null rx197_debug, debug_459
+    rx197_cur."!cursor_debug"("PASS", "block", " at pos=", rx197_pos)
+  debug_459:
     .return (rx197_cur)
   rx197_restart:
 .annotate 'line', 4
-    rx197_cur."!cursor_debug"("NEXT ", "block")
+    if_null rx197_debug, debug_460
+    rx197_cur."!cursor_debug"("NEXT", "block")
+  debug_460:
   rx197_fail:
     (rx197_rep, rx197_pos, $I10, $P10) = rx197_cur."!mark_fail"(0)
     lt rx197_pos, -1, rx197_done
@@ -3026,14 +3181,16 @@
     jump $I10
   rx197_done:
     rx197_cur."!cursor_fail"()
-    rx197_cur."!cursor_debug"("FAIL  ", "block")
+    if_null rx197_debug, debug_461
+    rx197_cur."!cursor_debug"("FAIL", "block")
+  debug_461:
     .return (rx197_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__block"  :subid("45_1280467477.44751") :method
+.sub "!PREFIX__block"  :subid("45_1284728478.15265") :method
 .annotate 'line', 4
     $P199 = self."!PREFIX__!subrule"("panic", "")
     new $P200, "ResizablePMCArray"
@@ -3044,7 +3201,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "blockoid"  :subid("46_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "blockoid"  :subid("46_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx204_tgt
     .local int rx204_pos
@@ -3052,7 +3209,9 @@
     .local int rx204_eos
     .local int rx204_rep
     .local pmc rx204_cur
+    .local pmc rx204_debug
     (rx204_cur, rx204_pos, rx204_tgt, $I10) = self."!cursor_start"()
+    getattribute rx204_debug, rx204_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx204_cur
     .local pmc match
     .lex "$/", match
@@ -3064,7 +3223,9 @@
     substr rx204_tgt, rx204_tgt, rx204_off
   rx204_start:
     eq $I10, 1, rx204_restart
-    rx204_cur."!cursor_debug"("START ", "blockoid")
+    if_null rx204_debug, debug_462
+    rx204_cur."!cursor_debug"("START", "blockoid")
+  debug_462:
     $I10 = self.'from'()
     ne $I10, -1, rxscan208_done
     goto rxscan208_scan
@@ -3088,8 +3249,8 @@
     add $I11, rx204_pos, 1
     gt $I11, rx204_eos, rx204_fail
     sub $I11, rx204_pos, rx204_off
-    substr $S10, rx204_tgt, $I11, 1
-    ne $S10, "{", rx204_fail
+    ord $I11, rx204_tgt, $I11
+    ne $I11, 123, rx204_fail
     add rx204_pos, 1
   # rx subrule "statementlist" subtype=capture negate=
     rx204_cur."!cursor_pos"(rx204_pos)
@@ -3105,8 +3266,8 @@
     add $I11, rx204_pos, 1
     gt $I11, rx204_eos, rx204_fail
     sub $I11, rx204_pos, rx204_off
-    substr $S10, rx204_tgt, $I11, 1
-    ne $S10, "}", rx204_fail
+    ord $I11, rx204_tgt, $I11
+    ne $I11, 125, rx204_fail
     add rx204_pos, 1
     goto alt209_end
   alt209_1:
@@ -3131,11 +3292,15 @@
 .annotate 'line', 138
   # rx pass
     rx204_cur."!cursor_pass"(rx204_pos, "blockoid")
-    rx204_cur."!cursor_debug"("PASS  ", "blockoid", " at pos=", rx204_pos)
+    if_null rx204_debug, debug_463
+    rx204_cur."!cursor_debug"("PASS", "blockoid", " at pos=", rx204_pos)
+  debug_463:
     .return (rx204_cur)
   rx204_restart:
 .annotate 'line', 4
-    rx204_cur."!cursor_debug"("NEXT ", "blockoid")
+    if_null rx204_debug, debug_464
+    rx204_cur."!cursor_debug"("NEXT", "blockoid")
+  debug_464:
   rx204_fail:
     (rx204_rep, rx204_pos, $I10, $P10) = rx204_cur."!mark_fail"(0)
     lt rx204_pos, -1, rx204_done
@@ -3143,14 +3308,16 @@
     jump $I10
   rx204_done:
     rx204_cur."!cursor_fail"()
-    rx204_cur."!cursor_debug"("FAIL  ", "blockoid")
+    if_null rx204_debug, debug_465
+    rx204_cur."!cursor_debug"("FAIL", "blockoid")
+  debug_465:
     .return (rx204_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__blockoid"  :subid("47_1280467477.44751") :method
+.sub "!PREFIX__blockoid"  :subid("47_1284728478.15265") :method
 .annotate 'line', 4
     $P206 = self."!PREFIX__!subrule"("finishpad", "")
     new $P207, "ResizablePMCArray"
@@ -3160,7 +3327,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "newpad"  :subid("48_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "newpad"  :subid("48_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx213_tgt
     .local int rx213_pos
@@ -3168,7 +3335,9 @@
     .local int rx213_eos
     .local int rx213_rep
     .local pmc rx213_cur
+    .local pmc rx213_debug
     (rx213_cur, rx213_pos, rx213_tgt, $I10) = self."!cursor_start"()
+    getattribute rx213_debug, rx213_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx213_cur
     .local pmc match
     .lex "$/", match
@@ -3180,7 +3349,9 @@
     substr rx213_tgt, rx213_tgt, rx213_off
   rx213_start:
     eq $I10, 1, rx213_restart
-    rx213_cur."!cursor_debug"("START ", "newpad")
+    if_null rx213_debug, debug_466
+    rx213_cur."!cursor_debug"("START", "newpad")
+  debug_466:
     $I10 = self.'from'()
     ne $I10, -1, rxscan216_done
     goto rxscan216_scan
@@ -3196,11 +3367,15 @@
 .annotate 'line', 144
   # rx pass
     rx213_cur."!cursor_pass"(rx213_pos, "newpad")
-    rx213_cur."!cursor_debug"("PASS  ", "newpad", " at pos=", rx213_pos)
+    if_null rx213_debug, debug_467
+    rx213_cur."!cursor_debug"("PASS", "newpad", " at pos=", rx213_pos)
+  debug_467:
     .return (rx213_cur)
   rx213_restart:
 .annotate 'line', 4
-    rx213_cur."!cursor_debug"("NEXT ", "newpad")
+    if_null rx213_debug, debug_468
+    rx213_cur."!cursor_debug"("NEXT", "newpad")
+  debug_468:
   rx213_fail:
     (rx213_rep, rx213_pos, $I10, $P10) = rx213_cur."!mark_fail"(0)
     lt rx213_pos, -1, rx213_done
@@ -3208,14 +3383,16 @@
     jump $I10
   rx213_done:
     rx213_cur."!cursor_fail"()
-    rx213_cur."!cursor_debug"("FAIL  ", "newpad")
+    if_null rx213_debug, debug_469
+    rx213_cur."!cursor_debug"("FAIL", "newpad")
+  debug_469:
     .return (rx213_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__newpad"  :subid("49_1280467477.44751") :method
+.sub "!PREFIX__newpad"  :subid("49_1284728478.15265") :method
 .annotate 'line', 4
     new $P215, "ResizablePMCArray"
     push $P215, ""
@@ -3224,7 +3401,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "outerctx"  :subid("50_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "outerctx"  :subid("50_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx218_tgt
     .local int rx218_pos
@@ -3232,7 +3409,9 @@
     .local int rx218_eos
     .local int rx218_rep
     .local pmc rx218_cur
+    .local pmc rx218_debug
     (rx218_cur, rx218_pos, rx218_tgt, $I10) = self."!cursor_start"()
+    getattribute rx218_debug, rx218_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx218_cur
     .local pmc match
     .lex "$/", match
@@ -3244,7 +3423,9 @@
     substr rx218_tgt, rx218_tgt, rx218_off
   rx218_start:
     eq $I10, 1, rx218_restart
-    rx218_cur."!cursor_debug"("START ", "outerctx")
+    if_null rx218_debug, debug_470
+    rx218_cur."!cursor_debug"("START", "outerctx")
+  debug_470:
     $I10 = self.'from'()
     ne $I10, -1, rxscan221_done
     goto rxscan221_scan
@@ -3260,11 +3441,15 @@
 .annotate 'line', 145
   # rx pass
     rx218_cur."!cursor_pass"(rx218_pos, "outerctx")
-    rx218_cur."!cursor_debug"("PASS  ", "outerctx", " at pos=", rx218_pos)
+    if_null rx218_debug, debug_471
+    rx218_cur."!cursor_debug"("PASS", "outerctx", " at pos=", rx218_pos)
+  debug_471:
     .return (rx218_cur)
   rx218_restart:
 .annotate 'line', 4
-    rx218_cur."!cursor_debug"("NEXT ", "outerctx")
+    if_null rx218_debug, debug_472
+    rx218_cur."!cursor_debug"("NEXT", "outerctx")
+  debug_472:
   rx218_fail:
     (rx218_rep, rx218_pos, $I10, $P10) = rx218_cur."!mark_fail"(0)
     lt rx218_pos, -1, rx218_done
@@ -3272,14 +3457,16 @@
     jump $I10
   rx218_done:
     rx218_cur."!cursor_fail"()
-    rx218_cur."!cursor_debug"("FAIL  ", "outerctx")
+    if_null rx218_debug, debug_473
+    rx218_cur."!cursor_debug"("FAIL", "outerctx")
+  debug_473:
     .return (rx218_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__outerctx"  :subid("51_1280467477.44751") :method
+.sub "!PREFIX__outerctx"  :subid("51_1284728478.15265") :method
 .annotate 'line', 4
     new $P220, "ResizablePMCArray"
     push $P220, ""
@@ -3288,7 +3475,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "finishpad"  :subid("52_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "finishpad"  :subid("52_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx223_tgt
     .local int rx223_pos
@@ -3296,7 +3483,9 @@
     .local int rx223_eos
     .local int rx223_rep
     .local pmc rx223_cur
+    .local pmc rx223_debug
     (rx223_cur, rx223_pos, rx223_tgt, $I10) = self."!cursor_start"()
+    getattribute rx223_debug, rx223_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx223_cur
     .local pmc match
     .lex "$/", match
@@ -3308,7 +3497,9 @@
     substr rx223_tgt, rx223_tgt, rx223_off
   rx223_start:
     eq $I10, 1, rx223_restart
-    rx223_cur."!cursor_debug"("START ", "finishpad")
+    if_null rx223_debug, debug_474
+    rx223_cur."!cursor_debug"("START", "finishpad")
+  debug_474:
     $I10 = self.'from'()
     ne $I10, -1, rxscan226_done
     goto rxscan226_scan
@@ -3324,11 +3515,15 @@
 .annotate 'line', 146
   # rx pass
     rx223_cur."!cursor_pass"(rx223_pos, "finishpad")
-    rx223_cur."!cursor_debug"("PASS  ", "finishpad", " at pos=", rx223_pos)
+    if_null rx223_debug, debug_475
+    rx223_cur."!cursor_debug"("PASS", "finishpad", " at pos=", rx223_pos)
+  debug_475:
     .return (rx223_cur)
   rx223_restart:
 .annotate 'line', 4
-    rx223_cur."!cursor_debug"("NEXT ", "finishpad")
+    if_null rx223_debug, debug_476
+    rx223_cur."!cursor_debug"("NEXT", "finishpad")
+  debug_476:
   rx223_fail:
     (rx223_rep, rx223_pos, $I10, $P10) = rx223_cur."!mark_fail"(0)
     lt rx223_pos, -1, rx223_done
@@ -3336,14 +3531,16 @@
     jump $I10
   rx223_done:
     rx223_cur."!cursor_fail"()
-    rx223_cur."!cursor_debug"("FAIL  ", "finishpad")
+    if_null rx223_debug, debug_477
+    rx223_cur."!cursor_debug"("FAIL", "finishpad")
+  debug_477:
     .return (rx223_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__finishpad"  :subid("53_1280467477.44751") :method
+.sub "!PREFIX__finishpad"  :subid("53_1284728478.15265") :method
 .annotate 'line', 4
     new $P225, "ResizablePMCArray"
     push $P225, ""
@@ -3352,7 +3549,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "terminator"  :subid("54_1280467477.44751") :method
+.sub "terminator"  :subid("54_1284728478.15265") :method
 .annotate 'line', 148
     $P228 = self."!protoregex"("terminator")
     .return ($P228)
@@ -3360,7 +3557,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__terminator"  :subid("55_1280467477.44751") :method
+.sub "!PREFIX__terminator"  :subid("55_1284728478.15265") :method
 .annotate 'line', 148
     $P230 = self."!PREFIX__!protoregex"("terminator")
     .return ($P230)
@@ -3368,7 +3565,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "terminator:sym<;>"  :subid("56_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "terminator:sym<;>"  :subid("56_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx232_tgt
     .local int rx232_pos
@@ -3376,7 +3573,9 @@
     .local int rx232_eos
     .local int rx232_rep
     .local pmc rx232_cur
+    .local pmc rx232_debug
     (rx232_cur, rx232_pos, rx232_tgt, $I10) = self."!cursor_start"()
+    getattribute rx232_debug, rx232_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx232_cur
     .local pmc match
     .lex "$/", match
@@ -3388,7 +3587,9 @@
     substr rx232_tgt, rx232_tgt, rx232_off
   rx232_start:
     eq $I10, 1, rx232_restart
-    rx232_cur."!cursor_debug"("START ", "terminator:sym<;>")
+    if_null rx232_debug, debug_478
+    rx232_cur."!cursor_debug"("START", "terminator:sym<;>")
+  debug_478:
     $I10 = self.'from'()
     ne $I10, -1, rxscan235_done
     goto rxscan235_scan
@@ -3403,18 +3604,21 @@
   rxscan235_done:
 .annotate 'line', 150
   # rx enumcharlist negate=0 zerowidth
-    ge rx232_pos, rx232_eos, rx232_fail
     sub $I10, rx232_pos, rx232_off
     substr $S10, rx232_tgt, $I10, 1
     index $I11, ";", $S10
     lt $I11, 0, rx232_fail
   # rx pass
     rx232_cur."!cursor_pass"(rx232_pos, "terminator:sym<;>")
-    rx232_cur."!cursor_debug"("PASS  ", "terminator:sym<;>", " at pos=", rx232_pos)
+    if_null rx232_debug, debug_479
+    rx232_cur."!cursor_debug"("PASS", "terminator:sym<;>", " at pos=", rx232_pos)
+  debug_479:
     .return (rx232_cur)
   rx232_restart:
 .annotate 'line', 4
-    rx232_cur."!cursor_debug"("NEXT ", "terminator:sym<;>")
+    if_null rx232_debug, debug_480
+    rx232_cur."!cursor_debug"("NEXT", "terminator:sym<;>")
+  debug_480:
   rx232_fail:
     (rx232_rep, rx232_pos, $I10, $P10) = rx232_cur."!mark_fail"(0)
     lt rx232_pos, -1, rx232_done
@@ -3422,14 +3626,16 @@
     jump $I10
   rx232_done:
     rx232_cur."!cursor_fail"()
-    rx232_cur."!cursor_debug"("FAIL  ", "terminator:sym<;>")
+    if_null rx232_debug, debug_481
+    rx232_cur."!cursor_debug"("FAIL", "terminator:sym<;>")
+  debug_481:
     .return (rx232_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__terminator:sym<;>"  :subid("57_1280467477.44751") :method
+.sub "!PREFIX__terminator:sym<;>"  :subid("57_1284728478.15265") :method
 .annotate 'line', 4
     new $P234, "ResizablePMCArray"
     push $P234, ";"
@@ -3438,7 +3644,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "terminator:sym<}>"  :subid("58_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "terminator:sym<}>"  :subid("58_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx237_tgt
     .local int rx237_pos
@@ -3446,7 +3652,9 @@
     .local int rx237_eos
     .local int rx237_rep
     .local pmc rx237_cur
+    .local pmc rx237_debug
     (rx237_cur, rx237_pos, rx237_tgt, $I10) = self."!cursor_start"()
+    getattribute rx237_debug, rx237_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx237_cur
     .local pmc match
     .lex "$/", match
@@ -3458,7 +3666,9 @@
     substr rx237_tgt, rx237_tgt, rx237_off
   rx237_start:
     eq $I10, 1, rx237_restart
-    rx237_cur."!cursor_debug"("START ", "terminator:sym<}>")
+    if_null rx237_debug, debug_482
+    rx237_cur."!cursor_debug"("START", "terminator:sym<}>")
+  debug_482:
     $I10 = self.'from'()
     ne $I10, -1, rxscan240_done
     goto rxscan240_scan
@@ -3473,18 +3683,21 @@
   rxscan240_done:
 .annotate 'line', 151
   # rx enumcharlist negate=0 zerowidth
-    ge rx237_pos, rx237_eos, rx237_fail
     sub $I10, rx237_pos, rx237_off
     substr $S10, rx237_tgt, $I10, 1
     index $I11, "}", $S10
     lt $I11, 0, rx237_fail
   # rx pass
     rx237_cur."!cursor_pass"(rx237_pos, "terminator:sym<}>")
-    rx237_cur."!cursor_debug"("PASS  ", "terminator:sym<}>", " at pos=", rx237_pos)
+    if_null rx237_debug, debug_483
+    rx237_cur."!cursor_debug"("PASS", "terminator:sym<}>", " at pos=", rx237_pos)
+  debug_483:
     .return (rx237_cur)
   rx237_restart:
 .annotate 'line', 4
-    rx237_cur."!cursor_debug"("NEXT ", "terminator:sym<}>")
+    if_null rx237_debug, debug_484
+    rx237_cur."!cursor_debug"("NEXT", "terminator:sym<}>")
+  debug_484:
   rx237_fail:
     (rx237_rep, rx237_pos, $I10, $P10) = rx237_cur."!mark_fail"(0)
     lt rx237_pos, -1, rx237_done
@@ -3492,14 +3705,16 @@
     jump $I10
   rx237_done:
     rx237_cur."!cursor_fail"()
-    rx237_cur."!cursor_debug"("FAIL  ", "terminator:sym<}>")
+    if_null rx237_debug, debug_485
+    rx237_cur."!cursor_debug"("FAIL", "terminator:sym<}>")
+  debug_485:
     .return (rx237_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__terminator:sym<}>"  :subid("59_1280467477.44751") :method
+.sub "!PREFIX__terminator:sym<}>"  :subid("59_1284728478.15265") :method
 .annotate 'line', 4
     new $P239, "ResizablePMCArray"
     push $P239, "}"
@@ -3508,7 +3723,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_control"  :subid("60_1280467477.44751") :method
+.sub "statement_control"  :subid("60_1284728478.15265") :method
 .annotate 'line', 155
     $P242 = self."!protoregex"("statement_control")
     .return ($P242)
@@ -3516,7 +3731,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_control"  :subid("61_1280467477.44751") :method
+.sub "!PREFIX__statement_control"  :subid("61_1284728478.15265") :method
 .annotate 'line', 155
     $P244 = self."!PREFIX__!protoregex"("statement_control")
     .return ($P244)
@@ -3524,7 +3739,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_control:sym<if>"  :subid("62_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_control:sym<if>"  :subid("62_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx246_tgt
     .local int rx246_pos
@@ -3532,8 +3747,10 @@
     .local int rx246_eos
     .local int rx246_rep
     .local pmc rx246_cur
+    .local pmc rx246_debug
     (rx246_cur, rx246_pos, rx246_tgt, $I10) = self."!cursor_start"()
-    rx246_cur."!cursor_caparray"("xblock", "else")
+    rx246_cur."!cursor_caparray"("else", "xblock")
+    getattribute rx246_debug, rx246_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx246_cur
     .local pmc match
     .lex "$/", match
@@ -3545,7 +3762,9 @@
     substr rx246_tgt, rx246_tgt, rx246_off
   rx246_start:
     eq $I10, 1, rx246_restart
-    rx246_cur."!cursor_debug"("START ", "statement_control:sym<if>")
+    if_null rx246_debug, debug_486
+    rx246_cur."!cursor_debug"("START", "statement_control:sym<if>")
+  debug_486:
     $I10 = self.'from'()
     ne $I10, -1, rxscan249_done
     goto rxscan249_scan
@@ -3706,11 +3925,15 @@
 .annotate 'line', 157
   # rx pass
     rx246_cur."!cursor_pass"(rx246_pos, "statement_control:sym<if>")
-    rx246_cur."!cursor_debug"("PASS  ", "statement_control:sym<if>", " at pos=", rx246_pos)
+    if_null rx246_debug, debug_487
+    rx246_cur."!cursor_debug"("PASS", "statement_control:sym<if>", " at pos=", rx246_pos)
+  debug_487:
     .return (rx246_cur)
   rx246_restart:
 .annotate 'line', 4
-    rx246_cur."!cursor_debug"("NEXT ", "statement_control:sym<if>")
+    if_null rx246_debug, debug_488
+    rx246_cur."!cursor_debug"("NEXT", "statement_control:sym<if>")
+  debug_488:
   rx246_fail:
     (rx246_rep, rx246_pos, $I10, $P10) = rx246_cur."!mark_fail"(0)
     lt rx246_pos, -1, rx246_done
@@ -3718,14 +3941,16 @@
     jump $I10
   rx246_done:
     rx246_cur."!cursor_fail"()
-    rx246_cur."!cursor_debug"("FAIL  ", "statement_control:sym<if>")
+    if_null rx246_debug, debug_489
+    rx246_cur."!cursor_debug"("FAIL", "statement_control:sym<if>")
+  debug_489:
     .return (rx246_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_control:sym<if>"  :subid("63_1280467477.44751") :method
+.sub "!PREFIX__statement_control:sym<if>"  :subid("63_1284728478.15265") :method
 .annotate 'line', 4
     new $P248, "ResizablePMCArray"
     push $P248, "if"
@@ -3734,9 +3959,9 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_control:sym<unless>"  :subid("64_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_control:sym<unless>"  :subid("64_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
-    .const 'Sub' $P274 = "66_1280467477.44751" 
+    .const 'Sub' $P274 = "66_1284728478.15265" 
     capture_lex $P274
     .local string rx264_tgt
     .local int rx264_pos
@@ -3744,7 +3969,9 @@
     .local int rx264_eos
     .local int rx264_rep
     .local pmc rx264_cur
+    .local pmc rx264_debug
     (rx264_cur, rx264_pos, rx264_tgt, $I10) = self."!cursor_start"()
+    getattribute rx264_debug, rx264_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx264_cur
     .local pmc match
     .lex "$/", match
@@ -3756,7 +3983,9 @@
     substr rx264_tgt, rx264_tgt, rx264_off
   rx264_start:
     eq $I10, 1, rx264_restart
-    rx264_cur."!cursor_debug"("START ", "statement_control:sym<unless>")
+    if_null rx264_debug, debug_490
+    rx264_cur."!cursor_debug"("START", "statement_control:sym<unless>")
+  debug_490:
     $I10 = self.'from'()
     ne $I10, -1, rxscan267_done
     goto rxscan267_scan
@@ -3826,7 +4055,7 @@
     rx264_pos = $P10."pos"()
   # rx subrule "before" subtype=zerowidth negate=1
     rx264_cur."!cursor_pos"(rx264_pos)
-    .const 'Sub' $P274 = "66_1280467477.44751" 
+    .const 'Sub' $P274 = "66_1284728478.15265" 
     capture_lex $P274
     $P10 = rx264_cur."before"($P274)
     if $P10, rx264_fail
@@ -3861,11 +4090,15 @@
 .annotate 'line', 164
   # rx pass
     rx264_cur."!cursor_pass"(rx264_pos, "statement_control:sym<unless>")
-    rx264_cur."!cursor_debug"("PASS  ", "statement_control:sym<unless>", " at pos=", rx264_pos)
+    if_null rx264_debug, debug_495
+    rx264_cur."!cursor_debug"("PASS", "statement_control:sym<unless>", " at pos=", rx264_pos)
+  debug_495:
     .return (rx264_cur)
   rx264_restart:
 .annotate 'line', 4
-    rx264_cur."!cursor_debug"("NEXT ", "statement_control:sym<unless>")
+    if_null rx264_debug, debug_496
+    rx264_cur."!cursor_debug"("NEXT", "statement_control:sym<unless>")
+  debug_496:
   rx264_fail:
     (rx264_rep, rx264_pos, $I10, $P10) = rx264_cur."!mark_fail"(0)
     lt rx264_pos, -1, rx264_done
@@ -3873,14 +4106,16 @@
     jump $I10
   rx264_done:
     rx264_cur."!cursor_fail"()
-    rx264_cur."!cursor_debug"("FAIL  ", "statement_control:sym<unless>")
+    if_null rx264_debug, debug_497
+    rx264_cur."!cursor_debug"("FAIL", "statement_control:sym<unless>")
+  debug_497:
     .return (rx264_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_control:sym<unless>"  :subid("65_1280467477.44751") :method
+.sub "!PREFIX__statement_control:sym<unless>"  :subid("65_1284728478.15265") :method
 .annotate 'line', 4
     new $P266, "ResizablePMCArray"
     push $P266, "unless"
@@ -3889,7 +4124,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "_block273"  :anon :subid("66_1280467477.44751") :method :outer("64_1280467477.44751")
+.sub "_block273"  :anon :subid("66_1284728478.15265") :method :outer("64_1284728478.15265")
 .annotate 'line', 167
     .local string rx275_tgt
     .local int rx275_pos
@@ -3897,7 +4132,9 @@
     .local int rx275_eos
     .local int rx275_rep
     .local pmc rx275_cur
+    .local pmc rx275_debug
     (rx275_cur, rx275_pos, rx275_tgt, $I10) = self."!cursor_start"()
+    getattribute rx275_debug, rx275_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx275_cur
     .local pmc match
     .lex "$/", match
@@ -3909,7 +4146,9 @@
     substr rx275_tgt, rx275_tgt, rx275_off
   rx275_start:
     eq $I10, 1, rx275_restart
-    rx275_cur."!cursor_debug"("START ", "")
+    if_null rx275_debug, debug_491
+    rx275_cur."!cursor_debug"("START", "")
+  debug_491:
     $I10 = self.'from'()
     ne $I10, -1, rxscan276_done
     goto rxscan276_scan
@@ -3931,10 +4170,14 @@
     add rx275_pos, 4
   # rx pass
     rx275_cur."!cursor_pass"(rx275_pos, "")
-    rx275_cur."!cursor_debug"("PASS  ", "", " at pos=", rx275_pos)
+    if_null rx275_debug, debug_492
+    rx275_cur."!cursor_debug"("PASS", "", " at pos=", rx275_pos)
+  debug_492:
     .return (rx275_cur)
   rx275_restart:
-    rx275_cur."!cursor_debug"("NEXT ", "")
+    if_null rx275_debug, debug_493
+    rx275_cur."!cursor_debug"("NEXT", "")
+  debug_493:
   rx275_fail:
     (rx275_rep, rx275_pos, $I10, $P10) = rx275_cur."!mark_fail"(0)
     lt rx275_pos, -1, rx275_done
@@ -3942,14 +4185,16 @@
     jump $I10
   rx275_done:
     rx275_cur."!cursor_fail"()
-    rx275_cur."!cursor_debug"("FAIL  ", "")
+    if_null rx275_debug, debug_494
+    rx275_cur."!cursor_debug"("FAIL", "")
+  debug_494:
     .return (rx275_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_control:sym<while>"  :subid("67_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_control:sym<while>"  :subid("67_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx282_tgt
     .local int rx282_pos
@@ -3957,7 +4202,9 @@
     .local int rx282_eos
     .local int rx282_rep
     .local pmc rx282_cur
+    .local pmc rx282_debug
     (rx282_cur, rx282_pos, rx282_tgt, $I10) = self."!cursor_start"()
+    getattribute rx282_debug, rx282_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx282_cur
     .local pmc match
     .lex "$/", match
@@ -3969,7 +4216,9 @@
     substr rx282_tgt, rx282_tgt, rx282_off
   rx282_start:
     eq $I10, 1, rx282_restart
-    rx282_cur."!cursor_debug"("START ", "statement_control:sym<while>")
+    if_null rx282_debug, debug_498
+    rx282_cur."!cursor_debug"("START", "statement_control:sym<while>")
+  debug_498:
     $I10 = self.'from'()
     ne $I10, -1, rxscan285_done
     goto rxscan285_scan
@@ -4044,11 +4293,15 @@
 .annotate 'line', 170
   # rx pass
     rx282_cur."!cursor_pass"(rx282_pos, "statement_control:sym<while>")
-    rx282_cur."!cursor_debug"("PASS  ", "statement_control:sym<while>", " at pos=", rx282_pos)
+    if_null rx282_debug, debug_499
+    rx282_cur."!cursor_debug"("PASS", "statement_control:sym<while>", " at pos=", rx282_pos)
+  debug_499:
     .return (rx282_cur)
   rx282_restart:
 .annotate 'line', 4
-    rx282_cur."!cursor_debug"("NEXT ", "statement_control:sym<while>")
+    if_null rx282_debug, debug_500
+    rx282_cur."!cursor_debug"("NEXT", "statement_control:sym<while>")
+  debug_500:
   rx282_fail:
     (rx282_rep, rx282_pos, $I10, $P10) = rx282_cur."!mark_fail"(0)
     lt rx282_pos, -1, rx282_done
@@ -4056,14 +4309,16 @@
     jump $I10
   rx282_done:
     rx282_cur."!cursor_fail"()
-    rx282_cur."!cursor_debug"("FAIL  ", "statement_control:sym<while>")
+    if_null rx282_debug, debug_501
+    rx282_cur."!cursor_debug"("FAIL", "statement_control:sym<while>")
+  debug_501:
     .return (rx282_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_control:sym<while>"  :subid("68_1280467477.44751") :method
+.sub "!PREFIX__statement_control:sym<while>"  :subid("68_1284728478.15265") :method
 .annotate 'line', 4
     new $P284, "ResizablePMCArray"
     push $P284, "until"
@@ -4073,7 +4328,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_control:sym<repeat>"  :subid("69_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_control:sym<repeat>"  :subid("69_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx291_tgt
     .local int rx291_pos
@@ -4081,7 +4336,9 @@
     .local int rx291_eos
     .local int rx291_rep
     .local pmc rx291_cur
+    .local pmc rx291_debug
     (rx291_cur, rx291_pos, rx291_tgt, $I10) = self."!cursor_start"()
+    getattribute rx291_debug, rx291_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx291_cur
     .local pmc match
     .lex "$/", match
@@ -4093,7 +4350,9 @@
     substr rx291_tgt, rx291_tgt, rx291_off
   rx291_start:
     eq $I10, 1, rx291_restart
-    rx291_cur."!cursor_debug"("START ", "statement_control:sym<repeat>")
+    if_null rx291_debug, debug_502
+    rx291_cur."!cursor_debug"("START", "statement_control:sym<repeat>")
+  debug_502:
     $I10 = self.'from'()
     ne $I10, -1, rxscan294_done
     goto rxscan294_scan
@@ -4293,11 +4552,15 @@
 .annotate 'line', 175
   # rx pass
     rx291_cur."!cursor_pass"(rx291_pos, "statement_control:sym<repeat>")
-    rx291_cur."!cursor_debug"("PASS  ", "statement_control:sym<repeat>", " at pos=", rx291_pos)
+    if_null rx291_debug, debug_503
+    rx291_cur."!cursor_debug"("PASS", "statement_control:sym<repeat>", " at pos=", rx291_pos)
+  debug_503:
     .return (rx291_cur)
   rx291_restart:
 .annotate 'line', 4
-    rx291_cur."!cursor_debug"("NEXT ", "statement_control:sym<repeat>")
+    if_null rx291_debug, debug_504
+    rx291_cur."!cursor_debug"("NEXT", "statement_control:sym<repeat>")
+  debug_504:
   rx291_fail:
     (rx291_rep, rx291_pos, $I10, $P10) = rx291_cur."!mark_fail"(0)
     lt rx291_pos, -1, rx291_done
@@ -4305,14 +4568,16 @@
     jump $I10
   rx291_done:
     rx291_cur."!cursor_fail"()
-    rx291_cur."!cursor_debug"("FAIL  ", "statement_control:sym<repeat>")
+    if_null rx291_debug, debug_505
+    rx291_cur."!cursor_debug"("FAIL", "statement_control:sym<repeat>")
+  debug_505:
     .return (rx291_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_control:sym<repeat>"  :subid("70_1280467477.44751") :method
+.sub "!PREFIX__statement_control:sym<repeat>"  :subid("70_1284728478.15265") :method
 .annotate 'line', 4
     new $P293, "ResizablePMCArray"
     push $P293, "repeat"
@@ -4321,7 +4586,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_control:sym<for>"  :subid("71_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_control:sym<for>"  :subid("71_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx311_tgt
     .local int rx311_pos
@@ -4329,7 +4594,9 @@
     .local int rx311_eos
     .local int rx311_rep
     .local pmc rx311_cur
+    .local pmc rx311_debug
     (rx311_cur, rx311_pos, rx311_tgt, $I10) = self."!cursor_start"()
+    getattribute rx311_debug, rx311_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx311_cur
     .local pmc match
     .lex "$/", match
@@ -4341,7 +4608,9 @@
     substr rx311_tgt, rx311_tgt, rx311_off
   rx311_start:
     eq $I10, 1, rx311_restart
-    rx311_cur."!cursor_debug"("START ", "statement_control:sym<for>")
+    if_null rx311_debug, debug_506
+    rx311_cur."!cursor_debug"("START", "statement_control:sym<for>")
+  debug_506:
     $I10 = self.'from'()
     ne $I10, -1, rxscan314_done
     goto rxscan314_scan
@@ -4403,11 +4672,15 @@
 .annotate 'line', 183
   # rx pass
     rx311_cur."!cursor_pass"(rx311_pos, "statement_control:sym<for>")
-    rx311_cur."!cursor_debug"("PASS  ", "statement_control:sym<for>", " at pos=", rx311_pos)
+    if_null rx311_debug, debug_507
+    rx311_cur."!cursor_debug"("PASS", "statement_control:sym<for>", " at pos=", rx311_pos)
+  debug_507:
     .return (rx311_cur)
   rx311_restart:
 .annotate 'line', 4
-    rx311_cur."!cursor_debug"("NEXT ", "statement_control:sym<for>")
+    if_null rx311_debug, debug_508
+    rx311_cur."!cursor_debug"("NEXT", "statement_control:sym<for>")
+  debug_508:
   rx311_fail:
     (rx311_rep, rx311_pos, $I10, $P10) = rx311_cur."!mark_fail"(0)
     lt rx311_pos, -1, rx311_done
@@ -4415,14 +4688,16 @@
     jump $I10
   rx311_done:
     rx311_cur."!cursor_fail"()
-    rx311_cur."!cursor_debug"("FAIL  ", "statement_control:sym<for>")
+    if_null rx311_debug, debug_509
+    rx311_cur."!cursor_debug"("FAIL", "statement_control:sym<for>")
+  debug_509:
     .return (rx311_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_control:sym<for>"  :subid("72_1280467477.44751") :method
+.sub "!PREFIX__statement_control:sym<for>"  :subid("72_1284728478.15265") :method
 .annotate 'line', 4
     new $P313, "ResizablePMCArray"
     push $P313, "for"
@@ -4431,7 +4706,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_control:sym<CATCH>"  :subid("73_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_control:sym<CATCH>"  :subid("73_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx319_tgt
     .local int rx319_pos
@@ -4439,7 +4714,9 @@
     .local int rx319_eos
     .local int rx319_rep
     .local pmc rx319_cur
+    .local pmc rx319_debug
     (rx319_cur, rx319_pos, rx319_tgt, $I10) = self."!cursor_start"()
+    getattribute rx319_debug, rx319_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx319_cur
     .local pmc match
     .lex "$/", match
@@ -4451,7 +4728,9 @@
     substr rx319_tgt, rx319_tgt, rx319_off
   rx319_start:
     eq $I10, 1, rx319_restart
-    rx319_cur."!cursor_debug"("START ", "statement_control:sym<CATCH>")
+    if_null rx319_debug, debug_510
+    rx319_cur."!cursor_debug"("START", "statement_control:sym<CATCH>")
+  debug_510:
     $I10 = self.'from'()
     ne $I10, -1, rxscan322_done
     goto rxscan322_scan
@@ -4513,11 +4792,15 @@
 .annotate 'line', 188
   # rx pass
     rx319_cur."!cursor_pass"(rx319_pos, "statement_control:sym<CATCH>")
-    rx319_cur."!cursor_debug"("PASS  ", "statement_control:sym<CATCH>", " at pos=", rx319_pos)
+    if_null rx319_debug, debug_511
+    rx319_cur."!cursor_debug"("PASS", "statement_control:sym<CATCH>", " at pos=", rx319_pos)
+  debug_511:
     .return (rx319_cur)
   rx319_restart:
 .annotate 'line', 4
-    rx319_cur."!cursor_debug"("NEXT ", "statement_control:sym<CATCH>")
+    if_null rx319_debug, debug_512
+    rx319_cur."!cursor_debug"("NEXT", "statement_control:sym<CATCH>")
+  debug_512:
   rx319_fail:
     (rx319_rep, rx319_pos, $I10, $P10) = rx319_cur."!mark_fail"(0)
     lt rx319_pos, -1, rx319_done
@@ -4525,14 +4808,16 @@
     jump $I10
   rx319_done:
     rx319_cur."!cursor_fail"()
-    rx319_cur."!cursor_debug"("FAIL  ", "statement_control:sym<CATCH>")
+    if_null rx319_debug, debug_513
+    rx319_cur."!cursor_debug"("FAIL", "statement_control:sym<CATCH>")
+  debug_513:
     .return (rx319_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_control:sym<CATCH>"  :subid("74_1280467477.44751") :method
+.sub "!PREFIX__statement_control:sym<CATCH>"  :subid("74_1284728478.15265") :method
 .annotate 'line', 4
     new $P321, "ResizablePMCArray"
     push $P321, "CATCH"
@@ -4541,7 +4826,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_control:sym<CONTROL>"  :subid("75_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_control:sym<CONTROL>"  :subid("75_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx327_tgt
     .local int rx327_pos
@@ -4549,7 +4834,9 @@
     .local int rx327_eos
     .local int rx327_rep
     .local pmc rx327_cur
+    .local pmc rx327_debug
     (rx327_cur, rx327_pos, rx327_tgt, $I10) = self."!cursor_start"()
+    getattribute rx327_debug, rx327_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx327_cur
     .local pmc match
     .lex "$/", match
@@ -4561,7 +4848,9 @@
     substr rx327_tgt, rx327_tgt, rx327_off
   rx327_start:
     eq $I10, 1, rx327_restart
-    rx327_cur."!cursor_debug"("START ", "statement_control:sym<CONTROL>")
+    if_null rx327_debug, debug_514
+    rx327_cur."!cursor_debug"("START", "statement_control:sym<CONTROL>")
+  debug_514:
     $I10 = self.'from'()
     ne $I10, -1, rxscan330_done
     goto rxscan330_scan
@@ -4623,11 +4912,15 @@
 .annotate 'line', 193
   # rx pass
     rx327_cur."!cursor_pass"(rx327_pos, "statement_control:sym<CONTROL>")
-    rx327_cur."!cursor_debug"("PASS  ", "statement_control:sym<CONTROL>", " at pos=", rx327_pos)
+    if_null rx327_debug, debug_515
+    rx327_cur."!cursor_debug"("PASS", "statement_control:sym<CONTROL>", " at pos=", rx327_pos)
+  debug_515:
     .return (rx327_cur)
   rx327_restart:
 .annotate 'line', 4
-    rx327_cur."!cursor_debug"("NEXT ", "statement_control:sym<CONTROL>")
+    if_null rx327_debug, debug_516
+    rx327_cur."!cursor_debug"("NEXT", "statement_control:sym<CONTROL>")
+  debug_516:
   rx327_fail:
     (rx327_rep, rx327_pos, $I10, $P10) = rx327_cur."!mark_fail"(0)
     lt rx327_pos, -1, rx327_done
@@ -4635,14 +4928,16 @@
     jump $I10
   rx327_done:
     rx327_cur."!cursor_fail"()
-    rx327_cur."!cursor_debug"("FAIL  ", "statement_control:sym<CONTROL>")
+    if_null rx327_debug, debug_517
+    rx327_cur."!cursor_debug"("FAIL", "statement_control:sym<CONTROL>")
+  debug_517:
     .return (rx327_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_control:sym<CONTROL>"  :subid("76_1280467477.44751") :method
+.sub "!PREFIX__statement_control:sym<CONTROL>"  :subid("76_1284728478.15265") :method
 .annotate 'line', 4
     new $P329, "ResizablePMCArray"
     push $P329, "CONTROL"
@@ -4651,7 +4946,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_prefix"  :subid("77_1280467477.44751") :method
+.sub "statement_prefix"  :subid("77_1284728478.15265") :method
 .annotate 'line', 198
     $P335 = self."!protoregex"("statement_prefix")
     .return ($P335)
@@ -4659,7 +4954,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_prefix"  :subid("78_1280467477.44751") :method
+.sub "!PREFIX__statement_prefix"  :subid("78_1284728478.15265") :method
 .annotate 'line', 198
     $P337 = self."!PREFIX__!protoregex"("statement_prefix")
     .return ($P337)
@@ -4667,7 +4962,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_prefix:sym<INIT>"  :subid("79_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_prefix:sym<INIT>"  :subid("79_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx339_tgt
     .local int rx339_pos
@@ -4675,7 +4970,9 @@
     .local int rx339_eos
     .local int rx339_rep
     .local pmc rx339_cur
+    .local pmc rx339_debug
     (rx339_cur, rx339_pos, rx339_tgt, $I10) = self."!cursor_start"()
+    getattribute rx339_debug, rx339_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx339_cur
     .local pmc match
     .lex "$/", match
@@ -4687,7 +4984,9 @@
     substr rx339_tgt, rx339_tgt, rx339_off
   rx339_start:
     eq $I10, 1, rx339_restart
-    rx339_cur."!cursor_debug"("START ", "statement_prefix:sym<INIT>")
+    if_null rx339_debug, debug_518
+    rx339_cur."!cursor_debug"("START", "statement_prefix:sym<INIT>")
+  debug_518:
     $I10 = self.'from'()
     ne $I10, -1, rxscan343_done
     goto rxscan343_scan
@@ -4731,11 +5030,15 @@
     rx339_pos = $P10."pos"()
   # rx pass
     rx339_cur."!cursor_pass"(rx339_pos, "statement_prefix:sym<INIT>")
-    rx339_cur."!cursor_debug"("PASS  ", "statement_prefix:sym<INIT>", " at pos=", rx339_pos)
+    if_null rx339_debug, debug_519
+    rx339_cur."!cursor_debug"("PASS", "statement_prefix:sym<INIT>", " at pos=", rx339_pos)
+  debug_519:
     .return (rx339_cur)
   rx339_restart:
 .annotate 'line', 4
-    rx339_cur."!cursor_debug"("NEXT ", "statement_prefix:sym<INIT>")
+    if_null rx339_debug, debug_520
+    rx339_cur."!cursor_debug"("NEXT", "statement_prefix:sym<INIT>")
+  debug_520:
   rx339_fail:
     (rx339_rep, rx339_pos, $I10, $P10) = rx339_cur."!mark_fail"(0)
     lt rx339_pos, -1, rx339_done
@@ -4743,14 +5046,16 @@
     jump $I10
   rx339_done:
     rx339_cur."!cursor_fail"()
-    rx339_cur."!cursor_debug"("FAIL  ", "statement_prefix:sym<INIT>")
+    if_null rx339_debug, debug_521
+    rx339_cur."!cursor_debug"("FAIL", "statement_prefix:sym<INIT>")
+  debug_521:
     .return (rx339_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_prefix:sym<INIT>"  :subid("80_1280467477.44751") :method
+.sub "!PREFIX__statement_prefix:sym<INIT>"  :subid("80_1284728478.15265") :method
 .annotate 'line', 4
     $P341 = self."!PREFIX__!subrule"("blorst", "INIT")
     new $P342, "ResizablePMCArray"
@@ -4760,7 +5065,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_prefix:sym<try>"  :subid("81_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_prefix:sym<try>"  :subid("81_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx346_tgt
     .local int rx346_pos
@@ -4768,7 +5073,9 @@
     .local int rx346_eos
     .local int rx346_rep
     .local pmc rx346_cur
+    .local pmc rx346_debug
     (rx346_cur, rx346_pos, rx346_tgt, $I10) = self."!cursor_start"()
+    getattribute rx346_debug, rx346_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx346_cur
     .local pmc match
     .lex "$/", match
@@ -4780,7 +5087,9 @@
     substr rx346_tgt, rx346_tgt, rx346_off
   rx346_start:
     eq $I10, 1, rx346_restart
-    rx346_cur."!cursor_debug"("START ", "statement_prefix:sym<try>")
+    if_null rx346_debug, debug_522
+    rx346_cur."!cursor_debug"("START", "statement_prefix:sym<try>")
+  debug_522:
     $I10 = self.'from'()
     ne $I10, -1, rxscan350_done
     goto rxscan350_scan
@@ -4826,11 +5135,15 @@
 .annotate 'line', 201
   # rx pass
     rx346_cur."!cursor_pass"(rx346_pos, "statement_prefix:sym<try>")
-    rx346_cur."!cursor_debug"("PASS  ", "statement_prefix:sym<try>", " at pos=", rx346_pos)
+    if_null rx346_debug, debug_523
+    rx346_cur."!cursor_debug"("PASS", "statement_prefix:sym<try>", " at pos=", rx346_pos)
+  debug_523:
     .return (rx346_cur)
   rx346_restart:
 .annotate 'line', 4
-    rx346_cur."!cursor_debug"("NEXT ", "statement_prefix:sym<try>")
+    if_null rx346_debug, debug_524
+    rx346_cur."!cursor_debug"("NEXT", "statement_prefix:sym<try>")
+  debug_524:
   rx346_fail:
     (rx346_rep, rx346_pos, $I10, $P10) = rx346_cur."!mark_fail"(0)
     lt rx346_pos, -1, rx346_done
@@ -4838,14 +5151,16 @@
     jump $I10
   rx346_done:
     rx346_cur."!cursor_fail"()
-    rx346_cur."!cursor_debug"("FAIL  ", "statement_prefix:sym<try>")
+    if_null rx346_debug, debug_525
+    rx346_cur."!cursor_debug"("FAIL", "statement_prefix:sym<try>")
+  debug_525:
     .return (rx346_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_prefix:sym<try>"  :subid("82_1280467477.44751") :method
+.sub "!PREFIX__statement_prefix:sym<try>"  :subid("82_1284728478.15265") :method
 .annotate 'line', 4
     $P348 = self."!PREFIX__!subrule"("blorst", "try")
     new $P349, "ResizablePMCArray"
@@ -4855,7 +5170,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "blorst"  :subid("83_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "blorst"  :subid("83_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx353_tgt
     .local int rx353_pos
@@ -4863,7 +5178,9 @@
     .local int rx353_eos
     .local int rx353_rep
     .local pmc rx353_cur
+    .local pmc rx353_debug
     (rx353_cur, rx353_pos, rx353_tgt, $I10) = self."!cursor_start"()
+    getattribute rx353_debug, rx353_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx353_cur
     .local pmc match
     .lex "$/", match
@@ -4875,7 +5192,9 @@
     substr rx353_tgt, rx353_tgt, rx353_off
   rx353_start:
     eq $I10, 1, rx353_restart
-    rx353_cur."!cursor_debug"("START ", "blorst")
+    if_null rx353_debug, debug_526
+    rx353_cur."!cursor_debug"("START", "blorst")
+  debug_526:
     $I10 = self.'from'()
     ne $I10, -1, rxscan356_done
     goto rxscan356_scan
@@ -4904,7 +5223,6 @@
     set_addr $I10, alt357_1
     rx353_cur."!mark_push"(0, rx353_pos, $I10)
   # rx enumcharlist negate=0 zerowidth
-    ge rx353_pos, rx353_eos, rx353_fail
     sub $I10, rx353_pos, rx353_off
     substr $S10, rx353_tgt, $I10, 1
     index $I11, "{", $S10
@@ -4929,11 +5247,15 @@
 .annotate 'line', 206
   # rx pass
     rx353_cur."!cursor_pass"(rx353_pos, "blorst")
-    rx353_cur."!cursor_debug"("PASS  ", "blorst", " at pos=", rx353_pos)
+    if_null rx353_debug, debug_527
+    rx353_cur."!cursor_debug"("PASS", "blorst", " at pos=", rx353_pos)
+  debug_527:
     .return (rx353_cur)
   rx353_restart:
 .annotate 'line', 4
-    rx353_cur."!cursor_debug"("NEXT ", "blorst")
+    if_null rx353_debug, debug_528
+    rx353_cur."!cursor_debug"("NEXT", "blorst")
+  debug_528:
   rx353_fail:
     (rx353_rep, rx353_pos, $I10, $P10) = rx353_cur."!mark_fail"(0)
     lt rx353_pos, -1, rx353_done
@@ -4941,14 +5263,16 @@
     jump $I10
   rx353_done:
     rx353_cur."!cursor_fail"()
-    rx353_cur."!cursor_debug"("FAIL  ", "blorst")
+    if_null rx353_debug, debug_529
+    rx353_cur."!cursor_debug"("FAIL", "blorst")
+  debug_529:
     .return (rx353_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__blorst"  :subid("84_1280467477.44751") :method
+.sub "!PREFIX__blorst"  :subid("84_1284728478.15265") :method
 .annotate 'line', 4
     new $P355, "ResizablePMCArray"
     push $P355, ""
@@ -4957,7 +5281,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_mod_cond"  :subid("85_1280467477.44751") :method
+.sub "statement_mod_cond"  :subid("85_1284728478.15265") :method
 .annotate 'line', 212
     $P359 = self."!protoregex"("statement_mod_cond")
     .return ($P359)
@@ -4965,7 +5289,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_mod_cond"  :subid("86_1280467477.44751") :method
+.sub "!PREFIX__statement_mod_cond"  :subid("86_1284728478.15265") :method
 .annotate 'line', 212
     $P361 = self."!PREFIX__!protoregex"("statement_mod_cond")
     .return ($P361)
@@ -4973,7 +5297,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_mod_cond:sym<if>"  :subid("87_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_mod_cond:sym<if>"  :subid("87_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx363_tgt
     .local int rx363_pos
@@ -4981,7 +5305,9 @@
     .local int rx363_eos
     .local int rx363_rep
     .local pmc rx363_cur
+    .local pmc rx363_debug
     (rx363_cur, rx363_pos, rx363_tgt, $I10) = self."!cursor_start"()
+    getattribute rx363_debug, rx363_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx363_cur
     .local pmc match
     .lex "$/", match
@@ -4993,7 +5319,9 @@
     substr rx363_tgt, rx363_tgt, rx363_off
   rx363_start:
     eq $I10, 1, rx363_restart
-    rx363_cur."!cursor_debug"("START ", "statement_mod_cond:sym<if>")
+    if_null rx363_debug, debug_530
+    rx363_cur."!cursor_debug"("START", "statement_mod_cond:sym<if>")
+  debug_530:
     $I10 = self.'from'()
     ne $I10, -1, rxscan367_done
     goto rxscan367_scan
@@ -5047,11 +5375,15 @@
     rx363_pos = $P10."pos"()
   # rx pass
     rx363_cur."!cursor_pass"(rx363_pos, "statement_mod_cond:sym<if>")
-    rx363_cur."!cursor_debug"("PASS  ", "statement_mod_cond:sym<if>", " at pos=", rx363_pos)
+    if_null rx363_debug, debug_531
+    rx363_cur."!cursor_debug"("PASS", "statement_mod_cond:sym<if>", " at pos=", rx363_pos)
+  debug_531:
     .return (rx363_cur)
   rx363_restart:
 .annotate 'line', 4
-    rx363_cur."!cursor_debug"("NEXT ", "statement_mod_cond:sym<if>")
+    if_null rx363_debug, debug_532
+    rx363_cur."!cursor_debug"("NEXT", "statement_mod_cond:sym<if>")
+  debug_532:
   rx363_fail:
     (rx363_rep, rx363_pos, $I10, $P10) = rx363_cur."!mark_fail"(0)
     lt rx363_pos, -1, rx363_done
@@ -5059,14 +5391,16 @@
     jump $I10
   rx363_done:
     rx363_cur."!cursor_fail"()
-    rx363_cur."!cursor_debug"("FAIL  ", "statement_mod_cond:sym<if>")
+    if_null rx363_debug, debug_533
+    rx363_cur."!cursor_debug"("FAIL", "statement_mod_cond:sym<if>")
+  debug_533:
     .return (rx363_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_mod_cond:sym<if>"  :subid("88_1280467477.44751") :method
+.sub "!PREFIX__statement_mod_cond:sym<if>"  :subid("88_1284728478.15265") :method
 .annotate 'line', 4
     $P365 = self."!PREFIX__!subrule"("ws", "if")
     new $P366, "ResizablePMCArray"
@@ -5076,7 +5410,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_mod_cond:sym<unless>"  :subid("89_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_mod_cond:sym<unless>"  :subid("89_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx372_tgt
     .local int rx372_pos
@@ -5084,7 +5418,9 @@
     .local int rx372_eos
     .local int rx372_rep
     .local pmc rx372_cur
+    .local pmc rx372_debug
     (rx372_cur, rx372_pos, rx372_tgt, $I10) = self."!cursor_start"()
+    getattribute rx372_debug, rx372_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx372_cur
     .local pmc match
     .lex "$/", match
@@ -5096,7 +5432,9 @@
     substr rx372_tgt, rx372_tgt, rx372_off
   rx372_start:
     eq $I10, 1, rx372_restart
-    rx372_cur."!cursor_debug"("START ", "statement_mod_cond:sym<unless>")
+    if_null rx372_debug, debug_534
+    rx372_cur."!cursor_debug"("START", "statement_mod_cond:sym<unless>")
+  debug_534:
     $I10 = self.'from'()
     ne $I10, -1, rxscan376_done
     goto rxscan376_scan
@@ -5150,11 +5488,15 @@
     rx372_pos = $P10."pos"()
   # rx pass
     rx372_cur."!cursor_pass"(rx372_pos, "statement_mod_cond:sym<unless>")
-    rx372_cur."!cursor_debug"("PASS  ", "statement_mod_cond:sym<unless>", " at pos=", rx372_pos)
+    if_null rx372_debug, debug_535
+    rx372_cur."!cursor_debug"("PASS", "statement_mod_cond:sym<unless>", " at pos=", rx372_pos)
+  debug_535:
     .return (rx372_cur)
   rx372_restart:
 .annotate 'line', 4
-    rx372_cur."!cursor_debug"("NEXT ", "statement_mod_cond:sym<unless>")
+    if_null rx372_debug, debug_536
+    rx372_cur."!cursor_debug"("NEXT", "statement_mod_cond:sym<unless>")
+  debug_536:
   rx372_fail:
     (rx372_rep, rx372_pos, $I10, $P10) = rx372_cur."!mark_fail"(0)
     lt rx372_pos, -1, rx372_done
@@ -5162,14 +5504,16 @@
     jump $I10
   rx372_done:
     rx372_cur."!cursor_fail"()
-    rx372_cur."!cursor_debug"("FAIL  ", "statement_mod_cond:sym<unless>")
+    if_null rx372_debug, debug_537
+    rx372_cur."!cursor_debug"("FAIL", "statement_mod_cond:sym<unless>")
+  debug_537:
     .return (rx372_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_mod_cond:sym<unless>"  :subid("90_1280467477.44751") :method
+.sub "!PREFIX__statement_mod_cond:sym<unless>"  :subid("90_1284728478.15265") :method
 .annotate 'line', 4
     $P374 = self."!PREFIX__!subrule"("ws", "unless")
     new $P375, "ResizablePMCArray"
@@ -5179,7 +5523,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_mod_loop"  :subid("91_1280467477.44751") :method
+.sub "statement_mod_loop"  :subid("91_1284728478.15265") :method
 .annotate 'line', 217
     $P381 = self."!protoregex"("statement_mod_loop")
     .return ($P381)
@@ -5187,7 +5531,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_mod_loop"  :subid("92_1280467477.44751") :method
+.sub "!PREFIX__statement_mod_loop"  :subid("92_1284728478.15265") :method
 .annotate 'line', 217
     $P383 = self."!PREFIX__!protoregex"("statement_mod_loop")
     .return ($P383)
@@ -5195,7 +5539,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_mod_loop:sym<while>"  :subid("93_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_mod_loop:sym<while>"  :subid("93_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx385_tgt
     .local int rx385_pos
@@ -5203,7 +5547,9 @@
     .local int rx385_eos
     .local int rx385_rep
     .local pmc rx385_cur
+    .local pmc rx385_debug
     (rx385_cur, rx385_pos, rx385_tgt, $I10) = self."!cursor_start"()
+    getattribute rx385_debug, rx385_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx385_cur
     .local pmc match
     .lex "$/", match
@@ -5215,7 +5561,9 @@
     substr rx385_tgt, rx385_tgt, rx385_off
   rx385_start:
     eq $I10, 1, rx385_restart
-    rx385_cur."!cursor_debug"("START ", "statement_mod_loop:sym<while>")
+    if_null rx385_debug, debug_538
+    rx385_cur."!cursor_debug"("START", "statement_mod_loop:sym<while>")
+  debug_538:
     $I10 = self.'from'()
     ne $I10, -1, rxscan389_done
     goto rxscan389_scan
@@ -5269,11 +5617,15 @@
     rx385_pos = $P10."pos"()
   # rx pass
     rx385_cur."!cursor_pass"(rx385_pos, "statement_mod_loop:sym<while>")
-    rx385_cur."!cursor_debug"("PASS  ", "statement_mod_loop:sym<while>", " at pos=", rx385_pos)
+    if_null rx385_debug, debug_539
+    rx385_cur."!cursor_debug"("PASS", "statement_mod_loop:sym<while>", " at pos=", rx385_pos)
+  debug_539:
     .return (rx385_cur)
   rx385_restart:
 .annotate 'line', 4
-    rx385_cur."!cursor_debug"("NEXT ", "statement_mod_loop:sym<while>")
+    if_null rx385_debug, debug_540
+    rx385_cur."!cursor_debug"("NEXT", "statement_mod_loop:sym<while>")
+  debug_540:
   rx385_fail:
     (rx385_rep, rx385_pos, $I10, $P10) = rx385_cur."!mark_fail"(0)
     lt rx385_pos, -1, rx385_done
@@ -5281,14 +5633,16 @@
     jump $I10
   rx385_done:
     rx385_cur."!cursor_fail"()
-    rx385_cur."!cursor_debug"("FAIL  ", "statement_mod_loop:sym<while>")
+    if_null rx385_debug, debug_541
+    rx385_cur."!cursor_debug"("FAIL", "statement_mod_loop:sym<while>")
+  debug_541:
     .return (rx385_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_mod_loop:sym<while>"  :subid("94_1280467477.44751") :method
+.sub "!PREFIX__statement_mod_loop:sym<while>"  :subid("94_1284728478.15265") :method
 .annotate 'line', 4
     $P387 = self."!PREFIX__!subrule"("ws", "while")
     new $P388, "ResizablePMCArray"
@@ -5298,7 +5652,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_mod_loop:sym<until>"  :subid("95_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_mod_loop:sym<until>"  :subid("95_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx394_tgt
     .local int rx394_pos
@@ -5306,7 +5660,9 @@
     .local int rx394_eos
     .local int rx394_rep
     .local pmc rx394_cur
+    .local pmc rx394_debug
     (rx394_cur, rx394_pos, rx394_tgt, $I10) = self."!cursor_start"()
+    getattribute rx394_debug, rx394_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx394_cur
     .local pmc match
     .lex "$/", match
@@ -5318,7 +5674,9 @@
     substr rx394_tgt, rx394_tgt, rx394_off
   rx394_start:
     eq $I10, 1, rx394_restart
-    rx394_cur."!cursor_debug"("START ", "statement_mod_loop:sym<until>")
+    if_null rx394_debug, debug_542
+    rx394_cur."!cursor_debug"("START", "statement_mod_loop:sym<until>")
+  debug_542:
     $I10 = self.'from'()
     ne $I10, -1, rxscan398_done
     goto rxscan398_scan
@@ -5372,11 +5730,15 @@
     rx394_pos = $P10."pos"()
   # rx pass
     rx394_cur."!cursor_pass"(rx394_pos, "statement_mod_loop:sym<until>")
-    rx394_cur."!cursor_debug"("PASS  ", "statement_mod_loop:sym<until>", " at pos=", rx394_pos)
+    if_null rx394_debug, debug_543
+    rx394_cur."!cursor_debug"("PASS", "statement_mod_loop:sym<until>", " at pos=", rx394_pos)
+  debug_543:
     .return (rx394_cur)
   rx394_restart:
 .annotate 'line', 4
-    rx394_cur."!cursor_debug"("NEXT ", "statement_mod_loop:sym<until>")
+    if_null rx394_debug, debug_544
+    rx394_cur."!cursor_debug"("NEXT", "statement_mod_loop:sym<until>")
+  debug_544:
   rx394_fail:
     (rx394_rep, rx394_pos, $I10, $P10) = rx394_cur."!mark_fail"(0)
     lt rx394_pos, -1, rx394_done
@@ -5384,14 +5746,16 @@
     jump $I10
   rx394_done:
     rx394_cur."!cursor_fail"()
-    rx394_cur."!cursor_debug"("FAIL  ", "statement_mod_loop:sym<until>")
+    if_null rx394_debug, debug_545
+    rx394_cur."!cursor_debug"("FAIL", "statement_mod_loop:sym<until>")
+  debug_545:
     .return (rx394_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_mod_loop:sym<until>"  :subid("96_1280467477.44751") :method
+.sub "!PREFIX__statement_mod_loop:sym<until>"  :subid("96_1284728478.15265") :method
 .annotate 'line', 4
     $P396 = self."!PREFIX__!subrule"("ws", "until")
     new $P397, "ResizablePMCArray"
@@ -5401,7 +5765,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "statement_mod_loop:sym<for>"  :subid("97_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "statement_mod_loop:sym<for>"  :subid("97_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx403_tgt
     .local int rx403_pos
@@ -5409,7 +5773,9 @@
     .local int rx403_eos
     .local int rx403_rep
     .local pmc rx403_cur
+    .local pmc rx403_debug
     (rx403_cur, rx403_pos, rx403_tgt, $I10) = self."!cursor_start"()
+    getattribute rx403_debug, rx403_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx403_cur
     .local pmc match
     .lex "$/", match
@@ -5421,7 +5787,9 @@
     substr rx403_tgt, rx403_tgt, rx403_off
   rx403_start:
     eq $I10, 1, rx403_restart
-    rx403_cur."!cursor_debug"("START ", "statement_mod_loop:sym<for>")
+    if_null rx403_debug, debug_546
+    rx403_cur."!cursor_debug"("START", "statement_mod_loop:sym<for>")
+  debug_546:
     $I10 = self.'from'()
     ne $I10, -1, rxscan407_done
     goto rxscan407_scan
@@ -5475,11 +5843,15 @@
     rx403_pos = $P10."pos"()
   # rx pass
     rx403_cur."!cursor_pass"(rx403_pos, "statement_mod_loop:sym<for>")
-    rx403_cur."!cursor_debug"("PASS  ", "statement_mod_loop:sym<for>", " at pos=", rx403_pos)
+    if_null rx403_debug, debug_547
+    rx403_cur."!cursor_debug"("PASS", "statement_mod_loop:sym<for>", " at pos=", rx403_pos)
+  debug_547:
     .return (rx403_cur)
   rx403_restart:
 .annotate 'line', 4
-    rx403_cur."!cursor_debug"("NEXT ", "statement_mod_loop:sym<for>")
+    if_null rx403_debug, debug_548
+    rx403_cur."!cursor_debug"("NEXT", "statement_mod_loop:sym<for>")
+  debug_548:
   rx403_fail:
     (rx403_rep, rx403_pos, $I10, $P10) = rx403_cur."!mark_fail"(0)
     lt rx403_pos, -1, rx403_done
@@ -5487,14 +5859,16 @@
     jump $I10
   rx403_done:
     rx403_cur."!cursor_fail"()
-    rx403_cur."!cursor_debug"("FAIL  ", "statement_mod_loop:sym<for>")
+    if_null rx403_debug, debug_549
+    rx403_cur."!cursor_debug"("FAIL", "statement_mod_loop:sym<for>")
+  debug_549:
     .return (rx403_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__statement_mod_loop:sym<for>"  :subid("98_1280467477.44751") :method
+.sub "!PREFIX__statement_mod_loop:sym<for>"  :subid("98_1284728478.15265") :method
 .annotate 'line', 4
     $P405 = self."!PREFIX__!subrule"("ws", "for")
     new $P406, "ResizablePMCArray"
@@ -5504,7 +5878,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "term:sym<fatarrow>"  :subid("99_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "term:sym<fatarrow>"  :subid("99_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx412_tgt
     .local int rx412_pos
@@ -5512,7 +5886,9 @@
     .local int rx412_eos
     .local int rx412_rep
     .local pmc rx412_cur
+    .local pmc rx412_debug
     (rx412_cur, rx412_pos, rx412_tgt, $I10) = self."!cursor_start"()
+    getattribute rx412_debug, rx412_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx412_cur
     .local pmc match
     .lex "$/", match
@@ -5524,7 +5900,9 @@
     substr rx412_tgt, rx412_tgt, rx412_off
   rx412_start:
     eq $I10, 1, rx412_restart
-    rx412_cur."!cursor_debug"("START ", "term:sym<fatarrow>")
+    if_null rx412_debug, debug_550
+    rx412_cur."!cursor_debug"("START", "term:sym<fatarrow>")
+  debug_550:
     $I10 = self.'from'()
     ne $I10, -1, rxscan416_done
     goto rxscan416_scan
@@ -5547,11 +5925,15 @@
     rx412_pos = $P10."pos"()
   # rx pass
     rx412_cur."!cursor_pass"(rx412_pos, "term:sym<fatarrow>")
-    rx412_cur."!cursor_debug"("PASS  ", "term:sym<fatarrow>", " at pos=", rx412_pos)
+    if_null rx412_debug, debug_551
+    rx412_cur."!cursor_debug"("PASS", "term:sym<fatarrow>", " at pos=", rx412_pos)
+  debug_551:
     .return (rx412_cur)
   rx412_restart:
 .annotate 'line', 4
-    rx412_cur."!cursor_debug"("NEXT ", "term:sym<fatarrow>")
+    if_null rx412_debug, debug_552
+    rx412_cur."!cursor_debug"("NEXT", "term:sym<fatarrow>")
+  debug_552:
   rx412_fail:
     (rx412_rep, rx412_pos, $I10, $P10) = rx412_cur."!mark_fail"(0)
     lt rx412_pos, -1, rx412_done
@@ -5559,14 +5941,16 @@
     jump $I10
   rx412_done:
     rx412_cur."!cursor_fail"()
-    rx412_cur."!cursor_debug"("FAIL  ", "term:sym<fatarrow>")
+    if_null rx412_debug, debug_553
+    rx412_cur."!cursor_debug"("FAIL", "term:sym<fatarrow>")
+  debug_553:
     .return (rx412_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__term:sym<fatarrow>"  :subid("100_1280467477.44751") :method
+.sub "!PREFIX__term:sym<fatarrow>"  :subid("100_1284728478.15265") :method
 .annotate 'line', 4
     $P414 = self."!PREFIX__!subrule"("fatarrow", "")
     new $P415, "ResizablePMCArray"
@@ -5576,7 +5960,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "term:sym<colonpair>"  :subid("101_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "term:sym<colonpair>"  :subid("101_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx418_tgt
     .local int rx418_pos
@@ -5584,7 +5968,9 @@
     .local int rx418_eos
     .local int rx418_rep
     .local pmc rx418_cur
+    .local pmc rx418_debug
     (rx418_cur, rx418_pos, rx418_tgt, $I10) = self."!cursor_start"()
+    getattribute rx418_debug, rx418_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx418_cur
     .local pmc match
     .lex "$/", match
@@ -5596,7 +5982,9 @@
     substr rx418_tgt, rx418_tgt, rx418_off
   rx418_start:
     eq $I10, 1, rx418_restart
-    rx418_cur."!cursor_debug"("START ", "term:sym<colonpair>")
+    if_null rx418_debug, debug_554
+    rx418_cur."!cursor_debug"("START", "term:sym<colonpair>")
+  debug_554:
     $I10 = self.'from'()
     ne $I10, -1, rxscan422_done
     goto rxscan422_scan
@@ -5619,11 +6007,15 @@
     rx418_pos = $P10."pos"()
   # rx pass
     rx418_cur."!cursor_pass"(rx418_pos, "term:sym<colonpair>")
-    rx418_cur."!cursor_debug"("PASS  ", "term:sym<colonpair>", " at pos=", rx418_pos)
+    if_null rx418_debug, debug_555
+    rx418_cur."!cursor_debug"("PASS", "term:sym<colonpair>", " at pos=", rx418_pos)
+  debug_555:
     .return (rx418_cur)
   rx418_restart:
 .annotate 'line', 4
-    rx418_cur."!cursor_debug"("NEXT ", "term:sym<colonpair>")
+    if_null rx418_debug, debug_556
+    rx418_cur."!cursor_debug"("NEXT", "term:sym<colonpair>")
+  debug_556:
   rx418_fail:
     (rx418_rep, rx418_pos, $I10, $P10) = rx418_cur."!mark_fail"(0)
     lt rx418_pos, -1, rx418_done
@@ -5631,14 +6023,16 @@
     jump $I10
   rx418_done:
     rx418_cur."!cursor_fail"()
-    rx418_cur."!cursor_debug"("FAIL  ", "term:sym<colonpair>")
+    if_null rx418_debug, debug_557
+    rx418_cur."!cursor_debug"("FAIL", "term:sym<colonpair>")
+  debug_557:
     .return (rx418_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__term:sym<colonpair>"  :subid("102_1280467477.44751") :method
+.sub "!PREFIX__term:sym<colonpair>"  :subid("102_1284728478.15265") :method
 .annotate 'line', 4
     $P420 = self."!PREFIX__!subrule"("colonpair", "")
     new $P421, "ResizablePMCArray"
@@ -5648,7 +6042,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "term:sym<variable>"  :subid("103_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "term:sym<variable>"  :subid("103_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx424_tgt
     .local int rx424_pos
@@ -5656,7 +6050,9 @@
     .local int rx424_eos
     .local int rx424_rep
     .local pmc rx424_cur
+    .local pmc rx424_debug
     (rx424_cur, rx424_pos, rx424_tgt, $I10) = self."!cursor_start"()
+    getattribute rx424_debug, rx424_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx424_cur
     .local pmc match
     .lex "$/", match
@@ -5668,7 +6064,9 @@
     substr rx424_tgt, rx424_tgt, rx424_off
   rx424_start:
     eq $I10, 1, rx424_restart
-    rx424_cur."!cursor_debug"("START ", "term:sym<variable>")
+    if_null rx424_debug, debug_558
+    rx424_cur."!cursor_debug"("START", "term:sym<variable>")
+  debug_558:
     $I10 = self.'from'()
     ne $I10, -1, rxscan428_done
     goto rxscan428_scan
@@ -5691,11 +6089,15 @@
     rx424_pos = $P10."pos"()
   # rx pass
     rx424_cur."!cursor_pass"(rx424_pos, "term:sym<variable>")
-    rx424_cur."!cursor_debug"("PASS  ", "term:sym<variable>", " at pos=", rx424_pos)
+    if_null rx424_debug, debug_559
+    rx424_cur."!cursor_debug"("PASS", "term:sym<variable>", " at pos=", rx424_pos)
+  debug_559:
     .return (rx424_cur)
   rx424_restart:
 .annotate 'line', 4
-    rx424_cur."!cursor_debug"("NEXT ", "term:sym<variable>")
+    if_null rx424_debug, debug_560
+    rx424_cur."!cursor_debug"("NEXT", "term:sym<variable>")
+  debug_560:
   rx424_fail:
     (rx424_rep, rx424_pos, $I10, $P10) = rx424_cur."!mark_fail"(0)
     lt rx424_pos, -1, rx424_done
@@ -5703,14 +6105,16 @@
     jump $I10
   rx424_done:
     rx424_cur."!cursor_fail"()
-    rx424_cur."!cursor_debug"("FAIL  ", "term:sym<variable>")
+    if_null rx424_debug, debug_561
+    rx424_cur."!cursor_debug"("FAIL", "term:sym<variable>")
+  debug_561:
     .return (rx424_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__term:sym<variable>"  :subid("104_1280467477.44751") :method
+.sub "!PREFIX__term:sym<variable>"  :subid("104_1284728478.15265") :method
 .annotate 'line', 4
     $P426 = self."!PREFIX__!subrule"("variable", "")
     new $P427, "ResizablePMCArray"
@@ -5720,7 +6124,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "term:sym<package_declarator>"  :subid("105_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "term:sym<package_declarator>"  :subid("105_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx430_tgt
     .local int rx430_pos
@@ -5728,7 +6132,9 @@
     .local int rx430_eos
     .local int rx430_rep
     .local pmc rx430_cur
+    .local pmc rx430_debug
     (rx430_cur, rx430_pos, rx430_tgt, $I10) = self."!cursor_start"()
+    getattribute rx430_debug, rx430_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx430_cur
     .local pmc match
     .lex "$/", match
@@ -5740,7 +6146,9 @@
     substr rx430_tgt, rx430_tgt, rx430_off
   rx430_start:
     eq $I10, 1, rx430_restart
-    rx430_cur."!cursor_debug"("START ", "term:sym<package_declarator>")
+    if_null rx430_debug, debug_562
+    rx430_cur."!cursor_debug"("START", "term:sym<package_declarator>")
+  debug_562:
     $I10 = self.'from'()
     ne $I10, -1, rxscan434_done
     goto rxscan434_scan
@@ -5763,11 +6171,15 @@
     rx430_pos = $P10."pos"()
   # rx pass
     rx430_cur."!cursor_pass"(rx430_pos, "term:sym<package_declarator>")
-    rx430_cur."!cursor_debug"("PASS  ", "term:sym<package_declarator>", " at pos=", rx430_pos)
+    if_null rx430_debug, debug_563
+    rx430_cur."!cursor_debug"("PASS", "term:sym<package_declarator>", " at pos=", rx430_pos)
+  debug_563:
     .return (rx430_cur)
   rx430_restart:
 .annotate 'line', 4
-    rx430_cur."!cursor_debug"("NEXT ", "term:sym<package_declarator>")
+    if_null rx430_debug, debug_564
+    rx430_cur."!cursor_debug"("NEXT", "term:sym<package_declarator>")
+  debug_564:
   rx430_fail:
     (rx430_rep, rx430_pos, $I10, $P10) = rx430_cur."!mark_fail"(0)
     lt rx430_pos, -1, rx430_done
@@ -5775,14 +6187,16 @@
     jump $I10
   rx430_done:
     rx430_cur."!cursor_fail"()
-    rx430_cur."!cursor_debug"("FAIL  ", "term:sym<package_declarator>")
+    if_null rx430_debug, debug_565
+    rx430_cur."!cursor_debug"("FAIL", "term:sym<package_declarator>")
+  debug_565:
     .return (rx430_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__term:sym<package_declarator>"  :subid("106_1280467477.44751") :method
+.sub "!PREFIX__term:sym<package_declarator>"  :subid("106_1284728478.15265") :method
 .annotate 'line', 4
     $P432 = self."!PREFIX__!subrule"("package_declarator", "")
     new $P433, "ResizablePMCArray"
@@ -5792,7 +6206,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "term:sym<scope_declarator>"  :subid("107_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "term:sym<scope_declarator>"  :subid("107_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx436_tgt
     .local int rx436_pos
@@ -5800,7 +6214,9 @@
     .local int rx436_eos
     .local int rx436_rep
     .local pmc rx436_cur
+    .local pmc rx436_debug
     (rx436_cur, rx436_pos, rx436_tgt, $I10) = self."!cursor_start"()
+    getattribute rx436_debug, rx436_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx436_cur
     .local pmc match
     .lex "$/", match
@@ -5812,7 +6228,9 @@
     substr rx436_tgt, rx436_tgt, rx436_off
   rx436_start:
     eq $I10, 1, rx436_restart
-    rx436_cur."!cursor_debug"("START ", "term:sym<scope_declarator>")
+    if_null rx436_debug, debug_566
+    rx436_cur."!cursor_debug"("START", "term:sym<scope_declarator>")
+  debug_566:
     $I10 = self.'from'()
     ne $I10, -1, rxscan440_done
     goto rxscan440_scan
@@ -5835,11 +6253,15 @@
     rx436_pos = $P10."pos"()
   # rx pass
     rx436_cur."!cursor_pass"(rx436_pos, "term:sym<scope_declarator>")
-    rx436_cur."!cursor_debug"("PASS  ", "term:sym<scope_declarator>", " at pos=", rx436_pos)
+    if_null rx436_debug, debug_567
+    rx436_cur."!cursor_debug"("PASS", "term:sym<scope_declarator>", " at pos=", rx436_pos)
+  debug_567:
     .return (rx436_cur)
   rx436_restart:
 .annotate 'line', 4
-    rx436_cur."!cursor_debug"("NEXT ", "term:sym<scope_declarator>")
+    if_null rx436_debug, debug_568
+    rx436_cur."!cursor_debug"("NEXT", "term:sym<scope_declarator>")
+  debug_568:
   rx436_fail:
     (rx436_rep, rx436_pos, $I10, $P10) = rx436_cur."!mark_fail"(0)
     lt rx436_pos, -1, rx436_done
@@ -5847,14 +6269,16 @@
     jump $I10
   rx436_done:
     rx436_cur."!cursor_fail"()
-    rx436_cur."!cursor_debug"("FAIL  ", "term:sym<scope_declarator>")
+    if_null rx436_debug, debug_569
+    rx436_cur."!cursor_debug"("FAIL", "term:sym<scope_declarator>")
+  debug_569:
     .return (rx436_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__term:sym<scope_declarator>"  :subid("108_1280467477.44751") :method
+.sub "!PREFIX__term:sym<scope_declarator>"  :subid("108_1284728478.15265") :method
 .annotate 'line', 4
     $P438 = self."!PREFIX__!subrule"("scope_declarator", "")
     new $P439, "ResizablePMCArray"
@@ -5864,7 +6288,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "term:sym<routine_declarator>"  :subid("109_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "term:sym<routine_declarator>"  :subid("109_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx442_tgt
     .local int rx442_pos
@@ -5872,7 +6296,9 @@
     .local int rx442_eos
     .local int rx442_rep
     .local pmc rx442_cur
+    .local pmc rx442_debug
     (rx442_cur, rx442_pos, rx442_tgt, $I10) = self."!cursor_start"()
+    getattribute rx442_debug, rx442_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx442_cur
     .local pmc match
     .lex "$/", match
@@ -5884,7 +6310,9 @@
     substr rx442_tgt, rx442_tgt, rx442_off
   rx442_start:
     eq $I10, 1, rx442_restart
-    rx442_cur."!cursor_debug"("START ", "term:sym<routine_declarator>")
+    if_null rx442_debug, debug_570
+    rx442_cur."!cursor_debug"("START", "term:sym<routine_declarator>")
+  debug_570:
     $I10 = self.'from'()
     ne $I10, -1, rxscan446_done
     goto rxscan446_scan
@@ -5907,11 +6335,15 @@
     rx442_pos = $P10."pos"()
   # rx pass
     rx442_cur."!cursor_pass"(rx442_pos, "term:sym<routine_declarator>")
-    rx442_cur."!cursor_debug"("PASS  ", "term:sym<routine_declarator>", " at pos=", rx442_pos)
+    if_null rx442_debug, debug_571
+    rx442_cur."!cursor_debug"("PASS", "term:sym<routine_declarator>", " at pos=", rx442_pos)
+  debug_571:
     .return (rx442_cur)
   rx442_restart:
 .annotate 'line', 4
-    rx442_cur."!cursor_debug"("NEXT ", "term:sym<routine_declarator>")
+    if_null rx442_debug, debug_572
+    rx442_cur."!cursor_debug"("NEXT", "term:sym<routine_declarator>")
+  debug_572:
   rx442_fail:
     (rx442_rep, rx442_pos, $I10, $P10) = rx442_cur."!mark_fail"(0)
     lt rx442_pos, -1, rx442_done
@@ -5919,14 +6351,16 @@
     jump $I10
   rx442_done:
     rx442_cur."!cursor_fail"()
-    rx442_cur."!cursor_debug"("FAIL  ", "term:sym<routine_declarator>")
+    if_null rx442_debug, debug_573
+    rx442_cur."!cursor_debug"("FAIL", "term:sym<routine_declarator>")
+  debug_573:
     .return (rx442_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__term:sym<routine_declarator>"  :subid("110_1280467477.44751") :method
+.sub "!PREFIX__term:sym<routine_declarator>"  :subid("110_1284728478.15265") :method
 .annotate 'line', 4
     $P444 = self."!PREFIX__!subrule"("routine_declarator", "")
     new $P445, "ResizablePMCArray"
@@ -5936,9 +6370,9 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "term:sym<multi_declarator>"  :subid("111_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "term:sym<multi_declarator>"  :subid("111_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
-    .const 'Sub' $P453 = "113_1280467477.44751" 
+    .const 'Sub' $P453 = "113_1284728478.15265" 
     capture_lex $P453
     .local string rx448_tgt
     .local int rx448_pos
@@ -5946,7 +6380,9 @@
     .local int rx448_eos
     .local int rx448_rep
     .local pmc rx448_cur
+    .local pmc rx448_debug
     (rx448_cur, rx448_pos, rx448_tgt, $I10) = self."!cursor_start"()
+    getattribute rx448_debug, rx448_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx448_cur
     .local pmc match
     .lex "$/", match
@@ -5958,7 +6394,9 @@
     substr rx448_tgt, rx448_tgt, rx448_off
   rx448_start:
     eq $I10, 1, rx448_restart
-    rx448_cur."!cursor_debug"("START ", "term:sym<multi_declarator>")
+    if_null rx448_debug, debug_574
+    rx448_cur."!cursor_debug"("START", "term:sym<multi_declarator>")
+  debug_574:
     $I10 = self.'from'()
     ne $I10, -1, rxscan451_done
     goto rxscan451_scan
@@ -5974,7 +6412,7 @@
 .annotate 'line', 231
   # rx subrule "before" subtype=zerowidth negate=
     rx448_cur."!cursor_pos"(rx448_pos)
-    .const 'Sub' $P453 = "113_1280467477.44751" 
+    .const 'Sub' $P453 = "113_1284728478.15265" 
     capture_lex $P453
     $P10 = rx448_cur."before"($P453)
     unless $P10, rx448_fail
@@ -5987,11 +6425,15 @@
     rx448_pos = $P10."pos"()
   # rx pass
     rx448_cur."!cursor_pass"(rx448_pos, "term:sym<multi_declarator>")
-    rx448_cur."!cursor_debug"("PASS  ", "term:sym<multi_declarator>", " at pos=", rx448_pos)
+    if_null rx448_debug, debug_579
+    rx448_cur."!cursor_debug"("PASS", "term:sym<multi_declarator>", " at pos=", rx448_pos)
+  debug_579:
     .return (rx448_cur)
   rx448_restart:
 .annotate 'line', 4
-    rx448_cur."!cursor_debug"("NEXT ", "term:sym<multi_declarator>")
+    if_null rx448_debug, debug_580
+    rx448_cur."!cursor_debug"("NEXT", "term:sym<multi_declarator>")
+  debug_580:
   rx448_fail:
     (rx448_rep, rx448_pos, $I10, $P10) = rx448_cur."!mark_fail"(0)
     lt rx448_pos, -1, rx448_done
@@ -5999,14 +6441,16 @@
     jump $I10
   rx448_done:
     rx448_cur."!cursor_fail"()
-    rx448_cur."!cursor_debug"("FAIL  ", "term:sym<multi_declarator>")
+    if_null rx448_debug, debug_581
+    rx448_cur."!cursor_debug"("FAIL", "term:sym<multi_declarator>")
+  debug_581:
     .return (rx448_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__term:sym<multi_declarator>"  :subid("112_1280467477.44751") :method
+.sub "!PREFIX__term:sym<multi_declarator>"  :subid("112_1284728478.15265") :method
 .annotate 'line', 4
     new $P450, "ResizablePMCArray"
     push $P450, ""
@@ -6015,7 +6459,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "_block452"  :anon :subid("113_1280467477.44751") :method :outer("111_1280467477.44751")
+.sub "_block452"  :anon :subid("113_1284728478.15265") :method :outer("111_1284728478.15265")
 .annotate 'line', 231
     .local string rx454_tgt
     .local int rx454_pos
@@ -6023,7 +6467,9 @@
     .local int rx454_eos
     .local int rx454_rep
     .local pmc rx454_cur
+    .local pmc rx454_debug
     (rx454_cur, rx454_pos, rx454_tgt, $I10) = self."!cursor_start"()
+    getattribute rx454_debug, rx454_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx454_cur
     .local pmc match
     .lex "$/", match
@@ -6035,7 +6481,9 @@
     substr rx454_tgt, rx454_tgt, rx454_off
   rx454_start:
     eq $I10, 1, rx454_restart
-    rx454_cur."!cursor_debug"("START ", "")
+    if_null rx454_debug, debug_575
+    rx454_cur."!cursor_debug"("START", "")
+  debug_575:
     $I10 = self.'from'()
     ne $I10, -1, rxscan455_done
     goto rxscan455_scan
@@ -6081,10 +6529,14 @@
   alt456_end:
   # rx pass
     rx454_cur."!cursor_pass"(rx454_pos, "")
-    rx454_cur."!cursor_debug"("PASS  ", "", " at pos=", rx454_pos)
+    if_null rx454_debug, debug_576
+    rx454_cur."!cursor_debug"("PASS", "", " at pos=", rx454_pos)
+  debug_576:
     .return (rx454_cur)
   rx454_restart:
-    rx454_cur."!cursor_debug"("NEXT ", "")
+    if_null rx454_debug, debug_577
+    rx454_cur."!cursor_debug"("NEXT", "")
+  debug_577:
   rx454_fail:
     (rx454_rep, rx454_pos, $I10, $P10) = rx454_cur."!mark_fail"(0)
     lt rx454_pos, -1, rx454_done
@@ -6092,14 +6544,16 @@
     jump $I10
   rx454_done:
     rx454_cur."!cursor_fail"()
-    rx454_cur."!cursor_debug"("FAIL  ", "")
+    if_null rx454_debug, debug_578
+    rx454_cur."!cursor_debug"("FAIL", "")
+  debug_578:
     .return (rx454_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "term:sym<regex_declarator>"  :subid("114_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "term:sym<regex_declarator>"  :subid("114_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx458_tgt
     .local int rx458_pos
@@ -6107,7 +6561,9 @@
     .local int rx458_eos
     .local int rx458_rep
     .local pmc rx458_cur
+    .local pmc rx458_debug
     (rx458_cur, rx458_pos, rx458_tgt, $I10) = self."!cursor_start"()
+    getattribute rx458_debug, rx458_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx458_cur
     .local pmc match
     .lex "$/", match
@@ -6119,7 +6575,9 @@
     substr rx458_tgt, rx458_tgt, rx458_off
   rx458_start:
     eq $I10, 1, rx458_restart
-    rx458_cur."!cursor_debug"("START ", "term:sym<regex_declarator>")
+    if_null rx458_debug, debug_582
+    rx458_cur."!cursor_debug"("START", "term:sym<regex_declarator>")
+  debug_582:
     $I10 = self.'from'()
     ne $I10, -1, rxscan462_done
     goto rxscan462_scan
@@ -6142,11 +6600,15 @@
     rx458_pos = $P10."pos"()
   # rx pass
     rx458_cur."!cursor_pass"(rx458_pos, "term:sym<regex_declarator>")
-    rx458_cur."!cursor_debug"("PASS  ", "term:sym<regex_declarator>", " at pos=", rx458_pos)
+    if_null rx458_debug, debug_583
+    rx458_cur."!cursor_debug"("PASS", "term:sym<regex_declarator>", " at pos=", rx458_pos)
+  debug_583:
     .return (rx458_cur)
   rx458_restart:
 .annotate 'line', 4
-    rx458_cur."!cursor_debug"("NEXT ", "term:sym<regex_declarator>")
+    if_null rx458_debug, debug_584
+    rx458_cur."!cursor_debug"("NEXT", "term:sym<regex_declarator>")
+  debug_584:
   rx458_fail:
     (rx458_rep, rx458_pos, $I10, $P10) = rx458_cur."!mark_fail"(0)
     lt rx458_pos, -1, rx458_done
@@ -6154,14 +6616,16 @@
     jump $I10
   rx458_done:
     rx458_cur."!cursor_fail"()
-    rx458_cur."!cursor_debug"("FAIL  ", "term:sym<regex_declarator>")
+    if_null rx458_debug, debug_585
+    rx458_cur."!cursor_debug"("FAIL", "term:sym<regex_declarator>")
+  debug_585:
     .return (rx458_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__term:sym<regex_declarator>"  :subid("115_1280467477.44751") :method
+.sub "!PREFIX__term:sym<regex_declarator>"  :subid("115_1284728478.15265") :method
 .annotate 'line', 4
     $P460 = self."!PREFIX__!subrule"("regex_declarator", "")
     new $P461, "ResizablePMCArray"
@@ -6171,7 +6635,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "term:sym<statement_prefix>"  :subid("116_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "term:sym<statement_prefix>"  :subid("116_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx464_tgt
     .local int rx464_pos
@@ -6179,7 +6643,9 @@
     .local int rx464_eos
     .local int rx464_rep
     .local pmc rx464_cur
+    .local pmc rx464_debug
     (rx464_cur, rx464_pos, rx464_tgt, $I10) = self."!cursor_start"()
+    getattribute rx464_debug, rx464_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx464_cur
     .local pmc match
     .lex "$/", match
@@ -6191,7 +6657,9 @@
     substr rx464_tgt, rx464_tgt, rx464_off
   rx464_start:
     eq $I10, 1, rx464_restart
-    rx464_cur."!cursor_debug"("START ", "term:sym<statement_prefix>")
+    if_null rx464_debug, debug_586
+    rx464_cur."!cursor_debug"("START", "term:sym<statement_prefix>")
+  debug_586:
     $I10 = self.'from'()
     ne $I10, -1, rxscan468_done
     goto rxscan468_scan
@@ -6214,11 +6682,15 @@
     rx464_pos = $P10."pos"()
   # rx pass
     rx464_cur."!cursor_pass"(rx464_pos, "term:sym<statement_prefix>")
-    rx464_cur."!cursor_debug"("PASS  ", "term:sym<statement_prefix>", " at pos=", rx464_pos)
+    if_null rx464_debug, debug_587
+    rx464_cur."!cursor_debug"("PASS", "term:sym<statement_prefix>", " at pos=", rx464_pos)
+  debug_587:
     .return (rx464_cur)
   rx464_restart:
 .annotate 'line', 4
-    rx464_cur."!cursor_debug"("NEXT ", "term:sym<statement_prefix>")
+    if_null rx464_debug, debug_588
+    rx464_cur."!cursor_debug"("NEXT", "term:sym<statement_prefix>")
+  debug_588:
   rx464_fail:
     (rx464_rep, rx464_pos, $I10, $P10) = rx464_cur."!mark_fail"(0)
     lt rx464_pos, -1, rx464_done
@@ -6226,14 +6698,16 @@
     jump $I10
   rx464_done:
     rx464_cur."!cursor_fail"()
-    rx464_cur."!cursor_debug"("FAIL  ", "term:sym<statement_prefix>")
+    if_null rx464_debug, debug_589
+    rx464_cur."!cursor_debug"("FAIL", "term:sym<statement_prefix>")
+  debug_589:
     .return (rx464_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__term:sym<statement_prefix>"  :subid("117_1280467477.44751") :method
+.sub "!PREFIX__term:sym<statement_prefix>"  :subid("117_1284728478.15265") :method
 .annotate 'line', 4
     $P466 = self."!PREFIX__!subrule"("statement_prefix", "")
     new $P467, "ResizablePMCArray"
@@ -6243,7 +6717,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "term:sym<lambda>"  :subid("118_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "term:sym<lambda>"  :subid("118_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx470_tgt
     .local int rx470_pos
@@ -6251,7 +6725,9 @@
     .local int rx470_eos
     .local int rx470_rep
     .local pmc rx470_cur
+    .local pmc rx470_debug
     (rx470_cur, rx470_pos, rx470_tgt, $I10) = self."!cursor_start"()
+    getattribute rx470_debug, rx470_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx470_cur
     .local pmc match
     .lex "$/", match
@@ -6263,7 +6739,9 @@
     substr rx470_tgt, rx470_tgt, rx470_off
   rx470_start:
     eq $I10, 1, rx470_restart
-    rx470_cur."!cursor_debug"("START ", "term:sym<lambda>")
+    if_null rx470_debug, debug_590
+    rx470_cur."!cursor_debug"("START", "term:sym<lambda>")
+  debug_590:
     $I10 = self.'from'()
     ne $I10, -1, rxscan473_done
     goto rxscan473_scan
@@ -6290,11 +6768,15 @@
     rx470_pos = $P10."pos"()
   # rx pass
     rx470_cur."!cursor_pass"(rx470_pos, "term:sym<lambda>")
-    rx470_cur."!cursor_debug"("PASS  ", "term:sym<lambda>", " at pos=", rx470_pos)
+    if_null rx470_debug, debug_591
+    rx470_cur."!cursor_debug"("PASS", "term:sym<lambda>", " at pos=", rx470_pos)
+  debug_591:
     .return (rx470_cur)
   rx470_restart:
 .annotate 'line', 4
-    rx470_cur."!cursor_debug"("NEXT ", "term:sym<lambda>")
+    if_null rx470_debug, debug_592
+    rx470_cur."!cursor_debug"("NEXT", "term:sym<lambda>")
+  debug_592:
   rx470_fail:
     (rx470_rep, rx470_pos, $I10, $P10) = rx470_cur."!mark_fail"(0)
     lt rx470_pos, -1, rx470_done
@@ -6302,14 +6784,16 @@
     jump $I10
   rx470_done:
     rx470_cur."!cursor_fail"()
-    rx470_cur."!cursor_debug"("FAIL  ", "term:sym<lambda>")
+    if_null rx470_debug, debug_593
+    rx470_cur."!cursor_debug"("FAIL", "term:sym<lambda>")
+  debug_593:
     .return (rx470_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__term:sym<lambda>"  :subid("119_1280467477.44751") :method
+.sub "!PREFIX__term:sym<lambda>"  :subid("119_1284728478.15265") :method
 .annotate 'line', 4
     new $P472, "ResizablePMCArray"
     push $P472, ""
@@ -6318,7 +6802,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "fatarrow"  :subid("120_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "fatarrow"  :subid("120_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx475_tgt
     .local int rx475_pos
@@ -6326,7 +6810,9 @@
     .local int rx475_eos
     .local int rx475_rep
     .local pmc rx475_cur
+    .local pmc rx475_debug
     (rx475_cur, rx475_pos, rx475_tgt, $I10) = self."!cursor_start"()
+    getattribute rx475_debug, rx475_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx475_cur
     .local pmc match
     .lex "$/", match
@@ -6338,7 +6824,9 @@
     substr rx475_tgt, rx475_tgt, rx475_off
   rx475_start:
     eq $I10, 1, rx475_restart
-    rx475_cur."!cursor_debug"("START ", "fatarrow")
+    if_null rx475_debug, debug_594
+    rx475_cur."!cursor_debug"("START", "fatarrow")
+  debug_594:
     $I10 = self.'from'()
     ne $I10, -1, rxscan479_done
     goto rxscan479_scan
@@ -6359,23 +6847,21 @@
     rx475_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("key")
     rx475_pos = $P10."pos"()
-  # rx rxquantr480 ** 0..*
-    set_addr $I10, rxquantr480_done
-    rx475_cur."!mark_push"(0, rx475_pos, $I10)
-  rxquantr480_loop:
-  # rx enumcharlist negate=0 
-    ge rx475_pos, rx475_eos, rx475_fail
+  # rx enumcharlist_q negate=0  r 0..-1
     sub $I10, rx475_pos, rx475_off
+    set rx475_rep, 0
+    sub $I12, rx475_eos, rx475_pos
+  rxenumcharlistq480_loop:
+    le $I12, 0, rxenumcharlistq480_done
     substr $S10, rx475_tgt, $I10, 1
     index $I11, unicode:"\t \x{a0}\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000", $S10
-    lt $I11, 0, rx475_fail
-    inc rx475_pos
-    set_addr $I10, rxquantr480_done
-    (rx475_rep) = rx475_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr480_done
-    rx475_cur."!mark_push"(rx475_rep, rx475_pos, $I10)
-    goto rxquantr480_loop
-  rxquantr480_done:
+    lt $I11, 0, rxenumcharlistq480_done
+    inc rx475_rep
+    inc $I10
+    dec $I12
+    goto rxenumcharlistq480_loop
+  rxenumcharlistq480_done:
+    add rx475_pos, rx475_pos, rx475_rep
   # rx literal  "=>"
     add $I11, rx475_pos, 2
     gt $I11, rx475_eos, rx475_fail
@@ -6398,11 +6884,15 @@
 .annotate 'line', 236
   # rx pass
     rx475_cur."!cursor_pass"(rx475_pos, "fatarrow")
-    rx475_cur."!cursor_debug"("PASS  ", "fatarrow", " at pos=", rx475_pos)
+    if_null rx475_debug, debug_595
+    rx475_cur."!cursor_debug"("PASS", "fatarrow", " at pos=", rx475_pos)
+  debug_595:
     .return (rx475_cur)
   rx475_restart:
 .annotate 'line', 4
-    rx475_cur."!cursor_debug"("NEXT ", "fatarrow")
+    if_null rx475_debug, debug_596
+    rx475_cur."!cursor_debug"("NEXT", "fatarrow")
+  debug_596:
   rx475_fail:
     (rx475_rep, rx475_pos, $I10, $P10) = rx475_cur."!mark_fail"(0)
     lt rx475_pos, -1, rx475_done
@@ -6410,14 +6900,16 @@
     jump $I10
   rx475_done:
     rx475_cur."!cursor_fail"()
-    rx475_cur."!cursor_debug"("FAIL  ", "fatarrow")
+    if_null rx475_debug, debug_597
+    rx475_cur."!cursor_debug"("FAIL", "fatarrow")
+  debug_597:
     .return (rx475_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__fatarrow"  :subid("121_1280467477.44751") :method
+.sub "!PREFIX__fatarrow"  :subid("121_1284728478.15265") :method
 .annotate 'line', 4
     $P477 = self."!PREFIX__!subrule"("identifier", "")
     new $P478, "ResizablePMCArray"
@@ -6427,7 +6919,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "colonpair"  :subid("122_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "colonpair"  :subid("122_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx482_tgt
     .local int rx482_pos
@@ -6435,8 +6927,10 @@
     .local int rx482_eos
     .local int rx482_rep
     .local pmc rx482_cur
+    .local pmc rx482_debug
     (rx482_cur, rx482_pos, rx482_tgt, $I10) = self."!cursor_start"()
     rx482_cur."!cursor_caparray"("circumfix")
+    getattribute rx482_debug, rx482_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx482_cur
     .local pmc match
     .lex "$/", match
@@ -6448,7 +6942,9 @@
     substr rx482_tgt, rx482_tgt, rx482_off
   rx482_start:
     eq $I10, 1, rx482_restart
-    rx482_cur."!cursor_debug"("START ", "colonpair")
+    if_null rx482_debug, debug_598
+    rx482_cur."!cursor_debug"("START", "colonpair")
+  debug_598:
     $I10 = self.'from'()
     ne $I10, -1, rxscan488_done
     goto rxscan488_scan
@@ -6466,8 +6962,8 @@
     add $I11, rx482_pos, 1
     gt $I11, rx482_eos, rx482_fail
     sub $I11, rx482_pos, rx482_off
-    substr $S10, rx482_tgt, $I11, 1
-    ne $S10, ":", rx482_fail
+    ord $I11, rx482_tgt, $I11
+    ne $I11, 58, rx482_fail
     add rx482_pos, 1
   alt489_0:
 .annotate 'line', 242
@@ -6481,8 +6977,8 @@
     add $I11, rx482_pos, 1
     gt $I11, rx482_eos, rx482_fail
     sub $I11, rx482_pos, rx482_off
-    substr $S10, rx482_tgt, $I11, 1
-    ne $S10, "!", rx482_fail
+    ord $I11, rx482_tgt, $I11
+    ne $I11, 33, rx482_fail
     add rx482_pos, 1
     set_addr $I10, rxcap_490_fail
     ($I12, $I11) = rx482_cur."!mark_peek"($I10)
@@ -6548,11 +7044,15 @@
 .annotate 'line', 240
   # rx pass
     rx482_cur."!cursor_pass"(rx482_pos, "colonpair")
-    rx482_cur."!cursor_debug"("PASS  ", "colonpair", " at pos=", rx482_pos)
+    if_null rx482_debug, debug_599
+    rx482_cur."!cursor_debug"("PASS", "colonpair", " at pos=", rx482_pos)
+  debug_599:
     .return (rx482_cur)
   rx482_restart:
 .annotate 'line', 4
-    rx482_cur."!cursor_debug"("NEXT ", "colonpair")
+    if_null rx482_debug, debug_600
+    rx482_cur."!cursor_debug"("NEXT", "colonpair")
+  debug_600:
   rx482_fail:
     (rx482_rep, rx482_pos, $I10, $P10) = rx482_cur."!mark_fail"(0)
     lt rx482_pos, -1, rx482_done
@@ -6560,14 +7060,16 @@
     jump $I10
   rx482_done:
     rx482_cur."!cursor_fail"()
-    rx482_cur."!cursor_debug"("FAIL  ", "colonpair")
+    if_null rx482_debug, debug_601
+    rx482_cur."!cursor_debug"("FAIL", "colonpair")
+  debug_601:
     .return (rx482_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__colonpair"  :subid("123_1280467477.44751") :method
+.sub "!PREFIX__colonpair"  :subid("123_1284728478.15265") :method
 .annotate 'line', 4
     $P484 = self."!PREFIX__!subrule"("circumfix", ":")
     $P485 = self."!PREFIX__!subrule"("identifier", ":")
@@ -6581,7 +7083,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "variable"  :subid("124_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "variable"  :subid("124_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx494_tgt
     .local int rx494_pos
@@ -6589,8 +7091,10 @@
     .local int rx494_eos
     .local int rx494_rep
     .local pmc rx494_cur
+    .local pmc rx494_debug
     (rx494_cur, rx494_pos, rx494_tgt, $I10) = self."!cursor_start"()
     rx494_cur."!cursor_caparray"("twigil")
+    getattribute rx494_debug, rx494_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx494_cur
     .local pmc match
     .lex "$/", match
@@ -6602,7 +7106,9 @@
     substr rx494_tgt, rx494_tgt, rx494_off
   rx494_start:
     eq $I10, 1, rx494_restart
-    rx494_cur."!cursor_debug"("START ", "variable")
+    if_null rx494_debug, debug_602
+    rx494_cur."!cursor_debug"("START", "variable")
+  debug_602:
     $I10 = self.'from'()
     ne $I10, -1, rxscan499_done
     goto rxscan499_scan
@@ -6667,7 +7173,6 @@
     $P10."!cursor_names"("sigil")
     rx494_pos = $P10."pos"()
   # rx enumcharlist negate=0 zerowidth
-    ge rx494_pos, rx494_eos, rx494_fail
     sub $I10, rx494_pos, rx494_off
     substr $S10, rx494_tgt, $I10, 1
     index $I11, "<[", $S10
@@ -6689,8 +7194,8 @@
     add $I11, rx494_pos, 1
     gt $I11, rx494_eos, rx494_fail
     sub $I11, rx494_pos, rx494_off
-    substr $S10, rx494_tgt, $I11, 1
-    ne $S10, "$", rx494_fail
+    ord $I11, rx494_tgt, $I11
+    ne $I11, 36, rx494_fail
     add rx494_pos, 1
     set_addr $I10, rxcap_503_fail
     ($I12, $I11) = rx494_cur."!mark_peek"($I10)
@@ -6728,11 +7233,15 @@
 .annotate 'line', 249
   # rx pass
     rx494_cur."!cursor_pass"(rx494_pos, "variable")
-    rx494_cur."!cursor_debug"("PASS  ", "variable", " at pos=", rx494_pos)
+    if_null rx494_debug, debug_603
+    rx494_cur."!cursor_debug"("PASS", "variable", " at pos=", rx494_pos)
+  debug_603:
     .return (rx494_cur)
   rx494_restart:
 .annotate 'line', 4
-    rx494_cur."!cursor_debug"("NEXT ", "variable")
+    if_null rx494_debug, debug_604
+    rx494_cur."!cursor_debug"("NEXT", "variable")
+  debug_604:
   rx494_fail:
     (rx494_rep, rx494_pos, $I10, $P10) = rx494_cur."!mark_fail"(0)
     lt rx494_pos, -1, rx494_done
@@ -6740,14 +7249,16 @@
     jump $I10
   rx494_done:
     rx494_cur."!cursor_fail"()
-    rx494_cur."!cursor_debug"("FAIL  ", "variable")
+    if_null rx494_debug, debug_605
+    rx494_cur."!cursor_debug"("FAIL", "variable")
+  debug_605:
     .return (rx494_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__variable"  :subid("125_1280467477.44751") :method
+.sub "!PREFIX__variable"  :subid("125_1284728478.15265") :method
 .annotate 'line', 4
     $P496 = self."!PREFIX__!subrule"("sigil", "")
     $P497 = self."!PREFIX__!subrule"("sigil", "")
@@ -6762,7 +7273,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "sigil"  :subid("126_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "sigil"  :subid("126_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx506_tgt
     .local int rx506_pos
@@ -6770,7 +7281,9 @@
     .local int rx506_eos
     .local int rx506_rep
     .local pmc rx506_cur
+    .local pmc rx506_debug
     (rx506_cur, rx506_pos, rx506_tgt, $I10) = self."!cursor_start"()
+    getattribute rx506_debug, rx506_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx506_cur
     .local pmc match
     .lex "$/", match
@@ -6782,7 +7295,9 @@
     substr rx506_tgt, rx506_tgt, rx506_off
   rx506_start:
     eq $I10, 1, rx506_restart
-    rx506_cur."!cursor_debug"("START ", "sigil")
+    if_null rx506_debug, debug_606
+    rx506_cur."!cursor_debug"("START", "sigil")
+  debug_606:
     $I10 = self.'from'()
     ne $I10, -1, rxscan509_done
     goto rxscan509_scan
@@ -6805,11 +7320,15 @@
     inc rx506_pos
   # rx pass
     rx506_cur."!cursor_pass"(rx506_pos, "sigil")
-    rx506_cur."!cursor_debug"("PASS  ", "sigil", " at pos=", rx506_pos)
+    if_null rx506_debug, debug_607
+    rx506_cur."!cursor_debug"("PASS", "sigil", " at pos=", rx506_pos)
+  debug_607:
     .return (rx506_cur)
   rx506_restart:
 .annotate 'line', 4
-    rx506_cur."!cursor_debug"("NEXT ", "sigil")
+    if_null rx506_debug, debug_608
+    rx506_cur."!cursor_debug"("NEXT", "sigil")
+  debug_608:
   rx506_fail:
     (rx506_rep, rx506_pos, $I10, $P10) = rx506_cur."!mark_fail"(0)
     lt rx506_pos, -1, rx506_done
@@ -6817,14 +7336,16 @@
     jump $I10
   rx506_done:
     rx506_cur."!cursor_fail"()
-    rx506_cur."!cursor_debug"("FAIL  ", "sigil")
+    if_null rx506_debug, debug_609
+    rx506_cur."!cursor_debug"("FAIL", "sigil")
+  debug_609:
     .return (rx506_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__sigil"  :subid("127_1280467477.44751") :method
+.sub "!PREFIX__sigil"  :subid("127_1284728478.15265") :method
 .annotate 'line', 4
     new $P508, "ResizablePMCArray"
     push $P508, "&"
@@ -6836,7 +7357,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "twigil"  :subid("128_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "twigil"  :subid("128_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx511_tgt
     .local int rx511_pos
@@ -6844,7 +7365,9 @@
     .local int rx511_eos
     .local int rx511_rep
     .local pmc rx511_cur
+    .local pmc rx511_debug
     (rx511_cur, rx511_pos, rx511_tgt, $I10) = self."!cursor_start"()
+    getattribute rx511_debug, rx511_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx511_cur
     .local pmc match
     .lex "$/", match
@@ -6856,7 +7379,9 @@
     substr rx511_tgt, rx511_tgt, rx511_off
   rx511_start:
     eq $I10, 1, rx511_restart
-    rx511_cur."!cursor_debug"("START ", "twigil")
+    if_null rx511_debug, debug_610
+    rx511_cur."!cursor_debug"("START", "twigil")
+  debug_610:
     $I10 = self.'from'()
     ne $I10, -1, rxscan514_done
     goto rxscan514_scan
@@ -6879,11 +7404,15 @@
     inc rx511_pos
   # rx pass
     rx511_cur."!cursor_pass"(rx511_pos, "twigil")
-    rx511_cur."!cursor_debug"("PASS  ", "twigil", " at pos=", rx511_pos)
+    if_null rx511_debug, debug_611
+    rx511_cur."!cursor_debug"("PASS", "twigil", " at pos=", rx511_pos)
+  debug_611:
     .return (rx511_cur)
   rx511_restart:
 .annotate 'line', 4
-    rx511_cur."!cursor_debug"("NEXT ", "twigil")
+    if_null rx511_debug, debug_612
+    rx511_cur."!cursor_debug"("NEXT", "twigil")
+  debug_612:
   rx511_fail:
     (rx511_rep, rx511_pos, $I10, $P10) = rx511_cur."!mark_fail"(0)
     lt rx511_pos, -1, rx511_done
@@ -6891,14 +7420,16 @@
     jump $I10
   rx511_done:
     rx511_cur."!cursor_fail"()
-    rx511_cur."!cursor_debug"("FAIL  ", "twigil")
+    if_null rx511_debug, debug_613
+    rx511_cur."!cursor_debug"("FAIL", "twigil")
+  debug_613:
     .return (rx511_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__twigil"  :subid("129_1280467477.44751") :method
+.sub "!PREFIX__twigil"  :subid("129_1284728478.15265") :method
 .annotate 'line', 4
     new $P513, "ResizablePMCArray"
     push $P513, "?"
@@ -6909,7 +7440,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "package_declarator"  :subid("130_1280467477.44751") :method
+.sub "package_declarator"  :subid("130_1284728478.15265") :method
 .annotate 'line', 259
     $P516 = self."!protoregex"("package_declarator")
     .return ($P516)
@@ -6917,7 +7448,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__package_declarator"  :subid("131_1280467477.44751") :method
+.sub "!PREFIX__package_declarator"  :subid("131_1284728478.15265") :method
 .annotate 'line', 259
     $P518 = self."!PREFIX__!protoregex"("package_declarator")
     .return ($P518)
@@ -6925,7 +7456,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "package_declarator:sym<module>"  :subid("132_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "package_declarator:sym<module>"  :subid("132_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx520_tgt
     .local int rx520_pos
@@ -6933,7 +7464,9 @@
     .local int rx520_eos
     .local int rx520_rep
     .local pmc rx520_cur
+    .local pmc rx520_debug
     (rx520_cur, rx520_pos, rx520_tgt, $I10) = self."!cursor_start"()
+    getattribute rx520_debug, rx520_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx520_cur
     .local pmc match
     .lex "$/", match
@@ -6945,7 +7478,9 @@
     substr rx520_tgt, rx520_tgt, rx520_off
   rx520_start:
     eq $I10, 1, rx520_restart
-    rx520_cur."!cursor_debug"("START ", "package_declarator:sym<module>")
+    if_null rx520_debug, debug_614
+    rx520_cur."!cursor_debug"("START", "package_declarator:sym<module>")
+  debug_614:
     $I10 = self.'from'()
     ne $I10, -1, rxscan524_done
     goto rxscan524_scan
@@ -6989,11 +7524,15 @@
     rx520_pos = $P10."pos"()
   # rx pass
     rx520_cur."!cursor_pass"(rx520_pos, "package_declarator:sym<module>")
-    rx520_cur."!cursor_debug"("PASS  ", "package_declarator:sym<module>", " at pos=", rx520_pos)
+    if_null rx520_debug, debug_615
+    rx520_cur."!cursor_debug"("PASS", "package_declarator:sym<module>", " at pos=", rx520_pos)
+  debug_615:
     .return (rx520_cur)
   rx520_restart:
 .annotate 'line', 4
-    rx520_cur."!cursor_debug"("NEXT ", "package_declarator:sym<module>")
+    if_null rx520_debug, debug_616
+    rx520_cur."!cursor_debug"("NEXT", "package_declarator:sym<module>")
+  debug_616:
   rx520_fail:
     (rx520_rep, rx520_pos, $I10, $P10) = rx520_cur."!mark_fail"(0)
     lt rx520_pos, -1, rx520_done
@@ -7001,14 +7540,16 @@
     jump $I10
   rx520_done:
     rx520_cur."!cursor_fail"()
-    rx520_cur."!cursor_debug"("FAIL  ", "package_declarator:sym<module>")
+    if_null rx520_debug, debug_617
+    rx520_cur."!cursor_debug"("FAIL", "package_declarator:sym<module>")
+  debug_617:
     .return (rx520_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__package_declarator:sym<module>"  :subid("133_1280467477.44751") :method
+.sub "!PREFIX__package_declarator:sym<module>"  :subid("133_1284728478.15265") :method
 .annotate 'line', 4
     $P522 = self."!PREFIX__!subrule"("package_def", "module")
     new $P523, "ResizablePMCArray"
@@ -7018,7 +7559,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "package_declarator:sym<class>"  :subid("134_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "package_declarator:sym<class>"  :subid("134_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx527_tgt
     .local int rx527_pos
@@ -7026,7 +7567,9 @@
     .local int rx527_eos
     .local int rx527_rep
     .local pmc rx527_cur
+    .local pmc rx527_debug
     (rx527_cur, rx527_pos, rx527_tgt, $I10) = self."!cursor_start"()
+    getattribute rx527_debug, rx527_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx527_cur
     .local pmc match
     .lex "$/", match
@@ -7038,7 +7581,9 @@
     substr rx527_tgt, rx527_tgt, rx527_off
   rx527_start:
     eq $I10, 1, rx527_restart
-    rx527_cur."!cursor_debug"("START ", "package_declarator:sym<class>")
+    if_null rx527_debug, debug_618
+    rx527_cur."!cursor_debug"("START", "package_declarator:sym<class>")
+  debug_618:
     $I10 = self.'from'()
     ne $I10, -1, rxscan532_done
     goto rxscan532_scan
@@ -7095,11 +7640,15 @@
     rx527_pos = $P10."pos"()
   # rx pass
     rx527_cur."!cursor_pass"(rx527_pos, "package_declarator:sym<class>")
-    rx527_cur."!cursor_debug"("PASS  ", "package_declarator:sym<class>", " at pos=", rx527_pos)
+    if_null rx527_debug, debug_619
+    rx527_cur."!cursor_debug"("PASS", "package_declarator:sym<class>", " at pos=", rx527_pos)
+  debug_619:
     .return (rx527_cur)
   rx527_restart:
 .annotate 'line', 4
-    rx527_cur."!cursor_debug"("NEXT ", "package_declarator:sym<class>")
+    if_null rx527_debug, debug_620
+    rx527_cur."!cursor_debug"("NEXT", "package_declarator:sym<class>")
+  debug_620:
   rx527_fail:
     (rx527_rep, rx527_pos, $I10, $P10) = rx527_cur."!mark_fail"(0)
     lt rx527_pos, -1, rx527_done
@@ -7107,14 +7656,16 @@
     jump $I10
   rx527_done:
     rx527_cur."!cursor_fail"()
-    rx527_cur."!cursor_debug"("FAIL  ", "package_declarator:sym<class>")
+    if_null rx527_debug, debug_621
+    rx527_cur."!cursor_debug"("FAIL", "package_declarator:sym<class>")
+  debug_621:
     .return (rx527_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__package_declarator:sym<class>"  :subid("135_1280467477.44751") :method
+.sub "!PREFIX__package_declarator:sym<class>"  :subid("135_1284728478.15265") :method
 .annotate 'line', 4
     $P529 = self."!PREFIX__!subrule"("package_def", "grammar")
     $P530 = self."!PREFIX__!subrule"("package_def", "class")
@@ -7126,7 +7677,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "package_def"  :subid("136_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "package_def"  :subid("136_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx536_tgt
     .local int rx536_pos
@@ -7134,8 +7685,10 @@
     .local int rx536_eos
     .local int rx536_rep
     .local pmc rx536_cur
+    .local pmc rx536_debug
     (rx536_cur, rx536_pos, rx536_tgt, $I10) = self."!cursor_start"()
     rx536_cur."!cursor_caparray"("parent")
+    getattribute rx536_debug, rx536_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx536_cur
     .local pmc match
     .lex "$/", match
@@ -7147,7 +7700,9 @@
     substr rx536_tgt, rx536_tgt, rx536_off
   rx536_start:
     eq $I10, 1, rx536_restart
-    rx536_cur."!cursor_debug"("START ", "package_def")
+    if_null rx536_debug, debug_622
+    rx536_cur."!cursor_debug"("START", "package_def")
+  debug_622:
     $I10 = self.'from'()
     ne $I10, -1, rxscan540_done
     goto rxscan540_scan
@@ -7235,8 +7790,8 @@
     add $I11, rx536_pos, 1
     gt $I11, rx536_eos, rx536_fail
     sub $I11, rx536_pos, rx536_off
-    substr $S10, rx536_tgt, $I11, 1
-    ne $S10, ";", rx536_fail
+    ord $I11, rx536_tgt, $I11
+    ne $I11, 59, rx536_fail
     add rx536_pos, 1
   # rx subrule "ws" subtype=method negate=
     rx536_cur."!cursor_pos"(rx536_pos)
@@ -7266,7 +7821,6 @@
     unless $P10, rx536_fail
     rx536_pos = $P10."pos"()
   # rx enumcharlist negate=0 zerowidth
-    ge rx536_pos, rx536_eos, rx536_fail
     sub $I10, rx536_pos, rx536_off
     substr $S10, rx536_tgt, $I10, 1
     index $I11, "{", $S10
@@ -7316,11 +7870,15 @@
 .annotate 'line', 263
   # rx pass
     rx536_cur."!cursor_pass"(rx536_pos, "package_def")
-    rx536_cur."!cursor_debug"("PASS  ", "package_def", " at pos=", rx536_pos)
+    if_null rx536_debug, debug_623
+    rx536_cur."!cursor_debug"("PASS", "package_def", " at pos=", rx536_pos)
+  debug_623:
     .return (rx536_cur)
   rx536_restart:
 .annotate 'line', 4
-    rx536_cur."!cursor_debug"("NEXT ", "package_def")
+    if_null rx536_debug, debug_624
+    rx536_cur."!cursor_debug"("NEXT", "package_def")
+  debug_624:
   rx536_fail:
     (rx536_rep, rx536_pos, $I10, $P10) = rx536_cur."!mark_fail"(0)
     lt rx536_pos, -1, rx536_done
@@ -7328,14 +7886,16 @@
     jump $I10
   rx536_done:
     rx536_cur."!cursor_fail"()
-    rx536_cur."!cursor_debug"("FAIL  ", "package_def")
+    if_null rx536_debug, debug_625
+    rx536_cur."!cursor_debug"("FAIL", "package_def")
+  debug_625:
     .return (rx536_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__package_def"  :subid("137_1280467477.44751") :method
+.sub "!PREFIX__package_def"  :subid("137_1284728478.15265") :method
 .annotate 'line', 4
     $P538 = self."!PREFIX__!subrule"("ws", "")
     new $P539, "ResizablePMCArray"
@@ -7345,7 +7905,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "scope_declarator"  :subid("138_1280467477.44751") :method
+.sub "scope_declarator"  :subid("138_1284728478.15265") :method
 .annotate 'line', 273
     $P559 = self."!protoregex"("scope_declarator")
     .return ($P559)
@@ -7353,7 +7913,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__scope_declarator"  :subid("139_1280467477.44751") :method
+.sub "!PREFIX__scope_declarator"  :subid("139_1284728478.15265") :method
 .annotate 'line', 273
     $P561 = self."!PREFIX__!protoregex"("scope_declarator")
     .return ($P561)
@@ -7361,7 +7921,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "scope_declarator:sym<my>"  :subid("140_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "scope_declarator:sym<my>"  :subid("140_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx563_tgt
     .local int rx563_pos
@@ -7369,7 +7929,9 @@
     .local int rx563_eos
     .local int rx563_rep
     .local pmc rx563_cur
+    .local pmc rx563_debug
     (rx563_cur, rx563_pos, rx563_tgt, $I10) = self."!cursor_start"()
+    getattribute rx563_debug, rx563_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx563_cur
     .local pmc match
     .lex "$/", match
@@ -7381,7 +7943,9 @@
     substr rx563_tgt, rx563_tgt, rx563_off
   rx563_start:
     eq $I10, 1, rx563_restart
-    rx563_cur."!cursor_debug"("START ", "scope_declarator:sym<my>")
+    if_null rx563_debug, debug_626
+    rx563_cur."!cursor_debug"("START", "scope_declarator:sym<my>")
+  debug_626:
     $I10 = self.'from'()
     ne $I10, -1, rxscan567_done
     goto rxscan567_scan
@@ -7425,11 +7989,15 @@
     rx563_pos = $P10."pos"()
   # rx pass
     rx563_cur."!cursor_pass"(rx563_pos, "scope_declarator:sym<my>")
-    rx563_cur."!cursor_debug"("PASS  ", "scope_declarator:sym<my>", " at pos=", rx563_pos)
+    if_null rx563_debug, debug_627
+    rx563_cur."!cursor_debug"("PASS", "scope_declarator:sym<my>", " at pos=", rx563_pos)
+  debug_627:
     .return (rx563_cur)
   rx563_restart:
 .annotate 'line', 4
-    rx563_cur."!cursor_debug"("NEXT ", "scope_declarator:sym<my>")
+    if_null rx563_debug, debug_628
+    rx563_cur."!cursor_debug"("NEXT", "scope_declarator:sym<my>")
+  debug_628:
   rx563_fail:
     (rx563_rep, rx563_pos, $I10, $P10) = rx563_cur."!mark_fail"(0)
     lt rx563_pos, -1, rx563_done
@@ -7437,14 +8005,16 @@
     jump $I10
   rx563_done:
     rx563_cur."!cursor_fail"()
-    rx563_cur."!cursor_debug"("FAIL  ", "scope_declarator:sym<my>")
+    if_null rx563_debug, debug_629
+    rx563_cur."!cursor_debug"("FAIL", "scope_declarator:sym<my>")
+  debug_629:
     .return (rx563_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__scope_declarator:sym<my>"  :subid("141_1280467477.44751") :method
+.sub "!PREFIX__scope_declarator:sym<my>"  :subid("141_1284728478.15265") :method
 .annotate 'line', 4
     $P565 = self."!PREFIX__!subrule"("scoped", "my")
     new $P566, "ResizablePMCArray"
@@ -7454,7 +8024,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "scope_declarator:sym<our>"  :subid("142_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "scope_declarator:sym<our>"  :subid("142_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx570_tgt
     .local int rx570_pos
@@ -7462,7 +8032,9 @@
     .local int rx570_eos
     .local int rx570_rep
     .local pmc rx570_cur
+    .local pmc rx570_debug
     (rx570_cur, rx570_pos, rx570_tgt, $I10) = self."!cursor_start"()
+    getattribute rx570_debug, rx570_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx570_cur
     .local pmc match
     .lex "$/", match
@@ -7474,7 +8046,9 @@
     substr rx570_tgt, rx570_tgt, rx570_off
   rx570_start:
     eq $I10, 1, rx570_restart
-    rx570_cur."!cursor_debug"("START ", "scope_declarator:sym<our>")
+    if_null rx570_debug, debug_630
+    rx570_cur."!cursor_debug"("START", "scope_declarator:sym<our>")
+  debug_630:
     $I10 = self.'from'()
     ne $I10, -1, rxscan574_done
     goto rxscan574_scan
@@ -7518,11 +8092,15 @@
     rx570_pos = $P10."pos"()
   # rx pass
     rx570_cur."!cursor_pass"(rx570_pos, "scope_declarator:sym<our>")
-    rx570_cur."!cursor_debug"("PASS  ", "scope_declarator:sym<our>", " at pos=", rx570_pos)
+    if_null rx570_debug, debug_631
+    rx570_cur."!cursor_debug"("PASS", "scope_declarator:sym<our>", " at pos=", rx570_pos)
+  debug_631:
     .return (rx570_cur)
   rx570_restart:
 .annotate 'line', 4
-    rx570_cur."!cursor_debug"("NEXT ", "scope_declarator:sym<our>")
+    if_null rx570_debug, debug_632
+    rx570_cur."!cursor_debug"("NEXT", "scope_declarator:sym<our>")
+  debug_632:
   rx570_fail:
     (rx570_rep, rx570_pos, $I10, $P10) = rx570_cur."!mark_fail"(0)
     lt rx570_pos, -1, rx570_done
@@ -7530,14 +8108,16 @@
     jump $I10
   rx570_done:
     rx570_cur."!cursor_fail"()
-    rx570_cur."!cursor_debug"("FAIL  ", "scope_declarator:sym<our>")
+    if_null rx570_debug, debug_633
+    rx570_cur."!cursor_debug"("FAIL", "scope_declarator:sym<our>")
+  debug_633:
     .return (rx570_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__scope_declarator:sym<our>"  :subid("143_1280467477.44751") :method
+.sub "!PREFIX__scope_declarator:sym<our>"  :subid("143_1284728478.15265") :method
 .annotate 'line', 4
     $P572 = self."!PREFIX__!subrule"("scoped", "our")
     new $P573, "ResizablePMCArray"
@@ -7547,7 +8127,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "scope_declarator:sym<has>"  :subid("144_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "scope_declarator:sym<has>"  :subid("144_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx577_tgt
     .local int rx577_pos
@@ -7555,7 +8135,9 @@
     .local int rx577_eos
     .local int rx577_rep
     .local pmc rx577_cur
+    .local pmc rx577_debug
     (rx577_cur, rx577_pos, rx577_tgt, $I10) = self."!cursor_start"()
+    getattribute rx577_debug, rx577_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx577_cur
     .local pmc match
     .lex "$/", match
@@ -7567,7 +8149,9 @@
     substr rx577_tgt, rx577_tgt, rx577_off
   rx577_start:
     eq $I10, 1, rx577_restart
-    rx577_cur."!cursor_debug"("START ", "scope_declarator:sym<has>")
+    if_null rx577_debug, debug_634
+    rx577_cur."!cursor_debug"("START", "scope_declarator:sym<has>")
+  debug_634:
     $I10 = self.'from'()
     ne $I10, -1, rxscan581_done
     goto rxscan581_scan
@@ -7611,11 +8195,15 @@
     rx577_pos = $P10."pos"()
   # rx pass
     rx577_cur."!cursor_pass"(rx577_pos, "scope_declarator:sym<has>")
-    rx577_cur."!cursor_debug"("PASS  ", "scope_declarator:sym<has>", " at pos=", rx577_pos)
+    if_null rx577_debug, debug_635
+    rx577_cur."!cursor_debug"("PASS", "scope_declarator:sym<has>", " at pos=", rx577_pos)
+  debug_635:
     .return (rx577_cur)
   rx577_restart:
 .annotate 'line', 4
-    rx577_cur."!cursor_debug"("NEXT ", "scope_declarator:sym<has>")
+    if_null rx577_debug, debug_636
+    rx577_cur."!cursor_debug"("NEXT", "scope_declarator:sym<has>")
+  debug_636:
   rx577_fail:
     (rx577_rep, rx577_pos, $I10, $P10) = rx577_cur."!mark_fail"(0)
     lt rx577_pos, -1, rx577_done
@@ -7623,14 +8211,16 @@
     jump $I10
   rx577_done:
     rx577_cur."!cursor_fail"()
-    rx577_cur."!cursor_debug"("FAIL  ", "scope_declarator:sym<has>")
+    if_null rx577_debug, debug_637
+    rx577_cur."!cursor_debug"("FAIL", "scope_declarator:sym<has>")
+  debug_637:
     .return (rx577_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__scope_declarator:sym<has>"  :subid("145_1280467477.44751") :method
+.sub "!PREFIX__scope_declarator:sym<has>"  :subid("145_1284728478.15265") :method
 .annotate 'line', 4
     $P579 = self."!PREFIX__!subrule"("scoped", "has")
     new $P580, "ResizablePMCArray"
@@ -7640,7 +8230,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "scoped"  :subid("146_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "scoped"  :subid("146_1284728478.15265") :method :outer("11_1284728478.15265")
     .param pmc param_584
 .annotate 'line', 278
     .lex "$*SCOPE", param_584
@@ -7651,7 +8241,9 @@
     .local int rx585_eos
     .local int rx585_rep
     .local pmc rx585_cur
+    .local pmc rx585_debug
     (rx585_cur, rx585_pos, rx585_tgt, $I10) = self."!cursor_start"()
+    getattribute rx585_debug, rx585_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx585_cur
     .local pmc match
     .lex "$/", match
@@ -7663,7 +8255,9 @@
     substr rx585_tgt, rx585_tgt, rx585_off
   rx585_start:
     eq $I10, 1, rx585_restart
-    rx585_cur."!cursor_debug"("START ", "scoped")
+    if_null rx585_debug, debug_638
+    rx585_cur."!cursor_debug"("START", "scoped")
+  debug_638:
     $I10 = self.'from'()
     ne $I10, -1, rxscan590_done
     goto rxscan590_scan
@@ -7722,11 +8316,15 @@
 .annotate 'line', 278
   # rx pass
     rx585_cur."!cursor_pass"(rx585_pos, "scoped")
-    rx585_cur."!cursor_debug"("PASS  ", "scoped", " at pos=", rx585_pos)
+    if_null rx585_debug, debug_639
+    rx585_cur."!cursor_debug"("PASS", "scoped", " at pos=", rx585_pos)
+  debug_639:
     .return (rx585_cur)
   rx585_restart:
 .annotate 'line', 4
-    rx585_cur."!cursor_debug"("NEXT ", "scoped")
+    if_null rx585_debug, debug_640
+    rx585_cur."!cursor_debug"("NEXT", "scoped")
+  debug_640:
   rx585_fail:
     (rx585_rep, rx585_pos, $I10, $P10) = rx585_cur."!mark_fail"(0)
     lt rx585_pos, -1, rx585_done
@@ -7734,14 +8332,16 @@
     jump $I10
   rx585_done:
     rx585_cur."!cursor_fail"()
-    rx585_cur."!cursor_debug"("FAIL  ", "scoped")
+    if_null rx585_debug, debug_641
+    rx585_cur."!cursor_debug"("FAIL", "scoped")
+  debug_641:
     .return (rx585_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__scoped"  :subid("147_1280467477.44751") :method
+.sub "!PREFIX__scoped"  :subid("147_1284728478.15265") :method
 .annotate 'line', 4
     $P587 = self."!PREFIX__!subrule"("ws", "")
     $P588 = self."!PREFIX__!subrule"("ws", "")
@@ -7753,7 +8353,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "typename"  :subid("148_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "typename"  :subid("148_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx597_tgt
     .local int rx597_pos
@@ -7761,7 +8361,9 @@
     .local int rx597_eos
     .local int rx597_rep
     .local pmc rx597_cur
+    .local pmc rx597_debug
     (rx597_cur, rx597_pos, rx597_tgt, $I10) = self."!cursor_start"()
+    getattribute rx597_debug, rx597_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx597_cur
     .local pmc match
     .lex "$/", match
@@ -7773,7 +8375,9 @@
     substr rx597_tgt, rx597_tgt, rx597_off
   rx597_start:
     eq $I10, 1, rx597_restart
-    rx597_cur."!cursor_debug"("START ", "typename")
+    if_null rx597_debug, debug_642
+    rx597_cur."!cursor_debug"("START", "typename")
+  debug_642:
     $I10 = self.'from'()
     ne $I10, -1, rxscan601_done
     goto rxscan601_scan
@@ -7796,11 +8400,15 @@
     rx597_pos = $P10."pos"()
   # rx pass
     rx597_cur."!cursor_pass"(rx597_pos, "typename")
-    rx597_cur."!cursor_debug"("PASS  ", "typename", " at pos=", rx597_pos)
+    if_null rx597_debug, debug_643
+    rx597_cur."!cursor_debug"("PASS", "typename", " at pos=", rx597_pos)
+  debug_643:
     .return (rx597_cur)
   rx597_restart:
 .annotate 'line', 4
-    rx597_cur."!cursor_debug"("NEXT ", "typename")
+    if_null rx597_debug, debug_644
+    rx597_cur."!cursor_debug"("NEXT", "typename")
+  debug_644:
   rx597_fail:
     (rx597_rep, rx597_pos, $I10, $P10) = rx597_cur."!mark_fail"(0)
     lt rx597_pos, -1, rx597_done
@@ -7808,14 +8416,16 @@
     jump $I10
   rx597_done:
     rx597_cur."!cursor_fail"()
-    rx597_cur."!cursor_debug"("FAIL  ", "typename")
+    if_null rx597_debug, debug_645
+    rx597_cur."!cursor_debug"("FAIL", "typename")
+  debug_645:
     .return (rx597_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__typename"  :subid("149_1280467477.44751") :method
+.sub "!PREFIX__typename"  :subid("149_1284728478.15265") :method
 .annotate 'line', 4
     $P599 = self."!PREFIX__!subrule"("name", "")
     new $P600, "ResizablePMCArray"
@@ -7825,7 +8435,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "declarator"  :subid("150_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "declarator"  :subid("150_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx603_tgt
     .local int rx603_pos
@@ -7833,7 +8443,9 @@
     .local int rx603_eos
     .local int rx603_rep
     .local pmc rx603_cur
+    .local pmc rx603_debug
     (rx603_cur, rx603_pos, rx603_tgt, $I10) = self."!cursor_start"()
+    getattribute rx603_debug, rx603_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx603_cur
     .local pmc match
     .lex "$/", match
@@ -7845,7 +8457,9 @@
     substr rx603_tgt, rx603_tgt, rx603_off
   rx603_start:
     eq $I10, 1, rx603_restart
-    rx603_cur."!cursor_debug"("START ", "declarator")
+    if_null rx603_debug, debug_646
+    rx603_cur."!cursor_debug"("START", "declarator")
+  debug_646:
     $I10 = self.'from'()
     ne $I10, -1, rxscan608_done
     goto rxscan608_scan
@@ -7884,11 +8498,15 @@
 .annotate 'line', 285
   # rx pass
     rx603_cur."!cursor_pass"(rx603_pos, "declarator")
-    rx603_cur."!cursor_debug"("PASS  ", "declarator", " at pos=", rx603_pos)
+    if_null rx603_debug, debug_647
+    rx603_cur."!cursor_debug"("PASS", "declarator", " at pos=", rx603_pos)
+  debug_647:
     .return (rx603_cur)
   rx603_restart:
 .annotate 'line', 4
-    rx603_cur."!cursor_debug"("NEXT ", "declarator")
+    if_null rx603_debug, debug_648
+    rx603_cur."!cursor_debug"("NEXT", "declarator")
+  debug_648:
   rx603_fail:
     (rx603_rep, rx603_pos, $I10, $P10) = rx603_cur."!mark_fail"(0)
     lt rx603_pos, -1, rx603_done
@@ -7896,14 +8514,16 @@
     jump $I10
   rx603_done:
     rx603_cur."!cursor_fail"()
-    rx603_cur."!cursor_debug"("FAIL  ", "declarator")
+    if_null rx603_debug, debug_649
+    rx603_cur."!cursor_debug"("FAIL", "declarator")
+  debug_649:
     .return (rx603_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__declarator"  :subid("151_1280467477.44751") :method
+.sub "!PREFIX__declarator"  :subid("151_1284728478.15265") :method
 .annotate 'line', 4
     $P605 = self."!PREFIX__!subrule"("routine_declarator", "")
     $P606 = self."!PREFIX__!subrule"("variable_declarator", "")
@@ -7915,7 +8535,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "variable_declarator"  :subid("152_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "variable_declarator"  :subid("152_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx611_tgt
     .local int rx611_pos
@@ -7923,7 +8543,9 @@
     .local int rx611_eos
     .local int rx611_rep
     .local pmc rx611_cur
+    .local pmc rx611_debug
     (rx611_cur, rx611_pos, rx611_tgt, $I10) = self."!cursor_start"()
+    getattribute rx611_debug, rx611_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx611_cur
     .local pmc match
     .lex "$/", match
@@ -7935,7 +8557,9 @@
     substr rx611_tgt, rx611_tgt, rx611_off
   rx611_start:
     eq $I10, 1, rx611_restart
-    rx611_cur."!cursor_debug"("START ", "variable_declarator")
+    if_null rx611_debug, debug_650
+    rx611_cur."!cursor_debug"("START", "variable_declarator")
+  debug_650:
     $I10 = self.'from'()
     ne $I10, -1, rxscan615_done
     goto rxscan615_scan
@@ -7958,11 +8582,15 @@
     rx611_pos = $P10."pos"()
   # rx pass
     rx611_cur."!cursor_pass"(rx611_pos, "variable_declarator")
-    rx611_cur."!cursor_debug"("PASS  ", "variable_declarator", " at pos=", rx611_pos)
+    if_null rx611_debug, debug_651
+    rx611_cur."!cursor_debug"("PASS", "variable_declarator", " at pos=", rx611_pos)
+  debug_651:
     .return (rx611_cur)
   rx611_restart:
 .annotate 'line', 4
-    rx611_cur."!cursor_debug"("NEXT ", "variable_declarator")
+    if_null rx611_debug, debug_652
+    rx611_cur."!cursor_debug"("NEXT", "variable_declarator")
+  debug_652:
   rx611_fail:
     (rx611_rep, rx611_pos, $I10, $P10) = rx611_cur."!mark_fail"(0)
     lt rx611_pos, -1, rx611_done
@@ -7970,14 +8598,16 @@
     jump $I10
   rx611_done:
     rx611_cur."!cursor_fail"()
-    rx611_cur."!cursor_debug"("FAIL  ", "variable_declarator")
+    if_null rx611_debug, debug_653
+    rx611_cur."!cursor_debug"("FAIL", "variable_declarator")
+  debug_653:
     .return (rx611_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__variable_declarator"  :subid("153_1280467477.44751") :method
+.sub "!PREFIX__variable_declarator"  :subid("153_1284728478.15265") :method
 .annotate 'line', 4
     $P613 = self."!PREFIX__!subrule"("variable", "")
     new $P614, "ResizablePMCArray"
@@ -7987,7 +8617,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "routine_declarator"  :subid("154_1280467477.44751") :method
+.sub "routine_declarator"  :subid("154_1284728478.15265") :method
 .annotate 'line', 292
     $P617 = self."!protoregex"("routine_declarator")
     .return ($P617)
@@ -7995,7 +8625,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__routine_declarator"  :subid("155_1280467477.44751") :method
+.sub "!PREFIX__routine_declarator"  :subid("155_1284728478.15265") :method
 .annotate 'line', 292
     $P619 = self."!PREFIX__!protoregex"("routine_declarator")
     .return ($P619)
@@ -8003,7 +8633,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "routine_declarator:sym<sub>"  :subid("156_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "routine_declarator:sym<sub>"  :subid("156_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx621_tgt
     .local int rx621_pos
@@ -8011,7 +8641,9 @@
     .local int rx621_eos
     .local int rx621_rep
     .local pmc rx621_cur
+    .local pmc rx621_debug
     (rx621_cur, rx621_pos, rx621_tgt, $I10) = self."!cursor_start"()
+    getattribute rx621_debug, rx621_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx621_cur
     .local pmc match
     .lex "$/", match
@@ -8023,7 +8655,9 @@
     substr rx621_tgt, rx621_tgt, rx621_off
   rx621_start:
     eq $I10, 1, rx621_restart
-    rx621_cur."!cursor_debug"("START ", "routine_declarator:sym<sub>")
+    if_null rx621_debug, debug_654
+    rx621_cur."!cursor_debug"("START", "routine_declarator:sym<sub>")
+  debug_654:
     $I10 = self.'from'()
     ne $I10, -1, rxscan625_done
     goto rxscan625_scan
@@ -8067,11 +8701,15 @@
     rx621_pos = $P10."pos"()
   # rx pass
     rx621_cur."!cursor_pass"(rx621_pos, "routine_declarator:sym<sub>")
-    rx621_cur."!cursor_debug"("PASS  ", "routine_declarator:sym<sub>", " at pos=", rx621_pos)
+    if_null rx621_debug, debug_655
+    rx621_cur."!cursor_debug"("PASS", "routine_declarator:sym<sub>", " at pos=", rx621_pos)
+  debug_655:
     .return (rx621_cur)
   rx621_restart:
 .annotate 'line', 4
-    rx621_cur."!cursor_debug"("NEXT ", "routine_declarator:sym<sub>")
+    if_null rx621_debug, debug_656
+    rx621_cur."!cursor_debug"("NEXT", "routine_declarator:sym<sub>")
+  debug_656:
   rx621_fail:
     (rx621_rep, rx621_pos, $I10, $P10) = rx621_cur."!mark_fail"(0)
     lt rx621_pos, -1, rx621_done
@@ -8079,14 +8717,16 @@
     jump $I10
   rx621_done:
     rx621_cur."!cursor_fail"()
-    rx621_cur."!cursor_debug"("FAIL  ", "routine_declarator:sym<sub>")
+    if_null rx621_debug, debug_657
+    rx621_cur."!cursor_debug"("FAIL", "routine_declarator:sym<sub>")
+  debug_657:
     .return (rx621_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__routine_declarator:sym<sub>"  :subid("157_1280467477.44751") :method
+.sub "!PREFIX__routine_declarator:sym<sub>"  :subid("157_1284728478.15265") :method
 .annotate 'line', 4
     $P623 = self."!PREFIX__!subrule"("routine_def", "sub")
     new $P624, "ResizablePMCArray"
@@ -8096,7 +8736,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "routine_declarator:sym<method>"  :subid("158_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "routine_declarator:sym<method>"  :subid("158_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx628_tgt
     .local int rx628_pos
@@ -8104,7 +8744,9 @@
     .local int rx628_eos
     .local int rx628_rep
     .local pmc rx628_cur
+    .local pmc rx628_debug
     (rx628_cur, rx628_pos, rx628_tgt, $I10) = self."!cursor_start"()
+    getattribute rx628_debug, rx628_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx628_cur
     .local pmc match
     .lex "$/", match
@@ -8116,7 +8758,9 @@
     substr rx628_tgt, rx628_tgt, rx628_off
   rx628_start:
     eq $I10, 1, rx628_restart
-    rx628_cur."!cursor_debug"("START ", "routine_declarator:sym<method>")
+    if_null rx628_debug, debug_658
+    rx628_cur."!cursor_debug"("START", "routine_declarator:sym<method>")
+  debug_658:
     $I10 = self.'from'()
     ne $I10, -1, rxscan632_done
     goto rxscan632_scan
@@ -8160,11 +8804,15 @@
     rx628_pos = $P10."pos"()
   # rx pass
     rx628_cur."!cursor_pass"(rx628_pos, "routine_declarator:sym<method>")
-    rx628_cur."!cursor_debug"("PASS  ", "routine_declarator:sym<method>", " at pos=", rx628_pos)
+    if_null rx628_debug, debug_659
+    rx628_cur."!cursor_debug"("PASS", "routine_declarator:sym<method>", " at pos=", rx628_pos)
+  debug_659:
     .return (rx628_cur)
   rx628_restart:
 .annotate 'line', 4
-    rx628_cur."!cursor_debug"("NEXT ", "routine_declarator:sym<method>")
+    if_null rx628_debug, debug_660
+    rx628_cur."!cursor_debug"("NEXT", "routine_declarator:sym<method>")
+  debug_660:
   rx628_fail:
     (rx628_rep, rx628_pos, $I10, $P10) = rx628_cur."!mark_fail"(0)
     lt rx628_pos, -1, rx628_done
@@ -8172,14 +8820,16 @@
     jump $I10
   rx628_done:
     rx628_cur."!cursor_fail"()
-    rx628_cur."!cursor_debug"("FAIL  ", "routine_declarator:sym<method>")
+    if_null rx628_debug, debug_661
+    rx628_cur."!cursor_debug"("FAIL", "routine_declarator:sym<method>")
+  debug_661:
     .return (rx628_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__routine_declarator:sym<method>"  :subid("159_1280467477.44751") :method
+.sub "!PREFIX__routine_declarator:sym<method>"  :subid("159_1284728478.15265") :method
 .annotate 'line', 4
     $P630 = self."!PREFIX__!subrule"("method_def", "method")
     new $P631, "ResizablePMCArray"
@@ -8189,7 +8839,7 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "routine_def"  :subid("160_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "routine_def"  :subid("160_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
     .local string rx635_tgt
     .local int rx635_pos
@@ -8197,8 +8847,10 @@
     .local int rx635_eos
     .local int rx635_rep
     .local pmc rx635_cur
+    .local pmc rx635_debug
     (rx635_cur, rx635_pos, rx635_tgt, $I10) = self."!cursor_start"()
-    rx635_cur."!cursor_caparray"("sigil", "deflongname")
+    rx635_cur."!cursor_caparray"("deflongname", "sigil", "trait")
+    getattribute rx635_debug, rx635_cur, "$!debug"
     .lex unicode:"$\x{a2}", rx635_cur
     .local pmc match
     .lex "$/", match
@@ -8210,7 +8862,9 @@
     substr rx635_tgt, rx635_tgt, rx635_off
   rx635_start:
     eq $I10, 1, rx635_restart
-    rx635_cur."!cursor_debug"("START ", "routine_def")
+    if_null rx635_debug, debug_662
+    rx635_cur."!cursor_debug"("START", "routine_def")
+  debug_662:
     $I10 = self.'from'()
     ne $I10, -1, rxscan639_done
     goto rxscan639_scan
@@ -8250,8 +8904,8 @@
     add $I11, rx635_pos, 1
     gt $I11, rx635_eos, rx635_fail
     sub $I11, rx635_pos, rx635_off
-    substr $S10, rx635_tgt, $I11, 1
-    ne $S10, "&", rx635_fail
+    ord $I11, rx635_tgt, $I11
+    ne $I11, 38, rx635_fail
     add rx635_pos, 1
     set_addr $I10, rxquantr643_done
     (rx635_rep) = rx635_cur."!mark_commit"($I10)
@@ -8311,8 +8965,8 @@
     add $I11, rx635_pos, 1
     gt $I11, rx635_eos, rx635_fail
     sub $I11, rx635_pos, rx635_off
-    substr $S10, rx635_tgt, $I11, 1
-    ne $S10, "(", rx635_fail
+    ord $I11, rx635_tgt, $I11
+    ne $I11, 40, rx635_fail
     add rx635_pos, 1
   # rx subrule "ws" subtype=method negate=
     rx635_cur."!cursor_pos"(rx635_pos)
@@ -8335,8 +8989,8 @@
     add $I11, rx635_pos, 1
     gt $I11, rx635_eos, rx635_fail
     sub $I11, rx635_pos, rx635_off
-    substr $S10, rx635_tgt, $I11, 1
-    ne $S10, ")", rx635_fail
+    ord $I11, rx635_tgt, $I11
+    ne $I11, 41, rx635_fail
     add rx635_pos, 1
   # rx subrule "ws" subtype=method negate=
     rx635_cur."!cursor_pos"(rx635_pos)
@@ -8368,6 +9022,35 @@
     unless $P10, rx635_fail
     rx635_pos = $P10."pos"()
 .annotate 'line', 301
+  # rx rxquantr656 ** 0..*
+    set_addr $I10, rxquantr656_done
+    rx635_cur."!mark_push"(0, rx635_pos, $I10)
+  rxquantr656_loop:
+  # rx subrule "trait" subtype=capture negate=
+    rx635_cur."!cursor_pos"(rx635_pos)
+    $P10 = rx635_cur."trait"()
+    unless $P10, rx635_fail
+    goto rxsubrule657_pass
+  rxsubrule657_back:
+    $P10 = $P10."!cursor_next"()
+    unless $P10, rx635_fail
+  rxsubrule657_pass:
+    set_addr $I10, rxsubrule657_back
+    rx635_cur."!mark_push"(0, rx635_pos, $I10, $P10)
+    $P10."!cursor_names"("trait")
+    rx635_pos = $P10."pos"()
+    set_addr $I10, rxquantr656_done
+    (rx635_rep) = rx635_cur."!mark_commit"($I10)
+    set_addr $I10, rxquantr656_done
+    rx635_cur."!mark_push"(rx635_rep, rx635_pos, $I10)
+    goto rxquantr656_loop
+  rxquantr656_done:
+  # rx subrule "ws" subtype=method negate=
+    rx635_cur."!cursor_pos"(rx635_pos)
+    $P10 = rx635_cur."ws"()
+    unless $P10, rx635_fail
+    rx635_pos = $P10."pos"()
+.annotate 'line', 302
   # rx subrule "blockoid" subtype=capture negate=
     rx635_cur."!cursor_pos"(rx635_pos)
     $P10 = rx635_cur."blockoid"()
@@ -8383,11 +9066,15 @@
 .annotate 'line', 296
   # rx pass
     rx635_cur."!cursor_pass"(rx635_pos, "routine_def")
-    rx635_cur."!cursor_debug"("PASS  ", "routine_def", " at pos=", rx635_pos)
+    if_null rx635_debug, debug_663
+    rx635_cur."!cursor_debug"("PASS", "routine_def", " at pos=", rx635_pos)
+  debug_663:
     .return (rx635_cur)
   rx635_restart:
 .annotate 'line', 4
-    rx635_cur."!cursor_debug"("NEXT ", "routine_def")
+    if_null rx635_debug, debug_664
+    rx635_cur."!cursor_debug"("NEXT", "routine_def")
+  debug_664:
   rx635_fail:
     (rx635_rep, rx635_pos, $I10, $P10) = rx635_cur."!mark_fail"(0)
     lt rx635_pos, -1, rx635_done
@@ -8395,14 +9082,16 @@
     jump $I10
   rx635_done:
     rx635_cur."!cursor_fail"()
-    rx635_cur."!cursor_debug"("FAIL  ", "routine_def")
+    if_null rx635_debug, debug_665
+    rx635_cur."!cursor_debug"("FAIL", "routine_def")
+  debug_665:
     .return (rx635_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__routine_def"  :subid("161_1280467477.44751") :method
+.sub "!PREFIX__routine_def"  :subid("161_1284728478.15265") :method
 .annotate 'line', 4
     $P637 = self."!PREFIX__!subrule"("ws", "")
     new $P638, "ResizablePMCArray"
@@ -8412,953 +9101,964 @@
 
 
 .namespace ["NQP";"Grammar"]
-.sub "method_def"  :subid("162_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "method_def"  :subid("162_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
-    .local string rx658_tgt
-    .local int rx658_pos
-    .local int rx658_off
-    .local int rx658_eos
-    .local int rx658_rep
-    .local pmc rx658_cur
-    (rx658_cur, rx658_pos, rx658_tgt, $I10) = self."!cursor_start"()
-    rx658_cur."!cursor_caparray"("deflongname")
-    .lex unicode:"$\x{a2}", rx658_cur
-    .local pmc match
-    .lex "$/", match
-    length rx658_eos, rx658_tgt
-    gt rx658_pos, rx658_eos, rx658_done
-    set rx658_off, 0
-    lt rx658_pos, 2, rx658_start
-    sub rx658_off, rx658_pos, 1
-    substr rx658_tgt, rx658_tgt, rx658_off
-  rx658_start:
-    eq $I10, 1, rx658_restart
-    rx658_cur."!cursor_debug"("START ", "method_def")
-    $I10 = self.'from'()
-    ne $I10, -1, rxscan662_done
-    goto rxscan662_scan
-  rxscan662_loop:
-    ($P10) = rx658_cur."from"()
-    inc $P10
-    set rx658_pos, $P10
-    ge rx658_pos, rx658_eos, rxscan662_done
-  rxscan662_scan:
-    set_addr $I10, rxscan662_loop
-    rx658_cur."!mark_push"(0, rx658_pos, $I10)
-  rxscan662_done:
-.annotate 'line', 304
-  # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
+    .local string rx661_tgt
+    .local int rx661_pos
+    .local int rx661_off
+    .local int rx661_eos
+    .local int rx661_rep
+    .local pmc rx661_cur
+    .local pmc rx661_debug
+    (rx661_cur, rx661_pos, rx661_tgt, $I10) = self."!cursor_start"()
+    rx661_cur."!cursor_caparray"("deflongname", "trait")
+    getattribute rx661_debug, rx661_cur, "$!debug"
+    .lex unicode:"$\x{a2}", rx661_cur
+    .local pmc match
+    .lex "$/", match
+    length rx661_eos, rx661_tgt
+    gt rx661_pos, rx661_eos, rx661_done
+    set rx661_off, 0
+    lt rx661_pos, 2, rx661_start
+    sub rx661_off, rx661_pos, 1
+    substr rx661_tgt, rx661_tgt, rx661_off
+  rx661_start:
+    eq $I10, 1, rx661_restart
+    if_null rx661_debug, debug_666
+    rx661_cur."!cursor_debug"("START", "method_def")
+  debug_666:
+    $I10 = self.'from'()
+    ne $I10, -1, rxscan665_done
+    goto rxscan665_scan
+  rxscan665_loop:
+    ($P10) = rx661_cur."from"()
+    inc $P10
+    set rx661_pos, $P10
+    ge rx661_pos, rx661_eos, rxscan665_done
+  rxscan665_scan:
+    set_addr $I10, rxscan665_loop
+    rx661_cur."!mark_push"(0, rx661_pos, $I10)
+  rxscan665_done:
 .annotate 'line', 305
-  # rx rxquantr664 ** 0..1
-    set_addr $I10, rxquantr664_done
-    rx658_cur."!mark_push"(0, rx658_pos, $I10)
-  rxquantr664_loop:
+  # rx subrule "ws" subtype=method negate=
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
+.annotate 'line', 306
+  # rx rxquantr667 ** 0..1
+    set_addr $I10, rxquantr667_done
+    rx661_cur."!mark_push"(0, rx661_pos, $I10)
+  rxquantr667_loop:
   # rx subrule "deflongname" subtype=capture negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."deflongname"()
-    unless $P10, rx658_fail
-    goto rxsubrule665_pass
-  rxsubrule665_back:
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."deflongname"()
+    unless $P10, rx661_fail
+    goto rxsubrule668_pass
+  rxsubrule668_back:
     $P10 = $P10."!cursor_next"()
-    unless $P10, rx658_fail
-  rxsubrule665_pass:
-    set_addr $I10, rxsubrule665_back
-    rx658_cur."!mark_push"(0, rx658_pos, $I10, $P10)
+    unless $P10, rx661_fail
+  rxsubrule668_pass:
+    set_addr $I10, rxsubrule668_back
+    rx661_cur."!mark_push"(0, rx661_pos, $I10, $P10)
     $P10."!cursor_names"("deflongname")
-    rx658_pos = $P10."pos"()
-    set_addr $I10, rxquantr664_done
-    (rx658_rep) = rx658_cur."!mark_commit"($I10)
-  rxquantr664_done:
-  # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
-.annotate 'line', 306
-  # rx subrule "newpad" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."newpad"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
-  # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
-  alt668_0:
+    rx661_pos = $P10."pos"()
+    set_addr $I10, rxquantr667_done
+    (rx661_rep) = rx661_cur."!mark_commit"($I10)
+  rxquantr667_done:
+  # rx subrule "ws" subtype=method negate=
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
 .annotate 'line', 307
-    set_addr $I10, alt668_1
-    rx658_cur."!mark_push"(0, rx658_pos, $I10)
+  # rx subrule "newpad" subtype=method negate=
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."newpad"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
+  # rx subrule "ws" subtype=method negate=
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
+  alt671_0:
+.annotate 'line', 308
+    set_addr $I10, alt671_1
+    rx661_cur."!mark_push"(0, rx661_pos, $I10)
   # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
   # rx literal  "("
-    add $I11, rx658_pos, 1
-    gt $I11, rx658_eos, rx658_fail
-    sub $I11, rx658_pos, rx658_off
-    substr $S10, rx658_tgt, $I11, 1
-    ne $S10, "(", rx658_fail
-    add rx658_pos, 1
-  # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
+    add $I11, rx661_pos, 1
+    gt $I11, rx661_eos, rx661_fail
+    sub $I11, rx661_pos, rx661_off
+    ord $I11, rx661_tgt, $I11
+    ne $I11, 40, rx661_fail
+    add rx661_pos, 1
+  # rx subrule "ws" subtype=method negate=
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
   # rx subrule "signature" subtype=capture negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."signature"()
-    unless $P10, rx658_fail
-    rx658_cur."!mark_push"(0, -1, 0, $P10)
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."signature"()
+    unless $P10, rx661_fail
+    rx661_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("signature")
-    rx658_pos = $P10."pos"()
+    rx661_pos = $P10."pos"()
   # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
   # rx literal  ")"
-    add $I11, rx658_pos, 1
-    gt $I11, rx658_eos, rx658_fail
-    sub $I11, rx658_pos, rx658_off
-    substr $S10, rx658_tgt, $I11, 1
-    ne $S10, ")", rx658_fail
-    add rx658_pos, 1
-  # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
-    goto alt668_end
-  alt668_1:
-.annotate 'line', 308
+    add $I11, rx661_pos, 1
+    gt $I11, rx661_eos, rx661_fail
+    sub $I11, rx661_pos, rx661_off
+    ord $I11, rx661_tgt, $I11
+    ne $I11, 41, rx661_fail
+    add rx661_pos, 1
+  # rx subrule "ws" subtype=method negate=
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
+    goto alt671_end
+  alt671_1:
+.annotate 'line', 309
   # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
   # rx subrule "panic" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."panic"("Routine declaration requires a signature")
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
-  # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
-  alt668_end:
-  # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
-.annotate 'line', 309
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."panic"("Routine declaration requires a signature")
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
+  # rx subrule "ws" subtype=method negate=
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
+  alt671_end:
+  # rx subrule "ws" subtype=method negate=
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
+.annotate 'line', 310
+  # rx rxquantr679 ** 0..*
+    set_addr $I10, rxquantr679_done
+    rx661_cur."!mark_push"(0, rx661_pos, $I10)
+  rxquantr679_loop:
+  # rx subrule "trait" subtype=capture negate=
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."trait"()
+    unless $P10, rx661_fail
+    goto rxsubrule680_pass
+  rxsubrule680_back:
+    $P10 = $P10."!cursor_next"()
+    unless $P10, rx661_fail
+  rxsubrule680_pass:
+    set_addr $I10, rxsubrule680_back
+    rx661_cur."!mark_push"(0, rx661_pos, $I10, $P10)
+    $P10."!cursor_names"("trait")
+    rx661_pos = $P10."pos"()
+    set_addr $I10, rxquantr679_done
+    (rx661_rep) = rx661_cur."!mark_commit"($I10)
+    set_addr $I10, rxquantr679_done
+    rx661_cur."!mark_push"(rx661_rep, rx661_pos, $I10)
+    goto rxquantr679_loop
+  rxquantr679_done:
+  # rx subrule "ws" subtype=method negate=
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
+.annotate 'line', 311
   # rx subrule "blockoid" subtype=capture negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."blockoid"()
-    unless $P10, rx658_fail
-    rx658_cur."!mark_push"(0, -1, 0, $P10)
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."blockoid"()
+    unless $P10, rx661_fail
+    rx661_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("blockoid")
-    rx658_pos = $P10."pos"()
+    rx661_pos = $P10."pos"()
   # rx subrule "ws" subtype=method negate=
-    rx658_cur."!cursor_pos"(rx658_pos)
-    $P10 = rx658_cur."ws"()
-    unless $P10, rx658_fail
-    rx658_pos = $P10."pos"()
-.annotate 'line', 304
+    rx661_cur."!cursor_pos"(rx661_pos)
+    $P10 = rx661_cur."ws"()
+    unless $P10, rx661_fail
+    rx661_pos = $P10."pos"()
+.annotate 'line', 305
   # rx pass
-    rx658_cur."!cursor_pass"(rx658_pos, "method_def")
-    rx658_cur."!cursor_debug"("PASS  ", "method_def", " at pos=", rx658_pos)
-    .return (rx658_cur)
-  rx658_restart:
+    rx661_cur."!cursor_pass"(rx661_pos, "method_def")
+    if_null rx661_debug, debug_667
+    rx661_cur."!cursor_debug"("PASS", "method_def", " at pos=", rx661_pos)
+  debug_667:
+    .return (rx661_cur)
+  rx661_restart:
 .annotate 'line', 4
-    rx658_cur."!cursor_debug"("NEXT ", "method_def")
-  rx658_fail:
-    (rx658_rep, rx658_pos, $I10, $P10) = rx658_cur."!mark_fail"(0)
-    lt rx658_pos, -1, rx658_done
-    eq rx658_pos, -1, rx658_fail
+    if_null rx661_debug, debug_668
+    rx661_cur."!cursor_debug"("NEXT", "method_def")
+  debug_668:
+  rx661_fail:
+    (rx661_rep, rx661_pos, $I10, $P10) = rx661_cur."!mark_fail"(0)
+    lt rx661_pos, -1, rx661_done
+    eq rx661_pos, -1, rx661_fail
     jump $I10
-  rx658_done:
-    rx658_cur."!cursor_fail"()
-    rx658_cur."!cursor_debug"("FAIL  ", "method_def")
-    .return (rx658_cur)
+  rx661_done:
+    rx661_cur."!cursor_fail"()
+    if_null rx661_debug, debug_669
+    rx661_cur."!cursor_debug"("FAIL", "method_def")
+  debug_669:
+    .return (rx661_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__method_def"  :subid("163_1280467477.44751") :method
+.sub "!PREFIX__method_def"  :subid("163_1284728478.15265") :method
 .annotate 'line', 4
-    $P660 = self."!PREFIX__!subrule"("ws", "")
-    new $P661, "ResizablePMCArray"
-    push $P661, $P660
-    .return ($P661)
+    $P663 = self."!PREFIX__!subrule"("ws", "")
+    new $P664, "ResizablePMCArray"
+    push $P664, $P663
+    .return ($P664)
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "multi_declarator"  :subid("164_1280467477.44751") :method
-.annotate 'line', 312
-    $P678 = self."!protoregex"("multi_declarator")
-    .return ($P678)
+.sub "multi_declarator"  :subid("164_1284728478.15265") :method
+.annotate 'line', 314
+    $P684 = self."!protoregex"("multi_declarator")
+    .return ($P684)
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__multi_declarator"  :subid("165_1280467477.44751") :method
-.annotate 'line', 312
-    $P680 = self."!PREFIX__!protoregex"("multi_declarator")
-    .return ($P680)
+.sub "!PREFIX__multi_declarator"  :subid("165_1284728478.15265") :method
+.annotate 'line', 314
+    $P686 = self."!PREFIX__!protoregex"("multi_declarator")
+    .return ($P686)
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "multi_declarator:sym<multi>"  :subid("166_1280467477.44751") :method :outer("11_1280467477.44751")
-.annotate 'line', 314
-    new $P682, "Undef"
-    .lex "$*MULTINESS", $P682
+.sub "multi_declarator:sym<multi>"  :subid("166_1284728478.15265") :method :outer("11_1284728478.15265")
+.annotate 'line', 316
+    new $P688, "Undef"
+    .lex "$*MULTINESS", $P688
 .annotate 'line', 4
-    .local string rx683_tgt
-    .local int rx683_pos
-    .local int rx683_off
-    .local int rx683_eos
-    .local int rx683_rep
-    .local pmc rx683_cur
-    (rx683_cur, rx683_pos, rx683_tgt, $I10) = self."!cursor_start"()
-    .lex unicode:"$\x{a2}", rx683_cur
-    .local pmc match
-    .lex "$/", match
-    length rx683_eos, rx683_tgt
-    gt rx683_pos, rx683_eos, rx683_done
-    set rx683_off, 0
-    lt rx683_pos, 2, rx683_start
-    sub rx683_off, rx683_pos, 1
-    substr rx683_tgt, rx683_tgt, rx683_off
-  rx683_start:
-    eq $I10, 1, rx683_restart
-    rx683_cur."!cursor_debug"("START ", "multi_declarator:sym<multi>")
-    $I10 = self.'from'()
-    ne $I10, -1, rxscan687_done
-    goto rxscan687_scan
-  rxscan687_loop:
-    ($P10) = rx683_cur."from"()
-    inc $P10
-    set rx683_pos, $P10
-    ge rx683_pos, rx683_eos, rxscan687_done
-  rxscan687_scan:
-    set_addr $I10, rxscan687_loop
-    rx683_cur."!mark_push"(0, rx683_pos, $I10)
-  rxscan687_done:
-.annotate 'line', 314
-    rx683_cur."!cursor_pos"(rx683_pos)
-    new $P688, "String"
-    assign $P688, "multi"
-    store_lex "$*MULTINESS", $P688
-.annotate 'line', 315
+    .local string rx689_tgt
+    .local int rx689_pos
+    .local int rx689_off
+    .local int rx689_eos
+    .local int rx689_rep
+    .local pmc rx689_cur
+    .local pmc rx689_debug
+    (rx689_cur, rx689_pos, rx689_tgt, $I10) = self."!cursor_start"()
+    getattribute rx689_debug, rx689_cur, "$!debug"
+    .lex unicode:"$\x{a2}", rx689_cur
+    .local pmc match
+    .lex "$/", match
+    length rx689_eos, rx689_tgt
+    gt rx689_pos, rx689_eos, rx689_done
+    set rx689_off, 0
+    lt rx689_pos, 2, rx689_start
+    sub rx689_off, rx689_pos, 1
+    substr rx689_tgt, rx689_tgt, rx689_off
+  rx689_start:
+    eq $I10, 1, rx689_restart
+    if_null rx689_debug, debug_670
+    rx689_cur."!cursor_debug"("START", "multi_declarator:sym<multi>")
+  debug_670:
+    $I10 = self.'from'()
+    ne $I10, -1, rxscan693_done
+    goto rxscan693_scan
+  rxscan693_loop:
+    ($P10) = rx689_cur."from"()
+    inc $P10
+    set rx689_pos, $P10
+    ge rx689_pos, rx689_eos, rxscan693_done
+  rxscan693_scan:
+    set_addr $I10, rxscan693_loop
+    rx689_cur."!mark_push"(0, rx689_pos, $I10)
+  rxscan693_done:
+.annotate 'line', 316
+    rx689_cur."!cursor_pos"(rx689_pos)
+    new $P694, "String"
+    assign $P694, "multi"
+    store_lex "$*MULTINESS", $P694
+.annotate 'line', 317
   # rx subcapture "sym"
-    set_addr $I10, rxcap_689_fail
-    rx683_cur."!mark_push"(0, rx683_pos, $I10)
+    set_addr $I10, rxcap_695_fail
+    rx689_cur."!mark_push"(0, rx689_pos, $I10)
   # rx literal  "multi"
-    add $I11, rx683_pos, 5
-    gt $I11, rx683_eos, rx683_fail
-    sub $I11, rx683_pos, rx683_off
-    substr $S10, rx683_tgt, $I11, 5
-    ne $S10, "multi", rx683_fail
-    add rx683_pos, 5
-    set_addr $I10, rxcap_689_fail
-    ($I12, $I11) = rx683_cur."!mark_peek"($I10)
-    rx683_cur."!cursor_pos"($I11)
-    ($P10) = rx683_cur."!cursor_start"()
-    $P10."!cursor_pass"(rx683_pos, "")
-    rx683_cur."!mark_push"(0, -1, 0, $P10)
+    add $I11, rx689_pos, 5
+    gt $I11, rx689_eos, rx689_fail
+    sub $I11, rx689_pos, rx689_off
+    substr $S10, rx689_tgt, $I11, 5
+    ne $S10, "multi", rx689_fail
+    add rx689_pos, 5
+    set_addr $I10, rxcap_695_fail
+    ($I12, $I11) = rx689_cur."!mark_peek"($I10)
+    rx689_cur."!cursor_pos"($I11)
+    ($P10) = rx689_cur."!cursor_start"()
+    $P10."!cursor_pass"(rx689_pos, "")
+    rx689_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("sym")
-    goto rxcap_689_done
-  rxcap_689_fail:
-    goto rx683_fail
-  rxcap_689_done:
-.annotate 'line', 316
+    goto rxcap_695_done
+  rxcap_695_fail:
+    goto rx689_fail
+  rxcap_695_done:
+.annotate 'line', 318
   # rx subrule "ws" subtype=method negate=
-    rx683_cur."!cursor_pos"(rx683_pos)
-    $P10 = rx683_cur."ws"()
-    unless $P10, rx683_fail
-    rx683_pos = $P10."pos"()
-  alt690_0:
-    set_addr $I10, alt690_1
-    rx683_cur."!mark_push"(0, rx683_pos, $I10)
+    rx689_cur."!cursor_pos"(rx689_pos)
+    $P10 = rx689_cur."ws"()
+    unless $P10, rx689_fail
+    rx689_pos = $P10."pos"()
+  alt696_0:
+    set_addr $I10, alt696_1
+    rx689_cur."!mark_push"(0, rx689_pos, $I10)
   # rx subrule "declarator" subtype=capture negate=
-    rx683_cur."!cursor_pos"(rx683_pos)
-    $P10 = rx683_cur."declarator"()
-    unless $P10, rx683_fail
-    rx683_cur."!mark_push"(0, -1, 0, $P10)
+    rx689_cur."!cursor_pos"(rx689_pos)
+    $P10 = rx689_cur."declarator"()
+    unless $P10, rx689_fail
+    rx689_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("declarator")
-    rx683_pos = $P10."pos"()
-    goto alt690_end
-  alt690_1:
-    set_addr $I10, alt690_2
-    rx683_cur."!mark_push"(0, rx683_pos, $I10)
+    rx689_pos = $P10."pos"()
+    goto alt696_end
+  alt696_1:
+    set_addr $I10, alt696_2
+    rx689_cur."!mark_push"(0, rx689_pos, $I10)
   # rx subrule "routine_def" subtype=capture negate=
-    rx683_cur."!cursor_pos"(rx683_pos)
-    $P10 = rx683_cur."routine_def"()
-    unless $P10, rx683_fail
-    rx683_cur."!mark_push"(0, -1, 0, $P10)
+    rx689_cur."!cursor_pos"(rx689_pos)
+    $P10 = rx689_cur."routine_def"()
+    unless $P10, rx689_fail
+    rx689_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("routine_def")
-    rx683_pos = $P10."pos"()
-    goto alt690_end
-  alt690_2:
+    rx689_pos = $P10."pos"()
+    goto alt696_end
+  alt696_2:
   # rx subrule "panic" subtype=method negate=
-    rx683_cur."!cursor_pos"(rx683_pos)
-    $P10 = rx683_cur."panic"("Malformed multi")
-    unless $P10, rx683_fail
-    rx683_pos = $P10."pos"()
-  alt690_end:
-.annotate 'line', 313
-  # rx pass
-    rx683_cur."!cursor_pass"(rx683_pos, "multi_declarator:sym<multi>")
-    rx683_cur."!cursor_debug"("PASS  ", "multi_declarator:sym<multi>", " at pos=", rx683_pos)
-    .return (rx683_cur)
-  rx683_restart:
-.annotate 'line', 4
-    rx683_cur."!cursor_debug"("NEXT ", "multi_declarator:sym<multi>")
-  rx683_fail:
-    (rx683_rep, rx683_pos, $I10, $P10) = rx683_cur."!mark_fail"(0)
-    lt rx683_pos, -1, rx683_done
-    eq rx683_pos, -1, rx683_fail
-    jump $I10
-  rx683_done:
-    rx683_cur."!cursor_fail"()
-    rx683_cur."!cursor_debug"("FAIL  ", "multi_declarator:sym<multi>")
-    .return (rx683_cur)
-    .return ()
-.end
-
-
-.namespace ["NQP";"Grammar"]
-.sub "!PREFIX__multi_declarator:sym<multi>"  :subid("167_1280467477.44751") :method
-.annotate 'line', 4
-    $P685 = self."!PREFIX__!subrule"("ws", "multi")
-    new $P686, "ResizablePMCArray"
-    push $P686, $P685
-    .return ($P686)
-.end
-
-
-.namespace ["NQP";"Grammar"]
-.sub "multi_declarator:sym<null>"  :subid("168_1280467477.44751") :method :outer("11_1280467477.44751")
-.annotate 'line', 319
-    new $P692, "Undef"
-    .lex "$*MULTINESS", $P692
-.annotate 'line', 4
-    .local string rx693_tgt
-    .local int rx693_pos
-    .local int rx693_off
-    .local int rx693_eos
-    .local int rx693_rep
-    .local pmc rx693_cur
-    (rx693_cur, rx693_pos, rx693_tgt, $I10) = self."!cursor_start"()
-    .lex unicode:"$\x{a2}", rx693_cur
-    .local pmc match
-    .lex "$/", match
-    length rx693_eos, rx693_tgt
-    gt rx693_pos, rx693_eos, rx693_done
-    set rx693_off, 0
-    lt rx693_pos, 2, rx693_start
-    sub rx693_off, rx693_pos, 1
-    substr rx693_tgt, rx693_tgt, rx693_off
-  rx693_start:
-    eq $I10, 1, rx693_restart
-    rx693_cur."!cursor_debug"("START ", "multi_declarator:sym<null>")
-    $I10 = self.'from'()
-    ne $I10, -1, rxscan697_done
-    goto rxscan697_scan
-  rxscan697_loop:
-    ($P10) = rx693_cur."from"()
-    inc $P10
-    set rx693_pos, $P10
-    ge rx693_pos, rx693_eos, rxscan697_done
-  rxscan697_scan:
-    set_addr $I10, rxscan697_loop
-    rx693_cur."!mark_push"(0, rx693_pos, $I10)
-  rxscan697_done:
-.annotate 'line', 319
-    rx693_cur."!cursor_pos"(rx693_pos)
-    new $P698, "String"
-    assign $P698, ""
-    store_lex "$*MULTINESS", $P698
-.annotate 'line', 320
-  # rx subrule "declarator" subtype=capture negate=
-    rx693_cur."!cursor_pos"(rx693_pos)
-    $P10 = rx693_cur."declarator"()
-    unless $P10, rx693_fail
-    rx693_cur."!mark_push"(0, -1, 0, $P10)
-    $P10."!cursor_names"("declarator")
-    rx693_pos = $P10."pos"()
-.annotate 'line', 318
+    rx689_cur."!cursor_pos"(rx689_pos)
+    $P10 = rx689_cur."panic"("Malformed multi")
+    unless $P10, rx689_fail
+    rx689_pos = $P10."pos"()
+  alt696_end:
+.annotate 'line', 315
   # rx pass
-    rx693_cur."!cursor_pass"(rx693_pos, "multi_declarator:sym<null>")
-    rx693_cur."!cursor_debug"("PASS  ", "multi_declarator:sym<null>", " at pos=", rx693_pos)
-    .return (rx693_cur)
-  rx693_restart:
+    rx689_cur."!cursor_pass"(rx689_pos, "multi_declarator:sym<multi>")
+    if_null rx689_debug, debug_671
+    rx689_cur."!cursor_debug"("PASS", "multi_declarator:sym<multi>", " at pos=", rx689_pos)
+  debug_671:
+    .return (rx689_cur)
+  rx689_restart:
 .annotate 'line', 4
-    rx693_cur."!cursor_debug"("NEXT ", "multi_declarator:sym<null>")
-  rx693_fail:
-    (rx693_rep, rx693_pos, $I10, $P10) = rx693_cur."!mark_fail"(0)
-    lt rx693_pos, -1, rx693_done
-    eq rx693_pos, -1, rx693_fail
+    if_null rx689_debug, debug_672
+    rx689_cur."!cursor_debug"("NEXT", "multi_declarator:sym<multi>")
+  debug_672:
+  rx689_fail:
+    (rx689_rep, rx689_pos, $I10, $P10) = rx689_cur."!mark_fail"(0)
+    lt rx689_pos, -1, rx689_done
+    eq rx689_pos, -1, rx689_fail
     jump $I10
-  rx693_done:
-    rx693_cur."!cursor_fail"()
-    rx693_cur."!cursor_debug"("FAIL  ", "multi_declarator:sym<null>")
-    .return (rx693_cur)
+  rx689_done:
+    rx689_cur."!cursor_fail"()
+    if_null rx689_debug, debug_673
+    rx689_cur."!cursor_debug"("FAIL", "multi_declarator:sym<multi>")
+  debug_673:
+    .return (rx689_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__multi_declarator:sym<null>"  :subid("169_1280467477.44751") :method
+.sub "!PREFIX__multi_declarator:sym<multi>"  :subid("167_1284728478.15265") :method
 .annotate 'line', 4
-    $P695 = self."!PREFIX__!subrule"("declarator", "")
-    new $P696, "ResizablePMCArray"
-    push $P696, $P695
-    .return ($P696)
+    $P691 = self."!PREFIX__!subrule"("ws", "multi")
+    new $P692, "ResizablePMCArray"
+    push $P692, $P691
+    .return ($P692)
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "signature"  :subid("170_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "multi_declarator:sym<null>"  :subid("168_1284728478.15265") :method :outer("11_1284728478.15265")
+.annotate 'line', 321
+    new $P698, "Undef"
+    .lex "$*MULTINESS", $P698
 .annotate 'line', 4
-    .local string rx700_tgt
-    .local int rx700_pos
-    .local int rx700_off
-    .local int rx700_eos
-    .local int rx700_rep
-    .local pmc rx700_cur
-    (rx700_cur, rx700_pos, rx700_tgt, $I10) = self."!cursor_start"()
-    rx700_cur."!cursor_caparray"("parameter")
-    .lex unicode:"$\x{a2}", rx700_cur
-    .local pmc match
-    .lex "$/", match
-    length rx700_eos, rx700_tgt
-    gt rx700_pos, rx700_eos, rx700_done
-    set rx700_off, 0
-    lt rx700_pos, 2, rx700_start
-    sub rx700_off, rx700_pos, 1
-    substr rx700_tgt, rx700_tgt, rx700_off
-  rx700_start:
-    eq $I10, 1, rx700_restart
-    rx700_cur."!cursor_debug"("START ", "signature")
+    .local string rx699_tgt
+    .local int rx699_pos
+    .local int rx699_off
+    .local int rx699_eos
+    .local int rx699_rep
+    .local pmc rx699_cur
+    .local pmc rx699_debug
+    (rx699_cur, rx699_pos, rx699_tgt, $I10) = self."!cursor_start"()
+    getattribute rx699_debug, rx699_cur, "$!debug"
+    .lex unicode:"$\x{a2}", rx699_cur
+    .local pmc match
+    .lex "$/", match
+    length rx699_eos, rx699_tgt
+    gt rx699_pos, rx699_eos, rx699_done
+    set rx699_off, 0
+    lt rx699_pos, 2, rx699_start
+    sub rx699_off, rx699_pos, 1
+    substr rx699_tgt, rx699_tgt, rx699_off
+  rx699_start:
+    eq $I10, 1, rx699_restart
+    if_null rx699_debug, debug_674
+    rx699_cur."!cursor_debug"("START", "multi_declarator:sym<null>")
+  debug_674:
     $I10 = self.'from'()
     ne $I10, -1, rxscan703_done
     goto rxscan703_scan
   rxscan703_loop:
-    ($P10) = rx700_cur."from"()
+    ($P10) = rx699_cur."from"()
     inc $P10
-    set rx700_pos, $P10
-    ge rx700_pos, rx700_eos, rxscan703_done
+    set rx699_pos, $P10
+    ge rx699_pos, rx699_eos, rxscan703_done
   rxscan703_scan:
     set_addr $I10, rxscan703_loop
-    rx700_cur."!mark_push"(0, rx700_pos, $I10)
+    rx699_cur."!mark_push"(0, rx699_pos, $I10)
   rxscan703_done:
-.annotate 'line', 323
-  # rx rxquantr704 ** 0..1
-    set_addr $I10, rxquantr704_done
-    rx700_cur."!mark_push"(0, rx700_pos, $I10)
-  rxquantr704_loop:
-  # rx rxquantr705 ** 1..*
-    set_addr $I10, rxquantr705_done
-    rx700_cur."!mark_push"(0, -1, $I10)
-  rxquantr705_loop:
-  # rx subrule "ws" subtype=method negate=
-    rx700_cur."!cursor_pos"(rx700_pos)
-    $P10 = rx700_cur."ws"()
-    unless $P10, rx700_fail
-    rx700_pos = $P10."pos"()
-  # rx subrule "parameter" subtype=capture negate=
-    rx700_cur."!cursor_pos"(rx700_pos)
-    $P10 = rx700_cur."parameter"()
-    unless $P10, rx700_fail
-    rx700_cur."!mark_push"(0, -1, 0, $P10)
-    $P10."!cursor_names"("parameter")
-    rx700_pos = $P10."pos"()
-  # rx subrule "ws" subtype=method negate=
-    rx700_cur."!cursor_pos"(rx700_pos)
-    $P10 = rx700_cur."ws"()
-    unless $P10, rx700_fail
-    rx700_pos = $P10."pos"()
-    set_addr $I10, rxquantr705_done
-    (rx700_rep) = rx700_cur."!mark_commit"($I10)
-    set_addr $I10, rxquantr705_done
-    rx700_cur."!mark_push"(rx700_rep, rx700_pos, $I10)
-  # rx literal  ","
-    add $I11, rx700_pos, 1
-    gt $I11, rx700_eos, rx700_fail
-    sub $I11, rx700_pos, rx700_off
-    substr $S10, rx700_tgt, $I11, 1
-    ne $S10, ",", rx700_fail
-    add rx700_pos, 1
-    goto rxquantr705_loop
-  rxquantr705_done:
-    set_addr $I10, rxquantr704_done
-    (rx700_rep) = rx700_cur."!mark_commit"($I10)
-  rxquantr704_done:
-  # rx pass
-    rx700_cur."!cursor_pass"(rx700_pos, "signature")
-    rx700_cur."!cursor_debug"("PASS  ", "signature", " at pos=", rx700_pos)
-    .return (rx700_cur)
-  rx700_restart:
-.annotate 'line', 4
-    rx700_cur."!cursor_debug"("NEXT ", "signature")
-  rx700_fail:
-    (rx700_rep, rx700_pos, $I10, $P10) = rx700_cur."!mark_fail"(0)
-    lt rx700_pos, -1, rx700_done
-    eq rx700_pos, -1, rx700_fail
-    jump $I10
-  rx700_done:
-    rx700_cur."!cursor_fail"()
-    rx700_cur."!cursor_debug"("FAIL  ", "signature")
-    .return (rx700_cur)
+.annotate 'line', 321
+    rx699_cur."!cursor_pos"(rx699_pos)
+    new $P704, "String"
+    assign $P704, ""
+    store_lex "$*MULTINESS", $P704
+.annotate 'line', 322
+  # rx subrule "declarator" subtype=capture negate=
+    rx699_cur."!cursor_pos"(rx699_pos)
+    $P10 = rx699_cur."declarator"()
+    unless $P10, rx699_fail
+    rx699_cur."!mark_push"(0, -1, 0, $P10)
+    $P10."!cursor_names"("declarator")
+    rx699_pos = $P10."pos"()
+.annotate 'line', 320
+  # rx pass
+    rx699_cur."!cursor_pass"(rx699_pos, "multi_declarator:sym<null>")
+    if_null rx699_debug, debug_675
+    rx699_cur."!cursor_debug"("PASS", "multi_declarator:sym<null>", " at pos=", rx699_pos)
+  debug_675:
+    .return (rx699_cur)
+  rx699_restart:
+.annotate 'line', 4
+    if_null rx699_debug, debug_676
+    rx699_cur."!cursor_debug"("NEXT", "multi_declarator:sym<null>")
+  debug_676:
+  rx699_fail:
+    (rx699_rep, rx699_pos, $I10, $P10) = rx699_cur."!mark_fail"(0)
+    lt rx699_pos, -1, rx699_done
+    eq rx699_pos, -1, rx699_fail
+    jump $I10
+  rx699_done:
+    rx699_cur."!cursor_fail"()
+    if_null rx699_debug, debug_677
+    rx699_cur."!cursor_debug"("FAIL", "multi_declarator:sym<null>")
+  debug_677:
+    .return (rx699_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__signature"  :subid("171_1280467477.44751") :method
+.sub "!PREFIX__multi_declarator:sym<null>"  :subid("169_1284728478.15265") :method
 .annotate 'line', 4
+    $P701 = self."!PREFIX__!subrule"("declarator", "")
     new $P702, "ResizablePMCArray"
-    push $P702, ""
+    push $P702, $P701
     .return ($P702)
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "parameter"  :subid("172_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "signature"  :subid("170_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
-    .local string rx707_tgt
-    .local int rx707_pos
-    .local int rx707_off
-    .local int rx707_eos
-    .local int rx707_rep
-    .local pmc rx707_cur
-    (rx707_cur, rx707_pos, rx707_tgt, $I10) = self."!cursor_start"()
-    rx707_cur."!cursor_caparray"("typename", "default_value")
-    .lex unicode:"$\x{a2}", rx707_cur
-    .local pmc match
-    .lex "$/", match
-    length rx707_eos, rx707_tgt
-    gt rx707_pos, rx707_eos, rx707_done
-    set rx707_off, 0
-    lt rx707_pos, 2, rx707_start
-    sub rx707_off, rx707_pos, 1
-    substr rx707_tgt, rx707_tgt, rx707_off
-  rx707_start:
-    eq $I10, 1, rx707_restart
-    rx707_cur."!cursor_debug"("START ", "parameter")
-    $I10 = self.'from'()
-    ne $I10, -1, rxscan710_done
-    goto rxscan710_scan
-  rxscan710_loop:
-    ($P10) = rx707_cur."from"()
-    inc $P10
-    set rx707_pos, $P10
-    ge rx707_pos, rx707_eos, rxscan710_done
-  rxscan710_scan:
-    set_addr $I10, rxscan710_loop
-    rx707_cur."!mark_push"(0, rx707_pos, $I10)
-  rxscan710_done:
-.annotate 'line', 326
-  # rx rxquantr711 ** 0..*
+    .local string rx706_tgt
+    .local int rx706_pos
+    .local int rx706_off
+    .local int rx706_eos
+    .local int rx706_rep
+    .local pmc rx706_cur
+    .local pmc rx706_debug
+    (rx706_cur, rx706_pos, rx706_tgt, $I10) = self."!cursor_start"()
+    rx706_cur."!cursor_caparray"("parameter")
+    getattribute rx706_debug, rx706_cur, "$!debug"
+    .lex unicode:"$\x{a2}", rx706_cur
+    .local pmc match
+    .lex "$/", match
+    length rx706_eos, rx706_tgt
+    gt rx706_pos, rx706_eos, rx706_done
+    set rx706_off, 0
+    lt rx706_pos, 2, rx706_start
+    sub rx706_off, rx706_pos, 1
+    substr rx706_tgt, rx706_tgt, rx706_off
+  rx706_start:
+    eq $I10, 1, rx706_restart
+    if_null rx706_debug, debug_678
+    rx706_cur."!cursor_debug"("START", "signature")
+  debug_678:
+    $I10 = self.'from'()
+    ne $I10, -1, rxscan709_done
+    goto rxscan709_scan
+  rxscan709_loop:
+    ($P10) = rx706_cur."from"()
+    inc $P10
+    set rx706_pos, $P10
+    ge rx706_pos, rx706_eos, rxscan709_done
+  rxscan709_scan:
+    set_addr $I10, rxscan709_loop
+    rx706_cur."!mark_push"(0, rx706_pos, $I10)
+  rxscan709_done:
+.annotate 'line', 325
+  # rx rxquantr710 ** 0..1
+    set_addr $I10, rxquantr710_done
+    rx706_cur."!mark_push"(0, rx706_pos, $I10)
+  rxquantr710_loop:
+  # rx rxquantr711 ** 1..*
     set_addr $I10, rxquantr711_done
-    rx707_cur."!mark_push"(0, rx707_pos, $I10)
+    rx706_cur."!mark_push"(0, -1, $I10)
   rxquantr711_loop:
-  # rx subrule "typename" subtype=capture negate=
-    rx707_cur."!cursor_pos"(rx707_pos)
-    $P10 = rx707_cur."typename"()
-    unless $P10, rx707_fail
-    rx707_cur."!mark_push"(0, -1, 0, $P10)
-    $P10."!cursor_names"("typename")
-    rx707_pos = $P10."pos"()
   # rx subrule "ws" subtype=method negate=
-    rx707_cur."!cursor_pos"(rx707_pos)
-    $P10 = rx707_cur."ws"()
-    unless $P10, rx707_fail
-    rx707_pos = $P10."pos"()
+    rx706_cur."!cursor_pos"(rx706_pos)
+    $P10 = rx706_cur."ws"()
+    unless $P10, rx706_fail
+    rx706_pos = $P10."pos"()
+  # rx subrule "parameter" subtype=capture negate=
+    rx706_cur."!cursor_pos"(rx706_pos)
+    $P10 = rx706_cur."parameter"()
+    unless $P10, rx706_fail
+    rx706_cur."!mark_push"(0, -1, 0, $P10)
+    $P10."!cursor_names"("parameter")
+    rx706_pos = $P10."pos"()
+  # rx subrule "ws" subtype=method negate=
+    rx706_cur."!cursor_pos"(rx706_pos)
+    $P10 = rx706_cur."ws"()
+    unless $P10, rx706_fail
+    rx706_pos = $P10."pos"()
     set_addr $I10, rxquantr711_done
-    (rx707_rep) = rx707_cur."!mark_commit"($I10)
+    (rx706_rep) = rx706_cur."!mark_commit"($I10)
     set_addr $I10, rxquantr711_done
-    rx707_cur."!mark_push"(rx707_rep, rx707_pos, $I10)
+    rx706_cur."!mark_push"(rx706_rep, rx706_pos, $I10)
+  # rx literal  ","
+    add $I11, rx706_pos, 1
+    gt $I11, rx706_eos, rx706_fail
+    sub $I11, rx706_pos, rx706_off
+    ord $I11, rx706_tgt, $I11
+    ne $I11, 44, rx706_fail
+    add rx706_pos, 1
     goto rxquantr711_loop
   rxquantr711_done:
-  alt712_0:
-.annotate 'line', 327
-    set_addr $I10, alt712_1
-    rx707_cur."!mark_push"(0, rx707_pos, $I10)
+    set_addr $I10, rxquantr710_done
+    (rx706_rep) = rx706_cur."!mark_commit"($I10)
+  rxquantr710_done:
+  # rx pass
+    rx706_cur."!cursor_pass"(rx706_pos, "signature")
+    if_null rx706_debug, debug_679
+    rx706_cur."!cursor_debug"("PASS", "signature", " at pos=", rx706_pos)
+  debug_679:
+    .return (rx706_cur)
+  rx706_restart:
+.annotate 'line', 4
+    if_null rx706_debug, debug_680
+    rx706_cur."!cursor_debug"("NEXT", "signature")
+  debug_680:
+  rx706_fail:
+    (rx706_rep, rx706_pos, $I10, $P10) = rx706_cur."!mark_fail"(0)
+    lt rx706_pos, -1, rx706_done
+    eq rx706_pos, -1, rx706_fail
+    jump $I10
+  rx706_done:
+    rx706_cur."!cursor_fail"()
+    if_null rx706_debug, debug_681
+    rx706_cur."!cursor_debug"("FAIL", "signature")
+  debug_681:
+    .return (rx706_cur)
+    .return ()
+.end
+
+
+.namespace ["NQP";"Grammar"]
+.sub "!PREFIX__signature"  :subid("171_1284728478.15265") :method
+.annotate 'line', 4
+    new $P708, "ResizablePMCArray"
+    push $P708, ""
+    .return ($P708)
+.end
+
+
+.namespace ["NQP";"Grammar"]
+.sub "parameter"  :subid("172_1284728478.15265") :method :outer("11_1284728478.15265")
+.annotate 'line', 4
+    .local string rx713_tgt
+    .local int rx713_pos
+    .local int rx713_off
+    .local int rx713_eos
+    .local int rx713_rep
+    .local pmc rx713_cur
+    .local pmc rx713_debug
+    (rx713_cur, rx713_pos, rx713_tgt, $I10) = self."!cursor_start"()
+    rx713_cur."!cursor_caparray"("default_value", "typename")
+    getattribute rx713_debug, rx713_cur, "$!debug"
+    .lex unicode:"$\x{a2}", rx713_cur
+    .local pmc match
+    .lex "$/", match
+    length rx713_eos, rx713_tgt
+    gt rx713_pos, rx713_eos, rx713_done
+    set rx713_off, 0
+    lt rx713_pos, 2, rx713_start
+    sub rx713_off, rx713_pos, 1
+    substr rx713_tgt, rx713_tgt, rx713_off
+  rx713_start:
+    eq $I10, 1, rx713_restart
+    if_null rx713_debug, debug_682
+    rx713_cur."!cursor_debug"("START", "parameter")
+  debug_682:
+    $I10 = self.'from'()
+    ne $I10, -1, rxscan716_done
+    goto rxscan716_scan
+  rxscan716_loop:
+    ($P10) = rx713_cur."from"()
+    inc $P10
+    set rx713_pos, $P10
+    ge rx713_pos, rx713_eos, rxscan716_done
+  rxscan716_scan:
+    set_addr $I10, rxscan716_loop
+    rx713_cur."!mark_push"(0, rx713_pos, $I10)
+  rxscan716_done:
 .annotate 'line', 328
+  # rx rxquantr717 ** 0..*
+    set_addr $I10, rxquantr717_done
+    rx713_cur."!mark_push"(0, rx713_pos, $I10)
+  rxquantr717_loop:
+  # rx subrule "typename" subtype=capture negate=
+    rx713_cur."!cursor_pos"(rx713_pos)
+    $P10 = rx713_cur."typename"()
+    unless $P10, rx713_fail
+    rx713_cur."!mark_push"(0, -1, 0, $P10)
+    $P10."!cursor_names"("typename")
+    rx713_pos = $P10."pos"()
+  # rx subrule "ws" subtype=method negate=
+    rx713_cur."!cursor_pos"(rx713_pos)
+    $P10 = rx713_cur."ws"()
+    unless $P10, rx713_fail
+    rx713_pos = $P10."pos"()
+    set_addr $I10, rxquantr717_done
+    (rx713_rep) = rx713_cur."!mark_commit"($I10)
+    set_addr $I10, rxquantr717_done
+    rx713_cur."!mark_push"(rx713_rep, rx713_pos, $I10)
+    goto rxquantr717_loop
+  rxquantr717_done:
+  alt718_0:
+.annotate 'line', 329
+    set_addr $I10, alt718_1
+    rx713_cur."!mark_push"(0, rx713_pos, $I10)
+.annotate 'line', 330
   # rx subcapture "quant"
-    set_addr $I10, rxcap_713_fail
-    rx707_cur."!mark_push"(0, rx707_pos, $I10)
+    set_addr $I10, rxcap_719_fail
+    rx713_cur."!mark_push"(0, rx713_pos, $I10)
   # rx literal  "*"
-    add $I11, rx707_pos, 1
-    gt $I11, rx707_eos, rx707_fail
-    sub $I11, rx707_pos, rx707_off
-    substr $S10, rx707_tgt, $I11, 1
-    ne $S10, "*", rx707_fail
-    add rx707_pos, 1
-    set_addr $I10, rxcap_713_fail
-    ($I12, $I11) = rx707_cur."!mark_peek"($I10)
-    rx707_cur."!cursor_pos"($I11)
-    ($P10) = rx707_cur."!cursor_start"()
-    $P10."!cursor_pass"(rx707_pos, "")
-    rx707_cur."!mark_push"(0, -1, 0, $P10)
+    add $I11, rx713_pos, 1
+    gt $I11, rx713_eos, rx713_fail
+    sub $I11, rx713_pos, rx713_off
+    ord $I11, rx713_tgt, $I11
+    ne $I11, 42, rx713_fail
+    add rx713_pos, 1
+    set_addr $I10, rxcap_719_fail
+    ($I12, $I11) = rx713_cur."!mark_peek"($I10)
+    rx713_cur."!cursor_pos"($I11)
+    ($P10) = rx713_cur."!cursor_start"()
+    $P10."!cursor_pass"(rx713_pos, "")
+    rx713_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("quant")
-    goto rxcap_713_done
-  rxcap_713_fail:
-    goto rx707_fail
-  rxcap_713_done:
+    goto rxcap_719_done
+  rxcap_719_fail:
+    goto rx713_fail
+  rxcap_719_done:
   # rx subrule "param_var" subtype=capture negate=
-    rx707_cur."!cursor_pos"(rx707_pos)
-    $P10 = rx707_cur."param_var"()
-    unless $P10, rx707_fail
-    rx707_cur."!mark_push"(0, -1, 0, $P10)
+    rx713_cur."!cursor_pos"(rx713_pos)
+    $P10 = rx713_cur."param_var"()
+    unless $P10, rx713_fail
+    rx713_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("param_var")
-    rx707_pos = $P10."pos"()
-    goto alt712_end
-  alt712_1:
-  alt714_0:
-.annotate 'line', 329
-    set_addr $I10, alt714_1
-    rx707_cur."!mark_push"(0, rx707_pos, $I10)
+    rx713_pos = $P10."pos"()
+    goto alt718_end
+  alt718_1:
+  alt720_0:
+.annotate 'line', 331
+    set_addr $I10, alt720_1
+    rx713_cur."!mark_push"(0, rx713_pos, $I10)
   # rx subrule "param_var" subtype=capture negate=
-    rx707_cur."!cursor_pos"(rx707_pos)
-    $P10 = rx707_cur."param_var"()
-    unless $P10, rx707_fail
-    rx707_cur."!mark_push"(0, -1, 0, $P10)
+    rx713_cur."!cursor_pos"(rx713_pos)
+    $P10 = rx713_cur."param_var"()
+    unless $P10, rx713_fail
+    rx713_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("param_var")
-    rx707_pos = $P10."pos"()
-    goto alt714_end
-  alt714_1:
+    rx713_pos = $P10."pos"()
+    goto alt720_end
+  alt720_1:
   # rx subrule "named_param" subtype=capture negate=
-    rx707_cur."!cursor_pos"(rx707_pos)
-    $P10 = rx707_cur."named_param"()
-    unless $P10, rx707_fail
-    rx707_cur."!mark_push"(0, -1, 0, $P10)
+    rx713_cur."!cursor_pos"(rx713_pos)
+    $P10 = rx713_cur."named_param"()
+    unless $P10, rx713_fail
+    rx713_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("named_param")
-    rx707_pos = $P10."pos"()
-  alt714_end:
+    rx713_pos = $P10."pos"()
+  alt720_end:
   # rx subcapture "quant"
-    set_addr $I10, rxcap_716_fail
-    rx707_cur."!mark_push"(0, rx707_pos, $I10)
-  alt715_0:
-    set_addr $I10, alt715_1
-    rx707_cur."!mark_push"(0, rx707_pos, $I10)
+    set_addr $I10, rxcap_722_fail
+    rx713_cur."!mark_push"(0, rx713_pos, $I10)
+  alt721_0:
+    set_addr $I10, alt721_1
+    rx713_cur."!mark_push"(0, rx713_pos, $I10)
   # rx literal  "?"
-    add $I11, rx707_pos, 1
-    gt $I11, rx707_eos, rx707_fail
-    sub $I11, rx707_pos, rx707_off
-    substr $S10, rx707_tgt, $I11, 1
-    ne $S10, "?", rx707_fail
-    add rx707_pos, 1
-    goto alt715_end
-  alt715_1:
-    set_addr $I10, alt715_2
-    rx707_cur."!mark_push"(0, rx707_pos, $I10)
+    add $I11, rx713_pos, 1
+    gt $I11, rx713_eos, rx713_fail
+    sub $I11, rx713_pos, rx713_off
+    ord $I11, rx713_tgt, $I11
+    ne $I11, 63, rx713_fail
+    add rx713_pos, 1
+    goto alt721_end
+  alt721_1:
+    set_addr $I10, alt721_2
+    rx713_cur."!mark_push"(0, rx713_pos, $I10)
   # rx literal  "!"
-    add $I11, rx707_pos, 1
-    gt $I11, rx707_eos, rx707_fail
-    sub $I11, rx707_pos, rx707_off
-    substr $S10, rx707_tgt, $I11, 1
-    ne $S10, "!", rx707_fail
-    add rx707_pos, 1
-    goto alt715_end
-  alt715_2:
-  alt715_end:
-    set_addr $I10, rxcap_716_fail
-    ($I12, $I11) = rx707_cur."!mark_peek"($I10)
-    rx707_cur."!cursor_pos"($I11)
-    ($P10) = rx707_cur."!cursor_start"()
-    $P10."!cursor_pass"(rx707_pos, "")
-    rx707_cur."!mark_push"(0, -1, 0, $P10)
+    add $I11, rx713_pos, 1
+    gt $I11, rx713_eos, rx713_fail
+    sub $I11, rx713_pos, rx713_off
+    ord $I11, rx713_tgt, $I11
+    ne $I11, 33, rx713_fail
+    add rx713_pos, 1
+    goto alt721_end
+  alt721_2:
+  alt721_end:
+    set_addr $I10, rxcap_722_fail
+    ($I12, $I11) = rx713_cur."!mark_peek"($I10)
+    rx713_cur."!cursor_pos"($I11)
+    ($P10) = rx713_cur."!cursor_start"()
+    $P10."!cursor_pass"(rx713_pos, "")
+    rx713_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("quant")
-    goto rxcap_716_done
-  rxcap_716_fail:
-    goto rx707_fail
-  rxcap_716_done:
-  alt712_end:
-.annotate 'line', 331
-  # rx rxquantr717 ** 0..1
-    set_addr $I10, rxquantr717_done
-    rx707_cur."!mark_push"(0, rx707_pos, $I10)
-  rxquantr717_loop:
+    goto rxcap_722_done
+  rxcap_722_fail:
+    goto rx713_fail
+  rxcap_722_done:
+  alt718_end:
+.annotate 'line', 333
+  # rx rxquantr723 ** 0..1
+    set_addr $I10, rxquantr723_done
+    rx713_cur."!mark_push"(0, rx713_pos, $I10)
+  rxquantr723_loop:
   # rx subrule "default_value" subtype=capture negate=
-    rx707_cur."!cursor_pos"(rx707_pos)
-    $P10 = rx707_cur."default_value"()
-    unless $P10, rx707_fail
-    goto rxsubrule718_pass
-  rxsubrule718_back:
+    rx713_cur."!cursor_pos"(rx713_pos)
+    $P10 = rx713_cur."default_value"()
+    unless $P10, rx713_fail
+    goto rxsubrule724_pass
+  rxsubrule724_back:
     $P10 = $P10."!cursor_next"()
-    unless $P10, rx707_fail
-  rxsubrule718_pass:
-    set_addr $I10, rxsubrule718_back
-    rx707_cur."!mark_push"(0, rx707_pos, $I10, $P10)
+    unless $P10, rx713_fail
+  rxsubrule724_pass:
+    set_addr $I10, rxsubrule724_back
+    rx713_cur."!mark_push"(0, rx713_pos, $I10, $P10)
     $P10."!cursor_names"("default_value")
-    rx707_pos = $P10."pos"()
-    set_addr $I10, rxquantr717_done
-    (rx707_rep) = rx707_cur."!mark_commit"($I10)
-  rxquantr717_done:
-.annotate 'line', 325
+    rx713_pos = $P10."pos"()
+    set_addr $I10, rxquantr723_done
+    (rx713_rep) = rx713_cur."!mark_commit"($I10)
+  rxquantr723_done:
+.annotate 'line', 327
   # rx pass
-    rx707_cur."!cursor_pass"(rx707_pos, "parameter")
-    rx707_cur."!cursor_debug"("PASS  ", "parameter", " at pos=", rx707_pos)
-    .return (rx707_cur)
-  rx707_restart:
-.annotate 'line', 4
-    rx707_cur."!cursor_debug"("NEXT ", "parameter")
-  rx707_fail:
-    (rx707_rep, rx707_pos, $I10, $P10) = rx707_cur."!mark_fail"(0)
-    lt rx707_pos, -1, rx707_done
-    eq rx707_pos, -1, rx707_fail
-    jump $I10
-  rx707_done:
-    rx707_cur."!cursor_fail"()
-    rx707_cur."!cursor_debug"("FAIL  ", "parameter")
-    .return (rx707_cur)
+    rx713_cur."!cursor_pass"(rx713_pos, "parameter")
+    if_null rx713_debug, debug_683
+    rx713_cur."!cursor_debug"("PASS", "parameter", " at pos=", rx713_pos)
+  debug_683:
+    .return (rx713_cur)
+  rx713_restart:
+.annotate 'line', 4
+    if_null rx713_debug, debug_684
+    rx713_cur."!cursor_debug"("NEXT", "parameter")
+  debug_684:
+  rx713_fail:
+    (rx713_rep, rx713_pos, $I10, $P10) = rx713_cur."!mark_fail"(0)
+    lt rx713_pos, -1, rx713_done
+    eq rx713_pos, -1, rx713_fail
+    jump $I10
+  rx713_done:
+    rx713_cur."!cursor_fail"()
+    if_null rx713_debug, debug_685
+    rx713_cur."!cursor_debug"("FAIL", "parameter")
+  debug_685:
+    .return (rx713_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__parameter"  :subid("173_1280467477.44751") :method
-.annotate 'line', 4
-    new $P709, "ResizablePMCArray"
-    push $P709, ""
-    .return ($P709)
-.end
-
-
-.namespace ["NQP";"Grammar"]
-.sub "param_var"  :subid("174_1280467477.44751") :method :outer("11_1280467477.44751")
-.annotate 'line', 4
-    .local string rx720_tgt
-    .local int rx720_pos
-    .local int rx720_off
-    .local int rx720_eos
-    .local int rx720_rep
-    .local pmc rx720_cur
-    (rx720_cur, rx720_pos, rx720_tgt, $I10) = self."!cursor_start"()
-    rx720_cur."!cursor_caparray"("twigil")
-    .lex unicode:"$\x{a2}", rx720_cur
-    .local pmc match
-    .lex "$/", match
-    length rx720_eos, rx720_tgt
-    gt rx720_pos, rx720_eos, rx720_done
-    set rx720_off, 0
-    lt rx720_pos, 2, rx720_start
-    sub rx720_off, rx720_pos, 1
-    substr rx720_tgt, rx720_tgt, rx720_off
-  rx720_start:
-    eq $I10, 1, rx720_restart
-    rx720_cur."!cursor_debug"("START ", "param_var")
-    $I10 = self.'from'()
-    ne $I10, -1, rxscan724_done
-    goto rxscan724_scan
-  rxscan724_loop:
-    ($P10) = rx720_cur."from"()
-    inc $P10
-    set rx720_pos, $P10
-    ge rx720_pos, rx720_eos, rxscan724_done
-  rxscan724_scan:
-    set_addr $I10, rxscan724_loop
-    rx720_cur."!mark_push"(0, rx720_pos, $I10)
-  rxscan724_done:
-.annotate 'line', 335
+.sub "!PREFIX__parameter"  :subid("173_1284728478.15265") :method
+.annotate 'line', 4
+    new $P715, "ResizablePMCArray"
+    push $P715, ""
+    .return ($P715)
+.end
+
+
+.namespace ["NQP";"Grammar"]
+.sub "param_var"  :subid("174_1284728478.15265") :method :outer("11_1284728478.15265")
+.annotate 'line', 4
+    .local string rx726_tgt
+    .local int rx726_pos
+    .local int rx726_off
+    .local int rx726_eos
+    .local int rx726_rep
+    .local pmc rx726_cur
+    .local pmc rx726_debug
+    (rx726_cur, rx726_pos, rx726_tgt, $I10) = self."!cursor_start"()
+    rx726_cur."!cursor_caparray"("twigil")
+    getattribute rx726_debug, rx726_cur, "$!debug"
+    .lex unicode:"$\x{a2}", rx726_cur
+    .local pmc match
+    .lex "$/", match
+    length rx726_eos, rx726_tgt
+    gt rx726_pos, rx726_eos, rx726_done
+    set rx726_off, 0
+    lt rx726_pos, 2, rx726_start
+    sub rx726_off, rx726_pos, 1
+    substr rx726_tgt, rx726_tgt, rx726_off
+  rx726_start:
+    eq $I10, 1, rx726_restart
+    if_null rx726_debug, debug_686
+    rx726_cur."!cursor_debug"("START", "param_var")
+  debug_686:
+    $I10 = self.'from'()
+    ne $I10, -1, rxscan730_done
+    goto rxscan730_scan
+  rxscan730_loop:
+    ($P10) = rx726_cur."from"()
+    inc $P10
+    set rx726_pos, $P10
+    ge rx726_pos, rx726_eos, rxscan730_done
+  rxscan730_scan:
+    set_addr $I10, rxscan730_loop
+    rx726_cur."!mark_push"(0, rx726_pos, $I10)
+  rxscan730_done:
+.annotate 'line', 337
   # rx subrule "sigil" subtype=capture negate=
-    rx720_cur."!cursor_pos"(rx720_pos)
-    $P10 = rx720_cur."sigil"()
-    unless $P10, rx720_fail
-    rx720_cur."!mark_push"(0, -1, 0, $P10)
+    rx726_cur."!cursor_pos"(rx726_pos)
+    $P10 = rx726_cur."sigil"()
+    unless $P10, rx726_fail
+    rx726_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("sigil")
-    rx720_pos = $P10."pos"()
-  # rx rxquantr725 ** 0..1
-    set_addr $I10, rxquantr725_done
-    rx720_cur."!mark_push"(0, rx720_pos, $I10)
-  rxquantr725_loop:
+    rx726_pos = $P10."pos"()
+  # rx rxquantr731 ** 0..1
+    set_addr $I10, rxquantr731_done
+    rx726_cur."!mark_push"(0, rx726_pos, $I10)
+  rxquantr731_loop:
   # rx subrule "twigil" subtype=capture negate=
-    rx720_cur."!cursor_pos"(rx720_pos)
-    $P10 = rx720_cur."twigil"()
-    unless $P10, rx720_fail
-    goto rxsubrule726_pass
-  rxsubrule726_back:
+    rx726_cur."!cursor_pos"(rx726_pos)
+    $P10 = rx726_cur."twigil"()
+    unless $P10, rx726_fail
+    goto rxsubrule732_pass
+  rxsubrule732_back:
     $P10 = $P10."!cursor_next"()
-    unless $P10, rx720_fail
-  rxsubrule726_pass:
-    set_addr $I10, rxsubrule726_back
-    rx720_cur."!mark_push"(0, rx720_pos, $I10, $P10)
+    unless $P10, rx726_fail
+  rxsubrule732_pass:
+    set_addr $I10, rxsubrule732_back
+    rx726_cur."!mark_push"(0, rx726_pos, $I10, $P10)
     $P10."!cursor_names"("twigil")
-    rx720_pos = $P10."pos"()
-    set_addr $I10, rxquantr725_done
-    (rx720_rep) = rx720_cur."!mark_commit"($I10)
-  rxquantr725_done:
-  alt727_0:
-.annotate 'line', 336
-    set_addr $I10, alt727_1
-    rx720_cur."!mark_push"(0, rx720_pos, $I10)
+    rx726_pos = $P10."pos"()
+    set_addr $I10, rxquantr731_done
+    (rx726_rep) = rx726_cur."!mark_commit"($I10)
+  rxquantr731_done:
+  alt733_0:
+.annotate 'line', 338
+    set_addr $I10, alt733_1
+    rx726_cur."!mark_push"(0, rx726_pos, $I10)
   # rx subrule "ident" subtype=capture negate=
-    rx720_cur."!cursor_pos"(rx720_pos)
-    $P10 = rx720_cur."ident"()
-    unless $P10, rx720_fail
-    rx720_cur."!mark_push"(0, -1, 0, $P10)
+    rx726_cur."!cursor_pos"(rx726_pos)
+    $P10 = rx726_cur."ident"()
+    unless $P10, rx726_fail
+    rx726_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("name")
-    rx720_pos = $P10."pos"()
-    goto alt727_end
-  alt727_1:
+    rx726_pos = $P10."pos"()
+    goto alt733_end
+  alt733_1:
   # rx subcapture "name"
-    set_addr $I10, rxcap_728_fail
-    rx720_cur."!mark_push"(0, rx720_pos, $I10)
+    set_addr $I10, rxcap_734_fail
+    rx726_cur."!mark_push"(0, rx726_pos, $I10)
   # rx enumcharlist negate=0 
-    ge rx720_pos, rx720_eos, rx720_fail
-    sub $I10, rx720_pos, rx720_off
-    substr $S10, rx720_tgt, $I10, 1
+    ge rx726_pos, rx726_eos, rx726_fail
+    sub $I10, rx726_pos, rx726_off
+    substr $S10, rx726_tgt, $I10, 1
     index $I11, "/!", $S10
-    lt $I11, 0, rx720_fail
-    inc rx720_pos
-    set_addr $I10, rxcap_728_fail
-    ($I12, $I11) = rx720_cur."!mark_peek"($I10)
-    rx720_cur."!cursor_pos"($I11)
-    ($P10) = rx720_cur."!cursor_start"()
-    $P10."!cursor_pass"(rx720_pos, "")
-    rx720_cur."!mark_push"(0, -1, 0, $P10)
+    lt $I11, 0, rx726_fail
+    inc rx726_pos
+    set_addr $I10, rxcap_734_fail
+    ($I12, $I11) = rx726_cur."!mark_peek"($I10)
+    rx726_cur."!cursor_pos"($I11)
+    ($P10) = rx726_cur."!cursor_start"()
+    $P10."!cursor_pass"(rx726_pos, "")
+    rx726_cur."!mark_push"(0, -1, 0, $P10)
     $P10."!cursor_names"("name")
-    goto rxcap_728_done
-  rxcap_728_fail:
-    goto rx720_fail
-  rxcap_728_done:
-  alt727_end:
-.annotate 'line', 334
+    goto rxcap_734_done
+  rxcap_734_fail:
+    goto rx726_fail
+  rxcap_734_done:
+  alt733_end:
+.annotate 'line', 336
   # rx pass
-    rx720_cur."!cursor_pass"(rx720_pos, "param_var")
-    rx720_cur."!cursor_debug"("PASS  ", "param_var", " at pos=", rx720_pos)
-    .return (rx720_cur)
-  rx720_restart:
+    rx726_cur."!cursor_pass"(rx726_pos, "param_var")
+    if_null rx726_debug, debug_687
+    rx726_cur."!cursor_debug"("PASS", "param_var", " at pos=", rx726_pos)
+  debug_687:
+    .return (rx726_cur)
+  rx726_restart:
 .annotate 'line', 4
-    rx720_cur."!cursor_debug"("NEXT ", "param_var")
-  rx720_fail:
-    (rx720_rep, rx720_pos, $I10, $P10) = rx720_cur."!mark_fail"(0)
-    lt rx720_pos, -1, rx720_done
-    eq rx720_pos, -1, rx720_fail
+    if_null rx726_debug, debug_688
+    rx726_cur."!cursor_debug"("NEXT", "param_var")
+  debug_688:
+  rx726_fail:
+    (rx726_rep, rx726_pos, $I10, $P10) = rx726_cur."!mark_fail"(0)
+    lt rx726_pos, -1, rx726_done
+    eq rx726_pos, -1, rx726_fail
     jump $I10
-  rx720_done:
-    rx720_cur."!cursor_fail"()
-    rx720_cur."!cursor_debug"("FAIL  ", "param_var")
-    .return (rx720_cur)
+  rx726_done:
+    rx726_cur."!cursor_fail"()
+    if_null rx726_debug, debug_689
+    rx726_cur."!cursor_debug"("FAIL", "param_var")
+  debug_689:
+    .return (rx726_cur)
     .return ()
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "!PREFIX__param_var"  :subid("175_1280467477.44751") :method
+.sub "!PREFIX__param_var"  :subid("175_1284728478.15265") :method
 .annotate 'line', 4
-    $P722 = self."!PREFIX__!subrule"("sigil", "")
-    new $P723, "ResizablePMCArray"
-    push $P723, $P722
-    .return ($P723)
+    $P728 = self."!PREFIX__!subrule"("sigil", "")
+    new $P729, "ResizablePMCArray"
+    push $P729, $P728
+    .return ($P729)
 .end
 
 
 .namespace ["NQP";"Grammar"]
-.sub "named_param"  :subid("176_1280467477.44751") :method :outer("11_1280467477.44751")
+.sub "named_param"  :subid("176_1284728478.15265") :method :outer("11_1284728478.15265")
 .annotate 'line', 4
-    .local string rx730_tgt
-    .local int rx730_pos
-    .local int rx730_off
-    .local int rx730_eos
-    .local int rx730_rep
-    .local pmc rx730_cur
-    (rx730_cur, rx730_pos, rx730_tgt, $I10) = self."!cursor_start"()
-    .lex unicode:"$\x{a2}", rx730_cur
-    .local pmc match
-    .lex "$/", match
-    length rx730_eos, rx730_tgt
-    gt rx730_pos, rx730_eos, rx730_done
-    set rx730_off, 0
-    lt rx730_pos, 2, rx730_start
-    sub rx730_off, rx730_pos, 1
-    substr rx730_tgt, rx730_tgt, rx730_off
-  rx730_start:
-    eq $I10, 1, rx730_restart
-    rx730_cur."!cursor_debug"("START ", "named_param")
-    $I10 = self.'from'()
-    ne $I10, -1, rxscan734_done
-    goto rxscan734_scan
-  rxscan734_loop:
-    ($P10) = rx730_cur."from"()
-    inc $P10
-    set rx730_pos, $P10
-    ge rx730_pos, rx730_eos, rxscan734_done
-  rxscan734_scan:
-    set_addr $I10, rxscan734_loop
-    rx730_cur."!mark_push"(0, rx730_pos, $I10)
-  rxscan734_done:
-.annotate 'line', 340
-  # rx literal  ":"
-    add $I11, rx730_pos, 1
-    gt $I11, rx730_eos, rx730_fail
-    sub $I11, rx730_pos, rx730_off
-    substr $S10, rx730_tgt, $I11, 1
-    ne $S10, ":", rx730_fail
-    add rx730_pos, 1
-  # rx subrule "param_var" subtype=capture negate=
-    rx730_cur."!cursor_pos"(rx730_pos)
-    $P10 = rx730_cur."param_var"()
-    unless $P10, rx730_fail
-    rx730_cur."!mark_push"(0, -1, 0, $P10)
-    $P10."!cursor_names"("param_var")
-    rx730_pos = $P10."pos"()
-.annotate 'line', 339
-  # rx pass
-    rx730_cur."!cursor_pass"(rx730_pos, "named_param")
-    rx730_cur."!cursor_debug"("PASS  ", "named_param", " at pos=", rx730_pos)
-    .return (rx730_cur)
-  rx730_restart:
-.annotate 'line', 4
-    rx730_cur."!cursor_debug"("NEXT ", "named_param")
-  rx730_fail:
-    (rx730_rep, rx730_pos, $I10, $P10) = rx730_cur."!mark_fail"(0)
-    lt rx730_pos, -1, rx730_done
-    eq rx730_pos, -1, rx730_fail
-    jump $I10
-  rx730_done:
-    rx730_cur."!cursor_fail"()
-    rx730_cur."!cursor_debug"("FAIL  ", "named_param")
-    .return (rx730_cur)
-    .return ()
-.end
-
-
-.namespace ["NQP";"Grammar"]
-.sub "!PREFIX__named_param"  :subid("177_1280467477.44751") :method
-.annotate 'line', 4
-    $P732 = self."!PREFIX__!subrule"("param_var", ":")
-    new $P733, "ResizablePMCArray"
-    push $P733, $P732
-    .return ($P733)
-.end
-
-
-.namespace ["NQP";"Grammar"]
-.sub "default_value"  :subid("178_1280467477.44751") :method :outer("11_1280467477.44751")
-.annotate 'line', 4
-    .local string rx736_tgt
-    .local int rx736_pos
-    .local int rx736_off
-    .local int rx736_eos
-    .local int rx736_rep
-    .local pmc rx736_cur
-    (rx736_cur, rx736_pos, rx736_tgt, $I10) = self."!cursor_start"()
-    .lex unicode:"$\x{a2}", rx736_cur
+    .local string rx736_tgt
+    .local int rx736_pos
+    .local int rx736_off
+    .local int rx736_eos
+    .local int rx736_rep
+    .local pmc rx736_cur
+    .local pmc rx736_debug
+    (rx736_cur, rx736_pos, rx736_tgt, $I10) = self."!cursor_start"()
+    getattribute rx736_debug, rx736_cur, "$!debug"
+    .lex unicode:"$\x{a2}", rx736_cur
     .local pmc match
     .lex "$/", match
     length rx736_eos, rx736_tgt
@@ -9369,7 +10069,9 @@
     substr rx736_tgt, rx736_tgt, rx736_off
   rx736_start:
     eq $I10, 1, rx736_restart
-    rx736_cur."!cursor_debug"("START ", "default_value")
+    if_null rx736_debug, debug_690
+    rx736_cur."!cursor_debug"("START", "named_param")
+  debug_690:
     $I10 = self