[svn:parrot] r40257 - in branches/ops_pct: . compilers/imcc compilers/json/JSON compilers/ncigen compilers/ncigen/src compilers/ncigen/src/builtins compilers/ncigen/src/parser compilers/nqp/src compilers/nqp/src/Grammar compilers/opsc compilers/pct/src/PAST compilers/pct/src/PCT compilers/pct/src/POST compilers/pge/PGE compilers/tge compilers/tge/TGE config/auto config/gen config/gen/call_list config/gen/config_h config/gen/config_pm config/gen/makefiles config/gen/platform/generic config/gen/platform/win32 config/init config/init/hints docs docs/dev docs/pdds docs/project editor examples/benchmarks examples/c examples/json examples/languages/squaak/src/builtins examples/library examples/opengl examples/past examples/pir examples/sdl/minesweeper examples/shootout examples/tutorial ext/SQLite3 include/parrot lib/Parrot lib/Parrot/Configure/Options lib/Parrot/Configure/Options/Conf lib/Parrot/Configure/Options/Test lib/Parrot/Configure/Step lib/Parrot/Docs/Section lib/ Parrot/IO lib/Parrot/Pmc2c lib/Parrot/Pmc2c/PMC ports/cygwin ports/debian ports/fedora ports/macports ports/mandriva ports/suse ports/ubuntu ports/ubuntu/patches runtime/parrot/library runtime/parrot/library/Data runtime/parrot/library/Data/Dumper runtime/parrot/library/PGE runtime/parrot/library/SDL runtime/parrot/library/Stream runtime/parrot/library/Test runtime/parrot/library/YAML/Dumper src src/call src/dynoplibs src/dynpmc src/gc src/interp src/io src/jit/i386 src/ops src/pmc src/runcore src/string t/codingstd t/compilers/imcc/syn t/compilers/pct t/compilers/pge t/compilers/pge/p5regex t/compilers/pge/perl6regex t/configure t/dynoplibs t/dynpmc t/examples t/library t/native_pbc t/oo t/op t/pmc t/pmc/testlib t/src t/steps t/steps/auto t/steps/gen t/steps/init t/steps/init/hints t/steps/inter t/tools t/tools/dev/searchops t/tools/install t/tools/ops2cutils t/tools/ops2pm tools/build tools/dev tools/util

cotto at svn.parrot.org cotto at svn.parrot.org
Fri Jul 24 19:42:22 UTC 2009


Author: cotto
Date: Fri Jul 24 19:42:02 2009
New Revision: 40257
URL: https://trac.parrot.org/parrot/changeset/40257

Log:
bring branch up-to-date with trunk, remove some references to deleted files

Added:
   branches/ops_pct/config/auto/thread.pm
      - copied unchanged from r40255, trunk/config/auto/thread.pm
   branches/ops_pct/config/gen/config_h/has_header_h.in
      - copied unchanged from r40255, trunk/config/gen/config_h/has_header_h.in
   branches/ops_pct/examples/c/pbc_info.c
      - copied unchanged from r40255, trunk/examples/c/pbc_info.c
   branches/ops_pct/examples/opengl/static-triangle-hll.pir
      - copied unchanged from r40255, trunk/examples/opengl/static-triangle-hll.pir
   branches/ops_pct/ports/ubuntu/patches/
      - copied from r40255, trunk/ports/ubuntu/patches/
   branches/ops_pct/ports/ubuntu/rules
      - copied unchanged from r40255, trunk/ports/ubuntu/rules
   branches/ops_pct/src/dynoplibs/obscure.ops
      - copied unchanged from r40255, trunk/src/dynoplibs/obscure.ops
   branches/ops_pct/src/gc/gc_inf.c
      - copied unchanged from r40255, trunk/src/gc/gc_inf.c
   branches/ops_pct/src/pmc/arrayiterator.pmc
      - copied unchanged from r40255, trunk/src/pmc/arrayiterator.pmc
   branches/ops_pct/src/pmc/hashiterator.pmc
      - copied unchanged from r40255, trunk/src/pmc/hashiterator.pmc
   branches/ops_pct/src/pmc/hashiteratorkey.pmc
      - copied unchanged from r40255, trunk/src/pmc/hashiteratorkey.pmc
   branches/ops_pct/src/pmc/orderedhashiterator.pmc
      - copied unchanged from r40255, trunk/src/pmc/orderedhashiterator.pmc
   branches/ops_pct/src/pmc/stringiterator.pmc
      - copied unchanged from r40255, trunk/src/pmc/stringiterator.pmc
   branches/ops_pct/t/configure/049-options_test_prepare.t
      - copied unchanged from r40255, trunk/t/configure/049-options_test_prepare.t
   branches/ops_pct/t/pmc/arrayiterator.t
      - copied unchanged from r40255, trunk/t/pmc/arrayiterator.t
   branches/ops_pct/t/pmc/hashiterator.t
      - copied unchanged from r40255, trunk/t/pmc/hashiterator.t
   branches/ops_pct/t/pmc/hashiteratorkey.t
      - copied unchanged from r40255, trunk/t/pmc/hashiteratorkey.t
   branches/ops_pct/t/pmc/orderedhashiterator.t
      - copied unchanged from r40255, trunk/t/pmc/orderedhashiterator.t
   branches/ops_pct/t/pmc/stringiterator.t
      - copied unchanged from r40255, trunk/t/pmc/stringiterator.t
   branches/ops_pct/t/steps/auto/
      - copied from r40255, trunk/t/steps/auto/
   branches/ops_pct/t/steps/gen/
      - copied from r40255, trunk/t/steps/gen/
   branches/ops_pct/t/steps/init/
      - copied from r40255, trunk/t/steps/init/
   branches/ops_pct/t/steps/inter/
      - copied from r40255, trunk/t/steps/inter/
   branches/ops_pct/t/tools/pgegrep.t
      - copied unchanged from r40255, trunk/t/tools/pgegrep.t
   branches/ops_pct/t/tools/testdata
      - copied unchanged from r40255, trunk/t/tools/testdata
Replaced:
   branches/ops_pct/ports/ubuntu/patches/01-lpia-FTBFS.path
      - copied unchanged from r40255, trunk/ports/ubuntu/patches/01-lpia-FTBFS.path
   branches/ops_pct/ports/ubuntu/patches/series
      - copied unchanged from r40255, trunk/ports/ubuntu/patches/series
   branches/ops_pct/t/steps/auto/alignptrs-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/alignptrs-01.t
   branches/ops_pct/t/steps/auto/alignptrs-02.t
      - copied unchanged from r40255, trunk/t/steps/auto/alignptrs-02.t
   branches/ops_pct/t/steps/auto/arch-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/arch-01.t
   branches/ops_pct/t/steps/auto/attributes-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/attributes-01.t
   branches/ops_pct/t/steps/auto/backtrace-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/backtrace-01.t
   branches/ops_pct/t/steps/auto/byteorder-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/byteorder-01.t
   branches/ops_pct/t/steps/auto/cgoto-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/cgoto-01.t
   branches/ops_pct/t/steps/auto/cpu-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/cpu-01.t
   branches/ops_pct/t/steps/auto/crypto-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/crypto-01.t
   branches/ops_pct/t/steps/auto/ctags-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/ctags-01.t
   branches/ops_pct/t/steps/auto/env-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/env-01.t
   branches/ops_pct/t/steps/auto/format-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/format-01.t
   branches/ops_pct/t/steps/auto/funcptr-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/funcptr-01.t
   branches/ops_pct/t/steps/auto/gc-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/gc-01.t
   branches/ops_pct/t/steps/auto/gcc-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/gcc-01.t
   branches/ops_pct/t/steps/auto/gdbm-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/gdbm-01.t
   branches/ops_pct/t/steps/auto/gettext-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/gettext-01.t
   branches/ops_pct/t/steps/auto/glibc-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/glibc-01.t
   branches/ops_pct/t/steps/auto/gmp-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/gmp-01.t
   branches/ops_pct/t/steps/auto/headers-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/headers-01.t
   branches/ops_pct/t/steps/auto/icu-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/icu-01.t
   branches/ops_pct/t/steps/auto/inline-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/inline-01.t
   branches/ops_pct/t/steps/auto/isreg-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/isreg-01.t
   branches/ops_pct/t/steps/auto/jit-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/jit-01.t
   branches/ops_pct/t/steps/auto/memalign-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/memalign-01.t
   branches/ops_pct/t/steps/auto/msvc-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/msvc-01.t
   branches/ops_pct/t/steps/auto/neg_0-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/neg_0-01.t
   branches/ops_pct/t/steps/auto/opengl-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/opengl-01.t
   branches/ops_pct/t/steps/auto/ops-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/ops-01.t
   branches/ops_pct/t/steps/auto/pcre-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/pcre-01.t
   branches/ops_pct/t/steps/auto/perldoc-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/perldoc-01.t
   branches/ops_pct/t/steps/auto/pmc-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/pmc-01.t
   branches/ops_pct/t/steps/auto/pod2man-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/pod2man-01.t
   branches/ops_pct/t/steps/auto/readline-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/readline-01.t
   branches/ops_pct/t/steps/auto/readline-02.t
      - copied unchanged from r40255, trunk/t/steps/auto/readline-02.t
   branches/ops_pct/t/steps/auto/revision-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/revision-01.t
   branches/ops_pct/t/steps/auto/signal-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/signal-01.t
   branches/ops_pct/t/steps/auto/sizes-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/sizes-01.t
   branches/ops_pct/t/steps/auto/snprintf-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/snprintf-01.t
   branches/ops_pct/t/steps/auto/socklen_t-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/socklen_t-01.t
   branches/ops_pct/t/steps/auto/thread-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/thread-01.t
   branches/ops_pct/t/steps/auto/va_ptr-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/va_ptr-01.t
   branches/ops_pct/t/steps/auto/warnings-01.t
      - copied unchanged from r40255, trunk/t/steps/auto/warnings-01.t
   branches/ops_pct/t/steps/gen/call_list-01.t
      - copied unchanged from r40255, trunk/t/steps/gen/call_list-01.t
   branches/ops_pct/t/steps/gen/config_h-01.t
      - copied unchanged from r40255, trunk/t/steps/gen/config_h-01.t
   branches/ops_pct/t/steps/gen/config_pm-01.t
      - copied unchanged from r40255, trunk/t/steps/gen/config_pm-01.t
   branches/ops_pct/t/steps/gen/core_pmcs-01.t
      - copied unchanged from r40255, trunk/t/steps/gen/core_pmcs-01.t
   branches/ops_pct/t/steps/gen/crypto-01.t
      - copied unchanged from r40255, trunk/t/steps/gen/crypto-01.t
   branches/ops_pct/t/steps/gen/makefiles-01.t
      - copied unchanged from r40255, trunk/t/steps/gen/makefiles-01.t
   branches/ops_pct/t/steps/gen/opengl-01.t
      - copied unchanged from r40255, trunk/t/steps/gen/opengl-01.t
   branches/ops_pct/t/steps/gen/parrot_include-01.t
      - copied unchanged from r40255, trunk/t/steps/gen/parrot_include-01.t
   branches/ops_pct/t/steps/gen/platform-01.t
      - copied unchanged from r40255, trunk/t/steps/gen/platform-01.t
   branches/ops_pct/t/steps/init/defaults-01.t
      - copied unchanged from r40255, trunk/t/steps/init/defaults-01.t
   branches/ops_pct/t/steps/init/headers-01.t
      - copied unchanged from r40255, trunk/t/steps/init/headers-01.t
   branches/ops_pct/t/steps/init/hints/
      - copied from r40255, trunk/t/steps/init/hints/
   branches/ops_pct/t/steps/init/hints-01.t
      - copied unchanged from r40255, trunk/t/steps/init/hints-01.t
   branches/ops_pct/t/steps/init/hints/darwin-01.t
      - copied unchanged from r40255, trunk/t/steps/init/hints/darwin-01.t
   branches/ops_pct/t/steps/init/install-01.t
      - copied unchanged from r40255, trunk/t/steps/init/install-01.t
   branches/ops_pct/t/steps/init/manifest-01.t
      - copied unchanged from r40255, trunk/t/steps/init/manifest-01.t
   branches/ops_pct/t/steps/init/optimize-01.t
      - copied unchanged from r40255, trunk/t/steps/init/optimize-01.t
   branches/ops_pct/t/steps/inter/charset-01.t
      - copied unchanged from r40255, trunk/t/steps/inter/charset-01.t
   branches/ops_pct/t/steps/inter/encoding-01.t
      - copied unchanged from r40255, trunk/t/steps/inter/encoding-01.t
   branches/ops_pct/t/steps/inter/lex-01.t
      - copied unchanged from r40255, trunk/t/steps/inter/lex-01.t
   branches/ops_pct/t/steps/inter/lex-02.t
      - copied unchanged from r40255, trunk/t/steps/inter/lex-02.t
   branches/ops_pct/t/steps/inter/lex-03.t
      - copied unchanged from r40255, trunk/t/steps/inter/lex-03.t
   branches/ops_pct/t/steps/inter/libparrot-01.t
      - copied unchanged from r40255, trunk/t/steps/inter/libparrot-01.t
   branches/ops_pct/t/steps/inter/make-01.t
      - copied unchanged from r40255, trunk/t/steps/inter/make-01.t
   branches/ops_pct/t/steps/inter/progs-01.t
      - copied unchanged from r40255, trunk/t/steps/inter/progs-01.t
   branches/ops_pct/t/steps/inter/progs-02.t
      - copied unchanged from r40255, trunk/t/steps/inter/progs-02.t
   branches/ops_pct/t/steps/inter/progs-03.t
      - copied unchanged from r40255, trunk/t/steps/inter/progs-03.t
   branches/ops_pct/t/steps/inter/progs-04.t
      - copied unchanged from r40255, trunk/t/steps/inter/progs-04.t
   branches/ops_pct/t/steps/inter/shlibs-01.t
      - copied unchanged from r40255, trunk/t/steps/inter/shlibs-01.t
   branches/ops_pct/t/steps/inter/types-01.t
      - copied unchanged from r40255, trunk/t/steps/inter/types-01.t
   branches/ops_pct/t/steps/inter/yacc-01.t
      - copied unchanged from r40255, trunk/t/steps/inter/yacc-01.t
   branches/ops_pct/t/steps/inter/yacc-02.t
      - copied unchanged from r40255, trunk/t/steps/inter/yacc-02.t
Deleted:
   branches/ops_pct/config/auto/fink.pm
   branches/ops_pct/config/auto/macports.pm
   branches/ops_pct/docs/dev/fhs.pod
   branches/ops_pct/ports/ubuntu/lpia_no_aligned_funcptr.patch
   branches/ops_pct/runtime/parrot/library/Data/Replace.pir
   branches/ops_pct/src/dynoplibs/myops.ops
   branches/ops_pct/src/dynpmc/pair.pmc
   branches/ops_pct/src/ops/obscure.ops
   branches/ops_pct/src/pbc_info.c
   branches/ops_pct/t/configure/049-options_test.t
   branches/ops_pct/t/dynoplibs/myops.t
   branches/ops_pct/t/dynpmc/pair.t
   branches/ops_pct/t/steps/auto_alignptrs-01.t
   branches/ops_pct/t/steps/auto_alignptrs-02.t
   branches/ops_pct/t/steps/auto_arch-01.t
   branches/ops_pct/t/steps/auto_attributes-01.t
   branches/ops_pct/t/steps/auto_backtrace-01.t
   branches/ops_pct/t/steps/auto_byteorder-01.t
   branches/ops_pct/t/steps/auto_cgoto-01.t
   branches/ops_pct/t/steps/auto_cpu-01.t
   branches/ops_pct/t/steps/auto_crypto-01.t
   branches/ops_pct/t/steps/auto_ctags-01.t
   branches/ops_pct/t/steps/auto_env-01.t
   branches/ops_pct/t/steps/auto_fink-01.t
   branches/ops_pct/t/steps/auto_format-01.t
   branches/ops_pct/t/steps/auto_funcptr-01.t
   branches/ops_pct/t/steps/auto_gc-01.t
   branches/ops_pct/t/steps/auto_gcc-01.t
   branches/ops_pct/t/steps/auto_gdbm-01.t
   branches/ops_pct/t/steps/auto_gettext-01.t
   branches/ops_pct/t/steps/auto_glibc-01.t
   branches/ops_pct/t/steps/auto_gmp-01.t
   branches/ops_pct/t/steps/auto_headers-01.t
   branches/ops_pct/t/steps/auto_icu-01.t
   branches/ops_pct/t/steps/auto_inline-01.t
   branches/ops_pct/t/steps/auto_isreg-01.t
   branches/ops_pct/t/steps/auto_jit-01.t
   branches/ops_pct/t/steps/auto_macports-01.t
   branches/ops_pct/t/steps/auto_macports-02.t
   branches/ops_pct/t/steps/auto_memalign-01.t
   branches/ops_pct/t/steps/auto_msvc-01.t
   branches/ops_pct/t/steps/auto_neg_0-01.t
   branches/ops_pct/t/steps/auto_opengl-01.t
   branches/ops_pct/t/steps/auto_ops-01.t
   branches/ops_pct/t/steps/auto_pcre-01.t
   branches/ops_pct/t/steps/auto_perldoc-01.t
   branches/ops_pct/t/steps/auto_pmc-01.t
   branches/ops_pct/t/steps/auto_pod2man-01.t
   branches/ops_pct/t/steps/auto_readline-01.t
   branches/ops_pct/t/steps/auto_readline-02.t
   branches/ops_pct/t/steps/auto_revision-01.t
   branches/ops_pct/t/steps/auto_signal-01.t
   branches/ops_pct/t/steps/auto_sizes-01.t
   branches/ops_pct/t/steps/auto_snprintf-01.t
   branches/ops_pct/t/steps/auto_socklen_t-01.t
   branches/ops_pct/t/steps/auto_va_ptr-01.t
   branches/ops_pct/t/steps/auto_warnings-01.t
   branches/ops_pct/t/steps/gen_call_list-01.t
   branches/ops_pct/t/steps/gen_config_h-01.t
   branches/ops_pct/t/steps/gen_config_pm-01.t
   branches/ops_pct/t/steps/gen_core_pmcs-01.t
   branches/ops_pct/t/steps/gen_crypto-01.t
   branches/ops_pct/t/steps/gen_makefiles-01.t
   branches/ops_pct/t/steps/gen_opengl-01.t
   branches/ops_pct/t/steps/gen_parrot_include-01.t
   branches/ops_pct/t/steps/gen_platform-01.t
   branches/ops_pct/t/steps/init_defaults-01.t
   branches/ops_pct/t/steps/init_headers-01.t
   branches/ops_pct/t/steps/init_hints-01.t
   branches/ops_pct/t/steps/init_install-01.t
   branches/ops_pct/t/steps/init_manifest-01.t
   branches/ops_pct/t/steps/init_optimize-01.t
   branches/ops_pct/t/steps/inter_charset-01.t
   branches/ops_pct/t/steps/inter_encoding-01.t
   branches/ops_pct/t/steps/inter_lex-01.t
   branches/ops_pct/t/steps/inter_lex-02.t
   branches/ops_pct/t/steps/inter_lex-03.t
   branches/ops_pct/t/steps/inter_libparrot-01.t
   branches/ops_pct/t/steps/inter_make-01.t
   branches/ops_pct/t/steps/inter_progs-01.t
   branches/ops_pct/t/steps/inter_progs-02.t
   branches/ops_pct/t/steps/inter_progs-03.t
   branches/ops_pct/t/steps/inter_progs-04.t
   branches/ops_pct/t/steps/inter_shlibs-01.t
   branches/ops_pct/t/steps/inter_types-01.t
   branches/ops_pct/t/steps/inter_yacc-01.t
   branches/ops_pct/t/steps/inter_yacc-02.t
   branches/ops_pct/tools/dev/parrot_8.supp
Modified:
   branches/ops_pct/   (props changed)
   branches/ops_pct/CREDITS
   branches/ops_pct/ChangeLog
   branches/ops_pct/Configure.pl
   branches/ops_pct/DEPRECATED.pod
   branches/ops_pct/MANIFEST
   branches/ops_pct/MANIFEST.SKIP
   branches/ops_pct/MANIFEST.generated
   branches/ops_pct/META.yml
   branches/ops_pct/NEWS
   branches/ops_pct/PBC_COMPAT
   branches/ops_pct/PLATFORMS
   branches/ops_pct/README
   branches/ops_pct/RESPONSIBLE_PARTIES
   branches/ops_pct/VERSION
   branches/ops_pct/compilers/imcc/imcc.l
   branches/ops_pct/compilers/imcc/imclexer.c
   branches/ops_pct/compilers/imcc/optimizer.c
   branches/ops_pct/compilers/imcc/reg_alloc.c
   branches/ops_pct/compilers/imcc/symreg.c
   branches/ops_pct/compilers/json/JSON/pge2pir.tg
   branches/ops_pct/compilers/ncigen/NCIGENP6.pm
   branches/ops_pct/compilers/ncigen/src/NCIPIR.pir
   branches/ops_pct/compilers/ncigen/src/builtins/say.pir
   branches/ops_pct/compilers/ncigen/src/parser/actions.pm
   branches/ops_pct/compilers/nqp/src/Grammar.pg
   branches/ops_pct/compilers/nqp/src/Grammar/Actions.pir
   branches/ops_pct/compilers/nqp/src/builtins.pir
   branches/ops_pct/compilers/opsc/opsc_core.pir
   branches/ops_pct/compilers/pct/src/PAST/Compiler.pir
   branches/ops_pct/compilers/pct/src/PAST/Node.pir
   branches/ops_pct/compilers/pct/src/PCT/HLLCompiler.pir
   branches/ops_pct/compilers/pct/src/PCT/Node.pir
   branches/ops_pct/compilers/pct/src/POST/Compiler.pir
   branches/ops_pct/compilers/pge/PGE/Exp.pir
   branches/ops_pct/compilers/pge/PGE/Match.pir
   branches/ops_pct/compilers/pge/PGE/OPTable.pir
   branches/ops_pct/compilers/pge/PGE/Perl6Regex.pir
   branches/ops_pct/compilers/pge/PGE/Regex.pir
   branches/ops_pct/compilers/tge/TGE/Compiler.pir
   branches/ops_pct/compilers/tge/TGE/Grammar.pir
   branches/ops_pct/compilers/tge/tgc.pir
   branches/ops_pct/config/auto/gc.pm
   branches/ops_pct/config/auto/gdbm.pm
   branches/ops_pct/config/auto/gettext.pm
   branches/ops_pct/config/auto/gmp.pm
   branches/ops_pct/config/auto/msvc.pm
   branches/ops_pct/config/auto/opengl.pm
   branches/ops_pct/config/auto/pcre.pm
   branches/ops_pct/config/auto/readline.pm
   branches/ops_pct/config/gen/call_list/misc.in
   branches/ops_pct/config/gen/config_h.pm
   branches/ops_pct/config/gen/config_pm/config_lib_pasm.in
   branches/ops_pct/config/gen/config_pm/config_pir.in
   branches/ops_pct/config/gen/makefiles/dynoplibs.in
   branches/ops_pct/config/gen/makefiles/dynpmc.in
   branches/ops_pct/config/gen/makefiles/opsc.in
   branches/ops_pct/config/gen/makefiles/root.in
   branches/ops_pct/config/gen/opengl.pm
   branches/ops_pct/config/gen/parrot_include.pm
   branches/ops_pct/config/gen/platform/generic/platform_limits.h
   branches/ops_pct/config/gen/platform/generic/threads.h
   branches/ops_pct/config/gen/platform/win32/dl.c
   branches/ops_pct/config/gen/platform/win32/env.c
   branches/ops_pct/config/gen/platform/win32/exec.c
   branches/ops_pct/config/gen/platform/win32/threads.h
   branches/ops_pct/config/gen/platform/win32/time.c
   branches/ops_pct/config/init/defaults.pm
   branches/ops_pct/config/init/hints.pm
   branches/ops_pct/config/init/hints/darwin.pm
   branches/ops_pct/docs/compiler_faq.pod
   branches/ops_pct/docs/dev/events.pod
   branches/ops_pct/docs/embed.pod
   branches/ops_pct/docs/parrothist.pod
   branches/ops_pct/docs/pdds/pdd17_pmc.pod
   branches/ops_pct/docs/pdds/pdd22_io.pod
   branches/ops_pct/docs/pdds/pdd28_strings.pod
   branches/ops_pct/docs/pdds/pdd30_install.pod
   branches/ops_pct/docs/project/release_manager_guide.pod
   branches/ops_pct/editor/skeleton.pir
   branches/ops_pct/examples/benchmarks/overload.pir
   branches/ops_pct/examples/json/postalcodes.pir
   branches/ops_pct/examples/languages/squaak/src/builtins/say.pir
   branches/ops_pct/examples/library/ncurses_life.pir
   branches/ops_pct/examples/past/01-sub.pir
   branches/ops_pct/examples/past/four_plus_one.pir
   branches/ops_pct/examples/pir/pirric.pir
   branches/ops_pct/examples/pir/quine_ord.pir
   branches/ops_pct/examples/pir/sudoku.pir
   branches/ops_pct/examples/sdl/minesweeper/field.pir
   branches/ops_pct/examples/shootout/knucleotide.pir
   branches/ops_pct/examples/shootout/regexdna.pir
   branches/ops_pct/examples/tutorial/01_temp_var.pir
   branches/ops_pct/examples/tutorial/02_local_var.pir
   branches/ops_pct/examples/tutorial/03_temp_var_basic_pmcs.pir
   branches/ops_pct/examples/tutorial/04_pod_comments.pir
   branches/ops_pct/examples/tutorial/10_math_ops.pir
   branches/ops_pct/examples/tutorial/13_logical_ops.pir
   branches/ops_pct/examples/tutorial/20_string_ops.pir
   branches/ops_pct/examples/tutorial/22_string_ops_length.pir
   branches/ops_pct/examples/tutorial/23_string_ops_substr.pir
   branches/ops_pct/examples/tutorial/30_arrays_basic.pir
   branches/ops_pct/examples/tutorial/33_hashes.pir
   branches/ops_pct/examples/tutorial/34_multikey.pir
   branches/ops_pct/examples/tutorial/40_file_ops.pir
   branches/ops_pct/examples/tutorial/55_iterator.pir
   branches/ops_pct/ext/SQLite3/Makefile.PL
   branches/ops_pct/ext/SQLite3/Makefile.in
   branches/ops_pct/ext/SQLite3/gen_sqlite3.pl
   branches/ops_pct/include/parrot/atomic.h
   branches/ops_pct/include/parrot/compiler.h
   branches/ops_pct/include/parrot/gc_api.h
   branches/ops_pct/include/parrot/global.h
   branches/ops_pct/include/parrot/hash.h
   branches/ops_pct/include/parrot/interpreter.h
   branches/ops_pct/include/parrot/io.h
   branches/ops_pct/include/parrot/library.h
   branches/ops_pct/include/parrot/list.h
   branches/ops_pct/include/parrot/multidispatch.h
   branches/ops_pct/include/parrot/oo.h
   branches/ops_pct/include/parrot/packfile.h
   branches/ops_pct/include/parrot/parrot.h
   branches/ops_pct/include/parrot/pmc.h
   branches/ops_pct/include/parrot/runcore_trace.h   (props changed)
   branches/ops_pct/include/parrot/settings.h
   branches/ops_pct/include/parrot/string_funcs.h
   branches/ops_pct/include/parrot/thr_pthread.h
   branches/ops_pct/include/parrot/thr_windows.h
   branches/ops_pct/include/parrot/thread.h
   branches/ops_pct/lib/Parrot/Configure/Options/Conf.pm
   branches/ops_pct/lib/Parrot/Configure/Options/Conf/Shared.pm
   branches/ops_pct/lib/Parrot/Configure/Options/Test/Prepare.pm
   branches/ops_pct/lib/Parrot/Configure/Step/List.pm
   branches/ops_pct/lib/Parrot/Configure/Step/Methods.pm
   branches/ops_pct/lib/Parrot/Distribution.pm
   branches/ops_pct/lib/Parrot/Docs/Section/Parrot.pm
   branches/ops_pct/lib/Parrot/IO/Directory.pm
   branches/ops_pct/lib/Parrot/IO/Path.pm
   branches/ops_pct/lib/Parrot/Op.pm
   branches/ops_pct/lib/Parrot/Ops2pm.pm
   branches/ops_pct/lib/Parrot/OpsFile.pm
   branches/ops_pct/lib/Parrot/Pmc2c/Method.pm
   branches/ops_pct/lib/Parrot/Pmc2c/PMC/ParrotClass.pm
   branches/ops_pct/lib/Parrot/Pmc2c/PMC/RO.pm
   branches/ops_pct/lib/Parrot/Pmc2c/PMCEmitter.pm
   branches/ops_pct/lib/Parrot/Test.pm
   branches/ops_pct/lib/Parrot/Vtable.pm
   branches/ops_pct/ports/cygwin/README
   branches/ops_pct/ports/debian/parrot-devel.install.in
   branches/ops_pct/ports/debian/rules
   branches/ops_pct/ports/fedora/parrot.spec.fedora
   branches/ops_pct/ports/macports/Portfile
   branches/ops_pct/ports/mandriva/parrot.spec.mandriva
   branches/ops_pct/ports/suse/parrot.spec.suse
   branches/ops_pct/ports/ubuntu/changelog
   branches/ops_pct/ports/ubuntu/control.in
   branches/ops_pct/runtime/parrot/library/Crow.pir
   branches/ops_pct/runtime/parrot/library/Curses.pir
   branches/ops_pct/runtime/parrot/library/Data/Dumper/Default.pir
   branches/ops_pct/runtime/parrot/library/JSON.pir
   branches/ops_pct/runtime/parrot/library/P6object.pir
   branches/ops_pct/runtime/parrot/library/PGE/Dumper.pir
   branches/ops_pct/runtime/parrot/library/PGE/Hs.pir
   branches/ops_pct/runtime/parrot/library/PGE/Perl6Grammar.pir
   branches/ops_pct/runtime/parrot/library/PGE/Util.pir
   branches/ops_pct/runtime/parrot/library/Protoobject.pir
   branches/ops_pct/runtime/parrot/library/SDL.pir
   branches/ops_pct/runtime/parrot/library/SDL/Font.pir
   branches/ops_pct/runtime/parrot/library/SDL/StopWatch.pir
   branches/ops_pct/runtime/parrot/library/Stream/Combiner.pir
   branches/ops_pct/runtime/parrot/library/Test/Class.pir
   branches/ops_pct/runtime/parrot/library/Test/More.pir
   branches/ops_pct/runtime/parrot/library/YAML/Dumper/Default.pir
   branches/ops_pct/runtime/parrot/library/parrotlib.pir
   branches/ops_pct/src/call/ops.c
   branches/ops_pct/src/call/pcc.c
   branches/ops_pct/src/debug.c
   branches/ops_pct/src/dynpmc/rational.pmc
   branches/ops_pct/src/events.c
   branches/ops_pct/src/exceptions.c
   branches/ops_pct/src/gc/alloc_memory.c
   branches/ops_pct/src/gc/alloc_resources.c
   branches/ops_pct/src/gc/api.c
   branches/ops_pct/src/gc/gc_private.h
   branches/ops_pct/src/gc/generational_ms.c   (props changed)
   branches/ops_pct/src/gc/incremental_ms.c   (props changed)
   branches/ops_pct/src/gc/mark_sweep.c
   branches/ops_pct/src/global.c
   branches/ops_pct/src/hash.c
   branches/ops_pct/src/hll.c
   branches/ops_pct/src/interp/inter_create.c   (props changed)
   branches/ops_pct/src/io/api.c
   branches/ops_pct/src/io/buffer.c
   branches/ops_pct/src/io/filehandle.c
   branches/ops_pct/src/io/socket_api.c
   branches/ops_pct/src/io/socket_unix.c
   branches/ops_pct/src/io/unix.c
   branches/ops_pct/src/jit/i386/jit_defs.c
   branches/ops_pct/src/library.c
   branches/ops_pct/src/list.c
   branches/ops_pct/src/multidispatch.c
   branches/ops_pct/src/oo.c
   branches/ops_pct/src/ops/core.ops
   branches/ops_pct/src/ops/sys.ops
   branches/ops_pct/src/packfile.c
   branches/ops_pct/src/pmc.c
   branches/ops_pct/src/pmc/array.pmc
   branches/ops_pct/src/pmc/class.pmc
   branches/ops_pct/src/pmc/default.pmc
   branches/ops_pct/src/pmc/env.pmc
   branches/ops_pct/src/pmc/exceptionhandler.pmc
   branches/ops_pct/src/pmc/filehandle.pmc
   branches/ops_pct/src/pmc/fixedbooleanarray.pmc
   branches/ops_pct/src/pmc/fixedfloatarray.pmc
   branches/ops_pct/src/pmc/fixedintegerarray.pmc
   branches/ops_pct/src/pmc/fixedpmcarray.pmc
   branches/ops_pct/src/pmc/fixedstringarray.pmc
   branches/ops_pct/src/pmc/hash.pmc
   branches/ops_pct/src/pmc/iterator.pmc
   branches/ops_pct/src/pmc/key.pmc
   branches/ops_pct/src/pmc/namespace.pmc
   branches/ops_pct/src/pmc/object.pmc
   branches/ops_pct/src/pmc/orderedhash.pmc
   branches/ops_pct/src/pmc/os.pmc
   branches/ops_pct/src/pmc/pmcproxy.pmc
   branches/ops_pct/src/pmc/string.pmc
   branches/ops_pct/src/pmc/sub.pmc
   branches/ops_pct/src/pmc_freeze.c
   branches/ops_pct/src/runcore/cores.c   (props changed)
   branches/ops_pct/src/runcore/trace.c   (contents, props changed)
   branches/ops_pct/src/scheduler.c
   branches/ops_pct/src/spf_render.c
   branches/ops_pct/src/string/api.c
   branches/ops_pct/src/sub.c
   branches/ops_pct/src/thread.c
   branches/ops_pct/src/vtable.tbl
   branches/ops_pct/t/codingstd/c_function_docs.t
   branches/ops_pct/t/codingstd/c_indent.t
   branches/ops_pct/t/codingstd/test_file_coverage.t
   branches/ops_pct/t/compilers/imcc/syn/errors.t
   branches/ops_pct/t/compilers/imcc/syn/file.t
   branches/ops_pct/t/compilers/pct/past.t
   branches/ops_pct/t/compilers/pct/post.t
   branches/ops_pct/t/compilers/pge/03-optable.t
   branches/ops_pct/t/compilers/pge/p5regex/p5rx.t
   branches/ops_pct/t/compilers/pge/perl6regex/01-regex.t
   branches/ops_pct/t/compilers/pge/perl6regex/rx_lookarounds
   branches/ops_pct/t/compilers/pge/perl6regex/rx_subrules
   branches/ops_pct/t/configure/017-revision_from_cache.t
   branches/ops_pct/t/configure/018-revision_to_cache.t
   branches/ops_pct/t/configure/061-revision_from_cache.t
   branches/ops_pct/t/dynpmc/dynlexpad.t
   branches/ops_pct/t/examples/namespace.t
   branches/ops_pct/t/library/mime_base64.t
   branches/ops_pct/t/library/pcre.t
   branches/ops_pct/t/library/protoobject.t
   branches/ops_pct/t/native_pbc/annotations.pbc
   branches/ops_pct/t/native_pbc/integer_1.pbc
   branches/ops_pct/t/native_pbc/number_1.pbc
   branches/ops_pct/t/native_pbc/number_2.pbc
   branches/ops_pct/t/native_pbc/string_1.pbc
   branches/ops_pct/t/oo/metamodel.t
   branches/ops_pct/t/op/cc_state.t
   branches/ops_pct/t/op/gc.t
   branches/ops_pct/t/op/sprintf.t
   branches/ops_pct/t/pmc/exception.t
   branches/ops_pct/t/pmc/hash.t
   branches/ops_pct/t/pmc/io_iterator.t
   branches/ops_pct/t/pmc/iterator.t
   branches/ops_pct/t/pmc/namespace.t
   branches/ops_pct/t/pmc/nci.t
   branches/ops_pct/t/pmc/object-mro.t
   branches/ops_pct/t/pmc/orderedhash.t
   branches/ops_pct/t/pmc/packfileannotations.t
   branches/ops_pct/t/pmc/packfilerawsegment.t
   branches/ops_pct/t/pmc/pmc.t
   branches/ops_pct/t/pmc/resizablepmcarray.t
   branches/ops_pct/t/pmc/testlib/packfile_common.pir
   branches/ops_pct/t/pmc/threads.t
   branches/ops_pct/t/pmc/timer.t
   branches/ops_pct/t/src/embed.t   (props changed)
   branches/ops_pct/t/tools/dev/searchops/samples.pm
   branches/ops_pct/t/tools/dump_pbc.t
   branches/ops_pct/t/tools/install/01-create_directories.t
   branches/ops_pct/t/tools/install/dev_overall.t
   branches/ops_pct/t/tools/install/overall.t
   branches/ops_pct/t/tools/ops2cutils/06-dynamic.t
   branches/ops_pct/t/tools/ops2cutils/09-dynamic_nolines.t
   branches/ops_pct/t/tools/ops2pm/05-renum_op_map_file.t
   branches/ops_pct/t/tools/ops2pm/08-sort_ops.t
   branches/ops_pct/t/tools/ops2pm/10-print_module.t
   branches/ops_pct/t/tools/ops2pm/11-print_h.t
   branches/ops_pct/tools/build/nativecall.pl
   branches/ops_pct/tools/dev/create_language.pl
   branches/ops_pct/tools/dev/install_files.pl
   branches/ops_pct/tools/dev/mk_gitignore.pl   (props changed)
   branches/ops_pct/tools/dev/mk_language_shell.pl
   branches/ops_pct/tools/dev/parrot.supp
   branches/ops_pct/tools/dev/pbc_header.pl
   branches/ops_pct/tools/dev/pbc_to_exe.pir
   branches/ops_pct/tools/dev/vtablize.pl
   branches/ops_pct/tools/util/pgegrep
   branches/ops_pct/tools/util/release.json

Modified: branches/ops_pct/CREDITS
==============================================================================
--- branches/ops_pct/CREDITS	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/CREDITS	Fri Jul 24 19:42:02 2009	(r40257)
@@ -485,6 +485,7 @@
 E: jesse at fsck.com
 
 N: Jimmy Zhuo
+A: jimmy
 E: zhuomingliang at yahoo.com.cn
 D: Bugfixes
 
@@ -495,6 +496,12 @@
 N: John Paul Wallington
 D: pir-mode.el: fix for xemacs plus bugfixes and cleanups
 
+N: Jonathan Leto
+E: jonathan at leto.net
+W: http://leto.net
+U: dukeleto
+S: Portland, OR
+
 N: Jonathan Scott Duff
 U: duff
 E: duff at pobox.com
@@ -787,6 +794,11 @@
 E: rurban at cpan.org
 D: cygwin, 64-bit pbc compat, float converters, bignum.pmc
 
+N: Richard Hainsworth
+U: finanalyst
+E: richard at rusrating.ru
+D: bugfix SDL Font
+
 N: Richard Tibbetts
 D: Divide by zero exceptions in some PMCs
 

Modified: branches/ops_pct/ChangeLog
==============================================================================
--- branches/ops_pct/ChangeLog	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ChangeLog	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,12 +1,16 @@
 #1 $Id$
 
+2009.7.21     cotto
+	* Released 1.4.0
+	See NEWS for more.
+
 2009.06.16    Whiteknight
-        * Released 1.3.0
-        Ses NEWS for more.
+	* Released 1.3.0
+	Ses NEWS for more.
 
 2009.05.19    Infinoid
-        * Released 1.2.0
-        See NEWS for more.
+	* Released 1.2.0
+	See NEWS for more.
 
 2009.04.21    fperrad
 	* Released 1.1.0

Modified: branches/ops_pct/Configure.pl
==============================================================================
--- branches/ops_pct/Configure.pl	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/Configure.pl	Fri Jul 24 19:42:02 2009	(r40257)
@@ -196,6 +196,25 @@
 
 =back
 
+=item C<--configure_trace>
+
+Store the results of each configuration step in a Storable F<.sto> file on
+disk, for later analysis by F<Parrot::Configure::Trace> methods.
+
+=item Operating system-specific configuration options
+
+=over 4
+
+=item C<--darwin_no_fink>
+
+On Darwin, do not probe for Fink libraries.
+
+=item C<--darwin_no_macports>
+
+On Darwin, do not probe for Macports libraries.
+
+=back
+
 =back
 
 =head2 Compile Options
@@ -336,11 +355,6 @@
 
 Use JIT to emit a native executable.
 
-=item C<--gc=(type)>
-
-Determine the type of garbage collection. The value for C<type> should be one
-of: C<gc>, C<libc>, C<malloc> or C<malloc-trace>. The default is C<gc>.
-
 =back
 
 =head2 International Components For Unicode (ICU) Options

Modified: branches/ops_pct/DEPRECATED.pod
==============================================================================
--- branches/ops_pct/DEPRECATED.pod	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/DEPRECATED.pod	Fri Jul 24 19:42:02 2009	(r40257)
@@ -37,23 +37,12 @@
 
 =over 4
 
-=item Alternate GC configurations [eligible in 1.5]
-
-C<malloc>, C<malloc-trace> and C<libc> will be removed as potential
-options for the C<--gc> config option.
-
-L<https://trac.parrot.org/parrot/ticket/490>
-
 =back
 
 =head1 PMCS
 
 =over 4
 
-=item pair (dynamic PMC) [eligible in 1.5]
-
-L<https://trac.parrot.org/parrot/ticket/187>
-
 =item random [eligible in 1.1]
 
 L<https://trac.parrot.org/parrot/ticket/189>
@@ -79,6 +68,12 @@
 
 L<https://trac.parrot.org/parrot/ticket/264>
 
+=item VTABLE nomenclature. [eligible in 1.5]
+
+Current list of VTABLE functions will be reviewed and cleaned.
+
+L<https://trac.parrot.org/parrot/ticket/866>
+
 =back
 
 =head1 Opcodes
@@ -87,19 +82,11 @@
 
 =item moved to dynop [eligible in 1.1]
 
-Parts or all of: bit.ops, debug.ops, io.ops, math.ops, obscure.ops, set.ops
+Parts or all of: bit.ops, debug.ops, io.ops, math.ops, set.ops
 (the obscure and rarely used parts), sys.ops.
 
 L<https://trac.parrot.org/parrot/ticket/449>
 
-=item experimental ops [eligible in 1.1]
-
-F<src/ops/experimental.ops> - only the C<trap> opcode remains
-
-=item myops [eligible in 1.1]
-
-L<https://trac.parrot.org/parrot/ticket/450>
-
 =item get_addr and set_addr [eligible in 1.5]
 
 L<https://trac.parrot.org/parrot/ticket/218>
@@ -139,9 +126,7 @@
 
 =head1 Class Features
 
-=over 4
-
-=back
+[Nothing at this time.]
 
 =head1 PIR syntax
 
@@ -221,28 +206,6 @@
 
 L<https://trac.parrot.org/parrot/ticket/443>
 
-=item parrot_new_pmc_hash [eligible in 1.5]
-
-This function will be removed.  parrot_new_hash should be used in its place.
-
-L<https://trac.parrot.org/parrot/ticket/494>
-
-=item Parrot_get_namespace_autobase [eligible in 1.5]
-
-L<https://trac.parrot.org/parrot/ticket/155>
-
-=item Parrot_find_global_k [eligible in 1.5]
-
-L<https://trac.parrot.org/parrot/ticket/156>
-
-=item Parrot_MMD_method_name [eligible in 1.5]
-
-L<https://trac.parrot.org/parrot/ticket/625>
-
-=item pobject_lives [eligible in 1.5]
-
-L<https://trac.parrot.org/parrot/ticket/664>
-
 =item functions in src/stack.c [eligible in 1.5]
 
 L<https://trac.parrot.org/parrot/ticket/702>
@@ -271,29 +234,23 @@
 
 =head1 Compiler tools
 
-=head2 Parrot Grammar Engine
+=head2 Parrot Grammar Engine (PGE)
 
 =over 4
 
-=item Deprecated rules and methods [eligible in 1.1]
+=item Action methods in rules
 
-The following "built-in" PGE rules and methods are from previous 
-versions of Synopsis 5.
+Per Synopsis 5, all regexes will have an implied {*} token at the
+end which cause invocation of an action method if a C<:action>
+object is supplied.
 
-Deprecated rules:
-    C<null>, C<fail>, C<sp>, C<lt>, C<gt>, C<dot>
+L<https://trac.parrot.org/parrot/ticket/843>
 
-Deprecated methods:
-    C<.text>, C<.item>, C<.result_object>
+=item C<find_key> method on PGE::Match [eligible in 1.5]
 
-L<https://trac.parrot.org/parrot/ticket/460>
+The C<find_key> method on PGE::Match objects will be removed.
 
-=item Stringification, numification [eligible in 1.1]
-
-C< PGE::Match > objects will stringify or numify based on
-the text that is matched, not the result object.
-
-L<https://trac.parrot.org/parrot/ticket/461>
+L<https://trac.parrot.org/parrot/ticket/851>
 
 =back
 
@@ -321,6 +278,14 @@
 
 L<https://trac.parrot.org/parrot/ticket/463>
 
+=item PAST::Val node generation [eligible in 1.5]
+
+The PAST::Compiler may generate the code for PAST::Val nodes
+(i.e., constants) at the beginning of the block (Parrot sub) instead
+of the location where they occur in the PAST tree.
+
+L<https://trac.parrot.org/parrot/ticket/868>
+
 =back
 
 =head2 Not Quite Perl (NQP)
@@ -335,6 +300,26 @@
 
 L<https://trac.parrot.org/parrot/ticket/459>
 
+=item Quoted items [eligible in 1.5]
+
+Double-quoted strings will interpret unescaped $-names
+as interpolated variables in the string.  Bare slashes 
+will introduce regular expressions.  The C<< <foo bar> >>
+syntax will produce an array of strings instead of a single
+string.
+
+L<https://trac.parrot.org/parrot/ticket/837>
+
+=item C<< PIR q:to:<xyz> >> inline PIR [eligible in 1.5]
+
+The C<< PIR q:to:<xyz> >> form of inline PIR in NQP scripts is
+deprecated.  Use C< Q:PIR { ... } >  or C< Q:PIR {{ ... }} >
+instead.
+
+L<https://trac.parrot.org/parrot/ticket/842>
+
+=cut
+
 =back
 
 =cut
@@ -386,6 +371,10 @@
 
 L<https://trac.parrot.org/parrot/ticket/754>
 
+=item OpenGL bindings and libraries [experimental]
+
+L<https://trac.parrot.org/parrot/ticket/852>
+
 =back
 
 =head1 Footnotes

Modified: branches/ops_pct/MANIFEST
==============================================================================
--- branches/ops_pct/MANIFEST	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/MANIFEST	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,7 +1,7 @@
 # ex: set ro:
 # $Id$
 #
-# generated by tools/dev/mk_manifest_and_skip.pl Sun Jul 19 07:46:20 2009 UT
+# generated by tools/dev/mk_manifest_and_skip.pl Fri Jul 24 19:33:51 2009 UT
 #
 # See below for documentation on the format of this file.
 #
@@ -250,7 +250,6 @@
 config/auto/env.pm                                          []
 config/auto/env/test_setenv_c.in                            []
 config/auto/env/test_unsetenv_c.in                          []
-config/auto/fink.pm                                         []
 config/auto/format.pm                                       []
 config/auto/funcptr.pm                                      []
 config/auto/funcptr/test_c.in                               []
@@ -279,7 +278,6 @@
 config/auto/jit/test_exec_cygwin_c.in                       []
 config/auto/jit/test_exec_linux_c.in                        []
 config/auto/jit/test_exec_openbsd_c.in                      []
-config/auto/macports.pm                                     []
 config/auto/memalign.pm                                     []
 config/auto/memalign/test2_c.in                             []
 config/auto/memalign/test_c.in                              []
@@ -311,6 +309,7 @@
 config/auto/snprintf.pm                                     []
 config/auto/snprintf/test_c.in                              []
 config/auto/socklen_t.pm                                    []
+config/auto/thread.pm                                       []
 config/auto/va_ptr.pm                                       []
 config/auto/va_ptr/test_c.in                                []
 config/auto/warnings.pm                                     []
@@ -321,6 +320,7 @@
 config/gen/config_h.pm                                      []
 config/gen/config_h/config_h.in                             []
 config/gen/config_h/feature_h.in                            []
+config/gen/config_h/has_header_h.in                         []
 config/gen/config_pm.pm                                     []
 config/gen/config_pm/Config_pm.in                           []
 config/gen/config_pm/config_lib_pasm.in                     []
@@ -469,7 +469,6 @@
 docs/dev/c_functions.pod                                    []
 docs/dev/debugging_with_msvc.pod                            []
 docs/dev/events.pod                                         []
-docs/dev/fhs.pod                                            []
 docs/dev/headerizer.pod                                     []
 docs/dev/infant.pod                                         []
 docs/dev/jit_i386.pod                                       []
@@ -662,6 +661,7 @@
 examples/benchmarks/vpm.py                                  [examples]
 examples/benchmarks/vpm.rb                                  [examples]
 examples/c/nanoparrot.c                                     [examples]
+examples/c/pbc_info.c                                       [examples]
 examples/c/test_main.c                                      [examples]
 examples/compilers/Makefile                                 [examples]
 examples/compilers/japhc.c                                  [examples]
@@ -749,6 +749,7 @@
 examples/opengl/math.pir                                    [examples]
 examples/opengl/shapes.p6                                   [examples]
 examples/opengl/shapes.pir                                  [examples]
+examples/opengl/static-triangle-hll.pir                     [examples]
 examples/opengl/static-triangle.p6                          [examples]
 examples/opengl/static-triangle.pir                         [examples]
 examples/opengl/triangle.p6                                 [examples]
@@ -1182,7 +1183,6 @@
 runtime/parrot/library/Data/Dumper.pir                      [library]
 runtime/parrot/library/Data/Dumper/Base.pir                 [library]
 runtime/parrot/library/Data/Dumper/Default.pir              [library]
-runtime/parrot/library/Data/Replace.pir                     [library]
 runtime/parrot/library/Digest/MD5.pir                       [library]
 runtime/parrot/library/Getopt/Obj.pir                       [library]
 runtime/parrot/library/HTTP/Daemon.pir                      [library]
@@ -1269,14 +1269,13 @@
 src/debug.c                                                 []
 src/dynext.c                                                []
 src/dynoplibs/README                                        []doc
-src/dynoplibs/myops.ops                                     []
+src/dynoplibs/obscure.ops                                   []
 src/dynpmc/README.pod                                       []doc
 src/dynpmc/dynlexpad.pmc                                    [devel]src
 src/dynpmc/ext.pir                                          []
 src/dynpmc/foo.pmc                                          [devel]src
 src/dynpmc/gdbmhash.pmc                                     [devel]src
 src/dynpmc/main.pasm                                        []
-src/dynpmc/pair.pmc                                         [devel]src
 src/dynpmc/rational.pmc                                     [devel]src
 src/dynpmc/rotest.pmc                                       [devel]src
 src/dynpmc/subproxy.pmc                                     [devel]src
@@ -1293,6 +1292,7 @@
 src/gc/alloc_register.c                                     []
 src/gc/alloc_resources.c                                    []
 src/gc/api.c                                                []
+src/gc/gc_inf.c                                             []
 src/gc/gc_malloc.c                                          []
 src/gc/gc_ms.c                                              []
 src/gc/gc_private.h                                         []
@@ -1381,7 +1381,6 @@
 src/ops/io.ops                                              []
 src/ops/math.ops                                            []
 src/ops/object.ops                                          []
-src/ops/obscure.ops                                         []
 src/ops/ops.num                                             [devel]src
 src/ops/ops.skip                                            []
 src/ops/pic.ops                                             []
@@ -1397,13 +1396,13 @@
 src/parrot_debugger.c                                       []
 src/pbc_disassemble.c                                       []
 src/pbc_dump.c                                              []
-src/pbc_info.c                                              []
 src/pbc_merge.c                                             []
 src/pic.c                                                   []
 src/pic_jit.c                                               []
 src/pmc.c                                                   []
 src/pmc/addrregistry.pmc                                    [devel]src
 src/pmc/array.pmc                                           [devel]src
+src/pmc/arrayiterator.pmc                                   [devel]src
 src/pmc/bigint.pmc                                          [devel]src
 src/pmc/bignum.pmc                                          [devel]src
 src/pmc/boolean.pmc                                         [devel]src
@@ -1432,6 +1431,8 @@
 src/pmc/float.pmc                                           [devel]src
 src/pmc/handle.pmc                                          [devel]src
 src/pmc/hash.pmc                                            [devel]src
+src/pmc/hashiterator.pmc                                    [devel]src
+src/pmc/hashiteratorkey.pmc                                 [devel]src
 src/pmc/integer.pmc                                         [devel]src
 src/pmc/iterator.pmc                                        [devel]src
 src/pmc/key.pmc                                             [devel]src
@@ -1444,6 +1445,7 @@
 src/pmc/null.pmc                                            [devel]src
 src/pmc/object.pmc                                          [devel]src
 src/pmc/orderedhash.pmc                                     [devel]src
+src/pmc/orderedhashiterator.pmc                             [devel]src
 src/pmc/os.pmc                                              [devel]src
 src/pmc/packfile.pmc                                        [devel]src
 src/pmc/packfileannotation.pmc                              [devel]src
@@ -1477,6 +1479,7 @@
 src/pmc/socket.pmc                                          [devel]src
 src/pmc/string.pmc                                          [devel]src
 src/pmc/stringhandle.pmc                                    [devel]src
+src/pmc/stringiterator.pmc                                  [devel]src
 src/pmc/sub.pmc                                             [devel]src
 src/pmc/task.pmc                                            [devel]src
 src/pmc/timer.pmc                                           [devel]src
@@ -1666,7 +1669,7 @@
 t/configure/046-inter.t                                     [test]
 t/configure/047-inter.t                                     [test]
 t/configure/048-return_result_undef.t                       [test]
-t/configure/049-options_test.t                              [test]
+t/configure/049-options_test_prepare.t                      [test]
 t/configure/050-fatal.t                                     [test]
 t/configure/051-fatal_step.t                                [test]
 t/configure/059-silent.t                                    [test]
@@ -1693,11 +1696,9 @@
 t/distro/file_metadata.t                                    [test]
 t/distro/manifest.t                                         [test]
 t/distro/meta_yml.t                                         [test]
-t/dynoplibs/myops.t                                         [test]
 t/dynpmc/dynlexpad.t                                        [test]
 t/dynpmc/foo.t                                              [test]
 t/dynpmc/gdbmhash.t                                         [test]
-t/dynpmc/pair.t                                             [test]
 t/dynpmc/rational.t                                         [test]
 t/dynpmc/rotest.t                                           [test]
 t/dynpmc/subclass_with_pir_method.t                         [test]
@@ -1849,6 +1850,7 @@
 t/pharness/04-Usage.t                                       [test]
 t/pmc/addrregistry.t                                        [test]
 t/pmc/array.t                                               [test]
+t/pmc/arrayiterator.t                                       [test]
 t/pmc/bigint.t                                              [test]
 t/pmc/bignum.t                                              [test]
 t/pmc/boolean.t                                             [test]
@@ -1880,6 +1882,8 @@
 t/pmc/globals.t                                             [test]
 t/pmc/handle.t                                              [test]
 t/pmc/hash.t                                                [test]
+t/pmc/hashiterator.t                                        [test]
+t/pmc/hashiteratorkey.t                                     [test]
 t/pmc/integer.t                                             [test]
 t/pmc/io.t                                                  [test]
 t/pmc/io_iterator.t                                         [test]
@@ -1899,6 +1903,7 @@
 t/pmc/object.t                                              [test]
 t/pmc/objects.t                                             [test]
 t/pmc/orderedhash.t                                         [test]
+t/pmc/orderedhashiterator.t                                 [test]
 t/pmc/os.t                                                  [test]
 t/pmc/packfile.t                                            [test]
 t/pmc/packfileannotation.t                                  [test]
@@ -1938,6 +1943,7 @@
 t/pmc/socket.t                                              [test]
 t/pmc/string.t                                              [test]
 t/pmc/stringhandle.t                                        [test]
+t/pmc/stringiterator.t                                      [test]
 t/pmc/sub.t                                                 [test]
 t/pmc/sys.t                                                 [test]
 t/pmc/task.t                                                [test]
@@ -1960,81 +1966,80 @@
 t/src/exit.t                                                [test]
 t/src/extend.t                                              [test]
 t/src/warnings.t                                            [test]
-t/steps/auto_alignptrs-01.t                                 [test]
-t/steps/auto_alignptrs-02.t                                 [test]
-t/steps/auto_arch-01.t                                      [test]
-t/steps/auto_attributes-01.t                                [test]
-t/steps/auto_backtrace-01.t                                 [test]
-t/steps/auto_byteorder-01.t                                 [test]
-t/steps/auto_cgoto-01.t                                     [test]
-t/steps/auto_cpu-01.t                                       [test]
-t/steps/auto_crypto-01.t                                    [test]
-t/steps/auto_ctags-01.t                                     [test]
-t/steps/auto_env-01.t                                       [test]
-t/steps/auto_fink-01.t                                      [test]
-t/steps/auto_format-01.t                                    [test]
-t/steps/auto_funcptr-01.t                                   [test]
-t/steps/auto_gc-01.t                                        [test]
-t/steps/auto_gcc-01.t                                       [test]
-t/steps/auto_gdbm-01.t                                      [test]
-t/steps/auto_gettext-01.t                                   [test]
-t/steps/auto_glibc-01.t                                     [test]
-t/steps/auto_gmp-01.t                                       [test]
-t/steps/auto_headers-01.t                                   [test]
-t/steps/auto_icu-01.t                                       [test]
-t/steps/auto_inline-01.t                                    [test]
-t/steps/auto_isreg-01.t                                     [test]
-t/steps/auto_jit-01.t                                       [test]
-t/steps/auto_macports-01.t                                  [test]
-t/steps/auto_macports-02.t                                  [test]
-t/steps/auto_memalign-01.t                                  [test]
-t/steps/auto_msvc-01.t                                      [test]
-t/steps/auto_neg_0-01.t                                     [test]
-t/steps/auto_opengl-01.t                                    [test]
-t/steps/auto_ops-01.t                                       [test]
-t/steps/auto_pcre-01.t                                      [test]
-t/steps/auto_perldoc-01.t                                   [test]
-t/steps/auto_pmc-01.t                                       [test]
-t/steps/auto_pod2man-01.t                                   [test]
-t/steps/auto_readline-01.t                                  [test]
-t/steps/auto_readline-02.t                                  [test]
-t/steps/auto_revision-01.t                                  [test]
-t/steps/auto_signal-01.t                                    [test]
-t/steps/auto_sizes-01.t                                     [test]
-t/steps/auto_snprintf-01.t                                  [test]
-t/steps/auto_socklen_t-01.t                                 [test]
-t/steps/auto_va_ptr-01.t                                    [test]
-t/steps/auto_warnings-01.t                                  [test]
-t/steps/gen_call_list-01.t                                  [test]
-t/steps/gen_config_h-01.t                                   [test]
-t/steps/gen_config_pm-01.t                                  [test]
-t/steps/gen_core_pmcs-01.t                                  [test]
-t/steps/gen_crypto-01.t                                     [test]
-t/steps/gen_makefiles-01.t                                  [test]
-t/steps/gen_opengl-01.t                                     [test]
-t/steps/gen_parrot_include-01.t                             [test]
-t/steps/gen_platform-01.t                                   [test]
-t/steps/init_defaults-01.t                                  [test]
-t/steps/init_headers-01.t                                   [test]
-t/steps/init_hints-01.t                                     [test]
-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]
-t/steps/inter_libparrot-01.t                                [test]
-t/steps/inter_make-01.t                                     [test]
-t/steps/inter_progs-01.t                                    [test]
-t/steps/inter_progs-02.t                                    [test]
-t/steps/inter_progs-03.t                                    [test]
-t/steps/inter_progs-04.t                                    [test]
-t/steps/inter_shlibs-01.t                                   [test]
-t/steps/inter_types-01.t                                    [test]
-t/steps/inter_yacc-01.t                                     [test]
-t/steps/inter_yacc-02.t                                     [test]
+t/steps/auto/alignptrs-01.t                                 [test]
+t/steps/auto/alignptrs-02.t                                 [test]
+t/steps/auto/arch-01.t                                      [test]
+t/steps/auto/attributes-01.t                                [test]
+t/steps/auto/backtrace-01.t                                 [test]
+t/steps/auto/byteorder-01.t                                 [test]
+t/steps/auto/cgoto-01.t                                     [test]
+t/steps/auto/cpu-01.t                                       [test]
+t/steps/auto/crypto-01.t                                    [test]
+t/steps/auto/ctags-01.t                                     [test]
+t/steps/auto/env-01.t                                       [test]
+t/steps/auto/format-01.t                                    [test]
+t/steps/auto/funcptr-01.t                                   [test]
+t/steps/auto/gc-01.t                                        [test]
+t/steps/auto/gcc-01.t                                       [test]
+t/steps/auto/gdbm-01.t                                      [test]
+t/steps/auto/gettext-01.t                                   [test]
+t/steps/auto/glibc-01.t                                     [test]
+t/steps/auto/gmp-01.t                                       [test]
+t/steps/auto/headers-01.t                                   [test]
+t/steps/auto/icu-01.t                                       [test]
+t/steps/auto/inline-01.t                                    [test]
+t/steps/auto/isreg-01.t                                     [test]
+t/steps/auto/jit-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]
+t/steps/auto/opengl-01.t                                    [test]
+t/steps/auto/ops-01.t                                       [test]
+t/steps/auto/pcre-01.t                                      [test]
+t/steps/auto/perldoc-01.t                                   [test]
+t/steps/auto/pmc-01.t                                       [test]
+t/steps/auto/pod2man-01.t                                   [test]
+t/steps/auto/readline-01.t                                  [test]
+t/steps/auto/readline-02.t                                  [test]
+t/steps/auto/revision-01.t                                  [test]
+t/steps/auto/signal-01.t                                    [test]
+t/steps/auto/sizes-01.t                                     [test]
+t/steps/auto/snprintf-01.t                                  [test]
+t/steps/auto/socklen_t-01.t                                 [test]
+t/steps/auto/thread-01.t                                    [test]
+t/steps/auto/va_ptr-01.t                                    [test]
+t/steps/auto/warnings-01.t                                  [test]
+t/steps/gen/call_list-01.t                                  [test]
+t/steps/gen/config_h-01.t                                   [test]
+t/steps/gen/config_pm-01.t                                  [test]
+t/steps/gen/core_pmcs-01.t                                  [test]
+t/steps/gen/crypto-01.t                                     [test]
+t/steps/gen/makefiles-01.t                                  [test]
+t/steps/gen/opengl-01.t                                     [test]
+t/steps/gen/parrot_include-01.t                             [test]
+t/steps/gen/platform-01.t                                   [test]
+t/steps/init/defaults-01.t                                  [test]
+t/steps/init/headers-01.t                                   [test]
+t/steps/init/hints-01.t                                     [test]
+t/steps/init/hints/darwin-01.t                              [test]
+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]
+t/steps/inter/libparrot-01.t                                [test]
+t/steps/inter/make-01.t                                     [test]
+t/steps/inter/progs-01.t                                    [test]
+t/steps/inter/progs-02.t                                    [test]
+t/steps/inter/progs-03.t                                    [test]
+t/steps/inter/progs-04.t                                    [test]
+t/steps/inter/shlibs-01.t                                   [test]
+t/steps/inter/types-01.t                                    [test]
+t/steps/inter/yacc-01.t                                     [test]
+t/steps/inter/yacc-02.t                                     [test]
 t/stress/gc.t                                               [test]
 t/tools/dev/pmctree.t                                       [test]
 t/tools/dev/searchops.t                                     [test]
@@ -2101,6 +2106,7 @@
 t/tools/ops2pm/samples/pic_ops.original                     [test]
 t/tools/parrot_debugger.t                                   [test]
 t/tools/pbc_merge.t                                         [test]
+t/tools/pgegrep.t                                           [test]
 t/tools/pmc2c.t                                             [test]
 t/tools/pmc2cutils/00-qualify.t                             [test]
 t/tools/pmc2cutils/01-pmc2cutils.t                          [test]
@@ -2110,6 +2116,7 @@
 t/tools/pmc2cutils/05-gen_c.t                               [test]
 t/tools/pmc2cutils/08-pmc-pm.t                              [test]
 t/tools/pmc2cutils/README                                   []doc
+t/tools/testdata                                            [test]
 tools/build/addopstags.pl                                   []
 tools/build/c2str.pl                                        []
 tools/build/fixup_gen_file.pl                               []
@@ -2154,7 +2161,6 @@
 tools/dev/opsrenumber.pl                                    []
 tools/dev/parrot-fuzzer                                     []
 tools/dev/parrot.supp                                       []
-tools/dev/parrot_8.supp                                     []
 tools/dev/parrot_api.pl                                     []
 tools/dev/parrot_coverage.pl                                []
 tools/dev/parrotbench.pl                                    []

Modified: branches/ops_pct/MANIFEST.SKIP
==============================================================================
--- branches/ops_pct/MANIFEST.SKIP	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/MANIFEST.SKIP	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,6 +1,6 @@
 # ex: set ro:
 # $Id$
-# generated by tools/dev/mk_manifest_and_skip.pl Thu Jun 25 20:34:12 2009 UT
+# generated by tools/dev/mk_manifest_and_skip.pl Tue Jul 21 23:09:08 2009 UT
 #
 # This file should contain a transcript of the svn:ignore properties
 # of the directories in the Parrot subversion repository. (Needed for

Modified: branches/ops_pct/MANIFEST.generated
==============================================================================
--- branches/ops_pct/MANIFEST.generated	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/MANIFEST.generated	Fri Jul 24 19:42:02 2009	(r40257)
@@ -2,10 +2,10 @@
 # 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.1.3.0.dylib                    [main]lib
+blib/lib/libparrot.1.4.0.dylib                    [main]lib
 blib/lib/libparrot.a                              [main]lib
 blib/lib/libparrot.dylib                          [main]lib
-blib/lib/libparrot.so.1.3.0                       [main]lib
+blib/lib/libparrot.so.1.4.0                       [main]lib
 blib/lib/libparrot.so                             [main]lib
 compilers/json/JSON/grammar.pbc                   [json]
 compilers/json/JSON.pbc                           [json]
@@ -47,6 +47,7 @@
 include/parrot/platform_limits.h                  [devel]include
 include/parrot/vtable.h                           [main]include
 install_config.fpmc                               [main]lib
+src/install_config.o                              [main]lib
 installable_parrot_config.exe                     [main]bin
 installable_parrot_config                         [main]bin
 installable_parrot_debugger.exe                   [main]bin
@@ -57,8 +58,6 @@
 installable_pbc_disassemble                       [main]bin
 installable_pbc_dump.exe                          [main]bin
 installable_pbc_dump                              [main]bin
-installable_pbc_info.exe                          [main]bin
-installable_pbc_info                              [main]bin
 installable_pbc_merge.exe                         [main]bin
 installable_pbc_merge                             [main]bin
 installable_pbc_to_exe.exe                        [main]bin
@@ -117,7 +116,6 @@
 runtime/parrot/include/iotypes.pasm               [main]
 runtime/parrot/include/iterator.pasm              [main]
 runtime/parrot/include/longopt.pasm               [main]
-runtime/parrot/include/mmd.pasm                   [main]
 runtime/parrot/include/opengl_defines.pasm        [main]
 runtime/parrot/include/parrotlib.pbc              [main]
 runtime/parrot/include/pmctypes.pasm              [main]

Modified: branches/ops_pct/META.yml
==============================================================================
--- branches/ops_pct/META.yml	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/META.yml	Fri Jul 24 19:42:02 2009	(r40257)
@@ -4,7 +4,7 @@
 # See http://module-build.sourceforge.net/META-spec-current.html for details.
 ---
 name: parrot
-version: 1.3.0
+version: 1.4.0
 author: parrot-dev at lists.parrot.org
 abstract: a virtual machine designed for dynamic languages
 license: artistic2

Modified: branches/ops_pct/NEWS
==============================================================================
--- branches/ops_pct/NEWS	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/NEWS	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,5 +1,35 @@
 # $Id$
 
+New in 1.4.0
+- Core
+  + Key and Iterator refactor
+  + Major pbc_to_exe generated code speed improvement
+  + New "Infinite Memory" GC core for demonstration purposes
+  + gc_debug runcore and GC-related heisenbug fixes
+  + Elimination of variable expansion in parrot_config
+  + CLI arguments are processed as Unicode by default
+  + Substantial optimizations in NCI
+  + Parrot builds on Win64
+  + Hashes can use native types as keys and values
+  + Fixed installed pbc_to_exe
+  + Simplification of PMC generation code
+  + Improved GC encapsulation and API documentation
+- Documentation
+  + List of candidates for embedding API (docs/embed.pod)
+  + PIR book sent to publisher
+- Testing
+  + Several conversions of Perl test to pure PIR.
+  + C indentation coding standards test improvement
+  + Improved test coverage of example code
+- Deprecations
+  + Removal of PGE rules: <null> <fail> <sp> <lt> <gt> <dot>
+  + Removal of PGE methods: .text .item .result_object
+  + Deprecation of most dynops
++ Miscellaneous
+  + Beginnings of OpenGL::Math library; OpenGL bindings and library marked experimental
+  + Localizing and consting fixes
+  + Many memory and thread-related leaks plugged
+
 New in 1.3.0
 - Core
   + Optimized parts of the IO system

Modified: branches/ops_pct/PBC_COMPAT
==============================================================================
--- branches/ops_pct/PBC_COMPAT	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/PBC_COMPAT	Fri Jul 24 19:42:02 2009	(r40257)
@@ -27,14 +27,7 @@
 
 # please insert tab separated entries at the top of the list
 
-4.8	2009.05.30	Infinoid	Added Handle PMC
-4.7	2009.05.29	cotto	add cmp_pmc opcode (also, addition of setstdin and root_new in previous commits)
-4.6	2009.05.18	bacek	removed PackfileAnnotationKeys PMC
-4.5	2009.04.10	cotto	removed Ref and SharedRef PMCs
-4.4	2009.04.07	pmichaud	find_caller_lex added
-4.3	2009.03.25	jonathan	socket opcodes added
-4.2	2009.03.21	cotto	removed Bound_NCI PMC
-4.1	2009.03.17	cotto	removed Slice PMC
+5.0	2009.07.21	cotto	released 1.4.0 
 4.0	2009.03.17	allison	released 1.0.0
 3.0	2007.07.23	jonathan	implementing new PBC header format
 2.0	2005.11.22	leo	changed PBC format (HLL_info)

Modified: branches/ops_pct/PLATFORMS
==============================================================================
--- branches/ops_pct/PLATFORMS	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/PLATFORMS	Fri Jul 24 19:42:02 2009	(r40257)
@@ -14,15 +14,15 @@
                                 CGoto JIT EXEC   Thr Sig
 --------------------------------------------------------------------------------
 cygwin1.5.25-x86-gcc3.4.4     4   Y    Y    -     -   -   Y    Y     Y  20090315
-darwin8.11.1-x86-gcc4.0.1    ??   ?    N    ?     ?   ?   Y    Y*3   Y  20090420
+darwin8.11.1-x86-gcc4.0.1    ??   ?    N    ?     ?   ?   Y    Y     Y  20090720
 linux-x86-gcc4.1.2                Y    Y    ?     Y   Y   Y    Y     ?  20090419
 linux-x86-gcc4.1.3                Y    Y    ?     Y   Y   Y    Y     ?  20080414
 linux-x86-gcc4.2.3                Y    Y    ?     Y   Y   Y    Y     ?  20080715
 linux-x86-gcc4.2.4                Y    Y    ?     Y   Y   Y    Y     ?  20081023
 linux-x86-gcc4.3.2                Y    Y    ?     Y   Y   Y    Y     ?  20081030
 linux-x86-llvm-gcc-4.2            Y    Y    ?     ?   ?   Y    Y     ?  20090514
-sol10-sparc-cc_5.9           B4   Y    -    -     Y   Y   Y    Y     ?  20090419
-sol10-sparc-cc_5.9           B8   Y    -    -     Y   Y   Y    Y     ?  20090419
+sol10-sparc-cc_5.9           B4   Y    -    -     Y   Y   Y    Y     ?  20090720
+sol10-sparc-cc_5.9           B8   Y    -    -     Y   Y   Y    Y     ?  20090720
 sol10-sparc-gcc_4.0.2        B4   Y    -    -     Y   Y   Y    Y/1   ?  20080510
 sol10-sparc-gcc_4.0.2        B8   Y    -    -     Y   Y   Y    Y/2   ?  20080518
 win32-x86-mingw_gcc3.4.5          Y    Y    -     -   -   Y    Y     Y  20090421
@@ -38,13 +38,14 @@
 cygwin1.7.0-x86-gcc4.3.2      4   Y    Y    -     -   -   Y    Y     Y  20090315
 dragonfly2.2.0-i386-gcc-4.1.2 4   Y    Y    -     Y   Y   Y    Y     ?  20090427
 freebsd-x86-gcc-4.2.1         4   Y    Y    Y     ?   ?   Y    Y     Y  20090415
-freebsd-amd64-gcc-4.2.1       8   Y    -    -     ?   ?   Y    Y     Y  20090419
+freebsd-amd64-gcc-4.2.1       8   Y    -    -     ?   ?   Y    Y     Y  20090720
 linux-amd64-clang-r73854      8   ?    ?    =     Y   Y   Y/4  Y/1   ?  20090622
+linux-amd64-clang-r75433      8   Y    N    ?     ?   ?   Y    Y     ?  20090712
 linux-ppc-gcc3.4.5                Y    Y    Y     ?   ?   Y    Y     ?  20080519
 linux-s390x-gcc4.1.2         B4   ?    -    -     Y   Y   Y    Y/2   ?  20080908
-linux-x86_64-gcc4.1.2         8   Y    -    -     Y   Y   Y    Y     ?  20080220
-linux-x86_64-gcc4.3.2         8   Y    -    -     Y   Y   Y    Y     ?  20081118
-linux-x86_64-gcc4.3.3         8   Y    -    -     Y   Y   Y    Y     ?  20090517
+linux-amd64-gcc4.1.2          8   Y    -    -     Y   Y   Y    Y     ?  20080220
+linux-amd64-gcc4.3.2          8   Y    -    -     Y   Y   Y    Y     ?  20081118
+linux-amd64-gcc4.3.3          8   Y    Y    ?     Y   Y   Y    Y     ?  20090712
 netbsd3.1-ppc-gcc-3.3.3       B   Y    Y    ?     Y   Y   Y    Y     ?  20090419
 netbsd4.0-alpha-gcc-4.1.2     8   Y    -    ?     Y   Y   Y    Y     ?  20090518
 netbsd4.0-arm-gcc-4.1.2           Y    -    ?     Y   Y   Y    Y     ?  20090518
@@ -63,6 +64,7 @@
 win32-x86-msvc_6.0            4   -    Y    -     -   -   Y    Y/8   ?  20090315
 win32-x64-msvc_9.0            8   -    -    -     -   -   Y    Y/51  ?  20081203
 win32-x64-mingw_gcc3.4.5      8   Y    Y    ?     ?   ?   Y    Y     ?  20090210
+win64-amd64-msvc_9.0          8   N    N    N     ?   ?   Y*3  N     ?  20090720
 
 Legend:
 ?   ... unknown or untested
@@ -93,9 +95,8 @@
 *1 gcc and cc defaults to 32bits on solaris, for 64bit use
    --ccflags='-m64' --ldflags='-m64' --linkflags='-m64'
 *2 http://rt.perl.org/rt3/Ticket/Display.html?id=60926
-*3 failures in 'make examples_tests' (part of 'make fulltest')
-*4 compiles with --ccflags=-U__APPLE_CC__ --without-gmp
-   See http://lists.parrot.org/pipermail/parrot-dev/2009-June/002407.html
+*3 64-bit MSVC uses 32-bit int and long values. For 64-bit use
+   --ccflags="-GS- -MD" --intval="long long" --opcode="long long"
 
 The following configurations are also working on x86/linux (and possibly
 other platforms):

Modified: branches/ops_pct/README
==============================================================================
--- branches/ops_pct/README	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/README	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,4 +1,4 @@
-This is Parrot, version 1.3.0
+This is Parrot, version 1.4.0
 ------------------------------
 
 Parrot is Copyright (C) 2001-2009, Parrot Foundation.

Modified: branches/ops_pct/RESPONSIBLE_PARTIES
==============================================================================
--- branches/ops_pct/RESPONSIBLE_PARTIES	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/RESPONSIBLE_PARTIES	Fri Jul 24 19:42:02 2009	(r40257)
@@ -7,8 +7,7 @@
 for.
 
 See docs/project/roles_responsibilities.pod for role definitions, and
-https://trac.parrot.org/parrot/wiki/Languages for more language
-authors/maintainers.
+https://trac.parrot.org/parrot/wiki/Languages for language authors/maintainers.
 
 
 Project Team
@@ -26,6 +25,7 @@
                                 Klaas-Jan Stol
                                 Francois Perrad
                                 Mark Glines
+                                Christoph Otto
 
 Metacommitter                   Allison Randal
                                 Jerry Gay
@@ -54,16 +54,7 @@
                                 Allison Randal (TGE)
                                 Klaas-Jan Stol (PIRC)
 
-High Level Language Developer   Patrick Michaud (Perl 6, NQP)
-                                Will Coleda (Tcl)
-                                Stephen Weeks (Cardinal (Ruby), Lolcode)
-                                Francois Perrad (Lua, Pipp (PHP))
-                                Bernhard Schmalhofer (Pipp (PHP), Eclectus (Scheme))
-                                Kevin Tew (Cardinal (Ruby))
-                                Christoph Otto (Pipp (PHP))
-
 Platform Porter                 Allison Randal (Debian, Ubuntu)
-                                Aldo Calpini (PocketPC)
                                 Francois Perrad (MinGW32)
                                 Reini Urban (cygwin)
                                 Will Coleda (MacPorts)

Modified: branches/ops_pct/VERSION
==============================================================================
--- branches/ops_pct/VERSION	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/VERSION	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1 +1 @@
-1.3.0
+1.4.0

Modified: branches/ops_pct/compilers/imcc/imcc.l
==============================================================================
--- branches/ops_pct/compilers/imcc/imcc.l	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/imcc/imcc.l	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1325,7 +1325,7 @@
 compile_file(PARROT_INTERP, FILE *file, void *yyscanner)
 {
     yyguts_t * const yyg = (yyguts_t *)yyscanner;
-    YY_BUFFER_STATE  buffer;
+    YY_BUFFER_STATE  volatile buffer;
 
     IMCC_INFO(interp)->frames->s.next = NULL;
     buffer                            = YY_CURRENT_BUFFER;
@@ -1358,7 +1358,7 @@
 compile_string(PARROT_INTERP, const char *s, void *yyscanner)
 {
     yyguts_t * const yyg = (yyguts_t *)yyscanner;
-    YY_BUFFER_STATE  buffer;
+    YY_BUFFER_STATE  volatile buffer;
 
     IMCC_INFO(interp)->frames->s.next = NULL;
     buffer                            = YY_CURRENT_BUFFER;

Modified: branches/ops_pct/compilers/imcc/imclexer.c
==============================================================================
--- branches/ops_pct/compilers/imcc/imclexer.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/imcc/imclexer.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -5737,7 +5737,7 @@
 compile_file(PARROT_INTERP, FILE *file, void *yyscanner)
 {
     yyguts_t * const yyg = (yyguts_t *)yyscanner;
-    YY_BUFFER_STATE  buffer;
+    YY_BUFFER_STATE  volatile buffer;
 
     IMCC_INFO(interp)->frames->s.next = NULL;
     buffer                            = YY_CURRENT_BUFFER;
@@ -5769,7 +5769,7 @@
 compile_string(PARROT_INTERP, const char *s, void *yyscanner)
 {
     yyguts_t * const yyg = (yyguts_t *)yyscanner;
-    YY_BUFFER_STATE  buffer;
+    YY_BUFFER_STATE  volatile buffer;
 
     IMCC_INFO(interp)->frames->s.next = NULL;
     buffer                            = YY_CURRENT_BUFFER;

Modified: branches/ops_pct/compilers/imcc/optimizer.c
==============================================================================
--- branches/ops_pct/compilers/imcc/optimizer.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/imcc/optimizer.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1501,14 +1501,12 @@
         }
     }
 
-    /* Unreachable instructions */
 
+    /* Unreachable instructions */
 
     for (last = unit->instructions, ins = last->next;
          last && ins;
          ins = ins->next) {
-         if (!last && !ins)
-            break;
 
         if ((last->type & IF_goto) && !(ins->type & ITLABEL) &&
             STREQ(last->opname, "branch")) {

Modified: branches/ops_pct/compilers/imcc/reg_alloc.c
==============================================================================
--- branches/ops_pct/compilers/imcc/reg_alloc.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/imcc/reg_alloc.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -158,8 +158,7 @@
         __attribute__nonnull__(1)
         FUNC_MODIFIES(*unit);
 
-PARROT_WARN_UNUSED_RESULT
-static int try_allocate(PARROT_INTERP, ARGIN(IMC_Unit *unit))
+static void try_allocate(PARROT_INTERP, ARGIN(IMC_Unit *unit))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
@@ -1013,7 +1012,7 @@
 
 /*
 
-=item C<static int try_allocate(PARROT_INTERP, IMC_Unit *unit)>
+=item C<static void try_allocate(PARROT_INTERP, IMC_Unit *unit)>
 
 Color the graph, assigning registers to each symbol:
 
@@ -1026,8 +1025,7 @@
 
 */
 
-PARROT_WARN_UNUSED_RESULT
-static int
+static void
 try_allocate(PARROT_INTERP, ARGIN(IMC_Unit *unit))
 {
     ASSERT_ARGS(try_allocate)
@@ -1043,7 +1041,7 @@
         n = unit->max_color + 1;
 
     if (!n)
-        return -1;
+        return;
 
     avail = mem_allocate_n_typed(n, char);
 
@@ -1073,9 +1071,11 @@
         map_colors(unit, i, graph, avail, r->set, already_allocated);
         color = ig_find_color(unit, avail);
 
-        if (color == -1)
+        if (color == -1) {
+            mem_sys_free(avail);
             IMCC_fatal(interp, DEBUG_IMC,
                     "# no more colors - this should not happen\n");
+        }
 
         color   += already_allocated;
         r->color = color;
@@ -1085,7 +1085,7 @@
     }
 
     mem_sys_free(avail);
-    return -1; /* we are totally finished */
+    /* we are totally finished */
 }
 
 /*

Modified: branches/ops_pct/compilers/imcc/symreg.c
==============================================================================
--- branches/ops_pct/compilers/imcc/symreg.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/imcc/symreg.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -642,10 +642,9 @@
     ASSERT_ARGS(mk_ident)
     char   * const fullname = _mk_fullname(pesky_global__namespace, name);
     SymReg *r = get_sym_by_name(&(IMCC_INFO(interp)->last_unit->hash), name);
-    if (r && r->set != t) {
-        IMCC_print_inc(interp);
-        IMCC_warning(interp, "Duplicated IDENTIFIER '%s'\n", fullname);
-    }
+    if (r && r->set != t)
+        IMCC_fataly(interp, EXCEPTION_SYNTAX_ERROR,
+                "syntax error, duplicated IDENTIFIER '%s'\n", fullname);
 
     r = mk_symreg(interp, fullname, t);
     r->type = VTIDENTIFIER;

Modified: branches/ops_pct/compilers/json/JSON/pge2pir.tg
==============================================================================
--- branches/ops_pct/compilers/json/JSON/pge2pir.tg	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/json/JSON/pge2pir.tg	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,7 +3,7 @@
 transform result (ROOT) {
     .local pmc pir
     .local string result
- 
+
     $S0 = tree.'get'('pir', node, 'value')
 
     pir = new 'CodeString'
@@ -14,7 +14,7 @@
     pir.'emit'('.end')
 
    .return(pir)
-} 
+}
 
 transform pir (value) {
 
@@ -25,7 +25,7 @@
     type = 'string'
     sub_node = node[type]
     unless null sub_node goto got_type
-   
+
     type = 'number'
     sub_node = node[type]
     unless null sub_node goto got_type
@@ -84,7 +84,7 @@
     .local string result, child_result, key_result
     result = pir.'unique'('$P')
     pir.'emit'("    %0 = new 'Hash'", result)
-    
+
     .local pmc items
 
     items = node['members']
@@ -96,23 +96,23 @@
     keys  = items['string']
     items = items['value']
 
-    .local pmc iter, key_iter, child, key
-    key_iter = new 'Iterator', keys
-    iter     = new 'Iterator', items
+    .local pmc it, key_iter, child, key
+    key_iter = iter keys
+    it       = iter items
 
     # the two iters should be in lockstep as a result of the PGE grammar
 loop:
-    unless iter goto end
-    child = shift iter
+    unless it goto end
+    child = shift it
     $P0 = tree.'get'('pir', child, 'value')
     $S0 = $P0
-    pir .= $S0 
+    pir .= $S0
     child_result = child['ret']
 
     key   = shift key_iter
     $P0 = tree.'get'('pir', key, 'string')
     $S0 = $P0
-    pir .= $S0 
+    pir .= $S0
     key_result = key['ret']
 
     pir.'emit'('    %0[%1] = %2', result, key_result, child_result)
@@ -122,7 +122,7 @@
 end:
     node['ret'] = result
 
-   .return (pir) 
+   .return (pir)
 }
 
 transform pir (array) {
@@ -131,7 +131,7 @@
     .local string result, child_result
     result = pir.'unique'('$P')
     pir.'emit'("    %0 = new 'ResizablePMCArray'", result)
-    
+
     .local pmc items
 
 
@@ -140,14 +140,14 @@
 
     items = items['value']
 
-    .local pmc iter, child
-    iter = new 'Iterator', items
+    .local pmc it, child
+    it = iter items
 loop:
-    unless iter goto end
-    child = shift iter
+    unless it goto end
+    child = shift it
     $P0 = tree.'get'('pir', child, 'value')
     $S0 = $P0
-    pir .= $S0 
+    pir .= $S0
 
     child_result = child['ret']
     pir.'emit'('    push %0, %1', result, child_result)
@@ -155,20 +155,20 @@
 end:
     node['ret'] = result
 
-   .return (pir) 
+   .return (pir)
 }
 
 transform pir (string) {
-    .local pmc pir, result, children, iter, child
+    .local pmc pir, result, children, it, child
     .local string tmp
     tmp = ''
     pir = new 'CodeString'
     children = node['char']
     if null children goto loop_end
-    iter = new 'Iterator', children 
+    it = iter children
   loop:
     push_eh loop_end
-      child = shift iter
+      child = shift it
     pop_eh
     unless child goto loop_end
     $S0 = child
@@ -180,7 +180,7 @@
     $S1 = substr $S0, 2, 4
     $P1 = $S1
     $I0 = $P1.'to_int'(16)
-    $S0 = chr $I0 
+    $S0 = chr $I0
     goto char
   escape:
     $P0 = get_root_global [ 'JSON' ],  '$escapes'

Modified: branches/ops_pct/compilers/ncigen/NCIGENP6.pm
==============================================================================
--- branches/ops_pct/compilers/ncigen/NCIGENP6.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/ncigen/NCIGENP6.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -4,6 +4,8 @@
 # Copyright (C) 2008, Parrot Foundation.
 
 use v6;
+class NCIGENAST::FuncDecl {
+}
 
 evalfile('./ncigen.pbc', lang => 'Parrot');
 
@@ -12,9 +14,9 @@
 
     run("gcc -x c -E $fn > $pp_fn");
     my $compiler = compreg('NCIGEN');
-    my $ast = $compiler.parse(slurp($pp_fn));
+    my $match = $compiler.parse(slurp($pp_fn));
     unlink $pp_fn;
-    $ast.item();
+    $match.ast;
 }
 
 sub compreg {

Modified: branches/ops_pct/compilers/ncigen/src/NCIPIR.pir
==============================================================================
--- branches/ops_pct/compilers/ncigen/src/NCIPIR.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/ncigen/src/NCIPIR.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -134,14 +134,14 @@
 
 .sub 'pir_children' :method
     .param pmc node
-    .local pmc code, iter
+    .local pmc code, it
     code = new 'CodeString'
-    iter = new 'Iterator', node
+    it   = iter node
   iter_loop:
-    unless iter goto iter_end
+    unless it goto iter_end
     .local string key
     .local pmc cast
-    key = shift iter
+    key = shift it
     cast = node[key]
     $P0 = self.'pir'(cast)
     code .= $P0

Modified: branches/ops_pct/compilers/ncigen/src/builtins/say.pir
==============================================================================
--- branches/ops_pct/compilers/ncigen/src/builtins/say.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/ncigen/src/builtins/say.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -11,11 +11,11 @@
 
 .sub 'say'
     .param pmc args            :slurpy
-    .local pmc iter
-    iter = new 'Iterator', args
+    .local pmc it
+    it = iter args
   iter_loop:
-    unless iter goto iter_end
-    $P0 = shift iter
+    unless it goto iter_end
+    $P0 = shift it
     print $P0
     goto iter_loop
   iter_end:
@@ -26,10 +26,12 @@
 .sub 'printf'
     .param pmc format
     .param pmc args   :slurpy
-    .local pmc iter
-    iter = new 'Iterator', args
+    .local pmc it
+    it = iter args
   iter_loop:
-    unless iter goto iter_end
+    unless it goto iter_end
+    $P0 = shift it
+    print $P0
     goto iter_loop
   iter_end:
 .end

Modified: branches/ops_pct/compilers/ncigen/src/parser/actions.pm
==============================================================================
--- branches/ops_pct/compilers/ncigen/src/parser/actions.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/ncigen/src/parser/actions.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -183,12 +183,12 @@
         if $struct_or_union {
             my $ident := $<struct_or_union_specifier><identifier><identifier>;
             if $ident {
-                $ident := strip_spaces($ident.text());
+                $ident := strip_spaces(~$ident);
             }
             else {
                 $ident := $<struct_or_union_specifier><identifier>;
                 if $ident {
-                    $ident := strip_spaces($ident.text());
+                    $ident := strip_spaces(~$ident);
                 }
                 else {
                     $ident := "anonymous_" ~~ $struct_or_union~~ "1";
@@ -232,7 +232,7 @@
         for $_<struct_declarator_list> {
             my $sm := $smt.clone();
             my $declarator := $_<struct_declarator><declarator>;
-            $sm.name(strip_spaces($declarator.text()));
+            $sm.name(strip_spaces(~$declarator));
             ispointer($declarator, $sm);
             $ast.push($sm);
         }

Modified: branches/ops_pct/compilers/nqp/src/Grammar.pg
==============================================================================
--- branches/ops_pct/compilers/nqp/src/Grammar.pg	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/nqp/src/Grammar.pg	Fri Jul 24 19:42:02 2009	(r40257)
@@ -59,7 +59,7 @@
         .return (1)
       end:
     }}
-    <fail>
+    <!>
 }
 
 
@@ -127,7 +127,7 @@
             if $P0 != $P2 goto end
             .return (1)
             end:
-        }} <fail>
+        }} <!>
 }
 
 token MARK_STATEMENT_END {

Modified: branches/ops_pct/compilers/nqp/src/Grammar/Actions.pir
==============================================================================
--- branches/ops_pct/compilers/nqp/src/Grammar/Actions.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/nqp/src/Grammar/Actions.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -103,11 +103,11 @@
     past = $P0.'new'('node'=>match)
     $P1 = match['statement']
     if null $P1 goto iter_end
-    .local pmc iter
-    iter = new 'Iterator', $P1
+    .local pmc it
+    it = iter $P1
   iter_loop:
-    unless iter goto iter_end
-    $P2 = shift iter
+    unless it goto iter_end
+    $P2 = shift it
     $P2 = $P2.'ast'()
     past.'push'($P2)
     goto iter_loop
@@ -345,7 +345,7 @@
   not_quote:
     if key != 'heredoc' goto not_heredoc
     $P0 = match['text']
-    inline = $P0.'text'()
+    inline = $P0.'Str'()
   not_heredoc:
   make:
     $P1 = get_hll_global ['PAST'], 'Op'
@@ -410,11 +410,11 @@
     $P0 = $P0[0]
     if null $P0 goto param_end
     unless $P0 goto param_end
-    .local pmc iter
-    iter = new 'Iterator', $P0
+    .local pmc it
+    it = iter $P0
   param_loop:
-    unless iter goto param_end
-    $P1 = shift iter
+    unless it goto param_end
+    $P1 = shift it
     .local pmc parameter
     $P2 = $P1['parameter']
     parameter = $P2.'ast'()
@@ -516,11 +516,11 @@
     past = $P0.'ast'()
     $P1 = match['postfix']
     if null $P1 goto end
-    .local pmc iter, term
-    iter = new 'Iterator', $P1
+    .local pmc it, term
+    it = iter $P1
   iter_loop:
-    unless iter goto end
-    $P2 = shift iter
+    unless it goto end
+    $P2 = shift it
     term = past
     past = $P2.'ast'()
     past.'unshift'(term)
@@ -1211,11 +1211,11 @@
     past = $P0.'new'('node'=>match, 'name'=>name, 'opattr'=>opattr)
     $P1 = match.'list'()
     if null $P1 goto iter_end
-    .local pmc iter
-    iter = new 'Iterator', $P1
+    .local pmc it
+    it = iter $P1
   iter_loop:
-    unless iter goto iter_end
-    $P2 = shift iter
+    unless it goto iter_end
+    $P2 = shift it
     $I0 = $P2.'from'()
     $I1 = $P2.'to'()
     if $I0 == $I1 goto iter_loop

Modified: branches/ops_pct/compilers/nqp/src/builtins.pir
==============================================================================
--- branches/ops_pct/compilers/nqp/src/builtins.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/nqp/src/builtins.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -13,12 +13,12 @@
 
 .sub 'print'
     .param pmc list            :slurpy
-    .local pmc iter
+    .local pmc it
 
-    iter = new 'Iterator', list
+    it = iter list
   iter_loop:
-    unless iter goto iter_end
-    $P0 = shift iter
+    unless it goto iter_end
+    $P0 = shift it
     print $P0
     goto iter_loop
   iter_end:

Modified: branches/ops_pct/compilers/opsc/opsc_core.pir
==============================================================================
--- branches/ops_pct/compilers/opsc/opsc_core.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/opsc/opsc_core.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -53,8 +53,6 @@
 .include 'builtins.pir'
 .include 'compiler/gen_grammar.pir'
 .include 'compiler/gen_actions.pir'
-.include 'ops/op.pir'
-.include 'ops/gen_op.pir'
 .include 'ops/oplib.pir'
 .include 'ops/gen_oplib.pir'
 

Modified: branches/ops_pct/compilers/pct/src/PAST/Compiler.pir
==============================================================================
--- branches/ops_pct/compilers/pct/src/PAST/Compiler.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/pct/src/PAST/Compiler.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -664,7 +664,7 @@
     .local string rtype
     rtype = options['rtype']
 
-    .local pmc iter, node, ops, pops, tail, skip
+    .local pmc it, node, ops, pops, tail, skip
     $P0 = get_hll_global ['POST'], 'Ops'
     ops = $P0.'new'('node'=>node)
     $P0 = get_hll_global ['POST'], 'Ops'
@@ -675,10 +675,10 @@
     $S0 = self.'unique'('skip_handler_')
     skip = $P0.'new'('result'=>$S0)
 
-    iter = new 'Iterator', ehs
+    it = iter ehs
   handler_loop:
-    unless iter, handler_loop_done
-    node = shift iter
+    unless it, handler_loop_done
+    node = shift it
 
     .local pmc ehpir, types, label
     .local string ehreg, type
@@ -826,14 +826,14 @@
     ##  merge the Block's symtable with outersym
     symtable = clone symtable
   symtable_merge:
-    .local pmc iter
-    iter = new 'Iterator', outersym
+    .local pmc it
+    it = iter outersym
   symtable_merge_loop:
-    unless iter goto have_symtable
-    $S0 = shift iter
+    unless it goto have_symtable
+    $S0 = shift it
     $I0 = exists symtable[$S0]
     if $I0 goto symtable_merge_loop
-    $P0 = iter[$S0]
+    $P0 = it[$S0]
     symtable[$S0] = $P0
     goto symtable_merge_loop
   have_symtable:
@@ -1499,14 +1499,14 @@
     returns = box 'ResizablePMCArray'
   have_returns:
 
-    .local pmc listpost, iter
+    .local pmc listpost, it
     listpost = self.'as_vivipost'(returns, 'rtype'=>'P')
     ops.'result'(listpost)
     ops.'push'(listpost)
-    iter = new 'Iterator', posargs
+    it = iter posargs
   iter_loop:
-    unless iter goto iter_end
-    $S0 = shift iter
+    unless it goto iter_end
+    $S0 = shift it
     ops.'push_pirop'('push', listpost, $S0)
     goto iter_loop
   iter_end:
@@ -2224,20 +2224,21 @@
     .param pmc node
     .param pmc bindpost
 
-    .local string name
+    .local pmc ops
     $P0 = get_hll_global ['POST'], 'Ops'
+    ops = $P0.'new'('node'=>node)
+    .local string name
     name = node.'name'()
     name = self.'escape'(name)
 
-    .local pmc call_on, ops
+    .local pmc call_on
     call_on = node[0]
     if null call_on goto use_self
     call_on = self.'as_post'(call_on, 'rtype'=>'P')
-    ops = call_on
+    ops.'push'(call_on)
     goto invocant_done
   use_self:
     call_on = box 'self'
-    ops = $P0.'new'('node'=>node)
   invocant_done:
 
     if bindpost goto attribute_bind

Modified: branches/ops_pct/compilers/pct/src/PAST/Node.pir
==============================================================================
--- branches/ops_pct/compilers/pct/src/PAST/Node.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/pct/src/PAST/Node.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -162,7 +162,7 @@
     unless value goto normal
     die "Unable to set lvalue on PAST::Val node"
   normal:
-    .tailcall self.'attr'('value', value, has_value)
+    .tailcall self.'attr'('lvalue', value, has_value)
 .end
 
 =back
@@ -430,7 +430,7 @@
     .param pmc hash
 
     $P0 = split ' ', "pasttype pirop inline lvalue"
-    $P1 = new 'Iterator', $P0
+    $P1 = iter $P0
   iter_loop:
     unless $P1 goto iter_end
     $S0 = shift $P1

Modified: branches/ops_pct/compilers/pct/src/PCT/HLLCompiler.pir
==============================================================================
--- branches/ops_pct/compilers/pct/src/PCT/HLLCompiler.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/pct/src/PCT/HLLCompiler.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -41,11 +41,11 @@
   Options:
     USAGE
 
-    .local pmc iter
-    iter = new 'Iterator', $P0
+    .local pmc it
+    it = iter $P0
   options_loop:
-    unless iter goto options_end
-    $P3  = shift iter
+    unless it goto options_end
+    $P3  = shift it
     $P1 .= "    "
     $P1 .= $P3
     $P1 .= "\n"
@@ -193,15 +193,15 @@
 .sub 'removestage' :method
     .param string stagename
 
-    .local pmc stages, iter, newstages
+    .local pmc stages, it, newstages
     stages = getattribute self, '@stages'
     newstages = new 'ResizableStringArray'
 
-    iter = new 'Iterator', stages
+    it = iter stages
   iter_loop:
-    unless iter goto iter_end
+    unless it goto iter_end
     .local pmc current
-    current = shift iter
+    current = shift it
     if current == stagename goto iter_loop
       push newstages, current
     goto iter_loop
@@ -245,14 +245,14 @@
       target = adverbs['after']
 
   positional_insert:
-    .local pmc iter, newstages
+    .local pmc it, newstages
     newstages = new 'ResizableStringArray'
 
-    iter = new 'Iterator', stages
+    it = iter stages
   iter_loop:
-    unless iter goto iter_end
+    unless it goto iter_end
     .local pmc current
-    current = shift iter
+    current = shift it
     unless current == target goto no_insert_before
       unless position == 'before' goto no_insert_before
         push newstages, stagename
@@ -293,14 +293,14 @@
     target = adverbs['target']
     target = downcase target
 
-    .local pmc stages, result, iter
+    .local pmc stages, result, it
     result = source
     stages = getattribute self, '@stages'
-    iter = new 'Iterator', stages
+    it = iter stages
   iter_loop:
-    unless iter goto iter_end
+    unless it goto iter_end
     .local string stagename
-    stagename = shift iter
+    stagename = shift it
     result = self.stagename(result, adverbs :flat :named)
     if target == stagename goto have_result
     goto iter_loop
@@ -471,7 +471,7 @@
   compile_match:
     #push_eh err_past
     .local pmc ast
-    ast = source.'item'()
+    ast = source.'ast'()
     #pop_eh
     $I0 = isa ast, ['PAST';'Node']
     unless $I0 goto err_past
@@ -690,13 +690,13 @@
   have_files_array:
     .local string code
     code = ''
-    .local pmc iter
-    iter = new 'Iterator', files
+    .local pmc it
+    it = iter files
   iter_loop:
-    unless iter goto iter_end
+    unless it goto iter_end
     .local string iname
     .local pmc ifh
-    iname = shift iter
+    iname = shift it
     ifh = new 'FileHandle'
     unless encoding == 'utf8' goto iter_loop_1
     ifh.'encoding'(encoding)
@@ -738,11 +738,11 @@
     getopts = new 'Getopt::Obj'
     getopts.'notOptStop'(1)
     $P0 = getattribute self, '@cmdoptions'
-    .local pmc iter
-    iter = new 'Iterator', $P0
+    .local pmc it
+    it = iter $P0
   getopts_loop:
-    unless iter goto getopts_end
-    $S0 = shift iter
+    unless it goto getopts_end
+    $S0 = shift it
     push getopts, $S0
     goto getopts_loop
   getopts_end:
@@ -783,11 +783,11 @@
     opts = self.'process_args'(args)
 
     ##   merge command-line args with defaults passed in from caller
-    .local pmc iter
-    iter = new 'Iterator', opts
+    .local pmc it
+    it = iter opts
   mergeopts_loop:
-    unless iter goto mergeopts_end
-    $S0 = shift iter
+    unless it goto mergeopts_end
+    $S0 = shift it
     $P0 = opts[$S0]
     adverbs[$S0] = $P0
     goto mergeopts_loop

Modified: branches/ops_pct/compilers/pct/src/PCT/Node.pir
==============================================================================
--- branches/ops_pct/compilers/pct/src/PCT/Node.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/pct/src/PCT/Node.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -57,20 +57,20 @@
     .param pmc children        :slurpy
     .param pmc adverbs         :slurpy :named
 
-    .local pmc iter
-    iter = new 'Iterator', children
+    .local pmc it
+    it = iter children
   children_loop:
-    unless iter goto children_end
-    $P0 = shift iter
+    unless it goto children_end
+    $P0 = shift it
     push self, $P0
     goto children_loop
   children_end:
 
-    iter = new 'Iterator', adverbs
+    it = iter adverbs
   adverbs_loop:
-    unless iter goto adverbs_end
-    $S0 = shift iter
-    $P0 = iter[$S0]
+    unless it goto adverbs_end
+    $S0 = shift it
+    $P0 = it[$S0]
     $P1 = find_method self, $S0
     self.$P1($P0)
     goto adverbs_loop
@@ -180,11 +180,10 @@
 =cut
 
 .sub 'iterator' :method
-    .local pmc iter
+    .local pmc it
     $P0 = self.'list'()
-    iter = new 'Iterator', $P0
-    iter = 0
-    .return (iter)
+    it = iter $P0
+    .return (it)
 .end
 
 

Modified: branches/ops_pct/compilers/pct/src/POST/Compiler.pir
==============================================================================
--- branches/ops_pct/compilers/pct/src/POST/Compiler.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/pct/src/POST/Compiler.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -293,11 +293,11 @@
     .local pmc paramlist
     paramlist = node['paramlist']
     if null paramlist goto paramlist_done
-    .local pmc iter
-    iter = new 'Iterator', paramlist
+    .local pmc it
+    it = iter paramlist
   param_loop:
-    unless iter goto paramlist_done
-    $P0 = shift iter
+    unless it goto paramlist_done
+    $P0 = shift it
     if null $P0 goto param_loop
     subpir .= $P0
     goto param_loop

Modified: branches/ops_pct/compilers/pge/PGE/Exp.pir
==============================================================================
--- branches/ops_pct/compilers/pge/PGE/Exp.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/pge/PGE/Exp.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -443,15 +443,15 @@
     .param string label
     .param string next
 
-    .local pmc iter, exp
+    .local pmc it, exp
     code.'emit'('        %0: # concat', label)
     $P0 = self.'list'()
-    iter = new 'Iterator', $P0
-    exp = shift iter
+    it  = iter $P0
+    exp = shift it
     $S0 = code.'unique'('R')
   iter_loop:
-    unless iter goto iter_end
-    $P1 = shift iter
+    unless it goto iter_end
+    $P1 = shift it
     $S1 = code.'unique'('R')
     exp.'pir'(code, $S0, $S1)
     exp = $P1
@@ -862,7 +862,7 @@
         %L_1:
           $P0 = find_name '%0'
           unless null $P0 goto %L_2
-          say "Unable to find regex '%0'"
+          die "Unable to find regex '%0'"
         %L_2:
         CODE
 
@@ -988,6 +988,7 @@
     .local string token, test
     token = self.'ast'()
 
+    if token == '<?>' goto anchor_null
     if token == '^' goto anchor_bos
     if token == '$' goto anchor_eos
     if token == '^^' goto anchor_bol
@@ -1001,6 +1002,15 @@
     test = '=='
     if token == '\B' goto anchor_word
 
+  anchor_fail:
+    code.'emit'("        %0: # anchor fail %1", label, token)
+    code.'emit'("          goto fail")
+    .return ()
+
+  anchor_null:
+    code.'emit'("        %0: # anchor null %1", label, token)
+    code.'emit'("          goto %0", next)
+    .return ()
 
   anchor_bos:
     code.'emit'("        %0: # anchor bos", label)

Modified: branches/ops_pct/compilers/pge/PGE/Match.pir
==============================================================================
--- branches/ops_pct/compilers/pge/PGE/Match.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/pge/PGE/Match.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -235,10 +235,6 @@
     .return ('')
 .end
 
-.sub 'text' :method
-    .tailcall self.'Str'()
-.end
-
 
 =item C<orig()>
 
@@ -252,23 +248,6 @@
 .end
 
 
-=item C<item()>
-
-Returns the scalar value of this match -- the "result object"
-if there is one, otherwise the substring matched by this match
-object.
-
-=cut
-
-.sub 'item' :method
-    .tailcall self.'ast'()
-.end
-
-.sub 'result_object' :method
-    .param pmc obj
-    .tailcall self.'!make'(obj)
-.end
-
 =item C<!make(pmc obj)>
 
 Sets the "ast object" for the Match invocant.
@@ -320,9 +299,13 @@
     .return ($S0)
   first_key:
     $P0 = self.'hash'()
-    $P1 = new 'Iterator', $P0
+    $P1 = iter $P0
     unless $P1 goto not_found
+  next:
     $S0 = shift $P1
+    $P2 = $P0[$S0]
+    $I0 = isa $P2, 'Capture'
+    unless $I0 goto next
     .return ($S0)
   not_found:
     .return ('')

Modified: branches/ops_pct/compilers/pge/PGE/OPTable.pir
==============================================================================
--- branches/ops_pct/compilers/pge/PGE/OPTable.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/pge/PGE/OPTable.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -110,7 +110,7 @@
     if $I0 goto end
     tokentable[name] = token
 
-    $P0 = new 'Iterator', args
+    $P0 = iter args
   args_loop:
     unless $P0 goto args_end
     $S1 = shift $P0
@@ -239,7 +239,7 @@
     .local pmc ws
     .local string key
     .local pmc token, top, oper
-    .local pmc iter
+    .local pmc it
     .local int tokencat, topcat
     .local int circumnest
     .local pmc cstack
@@ -367,10 +367,10 @@
     if oper goto oper_found
     goto key_next
   key_array:
-    iter = new 'Iterator', token
+    it = iter token
   key_array_1:
-    unless iter goto key_next
-    token = shift iter
+    unless it goto key_next
+    token = shift it
     local_branch cstack, token_match
     if_null oper, key_array_1
     if oper goto oper_found

Modified: branches/ops_pct/compilers/pge/PGE/Perl6Regex.pir
==============================================================================
--- branches/ops_pct/compilers/pge/PGE/Perl6Regex.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/pge/PGE/Perl6Regex.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -324,6 +324,8 @@
     optable.'newtok'('term:\B',  'equiv'=>'term:', 'nows'=>1, 'match'=>'PGE::Exp::Anchor')
     optable.'newtok'('term:<<',  'equiv'=>'term:', 'nows'=>1, 'match'=>'PGE::Exp::Anchor')
     optable.'newtok'('term:>>',  'equiv'=>'term:', 'nows'=>1, 'match'=>'PGE::Exp::Anchor')
+    optable.'newtok'('term:<?>', 'equiv'=>'term:', 'nows'=>1, 'match'=>'PGE::Exp::Anchor')
+    optable.'newtok'('term:<!>', 'equiv'=>'term:', 'nows'=>1, 'match'=>'PGE::Exp::Anchor')
     optable.'newtok'(unicode:"term:\xab", 'equiv'=>'term:', 'nows'=>1, 'match'=>'PGE::Exp::Anchor')
     optable.'newtok'(unicode:"term:\xbb", 'equiv'=>'term:', 'nows'=>1, 'match'=>'PGE::Exp::Anchor')
 
@@ -1244,7 +1246,7 @@
     failsub = mob.'new'(mob, 'grammar'=>'PGE::Exp::Subrule')
     failsub.'to'(pos)
     failsub['subname'] = 'FAILGOAL'
-    $S0 = goal.'text'()
+    $S0 = goal.'Str'()
     failsub['arg'] = $S0
     alt = mob.'new'(mob, 'grammar'=>'PGE::Exp::Alt')
     alt.'to'(pos)
@@ -1665,14 +1667,14 @@
     .tailcall exp1.'perl6exp'(pad)
   with_lhs:
 
-    .local pmc lexscope, savescope, iter
+    .local pmc lexscope, savescope, it
     lexscope = pad['lexscope']
     savescope = new 'Hash'
-    iter = new 'Iterator', lexscope
+    it = iter lexscope
   iter_loop:
-    unless iter goto iter_end
-    $P1 = shift iter
-    $P2 = iter[$P1]
+    unless it goto iter_end
+    $P1 = shift it
+    $P2 = it[$P1]
     savescope[$P1] = $P2
     goto iter_loop
   iter_end:

Modified: branches/ops_pct/compilers/pge/PGE/Regex.pir
==============================================================================
--- branches/ops_pct/compilers/pge/PGE/Regex.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/pge/PGE/Regex.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -59,33 +59,6 @@
 .end
 
 
-=item C<null()>
-
-Match a null string (always returns true on first match).
-
-=cut
-
-.sub "null" :method
-    .local pmc mob
-    .local int pos
-    $P0 = get_hll_global ['PGE'], 'Match'
-    (mob, pos) = $P0.'new'(self)
-    mob.'to'(pos)
-    .return (mob)
-.end
-
-=item C<fail()>
-
-Force a backtrack.  (Taken from A05.)
-
-=cut
-
-.sub "fail" :method
-    $P0 = get_hll_global ['PGE'], 'Match'
-    .tailcall $P0.'new'(self)
-.end
-
-
 =item C<alpha()>
 
 Match a single alphabetic character.
@@ -226,45 +199,6 @@
     .tailcall '!cclass'(self, .CCLASS_ALPHANUMERIC)
 .end
 
-=item C<sp()>
-
-Match a single space character.  (Taken from E05.)
-
-=cut
-
-.sub "sp" :method
-    .tailcall '!literal'(self, ' ')
-.end
-
-=item C<lt()>
-
-Match a single left angle bracket.  (Taken from E05.)
-
-=cut
-
-.sub "lt" :method
-    .tailcall '!literal'(self, '<')
-.end
-
-=item C<gt()>
-
-Match a single right angle bracket. (Taken from E05.)
-
-=cut
-
-.sub "gt" :method
-    .tailcall '!literal'(self, '>')
-.end
-
-=item C<dot()>
-
-Match a single dot ('.').  (Taken from E05.)
-
-=cut
-
-.sub "dot" :method
-    .tailcall '!literal'(self, '.')
-.end
 
 =item C<ws()>
 
@@ -373,7 +307,7 @@
     .local pmc mob, cache, rule
 
     if has_pattern goto lookahead
-    mob = 'fail'(self)
+    mob = '!fail'(self)
     .return (mob)
   lookahead:
     cache = get_global '%!cache'
@@ -422,7 +356,7 @@
 
     mob = self
     if has_pattern goto lookbehind
-    mob = fail(mob)
+    mob = '!fail'(mob)
     .return (mob)
   lookbehind:
     pattern = concat '[', pattern
@@ -483,13 +417,27 @@
 
 =over 4
 
+
+=item C<!fail>
+
+Force a backtrack.  (Taken from A05.)
+
+=cut
+
+.sub "!fail" :anon
+    .param pmc mob
+    $P0 = get_hll_global ['PGE'], 'Match'
+    .tailcall $P0.'new'(mob)
+.end
+
+
 =item C<!cclass(mob, cclass)>
 
 Match according to character class C<cclass>.
 
 =cut
 
-.sub '!cclass'
+.sub '!cclass' :anon
     .param pmc mob
     .param int cclass
 
@@ -510,7 +458,7 @@
 
 =cut
 
-.sub '!literal'
+.sub '!literal' :anon
     .param pmc mob
     .param string literal
     .local string target

Modified: branches/ops_pct/compilers/tge/TGE/Compiler.pir
==============================================================================
--- branches/ops_pct/compilers/tge/TGE/Compiler.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/tge/TGE/Compiler.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -89,12 +89,11 @@
 
     # Iterate over the list of statements, and generate a processed tree for
     # each statement.  Return an array of all the processed statements.
-    .local pmc iter
-    iter = new 'Iterator', node # loop over the array
-    iter = 0 # start at the beginning
+    .local pmc it
+    it = iter node # loop over the array
 loop_start:
-    unless iter goto loop_end
-    $P1 = shift iter
+    unless it goto loop_end
+    $P1 = shift it
     $P2 = tree.'get'('result', $P1, 'statement')
     push statements, $P2
     goto loop_start
@@ -111,14 +110,13 @@
     .param pmc node
     .local pmc result
 
-    .local pmc iter
+    .local pmc it
     $P0 = node.'hash'()
-    iter = new 'Iterator', $P0    # setup iterator for node
-    iter = 0
+    it  = iter $P0    # setup iterator for node
   iter_loop:
-    unless iter, iter_end         # while (entries) ...
-      shift $S1, iter           # get the key of the iterator
-      $P2 = iter[$S1]
+    unless it, iter_end         # while (entries) ...
+      shift $S1, it           # get the key of the iterator
+      $P2 = it[$S1]
 
       result = tree.'get'('result', $P2, $S1)
 
@@ -134,15 +132,14 @@
     .local pmc rule
     rule = new 'Hash'
 
-    .local pmc iter
+    .local pmc it
     $P0 = node.'hash'()
-    iter = new 'Iterator', $P0    # setup iterator for node
-    iter = 0
+    it  = iter $P0    # setup iterator for node
   iter_loop:
-    unless iter, iter_end         # while (entries) ...
+    unless it, iter_end         # while (entries) ...
       $P3 = new 'Undef'
-      shift $S1, iter           # get the key of the iterator
-      $P2 = iter[$S1]
+      shift $S1, it           # get the key of the iterator
+      $P2 = it[$S1]
 
       $P3 = tree.'get'('value', $P2, $S1)
 
@@ -169,15 +166,14 @@
     .local pmc decl
     decl = new 'Hash'
 
-    .local pmc iter
+    .local pmc it
     $P0 = node.'hash'()
-    iter = new 'Iterator', $P0    # setup iterator for node
-    iter = 0
+    it  = iter $P0    # setup iterator for node
   iter_loop:
-    unless iter, iter_end         # while (entries) ...
+    unless it, iter_end         # while (entries) ...
       $P3 = new 'Undef'
-      shift $S1, iter           # get the key of the iterator
-      $P2 = iter[$S1]
+      shift $S1, it           # get the key of the iterator
+      $P2 = it[$S1]
 
       $P3 = tree.'get'('value', $P2, $S1)
 
@@ -296,12 +292,11 @@
 
     # Construct grammar rules from the data structure of rule info
     .local pmc statement
-    .local pmc iter
-    iter = new 'Iterator', rule_data # loop over the rule info
-    iter = 0 # start at the beginning
+    .local pmc it
+    it = iter rule_data # loop over the rule info
 loop_start:
-    unless iter goto loop_end
-        statement = shift iter
+    unless it goto loop_end
+        statement = shift it
         $S0 = statement['build']
       unless $S0 == 'rule' goto grammar_build
           $S1 = self.'rule_string'(statement)

Modified: branches/ops_pct/compilers/tge/TGE/Grammar.pir
==============================================================================
--- branches/ops_pct/compilers/tge/TGE/Grammar.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/tge/TGE/Grammar.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -140,7 +140,7 @@
 
 .sub 'symbol_iter' :method
     $P1 = getattribute self, 'symbols'
-    $P2 = new 'Iterator', $P1
+    $P2 = iter $P1
 
     .return($P2)
 .end

Modified: branches/ops_pct/compilers/tge/tgc.pir
==============================================================================
--- branches/ops_pct/compilers/tge/tgc.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/compilers/tge/tgc.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -89,6 +89,12 @@
     .local string compiled_source
     compiled_source = grammar.'precompile'(source, infile)
     print outfh, compiled_source
+    unless ck_output goto END
+
+    # Close the output file and check result
+    $I0 = outfh.'close'()
+    unless $I0 goto END
+    die 'Error: close output failed'
 
   goto END
 

Deleted: branches/ops_pct/config/auto/fink.pm
==============================================================================
--- branches/ops_pct/config/auto/fink.pm	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,107 +0,0 @@
-# Copyright (C) 2005-2007, Parrot Foundation.
-# $Id$
-
-=head1 NAME
-
-config/auto/fink.pm - Determine Fink location on Darwin
-
-=head1 DESCRIPTION
-
-If the operating system is Darwin, this class determines whether and where
-Fink is installed.
-
-=cut
-
-package auto::fink;
-
-use strict;
-use warnings;
-
-use base qw(Parrot::Configure::Step);
-
-use Parrot::Configure::Utils ':auto';
-use Parrot::BuildUtil;
-
-
-sub _init {
-    my $self = shift;
-    my %data;
-    $data{description} = q{Determine Fink location on Darwin};
-    $data{result}      = q{};
-    # Per fink(8), this is location for Fink configuration file, presumably
-    # regardless of where Fink itself is installed.
-    $data{fink_conf}    = q{/sw/etc/fink.conf};
-    return \%data;
-}
-
-sub runstep {
-    my ( $self, $conf ) = ( shift, shift );
-    my $osname = $conf->data->get_p5( 'OSNAME' );
-    my $verbose = $conf->options->get( 'verbose' );
-    unless ($osname =~ /darwin/) {
-        print "Operating system is $osname; Fink is Darwin only\n"
-            if $verbose;
-        $self->set_result('skipped');
-        return 1;
-    }
-    # Per fink(8), this is location for Fink configuration file, presumably
-    # regardless of where Fink itself is installed.
-    my $fink_conf = $self->{fink_conf};
-    unless (-f $fink_conf) {
-        print "Fink configuration file not located\n"
-            if $verbose;
-        $self->set_result('Fink not installed');
-        return 1;
-    }
-    my $fink_conf_str = Parrot::BuildUtil::slurp_file($fink_conf);
-    my @lines = split /\n/, $fink_conf_str;
-    my $fink_base_dir;
-    while (defined (my $l = shift @lines) ) {
-        chomp $l;
-        next unless $l =~ /^Basepath:\s(.*)/;
-        $fink_base_dir = $1;
-        last;
-    }
-    unless (defined $fink_base_dir) {
-        print "Fink configuration file defective:  no 'Basepath'\n"
-            if $verbose;
-        $self->set_result('failed');
-        return;
-    }
-    my $fink_lib_dir = qq{$fink_base_dir/lib};
-    my $fink_include_dir = qq{$fink_base_dir/include};
-    my @unlocateables;
-    foreach my $dir ($fink_base_dir, $fink_lib_dir, $fink_include_dir) {
-        push @unlocateables, $dir unless (-d $dir);
-    }
-    if (@unlocateables) {
-        print "Could not locate Fink directories:  @unlocateables\n"
-            if $verbose;
-        $self->set_result('failed');
-        return;
-    }
-    else {
-        $conf->data->set(
-            fink_base_dir       => $fink_base_dir,
-            fink_lib_dir        => $fink_lib_dir,
-            fink_include_dir    => $fink_include_dir,
-        );
-        $self->set_result('Fink located');
-        return 1;
-    }
-}
-
-1;
-
-=head1 AUTHOR
-
-James E Keenan
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Modified: branches/ops_pct/config/auto/gc.pm
==============================================================================
--- branches/ops_pct/config/auto/gc.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/auto/gc.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -7,16 +7,15 @@
 
 =head1 DESCRIPTION
 
-Checks whether the C<--gc> command-line option was passed to F<Configure.pl>
-and sets the memory allocator accordingly.
+Sets memory allocator.
 
-Eventually, C<--gc> will be able to take any of the following values:
+Currently, we have only one choice:  the memory allocator in
+F<src/gc/alloc_resources.c>.
 
-=over
+In the future, we will have a C<--gc> command-line option which will enable
+the configurer to choose among the default and:
 
-=item C<gc>
-
-The default. Use the memory allocator in F<src/resources.c>.
+=over 4
 
 =item C<libc>
 
@@ -25,19 +24,17 @@
 
 =item C<malloc>
 
-Use the malloc in F<src/malloc.c> along with F<src/gc/res_lea.c>.
+Use the malloc in F<src/gc/malloc.c> along with F<src/gc/res_lea.c>.
 Since this uses res_lea.c, it doesn't currently work either.  See [perl #42774].
 
 =item C<malloc-trace>
 
-Use the malloc in F<src/malloc-trace.c> with tracing enabled, along
+Use the malloc in F<src/gc/malloc-trace.c> with tracing enabled, along
 with F<src/gc/res_lea.c>.
 Since this uses res_lea.c, it doesn't work currently either.  See [perl #42774].
 
 =back
 
-So, for the time being, only the default value works.
-
 =cut
 
 package auto::gc;
@@ -49,8 +46,6 @@
 
 use Parrot::Configure::Utils ':auto';
 
-
-# valid libc/malloc/malloc-trace/gc
 sub _init {
     my $self = shift;
     my %data;
@@ -62,47 +57,15 @@
 sub runstep {
     my ( $self, $conf ) = @_;
 
-    my $gc = $conf->options->get('gc');
+    my $gc = 'gc';
 
-    # default is GC in alloc_resources.c
-    $gc = 'gc' unless defined $gc;
-
-    if ( $gc =~ /^malloc(?:-trace)?$/ ) {
-        $conf->data->set(
-            TEMP_gc_c => <<"EOF",
-\$(SRC_DIR)/$gc\$(O):	\$(GENERAL_H_FILES) \$(SRC_DIR)/$gc.c
-\$(SRC_DIR)/gc/res_lea\$(O):	\$(GENERAL_H_FILES) \$(SRC_DIR)/gc/res_lea.c
-EOF
-            TEMP_gc_o => "\$(SRC_DIR)\/$gc\$(O) \$(SRC_DIR)/gc/res_lea\$(O)",
-            gc_flag   => '-DGC_IS_MALLOC',
-        );
-    }
-    elsif ( $gc eq 'libc' ) {
-        $conf->data->set(
-            TEMP_gc_c => <<"EOF",
-\$(SRC_DIR)/gc/res_lea\$(O):	\$(GENERAL_H_FILES) \$(SRC_DIR)/gc/res_lea.c
-EOF
-            TEMP_gc_o => "\$(SRC_DIR)/gc/res_lea\$(O)",
-            gc_flag   => '-DGC_IS_MALLOC',
-        );
-        # tests mallinfo after allocation of 128 bytes
-        if ( $conf->data->get('i_malloc') ) {
-            $conf->data->set( malloc_header => 'malloc.h' );
-        }
-        else {
-            $conf->data->set( malloc_header => 'stdlib.h' );
-        }
-    }
-    else {
-        $gc = 'gc';
-        $conf->data->set(
-            TEMP_gc_c => <<"EOF",
+    $conf->data->set(
+        TEMP_gc_c => <<"EOF",
 \$(SRC_DIR)/gc/alloc_resources\$(O):	\$(GENERAL_H_FILES) \$(SRC_DIR)/gc/alloc_resources.c
 EOF
-            TEMP_gc_o => "\$(SRC_DIR)/gc/alloc_resources\$(O)",
-            gc_flag   => '',
-        );
-    }
+        TEMP_gc_o => "\$(SRC_DIR)/gc/alloc_resources\$(O)",
+        gc_flag   => '',
+    );
     print(" ($gc) ") if $conf->options->get('verbose');
 
     return 1;

Modified: branches/ops_pct/config/auto/gdbm.pm
==============================================================================
--- branches/ops_pct/config/auto/gdbm.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/auto/gdbm.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -61,10 +61,6 @@
         default         => '-lgdbm',
     } );
 
-    # On OS X check the presence of the gdbm header in the standard
-    # Fink location.
-    $self->_handle_darwin_for_fink($conf, $osname, 'gdbm.h');
-
     $conf->cc_gen('config/auto/gdbm/gdbm_c.in');
     eval { $conf->cc_build( q{}, $extra_libs ); };
     my $has_gdbm = 0;

Modified: branches/ops_pct/config/auto/gettext.pm
==============================================================================
--- branches/ops_pct/config/auto/gettext.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/auto/gettext.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -61,10 +61,6 @@
         default         => defined $conf->data->get('glibc') ? '' : '-lintl',
     } );
 
-    # On OS X check the presence of the gettext header in the standard
-    # Fink location.
-    $self->_handle_darwin_for_fink($conf, $osname, 'libintl.h');
-
     $conf->cc_gen('config/auto/gettext/gettext_c.in');
     eval { $conf->cc_build( q{}, $extra_libs ); };
     my $has_gettext = 0;

Modified: branches/ops_pct/config/auto/gmp.pm
==============================================================================
--- branches/ops_pct/config/auto/gmp.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/auto/gmp.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -66,11 +66,6 @@
         default         => '-lgmp',
     } );
 
-    # On OS X check the presence of the gmp header in the standard
-    # Fink location.
-    $self->_handle_darwin_for_fink($conf, $osname, 'gmp.h');
-    $self->_handle_darwin_for_macports($conf, $osname, 'gmp.h');
-
     $conf->cc_gen('config/auto/gmp/gmp_c.in');
     eval { $conf->cc_build( q{}, $extra_libs); };
     my $has_gmp = 0;

Deleted: branches/ops_pct/config/auto/macports.pm
==============================================================================
--- branches/ops_pct/config/auto/macports.pm	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,104 +0,0 @@
-# Copyright (C) 2005-2007, Parrot Foundation.
-# $Id$
-
-=head1 NAME
-
-config/auto/macports.pm - Determine Macports location on Darwin
-
-=head1 DESCRIPTION
-
-If the operating system is Darwin, this class determines whether or not
-Macports is installed in the default location.
-
-B<Note:>  No provision is yet made for Macports installation in non-default
-locations.
-
-B<Note:>  This step is currently Darwin/Macports-specific because it
-consolidates code previously found in multiple configuration step classes.
-With some modification it may be suitable for application to BSD F<ports>
-programs in general, but as there was no BSD-specific code in the
-configuration step classes, that modification has not yet been made.
-
-=cut
-
-package auto::macports;
-
-use strict;
-use warnings;
-
-use File::Spec;
-use base qw(Parrot::Configure::Step);
-
-use Parrot::Configure::Utils ':auto';
-use Parrot::BuildUtil;
-
-sub _init {
-    my $self = shift;
-    my %data;
-    $data{description} = q{Determine Macports location on Darwin};
-    $data{result}      = q{};
-    my $optlocal = File::Spec->catdir( '/', 'opt', 'local' );
-    $data{ports_root} = (defined $ENV{TEST_MACPORTS})
-        ? $ENV{TEST_MACPORTS}
-        : (-d $optlocal)
-            ? $optlocal
-            : undef;
-    return \%data;
-}
-
-sub runstep {
-    my ( $self, $conf ) = ( shift, shift );
-    my $osname = $conf->data->get_p5( 'OSNAME' );
-    my $verbose = $conf->options->get( 'verbose' );
-    unless ($osname =~ /darwin/) {
-        print "Operating system is $osname; Macports is Darwin only\n"
-            if $verbose;
-        $self->set_result('skipped');
-        return 1;
-    }
-    if (! defined $self->{ports_root}) {
-        print "Could not locate Macports root directory\n"
-            if $verbose;
-        $self->set_result('no');
-        return 1;
-    }
-
-    my $ports_base_dir = $self->{ports_root};
-    my $ports_lib_dir = qq{$ports_base_dir/lib};
-    my $ports_include_dir = qq{$ports_base_dir/include};
-    my @unlocateables;
-    foreach my $dir ($ports_base_dir, $ports_lib_dir, $ports_include_dir) {
-        push @unlocateables, $dir unless (-d $dir);
-    }
-    if (@unlocateables) {
-        print "Could not locate Macports directories:  @unlocateables\n"
-            if $verbose;
-        $self->set_result('no');
-        return 1;
-    }
-    else {
-        $conf->data->set(
-            ports_base_dir       => $ports_base_dir,
-            ports_lib_dir        => $ports_lib_dir,
-            ports_include_dir    => $ports_include_dir,
-        );
-        $self->set_result('yes');
-        return 1;
-    }
-}
-
-1;
-
-=head1 AUTHOR
-
-James E Keenan, consolidating code written by Alberto SimÃes, Leopold Toetsch
-and others.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Modified: branches/ops_pct/config/auto/msvc.pm
==============================================================================
--- branches/ops_pct/config/auto/msvc.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/auto/msvc.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -90,6 +90,13 @@
         # To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help
         # for details.
         $conf->data->add( " ", "ccflags", "-D_CRT_SECURE_NO_DEPRECATE" );
+
+        # Microsoft provides two annotations mechanisms.  __declspec, which has been
+        # around for a while, and Microsoft's standard source code annotation
+        # language (SAL), introduced with Visual C++ 8.0.
+        # See <http://msdn2.microsoft.com/en-us/library/ms235402(VS.80).aspx>,
+        # <http://msdn2.microsoft.com/en-us/library/dabb5z75(VS.80).aspx>.
+        $conf->data->set( HAS_MSVC_SAL => 1 );
     }
     return 1;
 }

Modified: branches/ops_pct/config/auto/opengl.pm
==============================================================================
--- branches/ops_pct/config/auto/opengl.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/auto/opengl.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -179,12 +179,6 @@
             default         => '-lglut -lGLU -lGL',
     } );
 
-    # On OS X check the presence of the OpenGL headers in the standard
-    # Fink/macports locations.
-    # Mindlessly morphed from readline ... may need to be fixed
-    $self->_handle_darwin_for_fink    ($conf, $osname, 'GL/glut.h');
-    $self->_handle_darwin_for_macports($conf, $osname, 'GL/glut.h');
-
     $conf->cc_gen('config/auto/opengl/opengl_c.in');
     my $has_glut = 0;
     eval { $conf->cc_build( q{}, $extra_libs ) };

Modified: branches/ops_pct/config/auto/pcre.pm
==============================================================================
--- branches/ops_pct/config/auto/pcre.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/auto/pcre.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -56,11 +56,6 @@
         default         => '-lpcre',
     } );
 
-    # On OS X check the presence of the pcre headers in the standard
-    # Fink/macports locations.
-    $self->_handle_darwin_for_fink    ($conf, $osname, 'pcre.h');
-    $self->_handle_darwin_for_macports($conf, $osname, 'pcre.h');
-
     $conf->cc_gen('config/auto/pcre/pcre_c.in');
     eval { $conf->cc_build( q{}, $extra_libs ) };
     my $has_pcre = 0;

Modified: branches/ops_pct/config/auto/readline.pm
==============================================================================
--- branches/ops_pct/config/auto/readline.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/auto/readline.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -49,11 +49,6 @@
         default         => '-lreadline',
     } );
 
-    # On OS X check the presence of the readline header in the standard
-    # Fink/macports locations.
-    $self->_handle_darwin_for_fink($conf, $osname, 'readline/readline.h');
-    $self->_handle_darwin_for_macports($conf, $osname, q{readline/readline.h});
-
     $conf->cc_gen('config/auto/readline/readline_c.in');
     my $has_readline = 0;
     eval { $conf->cc_build( q{}, $extra_libs ) };

Copied: branches/ops_pct/config/auto/thread.pm (from r40255, trunk/config/auto/thread.pm)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/config/auto/thread.pm	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/config/auto/thread.pm)
@@ -0,0 +1,67 @@
+# Copyright (C) 2009, Parrot Foundation.
+# $Id$
+
+=head1 NAME
+
+config/auto/thread.pm - Thread support
+
+=head1 DESCRIPTION
+
+Determining if the system has a Thread support.
+
+=cut
+
+package auto::thread;
+
+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{Does your system has thread};
+    $data{result}      = q{};
+    return \%data;
+}
+
+sub runstep {
+    my ( $self, $conf ) = @_;
+
+    my ( $verbose, $without ) = $conf->options->get(
+        qw|
+            verbose
+            without-threads
+        |
+    );
+
+    if ($without) {
+        $conf->data->set( HAS_THREADS => 0 );
+        $self->set_result('no');
+        return 1;
+    }
+
+    if ($conf->data->get_p5('OSNAME') eq 'MSWin32'
+     || $conf->data->get('i_pthread') eq 'define') {
+        $conf->data->set( HAS_THREADS => 1 );
+        $self->set_result('yes');
+    }
+    else {
+        $conf->data->set( HAS_THREADS => 0 );
+        $self->set_result('no');
+    }
+
+    return 1;
+}
+
+1;
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Modified: branches/ops_pct/config/gen/call_list/misc.in
==============================================================================
--- branches/ops_pct/config/gen/call_list/misc.in	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/call_list/misc.in	Fri Jul 24 19:42:02 2009	(r40257)
@@ -227,6 +227,8 @@
 v    pip
 p    pti
 i    ppp
+# added by RNH for the RenderXXX_XXXX text routines 
+p    ptii
 
 # Used by SDL::Font
 p    ti

Modified: branches/ops_pct/config/gen/config_h.pm
==============================================================================
--- branches/ops_pct/config/gen/config_h.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/config_h.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -30,8 +30,9 @@
     $data{description} = q{Generate C headers};
     $data{result}      = q{};
     $data{templates}    = {
-        config_h    => 'config/gen/config_h/config_h.in',
-        feature_h   => 'config/gen/config_h/feature_h.in',
+        config_h        => 'config/gen/config_h/config_h.in',
+        feature_h       => 'config/gen/config_h/feature_h.in',
+        has_header_h    => 'config/gen/config_h/has_header_h.in',
     };
     return \%data;
 }
@@ -49,107 +50,34 @@
         feature_file   => 1
     );
 
-    my $hh = "include/parrot/has_header.h";
-    $conf->append_configure_log($hh);
-    open( my $HH, ">", "$hh.tmp" )
-        or die "Can't open has_header.h: $!";
-
-    print {$HH} <<EOF;
-/*
-** !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
-**
-** This file is generated automatically by Configure.pl
-*/
-
-#ifndef PARROT_HAS_HEADER_H_GUARD
-#define PARROT_HAS_HEADER_H_GUARD
-
-/*
- * i_(\\w+) header includes
- */
-
-EOF
-
-    for ( sort( $conf->data->keys() ) ) {
-        next unless /i_(\w+)/;
-        if ( $conf->data->get($_) ) {
-            print {$HH} "#define PARROT_HAS_HEADER_\U$1 1\n";
-        }
-        else {
-            print {$HH} "#undef  PARROT_HAS_HEADER_\U$1\n";
-        }
-    }
-
-    my $osname = $conf->data->get_p5('OSNAME');
-    print {$HH} "\n#define BUILD_OS_NAME \"$osname\"\n";
-
-    _handle_define_option($conf, $HH);
-
-    print {$HH} <<EOF;
-
-/*
- * HAS_(\\w+) config entries
- */
-
-EOF
-    for ( sort( $conf->data->keys() ) ) {
-        next unless /HAS_(\w+)/;
-        if ( $conf->data->get($_) ) {
-            print {$HH} "#define PARROT_HAS_\U$1 1\n";
-        }
-    }
-    print {$HH} <<EOF;
-
-/*
- * D_(\\w+) config entries
- */
-
-EOF
-    for ( sort( $conf->data->keys() ) ) {
-        next unless /D_(\w+)/;
-        my $val;
-        if ( $val = $conf->data->get($_) ) {
-            print {$HH} "#define PARROT_\U$1 $val\n";
-        }
-    }
-
-    # append the guard endif and C code coda
-    print {$HH} <<EOF;
-
-#endif /* PARROT_HAS_HEADER_H_GUARD */
-
-/*
- * Local variables:
- *   c-file-style: "parrot"
- * End:
- * vim: expandtab shiftwidth=4:
- */
-EOF
+    $conf->data->set( TEMP_header =>
+        join "\n", map { $conf->data->get($_)
+                       ? "#define PARROT_HAS_HEADER_" . uc(substr $_, 2) . " 1"
+                       : "#undef  PARROT_HAS_HEADER_" . uc(substr $_, 2) }
+                   grep { /^i_\w+/ }
+                   sort $conf->data->keys()
+    );
 
-    close $HH;
+    $conf->data->set( TEMP_has_config =>
+        join "\n", map { "#define PARROT_" . uc($_) . " 1" }
+                   grep { /^HAS_\w+/ && $conf->data->get($_) }
+                   sort $conf->data->keys()
+    );
 
-    move_if_diff( "$hh.tmp", $hh );
+    $conf->data->set( TEMP_d_config =>
+        join "\n", map { "#define PARROT_" . uc(substr $_, 2) . " " . $conf->data->get($_) }
+                   grep { /^D_\w+/ }
+                   sort $conf->data->keys()
+    );
 
-    return 1;
-}
+    $conf->data->set( TEMP_cli_define =>
+        join "\n", map { "#define PARROT_DEF_" . uc($_) . " 1" }
+                   split /,/, $conf->options->get('define') || ''
+    );
 
-sub _handle_define_option {
-    my ($conf, $HH) = @_;
-    my $define = $conf->options->get('define');
-
-    if ($define) {
-        my @vals = split /,/, $define;
-        print {$HH} <<EOF;
-
-/*
- * defines from commandline
- */
-
-EOF
-        for my $v (@vals) {
-            print {$HH} "#define PARROT_DEF_" . uc($v), " 1\n";
-        }
-    }
+    $conf->genfile($self->{templates}->{has_header_h}, 'include/parrot/has_header.h');
+
+    return 1;
 }
 
 1;

Copied: branches/ops_pct/config/gen/config_h/has_header_h.in (from r40255, trunk/config/gen/config_h/has_header_h.in)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/config/gen/config_h/has_header_h.in	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/config/gen/config_h/has_header_h.in)
@@ -0,0 +1,41 @@
+/* Copyright (C) 2009, Parrot Foundation.
+ * $Id$
+ */
+
+#ifndef PARROT_HAS_HEADER_H_GUARD
+#define PARROT_HAS_HEADER_H_GUARD
+
+/*
+ * i_\w+ header includes
+ */
+
+ at TEMP_header@
+
+#define BUILD_OS_NAME "@osname@"
+
+/*
+ * defines from commandline
+ */
+
+ at TEMP_cli_define@
+
+/*
+ * HAS_\w+ config entries
+ */
+
+ at TEMP_has_config@
+
+/*
+ * D_\w+ config entries
+ */
+
+ at TEMP_d_config@
+
+#endif /* PARROT_HAS_HEADER_H_GUARD */
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Modified: branches/ops_pct/config/gen/config_pm/config_lib_pasm.in
==============================================================================
--- branches/ops_pct/config/gen/config_pm/config_lib_pasm.in	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/config_pm/config_lib_pasm.in	Fri Jul 24 19:42:02 2009	(r40257)
@@ -18,7 +18,12 @@
     if I11, is_install
     set S1, "@PWD@"
     set P0["prefix"], S1
+    set P0["installed"], "0"
+    branch freeze_config
 is_install:
+    set P0["installed"], "1"
+freeze_config:
+
     freeze S0, P0
     print S0
     end

Modified: branches/ops_pct/config/gen/config_pm/config_pir.in
==============================================================================
--- branches/ops_pct/config/gen/config_pm/config_pir.in	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/config_pm/config_pir.in	Fri Jul 24 19:42:02 2009	(r40257)
@@ -49,7 +49,7 @@
     $S0 = concat prefix, "/runtime"
     $I0 = stat $S0, .STAT_EXISTS
     if $I0 goto L1
-    conf_file = prefix . "/lib at versiondir@/include/config.fpmc"
+    conf_file = "@libdir@@versiondir@/include/config.fpmc"
     goto L2
   L1:
     conf_file = prefix . "/runtime/parrot/include/config.fpmc"

Modified: branches/ops_pct/config/gen/makefiles/dynoplibs.in
==============================================================================
--- branches/ops_pct/config/gen/makefiles/dynoplibs.in	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/makefiles/dynoplibs.in	Fri Jul 24 19:42:02 2009	(r40257)
@@ -10,13 +10,11 @@
 RECONFIGURE   := $(PERL) $(BUILD_DIR)/tools/dev/reconfigure.pl
 INSTALL_DIR   := $(BUILD_DIR)/runtime/parrot/dynext
 O             := @o@
-CC            := @cc@ -c
+CC            := @cc@
 LD            := @ld@
 LDFLAGS       := @ldflags@ @ld_debug@ @rpath_blib@ @linkflags@
 LD_LOAD_FLAGS := @ld_load_flags@
 CFLAGS        := @ccflags@ @cc_shared@ @cc_debug@ @ccwarn@ @cc_hasjit@ @cg_flag@ @gc_flag@
-CC_OUT        := @cc_o_out@
-LD_OUT        := @ld_out@
 LIBPARROT     := @libparrot_ldflags@
 
 BUILD_TOOLS_DIR := $(BUILD_DIR)@slash at tools@slash at build
@@ -25,10 +23,10 @@
 LINKARGS        := $(LDFLAGS) $(LD_LOAD_FLAGS) $(LIBPARROT) @icu_shared@ @libs@
 
 OPS_TARGETS := \
-#IF(cg_flag):  myops_ops_cg$(LOAD_EXT) \
-#IF(cg_flag):  myops_ops_cgp$(LOAD_EXT) \
-  myops_ops$(LOAD_EXT) \
-  myops_ops_switch$(LOAD_EXT)
+#IF(cg_flag):  obscure_ops_cg$(LOAD_EXT) \
+#IF(cg_flag):  obscure_ops_cgp$(LOAD_EXT) \
+  obscure_ops$(LOAD_EXT) \
+  obscure_ops_switch$(LOAD_EXT)
 
 CLEANUPS := \
   "*.c" \
@@ -51,41 +49,41 @@
 Makefile: ../../config/gen/makefiles/dynoplibs.in
 	cd $(BUILD_DIR) && $(RECONFIGURE) --step=gen::makefiles --target=src/dynoplibs/Makefile
 
-myops_ops$(LOAD_EXT): myops_ops$(O)
-	$(LD) $(LD_OUT)myops_ops$(LOAD_EXT) myops_ops$(O) $(LINKARGS)
+obscure_ops$(LOAD_EXT): obscure_ops$(O)
+	$(LD) @ld_out at obscure_ops$(LOAD_EXT) obscure_ops$(O) $(LINKARGS)
 
-myops_ops$(O): myops_ops.c
-	$(CC) $(CC_OUT)myops_ops$(O) $(INCLUDES) $(CFLAGS) myops_ops.c
+obscure_ops$(O): obscure_ops.c
+	$(CC) -c @cc_o_out at obscure_ops$(O) $(INCLUDES) $(CFLAGS) obscure_ops.c
 
-myops_ops.c: myops.ops
-	$(OPS2C) C --dynamic myops.ops
+obscure_ops.c: obscure.ops
+	$(OPS2C) C --dynamic obscure.ops
 
-myops_ops_switch$(LOAD_EXT): myops_ops_switch$(O)
-	$(LD) $(LD_OUT)myops_ops_switch$(LOAD_EXT) myops_ops_switch$(O) $(LINKARGS)
+obscure_ops_switch$(LOAD_EXT): obscure_ops_switch$(O)
+	$(LD) @ld_out at obscure_ops_switch$(LOAD_EXT) obscure_ops_switch$(O) $(LINKARGS)
 
-myops_ops_switch$(O): myops_ops_switch.c
-	$(CC) $(CC_OUT)myops_ops_switch$(O) $(INCLUDES) $(CFLAGS) myops_ops_switch.c
+obscure_ops_switch$(O): obscure_ops_switch.c
+	$(CC) -c @cc_o_out at obscure_ops_switch$(O) $(INCLUDES) $(CFLAGS) obscure_ops_switch.c
 
-myops_ops_switch.c: myops.ops
-	$(OPS2C) CSwitch --dynamic myops.ops
+obscure_ops_switch.c: obscure.ops
+	$(OPS2C) CSwitch --dynamic obscure.ops
 
-myops_ops_cg$(LOAD_EXT): myops_ops_cg$(O)
-	$(LD) $(LD_OUT)myops_ops_cg$(LOAD_EXT) myops_ops_cg$(O) $(LINKARGS)
+obscure_ops_cg$(LOAD_EXT): obscure_ops_cg$(O)
+	$(LD) @ld_out at obscure_ops_cg$(LOAD_EXT) obscure_ops_cg$(O) $(LINKARGS)
 
-myops_ops_cg$(O): myops_ops_cg.c
-	$(CC) $(CC_OUT)myops_ops_cg$(O) $(INCLUDES) $(CFLAGS) myops_ops_cg.c
+obscure_ops_cg$(O): obscure_ops_cg.c
+	$(CC) -c @cc_o_out at obscure_ops_cg$(O) $(INCLUDES) $(CFLAGS) obscure_ops_cg.c
 
-myops_ops_cg.c: myops.ops
-	$(OPS2C) CGoto --dynamic myops.ops
+obscure_ops_cg.c: obscure.ops
+	$(OPS2C) CGoto --dynamic obscure.ops
 
-myops_ops_cgp$(LOAD_EXT): myops_ops_cgp$(O)
-	$(LD) $(LD_OUT)myops_ops_cgp$(LOAD_EXT) myops_ops_cgp$(O) $(LINKARGS)
+obscure_ops_cgp$(LOAD_EXT): obscure_ops_cgp$(O)
+	$(LD) @ld_out at obscure_ops_cgp$(LOAD_EXT) obscure_ops_cgp$(O) $(LINKARGS)
 
-myops_ops_cgp$(O): myops_ops_cgp.c
-	$(CC) $(CC_OUT)myops_ops_cgp$(O) $(INCLUDES) $(CFLAGS) myops_ops_cgp.c
+obscure_ops_cgp$(O): obscure_ops_cgp.c
+	$(CC) -c @cc_o_out at obscure_ops_cgp$(O) $(INCLUDES) $(CFLAGS) obscure_ops_cgp.c
 
-myops_ops_cgp.c: myops.ops
-	$(OPS2C) CGP --dynamic myops.ops
+obscure_ops_cgp.c: obscure.ops
+	$(OPS2C) CGP --dynamic obscure.ops
 
 test : all
 	cd ../.. && $(PERL) -Ilib t/harness t/dynoplibs/*.t

Modified: branches/ops_pct/config/gen/makefiles/dynpmc.in
==============================================================================
--- branches/ops_pct/config/gen/makefiles/dynpmc.in	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/makefiles/dynpmc.in	Fri Jul 24 19:42:02 2009	(r40257)
@@ -10,13 +10,11 @@
 RECONFIGURE   := $(PERL) $(BUILD_DIR)/tools/dev/reconfigure.pl
 INSTALL_DIR   := $(BUILD_DIR)@slash at runtime@slash at parrot@slash at dynext
 O             := @o@
-CC            := @cc@ -c
+CC            := @cc@
 LD            := @ld@
 LDFLAGS       := @ldflags@ @ld_debug@ @rpath_blib@
 LD_LOAD_FLAGS := @ld_load_flags@
 CFLAGS        := @ccflags@ @cc_shared@ @cc_debug@ @ccwarn@ @cc_hasjit@ @cg_flag@ @gc_flag@
-CC_OUT        := @cc_o_out@
-LD_OUT        := @ld_out@
 LIBPARROT     := @libparrot_ldflags@
 
 BUILD_TOOLS_DIR := $(BUILD_DIR)@slash at tools@slash at build
@@ -32,7 +30,6 @@
 PMC_TARGETS := \
   dynlexpad$(LOAD_EXT) \
   foo$(LOAD_EXT) \
-  pair$(LOAD_EXT) \
   rotest$(LOAD_EXT) \
 #IF(has_gdbm):  gdbmhash$(LOAD_EXT) \
   rational$(LOAD_EXT) \
@@ -67,10 +64,6 @@
 #ELSIF(win32):LIB_CRYPTO := libcrypto.lib
 #ELSE:LIB_CRYPTO := -lcrypto
 
-# some *.pmc file are generated
-GEN_PMC_DEFINITIONS := \
-#IF(has_crypto):  $(PMCS_DIGEST)
-
 CLEANUPS := \
   "*.c" \
   "pmc_*.h" \
@@ -97,10 +90,10 @@
 	cd $(BUILD_DIR) && $(RECONFIGURE) --step=gen::makefiles --target=src/dynpmc/Makefile
 
 dynlexpad$(LOAD_EXT): dynlexpad$(O)
-	$(LD) $(LD_OUT)dynlexpad$(LOAD_EXT) dynlexpad$(O) $(LINKARGS)
+	$(LD) @ld_out at dynlexpad$(LOAD_EXT) dynlexpad$(O) $(LINKARGS)
 
 dynlexpad$(O): dynlexpad.c
-	$(CC) $(CC_OUT)dynlexpad$(O) $(INCLUDES) $(CFLAGS) dynlexpad.c
+	$(CC) -c @cc_o_out at dynlexpad$(O) $(INCLUDES) $(CFLAGS) dynlexpad.c
 
 dynlexpad.c: dynlexpad.dump
 	$(PMC2CC) dynlexpad.pmc
@@ -109,10 +102,10 @@
 	$(PMC2CD) dynlexpad.pmc
 
 foo$(LOAD_EXT): foo$(O)
-	$(LD) $(LD_OUT)foo$(LOAD_EXT) foo$(O) $(LINKARGS)
+	$(LD) @ld_out at foo$(LOAD_EXT) foo$(O) $(LINKARGS)
 
 foo$(O): foo.c
-	$(CC) $(CC_OUT)foo$(O) $(INCLUDES) $(CFLAGS) foo.c
+	$(CC) -c @cc_o_out at foo$(O) $(INCLUDES) $(CFLAGS) foo.c
 
 foo.c: foo.dump
 	$(PMC2CC) foo.pmc
@@ -120,23 +113,11 @@
 foo.dump: foo.pmc
 	$(PMC2CD) foo.pmc
 
-pair$(LOAD_EXT): pair$(O)
-	$(LD) $(LD_OUT)pair$(LOAD_EXT) pair$(O) $(LINKARGS)
-
-pair$(O): pair.c
-	$(CC) $(CC_OUT)pair$(O) $(INCLUDES) $(CFLAGS) pair.c
-
-pair.c: pair.dump
-	$(PMC2CC) pair.pmc
-
-pair.dump: pair.pmc
-	$(PMC2CD) pair.pmc
-
 rotest$(LOAD_EXT): rotest$(O)
-	$(LD) $(LD_OUT)rotest$(LOAD_EXT) rotest$(O) $(LINKARGS)
+	$(LD) @ld_out at rotest$(LOAD_EXT) rotest$(O) $(LINKARGS)
 
 rotest$(O): rotest.c
-	$(CC) $(CC_OUT)rotest$(O) $(INCLUDES) $(CFLAGS) rotest.c
+	$(CC) -c @cc_o_out at rotest$(O) $(INCLUDES) $(CFLAGS) rotest.c
 
 rotest.c: rotest.dump
 	$(PMC2CC) rotest.pmc
@@ -145,10 +126,10 @@
 	$(PMC2CD) rotest.pmc
 
 gdbmhash$(LOAD_EXT): gdbmhash$(O)
-	$(LD) $(LD_OUT)gdbmhash$(LOAD_EXT) gdbmhash$(O) $(LINKARGS) $(LIB_GDBM)
+	$(LD) @ld_out at gdbmhash$(LOAD_EXT) gdbmhash$(O) $(LINKARGS) $(LIB_GDBM)
 
 gdbmhash$(O): gdbmhash.c
-	$(CC) $(CC_OUT)gdbmhash$(O) $(INCLUDES) $(CFLAGS) gdbmhash.c
+	$(CC) -c @cc_o_out at gdbmhash$(O) $(INCLUDES) $(CFLAGS) gdbmhash.c
 
 gdbmhash.c: gdbmhash.dump
 	$(PMC2CC) gdbmhash.pmc
@@ -157,10 +138,10 @@
 	$(PMC2CD) gdbmhash.pmc
 
 rational$(LOAD_EXT): rational$(O)
-	$(LD) $(LD_OUT)rational$(LOAD_EXT) rational$(O) $(LINKARGS)
+	$(LD) @ld_out at rational$(LOAD_EXT) rational$(O) $(LINKARGS)
 
 rational$(O): rational.c
-	$(CC) $(CC_OUT)rational$(O) $(INCLUDES) $(CFLAGS) rational.c
+	$(CC) -c @cc_o_out at rational$(O) $(INCLUDES) $(CFLAGS) rational.c
 
 rational.c: rational.dump
 	$(PMC2CC) rational.pmc
@@ -169,16 +150,16 @@
 	$(PMC2CD) rational.pmc
 
 digest_group$(LOAD_EXT): $(OBJS_DIGEST) lib-digest_group$(O)
-	$(LD) $(LD_OUT)digest_group$(LOAD_EXT) lib-digest_group$(O) $(OBJS_DIGEST) $(LINKARGS) $(LIB_CRYPTO)
+	$(LD) @ld_out at digest_group$(LOAD_EXT) lib-digest_group$(O) $(OBJS_DIGEST) $(LINKARGS) $(LIB_CRYPTO)
 
 lib-digest_group$(O): digest_group.c
-	$(CC) $(CC_OUT)lib-digest_group$(O) $(INCLUDES) $(CFLAGS) digest_group.c
+	$(CC) -c @cc_o_out at lib-digest_group$(O) $(INCLUDES) $(CFLAGS) digest_group.c
 
 digest_group.c: $(OBJS_DIGEST)
 	$(PMC2C) --library digest_group --c $(PMCS_DIGEST)
 
 md2$(O): md2.c
-	$(CC) $(CC_OUT)md2$(O) $(INCLUDES) $(CFLAGS) md2.c
+	$(CC) -c @cc_o_out at md2$(O) $(INCLUDES) $(CFLAGS) md2.c
 
 md2.c: md2.dump
 	$(PMC2CC) md2.pmc
@@ -187,7 +168,7 @@
 	$(PMC2CD) md2.pmc
 
 md4$(O): md4.c
-	$(CC) $(CC_OUT)md4$(O) $(INCLUDES) $(CFLAGS) md4.c
+	$(CC) -c @cc_o_out at md4$(O) $(INCLUDES) $(CFLAGS) md4.c
 
 md4.c: md4.dump
 	$(PMC2CC) md4.pmc
@@ -196,7 +177,7 @@
 	$(PMC2CD) md4.pmc
 
 md5$(O): md5.c
-	$(CC) $(CC_OUT)md5$(O) $(INCLUDES) $(CFLAGS) md5.c
+	$(CC) -c @cc_o_out at md5$(O) $(INCLUDES) $(CFLAGS) md5.c
 
 md5.c: md5.dump
 	$(PMC2CC) md5.pmc
@@ -205,7 +186,7 @@
 	$(PMC2CD) md5.pmc
 
 ripemd160$(O): ripemd160.c
-	$(CC) $(CC_OUT)ripemd160$(O) $(INCLUDES) $(CFLAGS) ripemd160.c
+	$(CC) -c @cc_o_out at ripemd160$(O) $(INCLUDES) $(CFLAGS) ripemd160.c
 
 ripemd160.c: ripemd160.dump
 	$(PMC2CC) ripemd160.pmc
@@ -214,7 +195,7 @@
 	$(PMC2CD) ripemd160.pmc
 
 sha$(O): sha.c
-	$(CC) $(CC_OUT)sha$(O) $(INCLUDES) $(CFLAGS) sha.c
+	$(CC) -c @cc_o_out at sha$(O) $(INCLUDES) $(CFLAGS) sha.c
 
 sha.c: sha.dump
 	$(PMC2CC) sha.pmc
@@ -223,7 +204,7 @@
 	$(PMC2CD) sha.pmc
 
 sha1$(O): sha1.c
-	$(CC) $(CC_OUT)sha1$(O) $(INCLUDES) $(CFLAGS) sha1.c
+	$(CC) -c @cc_o_out at sha1$(O) $(INCLUDES) $(CFLAGS) sha1.c
 
 sha1.c: sha1.dump
 	$(PMC2CC) sha1.pmc
@@ -232,7 +213,7 @@
 	$(PMC2CD) sha1.pmc
 
 sha256$(O): sha256.c
-	$(CC) $(CC_OUT)sha256$(O) $(INCLUDES) $(CFLAGS) sha256.c
+	$(CC) -c @cc_o_out at sha256$(O) $(INCLUDES) $(CFLAGS) sha256.c
 
 sha256.c: sha256.dump
 	$(PMC2CC) sha256.pmc
@@ -241,7 +222,7 @@
 	$(PMC2CD) sha256.pmc
 
 sha512$(O): sha512.c
-	$(CC) $(CC_OUT)sha512$(O) $(INCLUDES) $(CFLAGS) sha512.c
+	$(CC) -c @cc_o_out at sha512$(O) $(INCLUDES) $(CFLAGS) sha512.c
 
 sha512.c: sha512.dump
 	$(PMC2CC) sha512.pmc
@@ -250,10 +231,10 @@
 	$(PMC2CD) sha512.pmc
 
 subproxy$(LOAD_EXT): subproxy$(O)
-	$(LD) $(LD_OUT)subproxy$(LOAD_EXT) subproxy$(O) $(LINKARGS)
+	$(LD) @ld_out at subproxy$(LOAD_EXT) subproxy$(O) $(LINKARGS)
 
 subproxy$(O): subproxy.c
-	$(CC) $(CC_OUT)subproxy$(O) $(INCLUDES) $(CFLAGS) subproxy.c
+	$(CC) -c @cc_o_out at subproxy$(O) $(INCLUDES) $(CFLAGS) subproxy.c
 
 subproxy.c: subproxy.dump
 	$(PMC2CC) subproxy.pmc
@@ -272,7 +253,7 @@
 	$(RM_F) $(CLEANUPS)
 
 realclean:
-	$(RM_F)  $(CLEANUPS) Makefile $(GEN_PMC_DEFINITIONS)
+	$(RM_F) $(CLEANUPS) Makefile
 
 distclean: realclean
 

Modified: branches/ops_pct/config/gen/makefiles/opsc.in
==============================================================================
--- branches/ops_pct/config/gen/makefiles/opsc.in	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/makefiles/opsc.in	Fri Jul 24 19:42:02 2009	(r40257)
@@ -18,8 +18,6 @@
   opsc.pir \
   opsc_core.pir \
   builtins.pir \
-  ops/op.pir \
-  ops/gen_op.pir \
   ops/oplib.pir \
   ops/gen_oplib.pir \
   compiler/gen_grammar.pir \
@@ -46,10 +44,6 @@
 	$(PARROT) $(PARROT_ARGS) $(NQP) --output=compiler/gen_actions.pir \
 	    --target=pir compiler/actions.pm
 
-ops/gen_op.pir: $(NQP) $(PCT) ops/op.pm
-	$(PARROT) $(PARROT_ARGS) $(NQP) --output=ops/gen_op.pir \
-	    --target=pir ops/op.pm
-
 ops/gen_oplib.pir: $(NQP) $(PCT) ops/oplib.pm
 	$(PARROT) $(PARROT_ARGS) $(NQP) --output=ops/gen_oplib.pir \
 	    --target=pir ops/oplib.pm
@@ -108,7 +102,6 @@
   opsc.pbc \
   compiler/gen_grammar.pir \
   compiler/gen_actions.pir \
-  ops/gen_op.pir \
   ops/gen_oplib.pir \
   runcore/gen_base.pir \
   runcore/gen_c.pir \

Modified: branches/ops_pct/config/gen/makefiles/root.in
==============================================================================
--- branches/ops_pct/config/gen/makefiles/root.in	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/makefiles/root.in	Fri Jul 24 19:42:02 2009	(r40257)
@@ -175,6 +175,22 @@
 #IF(has_opengl):    config/gen/call_list/opengl.in \
 #IF(has_glut):    $(SRC_DIR)/glut_callbacks.c \
     $(SRC_DIR)/core_pmcs.c \
+#IF(has_crypto):    $(SRC_DIR)/dynpmc/md2.pmc \
+#IF(has_crypto):    $(SRC_DIR)/dynpmc/md4.pmc \
+#IF(has_crypto):    $(SRC_DIR)/dynpmc/md5.pmc \
+#IF(has_crypto):    $(SRC_DIR)/dynpmc/ripemd160.pmc \
+#IF(has_crypto):    $(SRC_DIR)/dynpmc/sha.pmc \
+#IF(has_crypto):    $(SRC_DIR)/dynpmc/sha1.pmc \
+#IF(has_crypto):    $(SRC_DIR)/dynpmc/sha256.pmc \
+#IF(has_crypto):    $(SRC_DIR)/dynpmc/sha512.pmc \
+#IF(has_crypto):    t/dynpmc/md2.t \
+#IF(has_crypto):    t/dynpmc/md4.t \
+#IF(has_crypto):    t/dynpmc/md5.t \
+#IF(has_crypto):    t/dynpmc/ripemd160.t \
+#IF(has_crypto):    t/dynpmc/sha.t \
+#IF(has_crypto):    t/dynpmc/sha1.t \
+#IF(has_crypto):    t/dynpmc/sha256.t \
+#IF(has_crypto):    t/dynpmc/sha512.t \
     CFLAGS \
     $(IMCC_DIR)/CFLAGS \
     config_lib.pasm \
@@ -302,7 +318,6 @@
     $(LIBRARY_DIR)/YAML/Parser/Syck.pbc \
     $(LIBRARY_DIR)/STM.pbc \
     $(LIBRARY_DIR)/libpcre.pbc \
-    $(LIBRARY_DIR)/Data/Replace.pbc \
     $(LIBRARY_DIR)/postgres.pbc
 
 # the dependencies of $(SRC_DIR)/jit_emit.h are done explicitly
@@ -413,6 +428,7 @@
     $(SRC_DIR)/gc/generational_ms$(O) \
     $(SRC_DIR)/gc/incremental_ms$(O) \
     $(SRC_DIR)/gc/gc_ms$(O) \
+    $(SRC_DIR)/gc/gc_inf$(O) \
     $(SRC_DIR)/gc/mark_sweep$(O) \
     $(SRC_DIR)/gc/system$(O) \
     $(SRC_DIR)/global$(O) \
@@ -485,7 +501,6 @@
 MINIPARROT          := $(CUR_DIR)/miniparrot$(EXE)
 DIS                 := $(CUR_DIR)/pbc_disassemble$(EXE)
 PDUMP               := $(CUR_DIR)/pbc_dump$(EXE)
-PINFO               := $(CUR_DIR)/pbc_info$(EXE)
 PBCMERGE            := $(CUR_DIR)/pbc_merge$(EXE)
 PDB                 := $(CUR_DIR)/parrot_debugger$(EXE)
 PBC_TO_EXE          := $(CUR_DIR)/pbc_to_exe$(EXE)
@@ -496,7 +511,6 @@
 INSTALLABLEPARROT   := $(CUR_DIR)/installable_parrot$(EXE)
 INSTALLABLEDIS      := $(CUR_DIR)/installable_pbc_disassemble$(EXE)
 INSTALLABLEPDUMP    := $(CUR_DIR)/installable_pbc_dump$(EXE)
-INSTALLABLEPINFO    := $(CUR_DIR)/installable_pbc_info$(EXE)
 INSTALLABLEPBCMERGE := $(CUR_DIR)/installable_pbc_merge$(EXE)
 INSTALLABLEPBCTOEXE := $(CUR_DIR)/installable_pbc_to_exe$(EXE)
 INSTALLABLEPDB      := $(CUR_DIR)/installable_parrot_debugger$(EXE)
@@ -589,7 +603,6 @@
     $(PBCMERGE) \
     $(PDB) \
     $(PDUMP) \
-    $(PINFO) \
 
 $(GEN_LIBRARY) : $(PARROT)
 
@@ -660,13 +673,11 @@
 	@echo "  world:             'all' and 'parrot_utils'."
 	@echo "  installable:       same as 'world', but targets for installation"
 	@echo ""
-	@echo "  parrot_utils:      $(PDUMP), $(DIS), $(PINFO), $(PDB), $(PBCMERGE) and $(PBC_TO_EXE) $(PARROT_CONFIG)"
+	@echo "  parrot_utils:      $(PDUMP), $(DIS), $(PDB), $(PBCMERGE) and $(PBC_TO_EXE) $(PARROT_CONFIG)"
 	@echo " $(PDUMP):"
 	@echo "                     Parrot Dumper"
 	@echo " $(DIS):"
 	@echo "                     Parrot Disassembler"
-	@echo " $(PINFO):"
-	@echo "                     Information about Parrot Byte Code"
 	@echo " $(PDB):"
 	@echo "                     Parrot Debugger"
 	@echo " $(PBCMERGE):"
@@ -764,9 +775,9 @@
 
 world : all parrot_utils
 
-parrot_utils : $(PDUMP) $(DIS) $(PINFO) $(PDB) $(PBCMERGE) $(PBC_TO_EXE) $(PARROT_CONFIG)
+parrot_utils : $(PDUMP) $(DIS) $(PDB) $(PBCMERGE) $(PBC_TO_EXE) $(PARROT_CONFIG)
 
-installable: all $(INSTALLABLEPARROT) $(INSTALLABLEPDUMP) $(INSTALLABLEDIS) $(INSTALLABLEPINFO) $(INSTALLABLEPDB) $(INSTALLABLEPBCMERGE) $(INSTALLABLEPBCTOEXE) $(INSTALLABLECONFIG)
+installable: all $(INSTALLABLEPARROT) $(INSTALLABLEPDUMP) $(INSTALLABLEDIS) $(INSTALLABLEPDB) $(INSTALLABLEPBCMERGE) $(INSTALLABLEPBCTOEXE) $(INSTALLABLECONFIG)
 
 
 flags_dummy :
@@ -963,20 +974,6 @@
 #IF(win32):	if exist $@.manifest mt.exe -nologo -manifest $@.manifest -outputresource:$@;1
 
 
-# pbc_info
-$(PINFO) : $(SRC_DIR)/pbc_info$(O) $(LIBPARROT)
-	$(LINK) @ld_out@$@ \
-    $(SRC_DIR)/pbc_info$(O) \
-    @rpath_blib@ $(ALL_PARROT_LIBS) $(LINKFLAGS)
-#IF(win32):	if exist $@.manifest mt.exe -nologo -manifest $@.manifest -outputresource:$@;1
-
-$(SRC_DIR)/pbc_info$(O) : $(INC_DIR)/parrot.h $(GEN_HEADERS)
-
-$(INSTALLABLEPINFO) : $(SRC_DIR)/pbc_info$(O) $(LIBPARROT)
-	$(LINK) @ld_out@$@ \
-    $(SRC_DIR)/pbc_info$(O) \
-    @rpath_lib@ $(ALL_PARROT_LIBS) $(LINKFLAGS)
-#IF(win32):	if exist $@.manifest mt.exe -nologo -manifest $@.manifest -outputresource:$@;1
 
 #
 # Parrot Bytecode File Merger
@@ -1095,6 +1092,8 @@
 
 $(SRC_DIR)/gc/gc_ms$(O) : $(GENERAL_H_FILES) $(SRC_DIR)/gc/gc_ms.c
 
+$(SRC_DIR)/gc/gc_inf$(O) : $(GENERAL_H_FILES) $(SRC_DIR)/gc/gc_inf.c
+
 $(SRC_DIR)/gc/api$(O) : $(GENERAL_H_FILES) $(SRC_DIR)/gc/gc_private.h
 
 $(SRC_DIR)/gc/generational_ms$(O) : $(GENERAL_H_FILES)
@@ -1536,23 +1535,6 @@
 	examples_tests \
 	distro_tests
 
-fulltest_all :
-	- at make@ testb
-#IF(cg_flag):	- at make@ testC
-	- at make@ testf
-#IF(cg_flag):	- at make@ testg
-#IF(jitcapable):	- at make@ testj
-	- at make@ testr
-	- at make@ testS
-	- at make@ src_tests
-	- at make@ run_tests
-	- at make@ perl_tests
-	- at make@ codetest
-	- at make@ manifest_tests
-	- at make@ examples_tests
-	- at make@ distro_tests
-	- at make@ benchmark_tests
-
 # bounds checking, slow core
 testb : test_prep
 	$(PERL) t/harness $(EXTRA_TEST_ARGS) -b $(RUNCORE_TEST_FILES)
@@ -1675,7 +1657,6 @@
     $(INSTALLABLEPARROT) \
     $(INSTALLABLEDIS) \
     $(INSTALLABLEPDUMP) \
-    $(INSTALLABLEPINFO) \
     $(INSTALLABLEPBCMERGE) \
     $(INSTALLABLEPBCTOEXE) \
     $(INSTALLABLEPDB) \
@@ -1684,7 +1665,6 @@
     parrot_config$(EXE) parrot_config.c parrot_config$(O) parrot_config.pbc \
     $(IMCC_DIR)/main$(O) \
     $(PDUMP) $(SRC_DIR)/pbc_dump$(O) $(SRC_DIR)/packdump$(O) \
-    $(SRC_DIR)/pbc_info$(O) $(PINFO) \
     $(PDB) $(SRC_DIR)/parrot_debugger$(O) \
     $(PBCMERGE) $(SRC_DIR)/pbc_merge$(O) \
     $(DIS) $(SRC_DIR)/pbc_disassemble$(O)
@@ -1715,13 +1695,11 @@
     $(INSTALLABLEPARROT) \
     $(INSTALLABLEDIS) \
     $(INSTALLABLEPDUMP) \
-    $(INSTALLABLEPINFO) \
     $(INSTALLABLEPBCMERGE) \
     $(INSTALLABLEPDB) \
     $(INSTALLABLECONFIG) \
     $(IMCC_DIR)/main$(O) \
     $(PDUMP) $(SRC_DIR)/pbc_dump$(O) $(SRC_DIR)/packdump$(O) \
-    $(PINFO) $(SRC_DIR)/pbc_info$(O) \
     $(PDB) $(SRC_DIR)/parrot_debugger$(O) \
     $(PBCMERGE) $(SRC_DIR)/pbc_merge$(O) \
     $(DIS) $(SRC_DIR)/pbc_disassemble$(O) \
@@ -1796,15 +1774,6 @@
     "t/stress/*.pbc" \
     "t/tools/*.pbc"
 	$(RM_F) \
-	"t/dynpmc/md2.t" \
-	"t/dynpmc/md4.t" \
-	"t/dynpmc/md5.t" \
-	"t/dynpmc/ripemd160.t" \
-	"t/dynpmc/sha.t" \
-	"t/dynpmc/sha1.t" \
-	"t/dynpmc/sha256.t" \
-	"t/dynpmc/sha512.t"
-	$(RM_F) \
     "t/src/*.c" \
     "t/src/*.pdb" \
     "t/src/*.manifest"
@@ -1828,7 +1797,6 @@
 # a failing step of cleaning, usually doesn't concern the following steps
 realclean : clean
 	-$(MAKE) compilers/pirc  realclean
-	-$(MAKE) src/dynpmc      realclean
 	$(RM_RF) \
     $(CONFIGURE_GENERATED_FILES) \
     blib \

Modified: branches/ops_pct/config/gen/opengl.pm
==============================================================================
--- branches/ops_pct/config/gen/opengl.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/opengl.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1074,7 +1074,7 @@
     callback_data[GLUT_CB_TIMER].interp = interp;
     callback_data[GLUT_CB_TIMER].sub    = sub;
 
-    if (sub == PMCNULL)
+    if (PMC_IS_NULL(sub))
         glutTimerFunc(0, NULL, 0);
     else
         glutTimerFunc(milliseconds, glut_timer_func, data);
@@ -1109,7 +1109,7 @@
     callback_data[GLUT_CB_JOYSTICK].interp = interp;
     callback_data[GLUT_CB_JOYSTICK].sub    = sub;
 
-    if (sub == PMCNULL)
+    if (PMC_IS_NULL(sub))
         glutJoystickFunc(NULL, 0);
     else
         glutJoystickFunc(glut_joystick_func, pollinterval);
@@ -1149,7 +1149,7 @@
     callback_data[$_->{enum}].interp = interp;
     callback_data[$_->{enum}].sub    = sub;
 
-    if (sub == PMCNULL)
+    if (PMC_IS_NULL(sub))
         $_->{glut}(NULL);
     else
         $_->{glut}($_->{thunk});

Modified: branches/ops_pct/config/gen/parrot_include.pm
==============================================================================
--- branches/ops_pct/config/gen/parrot_include.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/parrot_include.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -33,8 +33,10 @@
         include/parrot/events.h
         include/parrot/scheduler.h
         include/parrot/exceptions.h
+        include/parrot/hash.h
         include/parrot/interpreter.h
         include/parrot/io.h
+        include/parrot/library.h
         include/parrot/longopt.h
         include/parrot/multidispatch.h
         include/parrot/packfile.h

Modified: branches/ops_pct/config/gen/platform/generic/platform_limits.h
==============================================================================
--- branches/ops_pct/config/gen/platform/generic/platform_limits.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/platform/generic/platform_limits.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -9,10 +9,20 @@
 /*
  * Define the values for PARROT_INTVAL_MAX and PARROT_INTVAL_MIN
  * in platforms that does no have limits.h or gives wrong values.
- * The generic versions assumes limits.h availability,
- * and does nothing.
+ * The generic versions assumes limits.h availability.
  */
 
+/* LLONG_MAX doesn't appear to be provided for some compilers of Win64, so
+   try to define them here. */
+#ifdef _MSC_VER
+#  ifndef LLONG_MAX
+#    define LLONG_MAX _I64_MAX
+#  endif
+#  ifndef LLONG_MIN
+#    define LLONG_MIN _I64_MIN
+#  endif
+#endif
+
 #endif /* PARROT_PLATFORM_GENERIC_PLATFORM_LIMITS_GUARD */
 
 /*

Modified: branches/ops_pct/config/gen/platform/generic/threads.h
==============================================================================
--- branches/ops_pct/config/gen/platform/generic/threads.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/platform/generic/threads.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -9,16 +9,18 @@
  * POSIX threading stuff
  */
 
-#ifdef PARROT_HAS_HEADER_PTHREAD
+#ifdef PARROT_HAS_THREADS
+
 #  include "parrot/thr_pthread.h"
-#endif
 
-#ifdef PARROT_HAS_HEADER_UNISTD
-#  include <unistd.h>
-#  ifdef _POSIX_PRIORITY_SCHEDULING
-#    define YIELD sched_yield()
-#  endif
-#endif
+#  ifdef PARROT_HAS_HEADER_UNISTD
+#    include <unistd.h>
+#    ifdef _POSIX_PRIORITY_SCHEDULING
+#      define YIELD sched_yield()
+#    endif
+#  endif /* PARROT_HAS_HEADER_UNISTD */
+
+#endif /* PARROT_HAS_THREADS */
 
 #endif /* PARROT_PLATFORM_GENERIC_THREADS_H_GUARD */
 

Modified: branches/ops_pct/config/gen/platform/win32/dl.c
==============================================================================
--- branches/ops_pct/config/gen/platform/win32/dl.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/platform/win32/dl.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -78,7 +78,7 @@
 void *
 Parrot_dlsym(void *handle, const char *symbol)
 {
-    return (void *)GetProcAddress(handle, symbol);
+    return (void *)GetProcAddress((HINSTANCE)handle, symbol);
 }
 
 /*
@@ -102,7 +102,7 @@
 int
 Parrot_dlclose(void *handle)
 {
-    return FreeLibrary(handle)? 0: 1;
+    return FreeLibrary((HMODULE)handle)? 0: 1;
 }
 
 /*

Modified: branches/ops_pct/config/gen/platform/win32/env.c
==============================================================================
--- branches/ops_pct/config/gen/platform/win32/env.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/platform/win32/env.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -54,7 +54,7 @@
         const int value_len = strlen(value);
 
         {
-            char * const envstring = mem_internal_allocate(
+            char * const envstring = (char * const)mem_internal_allocate(
                     name_len     /* name  */
                     + 1          /* '='   */
                     + value_len  /* value */
@@ -106,7 +106,7 @@
     else {
         *free_it = 1;
     }
-    buffer = mem_sys_allocate(size);
+    buffer = (char *)mem_sys_allocate(size);
     GetEnvironmentVariable(name, buffer, size);
 
     return buffer;

Modified: branches/ops_pct/config/gen/platform/win32/exec.c
==============================================================================
--- branches/ops_pct/config/gen/platform/win32/exec.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/platform/win32/exec.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -42,7 +42,7 @@
     STARTUPINFO si;
     PROCESS_INFORMATION pi;
     int free_it = 0;
-    char* cmd = mem_sys_allocate(command->strlen + 4);
+    char* cmd = (char *)mem_sys_allocate(command->strlen + 4);
     char* shell = Parrot_getenv("ComSpec", &free_it);
     char* cmdin = Parrot_str_to_cstring(interp, command);
 
@@ -98,7 +98,7 @@
     int pmclen;
     int cmdlinelen = 1000;
     int cmdlinepos = 0;
-    char *cmdline = mem_sys_allocate(cmdlinelen);
+    char *cmdline = (char *)mem_sys_allocate(cmdlinelen);
     int i;
 
     /* Ensure there's something in the PMC array. */
@@ -113,7 +113,7 @@
         char *cs  = Parrot_str_to_cstring(interp, s);
         if (cmdlinepos + (int)s->strlen + 3 > cmdlinelen) {
             cmdlinelen += s->strlen + 4;
-            cmdline = mem_sys_realloc(cmdline, cmdlinelen);
+            cmdline = (char *)mem_sys_realloc(cmdline, cmdlinelen);
         }
         strcpy(cmdline + cmdlinepos, "\"");
         strcpy(cmdline + cmdlinepos + 1, cs);
@@ -164,7 +164,7 @@
     int status;
     char *in = Parrot_str_to_cstring(interp, command);
     char *cmd = NULL;
-    const char **argv = mem_sys_allocate_zeroed(2 * sizeof (int));
+    const char **argv = (const char **)mem_sys_allocate_zeroed(2 * sizeof (int));
 
     /* Grab string, extract command and parameters. */
     char *curPos  = in;
@@ -196,7 +196,7 @@
             int lenFound = curPos - lastCommandStart;
             if (*(curPos + 1) == 0)
                 lenFound++;
-            tmp = mem_sys_allocate(1 + lenFound);
+            tmp = (char *)mem_sys_allocate(1 + lenFound);
             memcpy(tmp, lastCommandStart, lenFound);
             *(tmp + lenFound) = 0;
 
@@ -210,7 +210,7 @@
             {
                 /* Allocate space for another pointer in **argv. */
                 argc++;
-                argv = mem_sys_realloc(argv, (argc + 1) * sizeof (int));
+                argv = (const char **)mem_sys_realloc(argv, (argc + 1) * sizeof (int));
                 *(argv + (argc - 1)) = tmp;
                 *(argv + argc) = NULL;
             }

Modified: branches/ops_pct/config/gen/platform/win32/threads.h
==============================================================================
--- branches/ops_pct/config/gen/platform/win32/threads.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/platform/win32/threads.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -6,7 +6,15 @@
 #ifndef PARROT_PLATFORM_WIN32_THREADS_H_GUARD
 #define PARROT_PLATFORM_WIN32_THREADS_H_GUARD
 
-#include "parrot/thr_windows.h"
+#undef CONST
+#include <windows.h>
+#undef CONST
+
+#ifdef PARROT_HAS_THREADS
+
+#  include "parrot/thr_windows.h"
+
+#endif /* PARROT_HAS_THREADS */
 
 #endif /* PARROT_PLATFORM_WIN32_THREADS_H_GUARD */
 

Modified: branches/ops_pct/config/gen/platform/win32/time.c
==============================================================================
--- branches/ops_pct/config/gen/platform/win32/time.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/gen/platform/win32/time.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -37,10 +37,10 @@
 Parrot_intval_time(void)
 {
 #if defined(_MSC_VER) && _MSC_VER >= 1400
-#  if INTVAL_SIZE <= 4
-    return _time32(NULL);
+#  ifdef _WIN64
+    return (INTVAL)_time64(NULL);
 #  else
-    return _time64(NULL);
+    return _time32(NULL);
 #  endif
 #else
     return time(NULL);

Modified: branches/ops_pct/config/init/defaults.pm
==============================================================================
--- branches/ops_pct/config/init/defaults.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/init/defaults.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -72,6 +72,9 @@
     # to their 'use English' names as documented in 'perlvar'.)
     $conf->data->set_p5( OSNAME => $^O );
 
+    my $ccdlflags = $Config{ccdlflags};
+    $ccdlflags =~ s/\s*-Wl,-rpath,\S*//g if $conf->options->get('disable-rpath');
+
     # We need a Glossary somewhere!
     $conf->data->set(
         debugging => $conf->options->get('debugging') ? 1 : 0,
@@ -112,7 +115,7 @@
         # Linker Flags to have this binary work with the shared and dynamically
         # loadable libraries we're building.  On HP-UX, for example, we need to
         # allow dynamic libraries to access the binary's symbols
-        link_dynamic => $Config{ccdlflags},    # e.g. -Wl,-E on HP-UX
+        link_dynamic => $ccdlflags,    # e.g. -Wl,-E on HP-UX
 
         # ld: Tool used to build shared libraries and dynamically loadable
         # modules. Often $cc on Unix-ish systems, but apparently sometimes
@@ -243,9 +246,7 @@
     );
 
     # add profiling if needed
-    # RT#41497 gcc syntax
-    # we should have this in the hints files e.g. cc_profile
-    # RT#41496 move profiling to it's own step
+    # RT #41497 gcc syntax
     if ( $conf->options->get('profile') ) {
         $conf->data->set(
             cc_debug => " -pg ",

Modified: branches/ops_pct/config/init/hints.pm
==============================================================================
--- branches/ops_pct/config/init/hints.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/init/hints.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -37,6 +37,7 @@
     my $hints_used = 0;
 
     my $osname = lc( $conf->data->get_p5('OSNAME') );
+    $osname = 'linux' if ($osname eq 'gnukfreebsd');
     my $hints_file = catfile('config', 'init', 'hints', "$osname.pm");
     if ( -f $hints_file ) {
         my $hints_pkg = "init::hints::" . $osname;

Modified: branches/ops_pct/config/init/hints/darwin.pm
==============================================================================
--- branches/ops_pct/config/init/hints/darwin.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/config/init/hints/darwin.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, Parrot Foundation.
+# Copyright (C) 2005-2009, Parrot Foundation.
 # $Id$
 
 package init::hints::darwin;
@@ -6,11 +6,18 @@
 use strict;
 use warnings;
 
+use lib qw( lib );
+use File::Spec ();
+use base qw(Parrot::Configure::Step);
+use Parrot::BuildUtil;
+
 our %defaults = (
     uname           => `uname -r`,
     sw_vers         => `sw_vers -productVersion`,
     problem_flags   => [ qw( ccflags ldflags ) ],
     architectures   => [ qw( i386 ppc64 ppc x86_64 ) ],
+    fink_conf       => q{/sw/etc/fink.conf},
+    ports_base_dir  => q{/opt/local},
 );
 
 sub runstep {
@@ -40,6 +47,14 @@
     my $lib_dir = $conf->data->get('build_dir') . "/blib/lib";
     $flagsref->{ldflags} .= " -L$lib_dir";
     $flagsref->{ccflags} .= " -pipe -fno-common -Wno-long-double ";
+    $flagsref->{linkflags} .= " -undefined dynamic_lookup";
+
+    _probe_for_libraries($conf, $flagsref, 'fink');
+    _probe_for_libraries($conf, $flagsref, 'macports');
+
+    for my $flag ( keys %$flagsref ) {
+        $flagsref->{$flag} =~ s/^\s+//;
+    }
 
     $conf->data->set(
         darwin              => 1,
@@ -51,7 +66,7 @@
         share_ext           => '.dylib',
         load_ext            => '.bundle',
         link                => 'c++',
-        linkflags           => '-undefined dynamic_lookup',
+        linkflags           => $flagsref->{linkflags},
         ld                  => 'c++',
         ld_share_flags      => '-dynamiclib -undefined dynamic_lookup',
         ld_load_flags       => '-undefined dynamic_lookup -bundle',
@@ -86,7 +101,7 @@
 
 sub _strip_arch_flags_engine {
     my ($arches, $stored, $flagsref, $flag) = @_;
-    for my $arch ( @{ $defaults{architectures} } ) {
+    for my $arch ( @{ $arches } ) {
         $stored =~ s/-arch\s+$arch//g;
         $stored =~ s/\s+/ /g;
         $flagsref->{$flag} = $stored;
@@ -144,8 +159,139 @@
     }
 }
 
+sub _probe_for_fink {
+    my $conf = shift;
+    my $verbose = $conf->options->get( 'verbose' );
+    # Per fink(8), this is location for Fink configuration file, presumably
+    # regardless of where Fink itself is installed.
+    my $fink_conf    = $defaults{fink_conf};
+    unless (-f $fink_conf) {
+        print "Fink configuration file not located\n" if $verbose;
+        return;
+    }
+    my $fink_conf_str = Parrot::BuildUtil::slurp_file($fink_conf);
+    my @lines = split /\n/, $fink_conf_str;
+    my $fink_base_dir;
+    while (defined (my $l = shift @lines) ) {
+        chomp $l;
+        next unless $l =~ /^Basepath:\s(.*)/;
+        $fink_base_dir = $1;
+        last;
+    }
+    unless (defined $fink_base_dir) {
+        print "Fink configuration file defective:  no 'Basepath'\n"
+            if $verbose;
+        return;
+    }
+    my $fink_lib_dir = qq{$fink_base_dir/lib};
+    my $fink_include_dir = qq{$fink_base_dir/include};
+    my @unlocateables;
+    foreach my $dir ($fink_base_dir, $fink_lib_dir, $fink_include_dir) {
+        push @unlocateables, $dir unless (-d $dir);
+    }
+    if (@unlocateables) {
+        print "Could not locate Fink directories:  @unlocateables\n"
+            if $verbose;
+        return;
+    }
+    else {
+        my %addl_flags = (
+            linkflags => "-L$fink_lib_dir",
+            ldflags   => "-L$fink_lib_dir",
+            ccflags   => "-I$fink_include_dir",
+        );
+        return \%addl_flags;
+    }
+}
+
+sub _probe_for_macports {
+    my $conf = shift;
+    my $verbose = $conf->options->get( 'verbose' );
+    my $ports_base_dir = $defaults{ports_base_dir};
+    my $ports_lib_dir = qq{$ports_base_dir/lib};
+    my $ports_include_dir = qq{$ports_base_dir/include};
+    my @unlocateables;
+    foreach my $dir ($ports_base_dir, $ports_lib_dir, $ports_include_dir) {
+        push @unlocateables, $dir unless (-d $dir);
+    }
+    if (@unlocateables) {
+        print "Could not locate Macports directories:  @unlocateables\n"
+            if $verbose;
+        return;
+    }
+    else {
+        my %addl_flags = (
+            linkflags => "-L$ports_lib_dir",
+            ldflags   => "-L$ports_lib_dir",
+            ccflags   => "-I$ports_include_dir",
+        );
+        return \%addl_flags;
+    }
+}
+
+sub _probe_for_libraries {
+    my ($conf, $flagsref, $library) = @_;
+    my $no_library_option = "darwin_no_$library";
+    my $title = ucfirst(lc($library));
+    my $verbose = $conf->options->get( 'verbose' );
+    unless ($conf->options->get( $no_library_option ) ) {
+        my $addl_flags_ref;
+        if ($library eq 'fink') {
+            $addl_flags_ref = _probe_for_fink($conf);
+        }
+        if ($library eq 'macports') {
+            $addl_flags_ref = _probe_for_macports($conf);
+        }
+        my $rv = _add_to_flags( $addl_flags_ref, $flagsref, $title, $verbose );
+        return $rv;
+    }
+    return;
+}
+
+sub _add_to_flags {
+    my ( $addl_flags_ref, $flagsref, $title, $verbose ) = @_;
+    if ( defined $addl_flags_ref ) {
+        foreach my $addl ( keys %{ $addl_flags_ref } ) {
+            my %seen;
+            if ( defined $flagsref->{$addl} ) {
+                my @elements = split /\s+/, $flagsref->{$addl};
+                %seen = map {$_, 1} @elements;
+            }
+            $flagsref->{$addl} .= " $addl_flags_ref->{$addl}"
+                unless $seen{ $addl_flags_ref->{$addl} };
+        }
+        print "Probe for $title successful\n" if $verbose;
+    }
+    else {
+        print "Probe for $title unsuccessful\n" if $verbose;
+    }
+    return 1;
+}
+
 1;
 
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+init::hints::Darwin - hints for the Darwin compiler
+
+=head1 DESCRIPTION
+
+The functionality in this package is run automatically during configuration
+step F<init::hints> when run on Darwin.
+
+Among other things, this step probes for Fink and Macports libraries --
+functionality previously provided by configuration steps F<auto::fink> and
+F<auto::macports>, which have now been eliminated.
+
+Should you not want to search for either of these packages, you may specify
+the command-line options C<darwin_no_fink> and/or C<darwin_no_macports>.
+
+The functionality is tested in F<t/steps/init/hints/darwin-01.t>.
+
+=cut
+
 # Local Variables:
 #   mode: cperl
 #   cperl-indent-level: 4

Modified: branches/ops_pct/docs/compiler_faq.pod
==============================================================================
--- branches/ops_pct/docs/compiler_faq.pod	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/docs/compiler_faq.pod	Fri Jul 24 19:42:02 2009	(r40257)
@@ -692,25 +692,6 @@
 language to be used without having to place them into the Parrot core itself.
 For examples of dynamic op libraries, see L<src/dynoplibs>.
 
-To build dynamic op libraries, add something like the following to your
-makefile:
-
-  PERL     = /usr/bin/perl
-  OPSBUILD = $(PERL) /path/to/parrot/tools/build/dynops.pl
-  DESTDIR  = /path/to/parrot/runtime/parrot/dynext
-  LOAD_EXT = .so
-
-  OPSDIR    = ops
-  OPLIBS    = myops
-  OPS_FILES = myops.ops
-
-  dynops : $(OPS_FILES)
-      @cd $(OPSDIR) && $(BUILD) generate $(OPLIBS)
-      @cd $(OPSDIR) && $(BUILD) compile $(OPLIBS)
-      @cd $(OPSDIR) && $(BUILD) linklibs $(OPLIBS)
-      @cd $(OPSDIR) && $(BUILD) copy "--destination=$(DESTDIR)" $(OPLIBS)
-
-
 =head2 How do I use the Native Calling Interface (NCI)?
 
 Using the NCI you can invoke functions written in C from a Parrot script.

Modified: branches/ops_pct/docs/dev/events.pod
==============================================================================
--- branches/ops_pct/docs/dev/events.pod	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/docs/dev/events.pod	Fri Jul 24 19:42:02 2009	(r40257)
@@ -31,8 +31,7 @@
 =head2 Events
 
 Events can be either timed (they are due after some elapsed time) or untimed.
-For the former there is one API call: B<Parrot_new_timer_event>, used by the
-F<src/dynoplibs/myops.ops>:B<alarm> opcode for testing.
+For the former there is one API call: B<Parrot_new_timer_event>
 
 =head2 The B<event_thread>
 

Deleted: branches/ops_pct/docs/dev/fhs.pod
==============================================================================
--- branches/ops_pct/docs/dev/fhs.pod	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,171 +0,0 @@
-# Copyright (C) 2001-2007, Parrot Foundation.
-# $Id$
-
-=pod
-
-=head1 Title
-
-FHS - Filesystem Hierarchy Standard and Parrot
-
-=head1 AUTHOR
-
-Florian Ragwitz E<lt>rafl at debian.orgE<gt>
-
-=head1 VERSION
-
-  Maintainer: Florian Ragwitz
-  Date: 5 Dez 2005
-  Last Modified: 5 Dez 2005
-  Number: 0
-  Version: 1
-
-This document introduces to the FHS, the Filesystem Hierarchy Standard,
-and how those concern Parrot.
-
-=head1 INTRODUCTION
-
-The FHS defines some rules for file and directory placement under
-UNIX-like operating systems. This supports interoperability of
-applications, system administration tools, development tools, and
-scripts as well as greater uniformity of documentation for these
-systems.
-
-=head1 DIRECTORIES
-
-There's a large amount of directories explained in the FHS that are not
-explained here. The reason for this is that not all of them are
-concerning Parrot.
-
-=head2 /etc
-
-Does parrot have things where it makes sense to configure them using a
-config file? I don't think so.
-
-=head2 /tmp
-
-All temporary files should be placed here. Parrot could use this
-directory for files that are generated during the compile of parrot code
-to native executables.
-
-=head2 /usr
-
-I</usr> contains is shareable, read-only data. Any information that is
-host-specific or varies with time is stored elsewhere.
-
-=head3 /usr/bin
-
-This is the primary directory of executable commands on the system. All
-executables that are intended to be called directly by the user (i.e.
-parrot, parrot_debugger, pbc_disassemble, pbc_dump, pbc_info, pbg_merge, ...)
-should go here. The current version number should be appended to the
-binaries itself and a symlink needs to be created that points from the
-binary with version number to the normal name of the file without a
-version. That makes installing more than one version possible.
-
-Executables that are for internal use only are stored elsewhere.
-
-=head3 /usr/include
-
-This is where all of the system's general-use include files for the C
-programming language should be placed.
-
-For parrot this is the content of I<include/parrot>. It should be placed
-in I</usr/include/parrot/$(VERSION> (i.e. I</usr/include/parrot/0.4.0>),
-including those files in I<include/parrot> that are generated during
-build time.
-
-=head3 /usr/lib
-
-I</usr/lib> includes object files, libraries, and internal binaries that
-are not intended to be executed directly by users or scripts.
-
-This is libparrot$(SOEXT).$(SOVERSION) if the parrot binary was linked
-dynamically. Otherwise nothing.
-
-Also Parrot uses a single subdirectory called I</usr/lib/parrot> to
-store all architecture-dependent data exclusively used by parrot. These
-files are grouped by the parrot version they belong to. So we'll have
-I</usr/lib/parrot/0.4.0>, I</usr/lib/parrot/0.4.1>, etc.
-
-All .pbc and .fpmc files should go there.
-
-.pbc files are kind of architecture independent, because parrot can run
-PBCs created on any architecture on any architecture, but because .pbc
-files created on 32 bit platforms differ from those created on 64 bit
-platforms and the performance of executing bytecode created on an
-architecture with another address width is much slower we consider
-parrot bytecode to be architecture dependent.
-
-=head3 /usr/share
-
-The I</usr/share> hierarchy is for all read-only architecture
-independent data files. Parrot stores those files in
-I</usr/share/parrot/$(VERSION)>. For example all .pasm and .pir
-files should go there as well as data files for libraries like images
-and such.
-
-=head4 /usr/share/man
-
-Manpages are read-only architecture independent data files as well, but
-they belong into I</usr/share/man> instead of I</usr/share/parrot/> so
-they are in $MANPATH and can be viewed using the I<man> command.
-
-=head4 /usr/share/doc
-
-All documentation as well as examples should go into a subdirectory of
-I</usr/share/doc>.
-
-=head1 VIOLATIONS
-
-=over 2
-
-=item /usr/examples
-
-Examples should go into I</usr/share/doc/examples>.
-
-=item /usr/docs
-
-This belongs into I</usr/share/doc/docs> or something similar.
-
-=item /usr/runtime
-
-This needs to be split up into I</usr/lib> and I</usr/share> according
-to the rules that are given in the B<DIRECTORIES> section.
-
-=item /usr/include/parrot
-
-This directory conforms to the FHS, but makes it impossible to have more
-than one version of parrot installed at once. It should be
-I</usr/include/parrot/$(VERSION)>.
-
-=item /usr/bin
-
-The files in I</usr/bin> also lack support for multiple installed parrot
-versions. Also if we build a shared parrot and shared parrot utils the
-executables in this directory have a '_shared' suffix which is bad.
-
-=item /usr/imcc
-
-This directory should be removed. It only contains documentation and
-examples which belong somewhere else.
-
-=item /usr/LICENSES
-
-Move this to I</usr/share/doc/> or just remove it if it's legal.
-
-=item /usr/NEWS, /usr/PBC_COMPAT, ...
-
-This is also documentation for I</usr/share/doc>.
-
-=item /usr/parrot-config.pir
-
-This is a command which can be called from the user. It should be in
-I</usr/bin>, maybe without the .pir suffix.
-
-=back
-
-=head1 SOURCES
-
-FHS 2.3 - L<http://www.pathname.com/fhs/>
-
-=cut

Modified: branches/ops_pct/docs/embed.pod
==============================================================================
--- branches/ops_pct/docs/embed.pod	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/docs/embed.pod	Fri Jul 24 19:42:02 2009	(r40257)
@@ -230,10 +230,6 @@
 The handler function should accept as arguments an interpreter, an integer
 exit code, and an argument (which can be NULL).
 
-=item C<void imcc_init(PARROT_INTERP)>
-
-Initializes the IMCC subsystem.  Required for compiling PIR.
-
 =back
 
 =head2 Loading and running bytecode
@@ -329,18 +325,19 @@
 Find and return a global called C<name> in the current namespace.  Returns
 C<PMCNULL> if not found.
 
-=item C<Parrot_PMC Parrot_find_global_n(PARROT_INTERP, Parrot_String namespace, Parrot_String name)>
+=item C<Parrot_PMC Parrot_find_global_n(PARROT_INTERP, PMC namespace, Parrot_String name)>
 
-Not documented yet.
+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_store_global_n(PARROT_INTERP, Parrot_String namespace, Parrot_String name, Parrot_PMC val)>
+=item C<void Parrot_store_global_n(PARROT_INTERP, PMC namespace, Parrot_String name, Parrot_PMC val)>
 
-Not documented yet.
+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)>
 
@@ -386,7 +383,7 @@
 
 Returns the class corresponding to the supplied namespace.
 
-=item C<Parrot_PMC VTABLE_instantiate(PARROT_INTERP, Parrot_PMC the_class Parrot_PMC arg)>
+=item C<Parrot_PMC Parrot_PMC_instantiate(PARROT_INTERP, Parrot_PMC the_class, Parrot_PMC arg)>
 
 Instantiates a new object of class C<the_class>, which can be obtained from
 C<Parrot_oo_get_class()>.  Passes an optional PMC argument C<arg> to the
@@ -515,6 +512,1376 @@
         return(0);
     }
 
+=head1 EXPORTED FUNCTIONS
+
+The Parrot embedding API is not finalized, and it will go through several
+deprecation cycles before stabilizing.  Below is the comprehensive list of
+candidates for inclusion in the Parrot embedding API.  It includes the
+following types of functions:
+
+=over 4
+
+=item * The core functions documented above
+
+=item * Functions required by macros
+
+=item * Parrot_PMC_* VTABLE wrappers
+
+=item * Miscellaneous functions whose utility outside of the core is
+uncertain.  This includes functions used by HLLs.
+
+=item * Functions that should be removed in a future deprecation cycle.  A
+good example of this is most of the internal string_* functions, which now
+have formal Parrot_str_* wrappers.
+
+=back
+
+The list may also be augmented if additional functionality is required.
+
+=over 4
+
+=item C<disable_event_checking>
+
+=item C<enable_event_checking>
+
+=item C<interpinfo>
+
+=item C<interpinfo_p>
+
+=item C<interpinfo_s>
+
+=item C<mem_allocate_n_typed>
+
+=item C<mem_allocate_n_zeroed_typed>
+
+=item C<mem_allocate_zeroed_typed>
+
+=item C<mem_sys_allocate>
+
+=item C<mem_sys_allocate_zeroed>
+
+=item C<mem_sys_free>
+
+=item C<mem_sys_realloc>
+
+=item C<mem_sys_realloc_zeroed>
+
+=item C<PackFile_Constant_pack>
+
+=item C<PackFile_ConstTable_pack>
+
+=item C<PackFile_ConstTable_pack_size>
+
+=item C<PackFile_destroy>
+
+=item C<PackFile_find_in_const>
+
+=item C<PackFile_fixup_subs>
+
+=item C<PackFile_new>
+
+=item C<PackFile_new_dummy>
+
+=item C<PackFile_pack>
+
+=item C<PackFile_pack_size>
+
+=item C<Parrot_assert>
+
+=item C<Parrot_block_GC_mark>
+
+=item C<Parrot_block_GC_sweep>
+
+=item C<Parrot_byte_index>
+
+=item C<Parrot_byte_rindex>
+
+=item C<Parrot_callback_C>
+
+=item C<Parrot_callback_D>
+
+=item C<Parrot_call_method>
+
+=item C<Parrot_call_method_ret_float>
+
+=item C<Parrot_call_method_ret_int>
+
+=item C<Parrot_call_sub>
+
+=item C<Parrot_call_sub_ret_float>
+
+=item C<Parrot_call_sub_ret_int>
+
+=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>
+
+=item C<Parrot_clear_i>
+
+=item C<Parrot_clear_n>
+
+=item C<Parrot_clear_p>
+
+=item C<Parrot_clear_s>
+
+=item C<Parrot_clear_trace>
+
+=item C<Parrot_clone>
+
+=item C<Parrot_compile_file>
+
+=item C<Parrot_compile_string>
+
+=item C<Parrot_ComposeRole>
+
+=item C<Parrot_compreg>
+
+=item C<Parrot_ComputeMRO_C3>
+
+=item C<Parrot_confess>
+
+=item C<Parrot_context_ref_trace>
+
+=item C<Parrot_cx_add_handler>
+
+=item C<Parrot_cx_add_handler_local>
+
+=item C<Parrot_cx_broadcast_message>
+
+=item C<Parrot_cx_count_handlers_local>
+
+=item C<Parrot_cx_count_handlers_typed>
+
+=item C<Parrot_cx_delete_handler_local>
+
+=item C<Parrot_cx_delete_handler_typed>
+
+=item C<Parrot_cx_delete_suspend_for_gc>
+
+=item C<Parrot_cx_delete_task>
+
+=item C<Parrot_cx_find_handler_for_task>
+
+=item C<Parrot_cx_find_handler_local>
+
+=item C<Parrot_cx_handle_tasks>
+
+=item C<Parrot_cx_peek_task>
+
+=item C<Parrot_cx_request_suspend_for_gc>
+
+=item C<Parrot_cx_runloop_end>
+
+=item C<Parrot_cx_schedule_callback>
+
+=item C<Parrot_cx_schedule_repeat>
+
+=item C<Parrot_cx_schedule_sleep>
+
+=item C<Parrot_cx_schedule_task>
+
+=item C<Parrot_cx_schedule_timer>
+
+=item C<Parrot_cx_send_message>
+
+=item C<Parrot_default_charset>
+
+=item C<Parrot_default_encoding>
+
+=item C<Parrot_del_timer_event>
+
+=item C<Parrot_destroy>
+
+=item C<Parrot_disassemble>
+
+=item C<Parrot_do_check_events>
+
+=item C<Parrot_do_handle_events>
+
+=item C<Parrot_dump_dynamic_environment>
+
+=item C<Parrot_encoding_c_name>
+
+=item C<Parrot_encoding_name>
+
+=item C<Parrot_encoding_number>
+
+=item C<Parrot_encoding_number_of_str>
+
+=item C<Parrot_eprintf>
+
+=item C<Parrot_event_add_io_event>
+
+=item C<Parrot_ex_add_c_handler>
+
+=item C<Parrot_ex_build_exception>
+
+=item C<Parrot_ex_calc_handler_offset>
+
+=item C<Parrot_exit>
+
+=item C<Parrot_ex_mark_unhandled>
+
+=item C<Parrot_ex_rethrow_from_c>
+
+=item C<Parrot_ex_rethrow_from_op>
+
+=item C<Parrot_ex_throw_from_c>
+
+=item C<Parrot_ex_throw_from_c_args>
+
+=item C<Parrot_ex_throw_from_op>
+
+=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_find_global_cur>
+
+=item C<Parrot_find_global_k>
+
+=item C<Parrot_find_global_n>
+
+=item C<Parrot_find_global_op>
+
+=item C<Parrot_find_global_s>
+
+=item C<Parrot_find_language>
+
+=item C<Parrot_find_method_direct>
+
+=item C<Parrot_find_method_with_cache>
+
+=item C<Parrot_find_name_op>
+
+=item C<Parrot_float_rand>
+
+=item C<Parrot_fprintf>
+
+=item C<Parrot_free_context>
+
+=item C<Parrot_free_cstring>
+
+=item C<Parrot_freeze>
+
+=item C<Parrot_freeze_at_destruct>
+
+=item C<Parrot_full_sub_name>
+
+=item C<parrot_gc_context>
+
+=item C<Parrot_gc_gms_init>
+
+=item C<parrot_gc_gms_Parrot_gc_mark_PObj_alive>
+
+=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>
+
+=item C<Parrot_get_datatype_enum>
+
+=item C<Parrot_get_datatype_name>
+
+=item C<Parrot_get_encoding>
+
+=item C<Parrot_get_global>
+
+=item C<Parrot_get_HLL_id>
+
+=item C<Parrot_get_HLL_name>
+
+=item C<Parrot_get_HLL_namespace>
+
+=item C<Parrot_get_HLL_type>
+
+=item C<Parrot_get_intreg>
+
+=item C<Parrot_get_namespace_autobase>
+
+=item C<Parrot_get_namespace_keyed>
+
+=item C<Parrot_get_namespace_keyed_str>
+
+=item C<Parrot_get_numreg>
+
+=item C<Parrot_get_pmcreg>
+
+=item C<Parrot_get_root_namespace>
+
+=item C<Parrot_get_runtime_path>
+
+=item C<Parrot_get_runtime_prefix>
+
+=item C<Parrot_get_strreg>
+
+=item C<Parrot_get_vtable>
+
+=item C<Parrot_get_vtable_index>
+
+=item C<Parrot_get_vtable_name>
+
+=item C<Parrot_init_events>
+
+=item C<Parrot_init_signals>
+
+=item C<Parrot_init_stacktop>
+
+=item C<Parrot_int_rand>
+
+=item C<Parrot_invalidate_method_cache>
+
+=item C<Parrot_io_accept>
+
+=item C<Parrot_io_bind>
+
+=item C<Parrot_io_close>
+
+=item C<Parrot_io_close_filehandle>
+
+=item C<Parrot_io_close_piohandle>
+
+=item C<Parrot_io_connect>
+
+=item C<Parrot_IOData_mark>
+
+=item C<Parrot_io_eof>
+
+=item C<Parrot_io_eprintf>
+
+=item C<Parrot_io_fdopen>
+
+=item C<Parrot_io_finish>
+
+=item C<Parrot_io_flush>
+
+=item C<Parrot_io_flush_filehandle>
+
+=item C<Parrot_io_fprintf>
+
+=item C<Parrot_io_get_buffer_end>
+
+=item C<Parrot_io_get_buffer_next>
+
+=item C<Parrot_io_get_buffer_start>
+
+=item C<Parrot_io_getfd>
+
+=item C<Parrot_io_get_file_position>
+
+=item C<Parrot_io_get_file_size>
+
+=item C<Parrot_io_get_flags>
+
+=item C<Parrot_io_get_last_file_position>
+
+=item C<Parrot_io_get_os_handle>
+
+=item C<Parrot_io_init>
+
+=item C<Parrot_io_is_closed>
+
+=item C<Parrot_io_is_closed_filehandle>
+
+=item C<Parrot_io_is_encoding>
+
+=item C<Parrot_io_is_tty>
+
+=item C<Parrot_io_listen>
+
+=item C<Parrot_io_make_offset>
+
+=item C<Parrot_io_new_pmc>
+
+=item C<Parrot_io_new_socket_pmc>
+
+=item C<Parrot_io_open>
+
+=item C<Parrot_io_parse_open_flags>
+
+=item C<Parrot_io_peek>
+
+=item C<Parrot_io_poll>
+
+=item C<Parrot_io_printf>
+
+=item C<Parrot_io_putps>
+
+=item C<Parrot_io_puts>
+
+=item C<Parrot_io_readline>
+
+=item C<Parrot_io_reads>
+
+=item C<Parrot_io_recv>
+
+=item C<Parrot_io_seek>
+
+=item C<Parrot_io_send>
+
+=item C<Parrot_io_set_file_position>
+
+=item C<Parrot_io_set_file_size>
+
+=item C<Parrot_io_set_flags>
+
+=item C<Parrot_io_set_os_handle>
+
+=item C<Parrot_io_socket>
+
+=item C<Parrot_io_socket_is_closed>
+
+=item C<Parrot_io_STDERR>
+
+=item C<Parrot_io_stdhandle>
+
+=item C<Parrot_io_STDIN>
+
+=item C<Parrot_io_STDOUT>
+
+=item C<Parrot_io_tell>
+
+=item C<Parrot_io_write>
+
+=item C<Parrot_is_blocked_GC_mark>
+
+=item C<Parrot_is_blocked_GC_sweep>
+
+=item C<Parrot_kill_event_loop>
+
+=item C<Parrot_lib_add_path>
+
+=item C<Parrot_lib_add_path_from_cstring>
+
+=item C<Parrot_load_bytecode>
+
+=item C<Parrot_load_charset>
+
+=item C<Parrot_load_encoding>
+
+=item C<Parrot_load_language>
+
+=item C<Parrot_load_lib>
+
+=item C<Parrot_locate_runtime_file>
+
+=item C<Parrot_locate_runtime_file_str>
+
+=item C<Parrot_make_cb>
+
+=item C<Parrot_make_default_charset>
+
+=item C<Parrot_make_default_encoding>
+
+=item C<Parrot_make_namespace_autobase>
+
+=item C<Parrot_make_namespace_keyed>
+
+=item C<Parrot_make_namespace_keyed_str>
+
+=item C<Parrot_mmd_cache_create>
+
+=item C<Parrot_mmd_cache_destroy>
+
+=item C<Parrot_mmd_cache_lookup_by_values>
+
+=item C<Parrot_mmd_cache_mark>
+
+=item C<Parrot_mmd_cache_store_by_values>
+
+=item C<Parrot_new>
+
+=item C<Parrot_new_cb_event>
+
+=item C<Parrot_new_charset>
+
+=item C<Parrot_new_encoding>
+
+=item C<Parrot_new_string>
+
+=item C<Parrot_new_suspend_for_gc_event>
+
+=item C<Parrot_new_terminate_event>
+
+=item C<Parrot_new_timer_event>
+
+=item C<Parrot_ns_get_name>
+
+=item C<Parrot_on_exit>
+
+=item C<Parrot_oo_get_class>
+
+=item C<Parrot_oo_get_class_str>
+
+=item C<Parrot_pbc_load>
+
+=item C<Parrot_pbc_read>
+
+=item C<Parrot_PMC_absolute>
+
+=item C<Parrot_PMC_add>
+
+=item C<Parrot_PMC_add_attribute>
+
+=item C<Parrot_PMC_add_float>
+
+=item C<Parrot_PMC_add_int>
+
+=item C<Parrot_PMC_add_method>
+
+=item C<Parrot_PMC_add_parent>
+
+=item C<Parrot_PMC_add_role>
+
+=item C<Parrot_PMC_add_vtable_override>
+
+=item C<Parrot_PMC_assign_pmc>
+
+=item C<Parrot_PMC_assign_string_native>
+
+=item C<Parrot_PMC_bitwise_and>
+
+=item C<Parrot_PMC_bitwise_and_int>
+
+=item C<Parrot_PMC_bitwise_ands>
+
+=item C<Parrot_PMC_bitwise_ands_str>
+
+=item C<Parrot_PMC_bitwise_lsr>
+
+=item C<Parrot_PMC_bitwise_lsr_int>
+
+=item C<Parrot_PMC_bitwise_not>
+
+=item C<Parrot_PMC_bitwise_nots>
+
+=item C<Parrot_PMC_bitwise_or>
+
+=item C<Parrot_PMC_bitwise_or_int>
+
+=item C<Parrot_PMC_bitwise_ors>
+
+=item C<Parrot_PMC_bitwise_ors_str>
+
+=item C<Parrot_PMC_bitwise_shl>
+
+=item C<Parrot_PMC_bitwise_shl_int>
+
+=item C<Parrot_PMC_bitwise_shr>
+
+=item C<Parrot_PMC_bitwise_shr_int>
+
+=item C<Parrot_PMC_bitwise_xor>
+
+=item C<Parrot_PMC_bitwise_xor_int>
+
+=item C<Parrot_PMC_bitwise_xors>
+
+=item C<Parrot_PMC_bitwise_xors_str>
+
+=item C<Parrot_PMC_can>
+
+=item C<Parrot_PMC_clone>
+
+=item C<Parrot_PMC_clone_pmc>
+
+=item C<Parrot_PMC_cmp>
+
+=item C<Parrot_PMC_cmp_num>
+
+=item C<Parrot_PMC_cmp_pmc>
+
+=item C<Parrot_PMC_cmp_string>
+
+=item C<Parrot_PMC_concatenate>
+
+=item C<Parrot_PMC_concatenate_str>
+
+=item C<Parrot_PMC_decrement>
+
+=item C<Parrot_PMC_defined>
+
+=item C<Parrot_PMC_defined_keyed>
+
+=item C<Parrot_PMC_defined_keyed_int>
+
+=item C<Parrot_PMC_defined_keyed_str>
+
+=item C<Parrot_PMC_delete_keyed>
+
+=item C<Parrot_PMC_delete_keyed_int>
+
+=item C<Parrot_PMC_delete_keyed_str>
+
+=item C<Parrot_PMC_delete_pmckey>
+
+=item C<Parrot_PMC_delprop>
+
+=item C<Parrot_PMC_destroy>
+
+=item C<Parrot_PMC_divide>
+
+=item C<Parrot_PMC_divide_float>
+
+=item C<Parrot_PMC_divide_int>
+
+=item C<Parrot_PMC_does>
+
+=item C<Parrot_PMC_does_pmc>
+
+=item C<Parrot_PMC_elements>
+
+=item C<Parrot_PMC_exists_keyed>
+
+=item C<Parrot_PMC_exists_keyed_int>
+
+=item C<Parrot_PMC_exists_keyed_str>
+
+=item C<Parrot_PMC_find_method>
+
+=item C<Parrot_PMC_floor_divide>
+
+=item C<Parrot_PMC_floor_divide_float>
+
+=item C<Parrot_PMC_floor_divide_int>
+
+=item C<Parrot_PMC_get_attr_keyed>
+
+=item C<Parrot_PMC_get_attr_str>
+
+=item C<Parrot_PMC_get_bignum>
+
+=item C<Parrot_PMC_get_bool>
+
+=item C<Parrot_PMC_get_class>
+
+=item C<Parrot_PMC_get_cstring>
+
+=item C<Parrot_PMC_get_cstring_intkey>
+
+=item C<Parrot_PMC_get_cstringn>
+
+=item C<Parrot_PMC_get_cstringn_intkey>
+
+=item C<Parrot_PMC_get_integer>
+
+=item C<Parrot_PMC_get_integer_keyed>
+
+=item C<Parrot_PMC_get_integer_keyed_int>
+
+=item C<Parrot_PMC_get_integer_keyed_str>
+
+=item C<Parrot_PMC_get_intval>
+
+=item C<Parrot_PMC_get_intval_intkey>
+
+=item C<Parrot_PMC_get_intval_pmckey>
+
+=item C<Parrot_PMC_get_iter>
+
+=item C<Parrot_PMC_get_namespace>
+
+=item C<Parrot_PMC_get_number>
+
+=item C<Parrot_PMC_get_number_keyed>
+
+=item C<Parrot_PMC_get_number_keyed_int>
+
+=item C<Parrot_PMC_get_number_keyed_str>
+
+=item C<Parrot_PMC_get_numval>
+
+=item C<Parrot_PMC_get_numval_intkey>
+
+=item C<Parrot_PMC_get_pmc>
+
+=item C<Parrot_PMC_get_pmc_intkey>
+
+=item C<Parrot_PMC_get_pmc_keyed>
+
+=item C<Parrot_PMC_get_pmc_keyed_int>
+
+=item C<Parrot_PMC_get_pmc_keyed_str>
+
+=item C<Parrot_PMC_get_pmc_strkey>
+
+=item C<Parrot_PMC_get_pointer>
+
+=item C<Parrot_PMC_get_pointer_intkey>
+
+=item C<Parrot_PMC_get_pointer_keyed>
+
+=item C<Parrot_PMC_get_pointer_keyed_int>
+
+=item C<Parrot_PMC_get_pointer_keyed_str>
+
+=item C<Parrot_PMC_getprop>
+
+=item C<Parrot_PMC_getprops>
+
+=item C<Parrot_PMC_get_repr>
+
+=item C<Parrot_PMC_get_string>
+
+=item C<Parrot_PMC_get_string_intkey>
+
+=item C<Parrot_PMC_get_string_keyed>
+
+=item C<Parrot_PMC_get_string_keyed_int>
+
+=item C<Parrot_PMC_get_string_keyed_str>
+
+=item C<Parrot_PMC_i_absolute>
+
+=item C<Parrot_PMC_i_add>
+
+=item C<Parrot_PMC_i_add_float>
+
+=item C<Parrot_PMC_i_add_int>
+
+=item C<Parrot_PMC_i_bitwise_and>
+
+=item C<Parrot_PMC_i_bitwise_and_int>
+
+=item C<Parrot_PMC_i_bitwise_ands>
+
+=item C<Parrot_PMC_i_bitwise_ands_str>
+
+=item C<Parrot_PMC_i_bitwise_lsr>
+
+=item C<Parrot_PMC_i_bitwise_lsr_int>
+
+=item C<Parrot_PMC_i_bitwise_not>
+
+=item C<Parrot_PMC_i_bitwise_nots>
+
+=item C<Parrot_PMC_i_bitwise_or>
+
+=item C<Parrot_PMC_i_bitwise_or_int>
+
+=item C<Parrot_PMC_i_bitwise_ors>
+
+=item C<Parrot_PMC_i_bitwise_ors_str>
+
+=item C<Parrot_PMC_i_bitwise_shl>
+
+=item C<Parrot_PMC_i_bitwise_shl_int>
+
+=item C<Parrot_PMC_i_bitwise_shr>
+
+=item C<Parrot_PMC_i_bitwise_shr_int>
+
+=item C<Parrot_PMC_i_bitwise_xor>
+
+=item C<Parrot_PMC_i_bitwise_xor_int>
+
+=item C<Parrot_PMC_i_bitwise_xors>
+
+=item C<Parrot_PMC_i_bitwise_xors_str>
+
+=item C<Parrot_PMC_i_concatenate>
+
+=item C<Parrot_PMC_i_concatenate_str>
+
+=item C<Parrot_PMC_i_divide>
+
+=item C<Parrot_PMC_i_divide_float>
+
+=item C<Parrot_PMC_i_divide_int>
+
+=item C<Parrot_PMC_i_floor_divide>
+
+=item C<Parrot_PMC_i_floor_divide_float>
+
+=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>
+
+=item C<Parrot_PMC_i_modulus_int>
+
+=item C<Parrot_PMC_i_multiply>
+
+=item C<Parrot_PMC_i_multiply_float>
+
+=item C<Parrot_PMC_i_multiply_int>
+
+=item C<Parrot_PMC_increment>
+
+=item C<Parrot_PMC_i_neg>
+
+=item C<Parrot_PMC_init>
+
+=item C<Parrot_PMC_init_pmc>
+
+=item C<Parrot_PMC_inspect>
+
+=item C<Parrot_PMC_inspect_str>
+
+=item C<Parrot_PMC_instantiate>
+
+=item C<Parrot_PMC_instantiate_str>
+
+=item C<Parrot_PMC_invoke>
+
+=item C<Parrot_PMC_i_pow>
+
+=item C<Parrot_PMC_i_pow_float>
+
+=item C<Parrot_PMC_i_pow_int>
+
+=item C<Parrot_PMC_i_repeat>
+
+=item C<Parrot_PMC_i_repeat_int>
+
+=item C<Parrot_PMC_isa>
+
+=item C<Parrot_PMC_isa_pmc>
+
+=item C<Parrot_PMC_is_equal>
+
+=item C<Parrot_PMC_is_equal_num>
+
+=item C<Parrot_PMC_is_equal_string>
+
+=item C<Parrot_PMC_is_same>
+
+=item C<Parrot_PMC_i_subtract>
+
+=item C<Parrot_PMC_i_subtract_float>
+
+=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>
+
+=item C<Parrot_PMC_modulus_float>
+
+=item C<Parrot_PMC_modulus_int>
+
+=item C<Parrot_PMC_morph>
+
+=item C<Parrot_PMC_multiply>
+
+=item C<Parrot_PMC_multiply_float>
+
+=item C<Parrot_PMC_multiply_int>
+
+=item C<Parrot_PMC_name>
+
+=item C<Parrot_PMC_neg>
+
+=item C<Parrot_PMC_new>
+
+=item C<Parrot_PMC_newclass>
+
+=item C<Parrot_PMC_null>
+
+=item C<Parrot_PMC_pop_float>
+
+=item C<Parrot_PMC_pop_integer>
+
+=item C<Parrot_PMC_pop_pmc>
+
+=item C<Parrot_PMC_pop_string>
+
+=item C<Parrot_PMC_pow>
+
+=item C<Parrot_PMC_pow_float>
+
+=item C<Parrot_PMC_pow_int>
+
+=item C<Parrot_PMC_push_float>
+
+=item C<Parrot_PMC_push_integer>
+
+=item C<Parrot_PMC_push_intval>
+
+=item C<Parrot_PMC_push_numval>
+
+=item C<Parrot_PMC_push_pmc>
+
+=item C<Parrot_PMC_push_pmcval>
+
+=item C<Parrot_PMC_push_string>
+
+=item C<Parrot_PMC_remove_attribute>
+
+=item C<Parrot_PMC_remove_method>
+
+=item C<Parrot_PMC_remove_parent>
+
+=item C<Parrot_PMC_remove_role>
+
+=item C<Parrot_PMC_remove_vtable_override>
+
+=item C<Parrot_PMC_repeat>
+
+=item C<Parrot_PMC_repeat_int>
+
+=item C<Parrot_PMC_set_attr_keyed>
+
+=item C<Parrot_PMC_set_attr_str>
+
+=item C<Parrot_PMC_set_bignum_int>
+
+=item C<Parrot_PMC_set_bignum_num>
+
+=item C<Parrot_PMC_set_bignum_str>
+
+=item C<Parrot_PMC_set_bool>
+
+=item C<Parrot_PMC_set_cstring>
+
+=item C<Parrot_PMC_set_cstring_intkey>
+
+=item C<Parrot_PMC_set_cstringn>
+
+=item C<Parrot_PMC_set_cstringn_intkey>
+
+=item C<Parrot_PMC_set_integer_keyed>
+
+=item C<Parrot_PMC_set_integer_keyed_int>
+
+=item C<Parrot_PMC_set_integer_keyed_str>
+
+=item C<Parrot_PMC_set_integer_native>
+
+=item C<Parrot_PMC_set_integer_same>
+
+=item C<Parrot_PMC_set_intval>
+
+=item C<Parrot_PMC_set_intval_intkey>
+
+=item C<Parrot_PMC_set_number_keyed>
+
+=item C<Parrot_PMC_set_number_keyed_int>
+
+=item C<Parrot_PMC_set_number_keyed_str>
+
+=item C<Parrot_PMC_set_number_native>
+
+=item C<Parrot_PMC_set_number_same>
+
+=item C<Parrot_PMC_set_numval>
+
+=item C<Parrot_PMC_set_numval_intkey>
+
+=item C<Parrot_PMC_set_pmc>
+
+=item C<Parrot_PMC_set_pmc_intkey>
+
+=item C<Parrot_PMC_set_pmc_keyed>
+
+=item C<Parrot_PMC_set_pmc_keyed_int>
+
+=item C<Parrot_PMC_set_pmc_keyed_str>
+
+=item C<Parrot_PMC_set_pmc_pmckey>
+
+=item C<Parrot_PMC_set_pmc_strkey>
+
+=item C<Parrot_PMC_set_pointer>
+
+=item C<Parrot_PMC_set_pointer_intkey>
+
+=item C<Parrot_PMC_set_pointer_keyed>
+
+=item C<Parrot_PMC_set_pointer_keyed_int>
+
+=item C<Parrot_PMC_set_pointer_keyed_str>
+
+=item C<Parrot_PMC_setprop>
+
+=item C<Parrot_PMC_set_string>
+
+=item C<Parrot_PMC_set_string_intkey>
+
+=item C<Parrot_PMC_set_string_keyed>
+
+=item C<Parrot_PMC_set_string_keyed_int>
+
+=item C<Parrot_PMC_set_string_keyed_str>
+
+=item C<Parrot_PMC_set_string_native>
+
+=item C<Parrot_PMC_set_string_same>
+
+=item C<Parrot_PMC_set_vtable>
+
+=item C<Parrot_PMC_share>
+
+=item C<Parrot_PMC_share_ro>
+
+=item C<Parrot_PMC_shift_float>
+
+=item C<Parrot_PMC_shift_integer>
+
+=item C<Parrot_PMC_shift_pmc>
+
+=item C<Parrot_PMC_shift_string>
+
+=item C<Parrot_PMC_slice>
+
+=item C<Parrot_PMC_splice>
+
+=item C<Parrot_PMC_substr>
+
+=item C<Parrot_PMC_substr_str>
+
+=item C<Parrot_PMC_subtract>
+
+=item C<Parrot_PMC_subtract_float>
+
+=item C<Parrot_PMC_subtract_int>
+
+=item C<Parrot_PMC_type_keyed>
+
+=item C<Parrot_PMC_typenum>
+
+=item C<Parrot_PMC_unshift_float>
+
+=item C<Parrot_PMC_unshift_integer>
+
+=item C<Parrot_PMC_unshift_pmc>
+
+=item C<Parrot_PMC_unshift_string>
+
+=item C<Parrot_pop_context>
+
+=item C<Parrot_pop_mark>
+
+=item C<Parrot_printf>
+
+=item C<Parrot_psprintf>
+
+=item C<Parrot_push_action>
+
+=item C<Parrot_push_context>
+
+=item C<Parrot_push_mark>
+
+=item C<Parrot_range_rand>
+
+=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>
+
+=item C<Parrot_register_HLL_lib>
+
+=item C<Parrot_register_HLL_type>
+
+=item C<Parrot_register_move>
+
+=item C<Parrot_register_pmc>
+
+=item C<Parrot_run_callback>
+
+=item C<Parrot_runcode>
+
+=item C<Parrot_run_meth_fromc>
+
+=item C<Parrot_run_meth_fromc_arglist>
+
+=item C<Parrot_run_meth_fromc_arglist_retf>
+
+=item C<Parrot_run_meth_fromc_arglist_reti>
+
+=item C<Parrot_run_meth_fromc_args>
+
+=item C<Parrot_run_meth_fromc_args_retf>
+
+=item C<Parrot_run_meth_fromc_args_reti>
+
+=item C<Parrot_run_native>
+
+=item C<Parrot_runops_fromc>
+
+=item C<Parrot_runops_fromc_arglist>
+
+=item C<Parrot_runops_fromc_arglist_retf>
+
+=item C<Parrot_runops_fromc_arglist_reti>
+
+=item C<Parrot_runops_fromc_args>
+
+=item C<Parrot_runops_fromc_args_event>
+
+=item C<Parrot_runops_fromc_args_retf>
+
+=item C<Parrot_runops_fromc_args_reti>
+
+=item C<Parrot_schedule_event>
+
+=item C<Parrot_schedule_interp_qentry>
+
+=item C<Parrot_secret_snprintf>
+
+=item C<Parrot_set_config_hash_internal>
+
+=item C<Parrot_set_context_threshold>
+
+=item C<Parrot_set_debug>
+
+=item C<Parrot_set_executable_name>
+
+=item C<Parrot_set_flag>
+
+=item C<Parrot_set_global>
+
+=item C<Parrot_set_intreg>
+
+=item C<Parrot_set_numreg>
+
+=item C<Parrot_set_pmcreg>
+
+=item C<Parrot_set_run_core>
+
+=item C<Parrot_set_strreg>
+
+=item C<Parrot_set_trace>
+
+=item C<Parrot_setwarnings>
+
+=item C<Parrot_shared_gc_block>
+
+=item C<Parrot_shared_gc_unblock>
+
+=item C<Parrot_sleep_on_event>
+
+=item C<Parrot_snprintf>
+
+=item C<Parrot_sprintf_c>
+
+=item C<Parrot_sprintf_s>
+
+=item C<Parrot_srand>
+
+=item C<Parrot_store_global_n>
+
+=item C<Parrot_store_global_s>
+
+=item C<Parrot_store_sub_in_namespace>
+
+=item C<Parrot_str_append>
+
+=item C<Parrot_str_bitwise_and>
+
+=item C<Parrot_str_bitwise_not>
+
+=item C<Parrot_str_bitwise_or>
+
+=item C<Parrot_str_bitwise_xor>
+
+=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>
+
+=item C<Parrot_str_concat>
+
+=item C<Parrot_str_copy>
+
+=item C<Parrot_str_downcase>
+
+=item C<Parrot_str_downcase_inplace>
+
+=item C<Parrot_str_equal>
+
+=item C<Parrot_str_escape>
+
+=item C<Parrot_str_escape_truncate>
+
+=item C<Parrot_str_find_cclass>
+
+=item C<Parrot_str_find_index>
+
+=item C<Parrot_str_find_not_cclass>
+
+=item C<Parrot_str_finish>
+
+=item C<Parrot_str_format_data>
+
+=item C<Parrot_str_free_cstring>
+
+=item C<Parrot_str_from_int>
+
+=item C<Parrot_str_from_num>
+
+=item C<Parrot_str_indexed>
+
+=item C<Parrot_string_cstring>
+
+=item C<Parrot_str_init>
+
+=item C<Parrot_str_is_cclass>
+
+=item C<Parrot_str_join>
+
+=item C<Parrot_str_length>
+
+=item C<Parrot_str_new>
+
+=item C<Parrot_str_new_constant>
+
+=item C<Parrot_str_new_COW>
+
+=item C<Parrot_str_new_init>
+
+=item C<Parrot_str_new_noinit>
+
+=item C<Parrot_str_not_equal>
+
+=item C<Parrot_str_pin>
+
+=item C<Parrot_str_repeat>
+
+=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>
+
+=item C<Parrot_str_to_int>
+
+=item C<Parrot_str_to_num>
+
+=item C<Parrot_str_unescape>
+
+=item C<Parrot_str_unpin>
+
+=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>
+
+=item C<Parrot_test_flag>
+
+=item C<Parrot_test_trace>
+
+=item C<Parrot_thaw>
+
+=item C<Parrot_thaw_constants>
+
+=item C<Parrot_uint_rand>
+
+=item C<Parrot_unblock_GC_mark>
+
+=item C<Parrot_unblock_GC_sweep>
+
+=item C<Parrot_unregister_pmc>
+
+=item C<Parrot_vfprintf>
+
+=item C<Parrot_vsnprintf>
+
+=item C<Parrot_vsprintf_c>
+
+=item C<Parrot_vsprintf_s>
+
+=item C<Parrot_warn>
+
+=item C<PMC_is_null>
+
+=item C<pmc_new>
+
+=item C<pmc_type>
+
+=item C<PObj_active_destroy_SET>
+
+=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>
+
+=back
+
 =head1 SEE ALSO
 
 F<src/main.c> and F<t/src/*.t> for Parrot's use of the embedding system.

Modified: branches/ops_pct/docs/parrothist.pod
==============================================================================
--- branches/ops_pct/docs/parrothist.pod	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/docs/parrothist.pod	Fri Jul 24 19:42:02 2009	(r40257)
@@ -93,4 +93,6 @@
  Infinoid    1.2.0          2009-May-19     "Bird Brain"
  Whiteknight 1.3.0          2009-Jun-16     "Andean Swift"
 
+ cotto       1.4.0          2009-Jul-21     "Mundo Cani"
+
 =cut

Modified: branches/ops_pct/docs/pdds/pdd17_pmc.pod
==============================================================================
--- branches/ops_pct/docs/pdds/pdd17_pmc.pod	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/docs/pdds/pdd17_pmc.pod	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1062,15 +1062,6 @@
 
 Delete the element indexed by a PMC, integer, or string key.
 
-=item nextkey_keyed
-
-  PMC* nextkey_keyed(INTERP, PMC *self, PMC *key, INTVAL what)
-  PMC* nextkey_keyed_int(INTERP, PMC *self, INTVAL key, INTVAL what)
-  PMC* nextkey_keyed_str(INTERP, PMC *self, STRING *key, INTVAL what)
-
-Advance to the next position while iterating through an aggregate. [NOTE: this
-feature needs review together with the Iterator PMC.]
-
 =back
 
 =head4 Math Vtable Functions

Modified: branches/ops_pct/docs/pdds/pdd22_io.pod
==============================================================================
--- branches/ops_pct/docs/pdds/pdd22_io.pod	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/docs/pdds/pdd22_io.pod	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1053,12 +1053,12 @@
 
 =head2 References
 
-  F<src/io/io.c>
+  F<src/io/core.c>
   F<src/ops/io.ops>
   F<include/parrot/io.h>
   F<runtime/parrot/library/Stream/*>
-  F<src/io/io_unix.c>
-  F<src/io/io_win32.c>
+  F<src/io/unix.c>
+  F<src/io/win32.c>
   Perl 5's IO::AIO
   Perl 5's POE
 

Modified: branches/ops_pct/docs/pdds/pdd28_strings.pod
==============================================================================
--- branches/ops_pct/docs/pdds/pdd28_strings.pod	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/docs/pdds/pdd28_strings.pod	Fri Jul 24 19:42:02 2009	(r40257)
@@ -575,10 +575,6 @@
 Terminate and clean up Parrot's string subsystem, including string allocation
 and garbage collection.
 
-=head4 Parrot_str_free (was string_free)
-
-Free the string's header.
-
 =head4 string_max_bytes
 
 Calculate the number of bytes needed to hold a given number of characters in a
@@ -642,6 +638,10 @@
 
 Is the same as Parrot_str_split.
 
+=head4 Parrot_str_free (was string_free)
+
+Unsafe and unuseful, let the garbage collector take care.
+
 =head3 String PMC API
 
 The String PMC provides a high-level object interface to the string

Modified: branches/ops_pct/docs/pdds/pdd30_install.pod
==============================================================================
--- branches/ops_pct/docs/pdds/pdd30_install.pod	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/docs/pdds/pdd30_install.pod	Fri Jul 24 19:42:02 2009	(r40257)
@@ -99,12 +99,20 @@
 formatted HTML. Has subdirectories for each format of documentation:
 F<pod/>, F<html/>, etc.
 
+=item F</usr/include/parrot/E<lt>versionE<gt>/>
+
+C header files for Parrot.  
+
+=item F</usr/src/parrot/E<lt>versionE<gt>/>
+
+PMC source files needed for building dynamic PMCs.  
+
 =back
 
 =head2 Dependencies
 
-Building core Parrot depends on Perl (including perldoc, which may be a
-separate package), libgdm and libreadline.
+Building core Parrot depends on Perl (including F<perldoc>, which may be a
+separate package), F<libgdm> and F<libreadline>.
 
 Building a language depends on a series of Parrot build tools, installed in
 F</usr/lib/parrot/E<lt>version/tools>. These tools will generally not be
@@ -144,6 +152,15 @@
 converted to C<\r\n> for MSWin32 nmake. See
 L<Parrot::Configure::Compiler>.
 
+=head3 Packaging and Distribution
+
+Each language, operating system, or distribution is free to package
+modules in their own way, using their own usual build and install tools.
+The default distribution format is a tarball containing the source files
+and a cross-platform build infrastructure (the 'make' variants are a
+good choice, and can be combined with Autoconf, CMake, Perl, Python,
+etc. for more complex conditional builds).
+
 =head2 Attachments
 
 None.

Modified: branches/ops_pct/docs/project/release_manager_guide.pod
==============================================================================
--- branches/ops_pct/docs/project/release_manager_guide.pod	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/docs/project/release_manager_guide.pod	Fri Jul 24 19:42:02 2009	(r40257)
@@ -125,6 +125,9 @@
 policy. (Those changes are all included within the major version number
 increase for the supported release.)
 
+Once you've updated PBC_COMPAT, run C<tools/dev/mk_native_pbc> to update the
+pbc files used in the native pbc tests.
+
 =item h
 
 Make sure everything works:
@@ -361,7 +364,6 @@
 The starred releases are Parrot's twice-yearly supported releases, see
 F<docs/project/support_policy.pod>.
 
- - July 21, 2009     - 1.4* - cotto
  - August 18, 2009   - 1.5  - rgrjr
  - Sept 15, 2009     - 1.6  - particle
  - Oct 20, 2009      - 1.7  -

Modified: branches/ops_pct/editor/skeleton.pir
==============================================================================
--- branches/ops_pct/editor/skeleton.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/editor/skeleton.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,7 +1,7 @@
 # Copyright (C) 2006-2009, Parrot Foundation.
 # $Id$
 
-.sub main :main
+.sub 'main' :main
 .end
 
 # Local Variables:

Modified: branches/ops_pct/examples/benchmarks/overload.pir
==============================================================================
--- branches/ops_pct/examples/benchmarks/overload.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/benchmarks/overload.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,7 +3,6 @@
 
 .sub bench :main
 .include "pmctypes.pasm"
-.include "mmd.pasm"
    .local int i
    .local pmc r
    .local pmc a

Copied: branches/ops_pct/examples/c/pbc_info.c (from r40255, trunk/examples/c/pbc_info.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/examples/c/pbc_info.c	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/examples/c/pbc_info.c)
@@ -0,0 +1,112 @@
+/*
+Copyright (C) 2001-2003, Parrot Foundation.
+$Id$
+
+=head1 NAME
+
+pbc_info - PackFile demo
+
+=head1 SYNOPSIS
+
+ pbc_info file.pbc
+
+=head1 DESCRIPTION
+
+Sample program for dumping PackFile segment names by iterating
+over the main directory.
+
+=head2 Functions
+
+=over 4
+
+=cut
+
+*/
+
+#include "parrot/parrot.h"
+#include "parrot/embed.h"
+
+/*
+
+=item C<static INTVAL iter(PARROT_INTERP, PackFile_Segment *seg, void *user_data)>
+
+This function is passed the callback to PackFile_map_segments() to print out
+the name of each segment in the directory.
+
+=cut
+
+*/
+
+static INTVAL
+iter(PARROT_INTERP, PackFile_Segment *seg, void *user_data)
+{
+    long ident = (long)user_data;
+    int length = ident;
+    printf("%*.0s%s\n", length, "", seg->name);
+    if (seg->type == PF_DIR_SEG)
+        PackFile_map_segments(interp, (PackFile_Directory*)seg,
+                iter, (void*)(ident+2));
+    return 0;
+}
+
+/*
+
+=item C<int main(int argc, char *argv[])>
+
+Reads the PBC from argv[1], adds a few extra sections, and then iterates over
+the directory using PackFile_map_segments() and iter().
+
+=cut
+
+*/
+
+int
+main(SHIM(int argc), char *argv[])
+{
+    PackFile *pf;
+    Interp *interp;
+    PackFile_Segment *seg;
+
+    interp = Parrot_new(NULL);
+
+    pf = Parrot_pbc_read(interp, argv[1], PFOPT_UTILS);
+
+    /*
+     * add some more segments
+     */
+    seg = PackFile_Segment_new_seg(interp,
+                    &pf->directory, PF_DIR_SEG, "dir2", 1);
+    seg = PackFile_Segment_new_seg(interp,
+                    (PackFile_Directory*)seg, PF_BYTEC_SEG, "code", 1);
+    seg = PackFile_Segment_new_seg(interp,
+                    &pf->directory, PF_DIR_SEG, "dir3", 1);
+
+    /*
+     * show these
+     */
+    printf("%s\n", pf->directory.base.name);
+    PackFile_map_segments(interp, &pf->directory, iter, (void*)2);
+
+    Parrot_exit(interp, 0);
+}
+
+/*
+
+=back
+
+=head1 SEE ALSO
+
+F<src/packfile.c>, F<include/parrot/packfile.h>.
+
+=cut
+
+*/
+
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */
+

Modified: branches/ops_pct/examples/json/postalcodes.pir
==============================================================================
--- branches/ops_pct/examples/json/postalcodes.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/json/postalcodes.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -78,12 +78,12 @@
     unless null $P3 goto bad_code
 
     $P2 = $P2['postalCodes']
-    .local pmc iter, code
-    iter = new 'Iterator', $P2
+    .local pmc it, code
+    it = iter $P2
 
  code_loop:
     push_eh code_end
-      code = shift iter
+      code = shift it
     pop_eh
     unless code goto code_end
 

Modified: branches/ops_pct/examples/languages/squaak/src/builtins/say.pir
==============================================================================
--- branches/ops_pct/examples/languages/squaak/src/builtins/say.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/languages/squaak/src/builtins/say.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -12,11 +12,11 @@
 
 .sub 'print'
     .param pmc args            :slurpy
-    .local pmc iter
-    iter = new 'Iterator', args
+    .local pmc it
+    it = iter args
   iter_loop:
-    unless iter goto iter_end
-    $P0 = shift iter
+    unless it goto iter_end
+    $P0 = shift it
     print $P0
     goto iter_loop
   iter_end:

Modified: branches/ops_pct/examples/library/ncurses_life.pir
==============================================================================
--- branches/ops_pct/examples/library/ncurses_life.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/library/ncurses_life.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -884,7 +884,8 @@
 =head1 SEE ALSO
 
 F<examples/library/acorn.life>, F<examples/pasm/life.pasm>,
-F<library/ncurses.pasm>, F<library/ncurses.declarations>.
+F<runtime/parrot/library/ncurses.pasm>,
+F<runtime/parrot/library/ncurses.declarations>.
 
 =head1 NOTE
 

Copied: branches/ops_pct/examples/opengl/static-triangle-hll.pir (from r40255, trunk/examples/opengl/static-triangle-hll.pir)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/examples/opengl/static-triangle-hll.pir	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/examples/opengl/static-triangle-hll.pir)
@@ -0,0 +1,92 @@
+# Copyright (C) 2006-2009, Parrot Foundation.
+# $Id$
+
+=head1 TITLE
+
+static-triangle-hll.pir - Minimal OpenGL/GLUT setup and render for NCI tests
+
+=head1 SYNOPSIS
+
+    $ cd parrot-home
+    $ ./parrot examples/opengl/static-triangle-hll.pir
+
+=head1 DESCRIPTION
+
+This is a version of F<static-triangle.pir>, to examplify and test usage
+from HLLs.
+
+To quit the example, close the window using your window manager (using
+the X in the corner of the window title bar, for example), since all
+keyboard handling has been removed.
+
+=cut
+
+
+.include 'opengl_defines.pasm'
+
+.HLL 'somelanguage'
+
+.sub main :main
+    .param pmc argv
+
+    # Load OpenGL libary and a helper library for calling glutInit
+    load_bytecode 'OpenGL.pbc'
+    load_bytecode 'NCI/Utils.pbc'
+
+    # Import all OpenGL/GLU/GLUT functions to current namespace
+    # (in this example, the HLL namespace).
+    .local pmc import_gl
+    import_gl = get_root_global ['parrot';'OpenGL'], '_export_all_functions'
+    import_gl()
+
+    # Initialize GLUT
+    .local pmc call_toolkit_init
+    call_toolkit_init = get_root_global ['parrot';'NCI'; 'Utils'], 'call_toolkit_init'
+
+    .const 'Sub' glutInit = 'glutInit'
+    argv = call_toolkit_init(glutInit, argv)
+
+    # Set display mode, create GLUT window, save window handle
+    .local int mode
+    mode = .GLUT_DOUBLE | .GLUT_RGBA
+    glutInitDisplayMode(mode)
+
+    .local pmc window
+    window = new 'Integer'
+    window = glutCreateWindow('Static Triangle NCI Test')
+    set_global 'glut_window', window
+
+    # Set up GLUT callbacks
+    .const 'Sub' draw     = 'draw'
+    glutDisplayFunc (draw)
+
+    # Enter the GLUT main loop
+    glutMainLoop()
+.end
+
+.sub draw
+    .local int buffers
+    buffers = .GL_COLOR_BUFFER_BIT | .GL_DEPTH_BUFFER_BIT
+    glClear(buffers)
+
+    glBegin(.GL_TRIANGLES)
+
+    glColor3d(1,0,0)
+    glVertex3f(-1, -1, 0)
+
+    glColor3d(0, 1, 0)
+    glVertex3f(1, -1, 0)
+
+    glColor3d(0, 0, 1)
+    glVertex3f(0, 1, 0)
+
+    glEnd()
+
+    glutSwapBuffers()
+.end
+
+# Local Variables:
+#   mode: pir
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4 ft=pir:

Modified: branches/ops_pct/examples/past/01-sub.pir
==============================================================================
--- branches/ops_pct/examples/past/01-sub.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/past/01-sub.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -100,11 +100,11 @@
 .sub 'say'
     .param pmc args :slurpy
     if null args goto end
-    .local pmc iter
-    iter = new 'Iterator', args
+    .local pmc it
+    it = iter args
   loop:
-    unless iter goto end
-    $P0 = shift iter
+    unless it goto end
+    $P0 = shift it
     print $P0
     goto loop
   end:

Modified: branches/ops_pct/examples/past/four_plus_one.pir
==============================================================================
--- branches/ops_pct/examples/past/four_plus_one.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/past/four_plus_one.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -116,11 +116,11 @@
 .sub 'say'
     .param pmc args :slurpy
     if null args goto end
-    .local pmc iter
-    iter = new 'Iterator', args
+    .local pmc it
+    it = iter args
   loop:
-    unless iter goto end
-    $P0 = shift iter
+    unless it goto end
+    $P0 = shift it
     print $P0
     goto loop
   end:

Modified: branches/ops_pct/examples/pir/pirric.pir
==============================================================================
--- branches/ops_pct/examples/pir/pirric.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/pir/pirric.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -2452,7 +2452,7 @@
 .sub begin :method
     .local pmc text
     text = getattribute self, 'lines'
-    new $P0, 'Iterator', text
+    iter $P0, text
     set $P0, .ITERATE_FROM_START
     .return($P0)
 .end

Modified: branches/ops_pct/examples/pir/quine_ord.pir
==============================================================================
--- branches/ops_pct/examples/pir/quine_ord.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/pir/quine_ord.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -2171,8 +2171,6 @@
 push code_as_data, 32
 push code_as_data, 105
 push code_as_data, 116
-push code_as_data, 101
-push code_as_data, 114
 push code_as_data, 10
 push code_as_data, 32
 push code_as_data, 32
@@ -2203,26 +2201,13 @@
 push code_as_data, 32
 push code_as_data, 105
 push code_as_data, 116
-push code_as_data, 101
-push code_as_data, 114
 push code_as_data, 32
 push code_as_data, 61
 push code_as_data, 32
-push code_as_data, 110
-push code_as_data, 101
-push code_as_data, 119
-push code_as_data, 32
-push code_as_data, 39
-push code_as_data, 73
+push code_as_data, 105
 push code_as_data, 116
 push code_as_data, 101
 push code_as_data, 114
-push code_as_data, 97
-push code_as_data, 116
-push code_as_data, 111
-push code_as_data, 114
-push code_as_data, 39
-push code_as_data, 44
 push code_as_data, 32
 push code_as_data, 100
 push code_as_data, 97
@@ -2235,8 +2220,6 @@
 push code_as_data, 32
 push code_as_data, 105
 push code_as_data, 116
-push code_as_data, 101
-push code_as_data, 114
 push code_as_data, 32
 push code_as_data, 61
 push code_as_data, 32
@@ -2321,8 +2304,6 @@
 push code_as_data, 32
 push code_as_data, 105
 push code_as_data, 116
-push code_as_data, 101
-push code_as_data, 114
 push code_as_data, 32
 push code_as_data, 103
 push code_as_data, 111
@@ -2395,8 +2376,6 @@
 push code_as_data, 32
 push code_as_data, 105
 push code_as_data, 116
-push code_as_data, 101
-push code_as_data, 114
 push code_as_data, 32
 push code_as_data, 32
 push code_as_data, 32
@@ -2630,8 +2609,6 @@
 push code_as_data, 32
 push code_as_data, 105
 push code_as_data, 116
-push code_as_data, 101
-push code_as_data, 114
 push code_as_data, 10
 push code_as_data, 32
 push code_as_data, 32
@@ -2639,26 +2616,13 @@
 push code_as_data, 32
 push code_as_data, 105
 push code_as_data, 116
-push code_as_data, 101
-push code_as_data, 114
 push code_as_data, 32
 push code_as_data, 61
 push code_as_data, 32
-push code_as_data, 110
-push code_as_data, 101
-push code_as_data, 119
-push code_as_data, 32
-push code_as_data, 39
-push code_as_data, 73
+push code_as_data, 105
 push code_as_data, 116
 push code_as_data, 101
 push code_as_data, 114
-push code_as_data, 97
-push code_as_data, 116
-push code_as_data, 111
-push code_as_data, 114
-push code_as_data, 39
-push code_as_data, 44
 push code_as_data, 32
 push code_as_data, 100
 push code_as_data, 97
@@ -2671,8 +2635,6 @@
 push code_as_data, 32
 push code_as_data, 105
 push code_as_data, 116
-push code_as_data, 101
-push code_as_data, 114
 push code_as_data, 32
 push code_as_data, 61
 push code_as_data, 32
@@ -2814,8 +2776,6 @@
 push code_as_data, 32
 push code_as_data, 105
 push code_as_data, 116
-push code_as_data, 101
-push code_as_data, 114
 push code_as_data, 32
 push code_as_data, 103
 push code_as_data, 111
@@ -2888,8 +2848,6 @@
 push code_as_data, 32
 push code_as_data, 105
 push code_as_data, 116
-push code_as_data, 101
-push code_as_data, 114
 push code_as_data, 32
 push code_as_data, 32
 push code_as_data, 32
@@ -3622,14 +3580,14 @@
     .param pmc data
 
    .include "iterator.pasm"
-   .local pmc iter
+   .local pmc it
    .local int char_int
 
-   iter = new 'Iterator', data
-    iter = .ITERATE_FROM_START # reset iterator, begin at start
+   it = iter data
+    it = .ITERATE_FROM_START # reset iterator, begin at start
     ITER_LOOP:
-    unless iter goto ITER_END         # while (entries) ...
-        char_int = shift iter         # get entry
+    unless it goto ITER_END         # while (entries) ...
+        char_int = shift it         # get entry
         print 'push code_as_data, '
         print char_int
         print "\n"
@@ -3643,16 +3601,16 @@
 
    .include "iterator.pasm"
 
-   .local pmc iter
-    iter = new 'Iterator', data
-    iter = .ITERATE_FROM_START # reset iterator, begin at start
+   .local pmc it
+    it = iter data
+    it = .ITERATE_FROM_START # reset iterator, begin at start
 
    .local int    char_int
    .local string char_string
 
     ITER_LOOP:
-    unless iter goto ITER_END         # while (entries) ...
-        char_int = shift iter         # get entry
+    unless it goto ITER_END         # while (entries) ...
+        char_int = shift it         # get entry
         char_string = chr char_int
         print char_string
         goto ITER_LOOP

Modified: branches/ops_pct/examples/pir/sudoku.pir
==============================================================================
--- branches/ops_pct/examples/pir/sudoku.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/pir/sudoku.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -339,7 +339,7 @@
     if name goto sel_name
 
 list_names:
-    new it, 'Iterator', b
+    it = iter b
     it = .ITERATE_FROM_START
 loop:
     unless it goto fin
@@ -901,7 +901,7 @@
 .sub check_seen
     .param pmc seen
     .local pmc it
-    new it, 'Iterator', seen
+    it = iter seen
     it = .ITERATE_FROM_START
 loop:
     unless it goto ok

Modified: branches/ops_pct/examples/sdl/minesweeper/field.pir
==============================================================================
--- branches/ops_pct/examples/sdl/minesweeper/field.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/sdl/minesweeper/field.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -290,11 +290,11 @@
     .local pmc status
 
     getattribute field, self, 'field'
-    field   = new "Iterator", field
+    field   = iter field
     field   = .ITERATE_FROM_START
 
     cache   = getattribute self, 'cache'
-    cacheit = new "Iterator", cache
+    cacheit = iter cache
     cacheit = .ITERATE_FROM_START
 
     screen  = getattribute self, 'screen'
@@ -839,7 +839,7 @@
     .local pmc field
 
     field = getattribute self, 'field'
-    field = new 'Iterator', field
+    field = iter field
     field = .ITERATE_FROM_START
 LOOP:
     unless field goto WON
@@ -910,7 +910,7 @@
     mines_lcd = getattribute self, 'mines_lcd'
 
     size  = field
-    field = new 'Iterator', field
+    field = iter field
     field = .ITERATE_FROM_START
     count = new 'ResizablePMCArray'
 

Modified: branches/ops_pct/examples/shootout/knucleotide.pir
==============================================================================
--- branches/ops_pct/examples/shootout/knucleotide.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/shootout/knucleotide.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -65,13 +65,13 @@
 	$I0 = elements table
 	array = $I0
 
-	.local pmc iter
-   	iter = new 'Iterator', table
-	set iter, .ITERATE_FROM_START
+	.local pmc it
+    it = iter table
+	set it, .ITERATE_FROM_START
 	i = 0
 iter_loop_1:
-	unless iter goto iter_end_1
-	$S0 = shift iter
+	unless it goto iter_end_1
+	$S0 = shift it
 	$I0 = table[$S0]
 	$P0 = new 'FixedPMCArray'
 	$P0 = 2

Modified: branches/ops_pct/examples/shootout/regexdna.pir
==============================================================================
--- branches/ops_pct/examples/shootout/regexdna.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/shootout/regexdna.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,7 +3,7 @@
 
 .sub main :main
 	load_bytecode "PGE.pbc"
-	.local pmc p6rule_compile, rulesub, match, variants, variants_p5, iub, iter, matches, capt
+	.local pmc p6rule_compile, rulesub, match, variants, variants_p5, iub, it, matches, capt
 	.local string pattern, chunk, seq, key, replacement
 	.local int readlen, chunklen, seqlen, finallen, i, varnum, count
 	p6rule_compile = compreg "PGE::Perl6Regex"
@@ -121,12 +121,12 @@
 	#####################################################
 	# Final replace to make the sequence a p5 style regex
 	.include "iterator.pasm"
-	iter = new 'Iterator', iub
-	set iter, .ITERATE_FROM_START
+	it = iter iub
+	set it, .ITERATE_FROM_START
 	matches = new 'ResizablePMCArray'
 iter_loop:
-	unless iter goto iter_end
-	key = shift iter
+	unless it goto iter_end
+	key = shift it
 	replacement = iub[key]
 	# Ok, using a regex to match a single fixed character is probably excessive
 	# But it's what's wanted...

Modified: branches/ops_pct/examples/tutorial/01_temp_var.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/01_temp_var.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/01_temp_var.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,15 +3,15 @@
 
 =head1 Simple Variables
 
-PIR has two kinds of variables. The most simple kind are Parrot
-registers. Registers are named with a dollar sign followed by a single
-letter type indicator and an integer. The letter in the name corresponds
-to the type of the variable, I for integer, N for number (float), S for
-string, and P for PMC (any kind of object). There are an unlimited
-number of each type of register per call frame, and you can use them
-in any order.
+PIR has two kinds of variables. The most simple kind are
+Parrot register variables. Register variables are named with
+a dollar sign followed by a single letter and an integer.
+The letter corresponds to the type of the variable, I for
+integer, N for number (float), S for string, and P for PMC
+(any kind of object).
 
-The C<=> symbol can be used to assign a value to one of these registers.
+The C<=> symbol can be used to assign a value to one of
+these register variables.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/02_local_var.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/02_local_var.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/02_local_var.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -4,17 +4,17 @@
 =head1 Named Variables
 
 The other kind of variables in PIR are named variables.
-You declare these with the .local directive, followed by
-the type of the variable, followed by the name. The types
-of named variables are the same set as the types of
-temporary variables, int for integer, num for numbers
-(floats), string for strings, and pmc for PMCs (objects).
-
-A simple rule of thumb is to use temporary variables
-for variables that are used on 3 or fewer lines of
-code, and named variables for any longer-lived variables.
-This is just a suggestion, but we think it really helps
-improve code readability.
+You declare these with the .local directive, with the type
+of the variable, followed by the name. The types of named
+variables are the same set as the types of register
+variables, int for integer, num for numbers (floats), string
+for strings, and pmc for PMCs (objects).
+
+A simple rule of thumb is to use register variables for
+variables that are used on 3 or fewer lines of code, and
+named variables for any longer-lived variables.  This is
+just a suggestion, but we think it really helps improve code
+readability.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/03_temp_var_basic_pmcs.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/03_temp_var_basic_pmcs.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/03_temp_var_basic_pmcs.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,17 +3,19 @@
 
 =head1 Basic PMC Types
 
-PMCs are objects, so to use a PMC, you first have to instantiate an object for
-the PMC using the 'new' opcode and the name of the class to instantiate it
-in.
-
-The simple data types have a corresponding PMC type. The Integer type is like
-$I0, the Float type is like $N0, and the String type is like $S0.
-
-Any data type more complex than a simple integer, float, or string (such as an
-array or hash) is also a PMC. Some PMC types are built into Parrot directly.
-Some can be loaded as a dynpmc. Some types are defined as classes in PIR
-code. We'l talk about some of these other types later.
+PMCs are objects, so to use a PMC, you first have to
+instantiate an object for the PMC using the 'new' opcode and
+the name of a class.
+
+The simple data types have a corresponding PMC type. The
+Integer type is like $I0, the Float type is like $N0, and
+the String type is like $S0.
+
+Any data type more complex than a simple integer, float, or
+string (such as an array or hash) is also a PMC. Some PMC
+types are built into Parrot directly.  Some can be loaded
+dynamically. Some types are defined as classes in PIR code.
+We'll talk about some of these other types later.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/04_pod_comments.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/04_pod_comments.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/04_pod_comments.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,7 +3,7 @@
 
 =head1 Pod Documentation
 
-As you may have noticed, PIR files can contain POD documentation.
+As you may have noticed, PIR files can contain Pod documentation.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/10_math_ops.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/10_math_ops.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/10_math_ops.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,13 +3,10 @@
 
 =head1 Math Operations
 
-Many common math operations have simple operator syntax in PIR. Operators
-like C<+>, C<->, C</> and C<*> are all implemented in PIR, but so are a
-few others: C<<< << >>>, C<<< >> >>>, C<|>, C<&>, C<^>  and C<%> are some
-examples.
-
-These math operation symbols are all I<infix operators> and are used the
-way most people would expect.
+Many common math operations have simple operator syntax in
+PIR. Operators like C<+>, C<->, C</> and C<*> are all
+implemented in PIR, but so are a few less common ones such
+as C<<< << >>>, C<<< >> >>>, C<|>, C<&>, C<^>  and C<%>.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/13_logical_ops.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/13_logical_ops.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/13_logical_ops.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,14 +3,15 @@
 
 =head1 Logical Operations
 
-The logical operations are short-circuiting, so if the first argument to an
-'or' is true, the second will never be evaluated because it never needs to
-be. If the first argument to an 'and' operation is false, the other
-arguments are never evaluated either. This is a common logical optimization
-used by compiler designers. PIR only allows variables as arguments to
-operations, so the short-circuiting is only relevant if the argument is a
-PMC that has side-effects on access to the boolean value. We'll talk about
-these side effects later.
+The logical operations are short-circuiting, so if the first
+argument to an 'or' is true, the second will never be
+evaluated. If the first argument to an 'and' operation is
+false, the other arguments are never evaluated either. This
+is a common logical optimization used by compiler designers.
+PIR only allows variables as arguments to operations, so the
+short-circuiting is only relevant if the argument is a PMC
+that has side-effects on access to the boolean value. We'll
+talk about these side effects later.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/20_string_ops.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/20_string_ops.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/20_string_ops.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,11 +3,12 @@
 
 =head1 String Operations
 
-Some operations aren't mathematical at all. Concatenation is an example
-of this type of operation that joins two strings together to form a
-larger string. Like the other operations we've seen, concatenation also
-has one form that returns the result, and one form that modifies the
-result in place.
+Some operations are specifically for strings. Concatenation
+is an example of this type of operation; it joins two
+strings together to form a larger string. Like the other
+operations we've seen, concatenation also has one form that
+returns the result, and one form that modifies the result in
+place.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/22_string_ops_length.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/22_string_ops_length.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/22_string_ops_length.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -4,8 +4,8 @@
 =head1 String Operations (continued)
 
 To find the length of a string in PIR, use the length opcode. It works on
-any register containing a basic Parrot string, but not the String PMC.
-C<length> returns an integer value with 0 being an empty string.
+any variable containing a basic Parrot string, but not the String PMC.
+C<length> returns an integer value, and 0 means an empty string.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/23_string_ops_substr.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/23_string_ops_substr.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/23_string_ops_substr.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -10,7 +10,7 @@
 position is left out, C<substr> returns all the characters until the
 end of the string.
 
-An optional fourth argument can be a string that will be used to
+An optional fourth argument is a string that will be used to
 replace the characters between the start and end positions.
 
 =cut

Modified: branches/ops_pct/examples/tutorial/30_arrays_basic.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/30_arrays_basic.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/30_arrays_basic.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,15 +3,16 @@
 
 =head1
 
-PMC registers can contain instances of array or hash data types, or
-more advanced types based on these two. If a PMC type implements the
-array or hash interfaces, they can be accessed using integer or string
-keys.
-
-An array is a type of PMC that contains elements that are indexed by
-number. Array indices must be integer values, not floating point ones.
-Arrays also have a large group of special opcodes that operate on them:
-C<push>, C<pop>, C<shift>, and C<unshift>.
+PMC registers can contain array or hash data types, or more
+advanced types based on these two. If a PMC type implements
+the array or hash interfaces, they can be accessed using
+integer or string keys.
+
+An array is a type of PMC that contains a collection
+elements indexed by number. Array indices must be integer
+values, not floating point ones.  Arrays also have a large
+group of special opcodes that operate on them: C<push>,
+C<pop>, C<shift>, and C<unshift>.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/33_hashes.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/33_hashes.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/33_hashes.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,21 +1,21 @@
 # Copyright (C) 2007-2009, Parrot Foundation.
 # $Id$
 
-=head1 Hashes
+=head1 Associative Arrays
 
-Hashes, also known in some places as "dictionaries" or "associative arrays"
-are like array structures except they are indexed by strings instead of
-integers. There are dedicated Hash PMCs, and a number of other PMCs that
-implement the hash interface as well.
-
-Hash PMCs are indexed using C<[ ]> square brackets with a string inside them.
-
-Arrays are typically considered to be homogeneous structures where all
-elements in the array are of the same type. This is why Parrot has types
-like "FixedIntegerArray" and "ResizableStringArray", which only contain
-integers or strings respectively. Hashes are usually treated as being
-heterogeneous, where each bucket in the hash can contain an element of a
-different type.
+Associative arrays, also known in some places as "dictionaries" or
+"hashes" are like ordered arrays except they are indexed by strings
+instead of integers. Parrot has a dedicated Hash PMC, and a number of
+other PMCs that implement the associative array interface as well.
+
+Associative arryas are indexed using C<[ ]> square brackets with a
+string inside them.
+
+Ordered arrays are often homogeneous structures where all elements in
+the array are of the same type. This is why Parrot has types like
+"FixedIntegerArray" and "ResizableStringArray", which only contain
+integers or strings respectively. Associative arrays are often
+heterogeneous, where each element may be a different type.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/34_multikey.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/34_multikey.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/34_multikey.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,14 +3,15 @@
 
 =head1 Multi-Level Keys
 
-Hashes and arrays can be combined in a number of ways to make interesting
-and complex data structures. A hash bucket may contain an array PMC, which
-in turn can contain other arrays or hashes. In these cases, the keys for
-each level can be combined together to form a single unique key for
-a data element in the structure.
+Hashes and arrays can be combined in a number of ways to
+make interesting and complex data structures. A hash may
+contain an array PMC, which in turn can contain other arrays
+or hashes. In these cases, the keys for each level can be
+combined together to form a single unique key for a data
+element in the structure.
 
-This technique works equally well for arrays-of-arrays, hashes-of-hashes,
-and combination structures as well.
+This technique works equally well for arrays-of-arrays,
+hashes-of-hashes, and combination structures as well.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/40_file_ops.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/40_file_ops.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/40_file_ops.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -3,7 +3,7 @@
 
 =head1 File Operations
 
-This example demonstrates basic file operations. Note the readmode.
+This example demonstrates basic file operations.
 
 =cut
 

Modified: branches/ops_pct/examples/tutorial/55_iterator.pir
==============================================================================
--- branches/ops_pct/examples/tutorial/55_iterator.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/examples/tutorial/55_iterator.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -17,15 +17,15 @@
 =cut
 
 .sub main :main
-    .local pmc myarray, iter
+    .local pmc myarray, it
 
     myarray = split " ", "foo bar baz boz"
 
-    iter = new ['Iterator'], myarray
+    it = iter myarray
   iter_loop:
-    unless iter goto iter_end
+    unless it goto iter_end
 
-    $P0 = shift iter
+    $P0 = shift it
     say $P0
 
     goto iter_loop

Modified: branches/ops_pct/ext/SQLite3/Makefile.PL
==============================================================================
--- branches/ops_pct/ext/SQLite3/Makefile.PL	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ext/SQLite3/Makefile.PL	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,5 +1,5 @@
 use lib '../../lib';
 use Parrot::Configure;
 my $pc = Parrot::Configure->new();
-$pc->data->slurp();
+$pc->data->get_PConfig();
 $pc->genfile("Makefile.in" => "Makefile");

Modified: branches/ops_pct/ext/SQLite3/Makefile.in
==============================================================================
--- branches/ops_pct/ext/SQLite3/Makefile.in	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ext/SQLite3/Makefile.in	Fri Jul 24 19:42:02 2009	(r40257)
@@ -61,16 +61,15 @@
 .c$(O) :
 	@$(CC) "" $(CFLAGS) -I$(@D) @cc_o_out@$@ -c $<
 
-#PERL6=../../perl6
-PERL6=../../parrot ../../languages/perl6/perl6.pbc
+PERL6=../../parrot ../../languages/rakudo/perl6.pbc
 
 all :
-	cd ../..; make perl6
+	cd ../..; make all
 	cd ../../compilers/ncigen; $(PERL6) ../../ext/SQLite3/gen_sqlite3.pl /usr/include/sqlite3.h > ../../ext/SQLite3/genSQLite3.pir
 
 test:
 	$(RM_F) test.db t/test.db
-	PERL6LIB=../../languages/perl6 $(PERL6) t/test.p6
+	PERL6LIB=../../languages/rakudo $(PERL6) t/test.p6
 
 $(SHARED_LIB) : $(C_FILES)
 	$(MKPATH) @blib_dir@

Modified: branches/ops_pct/ext/SQLite3/gen_sqlite3.pl
==============================================================================
--- branches/ops_pct/ext/SQLite3/gen_sqlite3.pl	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ext/SQLite3/gen_sqlite3.pl	Fri Jul 24 19:42:02 2009	(r40257)
@@ -17,17 +17,17 @@
 
 for (parse_ast($fn).hash().kv) -> $k,$v {
     #dump_node($v);
-    if ($v.WHAT eq "FuncDecl") {
+    if ($v.WHAT eq "NCIGENAST::FuncDecl()") {
         my @result = pir($v);
         my $cname       = @result[0];
         my $signature   = @result[1];
         my $source      = @result[2];
         my $suffix_name = @result[0];
-        my $suffix_name .= subst( /sqlite3_/, '' );
+        $suffix_name .= subst( /sqlite3_/, '' );
 
         my $pirname = %rename_table{$suffix_name} || $suffix_name;
 
-        say "    '_nci_init_symbol_'(lib, '$pirname', '$cname', '$signature') #$source";
+        say "    '_nci_init_symbol_'(lib, '$pirname', '$cname', '$signature')";
     }
 }
 print postamble();

Modified: branches/ops_pct/include/parrot/atomic.h
==============================================================================
--- branches/ops_pct/include/parrot/atomic.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/atomic.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -17,9 +17,7 @@
 #  include "parrot/has_header.h"
 #  include "parrot/thread.h"
 
-#  define PARROT_HAS_NATIVE_ATOMIC 1      /* we'll redefine later if need be */
-
-#if (PARROT_HAS_THREADS)
+#ifdef PARROT_HAS_THREADS
 #  if defined(PARROT_HAS_I386_GCC_CMPXCHG)
 #    include "parrot/atomic/gcc_x86.h"
 #  elif defined(PARROT_HAS_PPC_GCC_CMPSET)
@@ -27,8 +25,6 @@
 #  elif defined(PARROT_HAS_SPARC_ATOMIC)
 #    include "parrot/atomic/sparc.h"
 #  else
-#    undef PARROT_HAS_NATIVE_ATOMIC
-#    define PARROT_HAS_NATIVE_ATOMIC 0
 #    include "parrot/atomic/fallback.h"
 #  endif
 #else
@@ -36,12 +32,12 @@
     void *val;
 } Parrot_atomic_pointer;
 
-typedef Parrot_atomic_integer {
+typedef struct Parrot_atomic_integer {
     INTVAL val;
 } Parrot_atomic_integer;
 
 #  define PARROT_ATOMIC_PTR_INIT(a)
-#  define PARROT_ATOMIC_PTR_GET(result, (a)) (result) = (a).val
+#  define PARROT_ATOMIC_PTR_GET(result, a) (result) = (a).val
 #  define PARROT_ATOMIC_PTR_SET(a, b) (a).val = (b)
 
 /* a is the Parrot_atomic.
@@ -65,7 +61,7 @@
 #  define PARROT_ATOMIC_PTR_DESTROY(a)
 #  define PARROT_ATOMIC_INT_INIT(a)
 #  define PARROT_ATOMIC_INT_DESTROY(a)
-#  define PARROT_ATOMIC_INT_GET(result, (a)) (result) = (a).val
+#  define PARROT_ATOMIC_INT_GET(result, a) (result) = (a).val
 #  define PARROT_ATOMIC_INT_SET(a, value)  (a).val = (value)
 #  define PARROT_ATOMIC_INT_CAS(result, a, expect, update) \
       do { \
@@ -82,7 +78,6 @@
 #  define PARROT_ATOMIC_INT_INC(result, a) ((result) = ++(a).val)
 #  define PARROT_ATOMIC_INT_DEC(result, a) ((result) = --(a).val)
 
-
 #endif /* PARROT_HAS_THREADS */
 
 #endif /* PARROT_ATOMIC_H_GUARD */

Modified: branches/ops_pct/include/parrot/compiler.h
==============================================================================
--- branches/ops_pct/include/parrot/compiler.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/compiler.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -14,20 +14,6 @@
  * for a given compiler.  They are based on GCC's __attribute__ functionality.
  */
 
-/*
- * Microsoft provides two annotations mechanisms.  __declspec, which has been
- * around for a while, and Microsoft's standard source code annotation
- * language (SAL), introduced with Visual C++ 8.0.
- * See <http://msdn2.microsoft.com/en-us/library/ms235402(VS.80).aspx>,
- * <http://msdn2.microsoft.com/en-us/library/dabb5z75(VS.80).aspx>.
- */
-#if defined(_MSC_VER) && (_MSC_VER >= 1400)
-#  define PARROT_HAS_SAL 1
-#  include <sal.h>
-#else
-#  define PARROT_HAS_SAL 0
-#endif
-
 #ifdef HASATTRIBUTE_NEVER_WORKS
  #  error This attribute can never succeed.  Something has mis-sniffed your configuration.
 #endif
@@ -113,7 +99,19 @@
  */
 #define UNUSED(a) /*@-noeffect*/if (0) (void)(a)/*@=noeffect*/;
 
-#if PARROT_HAS_SAL
+/* 64-bit CL has some problems, so this section here is going to try to fix them */
+#ifdef PARROT_HAS_MSVC_SAL
+#  ifdef _WIN64
+    /* CL64 can't seem to find sal.h, so take that out of the equation */
+#    undef PARROT_HAS_MSVC_SAL
+    /* CL64 complains about not finding _iob, so this might fix it */
+
+
+#  endif
+#endif
+
+#ifdef PARROT_HAS_MSVC_SAL
+#  include <sal.h>
 #  define PARROT_CAN_RETURN_NULL      /*@null@*/ __maybenull
 #  define PARROT_CANNOT_RETURN_NULL   /*@notnull@*/ __notnull
 #else
@@ -144,7 +142,7 @@
 /* Function argument instrumentation */
 /* For explanations of the annotations, see http://www.splint.org/manual/manual.html */
 
-#if PARROT_HAS_SAL
+#ifdef PARROT_HAS_MSVC_SAL
 #  define NOTNULL(x)                  /*@notnull@*/ __notnull x
     /* The pointer passed may not be NULL */
 

Modified: branches/ops_pct/include/parrot/gc_api.h
==============================================================================
--- branches/ops_pct/include/parrot/gc_api.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/gc_api.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -456,10 +456,7 @@
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 /* HEADERIZER END: src/gc/api.c */
 
-/* DEPRECATED. pobject_lives is being renamed to Parrot_gc_mark_PObj_alive.
-   this macro is provided for compatibility until version 1.4 or later when
-   it can be removed per the deprecation policy. See TT #664 for details */
-#define pobject_lives Parrot_gc_mark_PObj_alive
+void Parrot_gc_inf_init(PARROT_INTERP);
 
 /* write barrier */
 #if PARROT_GC_MS
@@ -491,6 +488,11 @@
 
 #endif
 
+#if PARROT_GC_INF
+#  define GC_WRITE_BARRIER(interp, agg, old, _new) do { } while (0)
+#  define GC_WRITE_BARRIER_KEY(interp, agg, old, old_key, _new, new_key) do { } while (0)
+#endif
+
 #endif /* PARROT_GC_API_H_GUARD */
 
 /*

Modified: branches/ops_pct/include/parrot/global.h
==============================================================================
--- branches/ops_pct/include/parrot/global.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/global.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -26,15 +26,6 @@
 PARROT_EXPORT
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
-PMC * Parrot_find_global_k(PARROT_INTERP,
-    ARGIN_NULLOK(PMC *pmc_key),
-    ARGIN(STRING *globalname))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(3);
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
 PMC * Parrot_find_global_n(PARROT_INTERP,
     ARGIN_NULLOK(PMC *ns),
     ARGIN_NULLOK(STRING *globalname))
@@ -78,17 +69,12 @@
 PARROT_EXPORT
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
-PMC * Parrot_get_namespace_autobase(PARROT_INTERP, ARGIN_NULLOK(PMC *key))
-        __attribute__nonnull__(1);
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
 PMC * Parrot_get_namespace_keyed(PARROT_INTERP,
     ARGIN(PMC *base_ns),
-    ARGIN_NULLOK(PMC *pmc_key))
+    ARGIN(PMC *pmc_key))
         __attribute__nonnull__(1)
-        __attribute__nonnull__(2);
+        __attribute__nonnull__(2)
+        __attribute__nonnull__(3);
 
 PARROT_EXPORT
 PARROT_WARN_UNUSED_RESULT
@@ -110,9 +96,10 @@
 PARROT_CAN_RETURN_NULL
 PMC * Parrot_make_namespace_keyed(PARROT_INTERP,
     ARGIN(PMC *base_ns),
-    ARGIN_NULLOK(PMC *pmc_key))
+    ARGIN(PMC *pmc_key))
         __attribute__nonnull__(1)
-        __attribute__nonnull__(2);
+        __attribute__nonnull__(2)
+        __attribute__nonnull__(3);
 
 PARROT_EXPORT
 PARROT_WARN_UNUSED_RESULT
@@ -159,9 +146,6 @@
 
 #define ASSERT_ARGS_Parrot_find_global_cur __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp)
-#define ASSERT_ARGS_Parrot_find_global_k __attribute__unused__ int _ASSERT_ARGS_CHECK = \
-       PARROT_ASSERT_ARG(interp) \
-    || PARROT_ASSERT_ARG(globalname)
 #define ASSERT_ARGS_Parrot_find_global_n __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp)
 #define ASSERT_ARGS_Parrot_find_global_op __attribute__unused__ int _ASSERT_ARGS_CHECK = \
@@ -174,11 +158,10 @@
     || PARROT_ASSERT_ARG(name)
 #define ASSERT_ARGS_Parrot_get_global __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp)
-#define ASSERT_ARGS_Parrot_get_namespace_autobase __attribute__unused__ int _ASSERT_ARGS_CHECK = \
-       PARROT_ASSERT_ARG(interp)
 #define ASSERT_ARGS_Parrot_get_namespace_keyed __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
-    || PARROT_ASSERT_ARG(base_ns)
+    || PARROT_ASSERT_ARG(base_ns) \
+    || PARROT_ASSERT_ARG(pmc_key)
 #define ASSERT_ARGS_Parrot_get_namespace_keyed_str \
      __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
@@ -188,7 +171,8 @@
        PARROT_ASSERT_ARG(interp)
 #define ASSERT_ARGS_Parrot_make_namespace_keyed __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
-    || PARROT_ASSERT_ARG(base_ns)
+    || PARROT_ASSERT_ARG(base_ns) \
+    || PARROT_ASSERT_ARG(pmc_key)
 #define ASSERT_ARGS_Parrot_make_namespace_keyed_str \
      __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \

Modified: branches/ops_pct/include/parrot/hash.h
==============================================================================
--- branches/ops_pct/include/parrot/hash.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/hash.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -46,6 +46,7 @@
 typedef void (*hash_mark_key_fn)(PARROT_INTERP, PObj *);
 typedef size_t (*hash_hash_key_fn)(PARROT_INTERP, ARGIN(const void *), size_t seed);
 
+/* &gen_from_enum(hash_key_type.pasm) */
 typedef enum {
     Hash_key_type_int,
     Hash_key_type_cstring,
@@ -53,6 +54,7 @@
     Hash_key_type_PMC,
     Hash_key_type_ptr
 } Hash_key_type;
+/* &end_gen */
 
 typedef struct _hashbucket {
     struct _hashbucket *next;
@@ -128,10 +130,9 @@
 PARROT_CAN_RETURN_NULL
 HashBucket * parrot_hash_get_bucket(PARROT_INTERP,
     ARGIN(const Hash *hash),
-    ARGIN(const void *key))
+    ARGIN_NULLOK(const void *key))
         __attribute__nonnull__(1)
-        __attribute__nonnull__(2)
-        __attribute__nonnull__(3);
+        __attribute__nonnull__(2);
 
 PARROT_EXPORT
 PARROT_WARN_UNUSED_RESULT
@@ -149,11 +150,10 @@
 PARROT_CANNOT_RETURN_NULL
 HashBucket* parrot_hash_put(PARROT_INTERP,
     ARGMOD(Hash *hash),
-    ARGIN(void *key),
+    ARGIN_NULLOK(void *key),
     ARGIN_NULLOK(void *value))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
-        __attribute__nonnull__(3)
         FUNC_MODIFIES(*hash);
 
 PARROT_EXPORT
@@ -194,12 +194,6 @@
         __attribute__nonnull__(1);
 
 PARROT_EXPORT
-void parrot_new_pmc_hash(PARROT_INTERP, ARGOUT(PMC *container))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2)
-        FUNC_MODIFIES(*container);
-
-PARROT_EXPORT
 PARROT_CANNOT_RETURN_NULL
 Hash * parrot_new_pointer_hash(PARROT_INTERP)
         __attribute__nonnull__(1);
@@ -212,8 +206,9 @@
 
 PARROT_WARN_UNUSED_RESULT
 PARROT_PURE_FUNCTION
-size_t key_hash_int(SHIM_INTERP, ARGIN(const void *value), size_t seed)
-        __attribute__nonnull__(2);
+size_t key_hash_int(SHIM_INTERP,
+    ARGIN_NULLOK(const void *value),
+    size_t seed);
 
 void parrot_chash_destroy(PARROT_INTERP, ARGMOD(Hash *hash))
         __attribute__nonnull__(1)
@@ -261,16 +256,14 @@
     || PARROT_ASSERT_ARG(key)
 #define ASSERT_ARGS_parrot_hash_get_bucket __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
-    || PARROT_ASSERT_ARG(hash) \
-    || PARROT_ASSERT_ARG(key)
+    || PARROT_ASSERT_ARG(hash)
 #define ASSERT_ARGS_parrot_hash_get_idx __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(hash) \
     || PARROT_ASSERT_ARG(key)
 #define ASSERT_ARGS_parrot_hash_put __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
-    || PARROT_ASSERT_ARG(hash) \
-    || PARROT_ASSERT_ARG(key)
+    || PARROT_ASSERT_ARG(hash)
 #define ASSERT_ARGS_parrot_hash_size __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(hash)
 #define ASSERT_ARGS_parrot_hash_visit __attribute__unused__ int _ASSERT_ARGS_CHECK = \
@@ -286,14 +279,10 @@
        PARROT_ASSERT_ARG(interp)
 #define ASSERT_ARGS_parrot_new_intval_hash __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp)
-#define ASSERT_ARGS_parrot_new_pmc_hash __attribute__unused__ int _ASSERT_ARGS_CHECK = \
-       PARROT_ASSERT_ARG(interp) \
-    || PARROT_ASSERT_ARG(container)
 #define ASSERT_ARGS_parrot_new_pointer_hash __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp)
 #define ASSERT_ARGS_int_compare __attribute__unused__ int _ASSERT_ARGS_CHECK = 0
-#define ASSERT_ARGS_key_hash_int __attribute__unused__ int _ASSERT_ARGS_CHECK = \
-       PARROT_ASSERT_ARG(value)
+#define ASSERT_ARGS_key_hash_int __attribute__unused__ int _ASSERT_ARGS_CHECK = 0
 #define ASSERT_ARGS_parrot_chash_destroy __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(hash)

Modified: branches/ops_pct/include/parrot/interpreter.h
==============================================================================
--- branches/ops_pct/include/parrot/interpreter.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/interpreter.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,5 +1,5 @@
 /* interpreter.h
- *  Copyright (C) 2001-2007, Parrot Foundation.
+ *  Copyright (C) 2001-2009, Parrot Foundation.
  *  SVN Info
  *     $Id$
  *  Overview:
@@ -290,8 +290,10 @@
  * runloop ID, so it still needs to be a separate stack for a while longer. */
 
 typedef struct parrot_runloop_t {
-    Parrot_jump_buff resume;     /* jmp_buf */
-    struct parrot_runloop_t *prev; /* interpreter's runloop jump buffer stack */
+    Parrot_jump_buff         resume;        /* jmp_buf */
+    struct parrot_runloop_t *prev;          /* interpreter's runloop
+                                             * jump buffer stack */
+    opcode_t                *handler_start; /* Used in exception handling */
 } parrot_runloop_t;
 
 typedef parrot_runloop_t Parrot_runloop;
@@ -312,7 +314,6 @@
     int      n_vtable_max;                    /* highest used type */
     int      n_vtable_alloced;                /* alloced vtable space */
 
-    struct _ParrotIOLayer **piolayers;        /* IO registered layers */
     struct _ParrotIOData   *piodata;          /* interpreter's IO system */
 
     op_lib_t  *op_lib;                        /* Opcode library */
@@ -457,7 +458,12 @@
 #define PNCONST   PF_NCONST(interp->code)
 
 /* TODO - Make this a config option */
-#define PARROT_CATCH_NULL 1
+/* Splint complains about PMCNULL's storage, so don't use it. */
+#ifdef S_SPLINT_S
+#  define PARROT_CATCH_NULL 0
+#else
+#  define PARROT_CATCH_NULL 1
+#endif
 
 #if PARROT_CATCH_NULL
 PARROT_DATA PMC * PMCNULL;   /* Holds single Null PMC */

Modified: branches/ops_pct/include/parrot/io.h
==============================================================================
--- branches/ops_pct/include/parrot/io.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/io.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -849,12 +849,12 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 INTVAL Parrot_io_socket(PARROT_INTERP,
-    ARGMOD_NULLOK(PMC * socket),
+    ARGMOD_NULLOK(PMC *socket),
     INTVAL fam,
     INTVAL type,
     INTVAL proto)
         __attribute__nonnull__(1)
-        FUNC_MODIFIES(* socket);
+        FUNC_MODIFIES(*socket);
 
 PARROT_EXPORT
 PARROT_WARN_UNUSED_RESULT

Modified: branches/ops_pct/include/parrot/library.h
==============================================================================
--- branches/ops_pct/include/parrot/library.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/library.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -25,6 +25,7 @@
     PARROT_RUNTIME_FT_SOURCE  = 0x0F00
 } enum_runtime_ft;
 
+/* &gen_from_enum(libpaths.pasm) */
 typedef enum {
     PARROT_LIB_PATH_INCLUDE,            /* .include "foo" */
     PARROT_LIB_PATH_LIBRARY,            /* load_bytecode "bar" */
@@ -34,6 +35,7 @@
     /* must be last: */
     PARROT_LIB_PATH_SIZE
 } enum_lib_paths;
+/* &end_gen */
 
 /* HEADERIZER BEGIN: src/library.c */
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */

Modified: branches/ops_pct/include/parrot/list.h
==============================================================================
--- branches/ops_pct/include/parrot/list.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/list.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -192,12 +192,13 @@
 PARROT_EXPORT
 void list_splice(PARROT_INTERP,
     ARGMOD(List *list),
-    ARGIN_NULLOK(List *value_list),
+    ARGMOD_NULLOK(List *value_list),
     INTVAL offset,
     INTVAL count)
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
-        FUNC_MODIFIES(*list);
+        FUNC_MODIFIES(*list)
+        FUNC_MODIFIES(*value_list);
 
 PARROT_EXPORT
 void list_unshift(PARROT_INTERP,

Modified: branches/ops_pct/include/parrot/multidispatch.h
==============================================================================
--- branches/ops_pct/include/parrot/multidispatch.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/multidispatch.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -109,7 +109,8 @@
         FUNC_MODIFIES(*cache);
 
 PARROT_EXPORT
-PARROT_CANNOT_RETURN_NULL
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 PMC * Parrot_mmd_cache_lookup_by_types(PARROT_INTERP,
     ARGMOD(MMD_Cache *cache),
     ARGIN(const char *name),
@@ -121,7 +122,8 @@
         FUNC_MODIFIES(*cache);
 
 PARROT_EXPORT
-PARROT_CANNOT_RETURN_NULL
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 PMC * Parrot_mmd_cache_lookup_by_values(PARROT_INTERP,
     ARGMOD(MMD_Cache *cache),
     ARGIN(const char *name),
@@ -165,7 +167,7 @@
         FUNC_MODIFIES(*cache);
 
 PARROT_EXPORT
-PARROT_CANNOT_RETURN_NULL
+PARROT_CAN_RETURN_NULL
 PARROT_WARN_UNUSED_RESULT
 PMC * Parrot_mmd_find_multi_from_long_sig(PARROT_INTERP,
     ARGIN(STRING *name),

Modified: branches/ops_pct/include/parrot/oo.h
==============================================================================
--- branches/ops_pct/include/parrot/oo.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/oo.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -104,11 +104,6 @@
         __attribute__nonnull__(1);
 
 PARROT_EXPORT
-PARROT_PURE_FUNCTION
-PARROT_CAN_RETURN_NULL
-const char* Parrot_MMD_method_name(SHIM_INTERP, INTVAL idx);
-
-PARROT_EXPORT
 PARROT_CAN_RETURN_NULL
 PARROT_WARN_UNUSED_RESULT
 PMC * Parrot_oo_get_class(PARROT_INTERP, ARGIN(PMC *key))
@@ -215,7 +210,6 @@
 #define ASSERT_ARGS_Parrot_invalidate_method_cache \
      __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp)
-#define ASSERT_ARGS_Parrot_MMD_method_name __attribute__unused__ int _ASSERT_ARGS_CHECK = 0
 #define ASSERT_ARGS_Parrot_oo_get_class __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(key)

Modified: branches/ops_pct/include/parrot/packfile.h
==============================================================================
--- branches/ops_pct/include/parrot/packfile.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/packfile.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -55,7 +55,7 @@
 /*
 ** Parrot_pbc_read() options:
 **   parrot, pbc_merge, parrot_debugger use 0
-**   pbc_dump, pbc_disassemble, pbc_info use 1 to skip the version check
+**   pbc_dump, pbc_disassemble use 1 to skip the version check
 **   pbc_dump -h requires 2
 **   The rest is for TRACE_PACKFILE debugging with switch -D in pbc_dump
 */

Modified: branches/ops_pct/include/parrot/parrot.h
==============================================================================
--- branches/ops_pct/include/parrot/parrot.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/parrot.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,5 +1,5 @@
 /* parrot.h
- *  Copyright (C) 2001-2008, Parrot Foundation.
+ *  Copyright (C) 2001-2009, Parrot Foundation.
  *  SVN Info
  *     $Id$
  *  Overview:
@@ -102,10 +102,6 @@
 typedef jmp_buf Parrot_jump_buff;
 #endif /* PARROT_HAS_HEADER_SETJMP */
 
-#ifdef PARROT_HAS_HEADER_PTHREAD
-#  include <pthread.h>
-#endif /* PARROT_HAS_HEADER_PTHREAD */
-
 #ifdef PARROT_HAS_HEADER_LIMITS
 #  include <limits.h>
 #endif /* PARROT_HAS_HEADER_LIMITS */
@@ -140,8 +136,8 @@
     A. D. Aug. 6, 2002.
 */
 #if PTR_SIZE == INTVAL_SIZE
-#  define INTVAL2PTR(any, d)    (any)(d)
-#  define UINTVAL2PTR(any, d)    (any)(d)
+#  define INTVAL2PTR(any, d)    ((any)(d))
+#  define UINTVAL2PTR(any, d)    ((any)(d))
 #else
 #  if PTR_SIZE == LONG_SIZE
 #    define INTVAL2PTR(any, d)    ((any)(unsigned long)(d))

Modified: branches/ops_pct/include/parrot/pmc.h
==============================================================================
--- branches/ops_pct/include/parrot/pmc.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/pmc.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -85,7 +85,7 @@
 PMC * pmc_reuse(PARROT_INTERP,
     ARGIN(PMC *pmc),
     INTVAL new_type,
-    NULLOK(UINTVAL flags))
+    UINTVAL flags)
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
@@ -102,6 +102,18 @@
         FUNC_MODIFIES(*pmc);
 
 PARROT_EXPORT
+PARROT_CANNOT_RETURN_NULL
+PARROT_IGNORABLE_RESULT
+PMC * pmc_reuse_init(PARROT_INTERP,
+    ARGIN(PMC *pmc),
+    INTVAL new_type,
+    ARGIN(PMC *init),
+    UINTVAL flags)
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
+        __attribute__nonnull__(4);
+
+PARROT_EXPORT
 PARROT_WARN_UNUSED_RESULT
 INTVAL pmc_type(PARROT_INTERP, ARGIN_NULLOK(STRING *name))
         __attribute__nonnull__(1);
@@ -155,6 +167,10 @@
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(pmc) \
     || PARROT_ASSERT_ARG(class_)
+#define ASSERT_ARGS_pmc_reuse_init __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(interp) \
+    || PARROT_ASSERT_ARG(pmc) \
+    || PARROT_ASSERT_ARG(init)
 #define ASSERT_ARGS_pmc_type __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp)
 #define ASSERT_ARGS_pmc_type_p __attribute__unused__ int _ASSERT_ARGS_CHECK = \

Modified: branches/ops_pct/include/parrot/settings.h
==============================================================================
--- branches/ops_pct/include/parrot/settings.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/settings.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -39,8 +39,10 @@
  * 0 ... MS  stop-the-world mark & sweep
  * 1 ... IMS incremental mark & sweep
  * 2 ... GMS generational mark & sweep
+ * 3 ... INF infinite memory "collector"
  *
- * Please note that only 0 currently works.
+ * Please note that only 0 and 3 currently work (and INF doesn't really
+ * "work").
  */
 
 #define PARROT_GC_SUBSYSTEM 0
@@ -49,16 +51,25 @@
 #  define PARROT_GC_MS      1
 #  define PARROT_GC_IMS     0
 #  define PARROT_GC_GMS     0
+#  define PARROT_GC_INF     0
 #endif
 #if PARROT_GC_SUBSYSTEM == 1
 #  define PARROT_GC_MS      0
 #  define PARROT_GC_IMS     1
 #  define PARROT_GC_GMS     0
+#  define PARROT_GC_INF     0
 #endif
 #if PARROT_GC_SUBSYSTEM == 2
 #  define PARROT_GC_MS      0
 #  define PARROT_GC_IMS     0
 #  define PARROT_GC_GMS     1
+#  define PARROT_GC_INF     0
+#endif
+#if PARROT_GC_SUBSYSTEM == 3
+#  define PARROT_GC_MS      0
+#  define PARROT_GC_IMS     0
+#  define PARROT_GC_GMS     0
+#  define PARROT_GC_INF     1
 #endif
 
 /*

Modified: branches/ops_pct/include/parrot/string_funcs.h
==============================================================================
--- branches/ops_pct/include/parrot/string_funcs.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/string_funcs.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -540,10 +540,6 @@
 char * string_to_cstring_nullable(SHIM_INTERP,
     ARGIN_NULLOK(const STRING *s));
 
-void Parrot_str_free(PARROT_INTERP, ARGIN(STRING *s))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2);
-
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 STRING * Parrot_str_from_int_base(PARROT_INTERP,
@@ -734,9 +730,6 @@
     || PARROT_ASSERT_ARG(b) \
     || PARROT_ASSERT_ARG(e)
 #define ASSERT_ARGS_string_to_cstring_nullable __attribute__unused__ int _ASSERT_ARGS_CHECK = 0
-#define ASSERT_ARGS_Parrot_str_free __attribute__unused__ int _ASSERT_ARGS_CHECK = \
-       PARROT_ASSERT_ARG(interp) \
-    || PARROT_ASSERT_ARG(s)
 #define ASSERT_ARGS_Parrot_str_from_int_base __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(tc)

Modified: branches/ops_pct/include/parrot/thr_pthread.h
==============================================================================
--- branches/ops_pct/include/parrot/thr_pthread.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/thr_pthread.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -18,7 +18,6 @@
 
 #  include <pthread.h>
 
-#  define PARROT_SYNC_PRIMITIVES_DEFINED
 #  define LOCK(m) pthread_mutex_lock((pthread_mutex_t*)&(m))
 #  define UNLOCK(m) pthread_mutex_unlock((pthread_mutex_t*)&(m))
 #  define COND_WAIT(c, m) pthread_cond_wait(&(c), &(m))

Modified: branches/ops_pct/include/parrot/thr_windows.h
==============================================================================
--- branches/ops_pct/include/parrot/thr_windows.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/thr_windows.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -13,14 +13,10 @@
 #ifndef PARROT_THR_WINDOWS_H_GUARD
 #define PARROT_THR_WINDOWS_H_GUARD
 
-#  undef CONST
-#  include <windows.h>
 #  undef FASTCALL
 #  include <process.h>
 #  include <limits.h>
 
-#  define PARROT_SYNC_PRIMITIVES_DEFINED
-
 typedef CRITICAL_SECTION Parrot_mutex;
 typedef struct Windows_cond
   {
@@ -131,8 +127,6 @@
 };
 #endif /* HAVE_STRUCT_TIMESPEC */
 
-#  undef CONST
-
 #endif /* PARROT_THR_WINDOWS_H_GUARD */
 
 /*

Modified: branches/ops_pct/include/parrot/thread.h
==============================================================================
--- branches/ops_pct/include/parrot/thread.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/include/parrot/thread.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -14,14 +14,9 @@
 #define PARROT_THREAD_H_GUARD
 
 #  include "parrot/parrot.h"
-
-#  define PARROT_HAS_THREADS 1
 #  include "parrot/atomic.h"
 
-#ifndef PARROT_SYNC_PRIMITIVES_DEFINED
-
-#  undef  PARROT_HAS_THREADS
-#  define PARROT_HAS_THREADS 0
+#ifndef PARROT_HAS_THREADS
 
 #  define LOCK(m)
 #  define UNLOCK(m)
@@ -51,15 +46,15 @@
 
 typedef void (*Cleanup_Handler)(void *);
 
-#  ifndef _STRUCT_TIMESPEC
-#    define _STRUCT_TIMESPEC
+#  ifndef __timespec_defined
+#    define __timespec_defined
 struct timespec {
     time_t tv_sec;
     long tv_nsec;
 };
-#  endif /* _STRUCT_TIMESPEC */
+#  endif /* __timespec_defined */
 
-#endif /* PARROT_SYNC_PRIMITIVES_DEFINED */
+#endif /* PARROT_HAS_THREADS */
 
 #ifndef YIELD
 #  define YIELD

Modified: branches/ops_pct/lib/Parrot/Configure/Options/Conf.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Configure/Options/Conf.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Configure/Options/Conf.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -94,8 +94,7 @@
    --cgoto=0            Don't build cgoto core - recommended when short of mem
    --jitcapable         Use JIT
    --execcapable        Use JIT to emit a native executable
-   --gc=(type)          Determine the type of garbage collection
-                        type=(gc|libc|malloc|malloc-trace) default is gc
+   --without-threads    Build parrot without thread support
 
 External Library Options:
 

Modified: branches/ops_pct/lib/Parrot/Configure/Options/Conf/Shared.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Configure/Options/Conf/Shared.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Configure/Options/Conf/Shared.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -18,6 +18,8 @@
     cgoto
     configure_trace
     cxx
+    darwin_no_fink
+    darwin_no_macports
     datadir
     debugging
     define
@@ -27,7 +29,6 @@
     fatal
     fatal-step
     floatval
-    gc
     help
     icu-config
     icuheaders
@@ -72,9 +73,10 @@
     without-gdbm
     without-gettext
     without-gmp
+    without-icu
     without-opengl
     without-pcre
-    without-icu
+    without-threads
     yacc
 };
 

Modified: branches/ops_pct/lib/Parrot/Configure/Options/Test/Prepare.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Configure/Options/Test/Prepare.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Configure/Options/Test/Prepare.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -4,6 +4,9 @@
 use strict;
 use warnings;
 use Carp;
+use Data::Dumper;$Data::Dumper::Indent=1;
+use File::Find;
+#use Scalar::Util qw( looks_like_number );
 use base qw( Exporter );
 our @EXPORT_OK = qw(
     get_preconfiguration_tests
@@ -16,11 +19,12 @@
 my @framework_tests = _get_framework_tests($config_dir);
 
 my $steps_dir = q{t/steps};
-my $steps_tests_ref  = _get_steps_tests($steps_dir);
+my ( $steps_tests_simple_ref, $steps_tests_complex_ref )  =
+    _find_steps_tests($steps_dir);
 my @steps_expected = get_steps_list();
 my @steps_tests = _prepare_steps_tests_list(
     $steps_dir,
-    $steps_tests_ref,
+    $steps_tests_complex_ref,
     \@steps_expected,
 );
 
@@ -52,36 +56,57 @@
     return @framework_tests;
 }
 
-sub _get_steps_tests {
+my %steps_tests_simple = ();
+my %steps_tests_complex = ();
+sub _find_steps_tests {
     my $steps_dir = shift;
-    my %steps_tests = ();
-    opendir my $DIRH2, $steps_dir or croak "Unable to open $steps_dir";
-    for my $t (grep { /\.t$/ } readdir $DIRH2) {
-        my ($type, $class, $num);
-        if ($t =~ m/(init|inter|auto|gen)_(\w+)-(\d{2})\.t$/) {
-            ($type, $class, $num) = ($1,$2,$3);
-            $steps_tests{$type}{$class}{$num}++;
+    sub wanted {
+        if ( $File::Find::name =~
+            m<
+                (init|inter|auto|gen) # category
+                /
+                ([a-z_\d]+) # class
+                (?:/
+                ([a-z_]+) # second-level
+                )?        # may not be defined
+                -
+                (\d{2}) # number
+                \.t$
+            >x ) {
+            $steps_tests_simple{$File::Find::name}++;
+            my ($category, $class, $secondlevel, $number) =
+                ($1, $2, $3 || q{}, $4);
+            my $final = ( $secondlevel )
+                ? qq|$secondlevel-$number|
+                : $number;
+            $steps_tests_complex{$category}{$class}{$final}++;
         }
-        else {
-            carp "Unable to match $t";
-        }
-    }
-    closedir $DIRH2 or croak "Unable to close $steps_dir";
-    return \%steps_tests;
+    } # END wanted()
+    finddepth( \&wanted, ( $steps_dir ) );
+    return ( \%steps_tests_simple, \%steps_tests_complex );
 }
 
 sub _prepare_steps_tests_list {
     my $steps_dir = shift;
     my $steps_tests_ref = shift;
     my $steps_expected_ref = shift;
-    my %steps_tests = %{ $steps_tests_ref };
     my @steps_tests;
+    # The order of tests of config steps is governed by
+    # Parrot::Configure::Step::List::get_steps_list().
     foreach my $step ( @{ $steps_expected_ref } ) {
-        my @temp = split /::/, $step;
-        my $these_tests = $steps_tests{$temp[0]}{$temp[1]}
+        my @module_path = split /::/, $step;
+        my $these_tests = $steps_tests_ref->{$module_path[0]}{$module_path[1]}
             or carp "No tests exist for configure step $step";
         foreach my $k (sort keys %$these_tests) {
-            push @steps_tests, qq{$steps_dir/$temp[0]_$temp[1]-$k.t};
+            if ( $k =~ m/^(\w+)-(\d{2})$/ ) {
+                my ($secondlevel, $number) = ($1, $2);
+                push @steps_tests,
+                    qq{$steps_dir/$module_path[0]/$module_path[1]/$secondlevel-$number.t};
+            }
+            else {
+                push @steps_tests,
+                    qq{$steps_dir/$module_path[0]/$module_path[1]-$k.t};
+            }
         }
     }
     return @steps_tests;

Modified: branches/ops_pct/lib/Parrot/Configure/Step/List.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Configure/Step/List.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Configure/Step/List.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -20,8 +20,6 @@
     auto::gcc
     auto::glibc
     auto::backtrace
-    auto::fink
-    auto::macports
     auto::msvc
     auto::attributes
     auto::warnings
@@ -52,6 +50,7 @@
     auto::socklen_t
     auto::neg_0
     auto::env
+    auto::thread
     auto::gmp
     auto::readline
     auto::gdbm

Modified: branches/ops_pct/lib/Parrot/Configure/Step/Methods.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Configure/Step/Methods.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Configure/Step/Methods.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -27,72 +27,6 @@
 
 =head1 METHODS
 
-=head2 C<_handle_darwin_for_fink()>
-
-    $self->_handle_darwin_for_fink($conf, $libs, $osname, $file);
-
-Currently used in configuration step classes auto::gmp, auto::readline and
-auto::gdbm.
-
-Modifies settings for C<linkflags>, C<ldflags> and C<ccflags> in the
-Parrot::Configure object's data structure.
-
-=cut
-
-sub _handle_darwin_for_fink {
-    my ($self, $conf, $osname, $file) = @_;
-    if ( $osname =~ /darwin/ ) {
-        my $fink_lib_dir        = $conf->data->get('fink_lib_dir');
-        my $fink_include_dir    = $conf->data->get('fink_include_dir');
-        if ( (defined $fink_lib_dir) && (defined $fink_include_dir) ) {
-            if ( -f "$fink_include_dir/$file" ) {
-                my %intended = (
-                    linkflags => "-L$fink_lib_dir",
-                    ldflags   => "-L$fink_lib_dir",
-                    ccflags   => "-I$fink_include_dir",
-                );
-                _add_flags_not_yet_seen($conf, \%intended);
-            }
-        }
-    }
-    return 1;
-}
-
-=head2 C<_handle_darwin_for_macports()>
-
-    $self->_handle_darwin_for_macports($conf, $libs, $osname, $file);
-
-Currently used in configuration step classes auto::gmp, auto::readline and
-auto::opengl.
-
-Modifies settings for C<linkflags>, C<ldflags> and C<ccflags> in the
-Parrot::Configure object's data structure.
-
-Potentially expandable to cover all BSD-ports systems -- but as yet there has
-been no demand.
-
-=cut
-
-sub _handle_darwin_for_macports {
-    my ($self, $conf, $osname, $file) = @_;
-    if ( $osname =~ /darwin/ ) {
-#        my $ports_root          = $conf->data->get( 'ports_base_dir' );
-        my $ports_lib_dir       = $conf->data->get( 'ports_lib_dir' );
-        my $ports_include_dir   = $conf->data->get( 'ports_include_dir' );
-        if ( defined $ports_lib_dir && defined $ports_include_dir ) {
-            if ( -f qq{$ports_include_dir/$file} ) {
-                my %intended = (
-                    linkflags => "-L$ports_lib_dir",
-                    ldflags   => "-L$ports_lib_dir",
-                    ccflags   => "-I$ports_include_dir",
-                );
-                _add_flags_not_yet_seen($conf, \%intended);
-            }
-        }
-    }
-    return 1;
-}
-
 =head2 C<_select_lib()>
 
     $self->_select_lib( {
@@ -201,18 +135,6 @@
     return $libs;
 }
 
-sub _add_flags_not_yet_seen {
-    my ($conf, $intended) = @_;
-    foreach my $flag (keys %{ $intended }) {
-        my $flagstr = $conf->data->get($flag);
-        my @elements = split /\s+/, $flagstr;
-        my %seen = map {$_, 1} @elements;
-        $conf->data->add( ' ', $flag => $intended->{$flag} )
-            unless $seen{$intended->{$flag}};
-    }
-}
-
-
 =head1 SEE ALSO
 
 Parrot::Configure::Step.

Modified: branches/ops_pct/lib/Parrot/Distribution.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Distribution.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Distribution.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -431,6 +431,7 @@
             compilers/pirc/macro/macroparser.c
             compilers/pirc/macro/macroparser.h
             include/parrot/config.h
+            include/parrot/has_header.h
             src/gc/malloc.c
             } unless @exemptions;
 

Modified: branches/ops_pct/lib/Parrot/Docs/Section/Parrot.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Docs/Section/Parrot.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Docs/Section/Parrot.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -101,7 +101,6 @@
             '',
             $self->new_item( 'Chapter 1 Introduction', 'docs/book/draft/ch01_introduction.pod'),
             $self->new_item( 'Chapter 2 Getting Started', 'docs/book/draft/ch02_getting_started.pod'),
-            $self->new_item( 'Chapter 3 Parrot Intermediate Representation', 'docs/book/draft/ch03_pir.pod'),
             $self->new_item( 'Chapter 4 Parrot Compiler Tools', 'docs/book/draft/ch04_compiler_tools.pod'),
             $self->new_item( 'Chapter 5 Parrot Grammar Engine', 'docs/book/draft/ch05_pge.pod'),
             $self->new_item( 'Chapter 6 Not Quite Perl', 'docs/book/draft/ch06_nqp.pod'),

Modified: branches/ops_pct/lib/Parrot/IO/Directory.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/IO/Directory.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/IO/Directory.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -131,7 +131,7 @@
     unless ( -e $self->path ) {
 
         # This dies if it fails.
-        mkpath( $self->path );
+        mkpath( [ $self->path ], 0, 0777 );
     }
 
     return -d $self->path;

Modified: branches/ops_pct/lib/Parrot/IO/Path.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/IO/Path.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/IO/Path.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -101,7 +101,7 @@
     unless ( -e $self->parent_path ) {
 
         # This dies if it fails.
-        mkpath( $self->parent_path );
+        mkpath( [ $self->parent_path ], 0, 0777 );
     }
 
     return -e $self->parent_path;

Modified: branches/ops_pct/lib/Parrot/Op.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Op.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Op.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -323,7 +323,6 @@
     local $_ = shift;
     my $trans = shift;
 
-    s/{{([a-z]+)\@([^{]*?)}}/ $trans->access_arg($1, $2, $self); /me;
     s/{{\@([^{]*?)}}/   $trans->access_arg($self->arg_type($1 - 1), $1, $self); /me;
 
     s/{{=0,=([^{]*?)}}/   $trans->restart_address($1) . "; {{=0}}"; /me;

Modified: branches/ops_pct/lib/Parrot/Ops2pm.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Ops2pm.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Ops2pm.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -323,7 +323,7 @@
     my $cwd     = cwd();
     my $fulldir = File::Spec->catdir( $cwd, $self->{moddir} );
     if ( !-d $fulldir ) {
-        if ( !File::Path::mkpath( $fulldir, { mode => 0755 } ) ) {
+        if ( !File::Path::mkpath( [ $fulldir ], 0, 0755 ) ) {
             -d $fulldir
                 or die "$self->{script}: Could not mkdir $fulldir: $!!\n";
         }
@@ -412,7 +412,7 @@
     my $cwd     = cwd();
     my $fulldir = File::Spec->catdir( $cwd, $self->{inc_dir} );
     if ( !-d $fulldir ) {
-        if ( !File::Path::mkpath( $fulldir, { mode => 0755 } ) ) {
+        if ( !File::Path::mkpath( [ $fulldir ], 0, 0755 ) ) {
             -d $fulldir
                 or die "$self->{script}: Could not mkdir $fulldir: $!!\n";
         }

Modified: branches/ops_pct/lib/Parrot/OpsFile.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/OpsFile.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/OpsFile.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -508,8 +508,8 @@
         #
         #   HALT()             {{=0}}   PC' = 0       Halts run_ops loop, no resume
         #
-        #   restart OFFSET(X)  {{=0,+=X}}   PC' = 0       Restarts at PC + X
-        #   restart NEXT()     {{=0,+=S}}   PC' = 0       Restarts at PC + S
+        #   restart OFFSET(X)  {{=0,+=X}}   PC' = 0   Restarts at PC + X
+        #   restart NEXT()     {{=0,+=S}}   PC' = 0   Restarts at PC + S
         #
         #   $X                 {{@X}}   Argument X    $0 is opcode, $1 is first arg
         #
@@ -525,25 +525,26 @@
         # with labels, etc.).
         #
 
-        $branch   ||= $body =~ s/\bgoto\s+OFFSET\(\( (.*?) \)\)/{{+=$1}}/mg;
         $absolute ||= $body =~ s/\bgoto\s+ADDRESS\(\( (.*?) \)\)/{{=$1}}/mg;
-        $body =~ s/\bexpr\s+OFFSET\(\( (.*?) \)\)/{{^+$1}}/mg;
-        $body =~ s/\bexpr\s+ADDRESS\(\( (.*?) \)\)/{{^$1}}/mg;
-        $body =~ s/\bOP_SIZE\b/{{^$op_size}}/mg;
-
-        $branch ||= $body =~ s/\bgoto\s+OFFSET\((.*?)\)/{{+=$1}}/mg;
-        $body =~ s/\bgoto\s+NEXT\(\)/{{+=$op_size}}/mg;
+                      $body =~ s/\bexpr\s+ADDRESS\(\( (.*?) \)\)/{{^$1}}/mg;
         $absolute ||= $body =~ s/\bgoto\s+ADDRESS\((.*?)\)/{{=$1}}/mg;
+                      $body =~ s/\bexpr\s+ADDRESS\((.*?)\)/{{^$1}}/mg;
+
+        $branch   ||= $short_name =~ /runinterp/;
+        $branch   ||= $body =~ s/\bgoto\s+OFFSET\(\( (.*?) \)\)/{{+=$1}}/mg;
+                      $body =~ s/\bexpr\s+OFFSET\(\( (.*?) \)\)/{{^+$1}}/mg;
+        $branch   ||= $body =~ s/\bgoto\s+OFFSET\((.*?)\)/{{+=$1}}/mg;
+                      $body =~ s/\bexpr\s+OFFSET\((.*?)\)/{{^+$1}}/mg;
+
         $pop      ||= $body =~ s/\bgoto\s+POP\(\)/{{=*}}/mg;
-        $body =~ s/\bexpr\s+OFFSET\((.*?)\)/{{^+$1}}/mg;
-        $next ||= $body =~ s/\bexpr\s+NEXT\(\)/{{^+$op_size}}/mg;
-        $body =~ s/\bexpr\s+ADDRESS\((.*?)\)/{{^$1}}/mg;
-        $body =~ s/\bexpr\s+POP\(\)/{{^*}}/mg;
+                      $body =~ s/\bexpr\s+POP\(\)/{{^*}}/mg;
 
-        $body =~ s/\bHALT\(\)/{{=0}}/mg;
+        $next     ||= $short_name =~ /runinterp/;
+        $next     ||= $body =~ s/\bexpr\s+NEXT\(\)/{{^+$op_size}}/mg;
+                      $body =~ s/\bgoto\s+NEXT\(\)/{{+=$op_size}}/mg;
 
-        $branch ||= $short_name =~ /runinterp/;
-        $next   ||= $short_name =~ /runinterp/;
+        $body =~ s/\bHALT\(\)/{{=0}}/mg;
+        $body =~ s/\bOP_SIZE\b/{{^$op_size}}/mg;
 
         if ( $body =~ s/\brestart\s+OFFSET\((.*?)\)/{{=0,+=$1}}/mg ) {
             $branch  = 1;
@@ -567,7 +568,7 @@
         my $max_arg_num = @$args;
         my @found_args = ($body =~ m/{{@(\d+)}}/g);
         foreach my $arg (@found_args) {
-          die "opcode '$short_name' uses '\$$arg' but only has $max_arg_num parameters.\n" if $arg > $max_arg_num;
+            die "opcode '$short_name' uses '\$$arg' but only has $max_arg_num parameters.\n" if $arg > $max_arg_num;
         }
 
 
@@ -576,17 +577,18 @@
         $op->body( $nolines ? $body : qq{#line $line "$file_escaped"\n$body} );
 
         # Constants here are defined in include/parrot/op.h
-        or_flag( \$jumps, "PARROT_JUMP_RELATIVE" ) if $branch;
         or_flag( \$jumps, "PARROT_JUMP_ADDRESS"  ) if $absolute;
+        or_flag( \$jumps, "PARROT_JUMP_RELATIVE" ) if $branch;
         or_flag( \$jumps, "PARROT_JUMP_POP"      ) if $pop;
         or_flag( \$jumps, "PARROT_JUMP_ENEXT"    ) if $next;
+        or_flag( \$jumps, "PARROT_JUMP_RESTART"  ) if $restart;
 
         # I'm assuming the op branches to the value in the last argument.
-        or_flag( \$jumps, "PARROT_JUMP_GNEXT" )
-            if ( ($jumps)
+        if ( ($jumps)
             && ( $fixedargs[ @fixedargs - 1 ] )
-            && ( $fixedargs[ @fixedargs - 1 ] eq 'i' ) );
-        or_flag( \$jumps, "PARROT_JUMP_RESTART" ) if ($restart);
+            && ( $fixedargs[ @fixedargs - 1 ] eq 'i' ) ) {
+            or_flag( \$jumps, "PARROT_JUMP_GNEXT" );
+        }
 
         $op->jump($jumps);
         $self->push_op($op);

Modified: branches/ops_pct/lib/Parrot/Pmc2c/Method.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Pmc2c/Method.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Pmc2c/Method.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -104,8 +104,8 @@
 
     return $1  if $char =~ /([ISP])/;
     return 'N' if $char eq 'F';
-    return 'v' if $type eq 'void';
     return 'V' if $type =~ /void\s*\*/;
+    return 'v' if $type =~ /void\s*$/;
     return 'P' if $type =~ /opcode_t\*/;
     return 'I' if $type =~ /int(val)?/i;
     return '?';

Modified: branches/ops_pct/lib/Parrot/Pmc2c/PMC/ParrotClass.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Pmc2c/PMC/ParrotClass.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Pmc2c/PMC/ParrotClass.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -43,7 +43,6 @@
     getprops
     is_same
     morph
-    nextkey_keyed_int
     set_integer_keyed_int
     set_number_keyed_int
     set_pmc_keyed_int

Modified: branches/ops_pct/lib/Parrot/Pmc2c/PMC/RO.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Pmc2c/PMC/RO.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Pmc2c/PMC/RO.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,4 +1,4 @@
-# Copyright (C) 2004-2008, Parrot Foundation.
+# Copyright (C) 2004-2009, Parrot Foundation.
 
 # $Id$
 
@@ -43,11 +43,16 @@
 
     my $self = bless Parrot::Pmc2c::PMC->new(
         {
-            parents => [ $parent->name, @{ $parent->parents } ],    # prepend self to parrent
-            flags => { ( %{ $parent->get_flags } ), 'is_ro' => 1 }, # copy flags, set is_ro
-            name       => $parent->name . "_ro",                    # set pmcname
-            vtable     => $parent->vtable,                          # and alias vtable
-            parentname => $parent->name,                            # set parentname
+            # prepend self to parent
+            parents => [ $parent->name, @{ $parent->parents } ],
+            # copy flags, set is_ro
+            flags => { ( %{ $parent->get_flags } ), 'is_ro' => 1 },
+            # set pmcname
+            name       => $parent->name . "_ro",
+            # and alias vtable
+            vtable     => $parent->vtable,
+            # set parentname
+            parentname => $parent->name,
         }
     ), $classname;
 
@@ -56,7 +61,8 @@
     {
 
       # autogenerate for nonstandard types
-      # (RT#44433 is this appropriate or do we want them to each be explicitly cleared to have RO ?)
+      # (RT #44433: is this appropriate or do we want them to each be
+      # explicitly cleared to have RO ?)
         no strict 'refs';
         if ( !@{ ref($self) . '::ISA' } ) {
             @{ ref($self) . '::ISA' } = "Parrot::Pmc2c::PMC::RO";
@@ -66,15 +72,16 @@
     foreach my $vt_method ( @{ $self->vtable->methods } ) {
         my $name = $vt_method->name;
 
-        # Generate ro variant only iff we override method constantness with ":write"
+        # Generate RO variant only if we override method constantness
+        # with ":write"
         next unless $parent->{has_method}{$name}
                     && $parent->vtable_method_does_write($name)
                     && !$parent->vtable->attrs($name)->{write};
 
         # All parameters passed in are shims, because we're
         # creating an exception-thrower.
-        my @parameters = split( /\s*,\s*/, $vt_method->parameters );
-        @parameters = map { "SHIM($_)" } @parameters;
+        my @parameters = map { "SHIM($_)" }
+                         split( /\s*,\s*/, $vt_method->parameters );
 
         my $ro_method = Parrot::Pmc2c::Method->new(
             {

Modified: branches/ops_pct/lib/Parrot/Pmc2c/PMCEmitter.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Pmc2c/PMCEmitter.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Pmc2c/PMCEmitter.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1002,12 +1002,15 @@
 
         my $multis = $multi_methods{$vt_method_name};
 
+        # Get parameters.      strip type from param
+        my @parameters = map { s/(\s*\S+\s*\*?\s*)//; $_ } split (/,/, $method->parameters);
+
         # Gather "case :"
-        my @cases = map { $self->generate_single_case($vt_method_name, $_) } @$multis;
+        my @cases = map { $self->generate_single_case($vt_method_name, $_, @parameters) } @$multis;
         my $cases = join "\n", @cases;
 
         my $body = <<"BODY";
-    INTVAL type = VTABLE_type(INTERP, value);
+    INTVAL type = VTABLE_type(INTERP, $parameters[0]);
     /* For dynpmc fallback to MMD */
     if ((type >= enum_class_core_max) || (SELF.type() >= enum_class_core_max))
         type = enum_class_core_max;
@@ -1027,13 +1030,12 @@
 
 # Generate single case for switch VTABLE
 sub generate_single_case {
-    my ($self, $vt_method_name, $multi) = @_;
+    my ($self, $vt_method_name, $multi, @parameters) = @_;
 
     my ($type, $ssig, $fsig, $ns, $func, $impl) = @$multi;
     my $case;
 
     # Gather parameters names
-    my @parameters = map { s/\s*PMC\s*\*\s*//; $_ } split (/,/, $impl->parameters);
     my $parameters = join ', ', @parameters;
     # ISO C forbids return with expression from void functions.
     my $return = $impl->return_type =~ /^void\s*$/
@@ -1082,12 +1084,20 @@
             'return retval;',
         );
     }
+    elsif ($letter eq 'S') {
+        return (
+            "PP->" . $letter,
+            "STRING *retval;",
+            ', &retval',
+            'return retval;',
+        );
+    }
     elsif ($letter eq 'P') {
         return (
             'PPP->P',
-            '',
-            ", &$parameters[1]",
-            "return $parameters[1];",
+            'PMC *retval;',
+            ", &retval",
+            "return retval;",
         );
     }
     elsif ($letter eq 'v') {

Modified: branches/ops_pct/lib/Parrot/Test.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Test.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Test.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -959,22 +959,13 @@
             {
                 my $cfg = File::Spec->join( 'src', "parrot_config$PConfig{o}" );
                 my $iculibs = $PConfig{has_icu} ? $PConfig{icu_shared} : q{};
-                my $libparrot =
-                    $PConfig{parrot_is_shared}
-                      ? ("$PConfig{rpath_blib} "
-                        . (($^O =~ m/MSWin32/ and $PConfig{cc} =~ /\bcl\b/)
-                          ? ""
-                          : "-L$PConfig{blib_dir} "))
-                        . ($^O =~ m/MSWin32/
-                          ? $PConfig{libparrot_linkflags}
-                          : "-lparrot")
-                      : File::Spec->join(
-                          @PConfig{qw/build_dir blib_dir libparrot_static/},
-                      );
                 my $cmd =
-                      "$PConfig{link} $PConfig{linkflags} $PConfig{ld_debug} "
-                    . "$obj_f $cfg $PConfig{ld_out}$exe_f "
-                    . "$libparrot $iculibs $PConfig{libs}";
+                      "$PConfig{link} "
+                    . "$PConfig{ld_out}$exe_f "
+                    . "$obj_f $cfg "
+                    . "$PConfig{libparrot_linkflags} "
+                    . "$PConfig{linkflags} $PConfig{ld_debug} "
+                    . "$iculibs $PConfig{libs}";
                 my $exit_code = run_command(
                     $cmd,
                     'STDOUT' => $build_f,

Modified: branches/ops_pct/lib/Parrot/Vtable.pm
==============================================================================
--- branches/ops_pct/lib/Parrot/Vtable.pm	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/lib/Parrot/Vtable.pm	Fri Jul 24 19:42:02 2009	(r40257)
@@ -275,48 +275,6 @@
 #define NUM_VTABLE_FUNCTIONS $num_vtable_funcs
 
 #endif /* PARROT_IN_OBJECTS_C */
-
-/* Need this for add, subtract, multiply, divide, mod, cmod, bitwise
-   (and, or, xor, lshift, rshift), concat, logical (and, or, xor),
-   repeat, eq, cmp */
-
-/* &gen_from_enum(mmd.pasm) */
-
-typedef enum {
-EOM
-    for my $entry ( @{$vtable} ) {
-        next unless ( $entry->[4] =~ /MMD_/ );
-        next if ( $entry->[4] =~ /_INT$/ );
-        next if ( $entry->[4] =~ /_STR$/ );
-        next if ( $entry->[4] =~ /_FLOAT$/ );
-        $macros .= <<"EOM";
-        $entry->[4],
-EOM
-    }
-    $macros .= <<'EOM';
-        MMD_USER_FIRST
-} parrot_mmd_func_enum;
-
-/* &end_gen */
-
-#ifdef PARROT_IN_OBJECTS_C
-static PARROT_OBSERVER const char * const Parrot_mmd_func_names[] = {
-EOM
-
-    for my $entry ( @{$vtable} ) {
-        next unless ( $entry->[4] =~ /MMD_/ );
-        next if ( $entry->[4] =~ /_INT$/ );
-        next if ( $entry->[4] =~ /_STR$/ );
-        next if ( $entry->[4] =~ /_FLOAT$/ );
-        $macros .= <<"EOM";
-        \"$entry->[1]\",
-EOM
-    }
-    $macros .= <<"EOM";
-    NULL
-};
-
-#endif /* PARROT_IN_OBJECTS_C */
 EOM
 
     $macros;

Modified: branches/ops_pct/ports/cygwin/README
==============================================================================
--- branches/ops_pct/ports/cygwin/README	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ports/cygwin/README	Fri Jul 24 19:42:02 2009	(r40257)
@@ -732,7 +732,6 @@
  /usr/lib/parrot/1.0.0/include/iotypes.pasm
  /usr/lib/parrot/1.0.0/include/iterator.pasm
  /usr/lib/parrot/1.0.0/include/longopt.pasm
- /usr/lib/parrot/1.0.0/include/mmd.pasm
  /usr/lib/parrot/1.0.0/include/opengl_defines.pasm
  /usr/lib/parrot/1.0.0/include/parrotlib.pbc
  /usr/lib/parrot/1.0.0/include/pmctypes.pasm

Modified: branches/ops_pct/ports/debian/parrot-devel.install.in
==============================================================================
--- branches/ops_pct/ports/debian/parrot-devel.install.in	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ports/debian/parrot-devel.install.in	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,7 +1,6 @@
 usr/bin/parrot_debugger
 usr/bin/pbc_disassemble
 usr/bin/pbc_dump
-usr/bin/pbc_info
 usr/bin/pbc_merge
 usr/bin/parrot_config
 usr/lib/parrot/@VERSION@/tools/*

Modified: branches/ops_pct/ports/debian/rules
==============================================================================
--- branches/ops_pct/ports/debian/rules	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ports/debian/rules	Fri Jul 24 19:42:02 2009	(r40257)
@@ -44,14 +44,13 @@
 	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" src/pbc_dump.c debian/pbc_dump.1
 	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" src/pbc_disassemble.c debian/pbc_disassemble.1
 	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" src/parrot_debugger.c debian/parrot_debugger.1
-	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" src/pbc_info.c debian/pbc_info.1
 	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" src/pbc_merge.c debian/pbc_merge.1
 	touch build-stamp
 
 clean: debian-control-stamp
 	dh_testdir
 	dh_testroot
-	rm -f build-stamp configure-stamp debian-control-stamp debian/parrot.1 debian/parrot_config.1 debian/pbc_dump.1 debian/pbc_disassemble.1 debian/parrot-debugger.1 debian/pbc_info.1 debian/pbc_merge.1 debian/libparrot$(SOVERSION).install src/main.o installable_pbc_to_exe ext/Parrot-Embed/Makefile.PL test.c test.ldo
+	rm -f build-stamp configure-stamp debian-control-stamp debian/parrot.1 debian/parrot_config.1 debian/pbc_dump.1 debian/pbc_disassemble.1 debian/parrot-debugger.1 debian/pbc_merge.1 debian/libparrot$(SOVERSION).install src/main.o installable_pbc_to_exe ext/Parrot-Embed/Makefile.PL test.c test.ldo
 	[ ! -f Makefile ] || $(MAKE) distclean
 	dh_clean 
 
@@ -89,7 +88,7 @@
 	dh_testroot -a
 	dh_installchangelogs -a ChangeLog
 	dh_installman -pparrot-minimal debian/parrot.1
-	dh_installman -pparrot-devel debian/parrot_debugger.1 debian/pbc_disassemble.1 debian/pbc_dump.1 debian/pbc_info.1 debian/pbc_merge.1 debian/parrot_config.1
+	dh_installman -pparrot-devel debian/parrot_debugger.1 debian/pbc_disassemble.1 debian/pbc_dump.1 debian/pbc_merge.1 debian/parrot_config.1
 	dh_installdocs -a
 	dh_strip -a
 	dh_compress -a

Modified: branches/ops_pct/ports/fedora/parrot.spec.fedora
==============================================================================
--- branches/ops_pct/ports/fedora/parrot.spec.fedora	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ports/fedora/parrot.spec.fedora	Fri Jul 24 19:42:02 2009	(r40257)
@@ -235,7 +235,6 @@
 %{_bindir}/parrot_config
 %{_bindir}/parrot_debugger
 %{_bindir}/pbc_disassemble
-%{_bindir}/pbc_info
 %{_bindir}/pbc_merge
 %{_bindir}/pbc_to_exe
 %{_bindir}/pbc_dump

Modified: branches/ops_pct/ports/macports/Portfile
==============================================================================
--- branches/ops_pct/ports/macports/Portfile	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ports/macports/Portfile	Fri Jul 24 19:42:02 2009	(r40257)
@@ -55,7 +55,7 @@
 
         set executables {
             parrot parrot_config parrot_debugger
-            pbc_disassemble pbc_info pbc_merge pbc_to_exe pbc_dump
+            pbc_disassemble pbc_merge pbc_to_exe pbc_dump
         }
 
         foreach exe $executables { 

Modified: branches/ops_pct/ports/mandriva/parrot.spec.mandriva
==============================================================================
--- branches/ops_pct/ports/mandriva/parrot.spec.mandriva	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ports/mandriva/parrot.spec.mandriva	Fri Jul 24 19:42:02 2009	(r40257)
@@ -158,7 +158,6 @@
 %{_bindir}/parrot_config
 %{_bindir}/parrot_debugger
 %{_bindir}/pbc_disassemble
-%{_bindir}/pbc_info
 %{_bindir}/pbc_merge
 %{_bindir}/pbc_to_exe
 %{_bindir}/pbc_dump

Modified: branches/ops_pct/ports/suse/parrot.spec.suse
==============================================================================
--- branches/ops_pct/ports/suse/parrot.spec.suse	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ports/suse/parrot.spec.suse	Fri Jul 24 19:42:02 2009	(r40257)
@@ -134,7 +134,6 @@
 %{_bindir}/parrot_config
 %{_bindir}/parrot_debugger
 %{_bindir}/pbc_disassemble
-%{_bindir}/pbc_info
 %{_bindir}/pbc_merge
 %{_bindir}/pbc_to_exe
 %{_bindir}/pbc_dump

Modified: branches/ops_pct/ports/ubuntu/changelog
==============================================================================
--- branches/ops_pct/ports/ubuntu/changelog	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ports/ubuntu/changelog	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,9 +1,16 @@
 parrot (1.0.0-1ubuntu1) karmic; urgency=low
-  * Resynchronize with Debian unstable.
-  * Add a patch to detect the lpia architecture, to correctly configure for
-    unaligned function pointers.
 
- -- Allison Randal <allison at parrot.org>  Thu, 28 May 2009 13:13:12 -0700
+  [ Allison Randal ]
+  * Merge from Debian unstable.
+  * Ubuntu remaining changes:
+   - Add 01-lpia-FTBFS.path : from upstream, fix FTBFS for lpia.
+
+  [ Julien Lavergne ]
+   - Add quilt support for the patch :
+    + debian/control.in : Add quilt as build-depends.
+    + debian/rules : Add quilt support.
+
+ -- Julien Lavergne <julien.lavergne at gmail.com>  Fri, 29 May 2009 01:34:42 +0200
 
 parrot (1.0.0-1) unstable; urgency=low
   * New upstream release
@@ -38,12 +45,6 @@
 
  -- Allison Randal <allison at parrot.org>  Wed, 25 Mar 2009 00:45:40 -0500
 
-parrot (0.9.0-1ubuntu1) intrepid; urgency=low
-
-  * New upstream release.
-
- -- Allison Randal <allison at parrot.org>  Tue, 03 Feb 2009 23:21:12 +0000
-
 parrot (0.9.0-1) unstable; urgency=low
 
   * New upstream release
@@ -64,12 +65,6 @@
 
  -- Allison Randal <allison at parrot.org>  Fri, 23 Jan 2009 15:16:25 -0800
 
-parrot (0.8.1-0ubuntu1) intrepid; urgency=low
-
-  * New upstream release
-
- -- Allison Randal <allison at parrot.org>  Fri, 12 Dec 2008 16:40:43 +0800
-
 parrot (0.7.0-1) unstable; urgency=low
 
   * New upstream release
@@ -114,6 +109,12 @@
 
  -- Allison Randal <allison at perl.org>  Sun, 30 Dec 2007 17:21:45 +0000
 
+parrot (0.4.13-1ubuntu4) karmic; urgency=low
+
+  * No-change rebuild for libicu38 -> libicu40 transition.
+
+ -- Steve Kowalik <stevenk at ubuntu.com>  Thu, 04 Jun 2009 08:01:54 +1000
+
 parrot (0.4.13-1ubuntu3) hardy; urgency=low
 
   * Replace libicu36-dev with libicu-dev.

Modified: branches/ops_pct/ports/ubuntu/control.in
==============================================================================
--- branches/ops_pct/ports/ubuntu/control.in	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/ports/ubuntu/control.in	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,9 +1,10 @@
 Source: parrot
 Section: interpreters
 Priority: optional
-Maintainer: Ubuntu MOTU Developers <ubuntu-motu at lists.ubuntu.com>
+Maintainer: Ubuntu Developers <ubuntu-devel-discuss at lists.ubuntu.com>
 XSBC-Original-Maintainer: Debian Parrot Maintainers <pkg-parrot-devel at lists.alioth.debian.org>
-Build-Depends: debhelper (>= 5.0.0), perl, perl-doc, libgdbm-dev, libreadline-dev
+Uploaders: Allison Randal <allison at parrot.org>, Nuno Carvalho <mestre.smash at gmail.com>, Patrick Michaud <pmichaud at pobox.com>
+Build-Depends: debhelper (>= 5.0.0), perl, perl-doc, libgdbm-dev, libreadline-dev, quilt
 Standards-Version: 3.8.1
 
 Package: parrot

Deleted: branches/ops_pct/ports/ubuntu/lpia_no_aligned_funcptr.patch
==============================================================================
--- branches/ops_pct/ports/ubuntu/lpia_no_aligned_funcptr.patch	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,12 +0,0 @@
-Index: /trunk/config/auto/gcc.pm
-===================================================================
---- /trunk/config/auto/gcc.pm (revision 37201)
-+++ /trunk/config/auto/gcc.pm (revision 39212)
-@@ -97,5 +97,6 @@
-     );
-     $conf->data->set( HAS_aligned_funcptr => 0 )
--        if $conf->data->get_p5('OSNAME') eq 'hpux';
-+        if (  $conf->data->get_p5('OSNAME') eq 'hpux'
-+           || $conf->data->get('archname') =~ /gnulp/); # lpia arch
-     return 1;
- }

Copied: branches/ops_pct/ports/ubuntu/patches/01-lpia-FTBFS.path (from r40255, trunk/ports/ubuntu/patches/01-lpia-FTBFS.path)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/ports/ubuntu/patches/01-lpia-FTBFS.path	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/ports/ubuntu/patches/01-lpia-FTBFS.path)
@@ -0,0 +1,12 @@
+--- parrot-1.0.0.orig/config/auto/gcc.pm
++++ parrot-1.0.0/config/auto/gcc.pm
+@@ -96,7 +96,8 @@
+         HAS_aligned_funcptr => 1
+     );
+     $conf->data->set( HAS_aligned_funcptr => 0 )
+-        if $conf->data->get_p5('OSNAME') eq 'hpux';
++        if (  $conf->data->get_p5('OSNAME') eq 'hpux'
++           || $conf->data->get('archname') =~ /gnulp/); # lpia arch
+     return 1;
+ }
+ 

Copied: branches/ops_pct/ports/ubuntu/patches/series (from r40255, trunk/ports/ubuntu/patches/series)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/ports/ubuntu/patches/series	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/ports/ubuntu/patches/series)
@@ -0,0 +1 @@
+01-lpia-FTBFS.path

Copied: branches/ops_pct/ports/ubuntu/rules (from r40255, trunk/ports/ubuntu/rules)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/ports/ubuntu/rules	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/ports/ubuntu/rules)
@@ -0,0 +1,107 @@
+#!/usr/bin/make -f
+
+include /usr/share/quilt/quilt.make
+
+CFLAGS = -Wall -g
+VERSION = $(shell cat VERSION)
+SOVERSION = $(VERSION)
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+	CFLAGS += -O0
+else
+	CFLAGS += -O2
+endif
+
+CONTROL_FILES = \
+  debian/control.in \
+  debian/parrot.install.in \
+  debian/parrot-minimal.install.in \
+  debian/parrot-doc.install.in \
+  debian/parrot-devel.install.in \
+  debian/libparrot.install.in \
+  debian/libparrot-dev.install.in
+
+debian-control-stamp: $(CONTROL_FILES) VERSION
+	for infile in $(CONTROL_FILES); do \
+	    outfile=`echo $$infile | sed "s/\.in$$//"`; \
+	    sed -e "s/@VERSION@/$(VERSION)/g" \
+	        -e "s/@SOVERSION@/$(SOVERSION)/g" \
+	            <$$infile >$$outfile; \
+	done
+	touch $@
+
+configure: configure-stamp
+configure-stamp: debian-control-stamp $(QUILT_STAMPFN)
+	dh_testdir
+	perl Configure.pl --prefix=/usr
+	touch configure-stamp
+
+build: build-stamp
+
+build-stamp: configure-stamp 
+	dh_testdir
+	$(MAKE) installable
+	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" docs/running.pod debian/parrot.1
+	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" tools/util/parrot-config.pir debian/parrot_config.1
+	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" src/pbc_dump.c debian/pbc_dump.1
+	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" src/pbc_disassemble.c debian/pbc_disassemble.1
+	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" src/parrot_debugger.c debian/parrot_debugger.1
+	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" src/pbc_info.c debian/pbc_info.1
+	pod2man --section=1 --release="Debian Project" --center="Debian GNU/Linux manual" src/pbc_merge.c debian/pbc_merge.1
+	touch build-stamp
+
+clean: debian-control-stamp unpatch
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp configure-stamp debian-control-stamp debian/parrot.1 debian/parrot_config.1 debian/pbc_dump.1 debian/pbc_disassemble.1 debian/parrot-debugger.1 debian/pbc_info.1 debian/pbc_merge.1 debian/libparrot$(SOVERSION).install src/main.o installable_pbc_to_exe ext/Parrot-Embed/Makefile.PL test.c test.ldo
+	[ ! -f Makefile ] || $(MAKE) distclean
+	dh_clean 
+
+debian/libparrot$(SOVERSION).install: debian/libparrot.install VERSION
+	cp $< $@
+
+install: build debian/libparrot$(SOVERSION).install
+	dh_testdir
+	dh_testroot
+	dh_clean -k 
+	$(MAKE) install-dev DESTDIR=$(CURDIR)/debian/tmp
+	dh_installdirs
+	find $(CURDIR)/debian/tmp -type f
+	dh_install --sourcedir=$(CURDIR)/debian/tmp --list-missing
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+	dh_testdir -i 
+	dh_testroot -i
+	dh_installchangelogs -i ChangeLog
+	dh_installdocs -i
+	dh_link -plibparrot-dev usr/lib/libparrot.so.$(SOVERSION) usr/lib/libparrot.so
+	dh_compress -pparrot-doc -X.pod
+	dh_compress -plibparrot-dev
+	dh_fixperms -i
+	dh_installdeb -i
+	dh_gencontrol -i
+	dh_md5sums -i
+	dh_builddeb -i
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir -a
+	dh_testroot -a
+	dh_installchangelogs -a ChangeLog
+	dh_installman -pparrot-minimal debian/parrot.1
+	dh_installman -pparrot-devel debian/parrot_debugger.1 debian/pbc_disassemble.1 debian/pbc_dump.1 debian/pbc_info.1 debian/pbc_merge.1 debian/parrot_config.1
+	dh_installdocs -a
+	dh_strip -a
+	dh_compress -a
+	dh_fixperms -a
+	dh_makeshlibs -plibparrot$(SOVERSION)
+	dh_shlibdeps -a -Llibparrot$(SOVERSION) -l$(CURDIR)/debian/libparrot$(SOVERSION)/usr/lib
+	dh_installdeb -a
+	dh_gencontrol -a
+	dh_md5sums -a
+	dh_builddeb -a
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure

Modified: branches/ops_pct/runtime/parrot/library/Crow.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/Crow.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/Crow.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -110,16 +110,16 @@
     .param string template
     .param pmc    data
 
-    .local pmc    iter
-    iter = new 'Iterator', data
+    .local pmc    it
+    it = iter data
 
     .local string symbol, value
 
   it_loop:
-    unless iter goto it_done
-    $P0 = shift iter
+    unless it goto it_done
+    $P0 = shift it
     symbol = 'get_symbol'($P0)
-    value  = iter[$P0]
+    value  = it[$P0]
       repl_loop:
         $I0 = index template, symbol
         if -1 == $I0 goto repl_done

Modified: branches/ops_pct/runtime/parrot/library/Curses.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/Curses.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/Curses.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,6 +1,12 @@
 # Copyright (C) 2004-2009, Parrot Foundation.
 # $Id$
 
+.macro export_dl_func(lib, name, sig)
+    .local pmc edlftmp
+    dlfunc edlftmp, .lib, .name, .sig
+    set_global .name, edlftmp
+.endm
+
 .namespace ['Curses']
 .sub __ncurses_init :load
 
@@ -125,6 +131,29 @@
 dlfunc $P2, $P1, 'data_behind', 'lp'
 set_global 'data_behind', $P2
 
+loadlib $P1, 'libpanel'
+if $P1 goto has_panel_lib
+loadlib $P1, 'cygpanel-8'
+if $P1 goto has_panel_lib
+goto no_panel_lib
+has_panel_lib:
+.export_dl_func($P1, 'new_panel', 'pp')
+.export_dl_func($P1, 'bottom_panel', 'ip')
+.export_dl_func($P1, 'top_panel', 'ip')
+.export_dl_func($P1, 'show_panel', 'ip')
+.export_dl_func($P1, 'update_panels', 'v')
+.export_dl_func($P1, 'hide_panel', 'ip')
+.export_dl_func($P1, 'panel_window', 'pp')
+.export_dl_func($P1, 'replace_panel', 'ipp')
+.export_dl_func($P1, 'move_panel', 'ipii')
+.export_dl_func($P1, 'panel_hidden', 'ip')
+.export_dl_func($P1, 'panel_above', 'pp')
+.export_dl_func($P1, 'panel_below', 'pp')
+.export_dl_func($P1, 'set_panel_userptr', 'ipp')
+.export_dl_func($P1, 'panel_userptr', 'vp')
+.export_dl_func($P1, 'del_panel', 'ip')
+no_panel_lib:
+
 loadlib $P1, 'libncurses'
 if $P1 goto has_lib1
 loadlib $P1, 'cygncurses-8'

Modified: branches/ops_pct/runtime/parrot/library/Data/Dumper/Default.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/Data/Dumper/Default.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/Data/Dumper/Default.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -110,7 +110,7 @@
     .param pmc hash
     .local string indent
     .local string subindent
-    .local pmc iter
+    .local pmc it
     .local string key
     .local pmc val
     .local pmc keys
@@ -124,13 +124,12 @@
     print " {"
 
     new keys, "ResizablePMCArray"
-    new iter, "Iterator", hash
-    set iter, 0
+    it = iter hash
 
 iter_loop:
-    unless iter, iter_end
+    unless it, iter_end
 
-    shift key, iter
+    shift key, it
     push keys, key
     branch iter_loop
 
@@ -422,11 +421,11 @@
     .local string subindent, indent
     (subindent, indent) = dumper.'newIndent'()
 
-    .local pmc hash, iter
+    .local pmc hash, it
     hash = self.'hash'()
-    iter = new 'Iterator', hash
+    it = iter hash
   dump_hash_loop:
-    unless iter goto dump_hash_end
+    unless it goto dump_hash_end
     if hasstuff goto dump_hash_1
     print " {"
     hasstuff = 1
@@ -435,7 +434,7 @@
     print subindent
     .local string key
     .local pmc val
-    key = shift iter
+    key = shift it
     val = hash[key]
     print "<"
     print key

Deleted: branches/ops_pct/runtime/parrot/library/Data/Replace.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/Data/Replace.pir	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,234 +0,0 @@
-# $Id$
-
-=head1 TITLE
-
-Data::Replace - data replacing implemented in PIR
-
-=head1 SYNOPSIS
-
-    ...
-
-    load_bytecode "Data/Replace.pbc"
-
-    .local pmc replace
-
-    replace = get_hll_global ['Data::Replace'], 'replace'
-
-    replace( array, old, new )
-
-    ...
-
-
-=head1 DESCRIPTION
-
-Replaces every occurrence of a specified PMC with another PMC
-in a nested, possible self-referential data structure.
-
-=head1 FUNCTIONS
-
-This library provides the following function:
-
-=over 4
-
-=cut
-
-.namespace ["Data::Replace"]
-
-=item replace( where, old, new )
-
-Replaces every "old" with "new" inside the aggregate "where".
-
-=cut
-
-.sub replace
-    .param pmc where
-    .param pmc oldVal
-    .param pmc newVal
-    .local pmc cache
-
-    new cache, 'ResizablePMCArray'
-    __do_replace( where, oldVal, newVal, cache )
-.end
-
-
-.sub __in_cache
-    .param pmc val
-    .param pmc cache
-    .local int i
-    .local pmc temp
-
-    set i, cache
-LOOP:
-    dec i
-    if i < 0 goto END
-    temp = cache[i]
-    eq_addr val, temp, IS
-    branch LOOP
-END:
-    .begin_return
-    .set_return 0
-    .end_return
-IS:
-    .begin_return
-    .set_return 1
-    .end_return
-.end
-
-.sub __do_replace
-    .param pmc where
-    .param pmc oldVal
-    .param pmc newVal
-    .param pmc cache
-    .local pmc temp
-    .local string name
-
-    if_null where, END
-
-    # call __replace if the PMC supports it
-    can $I0, where, "__replace"
-    unless $I0 goto CANT_REPLACE
-    where."__replace"( oldVal, newVal, cache )
-    branch REPLACE_PROPS
-CANT_REPLACE:
-
-    # find a Data::Replace method with the name of the type to replace
-    typeof name, where
-    .include 'errors.pasm'
-    errorsoff .PARROT_ERRORS_GLOBALS_FLAG
-    temp = get_hll_global ['"Data::Replace'], name
-    errorson .PARROT_ERRORS_GLOBALS_FLAG
-    # invoke it if found
-    $I0 = defined temp
-    unless $I0 goto REPLACE_PROPS
-    temp( where, oldVal, newVal, cache )
-
-REPLACE_PROPS:
-    prophash temp, where
-    set $I0, temp
-    if $I0 == 0 goto END
-    __do_replace( temp, oldVal, newVal, cache )
-END:
-.end
-
-.sub __onload :load
-    $P0 = get_hll_global ['Data::Replace'], 'ResizablePMCArray'
-    set_hll_global ['Data::Replace'], 'PMCArray', $P0
-    set_hll_global ['Data::Replace'], 'StringArray', $P0
-.end
-
-.sub ResizablePMCArray
-    .param pmc where
-    .param pmc oldVal
-    .param pmc newVal
-    .param pmc cache
-    .local int i
-    .local pmc val
-
-    set i, where
-LOOP:
-    dec i
-    if i < 0 goto END
-
-    val = where[i]
-
-    ne_addr val, oldVal, SKIP
-    where[i] = newVal
-SKIP:
-    $I0 = __in_cache( val, cache )
-    if $I0 goto LOOP
-
-    push cache, val
-    __do_replace( val, oldVal, newVal, cache )
-    branch LOOP
-END:
-    .begin_return
-    .end_return
-.end
-
-.sub Hash :method
-    .param pmc where
-    .param pmc oldVal
-    .param pmc newVal
-    .param pmc cache
-    .local pmc iter
-    .local string key
-    .local pmc val
-
-    new iter, 'Iterator', where
-    set iter, 0
-
-LOOP:
-    unless iter, END
-
-    shift key, iter
-
-    val = where[key]
-
-    ne_addr val, oldVal, SKIP
-    where[key] = newVal
-SKIP:
-    $I0 = __in_cache( val, cache )
-    if $I0 goto LOOP
-
-    push cache, val
-    __do_replace( val, oldVal, newVal, cache )
-    branch LOOP
-
-END:
-    .begin_return
-    .end_return
-.end
-
-.sub Hash :method
-    .param pmc where
-    .param pmc oldVal
-    .param pmc newVal
-    .param pmc cache
-    .local pmc iter
-    .local string key
-    .local pmc val
-
-    new iter, 'Iterator', where
-    set iter, 0
-
-LOOP:
-    unless iter, END
-
-    shift key, iter
-
-    val = where[key]
-
-    ne_addr val, oldVal, SKIP
-    where[key] = newVal
-SKIP:
-    $I0 = __in_cache( val, cache )
-    if $I0 goto LOOP
-
-    push cache, val
-    __do_replace( val, oldVal, newVal, cache )
-    branch LOOP
-
-END:
-    .begin_return
-    .end_return
-.end
-
-=back
-
-=head1 AUTHOR
-
-Jens Rieks E<lt>parrot at jensbeimsurfen dot deE<gt> is the author
-and maintainer.
-Please send patches and suggestions to the Perl 6 Internals mailing list.
-
-=head1 COPYRIGHT
-
-Copyright (C) 2004-2008, Parrot Foundation.
-
-=cut
-
-# Local Variables:
-#   mode: pir
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4 ft=pir:

Modified: branches/ops_pct/runtime/parrot/library/JSON.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/JSON.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/JSON.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -262,14 +262,13 @@
 
   .local pmc keys
   keys = new 'ResizablePMCArray'
-  .local pmc iter
-  iter = new 'Iterator', thing
-  iter = 0
+  .local pmc it
+  it = iter thing
   .local string key
 
 iter_loop:
-  unless iter, done_iter
-  shift key, iter
+  unless it, done_iter
+  shift key, it
   push keys, key
   goto iter_loop
 

Modified: branches/ops_pct/runtime/parrot/library/P6object.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/P6object.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/P6object.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -227,12 +227,12 @@
     .local pmc parrotclassns, mroiter, methods, methoditer
     parrotclassns = parrotclass.'get_namespace'()
     $P0 = parentclass.'inspect'('all_parents')
-    mroiter = new 'Iterator', $P0
+    mroiter = iter $P0
   mro_loop:
     unless mroiter goto mro_end
     $P0 = shift mroiter
     methods = $P0.'methods'()
-    methoditer = new 'Iterator', methods
+    methoditer = iter methods
   method_loop:
     unless methoditer goto mro_loop
     $S0 = shift methoditer
@@ -346,7 +346,8 @@
 .end
 
 
-=item register(parrotclass [, 'name'=>name] [, 'protoobject'=>proto] [, 'parent'=>parentclass] [, 'hll'=>hll])
+=item register(parrotclass [, 'name'=>name] [, 'protoobject'=>proto]
+               [, 'parent'=>parentclass] [, 'hll'=>hll] [, 'how'=>how)
 
 Sets objects of type C<parrotclass> to use C<protoobject>,
 and verifies that C<parrotclass> has P6object methods defined
@@ -359,6 +360,9 @@
 to map to a class name that already exists in Parrot (e.g., 'Hash'
 or 'Object').
 
+The C<how> parameter allows you to specify an already-existing metaclass
+instance to be used for this class rather than creating a new one.
+
 =cut
 
 .sub 'register' :method
@@ -400,11 +404,11 @@
     $S0 = parentclass
     parentclass = split ' ', $S0
   parent_array:
-    .local pmc iter, item
-    iter = new 'Iterator', parentclass
+    .local pmc it, item
+    it = iter parentclass
   parent_loop:
-    unless iter goto parent_done
-    item = shift iter
+    unless it goto parent_done
+    item = shift it
     $S0 = item
     $P0 = split ';', $S0
     $I0 = elements $P0
@@ -423,7 +427,10 @@
     self.'add_parent'(item, 'to'=>parrotclass)
     goto parent_loop
   parent_done:
+    $I0 = isa parrotclass, 'P6object'
+    if $I0 goto isa_p6object_already
     self.'add_parent'('P6object', 'to'=>parrotclass)
+  isa_p6object_already:
 
     ##  determine parrotclass' canonical p6-name
     .local string name
@@ -441,16 +448,20 @@
     ns = split '::', name
   have_ns:
 
-    ##  get the metaclass (how) from :protoobject, or create one
+    ##  get the metaclass (how) from :how, or :protoobject, or create one
     .local pmc how
+    how = options['how']
+    unless null how goto have_how
     $P0 = options['protoobject']
     if null $P0 goto make_how
     how = $P0.'HOW'()
-    goto have_how
+    goto how_setup
   make_how:
     ##  create a metaclass for parrotclass
-    how = new 'P6metaclass'
+    $P0 = typeof self
+    how = new $P0
     setattribute how, 'parrotclass', parrotclass
+  have_how:
 
     ##  create an anonymous class for the protoobject
     .local pmc protoclass, protoobject
@@ -469,10 +480,10 @@
     methodname = shift protooverrides
     unless methodname goto override_loop
     $P0 = parrotclass.'inspect'('all_parents')
-    iter = new 'Iterator', $P0
+    it = iter $P0
   method_loop:
-    unless iter goto method_end
-    $P0 = shift iter
+    unless it goto method_end
+    $P0 = shift it
     $P0 = $P0.'methods'()
     $P0 = $P0[methodname]
     if null $P0 goto method_loop
@@ -506,7 +517,7 @@
     push ns, 'EXPORT'
     push ns, 'ALL'
     set_root_global ns, $S0, protoobject
-    goto have_how
+    goto how_setup
 
     ##  anonymous classes have empty strings for shortname and longname
   anonymous_class:
@@ -515,7 +526,7 @@
     setattribute how, 'longname', longname
     setattribute how, 'shortname', shortname
 
-  have_how:
+  how_setup:
     ##  attach the metaclass object to the parrotclass
     setprop parrotclass, 'metaclass', how
 
@@ -576,7 +587,7 @@
     goto have_parrotclass
   have_parrotclass:
 
-    .local pmc attrlist, iter
+    .local pmc attrlist, it
     attrlist = options['attr']
     if null attrlist goto attr_done
     $I0 = does attrlist, 'array'
@@ -584,10 +595,10 @@
     $S0 = attrlist
     attrlist = split ' ', $S0
   have_attrlist:
-    iter = new 'Iterator', attrlist
+    it = iter attrlist
   iter_loop:
-    unless iter goto iter_end
-    $S0 = shift iter
+    unless it goto iter_end
+    $S0 = shift it
     unless $S0 goto iter_loop
     addattribute parrotclass, $S0
     goto iter_loop
@@ -762,7 +773,6 @@
   normal_check:
     $I0 = can topic, 'HOW'
     unless $I0 goto end
-    topichow = topic.'HOW'()
     topicwhat = topic.'WHAT'()
     $I0 = isa topicwhat, parrotclass
     if $I0 goto end

Modified: branches/ops_pct/runtime/parrot/library/PGE/Dumper.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/PGE/Dumper.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/PGE/Dumper.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -26,7 +26,7 @@
     .param pmc dumper
     .param string label
     .local string indent, subindent
-    .local pmc iter, val
+    .local pmc it, val
     .local string key
     .local pmc hash, array
     .local int hascapts
@@ -41,16 +41,16 @@
     hascapts = 0
     hash = self.'hash'()
     if_null hash, dump_array
-    iter = new 'Iterator', hash
+    it = iter hash
   dump_hash_1:
-    unless iter goto dump_array
+    unless it goto dump_array
     if hascapts goto dump_hash_2
     print " {"
     hascapts = 1
   dump_hash_2:
     print "\n"
     print subindent
-    key = shift iter
+    key = shift it
     val = hash[key]
     print "<"
     print key
@@ -102,7 +102,7 @@
 
     .local pmc capt
     .local int spi, spc
-    .local pmc iter
+    .local pmc it
     .local string prefix1, prefix2
 
     if has_b2 goto start
@@ -147,10 +147,10 @@
   subrules:
     capt = self.'hash'()
     if_null capt, end
-    iter = new 'Iterator', capt
+    it = iter capt
   subrules_1:
-    unless iter goto end
-    $S0 = shift iter
+    unless it goto end
+    $S0 = shift it
     prefix1 = concat prefix, '<'
     concat prefix1, $S0
     concat prefix1, ">"
@@ -462,7 +462,7 @@
     .param pmc dumper
     .param string label
     .local string indent, subindent
-    .local pmc iter, val
+    .local pmc it, val
     .local string key
     .local pmc hash, array
 
@@ -470,12 +470,12 @@
     print " {"
     hash = self
     if_null hash, dump_rest
-    iter = new 'Iterator', hash
+    it = iter hash
   dump_hash:
-    unless iter goto dump_rest
+    unless it goto dump_rest
     print "\n"
     print subindent
-    key = shift iter
+    key = shift it
     val = hash[key]
     print "<"
     print key

Modified: branches/ops_pct/runtime/parrot/library/PGE/Hs.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/PGE/Hs.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/PGE/Hs.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -164,7 +164,7 @@
     .local int ari, arc
     .local int tmpi, cond
     .local string tmps, key
-    .local pmc capt, iter, subelm, elm
+    .local pmc capt, it, subelm, elm
 
     out = ""
 
@@ -204,11 +204,10 @@
     out .= "] ["
     capt = self.'hash'()
     if_null capt, end
-    iter = new 'Iterator', capt
-    iter = 0
-    unless iter goto end
+    it = iter capt
+    unless it goto end
   subrules_body:
-    key = shift iter
+    key = shift it
     cond = defined capt[key]
     unless cond goto subrules_fail
     elm = capt[key]
@@ -218,13 +217,13 @@
     out .= '", '
     bsr dumper
     out .= ")"
-    unless iter goto end
+    unless it goto end
     out .= ", "
     goto subrules_body
   subrules_fail:
     out .= PGE_FAIL
-    key = shift iter
-    unless iter goto end
+    key = shift it
+    unless it goto end
     goto subrules_body
 
   dumper:

Modified: branches/ops_pct/runtime/parrot/library/PGE/Perl6Grammar.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/PGE/Perl6Grammar.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/PGE/Perl6Grammar.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -140,9 +140,9 @@
     .param pmc source
     .param pmc adverbs         :slurpy :named
 
-    .local pmc nstable, namespace
+    .local pmc nstable, ns
     nstable = new 'Hash'
-    namespace = new 'String'
+    ns = new 'String'
     $P0 = new 'Hash'
     $P1 = new 'CodeString'
     $P0['optable'] = $P1
@@ -165,19 +165,19 @@
     $S0 = match['cmd']
     concat $S0, '_stmt'
     $P0 = find_name $S0
-    $P0(match, namespace, nstable)
+    $P0(match, ns, nstable)
     goto stmt_loop
   stmt_end:
 
-    .local pmc initpir, rulepir, iter, ns
+    .local pmc initpir, rulepir, it, ns
     .local string namespace
     initpir = new 'CodeString'
     rulepir = new 'CodeString'
-    iter = new 'Iterator', nstable
+    it = iter nstable
   iter_loop:
-    unless iter goto iter_end
-    namespace = shift iter
-    ns = iter[namespace]
+    unless it goto iter_end
+    namespace = shift it
+    ns  = it[namespace]
     $P0 = ns['rule']
     rulepir .= $P0
     if namespace == 'PGE::Grammar' goto ns_optable
@@ -353,15 +353,15 @@
     optable = $P0['optable']
 
     ##   build the list of traits
-    .local pmc iter
+    .local pmc it
     .local string traitlist
     $P0 = stmt[0]
-    iter = new 'Iterator', $P0
+    it = iter $P0
     traitlist = ''
   trait_loop:
-    unless iter goto trait_end
+    unless it goto trait_end
     .local pmc t
-    t = shift iter
+    t = shift it
     .local string trait, arg
     trait = t['trait']
     $P0 = t['arg']

Modified: branches/ops_pct/runtime/parrot/library/PGE/Util.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/PGE/Util.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/PGE/Util.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -39,13 +39,13 @@
     .param pmc mob                                 # match object
     .param pmc list            :slurpy             # message arguments
 
-    .local pmc iter
+    .local pmc it
     .local string message
     message = ''
-    iter = new 'Iterator', list
+    it = iter list
   iter_loop:
-    unless iter goto iter_end
-    $S0 = shift iter
+    unless it goto iter_end
+    $S0 = shift it
     message .= $S0
     goto iter_loop
   iter_end:
@@ -100,13 +100,13 @@
     .param pmc mob                                 # match object
     .param pmc list            :slurpy             # message arguments
 
-    .local pmc iter
+    .local pmc it
     .local string message
     message = ''
-    iter = new 'Iterator', list
+    it = iter list
   iter_loop:
-    unless iter goto iter_end
-    $S0 = shift iter
+    unless it goto iter_end
+    $S0 = shift it
     message .= $S0
     goto iter_loop
   iter_end:

Modified: branches/ops_pct/runtime/parrot/library/Protoobject.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/Protoobject.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/Protoobject.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -120,11 +120,11 @@
     subc = subclass baseclass, name
 
     unless attrs goto done_attrs
-    .local pmc iter
-    iter = new 'Iterator', attrs
+    .local pmc it
+    it = iter attrs
   iter_loop:
-    unless iter goto done_attrs
-    $S0 = shift iter
+    unless it goto done_attrs
+    $S0 = shift it
     addattribute subc, $S0
     goto iter_loop
   done_attrs:

Modified: branches/ops_pct/runtime/parrot/library/SDL.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/SDL.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/SDL.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -219,6 +219,7 @@
     loadlib ttf_lib, 'libSDL_ttf'
     if ttf_lib goto initialize
     loadlib ttf_lib, 'cygSDL_ttf-2-0-0'
+# RNH this is not trapping a non-existent libSDL_ttf library
     unless ttf_lib goto error
 
   initialize:
@@ -243,15 +244,21 @@
   success:
     dlfunc nci_sub, ttf_lib, 'TTF_OpenFont', 'pti'
     set_hll_global ['SDL::NCI::TTF'], 'OpenFont', nci_sub
-
-    dlfunc nci_sub, ttf_lib, 'TTF_RenderText_Solid', 'pptp'
+#RNH changes: all text routines expect an integer, not a pmc, for color parameter
+    dlfunc nci_sub, ttf_lib, 'TTF_RenderText_Solid', 'ppti'
     set_hll_global ['SDL::NCI::TTF'], 'RenderText_Solid', nci_sub
-    dlfunc nci_sub, ttf_lib, 'TTF_RenderUTF8_Solid', 'pptp'
+    dlfunc nci_sub, ttf_lib, 'TTF_RenderUTF8_Solid', 'ppti'
     set_hll_global ['SDL::NCI::TTF'], 'RenderUTF8_Solid', nci_sub
 
     # this one could be wrong
-    dlfunc nci_sub, ttf_lib, 'TTF_RenderUNICODE_Solid', 'pptp'
+    dlfunc nci_sub, ttf_lib, 'TTF_RenderUNICODE_Solid', 'ppti'
     set_hll_global ['SDL::NCI::TTF'], 'RenderUNICODE_Solid', nci_sub
+# RNH Additions. Add UTF8_Shaded and FontLine skip
+    dlfunc nci_sub, ttf_lib, 'TTF_RenderUTF8_Shaded', 'pptii'
+    set_hll_global ['SDL::NCI::TTF'], 'RenderUTF8_Shaded', nci_sub
+    dlfunc nci_sub, ttf_lib, 'TTF_FontLineSkip', 'ip'
+    set_hll_global ['SDL::NCI::TTF'], 'FontLineSkip', nci_sub
+#end additions
 
     dlfunc nci_sub, ttf_lib, 'TTF_SizeText', 'ipt33'
     set_hll_global ['SDL::NCI::TTF'], 'SizeText', nci_sub

Modified: branches/ops_pct/runtime/parrot/library/SDL/Font.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/SDL/Font.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/SDL/Font.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -136,14 +136,29 @@
     font_surface = new 'SDL::Surface'
     font_surface.'init'( 'height' => 0, 'width' => 0 )
 
-    .local pmc RenderText_Solid
-    get_hll_global RenderText_Solid, ['SDL::NCI::TTF'], 'RenderText_Solid'
+# RNH use RenderUTF8 in preference to RenderText by default
+    .local pmc RenderUTF8_Solid
+    get_hll_global RenderUTF8_Solid, ['SDL::NCI::TTF'], 'RenderUTF8_Solid'
+
+    .local int color
+# RNH font routine takes color in the order rgb rather than bgr used by surface.pir hence cannot rely on color.get_integer
+    .local int component
+    .local pmc colors
+    colors = color_pmc.'color'()
+
+    component = colors['b']
+    component <<= 16
+    color = component
+
+    component = colors['g']
+    component <<= 8
+    color += component
 
-    .local pmc color
-    color = color_pmc.'color'()
+    component = colors['r']
+    color += component
 
     .local pmc font_surface_struct
-    font_surface_struct = RenderText_Solid( font, text, color )
+    font_surface_struct = RenderUTF8_Solid( font, text, color )
     font_surface.'wrap_surface'( font_surface_struct )
 
     .return( font_surface )

Modified: branches/ops_pct/runtime/parrot/library/SDL/StopWatch.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/SDL/StopWatch.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/SDL/StopWatch.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -282,8 +282,7 @@
     $I0 = array
     if $I0 == 0 goto DISABLE
 
-    array = new 'Iterator', array
-    array = .ITERATE_FROM_START
+    array = iter array
 LOOP:
     unless array goto END
     $P0 = shift array

Modified: branches/ops_pct/runtime/parrot/library/Stream/Combiner.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/Stream/Combiner.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/Stream/Combiner.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -118,8 +118,7 @@
     if i == 0 goto NOT_CONNECTED
 
     # create an iterator for the sources
-    new sources, 'Iterator', sources
-    set sources, .ITERATE_FROM_START
+    sources = iter sources
 
 LOOP:
     # stream is connected if no sources are left
@@ -162,8 +161,7 @@
     if i == 0 goto END_OF_STREAM
 
     # create an iterator for the sources
-    new sources, 'Iterator', sources
-    set sources, .ITERATE_FROM_START
+    sources = iter sources
 
     # create the string array
     new args, 'ResizableStringArray'

Modified: branches/ops_pct/runtime/parrot/library/Test/Class.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/Test/Class.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/Test/Class.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -258,13 +258,13 @@
     .local pmc attribute
     attribute = getattribute self, name
 
-    .local pmc iter
-    iter = new 'Iterator', attribute
+    .local pmc it
+    it = iter attribute
 
     .local string meth_name
   iter_loop:
-    unless iter goto loop_end
-    meth_name = shift iter
+    unless it goto loop_end
+    meth_name = shift it
     self.meth_name()
     goto iter_loop
   loop_end:
@@ -276,14 +276,14 @@
     .local pmc tests
     tests = getattribute self, 'tests'
 
-    .local pmc iter
-    iter = new 'Iterator', tests
+    .local pmc it
+    it = iter tests
 
     .local string meth_name
   iter_loop:
-    unless iter goto loop_end
+    unless it goto loop_end
     self.'loop_over_methods'( 'setup' )
-    meth_name = shift iter
+    meth_name = shift it
     self.meth_name()
     self.'loop_over_methods'( 'teardown' )
     goto iter_loop

Modified: branches/ops_pct/runtime/parrot/library/Test/More.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/Test/More.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/Test/More.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -577,8 +577,8 @@
     .local pmc r_iter
     .local int count
 
-    l_iter = new 'Iterator', l_array
-    r_iter = new 'Iterator', r_array
+    l_iter = iter l_array
+    r_iter = iter r_array
     l_iter = 0
     r_iter = 0
     count  = 0
@@ -641,7 +641,7 @@
     .local pmc l_iter
     .local int count
 
-    l_iter = new 'Iterator', l_hash
+    l_iter = iter l_hash
     l_iter = 0
     count  = 0
 

Modified: branches/ops_pct/runtime/parrot/library/YAML/Dumper/Default.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/YAML/Dumper/Default.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/YAML/Dumper/Default.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -120,7 +120,7 @@
 .sub genericHash :method
     .param string name
     .param pmc hash
-    .local pmc iter
+    .local pmc it
     .local string key
     .local pmc val
     .local pmc keys
@@ -133,13 +133,12 @@
     print " {"
 
     new keys, "ResizablePMCArray"
-    new iter, "Iterator", hash
-    set iter, 0
+    it = iter hash
 
   iter_loop:
-    unless iter, iter_end
+    unless it, iter_end
 
-    shift key, iter
+    shift key, it
     push keys, key
     branch iter_loop
 

Modified: branches/ops_pct/runtime/parrot/library/parrotlib.pir
==============================================================================
--- branches/ops_pct/runtime/parrot/library/parrotlib.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/runtime/parrot/library/parrotlib.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -165,16 +165,15 @@
     .param string name
     .param pmc array
     .local string ret
-    .local pmc iter
+    .local pmc it
 
-    iter = new 'Iterator', array
-    iter = 0 #ITERATE_FROM_START
+    it = iter array
 
 NEXT:
     null ret
-    unless iter goto END
+    unless it goto END
 
-    $P0 = shift iter
+    $P0 = shift it
     ret = $P0( name )
     if_null ret, NEXT
 END:

Modified: branches/ops_pct/src/call/ops.c
==============================================================================
--- branches/ops_pct/src/call/ops.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/call/ops.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -88,24 +88,37 @@
 #endif
     {
         new_runloop_jump_point(interp);
-        if (setjmp(interp->current_runloop->resume)) {
-            /* an exception was handled */
-            if (STACKED_EXCEPTIONS)
-                free_runloop_jump_point(interp);
+    reenter:
+        interp->current_runloop->handler_start = NULL;
+        switch (setjmp(interp->current_runloop->resume)) {
+            case 1:
+                /* an exception was handled */
+                if (STACKED_EXCEPTIONS)
+                    free_runloop_jump_point(interp);
 
-            interp->current_runloop_level = our_runloop_level - 1;
-            interp->current_runloop_id    = old_runloop_id;
+                interp->current_runloop_level = our_runloop_level - 1;
+                interp->current_runloop_id    = old_runloop_id;
 
 #if RUNLOOP_TRACE
-            fprintf(stderr, "[handled exception; back to loop %d, level %d]\n",
-                    interp->current_runloop_id, interp->current_runloop_level);
+                fprintf(stderr, "[handled exception; back to loop %d, level %d]\n",
+                        interp->current_runloop_id, interp->current_runloop_level);
 #endif
-            return;
+                return;
+            case 2:
+                /* Reenter the runloop from a exception thrown from C
+                 * with a pir handler */
+                PARROT_ASSERT(interp->current_runloop->handler_start);
+                offset = interp->current_runloop->handler_start - interp->code->base.data;
+                /* Prevent incorrect reuse */
+                goto reenter;
+            default:
+                break;
         }
     }
 
     runops_int(interp, offset);
 
+    interp->current_runloop->handler_start = NULL;
     /* Remove the current runloop marker (put it on the free list). */
     if (STACKED_EXCEPTIONS || interp->current_runloop)
         free_runloop_jump_point(interp);
@@ -558,10 +571,9 @@
         ARGIN(const char *sig), va_list args)
 {
     ASSERT_ARGS(Parrot_runops_fromc_arglist)
-    void* retval;
     Parrot_Context * const ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
+    void * const retval = set_retval(interp, *sig, ctx);
 
-    retval = set_retval(interp, *sig, ctx);
     Parrot_free_context(interp, ctx, 1);
     return retval;
 }
@@ -586,10 +598,9 @@
         ARGIN(const char *sig), va_list args)
 {
     ASSERT_ARGS(Parrot_runops_fromc_arglist_reti)
-    INTVAL retval;
     Parrot_Context * const ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
+    const INTVAL retval = set_retval_i(interp, *sig, ctx);
 
-    retval = set_retval_i(interp, *sig, ctx);
     Parrot_free_context(interp, ctx, 1);
     return retval;
 }
@@ -614,10 +625,9 @@
         ARGIN(const char *sig), va_list args)
 {
     ASSERT_ARGS(Parrot_runops_fromc_arglist_retf)
-    FLOATVAL retval;
     Parrot_Context * const ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
+    const FLOATVAL retval = set_retval_f(interp, *sig, ctx);
 
-    retval = set_retval_f(interp, *sig, ctx);
     Parrot_free_context(interp, ctx, 1);
     return retval;
 }
@@ -643,11 +653,9 @@
         ARGIN(STRING *meth), ARGIN(const char *sig), va_list args)
 {
     ASSERT_ARGS(Parrot_run_meth_fromc_arglist)
-    Parrot_Context *ctx;
-    void* retval;
+    Parrot_Context * const ctx = runops_args(interp, sub, obj, meth, sig, args);
+    void * const retval = set_retval(interp, *sig, ctx);
 
-    ctx = runops_args(interp, sub, obj, meth, sig, args);
-    retval = set_retval(interp, *sig, ctx);
     Parrot_free_context(interp, ctx, 1);
     return retval;
 }
@@ -674,10 +682,9 @@
         ARGIN(STRING *meth), ARGIN(const char *sig), va_list args)
 {
     ASSERT_ARGS(Parrot_run_meth_fromc_arglist_reti)
-    INTVAL retval;
     Parrot_Context * const ctx = runops_args(interp, sub, obj, meth, sig, args);
+    const INTVAL retval = set_retval_i(interp, *sig, ctx);
 
-    retval = set_retval_i(interp, *sig, ctx);
     Parrot_free_context(interp, ctx, 1);
     return retval;
 }
@@ -703,10 +710,9 @@
         ARGIN(STRING *meth), ARGIN(const char *sig), va_list args)
 {
     ASSERT_ARGS(Parrot_run_meth_fromc_arglist_retf)
-    FLOATVAL retval;
     Parrot_Context * const ctx = runops_args(interp, sub, obj, meth, sig, args);
+    const FLOATVAL retval = set_retval_f(interp, *sig, ctx);
 
-    retval = set_retval_f(interp, *sig, ctx);
     Parrot_free_context(interp, ctx, 1);
     return retval;
 }

Modified: branches/ops_pct/src/call/pcc.c
==============================================================================
--- branches/ops_pct/src/call/pcc.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/call/pcc.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1415,10 +1415,11 @@
 
     if (st->n_actual_args < min_expected_args) {
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-            "too few arguments passed (%d) - %s%d %s expected",
+            "too few arguments passed (%d) - %s%d %s%s expected",
             st->n_actual_args,
             (min_expected_args < max_expected_args ? "at least " : ""),
-            min_expected_args, action);
+            min_expected_args, action,
+            (min_expected_args == 1 ? "" : "s"));
     }
 }
 
@@ -1443,10 +1444,11 @@
 
     if (st->n_actual_args > max_expected_args) {
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-            "too many arguments passed (%d) - %s%d %s expected",
+            "too many arguments passed (%d) - %s%d %s%s expected",
             st->n_actual_args,
             (min_expected_args < max_expected_args ? "at most " : ""),
-            max_expected_args, action);
+            max_expected_args, action,
+            (max_expected_args == 1 ? "" : "s"));
     }
 }
 
@@ -1623,7 +1625,7 @@
     call_state_item *src, *dest;
 
     const char * const action = (param_or_result == PARROT_PASS_RESULTS)
-        ? "results" : "params";
+        ? "result" : "param";
 
     /* Check if we should be throwing errors. This can be configured separately
      * for parameters and return values. */

Modified: branches/ops_pct/src/debug.c
==============================================================================
--- branches/ops_pct/src/debug.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/debug.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -2578,17 +2578,6 @@
 
             size += sprintf(&dest[size], INTVAL_FMT, i);
 
-            /* If this is a constant dispatch arg to an "infix" op, then show
-               the corresponding symbolic op name. */
-            if (j == 1 && info->types[j - 1] == PARROT_ARG_IC
-                && (STREQ(info->name, "infix") || STREQ(info->name, "n_infix"))) {
-                PARROT_ASSERT(size + 20 < space);
-
-                size += sprintf(&dest[size], " [%s]",
-                        /* [kludge: the "2+" skips the leading underscores.  --
-                           rgr, 6-May-07.] */
-                        2 + Parrot_MMD_method_name(interp, op[j]));
-            }
             break;
         case PARROT_ARG_NC:
             {

Deleted: branches/ops_pct/src/dynoplibs/myops.ops
==============================================================================
--- branches/ops_pct/src/dynoplibs/myops.ops	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,133 +0,0 @@
-/*
-  Copyright (C) 2003-2008, Parrot Foundation.
-  $Id$
-*/
-
-BEGIN_OPS_PREAMBLE
-
-#include "parrot/dynext.h"
-#include <stdlib.h>
-
-END_OPS_PREAMBLE
-
-=head1 NAME
-
-myops.ops - Sample Dynamic Opcodes 2
-
-=cut
-
-=head1 DESCRIPTION
-
-A dynamic oplib loadable at demand.
-
-=cut
-
-=head1 Essential ops
-
-=over 4
-
-=item B<fortytwo>(out INT)
-
-The famous and ever wanted opcode, proposed by Jos Visser in
-"We *need* this op! :-)".
-
-=item B<what_do_you_get_if_you_multiply_six_by_nine>(out INT)
-
-Alternate spelling of this op, proposed by Nicholas Clark. It might bring
-imcc to its limits due the lengthy name.
-
-=cut
-
-inline op fortytwo(out INT) {
-    $1 = 42;
-}
-
-inline op what_do_you_get_if_you_multiply_six_by_nine(out STR) {
-    $1 = string_from_literal(interp, "fortytwo");
-}
-
-=item B<hcf>
-
-Halt and Catch Fire. Tries to crash Parrot.  Note that making a segfault here
-is a Bad Thing, so this relies instead on Well Supported end-this-process
-behavior.
-
-=cut
-
-op hcf() :flow {
-    abort();
-}
-
-=item B<q>
-
-Support for writing a very short quine.
-
-=cut
-
-op q() :flow {
-    Parrot_io_printf(interp, ".loadlib \"myops_ops\"\nq\n");
-    HALT();
-}
-
-=item B<bxand>(out INT, in INT, in INT)
-
-Binary operator, defined as A and B, but not BOTH.
-
-=cut
-
-op bxand(out INT, in INT, in INT) {
-    /* short circuit boolean logic */
-    $1 = 0;
-}
-
-=item B<alarm>(in NUM, in PMC)
-
-Call alarm handler sub $2 after $1 time has elapsed.
-
-=item B<alarm>(in NUM, in NUM, in PMC)
-
-Call alarm handler sub $3 after $1 time has elapsed, repeat after $2.
-
-=cut
-
-op alarm(in NUM, in PMC) {
-    Parrot_cx_schedule_timer(interp, NULL, $1, 0.0, 0, $2);
-}
-
-op alarm(in NUM, in NUM, in PMC) {
-    Parrot_cx_schedule_timer(interp, NULL, $1, $2, -1, $3);
-}
-
-=item B<conv_u2>(inout INT)
-
-Conversion of a two byte unsigned int to an INT.
-Formerly in dotgnu.ops.
-
-=item B<conv_i2>(inout INT)
-
-Conversion of a two byte signed int to an INT.
-Formerly in dotgnu.ops.
-
-=cut
-
-inline op conv_u2(inout INT) :base_core {
-  $1 = (INTVAL)((Parrot_UInt2)($1 & 0xffff));
-}
-
-inline op conv_i2(inout INT) :base_core {
-  $1 = (INTVAL)((Parrot_Int2)($1 & 0xffff));
-}
-
-
-=back
-
-=cut
-
-# vim: sw=4
-
-/*
- * Local variables:
- *   c-file-style: "parrot"
- * End:
- * vim: expandtab shiftwidth=4:
- */

Copied: branches/ops_pct/src/dynoplibs/obscure.ops (from r40255, trunk/src/dynoplibs/obscure.ops)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/src/dynoplibs/obscure.ops	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/src/dynoplibs/obscure.ops)
@@ -0,0 +1,121 @@
+/*
+ * $Id$
+** obscure.ops
+*/
+
+BEGIN_OPS_PREAMBLE
+
+#include <math.h>
+
+END_OPS_PREAMBLE
+
+=head1 NAME
+
+obscure.ops - Obscure Mathmatical Opcodes
+
+=cut
+
+=head1 DESCRIPTION
+
+Parrot's library of obscure ops.
+
+To use this library of ops, add this directive to your PIR:
+
+ .loadlib 'obscure_ops'
+
+=cut
+
+
+###############################################################################
+
+=head2 Obscure trigonometric operations
+
+Reference:
+
+    Abramowitz, M. and Stegum, C. A. (Eds.). Handbook of Mathematical
+    Functions with Formulas, Graphs, and Mathematical Tables, 9th printing.
+    New York: Dover, p. 78, 1972.
+
+=over 4
+
+=cut
+
+
+########################################
+
+=item B<covers>(out NUM, in NUM)
+
+Set $1 to the coversine (in radians) of $2.
+
+=cut
+
+inline op covers(out NUM, in NUM) :advanced_math {
+  $1 = 1.0 - sin($2);
+}
+
+
+########################################
+
+=item B<exsec>(out NUM, in NUM)
+
+Set $1 to the exsecant of $2 (given in radians).
+
+=cut
+
+
+inline op exsec(out NUM, in NUM) :advanced_math {
+  $1 = (1.0 / cos($2)) - 1.0;
+}
+
+
+########################################
+
+=item B<hav>(out NUM, in NUM)
+
+Set $1 to the haversine (in radians) of $2.
+
+=cut
+
+inline op hav(out NUM, in NUM) {
+  $1 = 0.5 * (1.0 - cos($2));
+}
+
+
+########################################
+
+=item B<vers>(out NUM, in NUM)
+
+Set $1 to the versine (in radians) of $2.
+
+=cut
+
+inline op vers(out NUM, in NUM) :advanced_math {
+  $1 = 1.0 - cos($2);
+}
+
+
+=back
+
+=cut
+
+
+###############################################################################
+
+=head1 COPYRIGHT
+
+Copyright (C) 2001-2008, Parrot Foundation.
+
+=head1 LICENSE
+
+This program is free software. It is subject to the same license
+as the Parrot interpreter itself.
+
+=cut
+
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Deleted: branches/ops_pct/src/dynpmc/pair.pmc
==============================================================================
--- branches/ops_pct/src/dynpmc/pair.pmc	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,355 +0,0 @@
-/*
-Copyright (C) 2005-2009, Parrot Foundation.
-$Id$
-
-=head1 NAME
-
-src/pmc/pair.pmc - Pair PMC
-
-=head1 DESCRIPTION
-
-A Pair PMC represents one key => value mapping like a one element hash.
-
-'EclectusPair' subclasses this.
-
-=head2 Functions
-
-=over 4
-
-=cut
-
-*/
-
-#include "parrot/parrot.h"
-#include "pmc_pair.h"
-
-pmclass Pair dynpmc need_ext {
-    ATTR PMC *key;
-    ATTR PMC *value;
-
-/*
-
-=item C<void init()>
-
-Initializes the instance.
-
-=item C<PMC *instantiate(PMC *sig)>
-
-Class method to construct an Integer according to passed arguments.
-
-=cut
-
-*/
-
-    VTABLE void init() {
-        PMC_data(SELF) = mem_allocate_zeroed_typed(Parrot_Pair_attributes);
-        PObj_custom_mark_SET(SELF);
-    }
-
-    VTABLE PMC *instantiate(PMC *sig) {
-        return PMCNULL;
-
-        /* TODO -- really create this thing */
-#if 0
-        PMC * const  _class = REG_PMC(interp, 2);
-        Parrot_Pair_attributes *pair   = PARROT_PAIR(SELF);
-        const int    argcP  = REG_INT(interp, 3);
-        const int    argcS  = REG_INT(interp, 2);
-
-        SELF = pmc_new(INTERP, _class->vtable->base_type);
-        if (argcS == 1 && argcP == 1) {
-            PObj_key_is_string_SET(SELF);
-            pair->key   = REG_STR(interp, 5);
-            pair->value = REG_PMC(interp, 5);
-        }
-        else if (argcP == 2) {
-            pair->key   = REG_PMC(interp, 5);
-            pair->value = REG_PMC(interp, 6);
-        }
-        else
-            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
-                "wrong argument count for Pair creation");
-
-        return SELF;
-#endif
-    }
-/*
-
-=item C<void mark()>
-
-Marks the hash as live.
-
-=cut
-
-*/
-
-    VTABLE void mark() {
-        Parrot_Pair_attributes * const pair = PARROT_PAIR(SELF);
-
-        if (pair->key)
-            Parrot_gc_mark_PObj_alive(INTERP, (PObj *)pair->key);
-
-        if (pair->value)
-            Parrot_gc_mark_PObj_alive(INTERP, (PObj *)pair->value);
-    }
-
-/*
-
-=item C<PMC *get_pmc_keyed_str(STRING *key)>
-
-=item C<PMC *get_pmc_keyed(PMC *key)>
-
-=cut
-
-*/
-
-    VTABLE PMC *get_pmc_keyed_str(STRING *key) {
-        Parrot_Pair_attributes * const pair = PARROT_PAIR(SELF);
-        /* check key ? */
-        return pair->value;
-    }
-
-    VTABLE PMC *get_pmc_keyed(PMC *key) {
-        Parrot_Pair_attributes * const pair = PARROT_PAIR(SELF);
-        /* check key ? */
-        return pair->value;
-    }
-
-/*
-
-=item C<void set_pmc_keyed(PMC *key, PMC *value)>
-
-=item C<void set_pmc_keyed_str(STRING *key, PMC *value)>
-
-Set key and value. The key can only set once.
-
-=item C<void assign_pmc(PMC *value)>
-
-Set the value of the Pair.
-
-=cut
-
-*/
-
-    VTABLE void set_pmc_keyed(PMC *key, PMC *value) {
-        Parrot_Pair_attributes * const pair = PARROT_PAIR(SELF);
-
-        if (pair->key)
-            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
-                "attempt to set existing Pair key");
-
-
-        pair->key   = key;
-        pair->value = value;
-    }
-
-
-    VTABLE void set_pmc_keyed_str(STRING *key, PMC *value) {
-        Parrot_Pair_attributes * const pair = PARROT_PAIR(SELF);
-        PMC                *key_pmc;
-
-        if (pair->key)
-            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
-                "attempt to set existing Pair key");
-
-
-        key_pmc = pmc_new(interp, enum_class_String);
-        VTABLE_set_string_native(interp, key_pmc, key);
-
-        pair->key   = key_pmc;
-        pair->value = value;
-    }
-
-    VTABLE void assign_pmc(PMC *value) {
-        Parrot_Pair_attributes * const pair = PARROT_PAIR(SELF);
-        pair->value              = value;
-    }
-
-/*
-
-=item C<void set_pmc(PMC *pair)>
-
-Sets this pair to hold the value of another.
-
-=cut
-
-*/
-
-    VTABLE void set_pmc(PMC *pair) {
-        if (pair->vtable->base_type == SELF->vtable->base_type) {
-            Parrot_Pair_attributes * const from = PARROT_PAIR(SELF);
-            Parrot_Pair_attributes * const to   = PARROT_PAIR(SELF);
-
-            to->key   = from->key;
-            to->value = from->value;
-        }
-        else
-            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
-                "Can only set a pair to another pair.");
-    }
-
-/*
-
-=item C<INTVAL is_equal(PMC *value)>
-
-The C<==> operation.
-
-Check if two Pairs hold the same keys and values.
-
-=cut
-
-*/
-
-    VTABLE INTVAL is_equal(PMC *value) {
-        Parrot_Pair_attributes * const from = PARROT_PAIR(SELF);
-        Parrot_Pair_attributes * const to   = PARROT_PAIR(SELF);
-        PMC *p1, *p2;
-        PMC *k1, *k2;
-        INTVAL result;
-
-        if (value->vtable->base_type != SELF->vtable->base_type)
-            return 0;
-
-        k1 = from->key;
-        k2 = to->key;
-
-        Parrot_mmd_multi_dispatch_from_c_args(INTERP, "is_equal",
-            "PP->I", k1, k2, &result);
-        if (!result)
-            return 0;
-
-        p1 = from->value;
-        p2 = to->value;
-
-        if (!p1 && !p2)
-            return 1;
-        else
-            return 0;
-    }
-
-/*
-
-=item C<void visit(visit_info *info)>
-
-Used during archiving to visit the elements in the pair.
-
-=item C<void freeze(visit_info *info)>
-
-Used to archive the Pair.
-
-=item C<void thaw(visit_info *info)>
-
-Used to unarchive the Pair.
-
-=cut
-
-*/
-
-    VTABLE void visit(visit_info *info) {
-        PMC               **pos;
-        Parrot_Pair_attributes * const pair     = PARROT_PAIR(SELF);
-        DPOINTER   ** const temp_pos = (DPOINTER **)pair->key;
-        info->thaw_ptr               = (PMC **)temp_pos;
-        (info->visit_pmc_now)(INTERP, (PMC *)temp_pos, info);
-
-        pos            = &pair->value;
-        info->thaw_ptr = pos;
-
-        (info->visit_pmc_now)(INTERP, *pos, info);
-
-        SUPER(info);
-    }
-
-    VTABLE void freeze(visit_info *info) {
-        Parrot_Pair_attributes * const pair = PARROT_PAIR(SELF);
-        IMAGE_IO    * const io   = info->image_io;
-        SUPER(info);
-        VTABLE_push_pmc(INTERP, io, pair->key);
-        VTABLE_push_pmc(INTERP, io, pair->value);
-    }
-
-    VTABLE void thaw(visit_info *info) {
-        Parrot_Pair_attributes * const pair = PARROT_PAIR(SELF);
-        IMAGE_IO    * const io   = info->image_io;
-
-        SUPER(info);
-
-        pair->key   = VTABLE_shift_pmc(interp, io);
-        pair->value = VTABLE_shift_pmc(interp, io);
-    }
-/*
-
-=back
-
-=head2 Methods
-
-=over 4
-
-=item C<METHOD key()>
-
-Return the key of the pair.
-
-=cut
-
-*/
-
-    METHOD key() {
-        Parrot_Pair_attributes * const pair = PARROT_PAIR(SELF);
-        PMC                *key  = pair->key;
-
-        RETURN(PMC *key);
-    }
-
-/*
-
-=item C<METHOD value()>
-
-Return the value of the pair.
-
-=cut
-
-*/
-
-    METHOD value() {
-        Parrot_Pair_attributes * const pair  = PARROT_PAIR(SELF);
-        PMC         * const value = pair->value;
-        RETURN(PMC *value);
-    }
-
-/*
-
-=item C<METHOD kv()>
-
-Return a tuple of (key, value) for the pair.
-
-=cut
-
-*/
-
-    METHOD kv() {
-        Parrot_Pair_attributes * const pair = PARROT_PAIR(SELF);
-        PMC         * const t    = pmc_new(INTERP,
-            Parrot_get_ctx_HLL_type(INTERP, enum_class_FixedPMCArray));
-
-        VTABLE_set_integer_native(INTERP, t, 2);
-        VTABLE_set_pmc_keyed_int(INTERP, t, 0, pair->key);
-
-        VTABLE_set_pmc_keyed_int(INTERP, t, 1, pair->value);
-        RETURN(PMC *t);
-    }
-}
-
-/*
-
-=back
-
-=cut
-
-*/
-
-/*
- * Local variables:
- *   c-file-style: "parrot"
- * End:
- * vim: expandtab shiftwidth=4:
- */

Modified: branches/ops_pct/src/dynpmc/rational.pmc
==============================================================================
--- branches/ops_pct/src/dynpmc/rational.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/dynpmc/rational.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -66,28 +66,19 @@
 
 /*
 
-=item * static void rat_add_integer(PARROT_INTERP, PMC *self, int value, PMC *dest)
+=item * static void rat_add_integer(PARROT_INTERP, PMC *self, int value)
 
-Adds an integer "value" to a Rational-PMC and stores the result in (another) Rational-PMC.
+Adds an integer "value" to a Rational-PMC inplace.
 
 =cut
 
 */
-static void rat_add_integer(PARROT_INTERP, PMC *self, int value, PMC *dest) {
+static void rat_add_integer(PARROT_INTERP, PMC *self, int value) {
   #ifdef PARROT_HAS_GMP
     mpq_t t;
-
-    if (dest) {
-        if (self != dest)
-            pmc_reuse(interp, dest, self->vtable->base_type, 0);
-    }
-    else {
-        dest = pmc_new(interp, self->vtable->base_type);
-    }
-
     mpq_init(t);
     mpq_set_si(t, (int) value, 1);
-    mpq_add(RT(dest), RT(self), t);
+    mpq_add(RT(self), RT(self), t);
     mpq_clear(t);
   #else
     RAISE_EXCEPTION
@@ -96,26 +87,21 @@
 
 /*
 
-=item * static void rat_add_float(PARROT_INTERP, PMC *self, double value, PMC *dest)
+=item * static void rat_add_float(PARROT_INTERP, PMC *self, double value)
 
-Adds a float "value" to a Rational-PMC and stores the result in (another) Rational-PMC. "value" is
-first conveted to a rational using GMPs mpq_set_d-function. This is meant to be exact.
+Adds a float "value" to a Rational-PMC in-place. "value" is first conveted to a
+rational using GMPs mpq_set_d-function. This is meant to be exact.
 
 =cut
 
 */
-static void rat_add_float(PARROT_INTERP, PMC *self, double value, PMC *dest) {
+static void rat_add_float(PARROT_INTERP, PMC *self, double value) {
   #ifdef PARROT_HAS_GMP
     mpq_t t;
 
-    if (dest)
-        pmc_reuse(interp, dest, self->vtable->base_type, 0);
-    else
-        dest = pmc_new(interp, self->vtable->base_type);
-
     mpq_init(t);
     mpq_set_d(t, (double) value);
-    mpq_add(RT(dest), RT(self), t);
+    mpq_add(RT(self), RT(self), t);
     mpq_clear(t);
   #else
     RAISE_EXCEPTION
@@ -124,22 +110,16 @@
 
 /*
 
-=item * static void rat_multiply_integer(PARROT_INTERP, PMC *self, int value, PMC *dest)
+=item * static void rat_multiply_integer(PARROT_INTERP, PMC *self, int value)
 
-Multiplys a Rational-PMC with an integer "value" and stores the result in (another) Rational-PMC.
+Multiplys a Rational-PMC with an integer "value" in-place.
 
 =cut
 
 */
-static void rat_multiply_integer(PARROT_INTERP, PMC *self, int value, PMC *dest) {
+static void rat_multiply_integer(PARROT_INTERP, PMC *self, int value) {
   #ifdef PARROT_HAS_GMP
-    if (dest)
-        pmc_reuse(interp, dest, self->vtable->base_type, 0);
-    else
-        dest = pmc_new(interp, self->vtable->base_type);
-
-    mpz_mul_ui(mpq_numref(RT(dest)), mpq_numref(RT(self)), (unsigned int) value);
-    mpq_set_den(RT(dest), mpq_denref(RT(self)));
+    mpz_mul_ui(mpq_numref(RT(self)), mpq_numref(RT(self)), (unsigned int) value);
   #else
     RAISE_EXCEPTION
   #endif
@@ -147,25 +127,20 @@
 
 /*
 
-=item * static void rat_multiply_float(PARROT_INTERP, PMC *self, double value, PMC *dest)
+=item * static void rat_multiply_float(PARROT_INTERP, PMC *self, double value)
 
-Multiplies a Rational-PMC with a float "value" and stores the result in (another) Rational-PMC.
+Multiplies a Rational-PMC with a float "value" in-place.
 
 =cut
 
 */
-static void rat_multiply_float(PARROT_INTERP, PMC *self, double value, PMC *dest) {
+static void rat_multiply_float(PARROT_INTERP, PMC *self, double value) {
   #ifdef PARROT_HAS_GMP
     mpq_t t;
 
-    if (dest)
-        pmc_reuse(interp, dest, self->vtable->base_type, 0);
-    else
-        dest = pmc_new(interp, self->vtable->base_type);
-
     mpq_init(t);
     mpq_set_d(t, (double) value);
-    mpq_mul(RT(dest), RT(self), t);
+    mpq_mul(RT(self), RT(self), t);
     mpq_clear(t);
   #else
     RAISE_EXCEPTION
@@ -174,25 +149,20 @@
 
 /*
 
-=item * static void rat_divide_integer(PARROT_INTERP, PMC *self, int value, PMC *dest)
+=item * static void rat_divide_integer(PARROT_INTERP, PMC *self, int value)
 
-Divides a Rational-PMC through an integer "value" and stores the result in (another) Rational-PMC.
+Divides a Rational-PMC through an integer "value" in-place.
 
 =cut
 
 */
-static void rat_divide_integer(PARROT_INTERP, PMC *self, int value, PMC *dest) {
+static void rat_divide_integer(PARROT_INTERP, PMC *self, int value) {
   #ifdef PARROT_HAS_GMP
     mpq_t t;
 
-    if (dest)
-        pmc_reuse(interp, dest, self->vtable->base_type, 0);
-    else
-        dest = pmc_new(interp, self->vtable->base_type);
-
     mpq_init(t);
     mpq_set_si(t, (int) value, 1);
-    mpq_div(RT(dest), RT(self), t);
+    mpq_div(RT(self), RT(self), t);
     mpq_clear(t);
   #else
     RAISE_EXCEPTION
@@ -201,25 +171,20 @@
 
 /*
 
-=item * static void rat_divide_float(PARROT_INTERP, PMC *self, double value, PMC *dest)
+=item * static void rat_divide_float(PARROT_INTERP, PMC *self, double value)
 
-Divides a Rational-PMC through a float "value" and stores the result in (another) Rational-PMC.
+Divides a Rational-PMC through a float "value" in-place.
 
 =cut
 
 */
-static void rat_divide_float(PARROT_INTERP, PMC *self, double value, PMC *dest) {
+static void rat_divide_float(PARROT_INTERP, PMC *self, double value) {
   #ifdef PARROT_HAS_GMP
     mpq_t t;
 
-    if (dest)
-        pmc_reuse(interp, dest, self->vtable->base_type, 0);
-    else
-        dest = pmc_new(interp, self->vtable->base_type);
-
     mpq_init(t);
     mpq_set_d(t, (double) value);
-    mpq_div(RT(dest), RT(self), t);
+    mpq_div(RT(self), RT(self), t);
     mpq_clear(t);
   #else
     RAISE_EXCEPTION
@@ -228,32 +193,27 @@
 
 /*
 
-=item * static void rat_power_int(PARROT_INTERP, PMC *self, int value, PMC *dest)
+=item * static void rat_power_int(PARROT_INTERP, PMC *self, int value)
 
-Calculates the power of a Rational-PMC to an exponent value and stores the result in (another)
-Rational-PMC.
+Calculates the power of a Rational-PMC to an exponent value in-place.
 
 =cut
 
 */
-static void rat_power_int(PARROT_INTERP, PMC *self, int value, PMC *dest) {
+static void rat_power_int(PARROT_INTERP, PMC *self, int value) {
   #ifdef PARROT_HAS_GMP
-    mpz_t t;
+    mpz_t num, den;
+
+    mpq_get_num(num, RT(self));
+    mpq_get_den(den, RT(self));
 
-    if (dest)
-        pmc_reuse(interp, dest, self->vtable->base_type, 0);
-    else
-        dest = pmc_new(interp, self->vtable->base_type);
-
-    mpq_get_num(t, RT(self));
-    mpz_pow_ui(t, t, (unsigned int) value);
-    mpq_set_num(RT(dest), t);
-    mpz_clear(t);
-
-    mpq_get_den(t, RT(self));
-    mpz_pow_ui(t, t, (unsigned int) value);
-    mpq_set_den(RT(dest), t);
-    mpz_clear(t);
+    mpz_pow_ui(num, num, (unsigned int) value);
+    mpq_set_num(RT(self), num);
+    mpz_clear(num);
+
+    mpz_pow_ui(den, den, (unsigned int) value);
+    mpq_set_den(RT(self), den);
+    mpz_clear(den);
   #else
     RAISE_EXCEPTION
   #endif
@@ -322,14 +282,8 @@
 */
     VTABLE PMC *clone() {
       #ifdef PARROT_HAS_GMP
-        mpz_t num, den;
         PMC * const ret = pmc_new(INTERP, SELF->vtable->base_type);
-        mpq_get_num(num, RT(SELF));
-        mpq_get_den(den, RT(SELF));
-        mpq_set_num(RT(ret), num);
-        mpq_set_den(RT(ret), den);
-        mpz_clear(num);
-        mpz_clear(den);
+        mpq_set(RT(ret), RT(SELF));
         return ret;
       #else
         RAISE_EXCEPTION
@@ -554,21 +508,20 @@
 
 */
     MULTI PMC *add(Integer value, PMC* dest) {
-        rat_add_integer(INTERP, SELF, VTABLE_get_integer(INTERP, value), dest);
+        dest = STATICSELF.clone();
+        rat_add_integer(INTERP, dest, VTABLE_get_integer(INTERP, value));
         return dest;
     }
 
     MULTI PMC *add(Float value, PMC* dest) {
-        rat_add_float(INTERP, SELF, VTABLE_get_number(INTERP, value), dest);
+        dest = STATICSELF.clone();
+        rat_add_float(INTERP, dest, VTABLE_get_number(INTERP, value));
         return dest;
     }
 
     MULTI PMC *add(Rational value, PMC* dest) {
       #ifdef PARROT_HAS_GMP
-        if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
-        else
-            dest = pmc_new(INTERP, SELF->vtable->base_type);
+        dest = pmc_new(INTERP, SELF->vtable->base_type);
 
         mpq_add(RT(dest), RT(SELF), RT(value));
         return dest;
@@ -590,11 +543,11 @@
 
 */
     MULTI void i_add(Integer value) {
-        rat_add_integer(INTERP, SELF, (int) VTABLE_get_integer(INTERP, value), SELF);
+        rat_add_integer(INTERP, SELF, (int) VTABLE_get_integer(INTERP, value));
     }
 
     MULTI void i_add(Float value) {
-        rat_add_float(INTERP, SELF, (double) VTABLE_get_number(INTERP, value), SELF);
+        rat_add_float(INTERP, SELF, (double) VTABLE_get_number(INTERP, value));
     }
 
     MULTI void i_add(Rational value) {
@@ -618,7 +571,8 @@
 
 */
     VTABLE PMC *add_int(INTVAL value, PMC* dest) {
-        rat_add_integer(INTERP, SELF, (int) value, dest);
+        dest = STATICSELF.clone();;
+        rat_add_integer(INTERP, dest, (int) value);
         return dest;
     }
 
@@ -630,7 +584,7 @@
 
 */
     VTABLE void i_add_int(INTVAL value) {
-        rat_add_integer(INTERP, SELF, (int) value, SELF);
+        rat_add_integer(INTERP, SELF, (int) value);
     }
 
 /*
@@ -641,7 +595,8 @@
 
 */
     VTABLE PMC *add_float(FLOATVAL value, PMC* dest) {
-        rat_add_float(INTERP, SELF, (double) value, dest);
+        dest = STATICSELF.clone();
+        rat_add_float(INTERP, dest, (double) value);
         return dest;
     }
 
@@ -653,7 +608,7 @@
 
 */
     VTABLE void i_add_float(FLOATVAL value) {
-        rat_add_float(INTERP, SELF, (double) value, SELF);
+        rat_add_float(INTERP, SELF, (double) value);
     }
 
 /*
@@ -664,22 +619,20 @@
 
 */
     MULTI PMC *subtract(Integer value, PMC* dest) {
-        rat_add_integer(INTERP, SELF, -((int) VTABLE_get_integer(INTERP, value)), dest);
+        dest = STATICSELF.clone();
+        rat_add_integer(INTERP, dest, -((int) VTABLE_get_integer(INTERP, value)));
         return dest;
     }
 
     MULTI PMC *subtract(Float value, PMC* dest) {
-        rat_add_float(INTERP, SELF, - ((double) VTABLE_get_number(INTERP, value)), dest);
+        dest = STATICSELF.clone();
+        rat_add_float(INTERP, dest, - ((double) VTABLE_get_number(INTERP, value)));
         return dest;
     }
 
     MULTI PMC *subtract(Rational value, PMC* dest) {
       #ifdef PARROT_HAS_GMP
-        if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
-        else
-            dest = pmc_new(INTERP, SELF->vtable->base_type);
-
+        dest = pmc_new(INTERP, SELF->vtable->base_type);
         mpq_sub(RT(dest), RT(SELF), RT(value));
         return dest;
       #else
@@ -700,11 +653,11 @@
 
 */
     MULTI void i_subtract(Integer value) {
-        rat_add_integer(INTERP, SELF, -((int) VTABLE_get_integer(INTERP, value)), SELF);
+        rat_add_integer(INTERP, SELF, -((int) VTABLE_get_integer(INTERP, value)));
     }
 
     MULTI void i_subtract(Float value) {
-        rat_add_float(INTERP, SELF, - ((double) VTABLE_get_number(INTERP, value)), SELF);
+        rat_add_float(INTERP, SELF, - ((double) VTABLE_get_number(INTERP, value)));
     }
 
     MULTI void i_subtract(Rational value) {
@@ -728,7 +681,8 @@
 
 */
     VTABLE PMC *subtract_int(INTVAL value, PMC* dest) {
-        rat_add_integer(INTERP, SELF, -((int) value), dest);
+        dest = STATICSELF.clone();
+        rat_add_integer(INTERP, dest, -((int) value));
         return dest;
     }
 
@@ -740,7 +694,7 @@
 
 */
     VTABLE void i_subtract_int(INTVAL value) {
-        rat_add_integer(INTERP, SELF, -((int) value), SELF);
+        rat_add_integer(INTERP, SELF, -((int) value));
     }
 
 /*
@@ -751,7 +705,8 @@
 
 */
     VTABLE PMC *subtract_float(FLOATVAL value, PMC* dest) {
-        rat_add_float(INTERP, SELF, -((double) value), dest);
+        dest = STATICSELF.clone();
+        rat_add_float(INTERP, dest, -((double) value));
         return dest;
     }
 
@@ -763,7 +718,7 @@
 
 */
     VTABLE void i_subtract_float(FLOATVAL value) {
-        rat_add_float(INTERP, SELF, -((double) value), SELF);
+        rat_add_float(INTERP, SELF, -((double) value));
     }
 
 /*
@@ -774,22 +729,20 @@
 
 */
     MULTI PMC *multiply(Integer value, PMC* dest) {
-        rat_multiply_integer(INTERP, SELF, (int) VTABLE_get_integer(INTERP, value), dest);
+        dest = STATICSELF.clone();
+        rat_multiply_integer(INTERP, dest, (int) VTABLE_get_integer(INTERP, value));
         return dest;
     }
 
     MULTI PMC *multiply(Float value, PMC* dest) {
-        rat_multiply_float(INTERP, SELF, (double) VTABLE_get_number(INTERP, value), dest);
+        dest = STATICSELF.clone();
+        rat_multiply_float(INTERP, dest, (double) VTABLE_get_number(INTERP, value));
         return dest;
     }
 
     MULTI PMC *multiply(Rational value, PMC* dest) {
       #ifdef PARROT_HAS_GMP
-        if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
-        else
-            dest = pmc_new(INTERP, SELF->vtable->base_type);
-
+        dest = pmc_new(INTERP, SELF->vtable->base_type);
         mpq_mul(RT(dest), RT(SELF), RT(value));
         return dest;
       #else
@@ -810,11 +763,11 @@
 
 */
     MULTI void i_multiply(Integer value) {
-        rat_multiply_integer(INTERP, SELF, (int) VTABLE_get_integer(INTERP, value), SELF);
+        rat_multiply_integer(INTERP, SELF, (int) VTABLE_get_integer(INTERP, value));
     }
 
     MULTI void i_multiply(Float value) {
-        rat_multiply_float(INTERP, SELF, (double) VTABLE_get_number(INTERP, value), SELF);
+        rat_multiply_float(INTERP, SELF, (double) VTABLE_get_number(INTERP, value));
     }
 
     MULTI void i_multiply(Rational value) {
@@ -838,7 +791,8 @@
 
 */
     VTABLE PMC *multiply_int(INTVAL value, PMC* dest) {
-        rat_multiply_integer(INTERP, SELF, (int) value, dest);
+        dest = STATICSELF.clone();
+        rat_multiply_integer(INTERP, dest, (int) value);
         return dest;
     }
 
@@ -850,7 +804,7 @@
 
 */
     VTABLE void i_multiply_int(INTVAL value) {
-        rat_multiply_integer(INTERP, SELF, (int) value, SELF);
+        rat_multiply_integer(INTERP, SELF, (int) value);
     }
 
 /*
@@ -861,7 +815,8 @@
 
 */
     VTABLE PMC *multiply_float(FLOATVAL value, PMC* dest) {
-        rat_multiply_float(INTERP, SELF, (double) value, dest);
+        dest = STATICSELF.clone();
+        rat_multiply_float(INTERP, dest, (double) value);
         return dest;
     }
 
@@ -873,7 +828,7 @@
 
 */
     VTABLE void i_multiply_float(FLOATVAL value) {
-        rat_multiply_float(INTERP, SELF, (double) value, SELF);
+        rat_multiply_float(INTERP, SELF, (double) value);
     }
 
 /*
@@ -884,22 +839,20 @@
 
 */
     MULTI PMC *divide(Integer value, PMC* dest) {
-        rat_divide_integer(INTERP, SELF, (int) VTABLE_get_integer(INTERP, value), dest);
+        dest = STATICSELF.clone();
+        rat_divide_integer(INTERP, dest, (int) VTABLE_get_integer(INTERP, value));
         return dest;
     }
 
     MULTI PMC *divide(Float value, PMC* dest) {
-        rat_divide_float(INTERP, SELF, (double) VTABLE_get_number(INTERP, value), dest);
+        dest = STATICSELF.clone();
+        rat_divide_float(INTERP, dest, (double) VTABLE_get_number(INTERP, value));
         return dest;
     }
 
     MULTI PMC *divide(Rational value, PMC* dest) {
       #ifdef PARROT_HAS_GMP
-        if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
-        else
-            dest = pmc_new(INTERP, SELF->vtable->base_type);
-
+        dest = pmc_new(INTERP, SELF->vtable->base_type);
         mpq_div(RT(dest), RT(SELF), RT(value));
         return dest;
       #else
@@ -920,11 +873,11 @@
 
 */
     MULTI void i_divide(Integer value) {
-        rat_divide_integer(INTERP, SELF, (int) VTABLE_get_integer(INTERP, value), SELF);
+        rat_divide_integer(INTERP, SELF, (int) VTABLE_get_integer(INTERP, value));
     }
 
     MULTI void i_divide(Float value) {
-        rat_divide_float(INTERP, SELF, (double) VTABLE_get_number(INTERP, value), SELF);
+        rat_divide_float(INTERP, SELF, (double) VTABLE_get_number(INTERP, value));
     }
 
     MULTI void i_divide(Rational value) {
@@ -948,7 +901,8 @@
 
 */
     VTABLE PMC *divide_int(INTVAL value, PMC* dest) {
-        rat_divide_integer(INTERP, SELF, (int) value, dest);
+        dest = STATICSELF.clone();
+        rat_divide_integer(INTERP, dest, (int) value);
         return dest;
     }
 
@@ -960,7 +914,7 @@
 
 */
     VTABLE void i_divide_int(INTVAL value) {
-        rat_divide_integer(INTERP, SELF, (int) value, SELF);
+        rat_divide_integer(INTERP, SELF, (int) value);
     }
 
 /*
@@ -971,7 +925,8 @@
 
 */
     VTABLE PMC *divide_float(FLOATVAL value, PMC* dest) {
-        rat_divide_float(INTERP, SELF, (double) value, dest);
+        dest = STATICSELF.clone();
+        rat_divide_float(INTERP, dest, (double) value);
         return dest;
     }
 
@@ -983,7 +938,7 @@
 
 */
     VTABLE void i_divide_float(FLOATVAL value) {
-        rat_divide_float(INTERP, SELF, (double) value, SELF);
+        rat_divide_float(INTERP, SELF, (double) value);
     }
 
 /*
@@ -995,10 +950,7 @@
 */
     VTABLE PMC *neg(PMC* dest) {
       #ifdef PARROT_HAS_GMP
-        if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
-        else
-            dest = pmc_new(INTERP, SELF->vtable->base_type);
+        dest = pmc_new(INTERP, SELF->vtable->base_type);
 
         mpq_neg(RT(dest), RT(SELF));
         return dest;
@@ -1031,10 +983,7 @@
 */
     VTABLE PMC *absolute(PMC* dest) {
       #ifdef PARROT_HAS_GMP
-        if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
-        else
-            dest = pmc_new(INTERP, SELF->vtable->base_type);
+        dest = pmc_new(INTERP, SELF->vtable->base_type);
 
         mpq_abs(RT(dest), RT(SELF));
         return dest;

Modified: branches/ops_pct/src/events.c
==============================================================================
--- branches/ops_pct/src/events.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/events.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1351,7 +1351,7 @@
 Parrot_sleep_on_event(PARROT_INTERP, FLOATVAL t, ARGIN_NULLOK(opcode_t *next))
 {
     ASSERT_ARGS(Parrot_sleep_on_event)
-#if PARROT_HAS_THREADS
+#ifdef PARROT_HAS_THREADS
 
     if (interp->sleeping)
         fprintf(stderr, "nested sleep might not work\n");

Modified: branches/ops_pct/src/exceptions.c
==============================================================================
--- branches/ops_pct/src/exceptions.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/exceptions.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,5 +1,5 @@
 /*
-Copyright (C) 2001-2008, Parrot Foundation.
+Copyright (C) 2001-2009, Parrot Foundation.
 $Id$
 
 =head1 NAME
@@ -343,6 +343,7 @@
 
     Parrot_runloop    *return_point = interp->current_runloop;
     RunProfile * const profile      = interp->profile;
+    opcode_t *address;
     PMC        * const handler      =
                              Parrot_cx_find_handler_local(interp, exception);
 
@@ -384,12 +385,13 @@
     }
 
     /* Run the handler. */
-    Parrot_runops_fromc_args(interp, handler, "vP", exception);
-
-    /* After handling a C exception, you don't want to resume at the point
-     * where the C exception was thrown.  You want to resume the next outer
-     * runloop.  */
-    longjmp(return_point->resume, 1);
+    address = VTABLE_invoke(interp, handler, NULL);
+    if (PMC_cont(handler)->current_results)
+        address = pass_exception_args(interp, "P", address,
+                CONTEXT(interp), exception);
+    PARROT_ASSERT(return_point->handler_start == NULL);
+    return_point->handler_start = address;
+    longjmp(return_point->resume, 2);
 }
 
 /*

Modified: branches/ops_pct/src/gc/alloc_memory.c
==============================================================================
--- branches/ops_pct/src/gc/alloc_memory.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/gc/alloc_memory.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -24,6 +24,15 @@
 #include "parrot/parrot.h"
 #include "parrot/memory.h"
 
+PARROT_DOES_NOT_RETURN
+static void failed_allocation(unsigned int line, unsigned long size) /* HEADERIZER SKIP */
+{
+    fprintf(stderr, "Failed allocation of %lu bytes\n", size);
+    do_panic(NULL, "Out of mem", __FILE__, line);
+}
+
+#define PANIC_OUT_OF_MEM(size) failed_allocation(__LINE__, (size))
+
 /* HEADERIZER HFILE: include/parrot/memory.h */
 
 /*
@@ -49,7 +58,7 @@
     fprintf(stderr, "Allocated %i at %p\n", size, ptr);
 #endif
     if (!ptr)
-        PANIC(NULL, "Out of mem");
+        PANIC_OUT_OF_MEM(size);
     return ptr;
 }
 
@@ -80,7 +89,7 @@
     UNUSED(line);
 #endif
     if (!ptr)
-        PANIC(NULL, "Out of mem");
+        PANIC_OUT_OF_MEM(size);
     return ptr;
 }
 
@@ -107,7 +116,7 @@
     fprintf(stderr, "Allocated %i at %p\n", size, ptr);
 #endif
     if (!ptr)
-        PANIC(NULL, "Out of mem");
+        PANIC_OUT_OF_MEM(size);
     return ptr;
 }
 
@@ -139,7 +148,7 @@
     UNUSED(line);
 #endif
     if (!ptr)
-        PANIC(NULL, "Out of mem");
+        PANIC_OUT_OF_MEM(size);
     return ptr;
 }
 
@@ -174,7 +183,7 @@
     fprintf(stderr, "Allocated %i at %p\n", size, ptr);
 #endif
     if (!ptr)
-         PANIC(NULL, "Out of mem");
+        PANIC_OUT_OF_MEM(size);
     return ptr;
 }
 
@@ -207,7 +216,7 @@
     fprintf(stderr, "Allocated %i at %p\n", size, ptr);
 #endif
     if (!ptr)
-         PANIC(NULL, "Out of mem");
+        PANIC_OUT_OF_MEM(size);
 
     if (size > old_size)
         memset((char*)ptr + old_size, 0, size - old_size);
@@ -247,7 +256,7 @@
     UNUSED(line);
 #endif
     if (!ptr)
-        PANIC(NULL, "Out of mem");
+        PANIC_OUT_OF_MEM(size);
     return ptr;
 }
 
@@ -285,7 +294,7 @@
     UNUSED(line);
 #  endif
     if (!ptr)
-        PANIC(NULL, "Out of mem");
+        PANIC_OUT_OF_MEM(size);
     if (size > old_size)
         memset((char*)ptr + old_size, 0, size - old_size);
 
@@ -360,8 +369,8 @@
 {
     ASSERT_ARGS(mem_sys_strdup)
 
-    size_t l = strlen(src);
-    char *result = (char *)mem_sys_allocate(l + 1);
+    const size_t l = strlen(src);
+    char * const result = (char *)mem_sys_allocate(l + 1);
     memcpy(result, src, l);
     result[l] = '\0';
     return result;

Modified: branches/ops_pct/src/gc/alloc_resources.c
==============================================================================
--- branches/ops_pct/src/gc/alloc_resources.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/gc/alloc_resources.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -199,7 +199,7 @@
         if (!interp->arena_base->gc_mark_block_level
         &&   interp->arena_base->mem_allocs_since_last_collect) {
             Parrot_gc_mark_and_sweep(interp, GC_trace_stack_FLAG);
-#if !PARROT_GC_IMS
+#if !PARROT_GC_IMS && !PARROT_GC_INF
             /* Compact the pool if allowed and worthwhile */
             if (pool->compact) {
                 /* don't bother reclaiming if it's just chicken feed */

Modified: branches/ops_pct/src/gc/api.c
==============================================================================
--- branches/ops_pct/src/gc/api.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/gc/api.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -276,6 +276,9 @@
 #if PARROT_GC_GMS
     Parrot_gc_gms_init(interp);
 #endif
+#if PARROT_GC_INF
+    Parrot_gc_inf_init(interp);
+#endif
 
     initialize_memory_pools(interp);
     initialize_header_pools(interp);
@@ -398,6 +401,7 @@
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_ALLOCATION_ERROR,
             "Parrot VM: PMC_EXT allocation failed!\n");
     PObj_is_PMC_EXT_SET(pmc);
+    PObj_is_special_PMC_SET(pmc);
 
 #ifdef PARROT_GC_IMS
     /*

Copied: branches/ops_pct/src/gc/gc_inf.c (from r40255, trunk/src/gc/gc_inf.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/src/gc/gc_inf.c	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/src/gc/gc_inf.c)
@@ -0,0 +1,284 @@
+/*
+Copyright (C) 2001-2009, Parrot Foundation.
+$Id$
+
+=head1 NAME
+
+src/gc/gc_inf.c - A demonstration of an infinite memory garbage collector
+
+=head1 DESCRIPTION
+
+This code implements an example of a bare-bones "infinite memory" garbage
+collector. This is a learning tool only to demonstrate how to implement the
+GC API in a new core. DO NOT USE THIS CORE ANYWHERE FOR ANY REASON.
+
+Because this core never frees memory, some functionality is missing and some
+tests will fail: Tests for timely destruction, tests involving IO that is
+not manually flushed (the GC never calls the destroy VTABLE, so things never
+get flushed/closed automatically), etc. This is by design and should not be
+considered a "bug" or an "error". It is just a fact of life for such a
+minimalist core.
+
+To enable this core, change the settings in include/parrot/settings.h. Set
+
+ PARROT_GC_SUBSYSEM == 3
+
+to activate this core.
+
+=cut
+
+*/
+
+#include "parrot/parrot.h"
+#include "gc_private.h"
+
+/* HEADERIZER HFILE: src/gc/gc_private.h */
+
+/* HEADERIZER BEGIN: static */
+/* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
+
+static void gc_inf_add_free_object(SHIM_INTERP,
+    ARGMOD(Small_Object_Pool *pool),
+    ARGIN(void *to_add))
+        __attribute__nonnull__(2)
+        __attribute__nonnull__(3)
+        FUNC_MODIFIES(*pool);
+
+static void gc_inf_alloc_objects(SHIM_INTERP,
+    ARGMOD(Small_Object_Pool *pool))
+        __attribute__nonnull__(2)
+        FUNC_MODIFIES(*pool);
+
+PARROT_CANNOT_RETURN_NULL
+static void * gc_inf_get_free_object(SHIM_INTERP,
+    ARGMOD(Small_Object_Pool *pool))
+        __attribute__nonnull__(2)
+        FUNC_MODIFIES(*pool);
+
+static void gc_inf_mark_and_sweep(SHIM_INTERP, UINTVAL flags);
+static void gc_inf_more_traceable_objects(SHIM_INTERP,
+    ARGMOD(Small_Object_Pool *pool))
+        __attribute__nonnull__(2)
+        FUNC_MODIFIES(*pool);
+
+static void gc_inf_pool_init(SHIM_INTERP, ARGMOD(Small_Object_Pool *pool))
+        __attribute__nonnull__(2)
+        FUNC_MODIFIES(*pool);
+
+#define ASSERT_ARGS_gc_inf_add_free_object __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(pool) \
+    || PARROT_ASSERT_ARG(to_add)
+#define ASSERT_ARGS_gc_inf_alloc_objects __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(pool)
+#define ASSERT_ARGS_gc_inf_get_free_object __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(pool)
+#define ASSERT_ARGS_gc_inf_mark_and_sweep __attribute__unused__ int _ASSERT_ARGS_CHECK = 0
+#define ASSERT_ARGS_gc_inf_more_traceable_objects __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(pool)
+#define ASSERT_ARGS_gc_inf_pool_init __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(pool)
+/* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
+/* HEADERIZER END: static */
+
+/*
+
+=head1 Functions
+
+=over 4
+
+=item C<static void gc_inf_mark_and_sweep(PARROT_INTERP, UINTVAL flags)>
+
+This function would perform a GC run, if we needed to. Luckily we have
+infinite memory!
+
+This function is called from the GC API function C<Parrot_gc_mark_and_sweep>.
+
+Flags can be a combination of these values:
+
+  GC_finish_FLAG
+  GC_lazy_FLAG
+  GC_trace_stack_FLAG
+
+=cut
+
+*/
+
+static void
+gc_inf_mark_and_sweep(SHIM_INTERP, UINTVAL flags)
+{
+    ASSERT_ARGS(gc_inf_mark_and_sweep)
+    UNUSED(flags);
+}
+
+/*
+
+=item C<static void gc_inf_add_free_object(PARROT_INTERP, Small_Object_Pool
+*pool, void *to_add)>
+
+Manually frees a chunk of memory. Normally this would return the memory
+to the free list of the pool, but in this case we just return it to the
+OS.
+
+This function is called from places like C<Parrot_gc_free_pmc_header> and
+related manual freeing functions. Some cores will also use it internally to
+add items to the freelist from a freshly allocated arena.
+
+=cut
+
+*/
+
+static void
+gc_inf_add_free_object(SHIM_INTERP, ARGMOD(Small_Object_Pool *pool),
+    ARGIN(void *to_add))
+{
+    ASSERT_ARGS(gc_inf_add_free_object)
+    if (to_add)
+        free(to_add);
+}
+
+/*
+
+=item C<static void * gc_inf_get_free_object(PARROT_INTERP, Small_Object_Pool
+*pool)>
+
+Gets a new object from the pool. Each pool specifies an object size in
+C<pool->object_size> so we can use that number to make the allocation. For
+GCs that manage their own memory through the use of arenas or similar
+structures, we can use this basic algorithm here:
+
+ 1) Check if we have any items on the free list and allocate one from there
+    if so.
+ 2) Do a GC run to try and free up new items, and allocate a newly freed
+    item if one becomes available
+ 3) Allocate a new arena from the OS and allocate a new item from there.
+
+This function is called from GC API functions like
+C<Parrot_Gc_get_new_pmc_header>
+
+=cut
+
+*/
+
+PARROT_CANNOT_RETURN_NULL
+static void *
+gc_inf_get_free_object(SHIM_INTERP, ARGMOD(Small_Object_Pool *pool))
+{
+    ASSERT_ARGS(gc_inf_get_free_object)
+    return calloc(pool->object_size, 1);
+}
+
+/*
+
+=item C<static void gc_inf_alloc_objects(PARROT_INTERP, Small_Object_Pool
+*pool)>
+
+Allocates a new arena of objects from the system. This function is only
+really used internally by the core, the API functions don't need to call
+it directly. However, this function is necessary because we may have
+different behaviors for certain pools, so we can't allocate for all of them
+in the same way. We will need to have a new "alloc_objects" function
+for each special case pool.
+
+=cut
+
+*/
+
+static void
+gc_inf_alloc_objects(SHIM_INTERP, ARGMOD(Small_Object_Pool *pool))
+{
+    ASSERT_ARGS(gc_inf_alloc_objects)
+    UNUSED(pool);
+}
+
+/*
+
+=item C<static void gc_inf_more_traceable_objects(PARROT_INTERP,
+Small_Object_Pool *pool)>
+
+Would normally try to find new traceable objects by first running a GC sweep
+and then allocating a new arena from the system. Neither of these are
+necessary in the infinite memory collector.
+
+This function is only used internally to the core, and is not called directly
+from the GC API. Different pools may have special requirements so multiple
+"more_traceable_objects" functions may need to be written and used.
+
+=cut
+
+*/
+
+static void
+gc_inf_more_traceable_objects(SHIM_INTERP, ARGMOD(Small_Object_Pool *pool))
+{
+    ASSERT_ARGS(gc_inf_more_traceable_objects)
+    UNUSED(pool);
+}
+
+/*
+
+=item C<static void gc_inf_pool_init(PARROT_INTERP, Small_Object_Pool *pool)>
+
+Initializes the function pointers in a new pool. When a new pool is created
+we assign several function pointers to it for managing memory in the pool.
+In this way we can treat different pools differently if they have special
+management needs. In general all PObj-like pools are treated one way, and
+other pools (such as the pmc_ext pool) are treated differently.
+
+This function is mostly called from the function C<initialize_header_pools>
+in F<src/gc/mark_sweep.c> at Parrot startup.
+
+=cut
+
+*/
+
+static void
+gc_inf_pool_init(SHIM_INTERP, ARGMOD(Small_Object_Pool *pool))
+{
+    ASSERT_ARGS(gc_inf_pool_init)
+    pool->add_free_object = gc_inf_add_free_object;
+    pool->get_free_object = gc_inf_get_free_object;
+    pool->alloc_objects   = gc_inf_alloc_objects;
+    pool->more_objects    = gc_inf_more_traceable_objects;
+}
+
+/*
+
+=item C<void Parrot_gc_inf_init(PARROT_INTERP)>
+
+Initializes the infinite memory collector. Installs the necessary function
+pointers into the Arenas structure. The two most important are the
+C<mark_and_sweep> and C<pool_init> functions. C<finalize_gc_system> function
+will be called at Parrot exit and will shut down the GC system if things
+need to be flushed/closed/deactivated/freed/etc. It can be set to NULL if no
+finalization is necessary.
+
+=cut
+
+*/
+
+void
+Parrot_gc_inf_init(PARROT_INTERP)
+{
+    ASSERT_ARGS(Parrot_gc_inf_init)
+    Arenas * const arena_base     = interp->arena_base;
+
+    arena_base->do_gc_mark         = gc_inf_mark_and_sweep;
+    arena_base->finalize_gc_system = NULL;
+    arena_base->init_pool          = gc_inf_pool_init;
+}
+
+
+/*
+
+=back
+
+=cut
+
+*/
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Modified: branches/ops_pct/src/gc/gc_private.h
==============================================================================
--- branches/ops_pct/src/gc/gc_private.h	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/gc/gc_private.h	Fri Jul 24 19:42:02 2009	(r40257)
@@ -602,8 +602,21 @@
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 /* HEADERIZER END: src/gc/gc_ms.c */
 
+/* HEADERIZER BEGIN: src/gc/gc_inf.c */
+/* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
+
+void Parrot_gc_inf_init(PARROT_INTERP)
+        __attribute__nonnull__(1);
+
+#define ASSERT_ARGS_Parrot_gc_inf_init __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(interp)
+/* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
+/* HEADERIZER END: src/gc/gc_inf.c */
+
 #endif /* PARROT_GC_PRIVATE_H_GUARD */
 
+
+
 /*
  * Local variables:
  *   c-file-style: "parrot"

Modified: branches/ops_pct/src/gc/mark_sweep.c
==============================================================================
--- branches/ops_pct/src/gc/mark_sweep.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/gc/mark_sweep.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -216,6 +216,10 @@
     /* Now mark the class hash */
     Parrot_gc_mark_PObj_alive(interp, (PObj *)interp->class_hash);
 
+    /* Now mark the HLL stuff */
+    Parrot_gc_mark_PObj_alive(interp, (PObj *)interp->HLL_info);
+    Parrot_gc_mark_PObj_alive(interp, (PObj *)interp->HLL_namespace);
+
     /* Mark the registry */
     PARROT_ASSERT(interp->gc_registry);
     Parrot_gc_mark_PObj_alive(interp, (PObj *)interp->gc_registry);
@@ -1078,6 +1082,8 @@
      * Use GS MS pool functions
      */
     gc_ms_pmc_ext_pool_init(arena_base->pmc_ext_pool);
+#elif PARROT_GC_INF
+    arena_base->init_pool(interp, arena_base->pmc_ext_pool);
 #else
     /* rational, consistant behavior (as yet unwritten) */
 #endif

Modified: branches/ops_pct/src/global.c
==============================================================================
--- branches/ops_pct/src/global.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/global.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -205,20 +205,15 @@
         PMC *ns = base_ns;
 
         for (i = 0; i < n; ++i) {
-            if (!pmc_key)
-                Parrot_ex_throw_from_c_args(interp, NULL, 1,
-                    "Passed a NULL pmc_key into VTABLE_get_string_keyed_int");
-            else {
-                STRING * const part = VTABLE_get_string_keyed_int(interp, pmc_key, i);
-                PMC *sub_ns = VTABLE_get_pmc_keyed_str(interp, ns, part);
-
-                if (PMC_IS_NULL(sub_ns) || !VTABLE_isa(interp, sub_ns, isans)) {
-                    sub_ns = internal_ns_maybe_create(interp, ns, part, flags);
-                    if (PMC_IS_NULL(sub_ns))
-                        return PMCNULL;
-                }
-                ns = sub_ns;
+            STRING * const part = VTABLE_get_string_keyed_int(interp, pmc_key, i);
+            PMC *sub_ns = VTABLE_get_pmc_keyed_str(interp, ns, part);
+
+            if (PMC_IS_NULL(sub_ns) || !VTABLE_isa(interp, sub_ns, isans)) {
+                sub_ns = internal_ns_maybe_create(interp, ns, part, flags);
+                if (PMC_IS_NULL(sub_ns))
+                    return PMCNULL;
             }
+            ns = sub_ns;
         }
         return ns;
     }
@@ -280,7 +275,7 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
 PMC *
-Parrot_get_namespace_keyed(PARROT_INTERP, ARGIN(PMC *base_ns), ARGIN_NULLOK(PMC *pmc_key))
+Parrot_get_namespace_keyed(PARROT_INTERP, ARGIN(PMC *base_ns), ARGIN(PMC *pmc_key))
 {
     ASSERT_ARGS(Parrot_get_namespace_keyed)
     return internal_ns_keyed(interp, base_ns, pmc_key, 0);
@@ -327,7 +322,7 @@
 PARROT_CAN_RETURN_NULL
 PMC *
 Parrot_make_namespace_keyed(PARROT_INTERP, ARGIN(PMC *base_ns),
-        ARGIN_NULLOK(PMC *pmc_key))
+        ARGIN(PMC *pmc_key))
 {
     ASSERT_ARGS(Parrot_make_namespace_keyed)
     return internal_ns_keyed(interp, base_ns, pmc_key, INTERN_NS_CREAT);
@@ -389,35 +384,6 @@
 
 /*
 
-=item C<PMC * Parrot_get_namespace_autobase(PARROT_INTERP, PMC *key)>
-
-Find a namespace with the key C<key>, which may be a String, a Key, or an
-array of strings. If it is a String, then the lookup is relative to the
-current namespace. Otherwise, it is relative to the current HLL root
-namespace. Return the namespace, or NULL if not found.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-PMC *
-Parrot_get_namespace_autobase(PARROT_INTERP, ARGIN_NULLOK(PMC *key))
-{
-    ASSERT_ARGS(Parrot_get_namespace_autobase)
-    PMC *base_ns;
-    if (VTABLE_isa(interp, key, CONST_STRING(interp, "String")))
-        base_ns = CONTEXT(interp)->current_namespace;
-    else
-        base_ns = VTABLE_get_pmc_keyed_int(interp, interp->HLL_namespace,
-            CONTEXT(interp)->current_HLL);
-    return Parrot_get_namespace_keyed(interp, base_ns, key);
-}
-
-/*
-
 =item C<PMC * Parrot_ns_get_name(PARROT_INTERP, PMC *_namespace)>
 
 Retrieve an array of names from a namespace object.
@@ -571,36 +537,6 @@
 
 /*
 
-=item C<PMC * Parrot_find_global_k(PARROT_INTERP, PMC *pmc_key, STRING
-*globalname)>
-
-Search the namespace designated by C<pmc_key>, which may be a key PMC,
-an array of namespace name strings, or a string PMC, for an object
-with name C<globalname>.  Return the object, or NULL if not found.
-
-RT #46161 - For now this function prefers non-namespaces, it will eventually
-entirely use the untyped interface.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-PMC *
-Parrot_find_global_k(PARROT_INTERP, ARGIN_NULLOK(PMC *pmc_key), ARGIN(STRING *globalname))
-{
-    ASSERT_ARGS(Parrot_find_global_k)
-    PMC * const ns =
-        Parrot_get_namespace_keyed(interp,
-                                   Parrot_get_ctx_HLL_namespace(interp),
-                                   pmc_key);
-    return Parrot_find_global_n(interp, ns, globalname);
-}
-
-/*
-
 =item C<PMC * Parrot_find_global_s(PARROT_INTERP, STRING *str_key, STRING
 *globalname)>
 

Modified: branches/ops_pct/src/hash.c
==============================================================================
--- branches/ops_pct/src/hash.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/hash.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -322,13 +322,12 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_PURE_FUNCTION
 size_t
-key_hash_int(SHIM_INTERP, ARGIN(const void *value), size_t seed)
+key_hash_int(SHIM_INTERP, ARGIN_NULLOK(const void *value), size_t seed)
 {
     ASSERT_ARGS(key_hash_int)
     return (size_t)value ^ seed;
 }
 
-
 /*
 
 =item C<int int_compare(PARROT_INTERP, const void *a, const void *b)>
@@ -350,7 +349,6 @@
     return a != b;
 }
 
-
 /*
 
 =item C<void parrot_dump_hash(PARROT_INTERP, const Hash *hash)>
@@ -717,13 +715,13 @@
 {
     ASSERT_ARGS(expand_hash)
     HashBucket  **old_bi, **new_bi;
-    HashBucket   *bs, *b;
+    HashBucket   *bs, *b, *new_mem;
+    HashBucket   *old_offset = (HashBucket *)((char *)hash + sizeof (Hash));
 
-    void * const  old_mem  = hash->bs;
-    HashBucket *old_offset = (HashBucket*)((char*)hash + sizeof (Hash));
-    const UINTVAL old_size = hash->mask + 1;
-    const UINTVAL new_size = old_size << 1;
-    const UINTVAL old_nb   = N_BUCKETS(old_size);
+    void * const  old_mem    = hash->bs;
+    const UINTVAL old_size   = hash->mask + 1;
+    const UINTVAL new_size   = old_size << 1;
+    const UINTVAL old_nb     = N_BUCKETS(old_size);
     size_t        offset, i, new_loc;
 
     /*
@@ -738,7 +736,6 @@
     */
 
     /* resize mem */
-    HashBucket *new_mem;
     if (old_offset != old_mem) {
         /* This buffer has been reallocated at least once before. */
         new_mem = (HashBucket *)mem_sys_realloc(old_mem, HASH_ALLOC_SIZE(new_size));
@@ -757,11 +754,11 @@
          | new_mem                 | hash->bi
     */
     bs     = new_mem;
-    old_bi = (HashBucket**) (bs + old_nb);
-    new_bi = (HashBucket**) (bs + N_BUCKETS(new_size));
+    old_bi = (HashBucket **)(bs + old_nb);
+    new_bi = (HashBucket **)(bs + N_BUCKETS(new_size));
 
     /* things can have moved by this offset */
-    offset = (char*)new_mem - (char*)old_mem;
+    offset = (char *)new_mem - (char *)old_mem;
 
     /* relocate the bucket index */
     mem_sys_memmove(new_bi, old_bi, old_size * sizeof (HashBucket *));
@@ -772,7 +769,7 @@
     hash->mask = new_size - 1;
 
     /* clear freshly allocated bucket index */
-    memset(new_bi + old_size, 0, sizeof (HashBucket *) * old_size);
+    memset(new_bi + old_size, 0, sizeof (HashBucket *) * (new_size - old_size));
 
     /*
      * reloc pointers - this part would be also needed, if we
@@ -812,12 +809,11 @@
 
     /* add new buckets to free_list in reverse order
      * lowest bucket is top on free list and will be used first */
-    for (i = 0, b = (HashBucket*)new_bi - 1; i < old_nb; ++i, --b) {
+    for (i = 0, b = (HashBucket *)new_bi - 1; i < old_nb; ++i, --b) {
         b->next         = hash->free_list;
         b->key          = b->value         = NULL;
         hash->free_list = b;
     }
-
 }
 
 
@@ -825,7 +821,7 @@
 
 =item C<Hash* parrot_new_hash(PARROT_INTERP)>
 
-Creates a new Parrot STRING hash in C<hptr>.
+Creates a new Parrot STRING hash.
 
 =cut
 
@@ -847,26 +843,6 @@
 
 /*
 
-=item C<void parrot_new_pmc_hash(PARROT_INTERP, PMC *container)>
-
-Creates a new Parrot STRING hash in C<container>.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-parrot_new_pmc_hash(PARROT_INTERP, ARGOUT(PMC *container))
-{
-    ASSERT_ARGS(parrot_new_pmc_hash)
-    Hash * const hash = parrot_new_hash(interp);
-    VTABLE_set_pointer(interp, container, hash);
-}
-
-
-/*
-
 =item C<Hash* parrot_new_cstring_hash(PARROT_INTERP)>
 
 Creates a new C string hash in C<hptr>.
@@ -984,7 +960,7 @@
      * - use the bucket store and bi inside this structure
      * - when reallocate copy this part
      */
-    bp = (HashBucket *)((char*)alloc + sizeof (Hash));
+    bp = (HashBucket *)((char *)alloc + sizeof (Hash));
     hash->free_list = NULL;
 
     /* fill free_list from hi addresses so that we can use
@@ -1200,7 +1176,7 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
 HashBucket *
-parrot_hash_get_bucket(PARROT_INTERP, ARGIN(const Hash *hash), ARGIN(const void *key))
+parrot_hash_get_bucket(PARROT_INTERP, ARGIN(const Hash *hash), ARGIN_NULLOK(const void *key))
 {
     ASSERT_ARGS(parrot_hash_get_bucket)
 
@@ -1216,7 +1192,7 @@
             HashBucket *bucket = hash->bs + i;
 
             /* the hash->compare cost is too high for this fast path */
-            if (bucket->key && bucket->key == key)
+            if (bucket->key == key)
                 return bucket;
         }
     }
@@ -1299,12 +1275,26 @@
 PARROT_IGNORABLE_RESULT
 PARROT_CANNOT_RETURN_NULL
 HashBucket*
-parrot_hash_put(PARROT_INTERP, ARGMOD(Hash *hash), ARGIN(void *key), ARGIN_NULLOK(void *value))
+parrot_hash_put(PARROT_INTERP, ARGMOD(Hash *hash),
+        ARGIN_NULLOK(void *key), ARGIN_NULLOK(void *value))
 {
     ASSERT_ARGS(parrot_hash_put)
     const UINTVAL hashval = (hash->hash_val)(interp, key, hash->seed);
     HashBucket   *bucket  = hash->bi[hashval & hash->mask];
 
+    /* Very complex assert that we'll not put non-constant stuff into constant hash */
+    PARROT_ASSERT(
+        PMC_IS_NULL(hash->container)
+        || !(PObj_constant_TEST(hash->container))
+        || (
+            (
+                !(hash->key_type == Hash_key_type_STRING)
+                || PObj_constant_TEST((PObj *)key))
+            && (
+                !((hash->entry_type == enum_type_PMC) || (hash->entry_type == enum_type_STRING))
+                || PObj_constant_TEST((PObj *)value)))
+        || !"Use non-constant key or value in constant hash");
+
     while (bucket) {
         /* store hash_val or not */
         if ((hash->compare)(interp, key, bucket->key) == 0)

Modified: branches/ops_pct/src/hll.c
==============================================================================
--- branches/ops_pct/src/hll.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/hll.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -87,11 +87,6 @@
 
     PMC *entry_id;
 
-    /*
-     * ATT: all items that are owned by the HLL_info structure
-     *      have to be created as constant objects, because
-     *      this structure isn't marked by GC
-     */
     PMC * const entry = constant_pmc_new(interp, enum_class_FixedPMCArray);
 
     if (entry_name && !STRING_IS_EMPTY(entry_name)) {
@@ -133,7 +128,7 @@
 {
     ASSERT_ARGS(Parrot_init_HLL)
     interp->HLL_info      =
-        constant_pmc_new(interp, enum_class_OrderedHash);
+        pmc_new(interp, enum_class_OrderedHash);
     interp->HLL_namespace =
         constant_pmc_new(interp, enum_class_ResizablePMCArray);
 

Modified: branches/ops_pct/src/io/api.c
==============================================================================
--- branches/ops_pct/src/io/api.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/io/api.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -592,7 +592,7 @@
 
 =item C<INTVAL Parrot_io_puts(PARROT_INTERP, PMC *pmc, const char *s)>
 
-Writes C<*s> tp C<*pmc>. C string version.
+Writes C<*s> to C<*pmc>. C string version.
 
 =cut
 

Modified: branches/ops_pct/src/io/buffer.c
==============================================================================
--- branches/ops_pct/src/io/buffer.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/io/buffer.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -471,7 +471,7 @@
     size_t l;
     unsigned char *out_buf;
     unsigned char *buf_start;
-    INTVAL         buffer_flags = Parrot_io_get_buffer_flags(interp, filehandle);
+    const INTVAL   buffer_flags = Parrot_io_get_buffer_flags(interp, filehandle);
     unsigned char *buffer_next;
     unsigned char *buffer_end;
     size_t len;

Modified: branches/ops_pct/src/io/filehandle.c
==============================================================================
--- branches/ops_pct/src/io/filehandle.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/io/filehandle.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -555,7 +555,7 @@
 Parrot_io_clear_buffer(SHIM_INTERP, ARGIN(PMC *filehandle))
 {
     ASSERT_ARGS(Parrot_io_clear_buffer)
-    Parrot_FileHandle_attributes *io = PARROT_FILEHANDLE(filehandle);
+    Parrot_FileHandle_attributes * const io = PARROT_FILEHANDLE(filehandle);
     if (io->buffer_start && (io->flags & PIO_BF_MALLOC)) {
         mem_sys_free(io->buffer_start);
         io->buffer_start = NULL;
@@ -634,7 +634,7 @@
 Parrot_io_set_file_position(SHIM_INTERP, ARGIN(PMC *filehandle), PIOOFF_T file_pos)
 {
     ASSERT_ARGS(Parrot_io_set_file_position)
-    Parrot_FileHandle_attributes *handle_struct = PARROT_FILEHANDLE(filehandle);
+    Parrot_FileHandle_attributes * const handle_struct = PARROT_FILEHANDLE(filehandle);
     handle_struct->last_pos = handle_struct->file_pos;
     handle_struct->file_pos = file_pos;
 }
@@ -662,7 +662,7 @@
 Parrot_io_is_encoding(PARROT_INTERP, ARGIN(PMC *filehandle), ARGIN(STRING *value))
 {
     ASSERT_ARGS(Parrot_io_is_encoding)
-    Parrot_FileHandle_attributes *handle_struct = PARROT_FILEHANDLE(filehandle);
+    Parrot_FileHandle_attributes * const handle_struct = PARROT_FILEHANDLE(filehandle);
     if (STRING_IS_NULL(handle_struct->encoding))
         return 0;
 

Modified: branches/ops_pct/src/io/socket_api.c
==============================================================================
--- branches/ops_pct/src/io/socket_api.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/io/socket_api.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -150,7 +150,7 @@
 
 /*
 
-=item C<INTVAL Parrot_io_socket(PARROT_INTERP, PMC * socket, INTVAL fam, INTVAL
+=item C<INTVAL Parrot_io_socket(PARROT_INTERP, PMC *socket, INTVAL fam, INTVAL
 type, INTVAL proto)>
 
 Creates and returns a socket using the specified address family, socket type,
@@ -165,7 +165,7 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 INTVAL
-Parrot_io_socket(PARROT_INTERP, ARGMOD_NULLOK(PMC * socket), INTVAL fam,
+Parrot_io_socket(PARROT_INTERP, ARGMOD_NULLOK(PMC *socket), INTVAL fam,
             INTVAL type, INTVAL proto)
 {
     ASSERT_ARGS(Parrot_io_socket)

Modified: branches/ops_pct/src/io/socket_unix.c
==============================================================================
--- branches/ops_pct/src/io/socket_unix.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/io/socket_unix.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -100,11 +100,10 @@
 Parrot_io_sockaddr_in(PARROT_INTERP, ARGIN(STRING *addr), INTVAL port)
 {
     ASSERT_ARGS(Parrot_io_sockaddr_in)
-    PMC * sockaddr;
-    char * s;
 
-    s = Parrot_str_to_cstring(interp, addr);
-    sockaddr = pmc_new(interp, enum_class_Sockaddr);
+    char * const s        = Parrot_str_to_cstring(interp, addr);
+    PMC  * const sockaddr = pmc_new(interp, enum_class_Sockaddr);
+
     get_sockaddr_in(interp, sockaddr, s, port);
     free(s);
     return sockaddr;
@@ -131,9 +130,9 @@
 Parrot_io_socket_unix(PARROT_INTERP, ARGIN(PMC *s), int fam, int type, int proto)
 {
     ASSERT_ARGS(Parrot_io_socket_unix)
-    int sock, i = 1;
-    sock = socket(fam, type, proto);
+    const int sock = socket(fam, type, proto);
     if (sock >= 0) {
+        int i = 1;
         setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof (i));
         Parrot_io_set_os_handle(interp, s, sock);
         SOCKADDR_REMOTE(s)->sin_family = fam;
@@ -156,7 +155,7 @@
 Parrot_io_connect_unix(PARROT_INTERP, ARGMOD(PMC *socket), ARGIN(PMC *r))
 {
     ASSERT_ARGS(Parrot_io_connect_unix)
-    Parrot_Socket_attributes * io = PARROT_SOCKET(socket);
+    const Parrot_Socket_attributes * const io = PARROT_SOCKET(socket);
 
     if (!r)
         return -1;
@@ -195,7 +194,7 @@
 Parrot_io_bind_unix(PARROT_INTERP, ARGMOD(PMC *socket), ARGMOD(PMC *sockaddr))
 {
     ASSERT_ARGS(Parrot_io_bind_unix)
-    Parrot_Socket_attributes * io = PARROT_SOCKET(socket);
+    const Parrot_Socket_attributes * const io = PARROT_SOCKET(socket);
     struct sockaddr_in * saddr;
 
     if (!sockaddr)
@@ -228,7 +227,7 @@
 Parrot_io_listen_unix(SHIM_INTERP, ARGMOD(PMC *socket), INTVAL sec)
 {
     ASSERT_ARGS(Parrot_io_listen_unix)
-    Parrot_Socket_attributes * io = PARROT_SOCKET(socket);
+    const Parrot_Socket_attributes * const io = PARROT_SOCKET(socket);
     if ((listen(io->os_handle, sec)) == -1) {
         return -1;
     }
@@ -412,7 +411,7 @@
     ASSERT_ARGS(Parrot_io_poll_unix)
     fd_set r, w, e;
     struct timeval t;
-    Parrot_Socket_attributes * io = PARROT_SOCKET(socket);
+    const Parrot_Socket_attributes * const io = PARROT_SOCKET(socket);
 
     t.tv_sec = sec;
     t.tv_usec = usec;
@@ -454,11 +453,10 @@
             int port)
 {
     ASSERT_ARGS(get_sockaddr_in)
-    struct sockaddr_in *sa;
     /* Hard coded to IPv4 for now */
     const int family = AF_INET;
 
-    sa = (struct sockaddr_in*)VTABLE_get_pointer(interp, sockaddr);
+    struct sockaddr_in * const sa = (struct sockaddr_in*)VTABLE_get_pointer(interp, sockaddr);
 #    ifdef PARROT_DEF_INET_ATON
     if (inet_aton(host, &sa->sin_addr) != 0) {
 #    else

Modified: branches/ops_pct/src/io/unix.c
==============================================================================
--- branches/ops_pct/src/io/unix.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/io/unix.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -233,7 +233,7 @@
             flags |= PIO_F_CONSOLE;
 
         if (PMC_IS_NULL(filehandle)) {
-            PMC *io = Parrot_io_new_pmc(interp, flags);
+            PMC * const io = Parrot_io_new_pmc(interp, flags);
             Parrot_io_set_os_handle(interp, io, fd);
             return io;
         }
@@ -268,8 +268,8 @@
 Parrot_io_async_unix(PARROT_INTERP, ARGMOD(PMC *filehandle), INTVAL b)
 {
     ASSERT_ARGS(Parrot_io_async_unix)
-    int rflags;
 #    if defined(linux)
+    int rflags;
     PIOHANDLE file_descriptor = Parrot_io_get_os_handle(interp, filehandle);
 
     if ((rflags = fcntl(file_descriptor, F_GETFL, 0)) >= 0) {
@@ -498,7 +498,7 @@
 {
     ASSERT_ARGS(Parrot_io_read_unix)
     const PIOHANDLE file_descriptor = Parrot_io_get_os_handle(interp, filehandle);
-    INTVAL file_flags = Parrot_io_get_flags(interp, filehandle);
+    const INTVAL file_flags = Parrot_io_get_flags(interp, filehandle);
     STRING * const s = Parrot_io_make_string(interp, buf, 2048);
 
     const size_t len = s->bufused;
@@ -716,11 +716,12 @@
     else /* (pid == 0) */ {
         /* Child - exec process */
         char * argv[4];
-        /* C strings for the execv call defined that way to avoid
+        /* C strings for the execv call defined without const to avoid
          * const problems without copying them.
+         * Please don't change this without testing with a c++ compiler.
          */
-        static const char auxarg0[] = "/bin/sh";
-        static const char auxarg1[] = "-c";
+        static char auxarg0[] = "/bin/sh";
+        static char auxarg1[] = "-c";
 
         if (f_write) {
             /* the other end is writing - we read from the pipe */

Modified: branches/ops_pct/src/jit/i386/jit_defs.c
==============================================================================
--- branches/ops_pct/src/jit/i386/jit_defs.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/jit/i386/jit_defs.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -2265,15 +2265,6 @@
                 break;
             case 'v':
                 break;
-            case 'V':
-                emitm_call_cfunc(pc, get_nci_P);
-                emitm_movl_r_m(interp, pc, emit_EAX, emit_EBP, 0, 1, temp_calls_offset + 4);
-                /* Call the get_pointer VTABLE on the Pointer PMC to get the returned pointer */
-                emitm_movl_m_r(interp, pc, emit_EAX, emit_EAX, 0, 1, offsetof(PMC, vtable));
-                emitm_movl_m_r(interp, pc, emit_EAX, emit_EAX, 0, 1, offsetof(VTABLE, get_pointer));
-                emitm_callr(pc, emit_EAX);
-                emitm_movl_r_m(interp, pc, emit_EAX, emit_EBP, 0, 1, args_offset);
-                break;
             case 'b':   /* buffer (void*) pass PObj_bufstart(SReg) */
                 emitm_call_cfunc(pc, get_nci_S);
                 emitm_movl_m_r(interp, pc, emit_EAX, emit_EAX, 0, 1,
@@ -2296,6 +2287,7 @@
             case '2':
             case '3':
             case '4':
+            case 'V':
                 mem_free_executable(jit_info.native_ptr, JIT_ALLOC_SIZE);
                 return NULL;
                 break;

Modified: branches/ops_pct/src/library.c
==============================================================================
--- branches/ops_pct/src/library.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/library.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -229,12 +229,12 @@
             PARROT_LIB_PATH_DYNEXT, paths);
     entry = CONST_STRING(interp, "runtime/parrot/dynext/");
     VTABLE_push_string(interp, paths, entry);
+    entry = CONST_STRING(interp, "dynext/");
+    VTABLE_push_string(interp, paths, entry);
     if (!STRING_IS_NULL(versionlib)) {
         entry = Parrot_str_concat(interp, versionlib, CONST_STRING(interp, "/dynext/"), 0);
         VTABLE_push_string(interp, paths, entry);
     }
-    entry = CONST_STRING(interp, "dynext/");
-    VTABLE_push_string(interp, paths, entry);
 
     /* shared exts */
     paths = pmc_new(interp, enum_class_ResizableStringArray);

Modified: branches/ops_pct/src/list.c
==============================================================================
--- branches/ops_pct/src/list.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/list.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -191,9 +191,17 @@
 
 PARROT_IGNORABLE_RESULT
 PARROT_CANNOT_RETURN_NULL
-static List_chunk * add_chunk(PARROT_INTERP,
+static List_chunk * add_chunk_at_end(PARROT_INTERP,
+    ARGMOD(List *list),
+    UINTVAL idx)
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
+        FUNC_MODIFIES(*list);
+
+PARROT_IGNORABLE_RESULT
+PARROT_CANNOT_RETURN_NULL
+static List_chunk * add_chunk_at_start(PARROT_INTERP,
     ARGMOD(List *list),
-    int where,
     UINTVAL idx)
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
@@ -289,7 +297,10 @@
         FUNC_MODIFIES(*list)
         FUNC_MODIFIES(*chunk);
 
-#define ASSERT_ARGS_add_chunk __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+#define ASSERT_ARGS_add_chunk_at_end __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(interp) \
+    || PARROT_ASSERT_ARG(list)
+#define ASSERT_ARGS_add_chunk_at_start __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(list)
 #define ASSERT_ARGS_alloc_next_size __attribute__unused__ int _ASSERT_ARGS_CHECK = \
@@ -818,11 +829,10 @@
 
 /*
 
-=item C<static List_chunk * add_chunk(PARROT_INTERP, List *list, int where,
+=item C<static List_chunk * add_chunk_at_start(PARROT_INTERP, List *list,
 UINTVAL idx)>
 
-Adds a new chunk to the C<list>. If C<where> is 0, the chunk is added to
-the front of the list. If 0, it is added to the end of the list.
+Adds a new chunk to the start of C<list>.
 
 =cut
 
@@ -831,27 +841,51 @@
 PARROT_IGNORABLE_RESULT
 PARROT_CANNOT_RETURN_NULL
 static List_chunk *
-add_chunk(PARROT_INTERP, ARGMOD(List *list), int where, UINTVAL idx)
+add_chunk_at_start(PARROT_INTERP, ARGMOD(List *list), UINTVAL idx)
 {
-    ASSERT_ARGS(add_chunk)
-    List_chunk * const chunk     = where ? list->last : list->first;
-    List_chunk * const new_chunk = alloc_next_size(interp, list, where, idx);
-
-    if (where) {                /* at end */
-        if (chunk)
-            chunk->next = new_chunk;
-        if (!list->first)
-            list->first = new_chunk;
+    ASSERT_ARGS(add_chunk_at_start)
+    List_chunk * const chunk     = list->first;
+    List_chunk * const new_chunk = alloc_next_size(interp, list, enum_add_at_start, idx);
+
+    new_chunk->next = chunk;
+    list->first     = new_chunk;
 
+    if (!list->last)
         list->last = new_chunk;
-    }
-    else {
-        new_chunk->next = chunk;
-        list->first     = new_chunk;
 
-        if (!list->last)
-            list->last = new_chunk;
-    }
+    rebuild_chunk_list(interp, list);
+
+    return new_chunk;
+}
+
+
+/*
+
+=item C<static List_chunk * add_chunk_at_end(PARROT_INTERP, List *list, UINTVAL
+idx)>
+
+Adds a new chunk to the end of C<list>.
+
+=cut
+
+*/
+
+PARROT_IGNORABLE_RESULT
+PARROT_CANNOT_RETURN_NULL
+static List_chunk *
+add_chunk_at_end(PARROT_INTERP, ARGMOD(List *list), UINTVAL idx)
+{
+    ASSERT_ARGS(add_chunk_at_end)
+    List_chunk * const chunk     = list->last;
+    List_chunk * const new_chunk = alloc_next_size(interp, list, enum_add_at_end, idx);
+
+    if (chunk)
+        chunk->next = new_chunk;
+
+    if (!list->first)
+        list->first = new_chunk;
+
+    list->last = new_chunk;
 
     rebuild_chunk_list(interp, list);
 
@@ -1300,13 +1334,13 @@
     ASSERT_ARGS(list_append)
     /* initially, list may be empty, also used by assign */
     while (idx >= list->cap)
-        add_chunk(interp, list, enum_add_at_end, idx);
+        add_chunk_at_end(interp, list, idx);
 
     list_set(interp, list, item, type, idx);
 
     /* invariant: prepare for next push */
     if (idx >= list->cap - 1)
-        add_chunk(interp, list, enum_add_at_end, 0);
+        add_chunk_at_end(interp, list, 0);
 }
 
 
@@ -1713,8 +1747,7 @@
             /* assume user will fill it, so don't generate sparse chunks */
             if (!list->cap && idx > MAX_ITEMS) {
                 while (idx - MAX_ITEMS >= list->cap) {
-                    add_chunk(interp, list, enum_add_at_end,
-                            list->cap + MAX_ITEMS);
+                    add_chunk_at_end(interp, list, list->cap + MAX_ITEMS);
                 }
             }
 
@@ -1758,7 +1791,7 @@
         list->length = idx;
 
         while (idx >= (INTVAL)list->cap)
-            add_chunk(interp, list, enum_add_at_end, idx);
+            add_chunk_at_end(interp, list, idx);
 
         return;
     }
@@ -1947,7 +1980,7 @@
     List_chunk *chunk;
 
     if (list->start == 0) {
-        chunk       = add_chunk(interp, list, enum_add_at_start, 0);
+        chunk       = add_chunk_at_start(interp, list, 0);
         list->start = chunk->items;
     }
 
@@ -2128,7 +2161,7 @@
 
 PARROT_EXPORT
 void
-list_splice(PARROT_INTERP, ARGMOD(List *list), ARGIN_NULLOK(List *value_list),
+list_splice(PARROT_INTERP, ARGMOD(List *list), ARGMOD_NULLOK(List *value_list),
         INTVAL offset, INTVAL count)
 {
     ASSERT_ARGS(list_splice)

Modified: branches/ops_pct/src/multidispatch.c
==============================================================================
--- branches/ops_pct/src/multidispatch.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/multidispatch.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -84,7 +84,8 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
-PARROT_CANNOT_RETURN_NULL
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 static STRING * mmd_cache_key_from_types(PARROT_INTERP,
     ARGIN(const char *name),
     ARGIN(PMC *types))
@@ -92,7 +93,8 @@
         __attribute__nonnull__(2)
         __attribute__nonnull__(3);
 
-PARROT_CANNOT_RETURN_NULL
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 static STRING * mmd_cache_key_from_values(PARROT_INTERP,
     ARGIN(const char *name),
     ARGIN(PMC *values))
@@ -100,8 +102,8 @@
         __attribute__nonnull__(2)
         __attribute__nonnull__(3);
 
-PARROT_CANNOT_RETURN_NULL
 PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 static PMC* mmd_cvt_to_types(PARROT_INTERP, ARGIN(PMC *multi_sig))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
@@ -141,7 +143,8 @@
 static PMC* Parrot_mmd_arg_tuple_func(PARROT_INTERP)
         __attribute__nonnull__(1);
 
-PARROT_CANNOT_RETURN_NULL
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 static PMC * Parrot_mmd_get_cached_multi_sig(PARROT_INTERP,
     ARGIN(PMC *sub_pmc))
         __attribute__nonnull__(1)
@@ -343,7 +346,7 @@
 */
 
 PARROT_EXPORT
-PARROT_CANNOT_RETURN_NULL
+PARROT_CAN_RETURN_NULL
 PARROT_WARN_UNUSED_RESULT
 PMC *
 Parrot_mmd_find_multi_from_long_sig(PARROT_INTERP, ARGIN(STRING *name),
@@ -355,8 +358,9 @@
                                     interp->root_namespace, multi_str);
     PMC    * const multi_sub = Parrot_get_global(interp, ns, name);
 
-    if (PMC_IS_NULL(multi_sub))
+    if (PMC_IS_NULL(multi_sub)) {
         return PMCNULL;
+    }
     else {
         PMC * const type_tuple = mmd_build_type_tuple_from_long_sig(interp, long_sig);
         return Parrot_mmd_sort_candidates(interp, type_tuple, multi_sub);
@@ -748,8 +752,8 @@
 
 */
 
-PARROT_CANNOT_RETURN_NULL
 PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 static PMC*
 mmd_cvt_to_types(PARROT_INTERP, ARGIN(PMC *multi_sig))
 {
@@ -805,7 +809,8 @@
 
 */
 
-PARROT_CANNOT_RETURN_NULL
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 static PMC *
 Parrot_mmd_get_cached_multi_sig(PARROT_INTERP, ARGIN(PMC *sub_pmc))
 {
@@ -1401,7 +1406,8 @@
 
 */
 
-PARROT_CANNOT_RETURN_NULL
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 static STRING *
 mmd_cache_key_from_values(PARROT_INTERP, ARGIN(const char *name),
     ARGIN(PMC *values))
@@ -1448,7 +1454,8 @@
 */
 
 PARROT_EXPORT
-PARROT_CANNOT_RETURN_NULL
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 PMC *
 Parrot_mmd_cache_lookup_by_values(PARROT_INTERP, ARGMOD(MMD_Cache *cache),
     ARGIN(const char *name), ARGIN(PMC *values))
@@ -1499,7 +1506,8 @@
 
 */
 
-PARROT_CANNOT_RETURN_NULL
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 static STRING *
 mmd_cache_key_from_types(PARROT_INTERP, ARGIN(const char *name),
     ARGIN(PMC *types))
@@ -1548,13 +1556,14 @@
 */
 
 PARROT_EXPORT
-PARROT_CANNOT_RETURN_NULL
+PARROT_WARN_UNUSED_RESULT
+PARROT_CAN_RETURN_NULL
 PMC *
 Parrot_mmd_cache_lookup_by_types(PARROT_INTERP, ARGMOD(MMD_Cache *cache),
     ARGIN(const char *name), ARGIN(PMC *types))
 {
     ASSERT_ARGS(Parrot_mmd_cache_lookup_by_types)
-    STRING * const key = mmd_cache_key_from_types(interp, name, types);
+    const STRING * const key = mmd_cache_key_from_types(interp, name, types);
 
     if (key)
         return (PMC *)parrot_hash_get(interp, cache, key);

Modified: branches/ops_pct/src/oo.c
==============================================================================
--- branches/ops_pct/src/oo.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/oo.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -620,33 +620,6 @@
 
 /*
 
-=item C<const char* Parrot_MMD_method_name(PARROT_INTERP, INTVAL idx)>
-
-Return the method name for the given MMD enum.
-
-{{**DEPRECATE**}}
-
-=cut
-
-*/
-
-PARROT_EXPORT
-PARROT_PURE_FUNCTION
-PARROT_CAN_RETURN_NULL
-const char*
-Parrot_MMD_method_name(SHIM_INTERP, INTVAL idx)
-{
-    ASSERT_ARGS(Parrot_MMD_method_name)
-    PARROT_ASSERT(idx >= 0);
-
-    if (idx >= MMD_USER_FIRST)
-        return NULL;
-
-    return Parrot_mmd_func_names[idx];
-}
-
-/*
-
 =item C<static INTVAL fail_if_type_exists(PARROT_INTERP, PMC *name)>
 
 This function throws an exception if a PMC or class with the same name *
@@ -1250,7 +1223,12 @@
 
 =item C<PMC* Parrot_ComputeMRO_C3(PARROT_INTERP, PMC *_class)>
 
-Computes the C3 linearization for the given class.
+Computes the C3 linearization for the given class. C3 is an algorithm to
+compute the method resolution order (MRO) of a class that is inheriting
+from multiple parent classes (multiple inheritance). C3 was first described
+by Barrett et al at:
+
+F<http://192.220.96.201/dylan/linearization-oopsla96.html>
 
 =cut
 

Modified: branches/ops_pct/src/ops/core.ops
==============================================================================
--- branches/ops_pct/src/ops/core.ops	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/ops/core.ops	Fri Jul 24 19:42:02 2009	(r40257)
@@ -960,6 +960,8 @@
                                                       $1, NULL);
     VTABLE_set_attr_str(interp, exception,
                         Parrot_str_new_constant(interp, "resume"), resume);
+    VTABLE_set_integer_keyed_str(interp, exception,
+        Parrot_str_new_constant(interp, "exit_code"), $1);
     dest = Parrot_ex_throw_from_op(interp, exception, ret);
     goto ADDRESS(dest);
 }

Deleted: branches/ops_pct/src/ops/obscure.ops
==============================================================================
--- branches/ops_pct/src/ops/obscure.ops	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,117 +0,0 @@
-/*
- * $Id$
-** obscure.ops
-*/
-
-BEGIN_OPS_PREAMBLE
-
-#include <math.h>
-
-END_OPS_PREAMBLE
-
-=head1 NAME
-
-obscure.ops - Obscure Mathmatical Opcodes
-
-=cut
-
-=head1 DESCRIPTION
-
-Parrot's library of obscure ops.
-
-=cut
-
-
-###############################################################################
-
-=head2 Obscure trigonometric operations
-
-Reference:
-
-    Abramowitz, M. and Stegum, C. A. (Eds.). Handbook of Mathematical
-    Functions with Formulas, Graphs, and Mathematical Tables, 9th printing.
-    New York: Dover, p. 78, 1972.
-
-=over 4
-
-=cut
-
-
-########################################
-
-=item B<covers>(out NUM, in NUM)
-
-Set $1 to the coversine (in radians) of $2.
-
-=cut
-
-inline op covers(out NUM, in NUM) :advanced_math {
-  $1 = 1.0 - sin($2);
-}
-
-
-########################################
-
-=item B<exsec>(out NUM, in NUM)
-
-Set $1 to the exsecant of $2 (given in radians).
-
-=cut
-
-
-inline op exsec(out NUM, in NUM) :advanced_math {
-  $1 = (1.0 / cos($2)) - 1.0;
-}
-
-
-########################################
-
-=item B<hav>(out NUM, in NUM)
-
-Set $1 to the haversine (in radians) of $2.
-
-=cut
-
-inline op hav(out NUM, in NUM) {
-  $1 = 0.5 * (1.0 - cos($2));
-}
-
-
-########################################
-
-=item B<vers>(out NUM, in NUM)
-
-Set $1 to the versine (in radians) of $2.
-
-=cut
-
-inline op vers(out NUM, in NUM) :advanced_math {
-  $1 = 1.0 - cos($2);
-}
-
-
-=back
-
-=cut
-
-
-###############################################################################
-
-=head1 COPYRIGHT
-
-Copyright (C) 2001-2008, Parrot Foundation.
-
-=head1 LICENSE
-
-This program is free software. It is subject to the same license
-as the Parrot interpreter itself.
-
-=cut
-
-
-/*
- * Local variables:
- *   c-file-style: "parrot"
- * End:
- * vim: expandtab shiftwidth=4:
- */

Modified: branches/ops_pct/src/ops/sys.ops
==============================================================================
--- branches/ops_pct/src/ops/sys.ops	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/ops/sys.ops	Fri Jul 24 19:42:02 2009	(r40257)
@@ -29,8 +29,12 @@
 $2 and wait for it to finish. The return status, which is very
 system-dependent, goes in $1.
 
-RT#36619: spawnw should return something less system-dependent, and more
-object-like. see RT ticket [perl #36619] for more info.
+TT #847: C<spawnw()> should itself handle splitting up command-line arguments,
+rather than depending on the shell to do so in potentially unsafe manner.
+See https://trac.parrot.org/parrot/ticket/847.
+
+TT #848: C<spawnw()> should return something less system-dependent, and more
+object-like. See https://trac.parrot.org/parrot/ticket/848.
 
 =cut
 

Modified: branches/ops_pct/src/packfile.c
==============================================================================
--- branches/ops_pct/src/packfile.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/packfile.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -889,6 +889,14 @@
 pbc_action_enum_t action, PMC *eval_pmc)>
 
 C<action> is one of C<PBC_PBC>, C<PBC_LOADED>, C<PBC_INIT>, or C<PBC_MAIN>.
+These determine which subs get executed at this point. Some rules:
+
+ :immediate subs always execute immediately
+ :postcomp subs always execute immediately
+ :main subs execute when we have the PBC_MAIN or PBC_PBC actions
+ :init subs execute when :main does
+ :load subs execute on PBC_LOAD
+
 Also store the C<eval_pmc> in the sub structure, so that the eval PMC is kept
 alive by living subs.
 
@@ -2243,6 +2251,26 @@
             }
         }
     }
+
+    /* XXX
+     * Temporary? hack to put ConstantTable in front of other segments.
+     * This is useful for Annotations because we ensure that constants used
+     * for keys already available during unpack.
+     */
+    seg = dir->segments[2];
+
+    if (seg->type != PF_CONST_SEG) {
+        size_t i;
+
+        for (i = 3; i < num_segs; i++) {
+            PackFile_Segment * const s2 = dir->segments[i];
+            if (s2->type == PF_CONST_SEG) {
+                dir->segments[2] = s2;
+                dir->segments[i] = seg;
+                break;
+            }
+        }
+    }
 }
 
 
@@ -4888,8 +4916,9 @@
 =item C<void PackFile_fixup_subs(PARROT_INTERP, pbc_action_enum_t what, PMC
 *eval)>
 
-Runs C<:load> or C<:immediate> subroutines for the current code segment.  If
-C<eval> is given, set this as the owner of the subroutines.
+Calls C<:load>, C<:init>, C<:main>, C<:immediate> and/or C<:postcomp>
+subroutines in the current packfile, depending on the value of C<action>.
+See C<do_sub_pragmas> for more details.
 
 =cut
 

Deleted: branches/ops_pct/src/pbc_info.c
==============================================================================
--- branches/ops_pct/src/pbc_info.c	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,113 +0,0 @@
-/*
-Copyright (C) 2001-2003, Parrot Foundation.
-$Id$
-
-=head1 NAME
-
-pbc_info - PackFile demo
-
-=head1 SYNOPSIS
-
- pbc_info file.pbc
-
-=head1 DESCRIPTION
-
-Sample program for dumping PackFile segment names by iterating
-over the main directory.
-
-=head2 Functions
-
-=over 4
-
-=cut
-
-*/
-
-#include "parrot/parrot.h"
-#include "parrot/embed.h"
-
-/*
-
-=item C<static INTVAL iter(PARROT_INTERP, PackFile_Segment *seg, void
- *user_data)>
-
-This function is passed the callback to PackFile_map_segments() to print out
-the name of each segment in the directory.
-
-=cut
-
-*/
-
-static INTVAL
-iter(PARROT_INTERP, PackFile_Segment *seg, void *user_data)
-{
-    long ident = (long)user_data;
-    int length = ident;
-    printf("%*.0s%s\n", length, "", seg->name);
-    if (seg->type == PF_DIR_SEG)
-        PackFile_map_segments(interp, (PackFile_Directory*)seg,
-                iter, (void*)(ident+2));
-    return 0;
-}
-
-/*
-
-=item C<int main(int argc, char *argv[])>
-
-Reads the PBC from argv[1], adds a few extra sections, and then iterates over
-the directory using PackFile_map_segments() and iter().
-
-=cut
-
-*/
-
-int
-main(SHIM(int argc), char *argv[])
-{
-    PackFile *pf;
-    Interp *interp;
-    PackFile_Segment *seg;
-
-    interp = Parrot_new(NULL);
-
-    pf = Parrot_pbc_read(interp, argv[1], PFOPT_UTILS);
-
-    /*
-     * add some more segments
-     */
-    seg = PackFile_Segment_new_seg(interp,
-                    &pf->directory, PF_DIR_SEG, "dir2", 1);
-    seg = PackFile_Segment_new_seg(interp,
-                    (PackFile_Directory*)seg, PF_BYTEC_SEG, "code", 1);
-    seg = PackFile_Segment_new_seg(interp,
-                    &pf->directory, PF_DIR_SEG, "dir3", 1);
-
-    /*
-     * show these
-     */
-    printf("%s\n", pf->directory.base.name);
-    PackFile_map_segments(interp, &pf->directory, iter, (void*)2);
-
-    Parrot_exit(interp, 0);
-}
-
-/*
-
-=back
-
-=head1 SEE ALSO
-
-F<src/packfile.c>, F<include/parrot/packfile.h>.
-
-=cut
-
-*/
-
-
-/*
- * Local variables:
- *   c-file-style: "parrot"
- * End:
- * vim: expandtab shiftwidth=4:
- */
-

Modified: branches/ops_pct/src/pmc.c
==============================================================================
--- branches/ops_pct/src/pmc.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -50,6 +50,14 @@
         __attribute__nonnull__(2)
         FUNC_MODIFIES(* pmc);
 
+PARROT_CANNOT_RETURN_NULL
+static PMC* pmc_reuse_no_init(PARROT_INTERP,
+    ARGIN(PMC *pmc),
+    INTVAL new_type,
+    SHIM(UINTVAL flags))
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2);
+
 #define ASSERT_ARGS_check_pmc_reuse_flags __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp)
 #define ASSERT_ARGS_create_class_pmc __attribute__unused__ int _ASSERT_ARGS_CHECK = \
@@ -59,6 +67,9 @@
 #define ASSERT_ARGS_pmc_reuse_check_pmc_ext __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(pmc)
+#define ASSERT_ARGS_pmc_reuse_no_init __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(interp) \
+    || PARROT_ASSERT_ARG(pmc)
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 /* HEADERIZER END: static */
 
@@ -145,9 +156,68 @@
 PARROT_IGNORABLE_RESULT
 PMC *
 pmc_reuse(PARROT_INTERP, ARGIN(PMC *pmc), INTVAL new_type,
-          SHIM(UINTVAL flags))
+          UINTVAL flags)
 {
     ASSERT_ARGS(pmc_reuse)
+    pmc = pmc_reuse_no_init(interp, pmc, new_type, flags);
+
+    /* Call the base init for the redone pmc. Warning, this should not
+       be called on Object PMCs. */
+    VTABLE_init(interp, pmc);
+
+    return pmc;
+}
+
+/*
+
+=item C<PMC * pmc_reuse_init(PARROT_INTERP, PMC *pmc, INTVAL new_type, PMC
+*init, UINTVAL flags)>
+
+Reuse an existing PMC, turning it into an PMC of the new type. Any
+required internal structure will be put in place (such as the extension area)
+and the PMC will be inited.
+
+Cannot currently handle converting a non-Object PMC into an Object. Use
+C<pmc_reuse_by_class> for that.
+
+
+=cut
+
+*/
+
+PARROT_EXPORT
+PARROT_CANNOT_RETURN_NULL
+PARROT_IGNORABLE_RESULT
+PMC *
+pmc_reuse_init(PARROT_INTERP, ARGIN(PMC *pmc), INTVAL new_type, ARGIN(PMC *init),
+          UINTVAL flags)
+{
+    ASSERT_ARGS(pmc_reuse_init)
+    pmc = pmc_reuse_no_init(interp, pmc, new_type, flags);
+
+    /* Call the base init for the redone pmc. Warning, this should not
+       be called on Object PMCs. */
+    VTABLE_init_pmc(interp, pmc, init);
+
+    return pmc;
+}
+
+/*
+
+=item C<static PMC* pmc_reuse_no_init(PARROT_INTERP, PMC *pmc, INTVAL new_type,
+UINTVAL flags)>
+
+Prepare pmc for reuse. Do all scuffolding except initing.
+
+=cut
+
+*/
+PARROT_CANNOT_RETURN_NULL
+static PMC*
+pmc_reuse_no_init(PARROT_INTERP, ARGIN(PMC *pmc), INTVAL new_type,
+    SHIM(UINTVAL flags)) {
+
+    ASSERT_ARGS(pmc_reuse_no_init)
     VTABLE *new_vtable;
     INTVAL  has_ext, new_flags = 0;
 
@@ -171,10 +241,6 @@
     /* Set the right vtable */
     pmc->vtable = new_vtable;
 
-    /* Call the base init for the redone pmc. Warning, this should not
-       be called on Object PMCs. */
-    VTABLE_init(interp, pmc);
-
     return pmc;
 }
 

Modified: branches/ops_pct/src/pmc/array.pmc
==============================================================================
--- branches/ops_pct/src/pmc/array.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/array.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1184,19 +1184,7 @@
     }
 
     VTABLE PMC *get_iter() {
-        STRING * const name = CONST_STRING(interp, "set_key");
-        PMC * const iter = pmc_new_init(INTERP, enum_class_Iterator, SELF);
-        PMC * const key  = pmc_new(INTERP, enum_class_Key);
-        Parrot_PCCINVOKE(interp, iter, name, "P->", key);
-
-        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
-
-        if (!((List *)PMC_data(SELF))->length)
-            VTABLE_set_integer_native(INTERP, key, -1);
-        else
-            VTABLE_set_integer_native(INTERP, key, 0);
-
-        return iter;
+        return pmc_new_init(INTERP, enum_class_ArrayIterator, SELF);
     }
 
 /*

Copied: branches/ops_pct/src/pmc/arrayiterator.pmc (from r40255, trunk/src/pmc/arrayiterator.pmc)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/src/pmc/arrayiterator.pmc	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/src/pmc/arrayiterator.pmc)
@@ -0,0 +1,590 @@
+/*
+Copyright (C) 2001-2009, Parrot Foundation.
+$Id$
+
+=head1 NAME
+
+src/pmc/arrayiterator.pmc - Implementation of Iterator for Arrays.
+
+=head1 DESCRIPTION
+
+Generic iterator for traversing arrays.
+
+=head1 SYNOPSIS
+
+=head2 default usage
+
+    .local pmc iterator, array, entry
+    iterator = iter array
+  iter_loop:
+    unless iterator, iter_end  # while (more values)
+    entry = shift iterator     # get an entry
+    ...
+    goto iter_loop
+  iter_end:
+
+
+=head2 iterate from the end, for arrays
+
+    .local pmc iterator, array, entry
+    iterator = iter array
+    iterator = .ITERATE_FROM_END
+  iter_loop:
+    unless iterator, iter_end  # while (more values)
+    entry = pop iterator     # get an entry
+    ...
+    goto iter_loop
+  iter_end:
+
+=head2 Warning!
+
+NB: for different direction you have to use different ops!
+
+TODO: Discuss idea of having separate get_iter/get_reverse_iter VTABLE methods
+to avoid this caveat.
+
+=head1 Methods
+
+=over 4
+
+=cut
+
+*/
+
+pmclass ArrayIterator extends Iterator no_ro {
+    ATTR PMC    *array;     /* the array which this Iterator iterates */
+    ATTR INTVAL  pos;       /* Current position of iterator for forward iterator */
+                            /* Previous position of iterator for reverse iterator */
+    ATTR INTVAL  length;    /* Length of C<array> */
+    ATTR INTVAL  reverse;   /* Direction of iteration. 1 - for reverse iteration */
+
+/*
+
+=item C<void init()>
+
+Raises an exception. Use C<init_pmc()>.
+
+=cut
+
+*/
+
+    VTABLE void init() {
+        Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
+                "ArrayIterator init without aggregate");
+    }
+
+/*
+
+=item C<void init_pmc(PMC *initializer)>
+
+Initializes the iterator with an aggregate PMC.
+Defaults iteration mode to iterate from start.
+
+=cut
+
+*/
+
+    VTABLE void init_pmc(PMC *array) {
+        Parrot_ArrayIterator_attributes * const attrs =
+            mem_allocate_zeroed_typed(Parrot_ArrayIterator_attributes);
+
+        attrs->array     = array;
+        PMC_data(SELF)   = attrs;
+
+        PObj_custom_mark_destroy_SETALL(SELF);
+
+        /* by default, iterate from start */
+        SELF.set_integer_native(ITERATE_FROM_START);
+    }
+
+/*
+
+=item C<void destroy()>
+
+destroys this PMC
+
+=cut
+
+*/
+
+    VTABLE void destroy() {
+        mem_sys_free(PMC_data(SELF));
+    }
+
+/*
+
+=item C<void mark()>
+
+Marks the current idx/key and the aggregate as live.
+
+=cut
+
+*/
+
+    VTABLE void mark() {
+        PMC *array;
+        GET_ATTR_array(INTERP, SELF, array);
+        if (array)
+             Parrot_gc_mark_PObj_alive(INTERP, (PObj *)array);
+    }
+
+/*
+
+=item C<PMC *clone()>
+
+=cut
+
+*/
+    VTABLE PMC* clone() {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+        PMC                             * const clone =
+                pmc_new_init(INTERP, enum_class_ArrayIterator, attrs->array);
+        Parrot_ArrayIterator_attributes * const clone_attrs =
+                PARROT_ARRAYITERATOR(clone);
+
+        clone_attrs->pos     = attrs->pos;
+        clone_attrs->reverse = attrs->reverse;
+        return clone;
+    }
+
+/*
+
+=item C<INTVAL get_bool()>
+
+Returns true if there is more elements to iterate over.
+
+=cut
+
+*/
+
+    VTABLE INTVAL get_bool() {
+        return SELF.elements() > 0;
+    }
+
+/*
+
+=item C<INTVAL elements()>
+
+Returns the number of remaining elements in the array.
+
+=cut
+
+*/
+
+    VTABLE INTVAL elements() {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+        if (attrs->reverse)
+            return attrs->pos;
+        else
+            return attrs->length - attrs->pos;
+    }
+
+    VTABLE INTVAL get_integer() {
+        return SELF.elements();
+    }
+
+/*
+
+=item C<void set_integer_native(INTVAL value)>
+
+Reset the Iterator. C<value> must be one of
+
+ ITERATE_FROM_START        ... Iterate from start
+ ITERATE_FROM_END          ... Iterate from end
+
+=cut
+
+*/
+
+    VTABLE void set_integer_native(INTVAL value) {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+        if (value == ITERATE_FROM_START) {
+            attrs->reverse   = 0;
+            attrs->pos       = 0;
+            attrs->length    = VTABLE_elements(INTERP, attrs->array);
+        }
+        else if (value == ITERATE_FROM_END) {
+            attrs->reverse   = 1;
+            attrs->pos       = attrs->length
+                             = VTABLE_elements(INTERP, attrs->array);
+        }
+        else
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
+                    "Wrong direction for ArrayIterator");
+    }
+
+/*
+
+=item C<PMC *get_pmc()>
+
+Returns this Iterator's array.
+
+=cut
+
+*/
+
+    VTABLE PMC *get_pmc() {
+        PMC *array;
+        GET_ATTR_array(INTERP, SELF, array);
+        return array ? array : PMCNULL;
+    }
+
+/*
+
+=item C<INTVAL shift_integer()>
+
+Returns the element for the current idx and sets the idx to
+the next one.
+
+=cut
+
+*/
+
+    VTABLE INTVAL shift_integer() {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+
+        if (attrs->pos >= attrs->length)
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_integer_keyed_int(INTERP, attrs->array, attrs->pos++);
+    }
+
+/*
+
+=item C<FLOATVAL shift_float()>
+
+=cut
+
+*/
+
+    VTABLE FLOATVAL shift_float() {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+
+        if (!STATICSELF.get_bool())
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_number_keyed_int(INTERP, attrs->array, attrs->pos++);
+    }
+
+
+/*
+
+=item C<STRING *shift_string()>
+
+=cut
+
+*/
+
+    VTABLE STRING *shift_string() {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+
+        if (!STATICSELF.get_bool())
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_string_keyed_int(INTERP, attrs->array, attrs->pos++);
+    }
+
+/*
+
+=item C<PMC *shift_pmc()>
+
+Returns the element for the current idx/key and sets the idx/key to
+the next one.
+
+=cut
+
+*/
+
+    VTABLE PMC *shift_pmc() {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+
+        if (!STATICSELF.get_bool())
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_pmc_keyed_int(INTERP, attrs->array, attrs->pos++);
+    }
+
+
+/*
+
+=item C<INTVAL pop_integer()>
+
+Returns the element for the current idx and sets the idx to
+the next one.
+
+=cut
+
+*/
+
+    VTABLE INTVAL pop_integer() {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+
+        if (!STATICSELF.get_bool())
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_integer_keyed_int(INTERP, attrs->array, --attrs->pos);
+    }
+
+/*
+
+=item C<FLOATVAL pop_float()>
+
+=cut
+
+*/
+
+    VTABLE FLOATVAL pop_float() {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+
+        if (!STATICSELF.get_bool())
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_number_keyed_int(INTERP, attrs->array, --attrs->pos);
+    }
+
+
+/*
+
+=item C<STRING *pop_string()>
+
+=cut
+
+*/
+
+    VTABLE STRING *pop_string() {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+
+        if (!STATICSELF.get_bool())
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_string_keyed_int(INTERP, attrs->array, --attrs->pos);
+    }
+
+/*
+
+=item C<PMC *pop_pmc()>
+
+Returns the element for the current idx/key and sets the idx/key to
+the next one.
+
+=cut
+
+*/
+
+    VTABLE PMC *pop_pmc() {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+
+        if (!STATICSELF.get_bool())
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_pmc_keyed_int(INTERP, attrs->array, --attrs->pos);
+    }
+
+/*
+=item C<PMC *get_pmc_keyed(PMC *key)>
+
+Returns the element for C<*key>.
+
+=cut
+
+*/
+
+    VTABLE PMC *get_pmc_keyed(PMC *key) {
+        return STATICSELF.get_pmc_keyed_int(VTABLE_get_integer(INTERP, key));
+    }
+
+/*
+
+=item C<PMC *get_pmc_keyed_int(INTVAL key)>
+
+Returns the element for C<key>.
+
+=cut
+
+*/
+
+    VTABLE PMC *get_pmc_keyed_int(INTVAL idx) {
+        return VTABLE_get_pmc_keyed_int(INTERP, STATICSELF.get_pmc(),
+                PARROT_ARRAYITERATOR(SELF)->pos + idx);
+    }
+/*
+
+=item C<INTVAL get_integer_keyed(PMC *key)>
+
+=cut
+
+*/
+
+    VTABLE INTVAL get_integer_keyed(PMC *key) {
+        return STATICSELF.get_integer_keyed_int(VTABLE_get_integer(INTERP, key));
+    }
+
+/*
+
+=item C<INTVAL get_integer_keyed_int(INTVAL idx)>
+
+Get integer value of current position plus idx.
+
+=cut
+
+*/
+
+    VTABLE INTVAL get_integer_keyed_int(INTVAL idx) {
+        return VTABLE_get_integer_keyed_int(INTERP, STATICSELF.get_pmc(),
+                PARROT_ARRAYITERATOR(SELF)->pos + idx);
+    }
+
+/*
+
+=item C<FLOATVAL get_number_keyed(PMC *key)>
+
+=cut
+
+*/
+
+    VTABLE FLOATVAL get_number_keyed(PMC *key) {
+        return STATICSELF.get_number_keyed_int(VTABLE_get_integer(INTERP, key));
+    }
+
+/*
+
+=item C<FLOATVAL get_number_keyed_int(INTVAL idx)>
+
+Get number value of current position plus idx.
+
+=cut
+
+*/
+
+    VTABLE FLOATVAL get_number_keyed_int(INTVAL idx) {
+        return VTABLE_get_number_keyed_int(INTERP, STATICSELF.get_pmc(),
+                PARROT_ARRAYITERATOR(SELF)->pos + idx);
+    }
+
+
+
+/*
+
+=item C<STRING *get_string_keyed(PMC *key)>
+
+=cut
+
+*/
+
+    VTABLE STRING *get_string_keyed(PMC *key) {
+        return STATICSELF.get_string_keyed_int(VTABLE_get_integer(INTERP, key));
+    }
+
+/*
+
+=item C<STRING *get_string_keyed_int(INTVAL idx)>
+
+Get string value of current position plus idx.
+
+=cut
+
+*/
+
+    VTABLE STRING *get_string_keyed_int(INTVAL idx) {
+        return VTABLE_get_string_keyed_int(INTERP, STATICSELF.get_pmc(),
+                PARROT_ARRAYITERATOR(SELF)->pos + idx);
+    }
+
+/*
+
+=item C<INTVAL exists_keyed(PMC *key)>
+
+Returns whether an element for C<*key> exists in the array.
+
+=cut
+
+*/
+
+    VTABLE INTVAL exists_keyed(PMC *key) {
+        return STATICSELF.exists_keyed_int(VTABLE_get_integer(INTERP, key));
+    }
+
+/*
+
+=item C<INTVAL exists_keyed_int(INTVAL idx)>
+
+Returns whether an element for C<idx> exists in the aggregate.
+
+=cut
+
+*/
+
+    VTABLE INTVAL exists_keyed_int(INTVAL idx) {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+        /* Cheat! */
+        const INTVAL final_pos = attrs->pos + idx - attrs->reverse;
+
+        return VTABLE_exists_keyed_int(INTERP, attrs->array, final_pos);
+    }
+
+/*
+
+=item C<INTVAL defined_keyed(PMC *key)>
+
+=cut
+
+*/
+
+    VTABLE INTVAL defined_keyed(PMC *key) {
+        return STATICSELF.defined_keyed_int(VTABLE_get_integer(INTERP, key));
+    }
+
+/*
+
+=item C<INTVAL defined_keyed_int(INTVAL key)>
+
+Returns the result of calling C<defined_keyed(key)> on the aggregate.
+
+=cut
+
+*/
+
+    VTABLE INTVAL defined_keyed_int(INTVAL idx) {
+        Parrot_ArrayIterator_attributes * const attrs =
+                PARROT_ARRAYITERATOR(SELF);
+        /* Cheat! */
+        const INTVAL final_pos = attrs->pos + idx - attrs->reverse;
+
+        return VTABLE_defined_keyed_int(INTERP, attrs->array, final_pos);
+    }
+}
+
+/*
+
+=back
+
+=cut
+
+*/
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Modified: branches/ops_pct/src/pmc/class.pmc
==============================================================================
--- branches/ops_pct/src/pmc/class.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/class.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -46,8 +46,8 @@
 
 =item C<all_parents>
 
-A cached array of ourself and all parent classes, in MRO order.
-A ResizablePMCArray PMC is allocated during initialization,
+A cached array of ourself and all parent classes, in method resolution
+order (MRO). A ResizablePMCArray PMC is allocated during initialization,
 and is populated with the current class.
 
 =item C<roles>
@@ -137,7 +137,7 @@
                 STRING * const attrib_name = VTABLE_get_string_keyed_str(
                     interp, cur_attrib, name_str);
 
-                STRING *full_key           = Parrot_str_append(interp, fq_class, attrib_name);
+                STRING * const full_key    = Parrot_str_append(interp, fq_class, attrib_name);
 
                 /* Insert into hash, along with index. */
                 VTABLE_set_integer_keyed_str(interp, attrib_index, full_key, cur_index);
@@ -164,7 +164,6 @@
     STRING       * const attrs_str   = CONST_STRING(interp, "attributes");
     PMC          *old_ns;
     STRING       *resolve_method_str;
-    INTVAL        type_num;
 
     /* Ensure we actually have some initialization info. */
     if (PMC_IS_NULL(info))
@@ -179,6 +178,7 @@
         PMC    *new_namespace;
         PMC    *name_arg = VTABLE_get_pmc_keyed_str(interp, info, name_str);
         VTABLE *new_vtable;
+        INTVAL type_num;
 
         /* If we were passed a namespace PMC, set the namespace attribute
          * directly. Otherwise, lookup or create the appropriate namespace. */
@@ -335,7 +335,7 @@
 
         if (!PMC_IS_NULL(meth)) {
             /* build an empty signature; it has an invocant but no args/retvals */
-            PMC *sig_obj = pmc_new(interp, enum_class_CallSignature);
+            PMC * const sig_obj = pmc_new(interp, enum_class_CallSignature);
             VTABLE_set_string_native(interp, sig_obj, CONST_STRING(interp, "Pi->"));
             /* add the invocant */
             VTABLE_unshift_pmc(interp, sig_obj, object);
@@ -348,7 +348,7 @@
 static void
 initialize_parents_pmc(PARROT_INTERP, PMC *object, PMC *all_parents, PMC *init)
 {
-    INTVAL  parent_index = VTABLE_elements(interp, all_parents) - 1;
+    INTVAL parent_index = VTABLE_elements(interp, all_parents) - 1;
     STRING * const name  = CONST_STRING(interp, "init_pmc");
 
     /* Loop through the parents in reverse MRO order. */
@@ -403,8 +403,11 @@
     return _class->name;
 }
 
-/* calculates the C3 method resolution order for this class --
- * working hard *not* to recalculate MRO when unnecessary */
+/* calculates the C3 method resolution order for this class. C3 is the
+ * name of an algorithm used to calculate the method resolution order
+ * (MRO) to use in a system with multiple inheritance. For more information
+ * see the documentation associated with C<Parrot_ComputeMRO_C3>.
+ */
 static PMC *
 calculate_mro(PARROT_INTERP, PMC *SELF, INTVAL num_parents)
 {
@@ -415,13 +418,13 @@
         return _class->all_parents;
 
     if (num_parents == 1) {
-            STRING *ap         = CONST_STRING(interp, "all_parents");
-            PMC    *parent     = VTABLE_get_pmc_keyed_int(interp,
-                                    _class->parents, 0);
-            PMC    *parent_mro = VTABLE_inspect_str(interp, parent, ap);
-            PMC    *mro        = VTABLE_clone(interp, parent_mro);
-            VTABLE_unshift_pmc(interp, mro, SELF);
-            return mro;
+        STRING * const ap         = CONST_STRING(interp, "all_parents");
+        PMC    * const parent     = VTABLE_get_pmc_keyed_int(interp,
+                _class->parents, 0);
+        PMC    * const parent_mro = VTABLE_inspect_str(interp, parent, ap);
+        PMC    * const mro        = VTABLE_clone(interp, parent_mro);
+        VTABLE_unshift_pmc(interp, mro, SELF);
+        return mro;
     }
 
     return Parrot_ComputeMRO_C3(interp, SELF);
@@ -496,7 +499,7 @@
         _class->resolve_method  = pmc_new(interp, enum_class_ResizablePMCArray);
 
         _class->vtable_overrides = pmc_new(interp, enum_class_Hash);
-        _class->parent_overrides = constant_pmc_new(interp, enum_class_Hash);
+        _class->parent_overrides = pmc_new(interp, enum_class_Hash);
 
         /* We put ourself on the all parents list. */
         VTABLE_push_pmc(interp, _class->all_parents, SELF);
@@ -725,7 +728,7 @@
 
 /*
 
-=item C<void remove_method(STRING *name, PMC *sub)>
+=item C<void remove_method(STRING *name)>
 
 Removes the method with the given name.
 
@@ -927,7 +930,7 @@
 
 */
     VTABLE void add_role(PMC *role) {
-        Parrot_Class_attributes * const _class = PARROT_CLASS(SELF);
+        const Parrot_Class_attributes * const _class = PARROT_CLASS(SELF);
 
         /* Do the composition. */
         Parrot_ComposeRole(interp, role,
@@ -1033,8 +1036,8 @@
             PMC * const hash  = pmc_new(interp, enum_class_Hash);
             PMC * const iter  = VTABLE_get_iter(interp, found);
             while (VTABLE_get_bool(interp, iter)) {
-                STRING *key   = VTABLE_shift_string(interp, iter);
-                PMC    *value = VTABLE_get_pmc_keyed_str(interp, found, key);
+                STRING * const key   = VTABLE_shift_string(interp, iter);
+                PMC    * const value = VTABLE_get_pmc_keyed_str(interp, found, key);
                 VTABLE_set_pmc_keyed_str(interp, hash, key, value);
             }
 
@@ -1293,21 +1296,16 @@
         if (VTABLE_is_same(interp, SELF, classobj))
             return 1;
         else {
-            STRING *classname = VTABLE_get_string(interp, classobj);
-            INTVAL  is_proxy  = SELF->vtable->base_type == enum_class_PMCProxy
-                               ? 1 : 0;
+            STRING * const classname = VTABLE_get_string(interp, classobj);
+            const INTVAL is_proxy    = (SELF->vtable->base_type == enum_class_PMCProxy);
 
             /* avoid the expensive string copy, if possible */
-            STRING *self_name = is_proxy
+            STRING * const self_name = is_proxy
                                ? VTABLE_get_string(interp, SELF)
                                : make_class_name(interp, SELF);
 
             /* Check if the passed name is the same as the stored short name. */
-            INTVAL name_match = Parrot_str_equal(interp, classname, self_name);
-
-            Parrot_str_free(interp, classname);
-            if (is_proxy)
-                Parrot_str_free(interp, self_name);
+            const INTVAL name_match = Parrot_str_equal(interp, classname, self_name);
 
             if (name_match)
                 return 1;
@@ -1417,12 +1415,8 @@
         role_count = VTABLE_elements(interp, role_list);
 
         for (i = 0; i < role_count; i++) {
-            INTVAL  role_does;
             PMC    * const test_role = VTABLE_get_pmc_keyed_int(interp, role_list, i);
-
-            role_does = VTABLE_does_pmc(interp, test_role, role);
-
-            if (role_does)
+            if (VTABLE_does_pmc(interp, test_role, role))
                 return 1;
         }
 
@@ -1516,7 +1510,7 @@
     VTABLE void freeze(visit_info *info) {
         IMAGE_IO     * const io         = info->image_io;
         Parrot_Class_attributes * const class_data = PARROT_CLASS(SELF);
-        STRING       *serial_namespace  = CONST_STRING(interp, "");
+        STRING       *serial_namespace = CONST_STRING(interp, "");
 
         /* 1) freeze class id */
         VTABLE_push_integer(INTERP, io, class_data->id);
@@ -1981,7 +1975,7 @@
 
 */
     METHOD does(STRING *role_name) {
-        INTVAL does = VTABLE_does(interp, SELF, role_name);
+        const INTVAL does = VTABLE_does(interp, SELF, role_name);
         RETURN(INTVAL does);
     }
 

Modified: branches/ops_pct/src/pmc/default.pmc
==============================================================================
--- branches/ops_pct/src/pmc/default.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/default.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -829,22 +829,6 @@
 
 /*
 
-=item C<PMC *nextkey_keyed_int(INTVAL key, INTVAL w)>
-
-Converts C<key> to a PMC key and returns the result of calling
-C<nextkey_keyed()> with it.
-
-=cut
-
-*/
-
-    VTABLE PMC *nextkey_keyed_int(INTVAL key, INTVAL w) {
-        PMC *const r_key = INT2KEY(INTERP, key);
-        return SELF.nextkey_keyed(r_key, w);
-    }
-
-/*
-
 =item C<INTVAL can(STRING *method)>
 
 Reports whether the PMC "can" perform C<method>.

Modified: branches/ops_pct/src/pmc/env.pmc
==============================================================================
--- branches/ops_pct/src/pmc/env.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/env.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -10,6 +10,9 @@
 
 C<Env> is a singleton class which provides access to the system environment.
 
+XXX Think about returning Pair back. Currently there is no way to iterate over
+environment I<keys>.
+
 =head2 Methods
 
 =over 4
@@ -71,19 +74,7 @@
 */
 
     VTABLE PMC *get_iter() {
-        STRING *name         = CONST_STRING(interp, "set_key");
-        PMC    *iter         = pmc_new_init(interp, enum_class_Iterator, SELF);
-        PMC    *key          = pmc_new(interp, enum_class_Key);
-
-        Parrot_PCCINVOKE(interp, iter, name, "P->", key);
-        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
-
-        if (!environ[0])
-            VTABLE_set_integer_native(INTERP, key, -1);
-        else
-            VTABLE_set_integer_native(INTERP, key, 0);
-
-        return iter;
+        return pmc_new_init(INTERP, enum_class_ArrayIterator, SELF);
     }
 
 /*
@@ -143,40 +134,53 @@
 
 */
 
-    VTABLE STRING *get_string_keyed(PMC *key) {
-        if ((PObj_get_FLAGS(key) & KEY_type_FLAGS) == KEY_integer_FLAG) {
-            INTVAL const keynum = VTABLE_get_integer(INTERP, key);
-            if (keynum < 0 || keynum >= SELF.elements()) {
-                return string_from_literal(interp, "");
-            }
-            else {
-                const char * const envp = environ[keynum];
-                const char * const p    = strchr(envp, '=');
-                return Parrot_str_new(interp, envp, (UINTVAL)(p - envp));
+    VTABLE STRING *get_string_keyed_str(STRING *key) {
+        char * const keyname = Parrot_str_to_cstring(interp, key);
+
+        if (keyname) {
+            int free_it = 0;
+            char * const val = Parrot_getenv(keyname, &free_it);
+            Parrot_str_free_cstring(keyname);
+
+            if (val) {
+                STRING * const retval = Parrot_str_new(interp, val, 0);
+
+                if (free_it)
+                    mem_sys_free(val);
+
+                return retval;
+
             }
         }
-        else {
-            char * const keyname = Parrot_str_to_cstring(interp,
-                VTABLE_get_string(interp, key));
 
-            if (keyname) {
-                int free_it = 0;
-                char * const val = Parrot_getenv(keyname, &free_it);
-                Parrot_str_free_cstring(keyname);
+        return string_from_literal(interp, "");
+    }
 
-                if (val) {
-                    STRING * const retval = Parrot_str_new(interp, val, 0);
+    VTABLE STRING *get_string_keyed(PMC *key) {
+        return SELF.get_string_keyed_str(VTABLE_get_string(INTERP, key));
+    }
 
-                    if (free_it)
-                        mem_sys_free(val);
+/*
 
-                    return retval;
+=item C<STRING *get_string_keyed_int(PMC *key)>
 
-                }
-            }
+Returns the Parrot string value for the environment variable at position C<pos>.
 
+Used during iteration.
+
+=cut
+
+*/
+
+    VTABLE STRING *get_string_keyed_int(INTVAL pos) {
+        if (pos < 0 || pos >= SELF.elements()) {
             return string_from_literal(interp, "");
         }
+        else {
+            const char * const envp = environ[pos];
+            const char * const p    = strchr(envp, '=');
+            return Parrot_str_new(interp, envp, (UINTVAL)(p - envp));
+        }
     }
 
 /*

Modified: branches/ops_pct/src/pmc/exceptionhandler.pmc
==============================================================================
--- branches/ops_pct/src/pmc/exceptionhandler.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/exceptionhandler.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -76,6 +76,7 @@
             Parrot_gc_mark_PObj_alive(interp, (PObj *)core_struct->handled_types);
         if (core_struct->handled_types_except)
             Parrot_gc_mark_PObj_alive(interp, (PObj *)core_struct->handled_types_except);
+        SUPER();
     }
 
     VTABLE PMC *clone() {

Modified: branches/ops_pct/src/pmc/filehandle.pmc
==============================================================================
--- branches/ops_pct/src/pmc/filehandle.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/filehandle.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,5 +1,5 @@
 /*
-Copyright (C) 2008, Parrot Foundation.
+Copyright (C) 2008-2009, Parrot Foundation.
 $Id$
 
 =head1 NAME
@@ -63,7 +63,7 @@
 */
 
     VTABLE void init() {
-        Parrot_FileHandle_attributes *data_struct =
+        Parrot_FileHandle_attributes * const data_struct =
                 mem_allocate_typed(Parrot_FileHandle_attributes);
 
         PMC_data(SELF)             = data_struct;
@@ -277,7 +277,7 @@
 
 */
     METHOD isatty() {
-        INTVAL isatty = (PARROT_FILEHANDLE(SELF)->flags & PIO_F_CONSOLE) == PIO_F_CONSOLE;
+        const INTVAL isatty = (PARROT_FILEHANDLE(SELF)->flags & PIO_F_CONSOLE) == PIO_F_CONSOLE;
         RETURN(INTVAL isatty);
     }
 
@@ -292,8 +292,7 @@
 */
 
     METHOD close() {
-        INTVAL status;
-        status = Parrot_io_close(INTERP, SELF);
+        const INTVAL status = Parrot_io_close(INTERP, SELF);
         RETURN(INTVAL status);
     }
 
@@ -308,8 +307,7 @@
 */
 
     METHOD is_closed() {
-        INTVAL status;
-        status = Parrot_io_is_closed(interp, SELF);
+        const INTVAL status = Parrot_io_is_closed(interp, SELF);
         RETURN(INTVAL status);
     }
 
@@ -324,8 +322,7 @@
 */
 
     METHOD read(INTVAL length) {
-        STRING *string_result = NULL;
-        string_result = Parrot_io_reads(INTERP, SELF, length);
+        STRING * const string_result = Parrot_io_reads(INTERP, SELF, length);
 
         RETURN(STRING *string_result);
     }
@@ -341,8 +338,7 @@
 */
 
     METHOD readline() {
-        STRING *string_result;
-        string_result = Parrot_io_readline(INTERP, SELF);
+        STRING * const string_result = Parrot_io_readline(INTERP, SELF);
         RETURN(STRING *string_result);
     }
 
@@ -510,8 +506,7 @@
 */
 
     METHOD puts(STRING *to_print) {
-        INTVAL status;
-        status = Parrot_io_putps(INTERP, SELF, to_print);
+        const INTVAL status = Parrot_io_putps(INTERP, SELF, to_print);
         RETURN(INTVAL status);
     }
 
@@ -650,8 +645,7 @@
 */
 
     METHOD eof() {
-        INTVAL flags;
-        flags = Parrot_io_eof(INTERP, SELF);
+        const INTVAL flags = Parrot_io_eof(INTERP, SELF);
         RETURN(INTVAL flags);
     }
 

Modified: branches/ops_pct/src/pmc/fixedbooleanarray.pmc
==============================================================================
--- branches/ops_pct/src/pmc/fixedbooleanarray.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/fixedbooleanarray.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -504,19 +504,7 @@
 */
 
     VTABLE PMC *get_iter() {
-        STRING     *name     = CONST_STRING(interp, "set_key");
-        PMC * const iter     = pmc_new_init(INTERP, enum_class_Iterator, SELF);
-        PMC * const key      = pmc_new(INTERP, enum_class_Key);
-
-        Parrot_PCCINVOKE(interp, iter, name, "P->", key);
-        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
-
-        if (SELF.get_integer() == 0)
-            VTABLE_set_integer_native(INTERP, key, -1);
-        else
-            VTABLE_set_integer_native(INTERP, key, 0);
-
-        return iter;
+        return pmc_new_init(INTERP, enum_class_ArrayIterator, SELF);
     }
 
 

Modified: branches/ops_pct/src/pmc/fixedfloatarray.pmc
==============================================================================
--- branches/ops_pct/src/pmc/fixedfloatarray.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/fixedfloatarray.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -107,19 +107,7 @@
 */
 
     VTABLE PMC *get_iter() {
-        STRING     *name     = CONST_STRING(interp, "set_key");
-        PMC * const iter     = pmc_new_init(INTERP, enum_class_Iterator, SELF);
-        PMC * const key      = pmc_new(INTERP, enum_class_Key);
-
-        Parrot_PCCINVOKE(interp, iter, name, "P->", key);
-        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
-
-        if (SELF.get_integer() == 0)
-            VTABLE_set_integer_native(INTERP, key, -1);
-        else
-            VTABLE_set_integer_native(INTERP, key, 0);
-
-        return iter;
+        return pmc_new_init(INTERP, enum_class_ArrayIterator, SELF);
     }
 
 /*

Modified: branches/ops_pct/src/pmc/fixedintegerarray.pmc
==============================================================================
--- branches/ops_pct/src/pmc/fixedintegerarray.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/fixedintegerarray.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -597,22 +597,7 @@
 */
 
     VTABLE PMC *get_iter() {
-        STRING     *name = CONST_STRING(interp, "set_key");
-        PMC * const iter = pmc_new_init(INTERP, enum_class_Iterator, SELF);
-        PMC * const key  = pmc_new(INTERP, enum_class_Key);
-        INTVAL      size;
-
-        Parrot_PCCINVOKE(interp, iter, name, "P->", key);
-        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
-
-        GET_ATTR_size(INTERP, SELF, size);
-
-        if (size)
-            VTABLE_set_integer_native(INTERP, key, 0);
-        else
-            VTABLE_set_integer_native(INTERP, key, -1);
-
-        return iter;
+        return pmc_new_init(INTERP, enum_class_ArrayIterator, SELF);
     }
 
 /*

Modified: branches/ops_pct/src/pmc/fixedpmcarray.pmc
==============================================================================
--- branches/ops_pct/src/pmc/fixedpmcarray.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/fixedpmcarray.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -646,19 +646,7 @@
     }
 
     VTABLE PMC *get_iter() {
-        STRING     *name     = CONST_STRING(interp, "set_key");
-        PMC * const iter     = pmc_new_init(INTERP, enum_class_Iterator, SELF);
-        PMC * const key      = pmc_new(INTERP, enum_class_Key);
-
-        Parrot_PCCINVOKE(interp, iter, name, "P->", key);
-        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
-
-        if (PMC_size(SELF) == 0)
-            VTABLE_set_integer_native(INTERP, key, -1);
-        else
-            VTABLE_set_integer_native(INTERP, key, 0);
-
-        return iter;
+        return pmc_new_init(INTERP, enum_class_ArrayIterator, SELF);
     }
 
 /*

Modified: branches/ops_pct/src/pmc/fixedstringarray.pmc
==============================================================================
--- branches/ops_pct/src/pmc/fixedstringarray.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/fixedstringarray.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -159,16 +159,7 @@
 
 */
     VTABLE PMC *get_iter() {
-        STRING     *name = CONST_STRING(interp, "set_key");
-        PMC * const iter = pmc_new_init(INTERP, enum_class_Iterator, SELF);
-        PMC * const key  = pmc_new(INTERP, enum_class_Key);
-
-        Parrot_PCCINVOKE(interp, iter, name, "P->", key);
-        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
-        VTABLE_set_integer_native(INTERP, key,
-                VTABLE_get_bool(INTERP, SELF) ? 0 : -1);
-
-        return iter;
+        return pmc_new_init(INTERP, enum_class_ArrayIterator, SELF);
     }
 
 /*

Modified: branches/ops_pct/src/pmc/hash.pmc
==============================================================================
--- branches/ops_pct/src/pmc/hash.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/hash.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -8,6 +8,28 @@
 
 =head1 DESCRIPTION
 
+Hash PMC wraps Parrot's _hash to provide high-level API:
+
+=over 4
+
+=item *
+
+Convert between various types to use as hash keys.
+
+=item *
+
+Convert between various types to use as hash values.
+
+=item *
+
+Handle compound Keys for nested Hash/Array lookups.
+
+=item *
+
+Provide C<HashIterator> to iterate over C<Hash>.
+
+=back
+
 These are the vtable functions for the Hash PMC.
 
 =head2 Functions
@@ -20,6 +42,7 @@
 
 #include "pmc_iterator.h"
 #include "pmc_key.h"
+#include "pmc_hashiteratorkey.h"
 
 /*
 
@@ -31,8 +54,7 @@
 
 */
 
-static PMC *get_integer_pmc(PARROT_INTERP, INTVAL base_type) {
-    UNUSED(base_type)
+static PMC *get_integer_pmc(PARROT_INTERP) {
     return pmc_new(interp, Parrot_get_ctx_HLL_type(interp, enum_class_Integer));
 }
 
@@ -47,8 +69,7 @@
 
 */
 
-static PMC *get_number_pmc(PARROT_INTERP, INTVAL base_type) {
-    UNUSED(base_type)
+static PMC *get_number_pmc(PARROT_INTERP) {
     return pmc_new(interp, Parrot_get_ctx_HLL_type(interp, enum_class_Float));
 }
 
@@ -62,78 +83,296 @@
 
 */
 
-static PMC *get_string_pmc(PARROT_INTERP, INTVAL base_type) {
-    UNUSED(base_type)
+static PMC *get_string_pmc(PARROT_INTERP) {
     return pmc_new(interp, Parrot_get_ctx_HLL_type(interp, enum_class_String));
 }
 
 
 /*
 
-=item C<static STRING *make_ro_hash_key(PARROT_INTERP, PMC *key)>
-
-Returns a Parrot STRING for C<*key>.
+Poor-man polymorphic functions to convert something to something.
 
-You I<must not> modify this STRING, nor pass it to anything which may store it.
-It's only safe to use for looking up elements of a hash or deleting them --
-I<never> storing them.  (If you have to ask why, don't use this function.  It's
-for optimization purposes only.)
+There is bunch of functions to convert from passed value to stored keys type and to/from
+stored values type.
 
-=cut
+void *hash_key_from_TYPE convert to keys type.
+void *hash_value_from_TYPE convert to values type.
+TYPE hash_value_to_TYPE convert from values type.
 
 */
 
-static STRING
-*make_ro_hash_key(PARROT_INTERP, NOTNULL(PMC *key))
+static void*
+hash_key_from_int(PARROT_INTERP, const Hash * const hash, INTVAL key)
 {
-    STRING *s;
-
-    switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
-        case KEY_string_FLAG:
-            GETATTR_Key_str_key(interp, key, s);
+    void *ret;
+    switch (hash->key_type) {
+        case Hash_key_type_int:
+            ret = (void *)key;
             break;
-        case KEY_string_FLAG | KEY_register_FLAG:
+        /* Currently PMCs are stringified */
+        case Hash_key_type_PMC:
+        case Hash_key_type_STRING:
+            ret = (void *)Parrot_str_from_int(interp, key);
+            break;
+        default:
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported key_type");
+    }
+    return ret;
+}
+
+static void*
+hash_key_from_string(PARROT_INTERP, const Hash * const hash, ARGIN(STRING *key))
+{
+    void *ret;
+    switch (hash->key_type) {
+        case Hash_key_type_int:
         {
-            INTVAL  int_key;
-            GETATTR_Key_int_key(interp, key, int_key);
-            s = REG_STR(interp, int_key);
+            /* Pacify compiler about casting INVTAL to void */
+            const INTVAL int_key = Parrot_str_to_int(interp, key);
+            ret                  = INTVAL2PTR(void *, int_key);
             break;
         }
+        /* Currently PMCs are stringified */
+        case Hash_key_type_PMC:
+        case Hash_key_type_STRING:
+            ret = key;
+            break;
         default:
-            s = key_string(interp, key);
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported key_type");
     }
+    return ret;
+}
 
-    if (STRING_IS_NULL(s))
-        Parrot_ex_throw_from_c_args(interp, NULL,
-            EXCEPTION_UNEXPECTED_NULL, "Hash: Cannot use NULL STRING key");
-
-    return s;
+static void*
+hash_key_from_pmc(PARROT_INTERP, const Hash * const hash, ARGIN(PMC *key))
+{
+    void *ret;
+    switch (hash->key_type) {
+        case Hash_key_type_int:
+        {
+            const INTVAL int_key = VTABLE_get_integer(interp, key);
+            ret                  = INTVAL2PTR(void *, int_key);
+            break;
+        }
+        /* Currently PMCs are stringified */
+        case Hash_key_type_PMC:
+        case Hash_key_type_STRING:
+            {
+                STRING * const tmp = VTABLE_get_string(interp, key);
+                if (!tmp)
+                    Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNEXPECTED_NULL,
+                            "hash: can't use null as key");
+                ret = (void *)tmp;
+            }
+            break;
+        default:
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported key_type");
+    }
+    return ret;
 }
 
 
-/*
+/* Second part - convert from stored void* to real type */
+/* TODO: FLOATVALs converted into Float PMC for now */
+static void*
+hash_value_from_int(PARROT_INTERP, const Hash * const hash, INTVAL value)
+{
+    void *ret;
+    switch (hash->entry_type) {
+        case enum_type_INTVAL:
+            ret = INTVAL2PTR(void *, value);
+            break;
+        case enum_type_PMC:
+            {
+                PMC * const tmp = get_integer_pmc(interp);
+                VTABLE_set_integer_native(interp, tmp, value);
+                ret = INTVAL2PTR(void *, tmp);
+            }
+            break;
+        case enum_type_STRING:
+            ret = (void *)Parrot_str_from_int(interp, value);
+            break;
+        default:
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported entry_type");
+    }
+    return ret;
+}
 
-=item C<static STRING *make_hash_key(PARROT_INTERP, PMC *key)>
+static void*
+hash_value_from_string(PARROT_INTERP, const Hash * const hash, STRING *value)
+{
+    void *ret;
+    switch (hash->entry_type) {
+        case enum_type_INTVAL:
+        {
+            const INTVAL int_val = Parrot_str_to_int(interp, value);
+            ret                  = INTVAL2PTR(void *, int_val);
+            break;
+        }
+        case enum_type_STRING:
+            ret = (void *)value;
+            break;
+        case enum_type_PMC:
+            {
+                PMC * const s = get_string_pmc(interp);
+                VTABLE_set_string_native(interp, s, value);
+                ret = (void *)s;
+            }
+            break;
+        default:
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported entry_type");
+    }
+    return ret;
+}
 
-Returns a Parrot STRING for C<*key>.  This STRING is safe to modify or store.
+static void*
+hash_value_from_pmc(PARROT_INTERP, const Hash * const hash, PMC *value)
+{
+    void *ret;
+    switch (hash->entry_type) {
+        case enum_type_INTVAL:
+        {
+            const INTVAL int_val = VTABLE_get_integer(interp, value);
+            ret                  = INTVAL2PTR(void *, int_val);
+            break;
+        }
+        case enum_type_STRING:
+            ret = (void *)VTABLE_get_string(interp, value);
+            break;
+        case enum_type_PMC:
+            ret = (void *)value;
+            break;
+        default:
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported entry_type");
+    }
+    return ret;
+}
 
-=cut
+static void*
+hash_value_from_number(PARROT_INTERP, const Hash * const hash, FLOATVAL value)
+{
+    void *ret;
+    switch (hash->entry_type) {
+        case enum_type_INTVAL:
+            {
+                const INTVAL tmp = value;
+                ret = (void*)tmp;
+            }
+            break;
+        case enum_type_STRING:
+            ret = (void *)Parrot_str_from_num(interp, value);
+            break;
+        case enum_type_PMC:
+            {
+                PMC * const tmp = get_number_pmc(interp);
+                VTABLE_set_number_native(interp, tmp, value);
+                ret = (void *)tmp;
+            }
+            break;
+        default:
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported entry_type");
+    }
+    return ret;
+}
 
-*/
+static INTVAL
+hash_value_to_int(PARROT_INTERP, const Hash * const hash, void *value)
+{
+    INTVAL ret;
+    switch (hash->entry_type) {
+        case enum_type_INTVAL:
+            ret = (INTVAL)value;
+            break;
+        case enum_type_STRING:
+            ret = Parrot_str_to_int(interp, (STRING*)value);
+            break;
+        case enum_type_PMC:
+            ret = VTABLE_get_integer(interp, (PMC*)value);
+            break;
+        default:
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported entry_type");
+    }
+    return ret;
+}
 
-PARROT_CANNOT_RETURN_NULL
-static STRING
-*make_hash_key(PARROT_INTERP, NOTNULL(PMC *key))
+static STRING*
+hash_value_to_string(PARROT_INTERP, const Hash * const hash, void *value)
 {
-    STRING * const keystr = key_string(interp, key);
+    STRING *ret;
+    switch (hash->entry_type) {
+        case enum_type_INTVAL:
+            ret = Parrot_str_from_int(interp, (INTVAL)value);
+            break;
+        case enum_type_STRING:
+            ret = (STRING *)value;
+            break;
+        case enum_type_PMC:
+            ret = VTABLE_get_string(interp, (PMC *)value);
+            break;
+        default:
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported entry_type");
+    }
+    return ret;
+}
 
-    if (STRING_IS_NULL(keystr))
-        Parrot_ex_throw_from_c_args(interp, NULL,
-            EXCEPTION_UNEXPECTED_NULL, "Hash: Cannot use NULL STRING key");
+static PMC*
+hash_value_to_pmc(PARROT_INTERP, const Hash * const hash, void *value)
+{
+    PMC *ret;
+    switch (hash->entry_type) {
+        case enum_type_INTVAL:
+            ret = get_integer_pmc(interp);
+            VTABLE_set_integer_native(interp, ret, (INTVAL)value);
+            break;
+        case enum_type_STRING:
+            ret = get_string_pmc(interp);
+            VTABLE_set_string_native(interp, ret, (STRING *)value);
+            break;
+        case enum_type_PMC:
+            ret = (PMC *)value;
+            break;
+        default:
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported entry_type");
+    }
+    return ret;
+}
 
-    return keystr;
+static FLOATVAL
+hash_value_to_number(PARROT_INTERP, const Hash * const hash, void *value)
+{
+    FLOATVAL ret;
+    switch (hash->entry_type) {
+        case enum_type_INTVAL:
+            {
+                /* Pacify compiler about casting */
+                const INTVAL tmp = (INTVAL)value;
+                ret = tmp;
+            }
+            break;
+        case enum_type_STRING:
+            ret = Parrot_str_to_num(interp, (STRING*)value);
+            break;
+        case enum_type_PMC:
+            ret = VTABLE_get_number(interp, (PMC*)value);
+            break;
+        default:
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                    "Hash: unsupported entry_type");
+    }
+    return ret;
 }
 
+
 /* Needs ext struct for the next_for_GC pointer
  * We would get recursive marking of a deeply nested HoHoH...
  */
@@ -158,13 +397,14 @@
         Parrot_Hash_attributes * const attr =
             mem_allocate_typed(Parrot_Hash_attributes);
 
-        PMC_data(SELF) = attr;
-        attr->hash     = parrot_new_hash(INTERP);
+        PMC_data(SELF)        = attr;
+        attr->hash            = parrot_new_hash(INTERP);
+        attr->hash->container = SELF;
         PObj_custom_mark_destroy_SETALL(SELF);
     }
 
     VTABLE void destroy() {
-        Hash *hash = (Hash *)SELF.get_pointer();
+        Hash * const hash = (Hash *)SELF.get_pointer();
         if (hash)
             parrot_hash_destroy(INTERP, hash);
 
@@ -181,7 +421,7 @@
 */
 
     VTABLE void mark() {
-        Hash *hash = (Hash *)SELF.get_pointer();
+        Hash * const hash = (Hash *)SELF.get_pointer();
         if (hash != NULL)
             parrot_mark_hash(INTERP, hash);
     }
@@ -216,8 +456,8 @@
 */
 
     VTABLE void set_pointer(void *ptr) {
-        Hash *old_hash = (Hash *)SELF.get_pointer();
-        Hash *new_hash = (Hash *)ptr;
+        Hash * const old_hash = (Hash *)SELF.get_pointer();
+        Hash * const new_hash = (Hash *)ptr;
 
         PARROT_HASH(SELF)->hash = new_hash;
         new_hash->container     = SELF;
@@ -227,182 +467,133 @@
     }
 
 /*
+=item C<void set_integer(INTVAL type)>
 
-=item C<void *get_pointer()>
+Reset Hash to use differen keys. See enum C<Hash_key_type> for possible values.
 
-Get a pointer to this PMC's Hash*.
+NB: this method will destroy all old data!
 
 =cut
-
 */
-    VTABLE void *get_pointer() {
-        return PARROT_HASH(SELF)->hash;
-    }
-
-/*
-
-=item C<INTVAL get_integer()>
+    VTABLE void set_integer_native(INTVAL type) {
+        Hash * const old_hash = (Hash *)SELF.get_pointer();
+        Hash *new_hash;
 
-Returns the size of the hash.
+        if (type == Hash_key_type_STRING)
+            new_hash = parrot_new_hash(INTERP);
+        else if (type == Hash_key_type_int)
+            /* new_int_hash set BOTH keys and values to INTVAL */
+            new_hash = parrot_create_hash(interp,
+                    old_hash ? old_hash->entry_type : enum_type_PMC,
+                    Hash_key_type_int,
+                    int_compare,
+                    key_hash_int);
+        else
+            /*
+                We probably will not implement other types of keys. They are way
+                too dangerous to use from PIR
+            */
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_UNIMPLEMENTED,
+                "Hash: Unknown key type");
 
-=cut
 
-*/
+        PARROT_HASH(SELF)->hash = new_hash;
+        new_hash->container     = SELF;
 
-    VTABLE INTVAL get_integer() {
-        return parrot_hash_size(INTERP, (Hash *)SELF.get_pointer());
+        if (old_hash)
+            parrot_hash_destroy(INTERP, old_hash);
     }
 
-/*
-
-=item C<INTVAL get_integer_keyed_str(STRING *key)>
-
-=item C<INTVAL get_integer_keyed_int(INTVAL key)>
-
-=cut
-
-*/
-
-    VTABLE INTVAL get_integer_keyed_str(STRING *key) {
-        HashBucket * const b =
-            parrot_hash_get_bucket(INTERP, (Hash *)SELF.get_pointer(), key);
-
-        if (!b)
-            return 0;
-
-        return VTABLE_get_integer(INTERP, (PMC*) b->value);
+    METHOD set_key_type(INTVAL type) {
+        SELF.set_integer_native(type);
     }
 
-    VTABLE INTVAL get_integer_keyed_int(INTVAL key) {
-        const Hash * const hash = (Hash *)SELF.get_pointer();
-        HashBucket *b;
-
-        if (hash->key_type == Hash_key_type_STRING)
-            return SELF.get_integer_keyed_str(Parrot_str_from_int(INTERP, key));
-
-        b = parrot_hash_get_bucket(INTERP, hash, (void *)key);
-
-        if (!b)
-            return 0;
-
-        return (INTVAL)b->value;
+    METHOD get_key_type() {
+        const INTVAL ret = ((Hash *)SELF.get_pointer())->key_type;
+        RETURN(INTVAL ret);
     }
+
 /*
 
-=item C<INTVAL get_integer_keyed(PMC *key)>
+=item C<METHOD set_value_type(INTVAL type)>
 
-Returns the integer value for the element at C<*key>.
+Reset Hash to use different value-type for stored items. If there is no
+previous _hash was set defaults to STRING* keys.
 
-=cut
+NB: this method will destroy all old data!
 
+=cut
 */
+    METHOD set_value_type(INTVAL type) {
+        Hash *old_hash = (Hash *)SELF.get_pointer();
+        Hash *new_hash;
 
-    VTABLE INTVAL get_integer_keyed(PMC *key) {
-        PMC        *valpmc;
-        STRING     *keystr;
-        HashBucket *b;
-        PMC        *nextkey;
-        const Hash * const hash = (Hash *)SELF.get_pointer();
-
-        /* called from iterator with an integer idx in key */
-        if ((PObj_get_FLAGS(key) & KEY_type_FLAGS) == KEY_hash_iterator_FLAGS) {
-
-            /* check if we really have Hash_key_type_int */
-            if (hash->key_type == Hash_key_type_int) {
-                void *idx = parrot_hash_get_idx(INTERP, hash, key);
-                return (INTVAL)idx;
-            }
-            else {
-                const STRING * const s =
-                    (STRING *)parrot_hash_get_idx(INTERP, hash, key);
-                return Parrot_str_to_int(INTERP, s);
-            }
+        /*
+        If someone called Hash.set_pointer with NULL pointer...
+        It will create STRING* keys hash. Because we can't use STRING_compare
+        directly - it declared static in F<src/hash.c>
+        */
+        if (!old_hash)
+            old_hash = parrot_new_hash(INTERP);
+
+        switch (type) {
+            case enum_type_INTVAL:
+            case enum_type_STRING:
+            case enum_type_PMC:
+                new_hash = parrot_create_hash(interp,
+                        (PARROT_DATA_TYPE)type,
+                        old_hash->key_type,
+                        old_hash->compare,
+                        old_hash->hash_val);
+                break;
+            default:
+                Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED,
+                        "Hash: unsupported entry_type");
         }
 
-        keystr  = make_ro_hash_key(INTERP, key);
-        b       = parrot_hash_get_bucket(INTERP, hash, keystr);
-
-        if (!b)
-            return 0;
-
-        nextkey = key_next(INTERP, key);
-        valpmc  = (PMC *)b->value;
-
-        if (!nextkey)
-            return VTABLE_get_integer(INTERP, valpmc);
+        PARROT_HASH(SELF)->hash = new_hash;
+        new_hash->container     = SELF;
 
-        return VTABLE_get_integer_keyed(INTERP, valpmc, nextkey);
+        parrot_hash_destroy(INTERP, old_hash);
     }
 
-/*
-
-=item C<FLOATVAL get_number()>
-
-Returns the size of the hash.
-
-=cut
-
-*/
-
-    VTABLE FLOATVAL get_number() {
-        /* doing this in two steps avoids dodgy cast warnings with -O */
-        const INTVAL size = parrot_hash_size(INTERP, (Hash *)SELF.get_pointer());
-        return (FLOATVAL)size;
+    METHOD get_value_type() {
+        INTVAL ret = ((Hash *)SELF.get_pointer())->entry_type;
+        RETURN(INTVAL ret);
     }
 
 /*
 
-=item C<FLOATVAL get_number_keyed_str(STRING *key)>
+=item C<void *get_pointer()>
 
-=item C<FLOATVAL get_number_keyed_int(INTVAL key)>
+Get a pointer to this PMC's Hash*.
 
 =cut
 
 */
-
-    VTABLE FLOATVAL get_number_keyed_str(STRING *key) {
-        HashBucket * const b =
-            parrot_hash_get_bucket(INTERP, (Hash *)SELF.get_pointer(), key);
-
-        if (!b)
-            return 0.0;
-
-        return VTABLE_get_number(INTERP, (PMC *)b->value);
+    VTABLE void *get_pointer() {
+        return PARROT_HASH(SELF)->hash;
     }
 
-    VTABLE FLOATVAL get_number_keyed_int(INTVAL key) {
-        STRING * const s = Parrot_str_from_int(INTERP, key);
-        return SELF.get_number_keyed_str(s);
-    }
 /*
 
-=item C<FLOATVAL get_number_keyed(PMC *key)>
+=item C<INTVAL get_integer()>
 
-Returns the floating-point value for the element at C<*key>.
+=item C<FLOATVAL get_number()>
+
+Returns the size of the hash.
 
 =cut
 
 */
 
-    VTABLE FLOATVAL get_number_keyed(PMC *key) {
-        PMC               *nextkey;
-        PMC               *valpmc;
-        STRING     * const keystr = make_ro_hash_key(INTERP, key);
-        HashBucket * const b      = parrot_hash_get_bucket(INTERP,
-                                           (Hash *)SELF.get_pointer(), keystr);
-
-        if (!b)
-            return 0.0;
-
-        nextkey = key_next(INTERP, key);
-        valpmc  = (PMC *)b->value;
-
-        if (!nextkey)
-            return VTABLE_get_number(INTERP, valpmc);
-
-        return VTABLE_get_number_keyed(INTERP, valpmc, nextkey);
+    VTABLE INTVAL get_integer() {
+        return parrot_hash_size(INTERP, (Hash *)SELF.get_pointer());
     }
 
+    VTABLE FLOATVAL get_number() {
+        return SELF.get_integer();
+    }
 
 /*
 
@@ -437,7 +628,7 @@
             PMC           *val;
 
             for (i = 0; i < (int)key->strlen; ++i) {
-                if (!isdigit((unsigned char)((char *)key->strstart)[i])) {
+                if (!isdigit((unsigned char)((const char *)key->strstart)[i])) {
                     all_digit = 0;
                     break;
                 }
@@ -467,374 +658,409 @@
 
 /*
 
-=item C<STRING *get_string_keyed_str(STRING *key)>
+=item C<INTVAL get_integer_keyed_str(STRING *key)>
 
-=item C<STRING *get_string_keyed_int(INTVAL key)>
+=item C<INTVAL get_integer_keyed_int(INTVAL key)>
 
 =cut
 
 */
 
-    VTABLE STRING *get_string_keyed_str(STRING *key) {
-        HashBucket * const b =
-            parrot_hash_get_bucket(INTERP, (Hash *)SELF.get_pointer(), key);
+    VTABLE INTVAL get_integer_keyed_str(STRING *key) {
+        const Hash * const hash = (Hash*)SELF.get_pointer();
+        HashBucket * const b = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_string(INTERP, hash, key));
 
         if (!b)
-            return Parrot_str_new_noinit(INTERP, enum_stringrep_one, 0);
+            return 0;
 
-        return VTABLE_get_string(INTERP, (PMC*) b->value);
+        return hash_value_to_int(INTERP, hash, b->value);
     }
 
-    VTABLE STRING *get_string_keyed_int(INTVAL key) {
-        STRING * const s = Parrot_str_from_int(INTERP, key);
-        return SELF.get_string_keyed_str(s);
-    }
+    VTABLE INTVAL get_integer_keyed_int(INTVAL key) {
+        const Hash * const hash = (Hash*)SELF.get_pointer();
+        HashBucket * const b = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_int(INTERP, hash, key));
 
+        if (!b)
+            return 0;
+
+        return hash_value_to_int(INTERP, hash, b->value);
+    }
 /*
 
-=item C<STRING *get_string_keyed(PMC *key)>
+=item C<INTVAL get_integer_keyed(PMC *key)>
 
-Returns the string value for the element at C<*key>.
+Returns the integer value for the element at C<*key>.
 
 =cut
 
 */
 
-    VTABLE STRING *get_string_keyed(PMC *key) {
-        PMC         *valpmc;
-        STRING      *keystr;
-        HashBucket  *b;
-        PMC         *nextkey;
-        Hash * const hash = (Hash *)SELF.get_pointer();
-
-        if ((PObj_get_FLAGS(key) & KEY_type_FLAGS) == KEY_hash_iterator_FLAGS) {
-            /* called from iterator with an integer idx in key */
-            if (hash->key_type == Hash_key_type_int) {
-                void  *idx = parrot_hash_get_idx(INTERP, hash, key);
-                return Parrot_str_from_int(INTERP, (INTVAL)idx);
-            }
+    /* Handling Keys */
+    VTABLE INTVAL get_integer_keyed(PMC *key) {
+        const Hash * const hash = (Hash *)SELF.get_pointer();
+        HashBucket * const b = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_pmc(INTERP, hash, key));
+        PMC        *valpmc;
+        PMC        *nextkey;
 
-            return (STRING *)parrot_hash_get_idx(INTERP, hash, key);
-        }
+        if (!b)
+            return 0;
 
-        keystr = make_ro_hash_key(INTERP, key);
-        b      = parrot_hash_get_bucket(INTERP, hash, keystr);
-
-        if (!b)
-            return Parrot_str_new_noinit(INTERP, enum_stringrep_one, 0);
-
-        nextkey = key_next(INTERP, key);
-        valpmc  = (PMC *)b->value;
+        nextkey = key_next(INTERP, key);
+        valpmc  = hash_value_to_pmc(INTERP, hash, b->value);
 
+        /* Stop recursion. This is last step */
         if (!nextkey)
-            return VTABLE_get_string(INTERP, valpmc);
+            return VTABLE_get_integer(INTERP, valpmc);
 
-        return VTABLE_get_string_keyed(INTERP, valpmc, nextkey);
+        /* Recusively call to enclosed aggregate */
+        return VTABLE_get_integer_keyed(INTERP, valpmc, nextkey);
     }
 
 /*
 
-=item C<INTVAL get_bool()>
-
-Returns true if the hash size is not zero.
+=item C<void set_integer_keyed(PMC *key, INTVAL value)>
 
 =cut
 
 */
 
-    VTABLE INTVAL get_bool() {
-        return parrot_hash_size(INTERP, (Hash *)SELF.get_pointer()) != 0;
+    VTABLE void set_integer_keyed(PMC *key, INTVAL value) {
+        Hash   * const hash    = (Hash *)SELF.get_pointer();
+        void   * const keystr  = hash_key_from_pmc(INTERP, hash, key);
+        PMC    * const nextkey = key_next(INTERP, key);
+        PMC    *box;
+        HashBucket *b;
+
+        if (!nextkey) {
+            parrot_hash_put(INTERP, hash, keystr,
+                    hash_value_from_int(INTERP, hash, value));
+            return;
+        }
+
+        b = parrot_hash_get_bucket(INTERP, hash, keystr);
+        if (b)
+            box = hash_value_to_pmc(INTERP, hash, b->value);
+        else {
+            /* autovivify an Hash */
+            box = pmc_new(INTERP, SELF.type());
+            parrot_hash_put(INTERP, hash, keystr,
+                    hash_value_from_pmc(INTERP, hash, box));
+        }
+
+        VTABLE_set_integer_keyed(INTERP, box, nextkey, value);
     }
 
-/*
+    VTABLE void set_integer_keyed_int(INTVAL key, INTVAL value) {
+        Hash * const hash = (Hash *)SELF.get_pointer();
+        parrot_hash_put(INTERP, hash, hash_key_from_int(INTERP, hash, key),
+                hash_value_from_int(INTERP, hash, value));
+    }
 
-=item C<INTVAL elements()>
+/*
 
-Returns the number of elements in the hash.
+=item C<void set_integer_keyed_str(STRING *key, INTVAL value)>
 
 =cut
 
 */
 
-    VTABLE INTVAL elements() {
-        return parrot_hash_size(INTERP, (Hash *)SELF.get_pointer());
+    VTABLE void set_integer_keyed_str(STRING *key, INTVAL value) {
+        Hash * const hash = (Hash *)SELF.get_pointer();
+        parrot_hash_put(INTERP, hash, hash_key_from_string(INTERP, hash, key),
+                hash_value_from_int(INTERP, hash, value));
     }
 
+
 /*
 
-=item C<PMC *get_pmc_keyed_str(STRING *key)>
+=item C<FLOATVAL get_number_keyed_str(STRING *key)>
 
-=item C<PMC *get_pmc_keyed_int(INTVAL key)>
+=item C<FLOATVAL get_number_keyed_int(INTVAL key)>
 
 =cut
 
 */
 
-    VTABLE PMC *get_pmc_keyed_str(STRING *key) {
-        HashBucket * const b =
-            parrot_hash_get_bucket(INTERP, (Hash *)SELF.get_pointer(), key);
+    VTABLE FLOATVAL get_number_keyed_str(STRING *key) {
+        const Hash * const hash = (Hash *)SELF.get_pointer();
+        HashBucket * const b = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_string(INTERP, hash, key));
 
         if (!b)
-            return PMCNULL;
-
-        return (PMC *)b->value;
-    }
+            return 0.0;
 
-    VTABLE PMC *get_pmc_keyed_int(INTVAL key) {
-        STRING * const s = Parrot_str_from_int(INTERP, key);
-        return SELF.get_pmc_keyed_str(s);
+        return hash_value_to_number(INTERP, hash, b->value);
     }
 
-/*
+    VTABLE FLOATVAL get_number_keyed_int(INTVAL key) {
+        const Hash * const hash = (Hash *)SELF.get_pointer();
+        HashBucket * const b = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_int(INTERP, hash, key));
 
-=item C<PMC *get_iter()>
+        if (!b)
+            return 0.0;
 
-Return a new iterator for the slice PMC C<key>
+        return hash_value_to_number(INTERP, hash, b->value);
+    }
+/*
 
-=item C<PMC *get_pmc_keyed(PMC *key)>
+=item C<FLOATVAL get_number_keyed(PMC *key)>
 
-Returns the PMC value for the element at C<*key>.
+Returns the floating-point value for the element at C<*key>.
 
 =cut
 
 */
 
-    VTABLE PMC *get_iter() {
-        PMC * const iter     = pmc_new_init(INTERP, enum_class_Iterator, SELF);
-        PMC * const key      = pmc_new(INTERP, enum_class_Key);
+    /* I can't migrate this function right now. Some problem with JITting */
+    VTABLE FLOATVAL get_number_keyed(PMC *key) {
+        PMC               *nextkey;
+        PMC               *valpmc;
+        const Hash * const hash   = (Hash *)VTABLE_get_pointer(interp, pmc);
+        void       * const keystr = hash_key_from_pmc(INTERP, hash, key);
+        HashBucket * const b      = parrot_hash_get_bucket(INTERP, hash, keystr);
 
-        SETATTR_Iterator_key(INTERP, iter, key);
-        PObj_get_FLAGS(key) |= KEY_hash_iterator_FLAGS;
-        SETATTR_Key_next_key(INTERP, key, (PMC *)INITBucketIndex);
+        if (!b)
+            return 0.0;
 
-        /* -1 for an empty hash, 0 for a non-empty hash.  */
-        SETATTR_Key_int_key(INTERP, key,
-            parrot_hash_size(INTERP, (Hash *)SELF.get_pointer()) ? 0 : -1);
+        nextkey = key_next(INTERP, key);
+        valpmc  = hash_value_to_pmc(INTERP, hash, b->value);
 
-        return iter;
-    }
+        if (!nextkey)
+            return VTABLE_get_number(INTERP, valpmc);
 
-    VTABLE PMC *slice(PMC *key) {
-        return PMCNULL;
+        return VTABLE_get_number_keyed(INTERP, valpmc, nextkey);
     }
 
-    VTABLE PMC *get_pmc_keyed(PMC *key) {
-        const Hash * const hash = (Hash *)SELF.get_pointer();
-        STRING        *keystr;
-        HashBucket    *b;
-        PMC           *nextkey;
-
-        /* called from iterator with an integer idx in key */
-        if ((PObj_get_FLAGS(key) & KEY_type_FLAGS) == KEY_hash_iterator_FLAGS) {
-            PMC *result;
-
-            /* check if we really have Hash_key_type_int */
-            if (hash->key_type == Hash_key_type_int) {
-                void *idx           = parrot_hash_get_idx(INTERP, hash, key);
-                const INTVAL i      = (INTVAL)idx;
-                result              = pmc_new(INTERP, enum_class_Integer);
-                VTABLE_set_integer_native(INTERP, result, i);
-            }
-            else {
-                STRING *s = (STRING *)parrot_hash_get_idx(INTERP, hash, key);
-                result    = pmc_new(INTERP, enum_class_String);
-                VTABLE_set_string_native(INTERP, result, s);
-            }
 
-            return result;
-        }
+/*
+
+=item C<STRING *get_string_keyed_str(STRING *key)>
 
-        keystr = make_ro_hash_key(INTERP, key);
-        b      = parrot_hash_get_bucket(INTERP, hash, keystr);
+=item C<STRING *get_string_keyed_int(INTVAL key)>
+
+=cut
+
+*/
+
+    VTABLE STRING *get_string_keyed_str(STRING *key) {
+        const Hash * const hash = (Hash*)SELF.get_pointer();
+        HashBucket * const b =
+            parrot_hash_get_bucket(INTERP, hash, hash_key_from_string(INTERP, hash, key));
 
         if (!b)
-            return PMCNULL;
+            return Parrot_str_new_noinit(INTERP, enum_stringrep_one, 0);
 
-        nextkey = key_next(INTERP, key);
+        return hash_value_to_string(INTERP, hash, b->value);
+    }
 
-        if (!nextkey)
-            return (PMC *)b->value;
+    VTABLE STRING *get_string_keyed_int(INTVAL key) {
+        const Hash * const hash = (Hash*)SELF.get_pointer();
+        HashBucket * const b =
+            parrot_hash_get_bucket(INTERP, hash, hash_key_from_int(INTERP, hash, key));
 
-        return VTABLE_get_pmc_keyed(INTERP, (PMC*)b->value, nextkey);
+        if (!b)
+            return Parrot_str_new_noinit(INTERP, enum_stringrep_one, 0);
+
+        return hash_value_to_string(INTERP, hash, b->value);
     }
 
 /*
 
-=item C<INTVAL is_same(const PMC *other)>
+=item C<STRING *get_string_keyed(PMC *key)>
 
-Returns whether the hash is the same as C<*other>.
+Returns the string value for the element at C<*key>.
 
 =cut
 
 */
 
-    VTABLE INTVAL is_same(PMC *other) {
-        return (INTVAL)(other->vtable == SELF->vtable &&
-            VTABLE_get_pointer(INTERP, other) == SELF.get_pointer());
+    VTABLE STRING *get_string_keyed(PMC *key) {
+        const Hash * const hash = (Hash *)SELF.get_pointer();
+        HashBucket * const b = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_pmc(INTERP, hash, key));
+        PMC        *valpmc;
+        PMC        *nextkey;
+
+        if (!b)
+            return Parrot_str_new_noinit(INTERP, enum_stringrep_one, 0);
+
+        nextkey = key_next(INTERP, key);
+        valpmc  = hash_value_to_pmc(INTERP, hash, b->value);
+
+        /* Stop recursion. This is last step */
+        if (!nextkey)
+            return VTABLE_get_string(INTERP, valpmc);
+
+        /* Recusively call to enclosed aggregate */
+        return VTABLE_get_string_keyed(INTERP, valpmc, nextkey);
     }
 
 /*
 
-=item C<void set_integer_keyed(PMC *key, INTVAL value)>
+=item C<void set_string_keyed(PMC *key, STRING *value)>
 
 =cut
 
 */
 
-    VTABLE void set_integer_keyed(PMC *key, INTVAL value) {
-        STRING *keystr;
-        PMC    *nextkey;
+    VTABLE void set_string_keyed(PMC *key, STRING *value) {
+        Hash   * const hash    = (Hash *)SELF.get_pointer();
+        void   * const keystr  = hash_key_from_pmc(INTERP, hash, key);
+        PMC    * const nextkey = key_next(INTERP, key);
         PMC    *box;
-
-        if (!key)
-            return;
-
-        keystr  = make_hash_key(INTERP, key);
-        nextkey = key_next(INTERP, key);
+        HashBucket *b;
 
         if (!nextkey) {
-            PMC *val = get_integer_pmc(INTERP, SELF->vtable->base_type);
-
-            VTABLE_set_integer_native(INTERP, val, value);
-            parrot_hash_put(INTERP, (Hash *)SELF.get_pointer(), keystr, val);
+            parrot_hash_put(INTERP, hash, keystr,
+                    hash_value_from_string(INTERP, hash, value));
             return;
         }
 
-        box = SELF.get_pmc_keyed_str(keystr);
-
-        /* autovivify an Hash */
-        if (!box)
-            box = pmc_new(INTERP, SELF.type());
-
-        VTABLE_set_integer_keyed(INTERP, box, nextkey, value);
-    }
-
-    VTABLE void set_integer_keyed_int(INTVAL key, INTVAL value) {
-        Hash * const hash = (Hash *)SELF.get_pointer();
-
-        /* check if we really have Hash_key_type_int */
-        if (hash->key_type == Hash_key_type_int) {
-            parrot_hash_put(INTERP, hash, (void *)key, (void *)value);
-        }
+        b = parrot_hash_get_bucket(INTERP, hash, keystr);
+        if (b)
+            box = hash_value_to_pmc(INTERP, hash, b->value);
         else {
-            SUPER(key, value);
+            /* autovivify an Hash */
+            box = pmc_new(INTERP, SELF.type());
+            parrot_hash_put(INTERP, hash, keystr,
+                    hash_value_from_pmc(INTERP, hash, box));
         }
+
+        VTABLE_set_string_keyed(INTERP, box, nextkey, value);
     }
 
 /*
 
-=item C<void set_integer_keyed_str(STRING *key, INTVAL value)>
+=item C<void set_string_keyed_str(STRING *key, STRING *value)>
 
 =cut
 
 */
 
-    VTABLE void set_integer_keyed_str(STRING *key, INTVAL value) {
-        PMC * const val  = get_integer_pmc(INTERP, SELF->vtable->base_type);
-        VTABLE_set_integer_native(INTERP, val, value);
+    VTABLE void set_string_keyed_str(STRING *key, STRING *value) {
+        Hash * const hash = (Hash *)SELF.get_pointer();
+        parrot_hash_put(INTERP, hash,
+                hash_key_from_string(INTERP, hash, key),
+                hash_value_from_string(INTERP, hash, value));
+    }
 
-        parrot_hash_put(INTERP, (Hash *)SELF.get_pointer(), key, val);
+    VTABLE void set_string_keyed_int(INTVAL key, STRING *value) {
+        Hash * const hash = (Hash *)SELF.get_pointer();
+        parrot_hash_put(INTERP, hash,
+                hash_key_from_int(INTERP, hash, key),
+                hash_value_from_string(INTERP, hash, value));
     }
 
 /*
 
-=item C<void set_number_keyed(PMC *key, FLOATVAL value)>
-
-=cut
+=item C<PMC *get_pmc_keyed(PMC *key)>
 
-*/
+=item C<PMC *get_pmc_keyed_str(STRING *key)>
 
-    VTABLE void set_number_keyed(PMC *key, FLOATVAL value) {
-        STRING *keystr;
-        PMC    *nextkey;
-        PMC    *box;
+=item C<PMC *get_pmc_keyed_int(INTVAL key)>
 
-        if (!key)
-            return;
+Returns the PMC value for the element at C<*key>.
 
-        keystr  = make_hash_key(INTERP, key);
-        nextkey = key_next(INTERP, key);
+=cut
 
-        if (!nextkey) {
-            PMC *val         = get_number_pmc(INTERP, SELF->vtable->base_type);
-            VTABLE_set_number_native(INTERP, val, value);
-            parrot_hash_put(INTERP, (Hash *)SELF.get_pointer(), keystr, val);
-            return;
-        }
+*/
 
-        box = SELF.get_pmc_keyed_str(keystr);
+    VTABLE PMC *get_pmc_keyed_str(STRING *key) {
+        const Hash * const hash = (Hash *)SELF.get_pointer();
+        HashBucket * const b    = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_string(INTERP, hash, key));
 
-        /* autovivify an Hash */
-        if (!box)
-            box = pmc_new(INTERP, SELF.type());
+        if (!b)
+            return PMCNULL;
 
-        VTABLE_set_number_keyed(INTERP, box, nextkey, value);
+        return hash_value_to_pmc(INTERP, hash, b->value);
     }
 
-/*
+    VTABLE PMC *get_pmc_keyed_int(INTVAL key) {
+        const Hash * const hash = (Hash *)SELF.get_pointer();
+        HashBucket * const b    = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_int(INTERP, hash, key));
 
-=item C<void set_number_keyed_str(STRING *key, FLOATVAL value)>
+        if (!b)
+            return PMCNULL;
 
-Sets C<value> as the value for C<*key>.
+        return hash_value_to_pmc(INTERP, hash, b->value);
+    }
 
-=cut
+    /* Compound Key */
+    VTABLE PMC *get_pmc_keyed(PMC *key) {
+        const Hash * const hash = (Hash *)SELF.get_pointer();
+        HashBucket * const b = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_pmc(INTERP, hash, key));
+        PMC        *valpmc;
+        PMC        *nextkey;
 
-*/
+        if (!b)
+            return PMCNULL;
 
-    VTABLE void set_number_keyed_str(STRING *key, FLOATVAL value) {
-        PMC * const val  = get_number_pmc(INTERP, SELF->vtable->base_type);
-        VTABLE_set_number_native(INTERP, val, value);
+        nextkey = key_next(INTERP, key);
+        valpmc  = hash_value_to_pmc(INTERP, hash, b->value);
 
-        parrot_hash_put(INTERP, (Hash *)SELF.get_pointer(), key, val);
+        /* Stop recursion. This is last step */
+        if (!nextkey)
+            return valpmc;
+
+        /* Recusively call to enclosed aggregate */
+        return VTABLE_get_pmc_keyed(INTERP, valpmc, nextkey);
     }
 
 /*
 
-=item C<void set_string_keyed(PMC *key, STRING *value)>
+=item C<void set_number_keyed(PMC *key, FLOATVAL value)>
 
 =cut
 
 */
 
-    VTABLE void set_string_keyed(PMC *key, STRING *value) {
-        STRING *keystr;
-        PMC    *nextkey;
-        PMC    *box;
-
-        if (!key)
-            return;
+    VTABLE void set_number_keyed(PMC *key, FLOATVAL value) {
+        Hash   * const hash    = (Hash *)SELF.get_pointer();
+        void   * const keystr  = hash_key_from_pmc(INTERP, hash, key);
+        PMC    * const nextkey = key_next(INTERP, key);
+        PMC    *box            = PMCNULL;
+        HashBucket *b;
 
-        keystr  = make_hash_key(INTERP, key);
-        nextkey = key_next(INTERP, key);
 
         if (!nextkey) {
-            PMC * const val = get_string_pmc(INTERP, SELF->vtable->base_type);
-            VTABLE_set_string_native(INTERP, val, value);
-            parrot_hash_put(INTERP, (Hash *)SELF.get_pointer(), keystr, val);
+            PMC * const val = get_number_pmc(INTERP);
+            VTABLE_set_number_native(INTERP, val, value);
+            parrot_hash_put(INTERP, hash, keystr, hash_value_from_pmc(INTERP, hash, val));
             return;
         }
 
-        box = SELF.get_pmc_keyed_str(keystr);
+        b = parrot_hash_get_bucket(INTERP, (Hash *)SELF.get_pointer(), keystr);
+        if (b)
+            box = hash_value_to_pmc(INTERP, hash, b->value);
 
         /* autovivify an Hash */
-        if (!box)
+        if (PMC_IS_NULL(box))
             box = pmc_new(INTERP, SELF.type());
 
-        VTABLE_set_string_keyed(INTERP, box, nextkey, value);
+        VTABLE_set_number_keyed(INTERP, box, nextkey, value);
     }
 
 /*
 
-=item C<void set_string_keyed_str(STRING *key, STRING *value)>
+=item C<void set_number_keyed_str(STRING *key, FLOATVAL value)>
+
+Sets C<value> as the value for C<*key>.
 
 =cut
 
 */
 
-    VTABLE void set_string_keyed_str(STRING *key, STRING *value) {
-        PMC * const val = get_string_pmc(INTERP, SELF->vtable->base_type);
+    VTABLE void set_number_keyed_str(STRING *key, FLOATVAL value) {
+        PMC * const val  = get_number_pmc(INTERP);
+        VTABLE_set_number_native(INTERP, val, value);
 
-        VTABLE_set_string_native(INTERP, val, value);
         parrot_hash_put(INTERP, (Hash *)SELF.get_pointer(), key, val);
     }
 
@@ -847,26 +1073,27 @@
 */
 
     VTABLE void set_pmc_keyed(PMC *key, PMC *value) {
-        STRING *keystr;
-        PMC    *nextkey;
+        Hash   * const hash    = (Hash *)SELF.get_pointer();
+        void   * const keystr  = hash_key_from_pmc(INTERP, hash, key);
+        PMC    * const nextkey = key_next(INTERP, key);
         PMC    *box;
-
-        if (!key)
-            return;
-
-        keystr  = make_hash_key(INTERP, key);
-        nextkey = key_next(INTERP, key);
+        HashBucket *b;
 
         if (!nextkey) {
-            parrot_hash_put(INTERP, (Hash *)SELF.get_pointer(), keystr, value);
+            parrot_hash_put(INTERP, hash, keystr, value);
             return;
         }
 
-        box = SELF.get_pmc_keyed_str(keystr);
-
-        /* autovivify an Hash */
-        if (!box)
+        b = parrot_hash_get_bucket(INTERP, hash, keystr);
+        if (b)
+            box = hash_value_to_pmc(INTERP, hash, b->value);
+        else {
+            /* autovivify an Hash */
             box = pmc_new(INTERP, SELF.type());
+            parrot_hash_put(INTERP, hash, keystr,
+                    hash_value_from_pmc(INTERP, hash, box));
+        }
+
 
         VTABLE_set_pmc_keyed(INTERP, box, nextkey, value);
     }
@@ -882,54 +1109,9 @@
 */
 
     VTABLE void set_pmc_keyed_str(STRING *key, PMC *value) {
-        parrot_hash_put(INTERP, (Hash *)SELF.get_pointer(), key, value);
-    }
-
-/*
-
-=item C<INTVAL is_equal(PMC *value)>
-
-The C<==> operation.
-
-Check if two hashes hold the same keys and values.
-
-=cut
-
-*/
-
-    VTABLE INTVAL is_equal(PMC *value) {
-        PMC * const iter = VTABLE_get_iter(INTERP, SELF);
-        INTVAL      j, n;
-
-        if (value->vtable->base_type != SELF->vtable->base_type)
-            return 0;
-
-        n = SELF.elements();
-
-        if (VTABLE_elements(INTERP, value) != n)
-            return 0;
-
-        for (j = 0; j < n; ++j) {
-            STRING * const key = VTABLE_shift_string(INTERP, iter);
-            PMC           *item1, *item2;
-            INTVAL         result;
-
-            if (!VTABLE_exists_keyed_str(INTERP, value, key))
-                return 0;
-
-            item1 = SELF.get_pmc_keyed_str(key);
-            item2 = VTABLE_get_pmc_keyed_str(INTERP, value, key);
-
-            if (item1 == item2)
-                continue;
-
-            Parrot_mmd_multi_dispatch_from_c_args(INTERP, "is_equal",
-                "PP->I", item1, item2, &result);
-            if (!result)
-                return 0;
-        }
-
-        return 1;
+        Hash * const hash = (Hash *)SELF.get_pointer();
+        parrot_hash_put(INTERP, hash, hash_key_from_string(INTERP, hash, key),
+                hash_value_from_pmc(INTERP, hash, value));
     }
 
 /*
@@ -941,8 +1123,9 @@
 */
 
     VTABLE INTVAL exists_keyed_str(STRING *key) {
-        HashBucket * const b =
-            parrot_hash_get_bucket(INTERP, (Hash *)SELF.get_pointer(), key);
+        Hash * const hash = (Hash *)SELF.get_pointer();
+        HashBucket * const b = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_string(INTERP, hash, key));
         return b != NULL;
     }
 
@@ -957,9 +1140,9 @@
 */
 
     VTABLE INTVAL exists_keyed(PMC *key) {
-        Hash   * const h  = (Hash *)SELF.get_pointer();
-        STRING * const sx = make_ro_hash_key(INTERP, key);
-        HashBucket    *b  = parrot_hash_get_bucket(INTERP, h, sx);
+        Hash       * const h  = (Hash *)SELF.get_pointer();
+        void       * const sx = hash_key_from_pmc(INTERP, h, key);
+        HashBucket * const b  = parrot_hash_get_bucket(INTERP, h, sx);
 
         /* no such key */
         if (!b)
@@ -971,7 +1154,7 @@
         if (!key)
             return 1;
 
-        return VTABLE_exists_keyed(INTERP, (PMC *)b->value, key);
+        return VTABLE_exists_keyed(INTERP, hash_value_to_pmc(INTERP, h, b->value), key);
     }
 
 /*
@@ -983,14 +1166,15 @@
 */
 
     VTABLE INTVAL defined_keyed_str(STRING *key) {
-        HashBucket * const b =
-            parrot_hash_get_bucket(INTERP, (Hash *)SELF.get_pointer(), key);
+        const Hash * const hash = (Hash *)SELF.get_pointer();
+        HashBucket * const b = parrot_hash_get_bucket(INTERP, hash,
+                hash_key_from_string(INTERP, hash, key));
 
         /* no such key */
         if (!b)
             return 0;
 
-        return VTABLE_defined(INTERP, (PMC*)b->value);
+        return VTABLE_defined(INTERP, hash_value_to_pmc(INTERP, hash, b->value));
     }
 
 /*
@@ -1004,9 +1188,9 @@
 */
 
     VTABLE INTVAL defined_keyed(PMC *key) {
-        Hash   * const h  = (Hash *)SELF.get_pointer();
-        STRING * const sx = make_ro_hash_key(INTERP, key);
-        HashBucket    *b  = parrot_hash_get_bucket(INTERP, h, sx);
+        Hash       * const h  = (Hash *)SELF.get_pointer();
+        void       * const sx = hash_key_from_pmc(INTERP, h, key);
+        HashBucket * const b  = parrot_hash_get_bucket(INTERP, h, sx);
 
         /* no such key */
         if (!b)
@@ -1015,9 +1199,10 @@
         key = key_next(INTERP, key);
 
         if (!key)
-            return VTABLE_defined(INTERP, (PMC *)b->value);
+            return VTABLE_defined(INTERP, hash_value_to_pmc(INTERP, h, b->value));
         else
-            return VTABLE_defined_keyed(INTERP, (PMC *)b->value, key);
+            return VTABLE_defined_keyed(INTERP,
+                    hash_value_to_pmc(INTERP, h, b->value), key);
     }
 
 /*
@@ -1029,7 +1214,8 @@
 */
 
     VTABLE void delete_keyed_str(STRING *key) {
-        parrot_hash_delete(INTERP, (Hash *)SELF.get_pointer(), key);
+        Hash * const hash = (Hash *)SELF.get_pointer();
+        parrot_hash_delete(INTERP, hash, hash_key_from_string(INTERP, hash, key));
     }
 
 /*
@@ -1043,9 +1229,9 @@
 */
 
     VTABLE void delete_keyed(PMC *key) {
-        Hash   * const h  = (Hash *)SELF.get_pointer();
-        STRING * const sx = make_ro_hash_key(INTERP, key);
-        HashBucket    *b  = parrot_hash_get_bucket(INTERP, h, sx);
+        Hash       * const h  = (Hash *)SELF.get_pointer();
+        void       * const sx = hash_key_from_pmc(INTERP, h, key);
+        HashBucket * const b  = parrot_hash_get_bucket(INTERP, h, sx);
 
         /* no such key */
         if (!b)
@@ -1061,6 +1247,110 @@
 
 /*
 
+=item C<INTVAL get_bool()>
+
+Returns true if the hash size is not zero.
+
+=cut
+
+*/
+
+    VTABLE INTVAL get_bool() {
+        return parrot_hash_size(INTERP, (Hash *)SELF.get_pointer()) != 0;
+    }
+
+/*
+
+=item C<INTVAL elements()>
+
+Returns the number of elements in the hash.
+
+=cut
+
+*/
+
+    VTABLE INTVAL elements() {
+        return parrot_hash_size(INTERP, (Hash *)SELF.get_pointer());
+    }
+
+/*
+
+=item C<PMC *get_iter()>
+
+Return a new iterator for the slice PMC C<key>
+
+=cut
+
+*/
+
+    VTABLE PMC *get_iter() {
+        return pmc_new_init(INTERP, enum_class_HashIterator, SELF);
+    }
+
+/*
+
+=item C<INTVAL is_same(const PMC *other)>
+
+Returns whether the hash is the same as C<*other>.
+
+=cut
+
+*/
+
+    VTABLE INTVAL is_same(PMC *other) {
+        return (INTVAL)(other->vtable == SELF->vtable &&
+            VTABLE_get_pointer(INTERP, other) == SELF.get_pointer());
+    }
+
+/*
+
+=item C<INTVAL is_equal(PMC *value)>
+
+The C<==> operation.
+
+Check if two hashes hold the same keys and values.
+
+=cut
+
+*/
+
+    VTABLE INTVAL is_equal(PMC *value) {
+        PMC * const iter = VTABLE_get_iter(INTERP, SELF);
+        INTVAL      j, n;
+
+        if (value->vtable->base_type != SELF->vtable->base_type)
+            return 0;
+
+        n = SELF.elements();
+
+        if (VTABLE_elements(INTERP, value) != n)
+            return 0;
+
+        for (j = 0; j < n; ++j) {
+            STRING * const key = VTABLE_shift_string(INTERP, iter);
+            PMC           *item1, *item2;
+            INTVAL         result;
+
+            if (!VTABLE_exists_keyed_str(INTERP, value, key))
+                return 0;
+
+            item1 = SELF.get_pmc_keyed_str(key);
+            item2 = VTABLE_get_pmc_keyed_str(INTERP, value, key);
+
+            if (item1 == item2)
+                continue;
+
+            Parrot_mmd_multi_dispatch_from_c_args(INTERP, "is_equal",
+                "PP->I", item1, item2, &result);
+            if (!result)
+                return 0;
+        }
+
+        return 1;
+    }
+
+/*
+
 =item C<PMC *slice(PMC *key)>
 
 Return a new iterator for the slice PMC C<key>
@@ -1071,9 +1361,7 @@
 
     VTABLE PMC *slice(PMC *key, INTVAL f) {
         if (f == 0) {
-            PMC * const iter = pmc_new_init(INTERP, enum_class_Iterator, SELF);
-            PARROT_ITERATOR(iter)->key = key;
-            return iter;
+            return SELF.get_iter();
         }
 
         Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
@@ -1109,7 +1397,7 @@
 
     VTABLE void freeze(visit_info *info) {
         IMAGE_IO * const io   = info->image_io;
-        Hash * const     hash = (Hash *)SELF.get_pointer();;
+        Hash     * const hash = (Hash *)SELF.get_pointer();;
 
         SUPER(info);
         VTABLE_push_integer(INTERP, io, VTABLE_elements(INTERP, SELF));

Copied: branches/ops_pct/src/pmc/hashiterator.pmc (from r40255, trunk/src/pmc/hashiterator.pmc)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/src/pmc/hashiterator.pmc	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/src/pmc/hashiterator.pmc)
@@ -0,0 +1,283 @@
+/*
+Copyright (C) 2001-2009, Parrot Foundation.
+$Id$
+
+=head1 NAME
+
+src/pmc/hashiterator.pmc - Implementation of Iterator for Hashes.
+
+=head1 DESCRIPTION
+
+Generic iterator for traversing Hash.
+
+=head1 SYNOPSIS
+
+=head2 default usage
+
+    .local pmc iterator, hash, key, entry
+    iterator = iter hash
+  iter_loop:
+    unless iterator, iter_end  # while (more values)
+    key   = shift iterator     # get the key. Some key
+    entry = hash[key]
+    ...
+    goto iter_loop
+  iter_end:
+
+=head2 C++-style usage
+
+    .local pmc iterator, hash, iter_key, key, entry
+    iterator = iter hash
+  iter_loop:
+    unless iterator, iter_end  # while (more values)
+    iter_key = shift iterator     # get the key
+    key = iter_key.'key'()        # get an original key used to put value
+    key = iter_key.'value'()      # get an entry
+    ...
+    goto iter_loop
+  iter_end:
+
+
+=head1 Methods
+
+=over 4
+
+=cut
+
+*/
+
+#include "pmc_hash.h"
+#include "pmc_hashiteratorkey.h"
+
+/*
+
+Advance to next position. Return found (if any) HashBucket.
+
+*/
+static HashBucket*
+advance_to_next(PARROT_INTERP, PMC *self) {
+    Parrot_HashIterator_attributes * const attrs  = PARROT_HASHITERATOR(self);
+    HashBucket                            *bucket = attrs->bucket;
+
+    /* Try to advance current bucket */
+    if (bucket)
+        bucket = bucket->next;
+
+    while (!bucket) {
+        /* If there is no more buckets */
+        if (attrs->pos == attrs->total_buckets)
+            break;
+
+        bucket = attrs->parrot_hash->bi[attrs->pos++];
+    }
+    attrs->bucket = bucket;
+    attrs->elements--;
+    return bucket;
+}
+
+pmclass HashIterator extends Iterator no_ro {
+    ATTR PMC        *pmc_hash;      /* the Hash which this Iterator iterates */
+    ATTR Hash       *parrot_hash;   /* Underlying implementation of hash */
+    ATTR HashBucket *bucket;        /* Current bucket */
+    ATTR INTVAL      total_buckets; /* Total buckets in index */
+    ATTR INTVAL      pos;           /* Current position in index */
+    ATTR INTVAL      elements;      /* How many elements left to iterate over */
+
+/*
+
+=item C<void init_pmc(PMC *initializer)>
+
+Initializes the iterator with an aggregate PMC.
+Defaults iteration mode to iterate from start.
+
+=cut
+
+*/
+
+    VTABLE void init_pmc(PMC *hash) {
+        Parrot_HashIterator_attributes * const attrs =
+            mem_allocate_zeroed_typed(Parrot_HashIterator_attributes);
+
+        attrs->pmc_hash         = hash;
+        attrs->parrot_hash      = (Hash*)VTABLE_get_pointer(INTERP, hash);
+        attrs->total_buckets    = attrs->parrot_hash->mask + 1;
+        attrs->bucket           = 0;
+        attrs->pos              = 0;
+        /* Will be decreased on initial advance_to_next */
+        /* XXX Do we really need to support this use-case ? */
+        attrs->elements         = attrs->parrot_hash->entries + 1;
+        PMC_data(SELF)          = attrs;
+
+        PObj_custom_mark_destroy_SETALL(SELF);
+
+        /* Initial state of iterator is "before start" */
+        /* So, advance to first element */
+        advance_to_next(INTERP, SELF);
+    }
+
+/*
+
+=item C<void destroy()>
+
+destroys this PMC
+
+=cut
+
+*/
+
+    VTABLE void destroy() {
+        mem_sys_free(PMC_data(SELF));
+    }
+
+/*
+
+=item C<void mark()>
+
+Marks the hash as live.
+
+=cut
+
+*/
+
+    VTABLE void mark() {
+        PMC *hash = PARROT_HASHITERATOR(SELF)->pmc_hash;
+        if (hash)
+             Parrot_gc_mark_PObj_alive(INTERP, (PObj *)hash);
+        /* We don't mark underlying parrot_hash. Hash PMC will mark it */
+    }
+
+/*
+
+=item C<PMC *clone()>
+
+=cut
+
+*/
+    VTABLE PMC* clone() {
+        return PMCNULL;
+    }
+
+/*
+
+=item C<void set_integer_native()>
+
+=cut
+
+*/
+    VTABLE void set_integer_native(INTVAL value) {
+        Parrot_HashIterator_attributes * const attrs =
+                PARROT_HASHITERATOR(SELF);
+
+        if (value == 0) {
+            /* Restart iterator */
+            attrs->bucket           = 0;
+            attrs->pos              = 0;
+            advance_to_next(INTERP, SELF);
+            return;
+        }
+
+        Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
+                "HashIterator: unknown iterator type");
+    };
+
+/*
+
+=item C<PMC *get_pmc()>
+
+Returns this Iterator's Hash.
+
+=cut
+*/
+    VTABLE PMC* get_pmc() {
+        return PARROT_HASHITERATOR(SELF)->pmc_hash;
+    }
+
+/*
+
+=item C<INTVAL get_bool()>
+
+Returns true if there is more elements to iterate over.
+
+=cut
+
+*/
+
+    VTABLE INTVAL get_bool() {
+        return PARROT_HASHITERATOR(SELF)->bucket != 0;
+    }
+
+/*
+
+=item C<INTVAL elements()>
+
+Returns the number of remaining elements in the Hash.
+
+=cut
+
+*/
+
+    VTABLE INTVAL elements() {
+        return PARROT_HASHITERATOR(SELF)->elements;
+    }
+
+    VTABLE INTVAL get_integer() {
+        return SELF.elements();
+    }
+
+/*
+
+=item C<PMC *shift_pmc()>
+
+Returns the HashIteratorKey for the current position and advance
+the next one.
+
+=cut
+
+*/
+
+    VTABLE PMC *shift_pmc() {
+        Parrot_HashIterator_attributes * const attrs =
+                PARROT_HASHITERATOR(SELF);
+
+        PMC        *ret;
+
+        if (!attrs->bucket)
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        ret = pmc_new(INTERP, enum_class_HashIteratorKey);
+        /* Poke directly into HIK. We don't want to create any kind of public API for this */
+        PARROT_HASHITERATORKEY(ret)->parrot_hash = attrs->parrot_hash;
+        PARROT_HASHITERATORKEY(ret)->bucket      = attrs->bucket;
+
+        /* Move to next bucket */
+        advance_to_next(INTERP, SELF);
+
+        return ret;
+    }
+
+/*
+
+*/
+
+    VTABLE STRING* shift_string() {
+        PMC * const key = SELF.shift_pmc();
+        return VTABLE_get_string(INTERP, key);
+    }
+
+}
+
+/*
+
+=back
+
+=cut
+
+*/
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Copied: branches/ops_pct/src/pmc/hashiteratorkey.pmc (from r40255, trunk/src/pmc/hashiteratorkey.pmc)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/src/pmc/hashiteratorkey.pmc	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/src/pmc/hashiteratorkey.pmc)
@@ -0,0 +1,118 @@
+/*
+Copyright (C) 2001-2009, Parrot Foundation.
+$Id$
+
+=head1 NAME
+
+src/pmc/hashiteratorkey.pmc - accessor for single value during hash iteration.
+
+=head1 DESCRIPTION
+
+Single (key,value) pair.
+
+
+=head1 Methods
+
+=over 4
+
+=cut
+
+*/
+
+pmclass HashIteratorKey no_ro {
+    ATTR Hash        *parrot_hash; /* Underlying parrot's hash */
+    ATTR HashBucket  *bucket;      /* Current bucket from HashItertor */
+
+/*
+
+=item C<void init()>
+
+Initializes the PMC.
+
+Not really part of public API.
+
+=cut
+
+*/
+
+    VTABLE void init() {
+        Parrot_HashIteratorKey_attributes *attrs =
+            mem_allocate_zeroed_typed(Parrot_HashIteratorKey_attributes);
+
+        PMC_data(SELF) = attrs;
+
+        PObj_active_destroy_SET(SELF);
+    }
+
+/*
+
+=item C<void destroy()>
+
+Destroys this PMC
+
+=cut
+
+*/
+
+    VTABLE void destroy() {
+        mem_sys_free(PMC_data(SELF));
+    }
+
+/*
+
+=item C<get_pmc()>
+
+Get "key".
+
+=cut
+
+*/
+    VTABLE PMC* get_pmc() {
+        return PMCNULL;
+    }
+
+    VTABLE INTVAL get_integer() {
+        return -1;
+    }
+
+    VTABLE STRING* get_string() {
+        Parrot_HashIteratorKey_attributes *attrs =
+                PARROT_HASHITERATORKEY(SELF);
+
+        switch (attrs->parrot_hash->key_type) {
+            case Hash_key_type_int:
+                return Parrot_str_from_int(INTERP, (INTVAL)attrs->bucket->key);
+
+            case Hash_key_type_STRING:
+                return (STRING*)attrs->bucket->key;
+
+            case Hash_key_type_PMC:
+                return VTABLE_get_string(INTERP, (PMC *)attrs->bucket->key);
+
+            default:
+                /* Horribly die? */
+                break;
+        }
+
+        return NULL;
+    }
+
+
+
+}
+
+/*
+
+=back
+
+=cut
+
+*/
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */
+

Modified: branches/ops_pct/src/pmc/iterator.pmc
==============================================================================
--- branches/ops_pct/src/pmc/iterator.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/iterator.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -17,7 +17,7 @@
 =head2 default usage
 
     .local pmc iterator, array, entry
-    iterator = new 'Iterator', array
+    iterator = iter array
   iter_loop:
     unless iterator, iter_end  # while (more values)
     entry = shift iterator     # get an entry
@@ -25,14 +25,10 @@
     goto iter_loop
   iter_end:
 
-The C<new> can alternatively be written as:
-
-  iterator = iter array
-
 =head2 iterate from the end, for arrays
 
     .local pmc iterator, array, entry
-    iterator = new 'Iterator', array
+    iterator = iter array
     iterator = .ITERATE_FROM_END
   iter_loop:
     unless iterator, iter_end  # while (more values)
@@ -44,7 +40,7 @@
 =head2 iterate over a hash
 
     .local pmc iterator, hash, key, entry
-    iterator = new 'Iterator', hash
+    iterator = iter hash
   iter_loop:
     unless iterator, iter_end  # while (more values)
     key   = shift iterator     # get the key..
@@ -62,17 +58,6 @@
 */
 
 pmclass Iterator no_ro {
-    ATTR PMC *aggregate; /* the aggregate which this Iterator iterates */
-    ATTR PMC *key;       /* the Key used by this Iterator */
-
-    void class_init() {
-        if (pass) {
-            /* Make the shift_pmc vtable function available as
-             * a method named "next" */
-            register_nci_method(INTERP, enum_class_Iterator,
-                    F2DPTR(Parrot_Iterator_shift_pmc), "next", "PJO");
-        }
-    }
 
 /*
 
@@ -101,107 +86,10 @@
 */
 
     VTABLE void init_pmc(PMC *aggregate) {
-        Parrot_Iterator_attributes *attrs =
-            mem_allocate_zeroed_typed(Parrot_Iterator_attributes);
-
-        attrs->aggregate = aggregate;
-        attrs->key       = PMCNULL;
-        PMC_data(SELF)   = attrs;
-
-        PObj_custom_mark_destroy_SETALL(SELF);
-
-        /* by default, iterate from start */
-        SELF.set_integer_native(ITERATE_FROM_START);
-    }
-
-/*
-
-=item C<void destroy()>
-
-destroys this PMC
-
-=cut
-
-*/
-
-    VTABLE void destroy() {
-        mem_sys_free(PMC_data(SELF));
-    }
-
-/*
-
-=item C<void mark()>
-
-Marks the current idx/key and the aggregate as live.
-
-=cut
-
-*/
-
-    VTABLE void mark() {
-        /* the Key */
-        PMC *key;
-        GET_ATTR_key(INTERP, SELF, key);
-        if (key)
-             Parrot_gc_mark_PObj_alive(INTERP, (PObj *)key);
-
-        /* the aggregate */
-        if (SELF.get_pmc() != PMCNULL)
-             Parrot_gc_mark_PObj_alive(INTERP, (PObj *)SELF.get_pmc());
-    }
-
-/*
-
-=item C<PMC *clone()>
-
-Make a clone of the iterator.
-
-=cut
-
-*/
-
-    VTABLE PMC *clone() {
-        PMC           *key;
-        STRING * const name = CONST_STRING(interp, "set_key");
-        PMC    * const res  = pmc_new_init(INTERP, SELF->vtable->base_type,
-                                           SELF.get_pmc());
-
-        GET_ATTR_key(INTERP, SELF, key);
-
-        Parrot_PCCINVOKE(interp, res, name, "P->", VTABLE_clone(interp, key));
-        return res;
-    }
-
-/*
-
-=item C<INTVAL get_integer()>
-
-Get number of remaining elements. Does not work for hashes yet.
-TODO: keep track of current position and direction
-
-=cut
-
-*/
-
-    VTABLE INTVAL get_integer() {
-        return SELF.elements();
+        Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
+                "Direct creation of Iterator");
     }
 
-/*
-
-=item C<STRING *get_string()>
-
-Returns a textual representation of the iterator.
-
-=cut
-
-*/
-
-    VTABLE STRING *get_string() {
-        PMC *key;
-        GET_ATTR_key(INTERP, SELF, key);
-        return Parrot_str_from_int(INTERP, VTABLE_get_integer(INTERP, key));
-    }
 
 /*
 
@@ -217,25 +105,6 @@
 
 /*
 
-=item C<INTVAL get_integer_keyed_int(INTVAL idx)>
-
-Get integer value of current position plus idx.
-
-=cut
-
-*/
-
-    VTABLE INTVAL get_integer_keyed_int(INTVAL idx) {
-        PMC * const agg = SELF.get_pmc();
-        PMC        *key;
-
-        GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_get_integer_keyed_int(INTERP, agg,
-                VTABLE_get_integer(INTERP, key) +idx);
-    }
-
-/*
-
 =item C<FLOATVAL get_number_keyed(PMC *key)>
 
 =cut
@@ -246,26 +115,6 @@
         return VTABLE_get_number_keyed(INTERP, SELF.get_pmc(), key);
     }
 
-/*
-
-=item C<FLOATVAL get_number_keyed_int(INTVAL idx)>
-
-Get number value of current position plus idx.
-
-=cut
-
-*/
-
-    VTABLE FLOATVAL get_number_keyed_int(INTVAL idx) {
-        PMC * const agg = SELF.get_pmc();
-        PMC        *key;
-
-        GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_get_number_keyed_int(INTERP, agg,
-                VTABLE_get_integer(INTERP, key) + idx);
-    }
-
-
 
 /*
 
@@ -280,72 +129,6 @@
     }
 
 /*
-
-=item C<STRING *get_string_keyed_int(INTVAL idx)>
-
-Get string value of current position plus idx.
-
-=cut
-
-*/
-
-    VTABLE STRING *get_string_keyed_int(INTVAL idx) {
-        PMC * const agg = SELF.get_pmc();
-        PMC        *key;
-
-        GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_get_string_keyed_int(INTERP, agg,
-                VTABLE_get_integer(INTERP, key) + idx);
-    }
-
-/*
-
-=item C<INTVAL get_bool()>
-
-Returns true if the idx/key is not C<-1>.
-
-=cut
-
-*/
-
-    VTABLE INTVAL get_bool() {
-        PMC *key;
-        GET_ATTR_key(INTERP, SELF, key);
-        return !PMC_is_null(INTERP, key) &&
-                VTABLE_get_integer(INTERP, key) != -1;
-    }
-
-/*
-
-=item C<INTVAL elements()>
-
-Returns the number of remaining elements in the aggregate. TODO.
-
-=cut
-
-*/
-
-    VTABLE INTVAL elements() {
-        return VTABLE_elements(INTERP, SELF.get_pmc());
-    }
-
-/*
-
-=item C<PMC *get_pmc()>
-
-Returns this Iterator's aggregate.
-
-=cut
-
-*/
-
-    VTABLE PMC *get_pmc() {
-        PMC *agg;
-        GET_ATTR_aggregate(INTERP, SELF, agg);
-        return agg ? agg : PMCNULL;
-    }
-
-/*
 =item C<PMC *get_pmc_keyed(PMC *key)>
 
 Returns the element for C<*key>.
@@ -360,292 +143,6 @@
 
 /*
 
-=item C<PMC *get_pmc_keyed_int(INTVAL key)>
-
-Returns the element for C<key>.
-
-=cut
-
-*/
-
-    VTABLE PMC *get_pmc_keyed_int(INTVAL idx) {
-        PMC * const agg = SELF.get_pmc();
-        PMC        *key;
-
-        GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_get_pmc_keyed_int(INTERP, agg,
-                VTABLE_get_integer(INTERP, key) + idx);
-    }
-
-/*
-
-=item C<void set_integer_native(INTVAL value)>
-
-Reset the Iterator. C<value> must be one of
-
- ITERATE_FROM_START        ... Iterate from start
- ITERATE_FROM_START_KEYS   ... OrderedHash by keys
- ITERATE_FROM_END          ... Arrays only
-
-=cut
-
-*/
-
-    VTABLE void set_integer_native(INTVAL value) {
-        PMC *agg;
-        PMC *key;
-        if (value < ITERATE_FROM_START || value > ITERATE_FROM_END)
-            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
-                    "Illegal set_integer on iterator");
-
-        /* reset iterator on aggregate */
-        agg = SELF.get_pmc();
-
-        GET_ATTR_key(INTERP, SELF, key);
-        if (PMC_is_null(INTERP, key))
-            key = key_new(INTERP);
-
-        SET_ATTR_key(INTERP, SELF,
-                VTABLE_nextkey_keyed(INTERP, key, agg, value));
-    }
-
-/*
-
-=item C<INTVAL pop_integer()>
-
-=cut
-
-*/
-
-    VTABLE INTVAL pop_integer() {
-        PMC * const  agg   = SELF.get_pmc();
-        PMC         *key;
-        INTVAL       ret;
-
-        GET_ATTR_key(INTERP, SELF, key);
-        ret  = VTABLE_get_integer_keyed(INTERP, agg, key);
-        SET_ATTR_key(INTERP, SELF,
-            VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV));
-
-        return ret;
-    }
-
-/*
-
-=item C<FLOATVAL pop_float()>
-
-=cut
-
-*/
-
-    VTABLE FLOATVAL pop_float() {
-        PMC * const    agg = SELF.get_pmc();
-        PMC           *key;
-        FLOATVAL       ret;
-
-        GET_ATTR_key(INTERP, SELF, key);
-        ret = VTABLE_get_number_keyed(INTERP, agg, key);
-        SET_ATTR_key(INTERP, SELF,
-            VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV));
-
-        return ret;
-    }
-
-/*
-
-=item C<STRING *pop_string()>
-
-=cut
-
-*/
-
-    VTABLE STRING *pop_string() {
-        STRING     *ret;
-        PMC        *key;
-        PMC * const agg = SELF.get_pmc();
-
-        GET_ATTR_key(INTERP, SELF, key);
-        ret = VTABLE_get_string_keyed(INTERP, agg, key);
-        SET_ATTR_key(INTERP, SELF,
-            VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV));
-
-        return ret;
-    }
-
-/*
-
-=item C<PMC *pop_pmc()>
-
-Returns the element for the current idx/key and sets the idx/key to
-the previous one.
-
-=cut
-
-*/
-
-    VTABLE PMC *pop_pmc() {
-        PMC * const agg = SELF.get_pmc();
-        PMC        *key;
-        PMC        *ret;
-
-        GET_ATTR_key(INTERP, SELF, key);
-        ret = VTABLE_get_pmc_keyed(INTERP, agg, key);
-        SET_ATTR_key(INTERP, SELF,
-            VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_PREV));
-
-        return ret;
-    }
-
-/*
-
-=item C<INTVAL shift_integer()>
-
-Returns the element for the current idx/key and sets the idx/key to
-the next one.
-
-=cut
-
-*/
-
-    VTABLE INTVAL shift_integer() {
-        INTVAL       ret;
-        PMC         *key;
-        PMC * const  agg = SELF.get_pmc();
-
-        GET_ATTR_key(INTERP, SELF, key);
-        ret = VTABLE_get_integer_keyed(INTERP, agg, key);
-        SET_ATTR_key(INTERP, SELF,
-            VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT));
-
-        return ret;
-    }
-
-/*
-
-=item C<opcode_t *invoke(void *next)>
-
-Return the next element of the aggregate. The return type may depend on
-the aggregate. If there are no more items in the aggregate, I1 .. I4 are
-zero.
-
-See F<docs/pdds/pdd03_calling_conventions.pod>.
-
-=cut
-
-*/
-    VTABLE opcode_t *invoke(void *next) {
-        PMC *agg;
-
-        /* iterator constructor */
-        if (REG_INT(interp, 3) == 1) {
-            PMC * const arg = REG_PMC(interp, 5);
-            PMC *iter;
-
-            if (PObj_is_object_TEST(arg)) {
-                REG_PMC(interp, 5) = VTABLE_get_iter(INTERP, arg);
-                return (opcode_t *)next;
-            }
-
-            REG_PMC(interp, 5) = iter = pmc_new_init(INTERP,
-                    enum_class_Iterator, arg);
-            VTABLE_set_integer_native(INTERP, iter, 0);
-            return (opcode_t *)next;
-        }
-        /* TODO function + sentinel */
-        else if (REG_INT(interp, 3) == 2)
-            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
-                    "Iterator: invoke 2 args");
-
-        REG_INT(interp, 1) =
-            REG_INT(interp, 2) =
-            REG_INT(interp, 3) =
-            REG_INT(interp, 4) = 0;
-
-        agg = SELF.get_pmc();
-
-        {
-            PMC * const res    = SELF.shift_pmc();
-            REG_INT(interp, 3) = 1;
-            REG_PMC(interp, 5) = res;
-            return (opcode_t *)next;
-        }
-    }
-
-/*
-
-=item C<FLOATVAL shift_float()>
-
-=cut
-
-*/
-
-    VTABLE FLOATVAL shift_float() {
-        PMC        *key;
-        PMC * const agg = SELF.get_pmc();
-        FLOATVAL    ret;
-
-        GET_ATTR_key(INTERP, SELF, key);
-        ret = VTABLE_get_number_keyed(INTERP, agg, key);
-        SET_ATTR_key(INTERP, SELF,
-            VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT));
-
-        return ret;
-    }
-
-
-/*
-
-=item C<STRING *shift_string()>
-
-=cut
-
-*/
-
-    VTABLE STRING *shift_string() {
-        PMC        *key;
-        PMC * const agg = SELF.get_pmc();
-        STRING     *ret;
-
-        GET_ATTR_key(INTERP, SELF, key);
-        ret = VTABLE_get_string_keyed(INTERP, agg, key);
-        SET_ATTR_key(INTERP, SELF,
-            VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT));
-
-        return ret;
-    }
-
-/*
-
-=item C<PMC *shift_pmc()>
-
-Returns the element for the current idx/key and sets the idx/key to
-the next one.
-
-=cut
-
-*/
-
-    VTABLE PMC *shift_pmc() {
-        PMC * const agg = SELF.get_pmc();
-        PMC        *ret;
-        PMC        *key;
-
-        GET_ATTR_key(INTERP, SELF, key);
-
-        if (VTABLE_get_integer(INTERP, key) == -1)
-            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
-                "StopIteration");
-
-        ret = VTABLE_get_pmc_keyed(INTERP, agg, key);
-
-        SET_ATTR_key(INTERP, SELF,
-            VTABLE_nextkey_keyed(INTERP, key, agg, ITERATE_GET_NEXT));
-
-        return ret;
-    }
-
-/*
-
 =item C<INTVAL exists_keyed(PMC *key)>
 
 Returns whether an element for C<*key> exists in the aggregate.
@@ -660,24 +157,6 @@
 
 /*
 
-=item C<INTVAL exists_keyed_int(INTVAL idx)>
-
-Returns whether an element for C<idx> exists in the aggregate.
-
-=cut
-
-*/
-
-    VTABLE INTVAL exists_keyed_int(INTVAL idx) {
-        PMC * const agg = SELF.get_pmc();
-        PMC        *key;
-        GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_exists_keyed_int(INTERP, agg,
-                VTABLE_get_integer(INTERP, key) + idx);
-    }
-
-/*
-
 =item C<INTVAL defined()>
 
 Returns whether the iterator contains an aggregate.
@@ -702,39 +181,34 @@
         return VTABLE_defined_keyed(INTERP, SELF.get_pmc(), key);
     }
 
-/*
 
-=item C<INTVAL defined_keyed_int(INTVAL key)>
+    VTABLE PMC *get_iter() {
+        return SELF;
+    }
 
-Returns the result of calling C<defined_keyed(key)> on the aggregate.
+    /* Make the shift_pmc vtable function available as
+     * a method named "next" */
+     METHOD next() {
+        PMC * const next = VTABLE_shift_pmc(INTERP, SELF);
+        RETURN(PMC* next);
+     }
 
-=cut
-
-*/
+/*
 
-    VTABLE INTVAL defined_keyed_int(INTVAL idx) {
-        PMC * const agg = SELF.get_pmc();
-        PMC        *key;
+=item C<void set_integer_native(INTVAL value)>
 
-        GET_ATTR_key(INTERP, SELF, key);
-        return VTABLE_defined_keyed_int(INTERP, agg,
-                VTABLE_get_integer(INTERP, key) + idx);
-    }
+Restart iterator
 
-    VTABLE PMC *get_iter() {
-        return SELF;
-    }
+=cut
 
-    METHOD set_key(PMC *key) {
-        SET_ATTR_key(INTERP, SELF, key);
-    }
+*/
+    VTABLE void set_integer_native(INTVAL value) {
+        PMC *self = SELF;
+        PARROT_ASSERT(!"Iterator: implementation have to override this method");
 
-    METHOD get_key() {
-        PMC *key;
-        GET_ATTR_key(INTERP, SELF, key);
-        RETURN(PMC *key);
+        Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_UNIMPLEMENTED,
+                "Iterator: unimplemented method");
     }
-
 }
 
 /*

Modified: branches/ops_pct/src/pmc/key.pmc
==============================================================================
--- branches/ops_pct/src/pmc/key.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/key.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -306,95 +306,6 @@
 
 /*
 
-=item C<PMC *nextkey_keyed(PMC *key, INTVAL what)>
-
-Returns the next key relative to the location specified in C<what>.
-int_key == -1 means end of iteration.
-
-=cut
-
-*/
-
-    VTABLE PMC *nextkey_keyed(PMC *agg, INTVAL what) {
-        PMC  * const ret = SELF;
-        const INTVAL n   = VTABLE_elements(INTERP, agg);
-        INTVAL       int_key;
-
-        switch (what) {
-            case ITERATE_FROM_START_KEYS:
-                /*
-                 * OrderedHash supports two iterators: by key
-                 * or by ordered values
-                 */
-                PObj_get_FLAGS(ret) &= ~KEY_type_FLAGS;
-                PObj_get_FLAGS(ret) |=  KEY_integer_FLAG;
-
-                if (agg->vtable->base_type == enum_class_OrderedHash)
-                    PObj_get_FLAGS(ret) |= KEY_number_FLAG;
-
-                goto init;
-            case ITERATE_FROM_START:    /* reset key */
-                PObj_get_FLAGS(ret) &= ~KEY_type_FLAGS;
-                PObj_get_FLAGS(ret) |= KEY_integer_FLAG;
-
-                /*
-                 * KEY_hash_iterator_FLAGS, which is the same as
-                 * KEY_integer_FLAG | KEY_number_FLAG
-                 * indicates a hash iterator operation
-                 * KEY_integer_FLAG alone is an indexed hash lookup
-                 * with an Integer KEY
-                 */
-
-                 if (VTABLE_isa(INTERP, agg, CONST_STRING(interp, "Hash"))
-                 &&  agg->vtable->base_type != enum_class_OrderedHash)
-                    PObj_get_FLAGS(ret) |= KEY_hash_iterator_FLAGS;
-        init:
-                if (!n) {
-                    SET_ATTR_int_key(INTERP, ret, -1);
-                }
-                else {
-                    SET_ATTR_int_key(INTERP, ret, 0);
-                }
-
-                /* iterating over a hash additionally needs the Bucket index */
-                if (KEY_IS_HASH_ITERATOR(ret))
-                    SET_ATTR_next_key(INTERP, ret, (PMC *)INITBucketIndex);
-
-                break;
-            case ITERATE_GET_NEXT:
-                /*
-                 * src/hash.c:parrot_hash_get_idx() advances to next
-                 * so, if we are iterating over a hash do nothing
-                 * */
-                if (!KEY_IS_HASH_ITERATOR(ret)) {
-                    GET_ATTR_int_key(INTERP, ret, int_key);
-                    if (int_key < n - 1) {
-                        SET_ATTR_int_key(INTERP, ret, int_key+1);
-                    }
-                    else {
-                        SET_ATTR_int_key(INTERP, ret, -1);
-                    }
-                }
-                break;
-            case ITERATE_GET_PREV:
-                GET_ATTR_int_key(INTERP, ret, int_key);
-                if (int_key >= 0)
-                    SET_ATTR_int_key(INTERP, ret, int_key-1);
-                break;
-            case ITERATE_FROM_END:
-                PObj_get_FLAGS(ret) &= ~KEY_type_FLAGS;
-                PObj_get_FLAGS(ret) |= KEY_integer_FLAG;
-                SET_ATTR_int_key(INTERP, ret, n-1);
-                break;
-            default:
-                Parrot_ex_throw_from_c_args(interp, NULL,
-                    EXCEPTION_INVALID_OPERATION,
-                    "Unknown iterator type in Key.nextkey_keyed: %d", what);
-        }
-        return ret;
-    }
-/*
-
 =item C<void visit(visit_info *info)>
 
 This is used by freeze/thaw to visit the contents of the Key.

Modified: branches/ops_pct/src/pmc/namespace.pmc
==============================================================================
--- branches/ops_pct/src/pmc/namespace.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/namespace.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -396,7 +396,8 @@
     }
 
     VTABLE PMC *get_pmc_keyed(PMC *key) {
-        PMC    *ns = SUPER(key);
+        /* PMC    *ns = SUPER(key); */
+        PMC    *ns = INTERP->vtables[enum_class_Hash]->get_pmc_keyed(INTERP, SELF, key);
 
         if (!PMC_IS_NULL(ns))
             return ns;

Modified: branches/ops_pct/src/pmc/object.pmc
==============================================================================
--- branches/ops_pct/src/pmc/object.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/object.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -646,7 +646,6 @@
     Parrot_Object_attributes * const obj = PARROT_OBJECT(pmc);
         Parrot_Class_attributes  * const _class    = PARROT_CLASS(obj->_class);
         STRING        * const meth_name = CONST_STRING(interp, "clone");
-        PMC           * cloned;
 
         /* See if we have a custom override of the method first. */
         const int num_classes = VTABLE_elements(interp, _class->all_parents);

Modified: branches/ops_pct/src/pmc/orderedhash.pmc
==============================================================================
--- branches/ops_pct/src/pmc/orderedhash.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/orderedhash.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -77,6 +77,20 @@
 
 /*
 
+=item C<PMC *get_iter()>
+
+Return a new iterator
+
+=cut
+
+*/
+
+    VTABLE PMC *get_iter() {
+        return pmc_new_init(INTERP, enum_class_OrderedHashIterator, SELF);
+    }
+
+/*
+
 =item C<PMC *get_pmc_keyed(PMC *key)>
 
 =item C<PMC *get_pmc_keyed_int(INTVAL key)>
@@ -119,7 +133,7 @@
             return VTABLE_get_pmc_keyed(INTERP, item, next);
         }
 
-        return SUPER(key);
+        return INTERP->vtables[enum_class_Hash]->get_pmc_keyed(INTERP, SELF, key);
     }
 
 /*
@@ -167,7 +181,7 @@
             return VTABLE_get_string_keyed(INTERP, item, next);
         }
 
-        return SUPER(key);
+        return INTERP->vtables[enum_class_Hash]->get_string_keyed(INTERP, SELF, key);
     }
 /*
 
@@ -216,7 +230,7 @@
             return VTABLE_get_integer_keyed(INTERP, item, next);
         }
 
-        return SUPER(key);
+        return INTERP->vtables[enum_class_Hash]->get_integer_keyed(INTERP, SELF, key);
     }
 
 /*

Copied: branches/ops_pct/src/pmc/orderedhashiterator.pmc (from r40255, trunk/src/pmc/orderedhashiterator.pmc)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/src/pmc/orderedhashiterator.pmc	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/src/pmc/orderedhashiterator.pmc)
@@ -0,0 +1,265 @@
+/*
+Copyright (C) 2001-2009, Parrot Foundation.
+$Id$
+
+=head1 NAME
+
+src/pmc/orderedhashiterator.pmc - Implementation of Iterator for OrderedHash.
+
+=head1 DESCRIPTION
+
+=head1 SYNOPSIS
+
+=head1 Methods
+
+=over 4
+
+=cut
+
+*/
+
+#include "pmc_hash.h"
+#include "pmc_hashiteratorkey.h"
+
+pmclass OrderedHashIterator extends Iterator no_ro {
+    ATTR PMC        *pmc_hash;      /* the Hash which this Iterator iterates */
+    ATTR Hash       *parrot_hash;   /* Underlying implementation of hash */
+    ATTR INTVAL      pos;           /* */
+    ATTR INTVAL      elements;      /* How many elements left to iterate over */
+    ATTR INTVAL      reverse;       /* Direction of iteration. 1 - for reverse iteration */
+
+/*
+
+=item C<void init_pmc(PMC *initializer)>
+
+Initializes the iterator with an aggregate PMC.
+Defaults iteration mode to iterate from start.
+
+=cut
+
+*/
+
+    VTABLE void init_pmc(PMC *hash) {
+        Parrot_OrderedHashIterator_attributes * const attrs =
+            mem_allocate_zeroed_typed(Parrot_OrderedHashIterator_attributes);
+
+        attrs->pmc_hash         = hash;
+        attrs->parrot_hash      = (Hash*)VTABLE_get_pointer(INTERP, hash);
+        attrs->pos              = 0;
+        /* Will be decreased on initial advance_to_next */
+        /* XXX Do we really need to support this use-case ? */
+        attrs->elements         = attrs->parrot_hash->entries;
+        PMC_data(SELF)          = attrs;
+
+        PObj_custom_mark_destroy_SETALL(SELF);
+    }
+
+/*
+
+=item C<void destroy()>
+
+destroys this PMC
+
+=cut
+
+*/
+
+    VTABLE void destroy() {
+        mem_sys_free(PMC_data(SELF));
+    }
+
+/*
+
+=item C<void mark()>
+
+Marks the hash as live.
+
+=cut
+
+*/
+
+    VTABLE void mark() {
+        PMC * const hash = PARROT_ORDEREDHASHITERATOR(SELF)->pmc_hash;
+        if (hash)
+             Parrot_gc_mark_PObj_alive(INTERP, (PObj *)hash);
+    }
+
+/*
+
+=item C<PMC *clone()>
+
+=cut
+
+*/
+    VTABLE PMC* clone() {
+        return PMCNULL;
+    }
+
+/*
+
+=item C<void set_integer_native()>
+
+=cut
+
+*/
+    VTABLE void set_integer_native(INTVAL value) {
+        Parrot_OrderedHashIterator_attributes * const attrs =
+                PARROT_ORDEREDHASHITERATOR(SELF);
+
+        /* Restart iterator */
+        attrs->elements         = attrs->parrot_hash->entries;
+        if (value == ITERATE_FROM_START || value == ITERATE_FROM_START_KEYS) {
+            attrs->pos      = 0;
+            attrs->reverse  = 0;
+            return;
+        }
+        else if (value == ITERATE_FROM_END) {
+            attrs->pos      = attrs->elements;
+            attrs->reverse  = 1;
+            return;
+        }
+
+        Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
+                "HashIterator: unknown iterator type");
+    };
+
+/*
+
+=item C<PMC *get_pmc()>
+
+Returns this Iterator's Hash.
+
+=cut
+*/
+    VTABLE PMC* get_pmc() {
+        return PARROT_ORDEREDHASHITERATOR(SELF)->pmc_hash;
+    }
+
+/*
+
+=item C<INTVAL get_bool()>
+
+Returns true if there is more elements to iterate over.
+
+=cut
+
+*/
+
+    VTABLE INTVAL get_bool() {
+        return STATICSELF.elements() > 0;
+    }
+
+/*
+
+=item C<INTVAL elements()>
+
+Returns the number of remaining elements in the Hash.
+
+=cut
+
+*/
+
+    VTABLE INTVAL elements() {
+        return PARROT_ORDEREDHASHITERATOR(SELF)->elements;
+    }
+
+    VTABLE INTVAL get_integer() {
+        return SELF.elements();
+    }
+
+/*
+
+=item C<PMC *shift_pmc()>
+
+Returns the HashIteratorKey for the current position and advance
+the next one.
+
+=cut
+
+*/
+
+    VTABLE PMC *shift_pmc() {
+        Parrot_OrderedHashIterator_attributes * const attrs =
+                PARROT_ORDEREDHASHITERATOR(SELF);
+
+        PMC        *ret;
+        HashBucket *bucket;
+
+        if (!attrs->elements)
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        /* Get bucket and move to next bucket */
+        do {
+            bucket = attrs->parrot_hash->bs + attrs->pos++;
+            attrs->elements--;
+        } while (attrs->elements && !bucket->key);
+
+        /* Reuse HashIteratorKey */
+        ret = pmc_new(INTERP, enum_class_HashIteratorKey);
+        /* Poke directly into HIK. We don't want to create any kind of public API for this */
+        PARROT_HASHITERATORKEY(ret)->parrot_hash = attrs->parrot_hash;
+        PARROT_HASHITERATORKEY(ret)->bucket      = bucket;
+
+        return ret;
+    }
+
+/*
+
+=item C<PMC *pop_pmc()>
+
+Returns the HashIteratorKey for the current position and advance
+the next one for reverse iterator.
+
+=cut
+
+*/
+
+    VTABLE PMC *pop_pmc() {
+        Parrot_OrderedHashIterator_attributes * const attrs =
+                PARROT_ORDEREDHASHITERATOR(SELF);
+
+        PMC        *ret;
+        HashBucket *bucket;
+
+        if (!attrs->elements)
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        /* Get bucket and move to next bucket */
+        bucket = attrs->parrot_hash->bs + --attrs->pos;
+        attrs->elements--;
+
+        /* Reuse HashIteratorKey */
+        ret = pmc_new(INTERP, enum_class_HashIteratorKey);
+        /* Poke directly into HIK. We don't want to create any kind of public API for this */
+        PARROT_HASHITERATORKEY(ret)->parrot_hash = attrs->parrot_hash;
+        PARROT_HASHITERATORKEY(ret)->bucket      = bucket;
+
+        return ret;
+    }
+
+/*
+
+*/
+
+    VTABLE STRING* shift_string() {
+        PMC * const key = SELF.shift_pmc();
+        return VTABLE_get_string(INTERP, key);
+    }
+}
+
+/*
+
+=back
+
+=cut
+
+*/
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Modified: branches/ops_pct/src/pmc/os.pmc
==============================================================================
--- branches/ops_pct/src/pmc/os.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/os.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -219,6 +219,9 @@
 
 =cut
 
+TT #849:  Provide a mechanism for setting 'mtime' and 'atime':
+https://trac.parrot.org/parrot/ticket/849
+
 */
 
     METHOD stat(STRING *path) {
@@ -509,6 +512,7 @@
 thrown.
 
 =cut
+
 */
     METHOD rename(STRING *oldpath, STRING *newpath) {
         char * const coldpath = Parrot_str_to_cstring(interp, oldpath);

Modified: branches/ops_pct/src/pmc/pmcproxy.pmc
==============================================================================
--- branches/ops_pct/src/pmc/pmcproxy.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/pmcproxy.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -94,7 +94,7 @@
         _pmc->all_parents      = pmc_new(interp, enum_class_ResizablePMCArray);
         _pmc->roles            = pmc_new(interp, enum_class_ResizablePMCArray);
         _pmc->methods          = pmc_new(interp, enum_class_Hash);
-        _pmc->vtable_overrides = constant_pmc_new(interp, enum_class_Hash);
+        _pmc->vtable_overrides = pmc_new(interp, enum_class_Hash);
         _pmc->parent_overrides = pmc_new(interp, enum_class_Hash);
         _pmc->attrib_metadata  = pmc_new(interp, enum_class_Hash);
         _pmc->attrib_index     = PMCNULL;
@@ -202,59 +202,6 @@
 
 /*
 
-=item C<void destroy()>
-
-Free the memory associated with the object's underlying struct.
-
-=cut
-
-*/
-
-    VTABLE void destroy() {
-        mem_sys_free(PMC_data(SELF));
-    }
-
-/*
-
-=item C<void mark()>
-
-Mark any referenced strings and PMCs in the structure as live.
-
-=cut
-
-*/
-
-    VTABLE void mark() {
-        Parrot_Class_attributes * const _pmc = PARROT_CLASS(SELF);
-
-        if (_pmc->name)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->name);
-        if (_pmc->_namespace)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->_namespace);
-        if (_pmc->parents)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->parents);
-        if (_pmc->all_parents)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->all_parents);
-        if (_pmc->roles)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->roles);
-        if (_pmc->methods)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->methods);
-        if (_pmc->vtable_overrides)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->vtable_overrides);
-        if (_pmc->parent_overrides)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->parent_overrides);
-        if (_pmc->attrib_metadata)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->attrib_metadata);
-        if (_pmc->attrib_index)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->attrib_index);
-        if (_pmc->attrib_cache)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->attrib_cache);
-        if (_pmc->resolve_method)
-            Parrot_gc_mark_PObj_alive(interp, (PObj *)_pmc->resolve_method);
-    }
-
-/*
-
 =item C<INTVAL isa_pmc(PMC *classname)>
 
 Returns whether the class is or inherits from C<*classname>.

Modified: branches/ops_pct/src/pmc/string.pmc
==============================================================================
--- branches/ops_pct/src/pmc/string.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/string.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -647,27 +647,42 @@
 */
 
     VTABLE STRING *get_string_keyed(PMC *key) {
+        return SELF.get_string_keyed_int(VTABLE_get_integer(INTERP, key));
+    }
+
+    VTABLE STRING *get_string_keyed_int(INTVAL pos) {
         STRING * const s = SELF.get_string();
-        const INTVAL   k = VTABLE_get_integer(INTERP, key);
-        return Parrot_str_substr(INTERP, s, k, 1, NULL, 0);
+        return Parrot_str_substr(INTERP, s, pos, 1, NULL, 0);
     }
 
     VTABLE INTVAL get_integer_keyed(PMC *key) {
+        return SELF.get_integer_keyed_int(VTABLE_get_integer(INTERP, key));
+    }
+
+    VTABLE INTVAL get_integer_keyed_int(INTVAL pos) {
         STRING * const s = SELF.get_string();
-        return string_ord(INTERP, s, VTABLE_get_integer(INTERP, key));
+        return string_ord(INTERP, s, pos);
     }
 
     VTABLE void set_string_keyed(PMC *key, STRING * const value) {
+        SELF.set_string_keyed_int(VTABLE_get_integer(INTERP, key), value);
+    }
+
+    VTABLE void set_string_keyed_int(INTVAL pos, STRING * const value) {
         STRING * const s   = SELF.get_string();
         const INTVAL   len = Parrot_str_byte_length(INTERP, value);
-        Parrot_str_replace(INTERP, s, VTABLE_get_integer(INTERP, key), len, value, NULL);
+        Parrot_str_replace(INTERP, s, pos, len, value, NULL);
         VTABLE_set_string_native(INTERP, SELF, s);
     }
 
     VTABLE void set_integer_keyed(PMC *key, INTVAL value) {
+        SELF.set_integer_keyed_int(VTABLE_get_integer(INTERP, key), value);
+    }
+
+    VTABLE void set_integer_keyed_int(INTVAL pos, INTVAL value) {
         STRING * const s = SELF.get_string();
         STRING * const c = string_chr(INTERP, (UINTVAL) value);
-        Parrot_str_replace(INTERP, s, VTABLE_get_integer(INTERP, key), 1, c, NULL);
+        Parrot_str_replace(INTERP, s, pos, 1, c, NULL);
         VTABLE_set_string_native(INTERP, SELF, s);
     }
 /*
@@ -796,19 +811,7 @@
     }
 
     VTABLE PMC *get_iter() {
-        STRING     *name     = CONST_STRING(interp, "set_key");
-        PMC * const iter     = pmc_new_init(INTERP, enum_class_Iterator, SELF);
-        PMC * const key      = pmc_new(INTERP, enum_class_Key);
-
-        Parrot_PCCINVOKE(interp, iter, name, "P->", key);
-        PObj_get_FLAGS(key) |= KEY_integer_FLAG;
-
-        if (!Parrot_str_byte_length(INTERP, VTABLE_get_string(INTERP, SELF)))
-            VTABLE_set_integer_native(INTERP, key, -1);
-        else
-            VTABLE_set_integer_native(INTERP, key, 0);
-
-        return iter;
+        return pmc_new_init(INTERP, enum_class_StringIterator, SELF);
     }
 
 /*

Copied: branches/ops_pct/src/pmc/stringiterator.pmc (from r40255, trunk/src/pmc/stringiterator.pmc)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/src/pmc/stringiterator.pmc	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/src/pmc/stringiterator.pmc)
@@ -0,0 +1,362 @@
+/*
+Copyright (C) 2001-2009, Parrot Foundation.
+$Id$
+
+=head1 NAME
+
+src/pmc/stringiterator.pmc - StringIterator PMC
+
+=head1 DESCRIPTION
+
+Implementation of Iterator for String PMC.
+
+=head1 SYNOPSIS
+
+
+=head1 Methods
+
+=over 4
+
+=cut
+
+*/
+
+
+pmclass StringIterator extends Iterator {
+    ATTR PMC    *string;    /* String to iterate over */
+    ATTR INTVAL  pos;       /* Current position of iterator for forward iterator */
+                            /* Previous position of iterator for reverse iterator */
+    ATTR INTVAL  length;    /* Length of C<string> */
+    ATTR INTVAL  reverse;   /* Direction of iteration. 1 - for reverse iteration */
+
+/*
+
+=item C<void init_pmc()>
+
+Initialize StringIterator.
+
+=cut
+
+*/
+    VTABLE void init_pmc(PMC *string) {
+        Parrot_StringIterator_attributes * const attrs =
+            mem_allocate_zeroed_typed(Parrot_StringIterator_attributes);
+
+        attrs->string    = string;
+        PMC_data(SELF)   = attrs;
+
+        PObj_custom_mark_destroy_SETALL(SELF);
+
+        /* by default, iterate from start */
+        SELF.set_integer_native(ITERATE_FROM_START);
+    }
+
+/*
+
+=item C<void destroy()>
+
+destroys this PMC
+
+=cut
+
+*/
+
+    VTABLE void destroy() {
+        mem_sys_free(PMC_data(SELF));
+    }
+
+/*
+
+=item C<void mark()>
+
+Marks the current idx/key and the aggregate as live.
+
+=cut
+
+*/
+
+    VTABLE void mark() {
+        PMC *string;
+        GET_ATTR_string(INTERP, SELF, string);
+        if (string)
+             Parrot_gc_mark_PObj_alive(INTERP, (PObj *)string);
+    }
+
+/*
+
+=item C<PMC *clone()>
+
+=cut
+
+*/
+    VTABLE PMC* clone() {
+        Parrot_StringIterator_attributes * const attrs =
+                PARROT_STRINGITERATOR(SELF);
+        PMC                              * const clone =
+                pmc_new_init(INTERP, enum_class_StringIterator, attrs->string);
+        Parrot_StringIterator_attributes * const clone_attrs =
+                PARROT_STRINGITERATOR(clone);
+
+        clone_attrs->pos     = attrs->pos;
+        clone_attrs->reverse = attrs->reverse;
+        return clone;
+    }
+
+/*
+
+=item C<INTVAL get_bool()>
+
+Returns true if there is more elements to iterate over.
+
+=cut
+
+*/
+
+    VTABLE INTVAL get_bool() {
+        return SELF.elements() > 0;
+    }
+
+/*
+
+=item C<INTVAL elements()>
+
+Returns the number of remaining elements in the C<string>.
+
+=cut
+
+*/
+
+    VTABLE INTVAL elements() {
+        Parrot_StringIterator_attributes * const attrs =
+                PARROT_STRINGITERATOR(SELF);
+        if (attrs->reverse)
+            return attrs->pos;
+        else
+            return attrs->length - attrs->pos;
+    }
+
+    VTABLE INTVAL get_integer() {
+        return SELF.elements();
+    }
+
+/*
+
+=item C<void set_integer_native(INTVAL value)>
+
+Reset the Iterator. C<value> must be one of
+
+ ITERATE_FROM_START        ... Iterate from start
+ ITERATE_FROM_END          ... Iterate from end
+
+=cut
+
+*/
+
+    VTABLE void set_integer_native(INTVAL value) {
+        Parrot_StringIterator_attributes * const attrs =
+                PARROT_STRINGITERATOR(SELF);
+        if (value == ITERATE_FROM_START) {
+            attrs->reverse   = 0;
+            attrs->pos       = 0;
+            attrs->length    = VTABLE_elements(INTERP, attrs->string);
+        }
+        else if (value == ITERATE_FROM_END) {
+            attrs->reverse   = 1;
+            attrs->pos       = attrs->length
+                             = VTABLE_elements(INTERP, attrs->string);
+        }
+        else
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
+                    "Wrong direction for StringIterator");
+    }
+
+/*
+
+=item C<PMC *get_pmc()>
+
+Returns this Iterator's string.
+
+=cut
+
+*/
+
+    VTABLE PMC *get_pmc() {
+        PMC *string;
+        GET_ATTR_string(INTERP, SELF, string);
+        return string ? string : PMCNULL;
+    }
+
+/*
+
+=item C<STRING *shift_pmc()>
+
+Shift next character from C<string> as PMC.
+
+=cut
+
+*/
+    VTABLE PMC *shift_pmc() {
+        Parrot_StringIterator_attributes * const attrs =
+                PARROT_STRINGITERATOR(SELF);
+        PMC *ret;
+
+        if (attrs->pos >= attrs->length)
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        ret = pmc_new(INTERP, Parrot_get_ctx_HLL_type(interp, enum_class_String));
+        VTABLE_set_string_native(INTERP, ret,
+                VTABLE_get_string_keyed_int(INTERP, attrs->string, attrs->pos++));
+        return ret;
+    }
+
+/*
+
+=item C<STRING *shift_string()>
+
+Shift next character from C<string>.
+
+=cut
+
+*/
+    VTABLE STRING *shift_string() {
+        Parrot_StringIterator_attributes * const attrs =
+                PARROT_STRINGITERATOR(SELF);
+
+        if (attrs->pos >= attrs->length)
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_string_keyed_int(INTERP, attrs->string, attrs->pos++);
+    }
+
+/*
+
+=item C<INTVAL shift_integer()>
+
+Shift next character code from C<string>.
+
+=cut
+
+*/
+    VTABLE INTVAL shift_integer() {
+        Parrot_StringIterator_attributes * const attrs =
+                PARROT_STRINGITERATOR(SELF);
+
+        if (attrs->pos >= attrs->length)
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_integer_keyed_int(INTERP, attrs->string, attrs->pos++);
+    }
+
+/*
+
+=item C<STRING *pop_pmc()>
+
+Shift "next" character from C<string> for reverse iterator as PMC.
+
+=cut
+
+*/
+    VTABLE PMC *pop_pmc() {
+        Parrot_StringIterator_attributes * const attrs =
+                PARROT_STRINGITERATOR(SELF);
+        PMC *ret;
+
+        if (!STATICSELF.get_bool())
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        ret = pmc_new(INTERP, Parrot_get_ctx_HLL_type(interp, enum_class_String));
+        VTABLE_set_string_native(INTERP, ret,
+                VTABLE_get_string_keyed_int(INTERP, attrs->string, --attrs->pos));
+        return ret;
+    }
+
+/*
+
+=item C<STRING *pop_string()>
+
+Shift "next" character from C<string> for reverse iterator.
+
+=cut
+
+*/
+    VTABLE STRING *pop_string() {
+        Parrot_StringIterator_attributes * const attrs =
+                PARROT_STRINGITERATOR(SELF);
+
+        if (!STATICSELF.get_bool())
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_string_keyed_int(INTERP, attrs->string, --attrs->pos);
+    }
+
+/*
+
+=item C<INTVAL pop_integer()>
+
+Shift "next" character code from C<string> for reverse iterator.
+
+=cut
+
+*/
+    VTABLE INTVAL pop_integer() {
+        Parrot_StringIterator_attributes * const attrs =
+                PARROT_STRINGITERATOR(SELF);
+
+        if (!STATICSELF.get_bool())
+            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_OUT_OF_BOUNDS,
+                "StopIteration");
+
+        return VTABLE_get_integer_keyed_int(INTERP, attrs->string, --attrs->pos);
+    }
+
+/*
+
+=item C<INTVAL get_integer_keyed_int(INTVAL idx)>
+
+Get integer value of current position plus idx.
+
+=cut
+
+*/
+
+    VTABLE INTVAL get_integer_keyed_int(INTVAL idx) {
+        return VTABLE_get_integer_keyed_int(INTERP, STATICSELF.get_pmc(),
+                PARROT_STRINGITERATOR(SELF)->pos + idx);
+    }
+
+/*
+
+=item C<STRING *get_string_keyed_int(INTVAL idx)>
+
+Get string value of current position plus idx.
+
+=cut
+
+*/
+
+    VTABLE STRING *get_string_keyed_int(INTVAL idx) {
+        return VTABLE_get_string_keyed_int(INTERP, STATICSELF.get_pmc(),
+                PARROT_STRINGITERATOR(SELF)->pos + idx);
+    }
+}
+
+
+/*
+
+=back
+
+=cut
+
+*/
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */

Modified: branches/ops_pct/src/pmc/sub.pmc
==============================================================================
--- branches/ops_pct/src/pmc/sub.pmc	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc/sub.pmc	Fri Jul 24 19:42:02 2009	(r40257)
@@ -222,7 +222,6 @@
         Parrot_sub     *sub;
         Parrot_Context *caller_ctx;
         Parrot_Context *context;
-        Parrot_Context *c;
         PMC            *ccont;
         opcode_t       *pc;
 
@@ -318,6 +317,7 @@
         }
         else {
             /* autoclose */
+            Parrot_Context *c;
             for (c = context; !c->outer_ctx; c = c->outer_ctx) {
 
                 PMC         *outer_pmc;
@@ -765,7 +765,7 @@
         /* If the argument info hasn't been generated yet, generate it. */
         if (!sub->arg_info) {
             /* Get pointer into the bytecode where this sub starts. */
-            opcode_t *pc = sub->seg->base.data + sub->start_offs;
+            const opcode_t *pc = sub->seg->base.data + sub->start_offs;
 
             /* Allocate structure to store argument information in. */
             sub->arg_info = mem_allocate_zeroed_typed(Parrot_sub_arginfo);

Modified: branches/ops_pct/src/pmc_freeze.c
==============================================================================
--- branches/ops_pct/src/pmc_freeze.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/pmc_freeze.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1661,6 +1661,11 @@
 
         PARROT_ASSERT(current->vtable);
 
+        /* Workaround for thawing constants. Clear constant flag */
+        /* See src/packfile.c:3999 */
+        if (thawing)
+            PObj_constant_CLEAR(current);
+
         VTABLE_visit(interp, current, info);
 
         if (thawing) {

Modified: branches/ops_pct/src/runcore/trace.c
==============================================================================
--- branches/ops_pct/src/runcore/trace.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/runcore/trace.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -161,9 +161,7 @@
         Parrot_io_eprintf(debugger, "Complex=PMC(%#p: %Ss)",
                 pmc, s);
     }
-    else if (pmc->vtable->base_type == enum_class_RetContinuation
-            ||  pmc->vtable->base_type == enum_class_Continuation
-            ||  pmc->vtable->base_type == enum_class_Sub) {
+    else if (pmc->vtable->base_type == enum_class_Sub) {
         PMC_get_sub(interp, pmc, sub);
         Parrot_io_eprintf(debugger, "%S=PMC(%#p pc:%d)",
                 VTABLE_name(interp, pmc), pmc, sub->start_offs);
@@ -290,21 +288,7 @@
 
     s = 1;
     len = Parrot_io_eprintf(debugger, "%6vu ", (UINTVAL)(pc - code_start));
-    if (STREQ(info->name, "infix")) {
-        /* this should rather be MMD_opcode_name, which doesn't
-         * exit yet
-         */
-        len += Parrot_io_eprintf(debugger, "%s",
-                Parrot_MMD_method_name(interp, pc[1]) + 2);
-        s = 2;
-    }
-    else if (STREQ(info->name, "n_infix")) {
-        len += Parrot_io_eprintf(debugger, "n_%s",
-                Parrot_MMD_method_name(interp, pc[1]) + 2);
-        s = 2;
-    }
-    else
-        len += Parrot_io_eprintf(debugger, "%s", info->name);
+    len += Parrot_io_eprintf(debugger, "%s", info->name);
 
     n = info->op_count;
     var_args = 0;

Modified: branches/ops_pct/src/scheduler.c
==============================================================================
--- branches/ops_pct/src/scheduler.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/scheduler.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1005,7 +1005,7 @@
 Parrot_cx_schedule_sleep(PARROT_INTERP, FLOATVAL time, ARGIN_NULLOK(opcode_t *next))
 {
     ASSERT_ARGS(Parrot_cx_schedule_sleep)
-#if PARROT_HAS_THREADS
+#ifdef PARROT_HAS_THREADS
     Parrot_cond condition;
     Parrot_mutex lock;
     const FLOATVAL timer_end = time + Parrot_floatval_time();

Modified: branches/ops_pct/src/spf_render.c
==============================================================================
--- branches/ops_pct/src/spf_render.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/spf_render.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -180,11 +180,10 @@
             Parrot_str_chopn_inplace(interp, str, len);
             len = 0;
         }
-        else
-            if (info->flags & FLAG_PREC && info->prec < len) {
-                Parrot_str_chopn_inplace(interp, str, -(INTVAL)(info->prec));
-                len = info->prec;
-            }
+        else if (info->flags & FLAG_PREC && info->prec < len) {
+            Parrot_str_chopn_inplace(interp, str, -(INTVAL)(info->prec));
+            len = info->prec;
+        }
     }
 
     if ((info->flags & FLAG_WIDTH) && info->width > len) {
@@ -259,51 +258,53 @@
 gen_sprintf_call(ARGOUT(char *out), ARGMOD(SpfInfo *info), int thingy)
 {
     ASSERT_ARGS(gen_sprintf_call)
-    int i    = 0;
-    out[i++] = '%';
 
-    if (info->flags) {
-        if (info->flags & FLAG_MINUS)
-            out[i++] = '-';
+    const int flags = info->flags;
+    char *p = out;
+    *p++ = '%';
 
-        if (info->flags & FLAG_PLUS)
-            out[i++] = '+';
+    if (flags) {
+        if (flags & FLAG_MINUS)
+            *p++ = '-';
 
-        if (info->flags & FLAG_ZERO)
-            out[i++] = '0';
+        if (flags & FLAG_PLUS)
+            *p++ = '+';
 
-        if (info->flags & FLAG_SPACE)
-            out[i++] = ' ';
+        if (flags & FLAG_ZERO)
+            *p++ = '0';
 
-        if (info->flags & FLAG_SHARP)
-            out[i++] = '#';
-    }
+        if (flags & FLAG_SPACE)
+            *p++ = ' ';
 
-    if (info->flags & FLAG_WIDTH) {
-        if (info->width > PARROT_SPRINTF_BUFFER_SIZE - 1)
-            info->width = PARROT_SPRINTF_BUFFER_SIZE;
+        if (flags & FLAG_SHARP)
+            *p++ = '#';
 
-        i += sprintf(out + i, "%u", (unsigned)info->width);
-    }
+        if (flags & FLAG_WIDTH) {
+            if (info->width > PARROT_SPRINTF_BUFFER_SIZE - 1)
+                info->width = PARROT_SPRINTF_BUFFER_SIZE;
 
-    if (info->flags & FLAG_PREC) {
-        if (info->prec > PARROT_SPRINTF_MAX_PREC)
-            info->prec = PARROT_SPRINTF_MAX_PREC;
+            p += sprintf(p, "%u", (unsigned)info->width);
+        }
+
+        if (flags & FLAG_PREC) {
+            if (info->prec > PARROT_SPRINTF_MAX_PREC)
+                info->prec = PARROT_SPRINTF_MAX_PREC;
 
-        out[i++] = '.';
-        i       += sprintf(out + i, "%u", (unsigned)info->prec);
+            *p++ = '.';
+            p += sprintf(p, "%u", (unsigned)info->prec);
+        }
     }
 
     if (thingy == 'd' || thingy == 'i' ||thingy == 'u') {
         /* the u?int isa HUGEU?INTVAL aka long long
          * the 'll' modifier is specced in susv3 - hopefully all our
          * compilers support it too */
-        out[i++] = 'l';
-        out[i++] = 'l';
+        *p++ = 'l';
+        *p++ = 'l';
     }
 
-    out[i++] = (char)thingy;
-    out[i]   = '\0';
+    *p++ = (char)thingy;
+    *p = '\0';
 }
 
 
@@ -332,7 +333,7 @@
     HUGEINTVAL num;
 
     /* start with a buffer; double the pattern length to avoid realloc #1 */
-    STRING *targ = Parrot_str_new_noinit(interp, enum_stringrep_one, pat_len << 1);
+    STRING *targ = Parrot_str_new_noinit(interp, enum_stringrep_one, pat_len * 2);
 
     /* ts is used almost universally as an intermediate target;
      * tc is used as a temporary buffer by Parrot_str_from_uint and
@@ -831,8 +832,8 @@
                                                              ((PMC *)obj->data),
                                                              (obj->index));
 
-                                STRING *string = (VTABLE_get_repr(interp, tmp));
-                                STRING *ts     = handle_flags(interp, &info,
+                                STRING * const string = (VTABLE_get_repr(interp, tmp));
+                                STRING * const ts     = handle_flags(interp, &info,
                                                     string, 0, NULL);
                                 obj->index++;
 

Modified: branches/ops_pct/src/string/api.c
==============================================================================
--- branches/ops_pct/src/string/api.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/string/api.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -229,25 +229,6 @@
 
 /*
 
-=item C<void Parrot_str_free(PARROT_INTERP, STRING *s)>
-
-Frees the given STRING's header, accounting for reference counts for the
-STRING's buffer &c.  Use this only if you I<know> that nothing else has stored
-the STRING elsewhere.
-
-=cut
-
-*/
-
-void
-Parrot_str_free(PARROT_INTERP, ARGIN(STRING *s))
-{
-    ASSERT_ARGS(Parrot_str_free)
-    Parrot_gc_free_string_header(interp, s);
-}
-
-/*
-
 =back
 
 =head2 Basic String Functions

Modified: branches/ops_pct/src/sub.c
==============================================================================
--- branches/ops_pct/src/sub.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/sub.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -575,7 +575,7 @@
 {
     ASSERT_ARGS(Parrot_capture_lex)
     Parrot_Context * const ctx          = CONTEXT(interp);
-    Parrot_sub            *current_sub, *outer_sub;
+    Parrot_sub            *current_sub;
     Parrot_sub            *sub;
     Parrot_Context        *old;
 

Modified: branches/ops_pct/src/thread.c
==============================================================================
--- branches/ops_pct/src/thread.c	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/thread.c	Fri Jul 24 19:42:02 2009	(r40257)
@@ -498,7 +498,7 @@
     Parrot_runloop   jump_point;
     int              lo_var_ptr;
     UINTVAL          tid;
-    PMC             *sub_pmc;
+    PMC             * volatile sub_pmc;
     PMC             *sub_arg;
     PMC * const      self    = (PMC*) arg;
     PMC             *ret_val = NULL;

Modified: branches/ops_pct/src/vtable.tbl
==============================================================================
--- branches/ops_pct/src/vtable.tbl	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/src/vtable.tbl	Fri Jul 24 19:42:02 2009	(r40257)
@@ -316,9 +316,6 @@
 void delete_keyed_str(STRING* key)
 
 [MAIN]
-PMC* nextkey_keyed(PMC* key, INTVAL what)
-PMC* nextkey_keyed_int(INTVAL key, INTVAL what)
-PMC* nextkey_keyed_str(STRING* key, INTVAL what)
 PMC* get_iter()
 
 opcode_t* invoke(void* next)

Modified: branches/ops_pct/t/codingstd/c_function_docs.t
==============================================================================
--- branches/ops_pct/t/codingstd/c_function_docs.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/codingstd/c_function_docs.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -120,6 +120,7 @@
 config/gen/platform/solaris/math.c
 config/gen/platform/solaris/time.c
 examples/c/nanoparrot.c
+examples/c/pbc_info.c
 examples/compilers/japhc.c
 examples/embed/lorito.c
 src/atomic/gcc_x86.c
@@ -134,7 +135,6 @@
 src/jit/ppc/exec_dep.c
 src/nci_test.c
 src/pbc_dump.c
-src/pbc_info.c
 src/pic.c
 src/pic_jit.c
 src/string/charset/ascii.c

Modified: branches/ops_pct/t/codingstd/c_indent.t
==============================================================================
--- branches/ops_pct/t/codingstd/c_indent.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/codingstd/c_indent.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -61,7 +61,6 @@
         foreach my $line (@source) {
             $state{line_cnt}++;
             chomp $line;
-#            dump_state(\%state, $line);
             next unless $line;
 
             $state{prev_last_char} = $state{last_char};
@@ -70,11 +69,11 @@
             # ignore multi-line comments (except the first line)
             $state{in_comment} = 0, next if $state{in_comment} &&
                 $line =~ m{\*/} &&
-                $' !~ m{/\*};
+                $' !~ m{/\*};   #'
             next if $state{in_comment};
             $state{in_comment} = 1
                 if $line =~ m{/\*} &&
-                $' !~ m{\*/};
+                $' !~ m{\*/};   #'
 
             ## preprocessor scan
             if ( $line =~ m/^\s*\#(\s*)(ifndef|ifdef|if)\s+(.*)/ )
@@ -184,8 +183,8 @@
             my ($indent) = $line =~ /^(\s+)/ or next;
             $indent = length($indent);
 
-            # Ignore the indentation of the current line if that
-            # previous line's last character was anything but a ;.
+            # Ignore the indentation of the current line if the last 
+            # character of the was anything but a ';'.
             #
             # The indentation of the previous line is not considered.
             # Check sanity by verifying that the indentation of the current line
@@ -222,6 +221,11 @@
             . " files:\n at c_indent" );
 }
 
+# dump_state() may be used to diagnose indentation problems.
+#     dump_state(\%state, $line);
+# Takes a list of two arguments:  reference to %state and the current line
+# (once it has been chomped).
+# Prints pipe-delimited list of important features of current state.
 sub dump_state {
     my ($state, $line) = @_;
     print STDERR (join q{|} => (

Modified: branches/ops_pct/t/codingstd/test_file_coverage.t
==============================================================================
--- branches/ops_pct/t/codingstd/test_file_coverage.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/codingstd/test_file_coverage.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -62,8 +62,11 @@
         or diag "files in $dynpmc_dir but not in test dir:\n\t@$test_dynpmc_miss";
 
     # Tests in src/dynoplibs
+    {
+    local $TODO = "obscure.ops needs tests. (TT #819)";
     ok( !@$test_dynoplibs_miss, "there are test files in $test_dynoplibs_dir for all OPS files" )
         or diag "files in $dynoplibs_dir but not in test dir:\n\t@$test_dynoplibs_miss";
+    }
 }    # PMC
 
 # remember to change the number of tests :-)

Modified: branches/ops_pct/t/compilers/imcc/syn/errors.t
==============================================================================
--- branches/ops_pct/t/compilers/imcc/syn/errors.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/compilers/imcc/syn/errors.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -78,9 +78,6 @@
 /^error:imcc:syntax error, unexpected IDENTIFIER, expecting/
 END_EXPECTED
 
-TODO: {
-  local $TODO = 'TT #767';
-
 pir_error_output_like( <<'END_PIR', <<'END_EXPECTED', 'no multiple .local, TT #767' );
 .sub main :main
   .local pmc p
@@ -90,8 +87,6 @@
 /^error:imcc:syntax error, duplicated IDENTIFIER/
 END_EXPECTED
 
-}
-
 # Local Variables:
 #   mode: cperl
 #   cperl-indent-level: 4

Modified: branches/ops_pct/t/compilers/imcc/syn/file.t
==============================================================================
--- branches/ops_pct/t/compilers/imcc/syn/file.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/compilers/imcc/syn/file.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -463,6 +463,7 @@
 
     pir_output_is( <<"CODE", <<'OUT', 'load PIR from added paths, minding slash' );
   .include 'iglobals.pasm'
+  .include 'libpaths.pasm'
 
   .sub main :main
       .local pmc interp
@@ -471,9 +472,8 @@
       .local pmc lib_paths
       lib_paths = interp[.IGLOBALS_LIB_PATHS]
 
-      # XXX - hard-coded magic constant (should be PARROT_LIB_PATH_LIBRARY)
       .local pmc include_paths
-      include_paths = lib_paths[1]
+      include_paths = lib_paths[.PARROT_LIB_PATH_LIBRARY]
 
       unshift include_paths, '$temp_dir'
       load_bytecode 'with_slash.pir'

Modified: branches/ops_pct/t/compilers/pct/past.t
==============================================================================
--- branches/ops_pct/t/compilers/pct/past.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/compilers/pct/past.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -48,6 +48,11 @@
 
 }
 
+# Next tests marked as "skip" instead of "todo" to prevent false-positives in case
+# when Hash keys order occationally can be same as in test.
+SKIP: {
+skip('Hash keys order dependency', 4);
+
 pir_output_is( <<'CODE', <<'OUT', 'dump PAST::Val node in visual format' );
 .sub _main :main
     load_bytecode 'PCT.pbc'
@@ -133,6 +138,8 @@
 }
 OUT
 
+}
+
 # Local Variables:
 #   mode: cperl
 #   cperl-indent-level: 4

Modified: branches/ops_pct/t/compilers/pct/post.t
==============================================================================
--- branches/ops_pct/t/compilers/pct/post.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/compilers/pct/post.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -47,6 +47,11 @@
 
 }
 
+SKIP: {
+    skip('Hash keys order dependency', 1);
+
+# Next tests marked as "skip" instead of "todo" to prevent false-positives in case
+# when Hash keys order occationally can be same as in test.
 pir_output_is( <<'CODE', <<'OUT', 'dump POST::Op node in visual format' );
 .sub _main
     load_bytecode 'PCT.pbc'
@@ -67,6 +72,8 @@
 }
 OUT
 
+}
+
 pir_output_is( <<'CODE', <<'OUT', 'dump POST::Label node in visual format' );
 .sub _main
     load_bytecode 'PCT.pbc'

Modified: branches/ops_pct/t/compilers/pge/03-optable.t
==============================================================================
--- branches/ops_pct/t/compilers/pge/03-optable.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/compilers/pge/03-optable.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -159,17 +159,16 @@
     if type == 'term:' goto print_term
     if type == 'term:->' goto print_term_arrow
     print '('
-    .local pmc iter
+    .local pmc it
     $P0 = match.'list'()
     if null $P0 goto iter_end
     unless $P0 goto iter_end
-    iter = new 'Iterator', $P0
-    iter = 0
-    unless iter goto iter_end
+    it = iter $P0
+    unless it goto iter_end
   iter_loop:
-    $P0 = shift iter
+    $P0 = shift it
     tree($P0)
-    unless iter goto iter_end
+    unless it goto iter_end
     print ', '
     goto iter_loop
   iter_end:

Modified: branches/ops_pct/t/compilers/pge/p5regex/p5rx.t
==============================================================================
--- branches/ops_pct/t/compilers/pge/p5regex/p5rx.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/compilers/pge/p5regex/p5rx.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -81,7 +81,7 @@
     push test_files, 're_tests'
 
     .local pmc file_iterator # iterate over list of files..
-               file_iterator = new 'Iterator', test_files
+               file_iterator = iter test_files
 
     .local int test_number   # the number of the test we're running
                test_number = 0

Modified: branches/ops_pct/t/compilers/pge/perl6regex/01-regex.t
==============================================================================
--- branches/ops_pct/t/compilers/pge/perl6regex/01-regex.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/compilers/pge/perl6regex/01-regex.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -93,7 +93,7 @@
                has_icu = config['has_icu']
 
     .local pmc file_iterator # iterate over list of files..
-               file_iterator = new 'Iterator', test_files
+               file_iterator = iter test_files
 
     .local int test_number   # the number of the test we're running
                test_number = 0

Modified: branches/ops_pct/t/compilers/pge/perl6regex/rx_lookarounds
==============================================================================
--- branches/ops_pct/t/compilers/pge/perl6regex/rx_lookarounds	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/compilers/pge/perl6regex/rx_lookarounds	Fri Jul 24 19:42:02 2009	(r40257)
@@ -28,12 +28,14 @@
 <+[a..z]>+		az		y				metasyntax with leading + (<+...>)
 <+alpha>+		az		y				metasyntax with leading + (<+...>)
 
-<null>			''		y		null pattern (<null>)
-^ <null>	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob<null>: < @ 0>/	null pattern (<null>)
-<null> $	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob<null>: < @ 65>/	null pattern (<null>)
-abc <null> def	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	y			null pattern (<null>)
-x | y | <null>	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	y			null pattern (<null>)
-x | y | <?null>	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	y			null pattern (<null>)
+<?>			''		y		null pattern (<?>)
+^ <?>		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	y	null pattern (<?>)
+<?> $		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	y	null pattern (<?>)
+abc <?> def	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	y	null pattern (<?>)
+x | y | <?>	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	y	null pattern (<?>)
+x | y | <?>	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	y	null pattern (<?>)
+
+abc <!> def	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	n	fail pattern <!>
 
 a[b}		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/rule error/	mismatched close
 

Modified: branches/ops_pct/t/compilers/pge/perl6regex/rx_subrules
==============================================================================
--- branches/ops_pct/t/compilers/pge/perl6regex/rx_subrules	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/compilers/pge/perl6regex/rx_subrules	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,5 +1,4 @@
 ##  builtin subrules
-abc <fail> def	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	n				<fail>
 
 <ident>			2+3 ab2		/mob<ident>: <ab2 @ 4>/		capturing builtin <ident>
 <name>			ab::cd::x3::42	/mob<name>: <ab::cd::x3 @ 0>/	capturing builtin <name>
@@ -50,14 +49,6 @@
 <alnum>		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob<alnum>: <0 @ 35>/		<alnum>
 <+alnum>	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob: <0 @ 35>/	<+alnum>
 <+alnum>+	\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob: <0123456789ABCDEFGHIJabcdefghij @ 35>/	<+alnum>+
-<sp>		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob<sp>: <  @ 3>/	<sp>
-<+sp>+		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob: <  @ 3>/	<+sp>+
-<lt>		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob<lt>: << @ 21>/	<lt>
-<+lt>+		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob: << @ 21>/	<+lt>+
-<gt>		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob<gt>: <> @ 23>/	<gt>
-<+gt>+		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob: <> @ 23>/	<+gt>+
-<dot>		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob<dot>: <. @ 17>/	<dot>
-<+dot>+		\t\n\r !"#$%&'()*+,-./:;<=>?@[\]^`_{|}0123456789ABCDEFGHIJabcdefghij	/mob: <. @ 17>/	<+dot>+
 <+alnum+[_]>	ident_1				y	union of character classes
 <+[ab]+[\-]>+	aaa-bbb				y	enumerated character classes
 <+  [ a  b ]+[\-]>+		aaa-bbb		y	whitespace is ignored within square brackets and after the initial +

Modified: branches/ops_pct/t/configure/017-revision_from_cache.t
==============================================================================
--- branches/ops_pct/t/configure/017-revision_from_cache.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/configure/017-revision_from_cache.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -41,10 +41,10 @@
     my $tdir = tempdir( CLEANUP => 1 );
     ok( chdir $tdir, "Changed to temporary directory for testing" );
     my $libdir = qq{$tdir/lib};
-    ok( (File::Path::mkpath( $libdir )), "Able to make libdir");
+    ok( (File::Path::mkpath( [ $libdir ], 0, 0777 )), "Able to make libdir");
     local @INC;
     unshift @INC, $libdir;
-    ok( (File::Path::mkpath( qq{$libdir/Parrot} )), "Able to make Parrot dir");
+    ok( (File::Path::mkpath( [ qq{$libdir/Parrot} ], 0, 0777 )), "Able to make Parrot dir");
     ok( (copy qq{$cwd/lib/Parrot/Revision.pm},
             qq{$libdir/Parrot}), "Able to copy Parrot::Revision");
     my $cache = q{.parrot_current_rev};

Modified: branches/ops_pct/t/configure/018-revision_to_cache.t
==============================================================================
--- branches/ops_pct/t/configure/018-revision_to_cache.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/configure/018-revision_to_cache.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -23,10 +23,10 @@
     my $tdir = tempdir( CLEANUP => 1 );
     ok( chdir $tdir, "Changed to temporary directory for testing" );
     my $libdir = qq{$tdir/lib};
-    ok( (File::Path::mkpath( $libdir )), "Able to make libdir");
+    ok( (File::Path::mkpath( [ $libdir ], 0, 0777 )), "Able to make libdir");
     local @INC;
     unshift @INC, $libdir;
-    ok( (File::Path::mkpath( qq{$libdir/Parrot} )), "Able to make Parrot dir");
+    ok( (File::Path::mkpath( [ qq{$libdir/Parrot} ], 0, 0777 )), "Able to make Parrot dir");
     ok( (copy qq{$cwd/lib/Parrot/Revision.pm},
             qq{$libdir/Parrot}), "Able to copy Parrot::Revision");
     require Parrot::Revision;

Deleted: branches/ops_pct/t/configure/049-options_test.t
==============================================================================
--- branches/ops_pct/t/configure/049-options_test.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,138 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# 049-options_test.t
-
-use strict;
-use warnings;
-use Carp;
-use Cwd;
-use File::Basename;
-use File::Temp 0.13 qw| tempdir |;
-use Test::More tests => 12;
-use lib qw( lib );
-use IO::CaptureOutput qw| capture |;
-use Parrot::Configure::Options::Test::Prepare ();
-
-my $cwd = cwd();
-{
-    my $tdir = tempdir( CLEANUP => 1 );
-    chdir $tdir or croak "Unable to change to temporary directory";
-    my $good_test = q{001-sometest.t};
-    my $bad_test  = q{someothertest.t};
-    touch($good_test);
-    touch($bad_test);
-    my %tests_seen = map { basename($_), 1 }
-        Parrot::Configure::Options::Test::Prepare::_get_framework_tests($tdir);
-    ok($tests_seen{$good_test},
-        "Correctly named test identified");
-    ok(! $tests_seen{$bad_test},
-        "Incorrectly named test excluded");
-
-    ok( chdir $cwd, "Able to change back to starting directory");
-}
-
-{
-    my $tdir = tempdir( CLEANUP => 1 );
-    chdir $tdir or croak "Unable to change to temporary directory";
-    my $init_test = q{init_sometest-01.t};
-    my $inter_test = q{inter_sometest-01.t};
-    my $auto_test = q{auto_sometest-01.t};
-    my $gen_test = q{gen_sometest-01.t};
-    my $bad_test  = q{bad_sometest-01.t};
-    my $lack_number_test = q{init_test.t};
-    touch($init_test);
-    touch($inter_test);
-    touch($auto_test);
-    touch($gen_test);
-    touch($bad_test);
-    touch($lack_number_test);
-    my $steps_tests_ref = {};
-    {
-        my ($stdout, $stderr);
-        capture (
-            sub { $steps_tests_ref =
-                Parrot::Configure::Options::Test::Prepare::_get_steps_tests(
-                    $tdir
-                ) },
-            \$stdout,
-            \$stderr,
-        );
-        like($stderr, qr/Unable to match $bad_test/,
-            "Warning about badly named test captured");
-        like($stderr, qr/Unable to match $lack_number_test/,
-            "Warning about badly named test captured");
-    }
-
-    my @tests_expected = qw(
-        init::sometest
-        inter::sometest
-        auto::sometest
-        gen::sometest
-        gen::missing
-    );
-    my %tests_seen = ();
-    {
-        my ($stdout, $stderr);
-        capture (
-            sub { %tests_seen = map { basename($_), 1}
-                Parrot::Configure::Options::Test::Prepare::_prepare_steps_tests_list(
-                    $tdir,
-                    $steps_tests_ref,
-                    \@tests_expected,
-                ) },
-            \$stdout,
-            \$stderr,
-        );
-        like($stderr, qr/No tests exist for configure step gen::missing/,
-            "Warning about step class lacking test test captured");
-    }
-    foreach my $type ( qw| init inter auto gen | ) {
-        my $t = $type . q(_sometest-01.t);
-        ok($tests_seen{$t}, "Found needed test");
-    }
-
-    ok( chdir $cwd, "Able to change back to starting directory");
-}
-
-pass("Completed all tests in $0");
-
-sub touch {
-    my $file = shift;
-    open my $FH, '>', $file or croak "Unable to open $file for writing";
-    print $FH "Hello, world\n";
-    close $FH or croak "Unable to close $file after writing";
-}
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-049-options_test.t - test Parrot::Configure::Options::Test
-
-=head1 SYNOPSIS
-
-    % prove t/configure/049-options_test.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test Parrot::Configure::Options::Test methods.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-Parrot::Configure::Options, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/configure/049-options_test_prepare.t (from r40255, trunk/t/configure/049-options_test_prepare.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/configure/049-options_test_prepare.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/configure/049-options_test_prepare.t)
@@ -0,0 +1,154 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# 049-options_test_prepare.t
+
+use strict;
+use warnings;
+use Carp;
+use Cwd;
+use File::Basename qw( basename fileparse );
+use File::Path qw( mkpath );
+use File::Temp 0.13 qw| tempdir |;
+use Test::More tests => 10;
+use lib qw( lib );
+use IO::CaptureOutput qw| capture |;
+use Parrot::Configure::Options::Test::Prepare ();
+
+my $cwd = cwd();
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $good_test = q{001-sometest.t};
+    my $bad_test  = q{someothertest.t};
+    touch_in_this_dir($good_test);
+    touch_in_this_dir($bad_test);
+    my %tests_seen = map { basename($_), 1 }
+        Parrot::Configure::Options::Test::Prepare::_get_framework_tests($tdir);
+    ok($tests_seen{$good_test},
+        "Correctly named test identified");
+    ok(! $tests_seen{$bad_test},
+        "Incorrectly named test excluded");
+
+    ok( chdir $cwd, "Able to change back to starting directory");
+}
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $init_test = q{init/sometest-01.t};
+    my $init_hints_test = q{init/hints/sometest-01.t};
+    my $inter_test = q{inter/sometest-01.t};
+    my $auto_test = q{auto/sometest-01.t};
+    my $gen_test = q{gen/sometest-01.t};
+    my $bad_test  = q{bad/sometest-01.t};
+    my $lack_number_test = q{init/test.t};
+    my $CamelCase_test = q{gen/CamelCase-01.t};
+    touch($init_test);
+    touch($init_hints_test);
+    touch($inter_test);
+    touch($auto_test);
+    touch($gen_test);
+    touch($bad_test);
+    touch($lack_number_test);
+    touch($CamelCase_test);
+
+    my ( $steps_tests_simple_ref, $steps_tests_complex_ref )  =
+        Parrot::Configure::Options::Test::Prepare::_find_steps_tests($tdir);
+    my $full_bad_test = $tdir . '/' . $bad_test;
+    ok( ! exists $steps_tests_simple_ref->{$full_bad_test},
+        "File in incorrect directory correctly excluded from list of configuration step tests");
+    my $full_lack_number_test = $tdir . '/' . $lack_number_test;
+    ok( ! exists $steps_tests_simple_ref->{$full_lack_number_test},
+        "File lacking 2-digit number correctly excluded from list of configuration step tests");
+    my $full_init_hints_test = $tdir . '/'. $init_hints_test;
+    ok( exists $steps_tests_simple_ref->{$full_init_hints_test},
+        "File in second-level directory correctly included in list of configuration step tests");
+    my $full_CamelCase_test = $tdir . '/' . $CamelCase_test;
+    ok( ! exists $steps_tests_simple_ref->{$full_CamelCase_test},
+        "File containing capital letters in name correctly excluded from list of configuration step tests");
+
+    my @tests_expected = qw(
+        init::sometest
+        init::hints::sometest
+        inter::sometest
+        auto::sometest
+        gen::sometest
+    );
+    my $not_expected = q{gen::missing};
+    push @tests_expected, $not_expected;
+    my %tests_seen = ();
+    {
+        my ($stdout, $stderr);
+        capture (
+            sub { %tests_seen = map { $_, 1}
+                Parrot::Configure::Options::Test::Prepare::_prepare_steps_tests_list(
+                    $tdir,
+                    $steps_tests_complex_ref,
+                    \@tests_expected,
+                ) },
+            \$stdout,
+            \$stderr,
+        );
+        like($stderr, qr/No tests exist for configure step $not_expected/,
+            "Warning about step class lacking test captured");
+    }
+    ok( chdir $cwd, "Able to change back to starting directory");
+}
+
+pass("Completed all tests in $0");
+
+sub touch {
+    my $path = shift;
+    my ($base, $dirs) = fileparse($path);
+    my $cwd = cwd();
+    unless ( -d $dirs ) {
+        mkpath( [ $dirs ], 0, 0777 ) or croak "Unable to create dirs: $!";
+    }
+    chdir $dirs or croak "Unable to change dir: $!";
+    touch_in_this_dir( $base );
+    chdir $cwd or croak "Unable to change back dir: $!";
+    ( -e $path ) or croak "Didn't create file: $!";
+}
+
+sub touch_in_this_dir {
+    my $file = shift;
+    open my $FH, '>', $file or croak "Unable to open $file for writing";
+    print $FH "Hello, world\n";
+    close $FH or croak "Unable to close $file after writing";
+}
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+049-options_test_prepare.t - test Parrot::Configure::Options::Test
+
+=head1 SYNOPSIS
+
+    % prove t/configure/049-options_test_prepare.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test Parrot::Configure::Options::Test::Prepare
+subroutines.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+Parrot::Configure::Options::Test, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+

Modified: branches/ops_pct/t/configure/061-revision_from_cache.t
==============================================================================
--- branches/ops_pct/t/configure/061-revision_from_cache.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/configure/061-revision_from_cache.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -101,10 +101,10 @@
     my $tdir = tempdir( CLEANUP => 1 );
     ok( chdir $tdir, "Changed to temporary directory for testing" );
     my $libdir = qq{$tdir/lib};
-    ok( (File::Path::mkpath( $libdir )), "Able to make libdir");
+    ok( (File::Path::mkpath( [ $libdir ], 0, 0777 )), "Able to make libdir");
     local @INC;
     unshift @INC, $libdir;
-    ok( (File::Path::mkpath( qq{$libdir/Parrot} )), "Able to make Parrot dir");
+    ok( (File::Path::mkpath( [ qq{$libdir/Parrot} ], 0, 0777 )), "Able to make Parrot dir");
     ok( (copy qq{$cwd/lib/Parrot/Revision.pm},
             qq{$libdir/Parrot}), "Able to copy Parrot::Revision");
     my $cache = q{.parrot_current_rev};

Deleted: branches/ops_pct/t/dynoplibs/myops.t
==============================================================================
--- branches/ops_pct/t/dynoplibs/myops.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,297 +0,0 @@
-#! perl
-# Copyright (C) 2006-2008, Parrot Foundation.
-# $Id$
-
-use strict;
-use warnings;
-use lib qw( . lib ../lib ../../lib );
-use Test::More;
-use Parrot::Test tests => 10;
-use Parrot::Config;
-
-=head1 NAME
-
-t/dynoplibs/myops.t - Test for the ops in src/dynoplibs/myops.ops
-
-=head1 SYNOPSIS
-
-    % prove t/dynoplibs/myops.t
-
-=head1 DESCRIPTION
-
-Tests the sample dynamic op library "myops".
-
-=cut
-
-$ENV{TEST_PROG_ARGS} ||= '';
-
-my $is_ms_win32 = $^O =~ m!MSWin32!;
-my $is_mingw    = $is_ms_win32
-    && grep { $PConfig{cc} =~ /\b$_\b/ } qw(gcc gcc.exe);
-
-pir_output_is( <<'CODE', <<'OUTPUT', 'fortytwo' );
-.loadlib "myops_ops"
-.sub main :main
-    $I0 = fortytwo
-    print $I0
-    print "\n"
-.end
-CODE
-42
-OUTPUT
-
-pir_output_is( << 'CODE', << 'OUTPUT', "what_do_you_get_if_you_multiply_six_by_nine" );
-.loadlib "myops_ops"
-.sub main :main
-    $S0 = what_do_you_get_if_you_multiply_six_by_nine
-    print $S0
-    print "\n"
-.end
-CODE
-fortytwo
-OUTPUT
-
-pir_error_output_like( << 'CODE', << 'OUTPUT', "hcf" );
-.loadlib "myops_ops"
-.sub main :main
-    print "neither here\n"
-    hcf
-    print "nor there\n"
-.end
-CODE
-/neither here
-(?!nor there)/
-OUTPUT
-
-{
-    my @todo;
-
-    if ( $ENV{TEST_PROG_ARGS} ) {
-        @todo = ( todo => 'broken with JIT' ) if $ENV{TEST_PROG_ARGS} =~ /--runcore=jit/;
-    }
-
-    my $quine = <<'END_PASM';
-.loadlib "myops_ops"
-q
-END_PASM
-    pasm_output_is( $quine, $quine, 'a short cheating quine', @todo );
-}
-
-    my @todo = $ENV{TEST_PROG_ARGS} =~ /--runcore=jit/ ?
-       ( todo => 'RT #49718, add scheduler features to JIT' ) : ();
-
-pir_output_is( << 'CODE', << 'OUTPUT', "one alarm", @todo );
-.loadlib "myops_ops"
-
-.sub main :main
-    get_global $P0, "_alarm"
-    alarm 0.1, $P0
-    print "1\n"
-
-    # alarm should be triggered half-way
-    # during this sleep
-    sleep 1
-    sleep 1
-    print "2\n"
-
-    sleep 1
-    print "3\n"
-    print "done.\n"
-.end
-
-.sub _alarm
-    print "alarm\n"
-.end
-CODE
-1
-alarm
-2
-3
-done.
-OUTPUT
-
-SKIP: {
-    skip "three alarms, infinite loop under mingw32", 2 if $is_mingw;
-    skip "dynops weird in CGP with events", 2 if $ENV{TEST_PROG_ARGS} =~ /--runcore=cgoto/;
-
-    my @todo = $ENV{TEST_PROG_ARGS} =~ /--runcore=jit/ ?
-       ( todo => 'RT #49718, add scheduler features to JIT' ) : ();
-
-    pir_output_like( << 'CODE', << 'OUTPUT', "three alarm", @todo );
-
-.loadlib "myops_ops"
-.sub main :main
-    $P1 = new 'Integer'
-    set $P1, 0
-    set_global "flag", $P1
-    get_global $P0, "_alarm3"
-    alarm 0.3, $P0
-    get_global $P0, "_alarm2"
-    alarm 0.2, $P0
-    get_global $P0, "_alarm1"
-    alarm 0.1, $P0
-
-    set $I0, 1
-loop:
-    sleep 0.1
-    inc $I0
-    # check_events
-    get_global $P1, "flag"
-    ge $P1, 7, done
-    le $I0, 40, loop
-
-done:
-    get_global $P1, "flag"
-    $I1 = $P1
-    print $I1
-    print "\n"
-.end
-
-.sub _alarm1
-    get_global $P0, "flag"
-    add $P0, 1
-    set_global "flag", $P0
-.end
-
-.sub _alarm2
-    get_global $P0, "flag"
-    add $P0, 2
-    set_global "flag", $P0
-.end
-
-.sub _alarm3
-    get_global $P0, "flag"
-    add $P0, 4
-    set_global "flag", $P0
-.end
-
-CODE
-/7/
-OUTPUT
-
-    pir_output_like( << 'CODE', << 'OUTPUT', "repeating alarm", @todo );
-
-.loadlib "myops_ops"
-.sub main :main
-    get_global $P0, "_alarm"
-    alarm 0.5, 0.4, $P0
-    set $I0, 1
-loop:
-    sleep 1
-    inc $I0
-    # check_events
-    le $I0, 4, loop
-.end
-
-.sub _alarm
-    print "alarm\n"
-.end
-
-CODE
-/alarm
-alarm
-alarm/
-OUTPUT
-}
-
-# bxand boolean op
-pasm_output_is( <<'CODE', <<'OUTPUT', 'bxand - A AND B, but not BOTH' );
-.loadlib "myops_ops"
-
-    bxand I0, 0, 0
-    bsr test
-    bxand I0, 0, 1
-    bsr test
-    bxand I0, 1, 0
-    bsr test
-    bxand I0, 1, 1
-    bsr test
-
-    branch end
-  test:
-    eq I0, 1, T
-    print "F\n"
-    ret
-  T:print "T\n"
-    ret
-  end:
-    end
-CODE
-F
-F
-F
-F
-OUTPUT
-
-pasm_output_is( <<'CODE', <<OUTPUT, "conv_u2_i" );
-
-.loadlib "myops_ops"
-
-    set I0, 32767
-    conv_u2 I0
-    print I0
-    print "\n"
-    inc I0
-    conv_u2 I0
-    print I0
-    print "\n"
-    set I0, 65535
-    conv_u2 I0
-    print I0
-    print "\n"
-    inc I0
-    conv_u2 I0
-    print I0
-    print "\n"
-    dec I0
-    conv_u2 I0
-    print I0
-    print "\n"
-    end
-CODE
-32767
-32768
-65535
-0
-65535
-OUTPUT
-
-pasm_output_is( <<'CODE', <<OUTPUT, "conv_i2_i" );
-
-.loadlib "myops_ops"
-
-    set I0, 32767       # 2 ^ 15 -1
-    conv_i2 I0
-    print I0
-    print "\n"
-    inc I0              # 2 ^ 15
-    conv_i2 I0
-    print I0
-    print "\n"
-    set I0, 65535       # 2 ^ 16 -1
-    conv_i2 I0
-    print I0
-    print "\n"
-    inc I0              # -1 + 1
-    conv_i2 I0
-    print I0
-    print "\n"
-    dec I0              # 0 - 1
-    conv_i2 I0
-    print I0
-    print "\n"
-    end
-CODE
-32767
--32768
--1
-0
--1
-OUTPUT
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Modified: branches/ops_pct/t/dynpmc/dynlexpad.t
==============================================================================
--- branches/ops_pct/t/dynpmc/dynlexpad.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/dynpmc/dynlexpad.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -228,7 +228,7 @@
     dlp    = interp['lexpad']
 
     say "Getting iterator"
-    it = new 'Iterator', dlp
+    it = iter dlp
     say "Have iterator"
 iter_loop:
     unless it goto iter_done

Deleted: branches/ops_pct/t/dynpmc/pair.t
==============================================================================
--- branches/ops_pct/t/dynpmc/pair.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,85 +0,0 @@
-#! parrot
-# Copyright (C) 2001-2009, Parrot Foundation.
-# $Id$
-
-.const int NUM_OF_TESTS = 8
-
-.sub main :main
-    loadlib $P1, 'pair'
-    load_bytecode 'Test/More.pbc'
-
-    .local pmc plan, is, ok
-    plan = get_hll_global [ 'Test'; 'More' ], 'plan'
-    is   = get_hll_global [ 'Test'; 'More' ], 'is'
-    ok   = get_hll_global [ 'Test'; 'More' ], 'ok'
-
-    # set a test plan
-    plan(NUM_OF_TESTS)
-
-    new $P0, ['Pair']
-    ok(1, "still alive")
-    new $P1, ['Integer']
-    set $P1, 42
-    set $P0["key"], $P1
-    ok(1, "still alive")
-    set $P2, $P0["key"]
-    is($P2, 42, "fetching value")
-
-    .local pmc p, kv
-    new p, ['Pair']
-    new $P1, ['Integer']
-    set $P1, 42
-    set p["key"], $P1
-
-    $P0 = p."key"()
-    is( $P0, 'key', 'get key' )
-    $P0 = p."value"()
-    is( $P0, 42, 'get key' )
-    kv = p."kv"()
-    $I0 = elements kv
-    is( $I0, 2, 'number of elements returned from "kv"' )
-    $P0 = kv[0]
-    is( $P0, 'key', 'first element returned from "kv"' )
-    $P0 = kv[1]
-    is( $P0, 42, 'third element returned from "kv"' )
-.end
-
-=for get it
-
-SKIP: {
-    skip( "instantiate disabled", 1 );
-    pir_output_is( <<'CODE', <<'OUT', 'instantiate, assign' );
-.sub main :main
-    .local pmc cl, p, kv, k, v
-    k = new ['String']
-    k = "key"
-    v = new ['String']
-    v = "value"
-    cl = get_class "Pair"
-    p = cl."instantiate"(k, v)
-
-    $P0 = p."key"()
-    print $P0
-    print ' '
-    $P0 = p."value"()
-    print $P0
-    print ' '
-
-    v = new ['Integer']
-    v = 77
-    assign p, v
-    $P0 = p."value"()
-    say $P0
-.end
-CODE
-key value 77
-OUT
-}
-
-=cut
-
-# Local Variables:
-#   mode: pir
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4 ft=pir:

Modified: branches/ops_pct/t/examples/namespace.t
==============================================================================
--- branches/ops_pct/t/examples/namespace.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/examples/namespace.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -33,13 +33,13 @@
 # Set up expected output for examples
 
 # cannot test the exact result, just adding one method somewhere
-# changes all. Also namespaces are hashes. While we preserve
-# insert order, we do not gurantee any specific order.
-# test the name of the 2 toplevel names,  parrot is using
+# changes all. Also namespaces are hashes.  And we do not gurantee any specific
+# order of keys.  test the name of the 2 toplevel names,  parrot is using
 my %expected = (
     'namespace_dump.pir' => << 'END_EXPECTED',
-/^parrot.*
-^MULTI\s=>\sMULTI/sm
+/(?:^parrot.*
+^MULTI\s=>\sMULTI)|(?:^MULTI\s=>\sMULTI.*
+^parrot.*)/sm
 END_EXPECTED
 );
 

Modified: branches/ops_pct/t/library/mime_base64.t
==============================================================================
--- branches/ops_pct/t/library/mime_base64.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/library/mime_base64.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -332,7 +332,7 @@
     .local pmc test_iterator, test_case
     .local string plain, base64, comment, comment_cnt
 
-    test_iterator = new 'Iterator', encode_decode_tests
+    test_iterator = iter encode_decode_tests
     enc_dec_loop:
         unless test_iterator goto enc_dec_loop_end
         test_case   = shift test_iterator
@@ -350,7 +350,7 @@
     goto enc_dec_loop
     enc_dec_loop_end:
 
-    test_iterator = new 'Iterator', decode_tests
+    test_iterator = iter decode_tests
     dec_loop:
         unless test_iterator goto dec_loop_end
         test_case   = shift test_iterator

Modified: branches/ops_pct/t/library/pcre.t
==============================================================================
--- branches/ops_pct/t/library/pcre.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/library/pcre.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -49,6 +49,7 @@
     pir_output_is( <<"CODE", <<'OUT', 'soup to nuts' );
 
 .include 'iglobals.pasm'
+.include 'libpaths.pasm'
 
 .sub main :main
     .local pmc interp
@@ -57,9 +58,8 @@
     .local pmc lib_paths
     lib_paths = interp[.IGLOBALS_LIB_PATHS]
 
-    # TT #747 - hard-coded magic constant (should be PARROT_LIB_PATH_DYNEXT)
     .local pmc dynext_path
-    dynext_path = lib_paths[2]
+    dynext_path = lib_paths[.PARROT_LIB_PATH_DYNEXT]
     unshift dynext_path, '$pcre_libpath'
 
     load_bytecode 'pcre.pbc'

Modified: branches/ops_pct/t/library/protoobject.t
==============================================================================
--- branches/ops_pct/t/library/protoobject.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/library/protoobject.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -143,12 +143,12 @@
     attrs = split ' ', '$a $b $c $d'
     protomaker.'new_subclass'(hashclass, 'Foo::Bar', attrs :flat)
 
-    .local pmc object, iter
+    .local pmc object, it
     object = new 'Foo::Bar'
-    iter = new 'Iterator', attrs
+    it = iter attrs
   iter_loop:
-    unless iter goto iter_end
-    $P0 = shift iter
+    unless it goto iter_end
+    $P0 = shift it
     $S0 = $P0
     setattribute object, $S0, $P0
     $P1 = getattribute object, $S0

Modified: branches/ops_pct/t/native_pbc/annotations.pbc
==============================================================================
Binary file (source and/or target). No diff available.

Modified: branches/ops_pct/t/native_pbc/integer_1.pbc
==============================================================================
Binary file (source and/or target). No diff available.

Modified: branches/ops_pct/t/native_pbc/number_1.pbc
==============================================================================
Binary file (source and/or target). No diff available.

Modified: branches/ops_pct/t/native_pbc/number_2.pbc
==============================================================================
Binary file (source and/or target). No diff available.

Modified: branches/ops_pct/t/native_pbc/string_1.pbc
==============================================================================
Binary file (source and/or target). No diff available.

Modified: branches/ops_pct/t/oo/metamodel.t
==============================================================================
--- branches/ops_pct/t/oo/metamodel.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/oo/metamodel.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -109,13 +109,12 @@
 .sub init_pmc :vtable :method
     .param pmc init_args
   # Iterate over the constructor arguments, calling the accessor for each
-    .local pmc iter
-    iter = new 'Iterator', init_args
-    iter = 0
+    .local pmc it
+    it = iter init_args
   iter_loop:
-    unless iter goto iter_end
-    $S1 = shift iter
-    $P1 = iter[$S1]
+    unless it goto iter_end
+    $S1 = shift it
+    $P1 = it[$S1]
     self.$S1($P1)
     goto iter_loop
   iter_end:

Modified: branches/ops_pct/t/op/cc_state.t
==============================================================================
--- branches/ops_pct/t/op/cc_state.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/op/cc_state.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,13 +1,13 @@
 #! perl
 
-# Copyright (C) 2006-2007, Parrot Foundation.
+# Copyright (C) 2006-2009, Parrot Foundation.
 # $Id$
 
 use strict;
 use warnings;
 
 use lib qw/. lib/;
-use Parrot::Test 'no_plan';
+use Parrot::Test tests => 15;
 use Test::More;
 
 ## test description key
@@ -53,7 +53,7 @@
 ## G
 pcc_error_like(
     { params => ".param pmc abc" },
-    '/too few arguments passed \(0\) - 1 params expected/',
+    '/too few arguments passed \(0\) - 1 param expected/',
     'G1: argument underflow: required param',
 );
 

Modified: branches/ops_pct/t/op/gc.t
==============================================================================
--- branches/ops_pct/t/op/gc.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/op/gc.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -533,17 +533,20 @@
     reg[b] = nil
     reg[c] = nil
 
+    $P1 = new ['ResizablePMCArray']
     it = iter reg
 loop:
     unless it goto done
     $P0 = shift it
-    print $P0
+    $S0 = $P0
+    push $P1, $S0
     goto loop
 done:
+    $P1.'sort'()
+    $S1 = join '', $P1
+    print $S1
     print "\n"
 .end
-# the current hash implementation returns entries in order
-# for a few keys, and if there were no deletes
 CODE
 k1k2k3
 OUTPUT

Modified: branches/ops_pct/t/op/sprintf.t
==============================================================================
--- branches/ops_pct/t/op/sprintf.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/op/sprintf.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -87,7 +87,7 @@
 
 
     .local pmc file_iterator # iterate over list of files..
-               file_iterator = new 'Iterator', test_files
+               file_iterator = iter test_files
 
     .local int test_number   # the number of the test we're running
                test_number = 0
@@ -478,16 +478,16 @@
     .local pmc skip_os
     skip_os = split ' ', skip_list
 
-    .local pmc iter
-    iter = new 'Iterator', skip_os
+    .local pmc it
+    it = iter skip_os
 
     .local string osname
     osname = sysinfo .SYSINFO_PARROT_OS
 
   iter_loop:
-    unless iter goto iter_end
+    unless it goto iter_end
     .local string os_name
-    os_name = shift iter
+    os_name = shift it
     eq os_name, osname, skip_it
     goto iter_loop
   iter_end:

Copied: branches/ops_pct/t/pmc/arrayiterator.t (from r40255, trunk/t/pmc/arrayiterator.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/pmc/arrayiterator.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/pmc/arrayiterator.t)
@@ -0,0 +1,96 @@
+#! parrot
+# Copyright (C) 2001-2009, Parrot Foundation.
+# $Id$
+
+=head1 NAME
+
+t/pmc/arrayiterator.t - ArrayIterator PMC
+
+=head1 SYNOPSIS
+
+    % prove t/pmc/array.t
+
+=head1 DESCRIPTION
+
+Tests C<ArrayIterator> PMC. Navigate in both directions, check bounds.
+
+=cut
+
+.namespace []
+
+.include 'iterator.pasm'
+
+.sub main :main
+    .include 'test_more.pir'
+
+    plan(14)
+
+    iterate_forward() # 8 tests
+    iterate_backward() # 5 tests
+.end
+
+
+.sub 'iterate_forward'
+    .local pmc foo, it
+
+    foo = new ['ResizablePMCArray']
+
+    it = iter foo
+    nok(it, "Iterator for empty array is empty")
+    $I0 = isa it, 'Iterator'
+    ok($I0, "Have proper type")
+
+    push foo, 1
+    push foo, 42
+
+    it = iter foo
+    ok(it, "Iterator for 2-elem list is not empty")
+    $P0 = shift it
+    ok(it, "Can shift 1st element")
+    is($P0, 1, "With expected value")
+    $P0 = shift it
+    nok(it, "Iterator is finished after second shift")
+    is($P0, 42, "2nd element has correct value")
+
+    $I0 = 1
+    push_eh fail
+    $P0 = shift it
+    $I0 = 0
+  fail:
+    pop_eh
+    ok($I0, "Shifting from finished iterator throws exception")
+
+.end
+
+.sub 'iterate_backward'
+    .local pmc foo, it
+
+    foo = new ['ResizablePMCArray']
+    push foo, 1
+    push foo, 42
+
+    it = iter foo
+    it = .ITERATE_FROM_END
+    ok(it, "Iterator reset to backward iteration")
+    $P0 = pop it
+    ok(it, "Can shift 1st element")
+    is($P0, 42, "With expected value")
+    $P0 = pop it
+    nok(it, "Iterator is finished after second shift")
+    is($P0, 1, "2nd element has correct value")
+
+    $I0 = 1
+    push_eh fail
+    $P0 = shift it
+    $I0 = 0
+  fail:
+    pop_eh
+    ok($I0, "Shifting from finished iterator throws exception")
+.end
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Modified: branches/ops_pct/t/pmc/exception.t
==============================================================================
--- branches/ops_pct/t/pmc/exception.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/exception.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -678,8 +678,6 @@
 /No such string attribute/
 OUTPUT
 
-SKIP: {
-    skip( "intermittent segfault, RT #60556", 1 );
 pir_output_is( <<'CODE', <<'OUTPUT', "catch ex from C-level MULTI function" );
 .sub main :main
 
@@ -715,7 +713,6 @@
 CODE
 no segfault
 OUTPUT
-}
 
 pir_output_is( <<'CODE', <<'OUTPUT', "count_eh" );
 .sub main :main

Modified: branches/ops_pct/t/pmc/hash.t
==============================================================================
--- branches/ops_pct/t/pmc/hash.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/hash.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -21,8 +21,9 @@
 .sub main :main
     .include 'test_more.pir'
     .include 'except_types.pasm'
+    .include 'datatypes.pasm'
 
-    plan(146)
+    plan(161)
 
     initial_hash_tests()
     more_than_one_hash()
@@ -67,6 +68,9 @@
     unicode_keys_register_rt_39249()
     unicode_keys_literal_rt_39249()
 
+    integer_keys()
+    value_types_convertion()
+    elements_in_hash()
 .end
 
 .sub initial_hash_tests
@@ -1200,44 +1204,53 @@
   thash["c"] = "d"
   thash["e"] = "f"
 
-  .local pmc iter
-  iter = new ['Iterator'], thash
-  iter = .ITERATE_FROM_START
+  .local pmc it
+  it = iter thash
+  it = .ITERATE_FROM_START
 
-  .local string key
+  .local pmc keys, key
+  keys = new ['ResizablePMCArray']
 
   # go through the hash, print out all the keys: should be a c and e
 preit_loop:
-  unless iter goto preit_end
+  unless it goto preit_end
 
-  key = shift iter
-  result .= key
+  key = shift it
+  $S0 = key
+  push keys, $S0
 
   branch preit_loop
 preit_end:
 
+  keys.'sort'()
+  result = join '', keys
   is( result, 'ace', 'iterated through keys successfully' )
 
   # get rid of the c element?
   delete thash["c"]
+  keys = new ['ResizablePMCArray']
 
   # what do we have after deletion?
   result = ""
 
-  iter = new ['Iterator'], thash
-  iter = .ITERATE_FROM_START
+  it = iter thash
+  it = .ITERATE_FROM_START
 
   # go through the hash, print out all the keys... I believe it should be a and e?
   # it actually outputs a, c and e.
 postit_loop:
-  unless iter goto postit_end
+  unless it goto postit_end
+
+  key = shift it
+  $S0 = key
+  push keys, $S0
 
-  key = shift iter
-  result .= key
 
   branch postit_loop
 postit_end:
 
+  keys.'sort'()
+  result = join '', keys
   is( result, 'ae', 'the c key was no longer iterated over' )
 .end
 
@@ -1262,6 +1275,100 @@
   is( $S1, 'ok', 'literal unicode key lookup via var' )
 .end
 
+# Switch to use integer keys instead of strings.
+.sub integer_keys
+    .include "hash_key_type.pasm"
+    .local pmc hash
+    hash = new ['Hash']
+    hash = .Hash_key_type_int
+
+    hash[0]   = 'foo'
+    hash[42]  = 'bar'
+    $S0       = 'foo'
+    hash[$S0] = 'BAZ'
+
+    $S0       = '42 parrots'
+    hash[$S0] = 'Wins!'
+
+    # 'foo' numifies to '0'. So check it
+    $S0 = hash[0]
+    is($S0, 'BAZ', 'Key was numified')
+
+    # '42 parrots' numifies to '42'. So check it
+    $S0 = hash[42]
+    is($S0, 'Wins!', 'Key was numified again')
+.end
+
+# Check that we can set various value types and they properly converted
+.sub value_types_convertion
+    .local pmc hash
+    hash = new ['Hash']
+
+    # PMC is first value type
+    hash.'set_value_type'(.DATATYPE_PMC)
+    $P0 = new 'Env' # arbitary choice. Just to prevent possible casting.
+    hash['env'] = $P0
+    hash['foo'] = 42
+    hash['bar'] = 21285.06
+    hash['baz'] = 'forty two'
+
+    # Check that original value preserved
+    $P1 = hash['env']
+    $I0 = isa $P1, 'Env'
+    ok($I0, 'Env PMC preserved')
+    $I0 = hash['foo']
+    is($I0, 42, 'Intval preserved')
+    $N0 = hash['bar']
+    is($N0, 21285.06, 'Number preserved')
+    $S0 = hash['baz']
+    is($S0, 'forty two', 'String preserved')
+
+    # Clear the Hash and set INTVAL as stored values.
+    hash.'set_value_type'(.DATATYPE_INTVAL)
+    hash['foo'] = 42            # Use as-is
+    hash['bar'] = 21285.06      # Truncate to int
+    hash['baz'] = 'forty two'   # Cast to int
+
+    $I0 = hash['foo']
+    is($I0, 42, 'Intval preserved with datatype int')
+    $I0 = hash['bar']
+    is($I0, 21285, 'Floatval trunkated to int')
+    $I0 = hash['baz']
+    is($I0, 0, 'String casted to int')
+
+    # TODO Add tests for String.
+.end
+
+# Check number of elements in Hash
+.sub 'elements_in_hash'
+    .local pmc hash
+    hash = new ['Hash']
+
+    $I0 = elements hash
+    is($I0, 0, "Empty hash has 0 items")
+
+    hash['foo'] = 'FOO'
+    $I0 = elements hash
+    is($I0, 1, "Hash has 1 item")
+
+    hash['foo'] = 'BAR'
+    $I0 = elements hash
+    is($I0, 1, "Hash still has 1 item after update")
+
+    hash['bar'] = 'BAR'
+    $I0 = elements hash
+    is($I0, 2, "Hash has 2 items")
+
+    delete hash['foo']
+    $I0 = elements hash
+    is($I0, 1, "Hash has 1 item after delete")
+
+    delete hash['bar']
+    $I0 = elements hash
+    is($I0, 0, "Hash has 0 items after delete")
+
+.end
+
 # Local Variables:
 #   mode: pir
 #   fill-column: 100

Copied: branches/ops_pct/t/pmc/hashiterator.t (from r40255, trunk/t/pmc/hashiterator.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/pmc/hashiterator.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/pmc/hashiterator.t)
@@ -0,0 +1,74 @@
+#! parrot
+# Copyright (C) 2001-2008, Parrot Foundation.
+# $Id$
+
+=head1 NAME
+
+t/pmc/hash.t - Test the Hash PMC
+
+=head1 SYNOPSIS
+
+    % prove t/pmc/hash.t
+
+=head1 DESCRIPTION
+
+Tests the C<Hash> PMC. Checks key access with various types of
+normal and potentially hazardous keys. Does a bit of stress testing as
+well.
+
+=cut
+
+.sub main :main
+    .include 'test_more.pir'
+    .include 'except_types.pasm'
+
+    plan(6)
+
+    iter_over_empty_hash()
+    iter_over_single_element()
+    iter_over_single_element_with_checks()
+
+.end
+
+.sub 'iter_over_empty_hash'
+    .local pmc hash, it
+    hash = new 'Hash'
+    it   = new 'HashIterator', hash
+    $I0  = isfalse it
+    ok($I0, "Iterator for empty Hash is empty")
+.end
+
+.sub 'iter_over_single_element'
+    .local pmc hash, it
+    hash = new 'Hash'
+    hash["foo"] = "bar"
+    it   = new 'HashIterator', hash
+    $I0  = istrue it
+    ok($I0, "Iterator for non empty Hash is not empty")
+    $P0  = shift it
+    $I0  = isfalse it
+    ok($I0, "And contains one element")
+.end
+
+.sub 'iter_over_single_element_with_checks'
+    .local pmc hash, it
+    hash = new 'Hash'
+    hash["foo"] = "bar"
+
+    it   = new 'HashIterator', hash
+    $P0  = shift it
+    $I0  = isa $P0, 'HashIteratorKey'
+    ok($I0, "HashIteratorKey fetched successfully")
+
+    $S0  = $P0 # Get key
+    is($S0, "foo", "Key fetched successfully")
+    $S1  = hash[$P0]
+    is($S1, "bar", "Value fetched successfully")
+
+.end
+
+# Local Variables:
+#   mode: pir
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4 ft=pir:

Copied: branches/ops_pct/t/pmc/hashiteratorkey.t (from r40255, trunk/t/pmc/hashiteratorkey.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/pmc/hashiteratorkey.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/pmc/hashiteratorkey.t)
@@ -0,0 +1,36 @@
+#!./parrot
+# Copyright (C) 2001-2006, Parrot Foundation.
+# $Id$
+
+=head1 NAME
+
+t/pmc/hashiteratorkey.t - HashIteratorKey PMC
+
+=head1 SYNOPSIS
+
+    % prove t/pmc/hashiteratorkey.t
+
+=head1 DESCRIPTION
+
+Do almost nothing test. HashIteratorKey is supplementary class for
+iterating over Hash. Just check that we create it.
+
+=cut
+
+.sub 'main'
+    .include 'test_more.pir'
+
+    plan(1)
+
+    $P0 = new ['HashIteratorKey']
+    ok(1, "Can create HashIteratorKey directly")
+
+.end
+
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Modified: branches/ops_pct/t/pmc/io_iterator.t
==============================================================================
--- branches/ops_pct/t/pmc/io_iterator.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/io_iterator.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -26,18 +26,18 @@
 pir_output_is( <<'CODE', <<'OUT', 'new', todo => 'not yet implemented' );
 .sub 'test' :main
     $P99 = 1 # RT #46847 replace with io object
-    $P0 = new ['Iterator'], $P99
-    say "ok 1 - $P0 = new ['Iterator'], $P1"
+    $P0 = iter $P99
+    say "ok 1 - $P0 = iter $P1"
 .end
 CODE
-ok 1 - $P0 = new ['Iterator'], $P1
+ok 1 - $P0 = iter $P1
 OUT
 
 # L<PDD22/I\/O Iterator PMC API/=item shift>
 pir_output_is( <<'CODE', <<'OUT', 'shift', todo => 'not yet implemented' );
 .sub 'test' :main
     $P99 = 1 # RT #46847 replace with io object
-    $P0 = new ['Iterator'], $P99
+    $P0 = iter $P99
 
     $S0 = shift $P0
 
@@ -56,7 +56,7 @@
 pir_output_is( <<'CODE', <<'OUT', 'get_bool (vtable)', todo => 'not yet implemented' );
 .sub 'test' :main
     $P99 = 1 # RT #46847 replace with io object
-    $P0 = new ['Iterator'], $P99
+    $P0 = iter $P99
 
     # empty i/o object
     unless $P0 goto ok_1

Modified: branches/ops_pct/t/pmc/iterator.t
==============================================================================
--- branches/ops_pct/t/pmc/iterator.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/iterator.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -23,9 +23,11 @@
 
 =cut
 
+# XXX Split this test into aggregate specific one.
+
 pasm_output_is( <<'CODE', <<'OUTPUT', "new iter" );
     new P2, ['ResizablePMCArray']
-    new P1, ['Iterator'], P2
+    iter P1, P2
     print "ok 1\n"
     end
 CODE
@@ -39,19 +41,19 @@
     push P2, 10
     push P2, 20
     set I0, P2
-    new P1, ['Iterator'], P2
+    iter P1, P2
     print "ok 1\n"
     set I1, P1
     eq I0, I1, ok2        # iter.length() == array.length()
     print "not "
 ok2:    print "ok 2\n"
-    new P1, ['Iterator'], P0
+    iter P1, P0
     set P1, .ITERATE_FROM_START
     print "ok 3\n"
     unless P1, ok4        # if(iter) == false on empty
     print "not "
 ok4:    print "ok 4\n"
-    new P1, ['Iterator'], P2
+    iter P1, P2
     set P1, .ITERATE_FROM_START
     if P1, ok5        # if(iter) == true on non empty
     print "not "
@@ -115,19 +117,19 @@
     set P2["ab"], 100
     set P2["xy"], "value"
     set I0, P2
-    new P1, ['Iterator'], P2
+    iter P1, P2
     print "ok 1\n"
     set I1, P1
     eq I0, I1, ok2        # iter.length() == hash.length()
     print "not "
 ok2:    print "ok 2\n"
-    new P1, ['Iterator'], P0
+    iter P1, P0
     set P1, .ITERATE_FROM_START
     print "ok 3\n"
     unless P1, ok4        # if(iter) == false on empty
     print "not "
 ok4:    print "ok 4\n"
-    new P1, ['Iterator'], P2
+    iter P1, P2
     set P1, .ITERATE_FROM_START
     if P1, ok5        # if(iter) == true on non empty
     print "not "
@@ -169,19 +171,19 @@
     set P2["ab"], 100
     set P2["xy"], "value"
     set I0, P2
-    new P1, ['Iterator'], P2
+    iter P1, P2
     print "ok 1\n"
     set I1, P1
     eq I0, I1, ok2        # iter.length() == hash.length()
     print "not "
 ok2:    print "ok 2\n"
-    new P1, ['Iterator'], P0
+    iter P1, P0
     set P1, .ITERATE_FROM_START
     print "ok 3\n"
     unless P1, ok4        # if(iter) == false on empty
     print "not "
 ok4:    print "ok 4\n"
-    new P1, ['Iterator'], P2
+    iter P1, P2
     set P1, .ITERATE_FROM_START
     if P1, ok5        # if(iter) == true on non empty
     print "not "
@@ -231,7 +233,7 @@
     dec I1
     if I1, fill
 
-    new P1, ['Iterator'], P0
+    iter P1, P0
     set I0, P1
     eq I0, I10, ok1
     print "not "
@@ -260,7 +262,7 @@
     .include "iterator.pasm"
     new P2, ['String']
     set P2, "parrot"
-    new P1, ['Iterator'], P2
+    iter P1, P2
     set P1, .ITERATE_FROM_START
 iter_loop:
         unless P1, iter_end        # while (entries) ...
@@ -281,7 +283,7 @@
     .include "iterator.pasm"
     new P2, ['String']
     set P2, "parrot"
-    new P1, ['Iterator'], P2
+    iter P1, P2
     set P1, .ITERATE_FROM_END
 iter_loop:
         unless P1, iter_end        # while (entries) ...
@@ -302,7 +304,7 @@
     .include "iterator.pasm"
     new P2, ['String']
     set P2, "ABC"
-    new P1, ['Iterator'], P2
+    iter P1, P2
     set P1, .ITERATE_FROM_START
 iter_loop:
         unless P1, iter_end        # while (entries) ...
@@ -323,7 +325,7 @@
 .include "iterator.pasm"
     new P2, ['String']
     set P2, "ABC"
-    new P1, ['Iterator'], P2
+    iter P1, P2
     set P1, .ITERATE_FROM_END
 iter_loop:
         unless P1, iter_end        # while (entries) ...
@@ -351,7 +353,7 @@
     print "\n"
 
     .local pmc iter_1
-    iter_1 = new ['Iterator'], string_1
+    iter_1 = iter string_1
     iter_1 = .ITERATE_FROM_START
 
     .local int code_point_1
@@ -389,7 +391,7 @@
     print "\n"
 
     .local pmc iter_1
-    iter_1 = new ['Iterator'], string_1
+    iter_1 = iter string_1
     iter_1 = .ITERATE_FROM_START
 
     .local int    code_point_1
@@ -447,7 +449,7 @@
     print "\n"
 
     .local pmc iter_1
-    iter_1 = new ['Iterator'], array_1
+    iter_1 = iter array_1
     iter_1 = .ITERATE_FROM_START
 
     .local string elem_1
@@ -502,12 +504,12 @@
     print "\n"
 
     .local pmc iter_2
-    iter_2 = new ['Iterator'], array_1
+    iter_2 = iter array_1
     iter_2 = .ITERATE_FROM_END
 
     print 'Iterator shift_float: '
     .local num felem_2
-    shift felem_2, iter_2
+    pop felem_2, iter_2
     print felem_2
     print "\n"
 
@@ -543,7 +545,7 @@
     push P2, 20
     push P2, 30
     push P2, 40
-    new P1, ['Iterator'], P2
+    iter P1, P2
     set P1, .ITERATE_FROM_START
 
     set I0, P1        # arr.length
@@ -713,7 +715,7 @@
     .local pmc ar, i1, i2
     ar = new ['ResizableIntegerArray']
     push ar, 17
-    new i1, ['Iterator'], ar
+    i1 = iter ar
     clone i2, i1
 .end
 CODE
@@ -726,7 +728,7 @@
     push ar, 17
     push ar, 42
 
-    new i1, ['Iterator'], ar
+    i1 = iter ar
     clone i2, i1
 
     .local pmc temp
@@ -759,7 +761,7 @@
     ar = new ['ResizableIntegerArray']
     push ar, 1
     push ar, 2
-    new i1, ['Iterator'], ar
+    i1 = iter ar
 
     shift temp, i1
     unless temp == 1 goto fail
@@ -790,7 +792,7 @@
     temp = new ['Integer']
     ar   = new ['ResizableIntegerArray']
     push ar, 1
-    new i1, ['Iterator'], ar
+    i1 = iter ar
 
     # i1 and i2 now "point" to the same element of the same array.
     clone i2, i1

Modified: branches/ops_pct/t/pmc/namespace.t
==============================================================================
--- branches/ops_pct/t/pmc/namespace.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/namespace.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -6,7 +6,7 @@
 use warnings;
 use lib qw( . lib ../lib ../../lib );
 use Test::More;
-use Parrot::Test tests => 67;
+use Parrot::Test tests => 68;
 use Parrot::Config;
 
 =head1 NAME
@@ -1699,21 +1699,24 @@
      $P1 = 0
      set_root_global [ "DUMMY"; "X"; "Y" ], "T0", $P0
 
-     .local pmc dummy_x_y_ns, iter
+     .local pmc dummy_x_y_ns, it, res
      dummy_x_y_ns = get_root_namespace [ "DUMMY"; "X"; "Y" ]
-     iter = new ['Iterator'], dummy_x_y_ns
+     it   = iter dummy_x_y_ns
+     res  = new ['ResizablePMCArray']
 loop:
-     unless iter goto loop_end
-     $S0 = shift iter
-     print $S0
-     print "\n"
+     unless it goto loop_end
+     $S0 = shift it
+     push res, $S0
      goto loop
 loop_end:
 
+     res.'sort'()
+     $S0 = join ' ', res
+     say $S0
+
 .end
 CODE
-Explosion
-T0
+Explosion T0
 OUT
 
 pir_error_output_like( <<'CODE', <<OUT, "NameSpace with no class, RT #55620" );
@@ -1730,17 +1733,24 @@
 .namespace [ 'bar' ]
 
 .sub 'main' :main
+    .local pmc res
+    res = new ['ResizablePMCArray']
+
     $P0 = get_namespace
     say $P0
     $I0 = elements $P0
     say $I0
-    new $P1 , 'Iterator', $P0
+    $P1 = iter $P0
   L1:
     unless $P1 goto L2
     $P2 = shift $P1
-    say $P2
+    $S0 = $P2
+    push res, $S0
     goto L1
   L2:
+    res.'sort'()
+    $S0 = join "\n", res
+    say $S0
     say 'OK'
 .end
 
@@ -1750,8 +1760,8 @@
 CODE
 bar
 2
-main
 foo
+main
 OK
 OUT
 
@@ -1798,6 +1808,35 @@
 Could not find non-existent sub nok/
 OUT
 
+
+pir_output_is( <<'CODE', <<'OUT', 'HLL_map on namespace', todo => 'TT #867');
+.HLL 'tcl'
+
+.sub 'foo' :anon :init
+  $P1 = get_class 'NameSpace'
+  $P2 = subclass $P1, 'BSNS'
+  $P0 = getinterp
+  $P0.'hll_map'($P1, $P2)
+.end
+
+.namespace ['a';'b';'c']
+
+.sub 'hi'
+  noop
+.end
+
+.namespace []
+
+.sub 'blah' :main
+  $P1 = get_hll_namespace ['a';'b';'c']
+  $S0 = typeof $P1
+  print 'ok 1 - '
+  say $S0
+.end
+CODE
+ok 1 - BSNS
+OUT
+
 # Local Variables:
 #   mode: cperl
 #   cperl-indent-level: 4

Modified: branches/ops_pct/t/pmc/nci.t
==============================================================================
--- branches/ops_pct/t/pmc/nci.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/nci.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -1,5 +1,5 @@
 #! perl
-# Copyright (C) 2001-2008, Parrot Foundation.
+# Copyright (C) 2001-2009, Parrot Foundation.
 # $Id$
 
 use strict;
@@ -2646,11 +2646,6 @@
 3
 OUTPUT
 
-{
-    local $TODO = 0;
-    if ($PConfig{jitcapable}){
-        $TODO = "TT #551 - jitted NCI sig with V is broken";
-    }
 pir_output_is( << 'CODE', << 'OUTPUT', "nci_vVi - void** out parameter" );
 .sub test :main
     .local string library_name
@@ -2673,7 +2668,6 @@
 CODE
 got 10
 OUTPUT
-}
 
 pir_output_is( << 'CODE', << 'OUTPUT', "nci_ttt - t_tt parameter" );
 .sub test :main
@@ -2711,11 +2705,6 @@
 1
 OUTPUT
 
-{
-    local $TODO = 0;
-    if ($PConfig{jitcapable}){
-        $TODO = "TT #551 - jitted NCI sig with V is broken";
-    }
 pir_output_is( << 'CODE', << 'OUTPUT', "nci_vV - char** out parameter" );
 .sub test :main
     .local string library_name
@@ -2763,7 +2752,6 @@
 It is a beautiful day!
 Go suck a lemon.
 OUTPUT
-}
 
 # Local Variables:
 #   mode: cperl

Modified: branches/ops_pct/t/pmc/object-mro.t
==============================================================================
--- branches/ops_pct/t/pmc/object-mro.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/object-mro.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -44,7 +44,7 @@
     subclass F, C, "F"
     addparent F, D
     mro = F.'inspect'('all_parents')
-    it = new ['Iterator'], mro
+    it = iter mro
     it = 0
 loop:
     unless it goto ex
@@ -113,7 +113,7 @@
     .local pmc mro, it, p
 
     mro = A.'inspect'('all_parents')
-    it = new ['Iterator'], mro
+    it = iter mro
     it = 0
 loop:
     unless it goto ex
@@ -183,7 +183,7 @@
     .local pmc mro, it, p
 
     mro = A.'inspect'('all_parents')
-    it = new ['Iterator'], mro
+    it = iter mro
     it = 0
 loop:
     unless it goto ex
@@ -220,7 +220,7 @@
     .local pmc mro, it, p
 
     mro = D.'inspect'('all_parents')
-    it = new ['Iterator'], mro
+    it = iter mro
     it = 0
 loop:
     unless it goto ex
@@ -279,7 +279,7 @@
     .local pmc mro, it, p
 
     mro = Vulcan.'inspect'('all_parents')
-    it = new ['Iterator'], mro
+    it = iter mro
     it = 0
 loop:
     unless it goto ex

Modified: branches/ops_pct/t/pmc/orderedhash.t
==============================================================================
--- branches/ops_pct/t/pmc/orderedhash.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/orderedhash.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -89,12 +89,13 @@
     set P1, "ok 3\n"
     set P0["j"], P1
 
-    new P2, ['Iterator'], P0
+    iter P2, P0
     set P2, .ITERATE_FROM_START
 iter_loop:
     unless P2, end_iter
     shift P3, P2
-    print P3
+    set P4, P0[P3]
+    print P4
     branch iter_loop
 end_iter:
 
@@ -102,7 +103,8 @@
 iter_loop2:
     unless P2, end_iter2
     pop P3, P2
-    print P3
+    set P4, P0[P3]
+    print P4
     branch iter_loop2
 end_iter2:
     end
@@ -266,7 +268,7 @@
 
     delete P0["a"]
 
-    new P2, ['Iterator'], P0
+    iter P2, P0
     set P2, .ITERATE_FROM_START_KEYS
 iter_loop:
     unless P2, end_iter
@@ -333,7 +335,7 @@
     set P1, "ok 3\n"
     set P0["j"], P1
 
-    new P2, ['Iterator'], P0
+    iter P2, P0
     set P2, .ITERATE_FROM_START_KEYS
 iter_loop:
     unless P2, end_iter
@@ -357,7 +359,7 @@
     set P1, "ok 3\n"
     set P0["j"], P1
 
-    new P2, ['Iterator'], P0
+    iter P2, P0
     set P2, .ITERATE_FROM_START_KEYS
 iter_loop:
     unless P2, end_iter

Copied: branches/ops_pct/t/pmc/orderedhashiterator.t (from r40255, trunk/t/pmc/orderedhashiterator.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/pmc/orderedhashiterator.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/pmc/orderedhashiterator.t)
@@ -0,0 +1,48 @@
+#!./parrot
+# Copyright (C) 2001-2006, Parrot Foundation.
+# $Id$
+
+=head1 NAME
+
+t/pmc/orderedhashiterator.t - Ordered Hash Iterator
+
+=head1 SYNOPSIS
+
+    % prove t/pmc/orderedhashiterator.t
+
+=head1 DESCRIPTION
+
+Do almost nothing test. Main purpose of OrderedHashIterator covered by
+t/pmc/orderedhash.t.
+
+=cut
+
+.sub 'main'
+    .include 'test_more.pir'
+
+    plan(2)
+
+    # Just test that we can't create OrderedHashIterator directly
+    $I0 = 1
+    push_eh fail
+    $P0 = new ['OrderedHashIterator']
+    $I0 = 0
+  fail:
+    pop_eh
+    ok($I0, "Can't create OrderedHashIterator directly")
+
+    $P0 = new ['OrderedHash']
+    $P1 = iter $P0
+    $I0 = isa $P1, 'Iterator'
+    ok($I0, 'OrderedHashIterator has proper type')
+
+
+.end
+
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Modified: branches/ops_pct/t/pmc/packfileannotations.t
==============================================================================
--- branches/ops_pct/t/pmc/packfileannotations.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/packfileannotations.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -148,3 +148,10 @@
     # BAIL_OUT
     skip(9, "PackfileAnnotations tests failed")
 .end
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Modified: branches/ops_pct/t/pmc/packfilerawsegment.t
==============================================================================
--- branches/ops_pct/t/pmc/packfilerawsegment.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/packfilerawsegment.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -34,9 +34,7 @@
     .local pmc pf, pfdir, pfseg
     pf    = _pbc()
     pfdir = pf.'get_directory'()
-    $P0   = iter pfdir
-    $S0   = shift $P0
-    pfseg = pfdir[$S0]
+    pfseg = '_find_segment_by_prefix'(pf, 'BYTECODE')
     $I0   = elements pfseg
     ok($I0, 'PackfileRawSegment contains some data')
 .end
@@ -46,9 +44,7 @@
     .local pmc pf, pfdir, pfseg
     pf    = _pbc()
     pfdir = pf.'get_directory'()
-    $P0   = iter pfdir
-    $S0   = shift $P0
-    pfseg = pfdir[$S0]
+    pfseg = '_find_segment_by_prefix'(pf, 'BYTECODE')
 
     $I0   = 0
     $I1   = pfseg[0]

Modified: branches/ops_pct/t/pmc/pmc.t
==============================================================================
--- branches/ops_pct/t/pmc/pmc.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/pmc.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -49,7 +49,7 @@
 my $checkTypes;
 my %types_we_cant_test
     = map { $_ => 1; } (    # These require initializers.
-    qw(default Null Iterator Enumerate ParrotObject ParrotThread BigInt LexInfo LexPad Object Handle),
+    qw(default Null Iterator ArrayIterator HashIterator StringIterator OrderedHashIterator Enumerate ParrotObject ParrotThread BigInt LexInfo LexPad Object Handle),
 
     # Instances of these appear to have other types.
     qw(PMCProxy Class) );

Modified: branches/ops_pct/t/pmc/resizablepmcarray.t
==============================================================================
--- branches/ops_pct/t/pmc/resizablepmcarray.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/resizablepmcarray.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -703,7 +703,7 @@
 .sub get_array_string
     .param pmc p
     $S0 = ''
-    $P3 = new ['Iterator'], p
+    $P3 = iter p
 loop:
     unless $P3 goto loop_end
     $P4 = shift $P3
@@ -833,7 +833,7 @@
 
 #RT #40958 - can't iterate subclass of ResizablePMCArray
 .sub iterate_subclass_of_rpa
-    .local pmc arr, iter
+    .local pmc arr, it
     $P0 = subclass 'ResizablePMCArray', 'MyArray'
 
     arr = new ['MyArray']
@@ -844,10 +844,10 @@
     is($I0, 3, "RPA subclass has correct element count")
 
     $S1 = ''
-    iter = new ['Iterator'], arr
+    it = iter arr
 loop:
-    unless iter goto end
-    $P2 = shift iter
+    unless it goto end
+    $P2 = shift it
     $S0 = $P2
     concat $S1, $S0
     concat $S1, ","

Copied: branches/ops_pct/t/pmc/stringiterator.t (from r40255, trunk/t/pmc/stringiterator.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/pmc/stringiterator.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/pmc/stringiterator.t)
@@ -0,0 +1,104 @@
+#! parrot
+# Copyright (C) 2001-2008, Parrot Foundation.
+# $Id$
+
+=head1 NAME
+
+t/pmc/stringiterator.t - StringIterator.
+
+=head1 SYNOPSIS
+
+    % prove t/pmc/string.t
+
+=head1 DESCRIPTION
+
+Tests the C<StringIterator> PMC. Iterate over string in both directions.
+
+=cut
+
+.include 'iterator.pasm'
+
+.sub main :main
+    .include 'test_more.pir'
+
+    plan(18)
+
+    iterate_forward() # 10 tests
+    iterate_backward() # 8 tests
+
+.end
+
+.sub 'iterate_forward'
+    .local pmc s, it
+
+    s = new ['String']
+
+    it = iter s
+    nok(it, "Iterator for empty string is empty")
+    $I0 = isa it, 'Iterator'
+    ok($I0, "Have proper type")
+
+    s  = "bar"
+    it = s
+
+    it = iter s
+    ok(it, "Iterator for 'bar' is not empty")
+    $S0 = shift it
+    ok(it, "Can shift 1st character")
+    is($S0, 'b', "With correct value")
+
+    $S0 = shift it
+    ok(it, "Can shift 2nd character")
+    is($S0, 'a', "With correct value")
+
+    $P0 = shift it
+    nok(it, "Iterator is finished after 3rd shift")
+    is($P0, 'r', "3rd character has correct value as PMC")
+
+    $I0 = 1
+    push_eh fail
+    $P0 = shift it
+    $I0 = 0
+  fail:
+    pop_eh:
+    ok($I0, "Shifting from finished iterator throws exception")
+
+.end
+
+.sub 'iterate_backward'
+    .local pmc s, it
+
+    s = new ['String']
+    s = 'BAZ'
+
+    it = iter s
+    it = .ITERATE_FROM_END
+    ok(it, "Iterator reset to backward iteration")
+
+    $S0 = pop it
+    ok(it, "Can shift 1st character")
+    is($S0, 'Z', "With expected value")
+
+    $S0 = pop it
+    ok(it, "Can shift 2nd character")
+    is($S0, 'A', "With expected value")
+
+    $P0 = pop it
+    nok(it, "Iterator is finished after third shift")
+    is($P0, 'B', "3rd element has correct value as PMC")
+
+    $I0 = 1
+    push_eh fail
+    $P0 = pop it
+    $I0 = 0
+  fail:
+    pop_eh
+    ok($I0, "Shifting from finished iterator throws exception")
+.end
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4 filetype=pir:

Modified: branches/ops_pct/t/pmc/testlib/packfile_common.pir
==============================================================================
--- branches/ops_pct/t/pmc/testlib/packfile_common.pir	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/testlib/packfile_common.pir	Fri Jul 24 19:42:02 2009	(r40257)
@@ -45,6 +45,24 @@
     .return ()
 .end
 
+.sub '_find_segment_by_prefix'
+    .param pmc pf
+    .param string prefix
+    .local pmc pfdir, it
+
+    pfdir = pf.'get_directory'()
+    it = iter pfdir
+  loop:
+    unless it goto done
+    $S0 = shift it
+    $I0 = index $S0, prefix
+    if $I0 != 0 goto loop
+    $P0 = pfdir[$S0]
+    .return ($P0)
+  done:
+    .return ()
+.end
+
 .sub '_get_fixup_table'
     .param pmc pf
 

Modified: branches/ops_pct/t/pmc/threads.t
==============================================================================
--- branches/ops_pct/t/pmc/threads.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/threads.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -7,6 +7,7 @@
 use lib qw( . lib ../lib ../../lib );
 use Test::More;
 use Parrot::Test;
+use Parrot::Config;
 
 =head1 NAME
 
@@ -23,21 +24,6 @@
 
 =cut
 
-my %platforms = map { $_ => 1 } qw/
-    aix
-    cygwin
-    dec_osf
-    freebsd
-    hpux
-    irix
-    linux
-    netbsd
-    openbsd
-    solaris
-    MSWin32
-    darwin
-    /;
-
 if ( $^O eq "cygwin" ) {
     my @uname = split / /, qx'uname -v';
 
@@ -46,13 +32,11 @@
         exit;
     }
 }
-if ( $platforms{$^O} ) {
+if ( $PConfig{HAS_THREADS} ) {
     plan tests => 14;
 }
 else {
-    plan skip_all => "No threading yet or test not enabled for '$^O'";
-
-    # plan skip_all => "Needs COPY for argument passing";
+    plan skip_all => "No threading enabled for '$^O'";
 }
 
 pasm_output_is( <<'CODE', <<'OUTPUT', "interp identity" );

Modified: branches/ops_pct/t/pmc/timer.t
==============================================================================
--- branches/ops_pct/t/pmc/timer.t	Fri Jul 24 19:37:52 2009	(r40256)
+++ branches/ops_pct/t/pmc/timer.t	Fri Jul 24 19:42:02 2009	(r40257)
@@ -7,6 +7,7 @@
 use lib qw( . lib ../lib ../../lib );
 use Test::More;
 use Parrot::Test tests => 6;
+use Parrot::Config;
 
 =head1 NAME
 
@@ -24,19 +25,6 @@
 
 $ENV{TEST_PROG_ARGS} ||= '';
 
-my %platforms = map { $_ => 1 } qw/
-    aix
-    cygwin
-    darwin
-    dec_osf
-    freebsd
-    hpux
-    irix
-    linux
-    openbsd
-    MSWin32
-/;
-
 pasm_output_is( <<'CODE', <<'OUT', "Timer setup" );
 .include "timer.pasm"
     new P0, ['Timer']
@@ -100,7 +88,7 @@
 OUT
 
 SKIP: {
-    skip( "No thread config yet", 3 ) unless ( $platforms{$^O} );
+    skip( "No thread enabled", 3 ) unless ( $PConfig{HAS_THREADS} );
 
     pasm_output_like( <<'CODE', <<'OUT', "Timer setup - initializer/start" );
 .include "timer.pasm"

Copied: branches/ops_pct/t/steps/auto/alignptrs-01.t (from r40255, trunk/t/steps/auto/alignptrs-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/alignptrs-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/alignptrs-01.t)
@@ -0,0 +1,99 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/alignptrs-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 17;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::alignptrs');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+
+
+########## regular; singular ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::alignptrs};
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $align = 1;
+$conf->data->set('ptr_alignment' => $align);
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), qq{configured:  $align byte}, "Expected result was set");
+
+$conf->replenish($serialized);
+
+########## regular; plural ##########
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$align = 2;
+$conf->data->set('ptr_alignment' => $align);
+$ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), qq{configured:  $align bytes}, "Expected result was set");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/alignptrs-01.t - test auto::alignptrs
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/alignptrs-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::alignptrs.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::alignptrs, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/alignptrs-02.t (from r40255, trunk/t/steps/auto/alignptrs-02.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/alignptrs-02.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/alignptrs-02.t)
@@ -0,0 +1,119 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/alignptrs-02.t
+
+use strict;
+use warnings;
+use Test::More tests =>  18;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::alignptrs');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+
+########## mock hpux ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::alignptrs};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+my $serialized = $conf->pcfreeze();
+
+{
+    $conf->data->set_p5( OSNAME => 'hpux' );
+    my $ret = $step->runstep($conf);
+    ok( $ret, "runstep() returned true value" );
+    if ( $conf->data->get_p5('ccflags') !~ /DD64/ ) {
+        is($conf->data->get('ptr_alignment'), 4,
+            "Got expected pointer alignment for HP Unix");
+        is($step->result(), qq{for hpux:  4 bytes},
+            "Expected result was set");
+    } else {
+        pass("Cannot mock \%Config");
+        pass("Cannot mock \%Config");
+    }
+}
+
+$conf->replenish($serialized);
+
+########## _evaluate_ptr_alignment()  ##########
+
+my $align = 2;
+auto::alignptrs::_evaluate_ptr_alignment($conf, $align);
+is($conf->data->get( 'ptr_alignment' ), 2,
+    "Got expected pointer alignment");
+
+$conf->replenish($serialized);
+
+########## _evaluate_ptr_alignment()  ##########
+
+$align = undef;
+eval { auto::alignptrs::_evaluate_ptr_alignment($conf, $align); };
+like($@, qr/Can't determine alignment!/, #'
+    "Got expected 'die' message");
+
+$conf->replenish($serialized);
+
+########## _evaluate_results()  ##########
+
+my ($results, $try_align);
+is(auto::alignptrs::_evaluate_results(q{OK}, 2), 2,
+    "Got expected alignment");
+is(auto::alignptrs::_evaluate_results(q{OK align}, 2), undef,
+    "Got undef as expected");
+is(auto::alignptrs::_evaluate_results(q{foobar}, 2), undef,
+    "Got undef as expected");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/alignptrs-02.t - test auto::alignptrs
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/alignptrs-02.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::alignptrs.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::alignptrs, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/arch-01.t (from r40255, trunk/t/steps/auto/arch-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/arch-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/arch-01.t)
@@ -0,0 +1,305 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/arch-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 102;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::arch');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########## Darwin special case ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::arch};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $errstr;
+{
+    # As the t/configure/ test suite is currently (Dec 25 2007) constructed,
+    # an uninitialized value warning is generated when this test is run on
+    # Darwin because of a hack in config/auto/arch.pm.  We capture the warning
+    # and verify that we did so if on Darwin.  In the future, we will be able
+    # to eliminate this use of the signal handler because the
+    # Parrot::Configure object will have the same information available to it
+    # as it does during regular configuration.
+    local $SIG{__WARN__} = \&_capture;
+    my $ret = $step->runstep($conf);
+    ok( $ret, "runstep() returned true value" );
+    is($step->result(), q{}, "Result was empty string as expected");
+    if ($^O eq 'darwin') {
+        like(
+            $errstr,
+            qr/Uninitialized value/i,
+            "Caught uninitialized value warning as expected"
+        );
+    } else {
+        pass("Test not needed except on Darwin");
+    }
+}
+
+$conf->replenish($serialized);
+
+########## --verbose ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--verbose} ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    my ($ret, $stdout);
+    capture(
+        sub { $ret = $step->runstep($conf); },
+        \$stdout,
+    );
+    ok( $ret, "runstep() returned true value" );
+    is($step->result(), q{}, "Result was empty string as expected");
+    like($stdout,
+        qr/determining operating system and cpu architecture/s,
+        "Got expected verbose output"
+    );
+}
+
+$conf->replenish($serialized);
+
+########## mock architecture ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+my $pseudoarch = q{foobar};
+$conf->data->set('archname' => $pseudoarch);
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), q{}, "Result was empty string as expected");
+is($conf->data->get('cpuarch'), q{},
+    "'cpuarch' was set as expected");
+is($conf->data->get('osname'), $pseudoarch,
+    "'osname' was set as expected");
+
+$conf->replenish($serialized);
+
+########## mock darwin ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$pseudoarch = q{darwin-thread-multi-2level};
+$conf->data->set('archname' => $pseudoarch);
+my $pseudobyteorder = 1234;
+$conf->data->set('byteorder' => $pseudobyteorder);
+$ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), q{}, "Result was empty string as expected");
+is($conf->data->get('cpuarch'), q{i386},
+    "'cpuarch' was set as expected");
+is($conf->data->get('osname'), q{darwin},
+    "'osname' was set as expected");
+
+$conf->replenish($serialized);
+
+########## mock darwin ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$pseudoarch = q{darwin-thread-multi-2level};
+$conf->data->set('archname' => $pseudoarch);
+$pseudobyteorder = 4321;
+$conf->data->set('byteorder' => $pseudobyteorder);
+$ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), q{}, "Result was empty string as expected");
+is($conf->data->get('cpuarch'), q{ppc},
+    "'cpuarch' was set as expected");
+is($conf->data->get('osname'), q{darwin},
+    "'osname' was set as expected");
+
+$conf->replenish($serialized);
+
+########## mock win32 ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$pseudoarch = q{MSWin32-x64};
+$conf->data->set('archname' => $pseudoarch);
+$ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), q{}, "Result was empty string as expected");
+is($conf->data->get('cpuarch'), q{amd64},
+    "'cpuarch' was set as expected");
+is($conf->data->get('osname'), q{MSWin32},
+    "'osname' was set as expected");
+
+$conf->replenish($serialized);
+
+########## mock win32 ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$pseudoarch = q{MSWin32-i386};
+$conf->data->set('archname' => $pseudoarch);
+$ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), q{}, "Result was empty string as expected");
+is($conf->data->get('cpuarch'), q{i386},
+    "'cpuarch' was set as expected");
+is($conf->data->get('osname'), q{MSWin32},
+    "'osname' was set as expected");
+
+$conf->replenish($serialized);
+
+########## mock cygwin ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$pseudoarch = q{cygwin};
+$conf->data->set('archname' => $pseudoarch);
+$ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), q{}, "Result was empty string as expected");
+is($conf->data->get('cpuarch'), q{i386},
+    "'cpuarch' was set as expected");
+is($conf->data->get('osname'), q{cygwin},
+    "'osname' was set as expected");
+
+$conf->replenish($serialized);
+
+########## mock powerpc-linux ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$pseudoarch = q{powerpc-linux};
+$conf->data->set('archname' => $pseudoarch);
+$ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), q{}, "Result was empty string as expected");
+is($conf->data->get('cpuarch'), q{ppc},
+    "'cpuarch' was set as expected");
+is($conf->data->get('osname'), q{linux},
+    "'osname' was set as expected");
+
+$conf->replenish($serialized);
+
+########## mock cygwin-i486 ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$pseudoarch = q{cygwin-i486};
+$conf->data->set('archname' => $pseudoarch);
+$ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), q{}, "Result was empty string as expected");
+is($conf->data->get('cpuarch'), q{i386},
+    "'cpuarch' was set as expected");
+is($conf->data->get('osname'), q{cygwin},
+    "'osname' was set as expected");
+
+pass("Completed all tests in $0");
+
+sub _capture { $errstr = $_[0]; }
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/arch-01.t - test auto::arch
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/arch-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::arch.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::arch, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/attributes-01.t (from r40255, trunk/t/steps/auto/attributes-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/attributes-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/attributes-01.t)
@@ -0,0 +1,84 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/attributes-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 12;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::attributes');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw | capture |;
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [ ],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+
+my $pkg = q{auto::attributes};
+
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+my $step = test_step_constructor_and_description($conf);
+
+{
+    my $rv;
+    my $stdout;
+    capture(
+        sub { $rv = $step->runstep($conf); },
+        \$stdout,
+    );
+    ok( defined $rv, "runstep() returned defined value" );
+    unlike($conf->data->get('ccflags'),
+        qr/HASATTRIBUTE_NEVER_WORKS/,
+        "'ccflags' excludes bogus attribute as expected"
+    );
+}
+$conf->cc_clean();
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/attributes-01.t - test auto::attributes
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/attributes-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::attributes.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::attributes, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/backtrace-01.t (from r40255, trunk/t/steps/auto/backtrace-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/backtrace-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/backtrace-01.t)
@@ -0,0 +1,94 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/backtrace-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 19;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::backtrace');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+
+########## regular ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+
+my ($task, $step_name, $step, $ret);
+my $pkg = q{auto::backtrace};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+
+$conf->replenish($serialized);
+
+########## _evaluate_backtrace()  ##########
+
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+my $error = q{mock_error};
+ok($step->_evaluate_backtrace($conf, $error),
+    "_evaluate_backtrace returned true value");
+is($step->result, 'no', "Got expected result");
+
+$error = q{};
+ok($step->_evaluate_backtrace($conf, $error),
+    "_evaluate_backtrace returned true value");
+is($step->result, 'yes', "Got expected result");
+ok($conf->data->get('backtrace'),
+    "backtrace set as expected");
+
+ok($step->runstep($conf), "runstep() returned true value");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/backtrace-01.t - test auto::backtrace
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/backtrace-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::backtrace.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::backtrace, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/byteorder-01.t (from r40255, trunk/t/steps/auto/byteorder-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/byteorder-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/byteorder-01.t)
@@ -0,0 +1,129 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/byteorder-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 24;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::byteorder');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+
+########## _evaluate_byteorder() ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::byteorder};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+my $byteorder = q{1234};
+my $rv = $step->_evaluate_byteorder($conf, $byteorder);
+ok( $rv, "_evaluate_byteorder() returned true value as expected");
+is( $conf->data->get( 'byteorder'), $byteorder, "Got expected byteorder");
+ok( ! $conf->data->get( 'bigendian' ), "Not big-endian");
+is( $step->result, 'little-endian', "Rather, little-endian");
+
+$conf->replenish($serialized);
+
+########## _evaluate_byteorder() ##########
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+$byteorder = q{8765};
+$rv = $step->_evaluate_byteorder($conf, $byteorder);
+ok( $rv, "_evaluate_byteorder() returned true value as expected");
+is( $conf->data->get( 'byteorder'), $byteorder, "Got expected byteorder");
+ok( $conf->data->get( 'bigendian' ), "big-endian");
+is( $step->result, 'big-endian', "Indeed, big-endian");
+
+$byteorder = q{4321};
+$rv = $step->_evaluate_byteorder($conf, $byteorder);
+ok( $rv, "_evaluate_byteorder() returned true value as expected");
+is( $conf->data->get( 'byteorder'), $byteorder, "Got expected byteorder");
+ok( $conf->data->get( 'bigendian' ), "big-endian");
+is( $step->result, 'big-endian', "Indeed, big-endian");
+
+$conf->replenish($serialized);
+
+########## _evaluate_byteorder(); phony byte order ##########
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+$byteorder = q{foobar};
+eval {
+    $rv = $step->_evaluate_byteorder($conf, $byteorder);
+};
+like($@,
+    qr/Unsupported byte-order \[$byteorder\]!/,
+    "Got error message expected with bad byte-order");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/byteorder-01.t - test auto::byteorder
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/byteorder-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::byteorder.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::byteorder, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/cgoto-01.t (from r40255, trunk/t/steps/auto/cgoto-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/cgoto-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/cgoto-01.t)
@@ -0,0 +1,167 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/cgoto-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  56;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::cgoto');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+
+########### regular ###########
+
+my ($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::cgoto};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+ok(defined($step->result()), "A result was defined");
+ok(defined($conf->data->get('TEMP_cg_h')), "An attribute has been defined");
+ok(defined($conf->data->get('TEMP_cg_c')), "An attribute has been defined");
+ok(defined($conf->data->get('TEMP_cg_o')), "An attribute has been defined");
+ok(defined($conf->data->get('TEMP_cg_r')), "An attribute has been defined");
+ok(defined($conf->data->get('cg_flag')), "An attribute has been defined");
+
+$conf->replenish($serialized);
+
+########### _probe_for_cgoto() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$conf->options->set(cgoto => 1);
+is(auto::cgoto::_probe_for_cgoto($conf), 1,
+    "Got expected return value");
+$conf->options->set(cgoto => 0);
+is(auto::cgoto::_probe_for_cgoto($conf), 0,
+    "Got expected return value");
+$conf->options->set(cgoto => undef);
+ok(defined(auto::cgoto::_probe_for_cgoto($conf)),
+    "Probe returned a defined value");
+
+########### _evaluate_cgoto() ###########
+
+$step->_evaluate_cgoto($conf, 1);
+ok($conf->data->get('TEMP_cg_h'), "An attribute was set to true value");
+ok($conf->data->get('TEMP_cg_c'), "An attribute was set to true value");
+ok($conf->data->get('TEMP_cg_o'), "An attribute was set to true value");
+ok($conf->data->get('TEMP_cg_r'), "An attribute was set to true value");
+ok($conf->data->get('cg_flag'), "An attribute was set to true value");
+is($step->result(), q{yes}, "Expected result was set");
+
+$step->_evaluate_cgoto($conf, 0);
+is($conf->data->get('TEMP_cg_h'), q{}, "An attribute was set to empty string");
+is($conf->data->get('TEMP_cg_c'), q{}, "An attribute was set to empty string");
+is($conf->data->get('TEMP_cg_o'), q{}, "An attribute was set to empty string");
+is($conf->data->get('TEMP_cg_r'), q{}, "An attribute was set to empty string");
+is($conf->data->get('cg_flag'), q{}, "An attribute was set to empty string");
+is($step->result(), q{no}, "Expected result was set");
+
+$conf->replenish($serialized);
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    my $stdout;
+    capture(
+        sub { $step->_evaluate_cgoto($conf, 1) },
+        \$stdout
+    );
+    ok($conf->data->get('TEMP_cg_h'), "An attribute was set to true value");
+    ok($conf->data->get('TEMP_cg_c'), "An attribute was set to true value");
+    ok($conf->data->get('TEMP_cg_o'), "An attribute was set to true value");
+    ok($conf->data->get('TEMP_cg_r'), "An attribute was set to true value");
+    ok($conf->data->get('cg_flag'), "An attribute was set to true value");
+    is($step->result(), q{yes}, "Expected result was set");
+}
+
+{
+    my $stdout;
+    capture(
+        sub { $step->_evaluate_cgoto($conf, 0) },
+        \$stdout
+    );
+    is($conf->data->get('TEMP_cg_h'), q{},
+        "An attribute was set to empty string");
+    is($conf->data->get('TEMP_cg_c'), q{},
+        "An attribute was set to empty string");
+    is($conf->data->get('TEMP_cg_o'), q{},
+        "An attribute was set to empty string");
+    is($conf->data->get('TEMP_cg_r'), q{},
+        "An attribute was set to empty string");
+    is($conf->data->get('cg_flag'), q{},
+        "An attribute was set to empty string");
+    is($step->result(), q{no}, "Expected result was set");
+}
+
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/cgoto-01.t - test auto::cgoto
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/cgoto-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::cgoto.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::cgoto, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/cpu-01.t (from r40255, trunk/t/steps/auto/cpu-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/cpu-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/cpu-01.t)
@@ -0,0 +1,104 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/cpu-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  22;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::cpu');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+########### --verbose ###########
+
+my ($args, $step_list_ref) = process_options( {
+    argv => [ q{--verbose} ],
+    mode => q{configure},
+} );
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::cpu};
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+{
+    $conf->data->set('cpuarch' => 'foobar');
+    my ($ret, $stdout);
+    capture(
+        sub { $ret = $step->runstep($conf); },
+        \$stdout,
+    );
+    ok($ret, "runstep() returned true value" );
+    ok(! $step->result(), "Got (default) false result as expected");
+    like($stdout, qr/cpu hints = 'auto::cpu::foobar::auto'/s,
+        "Got expected verbose output");
+    like($stdout, qr/no cpu specific hints/s,
+        "Got expected verbose output");
+}
+
+$conf->replenish($serialized);
+
+########### mock cpuarch ###########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$conf->data->set('cpuarch' => 'foobar');
+my $ret = $step->runstep($conf);
+ok($ret, "runstep() returned true value" );
+ok(! $step->result(), "Got (default) false result as expected");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/cpu-01.t - test auto::cpu
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/cpu-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::cpu.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::cpu, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/crypto-01.t (from r40255, trunk/t/steps/auto/crypto-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/crypto-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/crypto-01.t)
@@ -0,0 +1,177 @@
+#! perl
+# Copyright (C) 2008, Parrot Foundation.
+# $Id$
+
+use strict;
+use warnings;
+use Test::More tests =>  24;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::crypto');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+########## --without-crypto ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--without-crypto} ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::crypto};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($conf->data->get('has_crypto'), 0,
+    "Got expected value for 'has_crypto'");
+is($step->result(), q{no}, "Expected result was set");
+
+$conf->replenish($serialized);
+
+########## _select_lib() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+# Mock different OS/compiler combinations.
+my ($osname, $cc, $initial_libs);
+$initial_libs = $conf->data->get('libs');
+$osname = 'mswin32';
+$cc = 'gcc';
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'libcrypto.lib',
+    default         => '-lcrypto',
+} ),
+   '-lcrypto',
+   "_select_lib() returned expected value");
+
+$osname = 'mswin32';
+$cc = 'cc';
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'libcrypto.lib',
+    default         => '-lcrypto',
+} ),
+   'libcrypto.lib',
+   "_select_lib() returned expected value");
+
+$osname = 'foobar';
+$cc = 'cc';
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'libcrypto.lib',
+    default         => '-lcrypto',
+} ),
+   '-lcrypto',
+   "_select_lib() returned expected value");
+
+my $verbose = undef;
+
+$conf->replenish($serialized);
+
+########## --without-crypto; _evaluate_cc_run() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--without-crypto} ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+my ($test, $has_crypto);
+$test = qq{OpenSSL 0.9.9z\n};
+$has_crypto = 0;
+$verbose = undef;
+$has_crypto = $step->_evaluate_cc_run($conf, $test, $has_crypto, $verbose);
+is($has_crypto, 1, "'has_crypto' set as expected");
+is($step->result(), 'yes, 0.9.9z', "Expected result was set");
+# Prepare for next test
+$step->set_result(undef);
+
+$test = qq{foobar};
+$has_crypto = 0;
+$verbose = undef;
+$has_crypto = $step->_evaluate_cc_run($conf, $test, $has_crypto, $verbose);
+is($has_crypto, 0, "'has_crypto' set as expected");
+ok(! defined $step->result(), "Result is undefined, as expected");
+
+{
+    my $stdout;
+    $test = qq{OpenSSL 0.9.9z\n};
+    $has_crypto = 0;
+    $verbose = 1;
+    capture(
+        sub { $has_crypto =
+            $step->_evaluate_cc_run($conf, $test, $has_crypto, $verbose); },
+        \$stdout,
+    );
+    is($has_crypto, 1, "'has_crypto' set as expected");
+    is($step->result(), 'yes, 0.9.9z', "Expected result was set");
+    like($stdout, qr/\(yes\)/, "Got expected verbose output");
+    # Prepare for next test
+    $step->set_result(undef);
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/crypto-01.t - test auto::crypto
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/crypto-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::crypto.
+
+=head1 HISTORY
+
+Mostly taken from F<t/steps/auto/gdbm-01.t>.
+
+=head1 AUTHOR
+
+Francois Perrad
+
+=head1 SEE ALSO
+
+config::auto::crypto, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/ctags-01.t (from r40255, trunk/t/steps/auto/ctags-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/ctags-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/ctags-01.t)
@@ -0,0 +1,151 @@
+#!perl
+# Copyright (C) 2001-2007, Parrot Foundation.
+# $Id$
+# auto/ctags-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  28;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::ctags');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+########## regular ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::ctags};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my %possible_ctags = map {$_,1}
+    qw( ctags exuberant-ctags ctags-exuberant exctags );
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+ok(defined($step->result()), "Result was defined");
+ok($possible_ctags{$conf->data->get('ctags')},
+    "Acceptable value for 'ctags' attribute was set");
+
+$conf->replenish($serialized);
+
+########## --verbose ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--verbose} ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    my $stdout;
+    my $ret = capture(
+        sub { $step->runstep($conf) },
+        \$stdout
+    );
+    ok( $ret, "runstep() returned true value" );
+    ok( defined $step->result(), "Result was defined");
+    ok($possible_ctags{$conf->data->get('ctags')},
+        "Acceptable value for 'ctags' attribute was set");
+}
+
+$conf->replenish($serialized);
+
+########## _evaluate_ctags() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+$conf->replenish($serialized);
+
+my $pseudo_ctags;
+$pseudo_ctags = q{alpha};
+$step->_evaluate_ctags($conf, $pseudo_ctags, 1);
+is($conf->data->get('ctags'), $pseudo_ctags,
+    "'ctags' attribute was set as expected");
+is($step->result(), q{yes}, "Got expected result");
+
+$pseudo_ctags = q{alpha};
+$step->_evaluate_ctags($conf, $pseudo_ctags, 0);
+is($conf->data->get('ctags'), 'ctags',
+    "'ctags' attribute was set as expected");
+is($step->result(), q{no}, "Got expected result");
+
+$conf->replenish($serialized);
+
+########## _probe_for_ctags_output() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+ok(auto::ctags::_probe_for_ctags_output('Exuberant Ctags', 0),
+    "Probe returned true when output matched");
+ok(! auto::ctags::_probe_for_ctags_output('alpha', 0),
+    "Probe returned false when output matched");
+{
+    my $stdout;
+    my $rv = capture(
+        sub { auto::ctags::_probe_for_ctags_output('Exuberant Ctags', 1) },
+        \$stdout
+    );
+    ok($rv, "Probe returned true when output matched");
+}
+{
+    my $stdout;
+    my $rv = capture(
+        sub { auto::ctags::_probe_for_ctags_output('alpha', 1) },
+        \$stdout
+    );
+    ok(! $rv, "Probe returned false when output matched");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+t/steps/auto/ctags-01.t - tests Parrot::Configure step auto::ctags
+
+=head1 SYNOPSIS
+
+    prove t/steps/auto/ctags-01.t
+
+=head1 DESCRIPTION
+
+This file holds tests for auto::ctags.
+
+=head1 AUTHOR
+
+Paul Cochrane <paultcochrane at gmail dot com>
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/env-01.t (from r40255, trunk/t/steps/auto/env-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/env-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/env-01.t)
@@ -0,0 +1,159 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/env-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  29;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::env');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+########### regular ###########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+
+my $pkg = q{auto::env};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set(%{$args});
+my $step = test_step_constructor_and_description($conf);
+ok($step->runstep($conf), "runstep() returned true value");
+
+$conf->replenish($serialized);
+
+########### _evaluate_env() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+my ($setenv, $unsetenv);
+$setenv = 1;
+$unsetenv = 1;
+$step->_evaluate_env($conf, $setenv, $unsetenv);
+is($step->result(), q{both}, "Got expected result");
+$setenv = 1;
+$unsetenv = 0;
+$step->_evaluate_env($conf, $setenv, $unsetenv);
+is($step->result(), q{setenv}, "Got expected result");
+$setenv = 0;
+$unsetenv = 1;
+$step->_evaluate_env($conf, $setenv, $unsetenv);
+is($step->result(), q{unsetenv}, "Got expected result");
+$setenv = 0;
+$unsetenv = 0;
+$step->_evaluate_env($conf, $setenv, $unsetenv);
+is($step->result(), q{no}, "Got expected result");
+
+$conf->replenish($serialized);
+
+########### --verbose; _evaluate_env() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ q{--verbose} ],
+    mode            => q{configure},
+} );
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+{
+    my $stdout;
+    $setenv = 1;
+    $unsetenv = 1;
+    capture(
+        sub { $step->_evaluate_env($conf, $setenv, $unsetenv) },
+        \$stdout
+    );
+    like($stdout, qr/both/, "Got expected verbose output");
+    is($step->result(), q{both}, "Got expected result");
+}
+{
+    my $stdout;
+    $setenv = 1;
+    $unsetenv = 0;
+    capture(
+        sub { $step->_evaluate_env($conf, $setenv, $unsetenv) },
+        \$stdout
+    );
+    like($stdout, qr/setenv/, "Got expected verbose output");
+    is($step->result(), q{setenv}, "Got expected result");
+}
+{
+    my $stdout;
+    $setenv = 0;
+    $unsetenv = 1;
+    capture(
+        sub { $step->_evaluate_env($conf, $setenv, $unsetenv) },
+        \$stdout
+    );
+    like($stdout, qr/unsetenv/, "Got expected verbose output");
+    is($step->result(), q{unsetenv}, "Got expected result");
+}
+{
+    my $stdout;
+    $setenv = 0;
+    $unsetenv = 0;
+    capture(
+        sub { $step->_evaluate_env($conf, $setenv, $unsetenv) },
+        \$stdout
+    );
+    like($stdout, qr/no/, "Got expected verbose output");
+    is($step->result(), q{no}, "Got expected result");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/env-01.t - test auto::env
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/env-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::env.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::env, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/format-01.t (from r40255, trunk/t/steps/auto/format-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/format-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/format-01.t)
@@ -0,0 +1,157 @@
+#! perl
+# Copyright (C) 2008, Parrot Foundation.
+# $Id$
+# auto/format-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 16;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::format');
+use Parrot::BuildUtil;
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+
+########## _set_intvalfmt() ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+my ($task, $step_name, $step, $ret);
+my $pkg = q{auto::format};
+
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+{
+    $conf->data->set( iv => 'int' );
+    auto::format::_set_intvalfmt($conf);
+    is($conf->data->get( 'intvalfmt' ), '%d',
+        "intvalfmt set as expected");
+    # reset for next test
+    $conf->data->set( iv => undef );
+}
+{
+    $conf->data->set( iv => 'long' );
+    auto::format::_set_intvalfmt($conf);
+    is($conf->data->get( 'intvalfmt' ), '%ld',
+        "intvalfmt set as expected");
+    # reset for next test
+    $conf->data->set( iv => undef );
+}
+{
+    $conf->data->set( iv => 'long int' );
+    auto::format::_set_intvalfmt($conf);
+    is($conf->data->get( 'intvalfmt' ), '%ld',
+        "intvalfmt set as expected");
+    # reset for next test
+    $conf->data->set( iv => undef );
+}
+{
+    $conf->data->set( iv => 'long long' );
+    auto::format::_set_intvalfmt($conf);
+    is($conf->data->get( 'intvalfmt' ), '%lld',
+        "intvalfmt set as expected");
+    # reset for next test
+    $conf->data->set( iv => undef );
+}
+{
+    $conf->data->set( iv => 'long long int' );
+    auto::format::_set_intvalfmt($conf);
+    is($conf->data->get( 'intvalfmt' ), '%lld',
+        "intvalfmt set as expected");
+    # reset for next test
+    $conf->data->set( iv => undef );
+}
+{
+    my $type = 'foobar';
+    $conf->data->set( iv => $type );
+    eval { auto::format::_set_intvalfmt($conf); };
+    like($@,
+        qr/Can't find a printf-style format specifier for type '$type'/, #'
+        "Got expected error message");
+}
+
+########## _set_floatvalfmt_nvsize() ##########
+
+{
+    $conf->data->set( nv => 'double' );
+    auto::format::_set_floatvalfmt_nvsize($conf);
+    is($conf->data->get( 'floatvalfmt' ), '%.15g',
+        "floatvalfmt set as expected");
+    is($conf->data->get( 'nvsize' ), $conf->data->get( 'doublesize' ),
+        "nvsize set as expected");
+    $conf->data->set(
+        nv          => undef,
+        floatvalfmt => undef,
+        nvsize      => undef,
+    );
+}
+{
+    use Config;
+    my $p5format = '%.15' . $Config{sPRIgldbl};
+    $p5format =~ s/"//g;; # Perl 5's Config value has embedded double quotes
+    $conf->data->set( nv => 'long double' );
+    auto::format::_set_floatvalfmt_nvsize($conf);
+    is($conf->data->get( 'floatvalfmt' ), $p5format,
+        "floatvalfmt set as expected");
+    is($conf->data->get( 'nvsize' ), $conf->data->get( 'hugefloatvalsize' ),
+        "nvsize set as expected");
+    $conf->data->set(
+        nv          => undef,
+        floatvalfmt => undef,
+        nvsize      => undef,
+    );
+}
+{
+    my $type = 'foobar';
+    $conf->data->set( nv => 'foobar' );
+    eval { auto::format::_set_floatvalfmt_nvsize($conf); };
+    like($@,
+        qr/Can't find a printf-style format specifier for type '$type'/, #'
+        "Got expected error message");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/format-01.t - test auto::format
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/format-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::format.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::format, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/funcptr-01.t (from r40255, trunk/t/steps/auto/funcptr-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/funcptr-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/funcptr-01.t)
@@ -0,0 +1,134 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/funcptr-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 28;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::funcptr');
+use Parrot::BuildUtil;
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw( test_step_thru_runstep);
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+########### --jitcapable=0  ###########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [ q{--jitcapable=0} ],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+
+my $pkg = q{auto::funcptr};
+
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+my $step = test_step_constructor_and_description($conf);
+my $ret = $step->runstep($conf);
+ok($ret, "runstep() returned defined value" );
+
+$conf->replenish($serialized);
+
+########### _cast_void_pointers_msg() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ ],
+    mode            => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    my $stdout;
+    my $ret = capture(
+        sub { auto::funcptr::_cast_void_pointers_msg(); },
+        \$stdout,
+    );
+    like($stdout, qr/Although it is not required/s,
+        "Got expected advisory message");
+}
+
+########### _set_positive_result() ###########
+
+{
+    my $stdout;
+    my $ret = capture(
+        sub { auto::funcptr::_set_positive_result($step, $conf); },
+        \$stdout,
+    );
+    is($step->result, q{yes}, "Got expected result");
+    ok(! $stdout, "Nothing printed to STDOUT, as expected");
+}
+
+$conf->replenish($serialized);
+
+########### --verbose; _set_positive_result() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ q{--verbose} ],
+    mode            => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    my $stdout;
+    my $ret = capture(
+        sub { auto::funcptr::_set_positive_result($step, $conf); },
+        \$stdout,
+    );
+    is($step->result, q{yes}, "Got expected result");
+    like($stdout, qr/yes/, "Got expected verbose output");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/funcptr-01.t - test auto::funcptr
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/funcptr-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test aspects of auto::funcptr.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::funcptr, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/gc-01.t (from r40255, trunk/t/steps/auto/gc-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/gc-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/gc-01.t)
@@ -0,0 +1,84 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/gc-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  8;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::gc');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########### --verbose ###########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--verbose} ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::gc};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+{
+    my ($ret, $stdout);
+    capture(
+        sub { $ret = $step->runstep($conf); },
+        \$stdout,
+    );
+    ok( $ret, "runstep() returned true value" );
+    like( $stdout, qr/\(gc\)/, "Got expected verbose output");
+    is($conf->data->get('gc_flag'), q{},
+        "Got expected value for 'gc_flag'");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto_gc-01.t - test auto::gc
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/gc-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::gc.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::gc, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/gcc-01.t (from r40255, trunk/t/steps/auto/gcc-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/gcc-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/gcc-01.t)
@@ -0,0 +1,327 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/gcc-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 122;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::inter::progs');
+use_ok('config::auto::gcc');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw | capture |;
+
+########## regular  ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+test_step_thru_runstep( $conf, q{inter::progs},  $args );
+
+my $pkg = q{auto::gcc};
+
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+my $step = test_step_constructor_and_description($conf);
+
+ok($step->runstep($conf), "runstep returned true value");
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc() ##########
+
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+my $gnucref = {};
+ok($step->_evaluate_gcc($conf, $gnucref),
+    "_evaluate_gcc() returned true value");
+ok(! defined $conf->data->get( 'gccversion' ),
+    "gccversion undef as expected");
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc() ##########
+
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+$gnucref = {};
+$gnucref->{__GNUC__} = 1;
+$gnucref->{__INTEL_COMPILER} = 1;
+ok($step->_evaluate_gcc($conf, $gnucref),
+    "_evaluate_gcc() returned true value");
+ok(! defined $conf->data->get( 'gccversion' ),
+    "gccversion undef as expected");
+is($step->result(), q{no}, "Got expected result");
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc(); --verbose ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ q{--verbose} ],
+    mode            => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+{
+    my $rv;
+    my $stdout;
+    my $gnucref = {};
+    $gnucref->{__GNUC__} = undef;
+    capture ( sub {$rv = $step->_evaluate_gcc($conf, $gnucref) }, \$stdout);
+    ok($rv, "_evaluate_gcc() returned true value");
+    ok( $stdout, "verbose output captured" );
+    ok(! defined $conf->data->get( 'gccversion' ),
+        "gccversion undef as expected");
+    is($step->result(), q{no}, "Got expected result");
+}
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+$gnucref = {};
+$gnucref->{__GNUC__} = 1;
+$gnucref->{__INTEL_COMPILER} = 1;
+ok($step->_evaluate_gcc($conf, $gnucref),
+    "_evaluate_gcc() returned true value");
+ok(! defined $conf->data->get( 'gccversion' ),
+    "gccversion undef as expected");
+is($step->result(), q{no}, "Got expected result");
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc(); --verbose ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ q{--verbose} ],
+    mode            => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+{
+    my $rv;
+    my $stdout;
+    my $gnucref = {};
+    $gnucref->{__GNUC__} = q{abc123};
+    capture ( sub {$rv = $step->_evaluate_gcc($conf, $gnucref) }, \$stdout);
+    ok($rv, "_evaluate_gcc() returned true value");
+    ok( $stdout, "verbose output captured" );
+    ok(! defined $conf->data->get( 'gccversion' ),
+        "gccversion undef as expected");
+    is($step->result(), q{no}, "Got expected result");
+}
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc() ##########
+
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+{
+    my $rv;
+    my $stdout;
+    my $gnucref = {};
+    $gnucref->{__GNUC__} = q{123};
+    $gnucref->{__GNUC_MINOR__} = q{abc};
+    capture ( sub {$rv = $step->_evaluate_gcc($conf, $gnucref) }, \$stdout);
+    ok($rv, "_evaluate_gcc() returned true value");
+    ok( !$stdout, "verbose output captured" );
+    ok(defined $conf->data->get( 'gccversion' ),
+        "gccversion defined as expected");
+    is($conf->data->get( 'gccversion' ), 123,
+        "Got expected value for gccversion");
+    like($step->result(), qr/^yes/, "Got expected result");
+}
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+{
+    my $rv;
+    my $stdout;
+    my $gnucref = {};
+    $gnucref->{__GNUC__} = q{123};
+    $gnucref->{__GNUC_MINOR__} = q{456};
+    capture ( sub {$rv = $step->_evaluate_gcc($conf, $gnucref) }, \$stdout);
+    ok($rv, "_evaluate_gcc() returned true value");
+    ok(defined $conf->data->get( 'gccversion' ),
+        "gccversion defined as expected");
+    is($conf->data->get( 'gccversion' ), q{123.456},
+        "Got expected value for gccversion");
+    like($step->result(), qr/^yes/, "Got expected result");
+}
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc(); --verbose ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ q{--verbose} ],
+    mode            => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+{
+    my $rv;
+    my $stdout;
+    my $gnucref = {};
+    $gnucref->{__GNUC__} = q{123};
+    $gnucref->{__GNUC_MINOR__} = q{456};
+    capture ( sub {$rv = $step->_evaluate_gcc($conf, $gnucref) }, \$stdout);
+    ok($rv, "_evaluate_gcc() returned true value");
+    ok( !$stdout, "verbose output captured" );
+    ok(defined $conf->data->get( 'gccversion' ),
+        "gccversion defined as expected");
+    is($conf->data->get( 'gccversion' ), q{123.456},
+        "Got expected value for gccversion");
+    like($step->result(), qr/^yes/, "Got expected result");
+}
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ ],
+    mode            => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+$gnucref = {};
+$gnucref->{__GNUC__} = q{abc123};
+ok($step->_evaluate_gcc($conf, $gnucref),
+    "_evaluate_gcc() returned true value");
+ok(! defined $conf->data->get( 'gccversion' ),
+    "gccversion undef as expected");
+is($step->result(), q{no}, "Got expected result");
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc(); maintaiiner; cage ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ q{--maintainer}, q{--cage} ],
+    mode            => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+$gnucref = {};
+$gnucref->{__GNUC__} = q{3};
+$gnucref->{__GNUC_MINOR__} = q{1};
+$conf->data->set( ccwarn => q{-Wfoobar -Wnofoobaz} );
+ok($step->_evaluate_gcc($conf, $gnucref),
+    "_evaluate_gcc() returned true value");
+ok(defined $conf->data->get( 'gccversion' ),
+    "gccversion defined as expected");
+like($step->result(), qr/^yes/, "Got expected result");
+
+$conf->replenish($serialized);
+
+########## _evaluate_gcc() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ ],
+    mode            => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+$gnucref = {};
+$gnucref->{__GNUC__} = q{3};
+$gnucref->{__GNUC_MINOR__} = q{1};
+{
+    $conf->data->set_p5( OSNAME => 'hpux' );
+    ok($step->_evaluate_gcc($conf, $gnucref),
+        "_evaluate_gcc() returned true value");
+    ok(defined $conf->data->get( 'gccversion' ),
+        "gccversion defined as expected");
+    is($conf->data->get( 'gccversion' ), q{3.1},
+        "Got expected value for gccversion");
+    like($step->result(), qr/^yes/, "Got expected result");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/gcc-01.t - test auto::gcc
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/gcc-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::gcc.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::gcc, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/gdbm-01.t (from r40255, trunk/t/steps/auto/gdbm-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/gdbm-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/gdbm-01.t)
@@ -0,0 +1,181 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/gdbm-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  40;
+use Carp;
+use Cwd;
+use File::Spec;
+use File::Temp qw( tempdir );
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::gdbm');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+=for hints_for_testing The documentation for this package is skimpy;
+please try to improve it, e.g., by providing a short description of what
+the 'gdbm' is.  Some branches are compiler- or OS-specific.  As noted in
+a comment in the module, please consider the issues raised in
+http://rt.perl.org/rt3/Ticket/Display.html?id=43134.
+
+=cut
+
+########## --without-gdbm  ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv => [ q{--without-gdbm} ],
+    mode => q{configure},
+} );
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::gdbm};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($conf->data->get('has_gdbm'), 0,
+    "Got expected value for 'has_gdbm'");
+is($step->result(), q{no}, "Expected result was set");
+
+$conf->replenish($serialized);
+
+########## --without-gdbm ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--without-gdbm} ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+my $osname;
+my ($flagsbefore, $flagsafter);
+$osname = 'foobar';
+my $cwd = cwd();
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    ok(chdir $tdir, "Able to change to temporary directory");
+    ok( (mkdir 'lib'), "Able to make lib directory");
+    ok( (mkdir 'include'), "Able to make include directory");
+    my $libdir = File::Spec->catdir( $tdir, 'lib' );
+    my $includedir = File::Spec->catdir( $tdir, 'include' );
+    $conf->data->set('fink_lib_dir' => $libdir);
+    $conf->data->set('fink_include_dir' => $includedir);
+
+    ok(chdir $cwd, "Able to change back to original directory after testing");
+}
+{
+    my $tdir2 = tempdir( CLEANUP => 1 );
+    ok(chdir $tdir2, "Able to change to temporary directory");
+    ok( (mkdir 'lib'), "Able to make lib directory");
+    ok( (mkdir 'include'), "Able to make include directory");
+    my $libdir = File::Spec->catdir( $tdir2, 'lib' );
+    my $includedir = File::Spec->catdir( $tdir2, 'include' );
+    $conf->data->set('fink_lib_dir' => $libdir);
+    $conf->data->set('fink_include_dir' => $includedir);
+    my $foo = File::Spec->catfile( $includedir, 'gdbm.h' );
+    open my $FH, ">", $foo or croak "Could not open for writing";
+    print $FH "Hello world\n";
+    close $FH or croak "Could not close after writing";
+
+    ok(chdir $cwd, "Able to change back to original directory after testing");
+}
+
+$conf->replenish($serialized);
+
+########## --without-gdbm; _evaluate_cc_run() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--without-gdbm} ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+my ($test, $has_gdbm, $verbose);
+$test = qq{gdbm is working.\n};
+$has_gdbm = 0;
+$verbose = undef;
+$has_gdbm = $step->_evaluate_cc_run($test, $has_gdbm, $verbose);
+is($has_gdbm, 1, "'has_gdbm' set as expected");
+is($step->result(), 'yes', "Expected result was set");
+# Prepare for next test
+$step->set_result(undef);
+$test = qq{foobar};
+$has_gdbm = 0;
+$verbose = undef;
+$has_gdbm = $step->_evaluate_cc_run($test, $has_gdbm, $verbose);
+is($has_gdbm, 0, "'has_gdbm' set as expected");
+ok(! defined $step->result(), "Result is undefined, as expected");
+{
+    my $stdout;
+    $test = qq{gdbm is working.\n};
+    $has_gdbm = 0;
+    $verbose = 1;
+    capture(
+        sub { $has_gdbm =
+            $step->_evaluate_cc_run($test, $has_gdbm, $verbose); },
+        \$stdout,
+    );
+    is($has_gdbm, 1, "'has_gdbm' set as expected");
+    is($step->result(), 'yes', "Expected result was set");
+    like($stdout, qr/\(yes\)/, "Got expected verbose output");
+    # Prepare for next test
+    $step->set_result(undef);
+}
+
+$conf->replenish($serialized);
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/gdbm-01.t - test auto::gdbm
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/gdbm-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::gdbm.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::gdbm, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/gettext-01.t (from r40255, trunk/t/steps/auto/gettext-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/gettext-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/gettext-01.t)
@@ -0,0 +1,217 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/gettext-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  30;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::gettext');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+########## --without-gettext ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--without-gettext} ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::gettext};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($conf->data->get('has_gettext'), 0,
+    "Got expected value for 'has_gettext'");
+is($step->result(), q{no}, "Expected result was set");
+
+$conf->replenish($serialized);
+
+########## _select_lib() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+# Mock values for OS and C-compiler
+my ($osname, $cc, $initial_value);
+$osname = 'mswin32';
+$cc = 'gcc';
+$initial_value = $conf->data->get( 'libs' );
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_gcc       => '-lintl',
+    win32_nongcc    => 'intl.lib',
+    default         => defined $conf->data->get('glibc') ? '' : '-lintl',
+} ),
+   '-lintl',
+   "_select_lib() returned expected value");
+
+$osname = 'mswin32';
+$cc = 'cc';
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_gcc       => '-lintl',
+    win32_nongcc    => 'intl.lib',
+    default         => defined $conf->data->get('glibc') ? '' : '-lintl',
+} ),
+   'intl.lib',
+   "_select_lib() returned expected value");
+
+$osname = 'foobar';
+$cc = 'cc';
+$conf->data->set( glibc => 1 );
+isnt($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_gcc       => '-lintl',
+    win32_nongcc    => 'intl.lib',
+    default         => defined $conf->data->get('glibc') ? '' : '-lintl',
+} ),
+   '-lintl',
+   "_select_lib() returned expected value");
+
+$osname = 'foobar';
+$cc = 'cc';
+$conf->data->set( glibc => undef );
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_gcc       => '-lintl',
+    win32_nongcc    => 'intl.lib',
+    default         => defined $conf->data->get('glibc') ? '' : '-lintl',
+} ),
+   '-lintl',
+   "_select_lib() returned expected value");
+
+########## _evaluate_cc_run() ##########
+
+my ($test, $verbose);
+my $has_gettext;
+
+$test = "Hello, world!\n";
+$verbose = undef;
+$has_gettext = $step->_evaluate_cc_run($test, $verbose);
+is($has_gettext, 1, "Got expected value for has_gettext");
+is($step->result(), 'yes', "Expected result was set");
+# Prepare for next test
+$step->set_result(undef);
+
+{
+    my $stdout;
+    $test = "Hello, world!\n";
+    $verbose = 1;
+    capture(
+        sub {
+            $has_gettext = $step->_evaluate_cc_run($test, $verbose);
+        },
+        \$stdout,
+    );
+    is($has_gettext, 1, "Got expected value for has_gettext");
+    is($step->result(), 'yes', "Expected result was set");
+    like($stdout, qr/\(yes\)/, "Got expected verbose output");
+    # Prepare for next test
+    $step->set_result(undef);
+}
+
+$test = "Foobar\n";
+$verbose = undef;
+$has_gettext = $step->_evaluate_cc_run($test, $verbose);
+is($has_gettext, 0, "Got expected value for has_gettext");
+ok(! defined $step->result(), "As expected, result is not yet defined");
+
+$conf->replenish($serialized);
+
+########## --without-gettext; _handle_gettext() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--without-gettext} ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+$verbose = undef;
+$conf->data->set( ccflags => q{} );
+ok(auto::gettext::_handle_gettext($conf, $verbose),
+    "_handle_gettext() returned true value");
+like($conf->data->get( 'ccflags' ), qr/-DHAS_GETTEXT/,
+    "HAS_GETTEXT was added to 'ccflags'");
+
+{
+    my ($stdout, $rv);
+    $verbose = 1;
+    capture(
+        sub { $rv = auto::gettext::_handle_gettext($conf, $verbose); },
+        \$stdout,
+    );
+    ok($rv, "_handle_gettext() returned true value");
+    like($conf->data->get( 'ccflags' ), qr/-DHAS_GETTEXT/,
+        "HAS_GETTEXT was added to 'ccflags'");
+    like($stdout,
+        qr/ccflags:\s.*-DHAS_GETTEXT/,
+        "Got expected verbose output"
+    );
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/gettext-01.t - test auto::gettext
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/gettext-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::gettext.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::gettext, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/glibc-01.t (from r40255, trunk/t/steps/auto/glibc-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/glibc-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/glibc-01.t)
@@ -0,0 +1,94 @@
+#! perl
+# Copyright (C) 2008, Parrot Foundation.
+# $Id$
+# auto/glibc-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 18;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::glibc');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+
+########## regular ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+
+my ($task, $step_name, $step, $ret);
+my $pkg = q{auto::glibc};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+ok($step->runstep($conf), "runstep() returned true value");
+
+$conf->replenish($serialized);
+
+########## _evaluate_glibc() ##########
+
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+
+my $test = {};
+$test->{glibc} = 1;
+$step->_evaluate_glibc($conf, $test);
+is( $step->result(), q{yes}, "Got expected result" );
+is( $conf->data->get( 'glibc' ), 1, "Got expected value for 'glibc'" );
+
+$test->{glibc} = undef;
+$step->_evaluate_glibc($conf, $test);
+is( $step->result(), q{no}, "Got expected result" );
+ok( ! defined $conf->data->get( 'glibc' ),
+    "'glibc' undefined as expected" );
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/glibc-01.t - test auto::glibc
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/glibc-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::glibc.
+
+=head1 AUTHOR
+
+Jerry Gay
+
+=head1 SEE ALSO
+
+config::auto::glibc, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/gmp-01.t (from r40255, trunk/t/steps/auto/gmp-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/gmp-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/gmp-01.t)
@@ -0,0 +1,191 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/gmp-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  31;
+use Carp;
+use Cwd;
+use File::Spec;
+use File::Temp qw( tempdir );
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::gmp');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+=for hints_for_testing The documentation for this package is skimpy;
+please try to improve it, e.g., by providing a link to an introduction
+to the GNU MP library.
+
+=cut
+
+########### --without-gmp ###########
+
+my ($args, $step_list_ref) = process_options( {
+    argv => [ q{--without-gmp} ],
+    mode => q{configure},
+} );
+
+my $conf = Parrot::Configure->new;
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::gmp};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($conf->data->get('has_gmp'), 0,
+    "Got expected value for 'has_gmp'");
+is($step->result(), q{no}, "Expected result was set");
+
+$conf->replenish($serialized);
+
+########### _select_lib() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+# Mock values for OS and C-compiler
+my ($osname, $cc, $initial_value);
+$osname = 'mswin32';
+$cc = 'gcc';
+$initial_value = $conf->data->get( 'libs' );
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'gmp.lib',
+    default         => '-lgmp',
+} ),
+   '-lgmp',
+   "_select_lib() returned expected value");
+
+$osname = 'mswin32';
+$cc = 'cc';
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'gmp.lib',
+    default         => '-lgmp',
+} ),
+   'gmp.lib',
+   "_select_lib() returned expected value");
+
+$osname = 'foobar';
+$cc = undef;
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'gmp.lib',
+    default         => '-lgmp',
+} ),
+   '-lgmp',
+   "_select_lib() returned expected value");
+
+my ($flagsbefore, $flagsafter);
+my $cwd = cwd();
+
+########### _evaluate_cc_run() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+my ($test, $has_gmp, $verbose);
+
+$test = $step->{cc_run_expected};
+$has_gmp = 0;
+$verbose = undef;
+$has_gmp = $step->_evaluate_cc_run($conf, $test, $has_gmp, $verbose);
+is($step->result, 'yes', "Got expected result");
+is($conf->data->get('gmp'), 'define', "Expected value set for 'gmp'");
+is($conf->data->get('HAS_GMP'), 1, "Expected value set for 'HAS_GMP'");
+# prepare for next test
+$conf->data->set('gmp' => undef);
+$conf->data->set('HAS_GMP' => undef);
+$step->set_result(undef);
+
+$test = '12345';
+$has_gmp = 0;
+$verbose = undef;
+$has_gmp = $step->_evaluate_cc_run($conf, $test, $has_gmp, $verbose);
+ok(! defined($step->result), "Result undefined as expected");
+is($has_gmp, 0, "gmp status unchanged");
+
+{
+    my $stdout;
+    $test = $step->{cc_run_expected};
+    $has_gmp = 0;
+    $verbose = 1;
+    capture(
+        sub { $has_gmp =
+            $step->_evaluate_cc_run($conf, $test, $has_gmp, $verbose); },
+        \$stdout,
+    );
+    is($step->result, 'yes', "Got expected result");
+    is($conf->data->get('gmp'), 'define', "Expected value set for 'gmp'");
+    is($conf->data->get('HAS_GMP'), 1, "Expected value set for 'HAS_GMP'");
+    like($stdout, qr/\(yes\)/, "Got expected verbose output");
+    # prepare for next test
+    $conf->data->set('gmp' => undef);
+    $conf->data->set('HAS_GMP' => undef);
+    $step->set_result(undef);
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/gmp-01.t - test auto::gmp
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/gmp-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::gmp.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::gmp, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/headers-01.t (from r40255, trunk/t/steps/auto/headers-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/headers-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/headers-01.t)
@@ -0,0 +1,132 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/headers-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  30;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::headers');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw | capture |;
+
+########## regular ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+my $pkg = q{auto::headers};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), q{}, "Result is empty string as expected");
+
+$conf->replenish($serialized);
+
+########## --verbose ##########
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--verbose} ],
+        mode => q{configure},
+    }
+);
+
+rerun_defaults_for_testing($conf, $args );
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    my $rv;
+    my $stdout;
+    capture ( sub {$rv = $step->runstep($conf) }, \$stdout);
+    ok( $stdout, "verbose output captured" );
+    ok( $rv, "runstep() returned true value" );
+    is($step->result(), q{}, "Result is empty string as expected");
+}
+
+$conf->replenish($serialized);
+
+########## _set_from_Config(); _list_extra_headers() ##########
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+rerun_defaults_for_testing($conf, $args );
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+auto::headers::_set_from_Config($conf);
+ok(! $conf->data->get('i_niin'), "Mapping made correctly");
+
+{
+    $conf->data->set_p5( OSNAME => "msys" );
+    my %extra_headers =
+        map {$_, 1} auto::headers::_list_extra_headers($conf);
+    ok($extra_headers{'sysmman.h'}, "Special header set for msys");
+    ok($extra_headers{'netdb.h'}, "Special header set for msys");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/headers-01.t - test auto::headers
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/headers-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::headers.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::headers, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/icu-01.t (from r40255, trunk/t/steps/auto/icu-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/icu-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/icu-01.t)
@@ -0,0 +1,723 @@
+#! perl
+# Copyright (C) 2007-2008, Parrot Foundation.
+# $Id$
+# auto/icu-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 136;
+use Carp;
+use Cwd;
+use File::Path qw( mkpath );
+use File::Temp qw( tempdir );
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::icu');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use Parrot::Configure::Utils qw( capture_output );
+use IO::CaptureOutput qw( capture );
+
+########## --without-icu ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--without-icu}  ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::icu};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+
+is( $conf->data->get('has_icu'), 0,
+    "Got expected value for 'has_icu'" );
+is( $conf->data->get('icu_shared'), q{},
+    "Got expected value for 'icu_shared'" );
+is( $conf->data->get('icu_dir'), q{},
+    "Got expected value for 'icu_dir'" );
+is( $step->result(), 'not requested', "Got expected result" );
+$step->set_result(q{});  # prepare for subsequent tests
+
+########## _handle_icuconfig_opt() ##########
+
+# Test some internal routines
+my $icuconfig;
+my $phony = q{/path/to/icu-config};
+
+is($step->_handle_icuconfig_opt(undef), q{},
+    "Got expected value for icu-config");
+is($step->_handle_icuconfig_opt('none'), q{},
+    "Got expected value for icu-config");
+is($step->_handle_icuconfig_opt($phony), $phony,
+    "Got expected value for icu-config");
+
+########## _handle_search_for_icuconfig() ##########
+
+my ($autodetect, $without);
+
+($icuconfig, $autodetect, $without) =
+    $step->_handle_search_for_icu_config( {
+        icuconfig   => q{},
+        autodetect  => 1,
+        without     => 0,
+        verbose     => 0,
+        ret         => -1,
+} );
+ok(! defined $icuconfig, "icu-config not found, as expected");
+is($autodetect, 0, "Autodetection cancelled, as expected");
+is($without, 1, "Continuing to configure without ICU");
+
+($icuconfig, $autodetect, $without) =
+    $step->_handle_search_for_icu_config( {
+        icuconfig   => q{},
+        autodetect  => 1,
+        without     => 0,
+        verbose     => 0,
+        ret         => 256,
+} );
+ok(! defined $icuconfig, "icu-config not found, as expected");
+is($autodetect, 0, "Autodetection cancelled, as expected");
+is($without, 1, "Continuing to configure without ICU");
+
+($icuconfig, $autodetect, $without) =
+    $step->_handle_search_for_icu_config( {
+        icuconfig   => q{},
+        autodetect  => 1,
+        without     => 0,
+        verbose     => 0,
+        ret         => 0,
+} );
+is($icuconfig, q{icu-config}, "icu-config found, as expected");
+is($autodetect, 1, "Autodetection continues, as expected");
+is($without, 0, "Continuing to try to configure with ICU");
+
+{
+    my ($stdout, $stderr);
+    capture( sub {
+            ($icuconfig, $autodetect, $without) =
+                $step->_handle_search_for_icu_config( {
+                    icuconfig   => q{},
+                    autodetect  => 1,
+                    without     => 0,
+                    verbose     => 1,
+                    ret         => 0,
+            } );
+        },
+        \$stdout,
+        \$stderr,
+    );
+    is($icuconfig, q{icu-config}, "icu-config found, as expected");
+    is($autodetect, 1, "Autodetection continues, as expected");
+    is($without, 0, "Continuing to try to configure with ICU");
+    like($stdout, qr/icu-config found/,
+        "Got expected verbose output");
+}
+
+########## _handle_autodetect() ##########
+
+($icuconfig, $autodetect, $without) =
+    $step->_handle_autodetect( {
+        icuconfig   => $phony,
+        autodetect  => 1,
+        without     => 0,
+        verbose     => 0,
+} );
+is($icuconfig, $phony, "icu-config unchanged, as expected");
+is($autodetect, 1, "Autodetection still active, as expected");
+is($without, 0, "Continuing to try to configure with ICU");
+
+{
+    my ($stdout, $stderr);
+    capture( sub {
+        ($icuconfig, $autodetect, $without) =
+            $step->_handle_autodetect( {
+                icuconfig   => $phony,
+                autodetect  => 0,
+                without     => 0,
+                verbose     => 1,
+            } );
+        },
+        \$stdout,
+        \$stderr,
+    );
+    is($icuconfig, $phony, "icu-config unchanged, as expected");
+    is($autodetect, 0, "Autodetection still inactive, as expected");
+    is($without, 0, "Continuing to try to configure with ICU");
+    like($stdout, qr/ICU autodetection disabled/s,
+        "Got expected verbose output");
+}
+
+########## _handle_icushared() ##########
+
+my $icushared;
+
+$icushared = qq{-licui18n -lalpha\n};
+($icushared, $without) = $step->_handle_icushared($icushared, 0);
+like($icushared, qr/-lalpha/, "Got expected ld flags");
+is($without, 0, "Continuing to try to configure with ICU");
+
+$icushared = qq{-licui18n\n};
+($icushared, $without) = $step->_handle_icushared($icushared, 0);
+ok(! $icushared, "No icushared, as expected");
+is($without, 1, "No longer trying to configure with ICU");
+
+$icushared = undef;
+($icushared, $without) = $step->_handle_icushared($icushared, 0);
+ok(! defined $icushared, "icushared remains undefined, as expected");
+is($without, 0, "Continuing to try to configure with ICU");
+
+########## _handle_icuheaders() ##########
+
+my $icuheaders;
+($icuheaders, $without) =
+    $step->_handle_icuheaders($conf, undef, 0);
+ok(! defined $icuheaders, "icuheaders path undefined, as expected");
+is($without, 0, "Continuing to try to configure with ICU");
+
+my $cwd = cwd();
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $expected_dir = q{alpha};
+    my $expected_include_dir =
+        $expected_dir . $conf->data->get('slash') .  q{include};
+    ($icuheaders, $without) =
+        $step->_handle_icuheaders($conf, qq{$expected_dir\n}, 0);
+    is($icuheaders, $expected_include_dir,
+        "Got expected icuheaders path value");
+    is($without, 1, "No longer trying to configure with ICU");
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $expected_dir = q{alpha};
+    my $expected_include_dir =
+        $expected_dir . $conf->data->get('slash') .  q{include};
+    mkdir $expected_dir or croak "Unable to make testing directory";
+    ($icuheaders, $without) =
+        $step->_handle_icuheaders($conf, qq{$expected_dir\n}, 0);
+    is($icuheaders, $expected_include_dir,
+        "Got expected icuheaders path value");
+    is($without, 1, "No longer trying to configure with ICU");
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+{
+    my $tdir = tempdir( CLEANUP => 1);
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $expected_dir = q{alpha};
+    my $expected_include_dir =
+        $expected_dir . $conf->data->get('slash') .  q{include};
+    mkdir $expected_dir or croak "Unable to make testing directory";
+    mkpath($expected_include_dir, { mode => 0755 })
+        or croak "Unable to make second-level testing directory";
+    ($icuheaders, $without) =
+        $step->_handle_icuheaders($conf, qq{$expected_dir\n}, 0);
+    is($icuheaders, $expected_include_dir,
+        "Got expected icuheaders path value");
+    is($without, 0, "Continuing to try to configure with ICU");
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+########## _try_icuconfig() ##########
+
+($without, $icushared, $icuheaders) =
+    $step->_try_icuconfig(
+        $conf,
+        {
+            without         => 1,
+            autodetect      => 1,
+            icuconfig       => 1,
+            verbose         => 0,
+        }
+    );
+is($without, 1, "Not trying to configure with ICU");
+ok(! defined $icushared, "icushared undefined, as expected");
+ok(! defined $icuheaders, "icuheaders undefined, as expected");
+is($step->result(), q{}, "result is still empty string, as expected");
+
+($without, $icushared, $icuheaders) =
+    $step->_try_icuconfig(
+        $conf,
+        {
+            without         => 0,
+            autodetect      => 0,
+            icuconfig       => 1,
+            verbose         => 0,
+        }
+    );
+is($without, 0, "Still trying to configure with ICU");
+ok(! defined $icushared, "icushared undefined, as expected");
+ok(! defined $icuheaders, "icuheaders undefined, as expected");
+is($step->result(), q{}, "result is still empty string, as expected");
+
+($without, $icushared, $icuheaders) =
+    $step->_try_icuconfig(
+        $conf,
+        {
+            without         => 0,
+            autodetect      => 1,
+            icuconfig       => q{},
+            verbose         => 0,
+        }
+    );
+is($without, 0, "Still trying to configure with ICU");
+ok(! defined $icushared, "icushared undefined, as expected");
+ok(! defined $icuheaders, "icuheaders undefined, as expected");
+is($step->result(), q{}, "result is still empty string, as expected");
+
+########## _verbose_report() ##########
+
+my $die = auto::icu::_die_message();
+like($die, qr/Something is wrong with your ICU installation/s,
+    "Got expected die message");
+
+{
+    my $phony = q{/path/to/icu-config};
+    my ($stdout, $stderr);
+    capture(
+        sub { auto::icu::_verbose_report(1, $phony, undef, undef); },
+        \$stdout,
+        \$stderr,
+    );
+    like( $stdout, qr/icuconfig:\s+$phony/s,
+        "Got expected verbose output"
+    );
+}
+
+{
+    my $phony = q{-lalpha};
+    my ($stdout, $stderr);
+    capture(
+        sub { auto::icu::_verbose_report(1, undef, $phony, undef); },
+        \$stdout,
+        \$stderr,
+    );
+    like( $stdout, qr/icushared='$phony'/s,
+        "Got expected verbose output"
+    );
+}
+
+{
+    my $phony = q{alpha/include};
+    my ($stdout, $stderr);
+    capture(
+        sub { auto::icu::_verbose_report(1, undef, undef, $phony); },
+        \$stdout,
+        \$stderr,
+    );
+    like( $stdout, qr/headers='$phony'/s,
+        "Got expected verbose output"
+    );
+}
+
+{
+    my ($stdout, $stderr);
+    capture(
+        sub { auto::icu::_verbose_report(0, 'alpha', 'beta', 'gamma'); },
+        \$stdout,
+        \$stderr,
+    );
+    ok(! $stdout, "No verbose output, as expected");
+}
+
+########## _handle_icuconfig_errors() ##########
+
+{
+    my ($stdout, $stderr);
+    capture(
+        sub {
+            $icuheaders = $step->_handle_icuconfig_errors( {
+                icushared   => undef,
+                icuheaders  => undef,
+            } );
+        },
+        \$stdout,
+        \$stderr,
+    );
+    like($stderr, qr/error: icushared not defined/s,
+        "Got expected warnings");
+    like($stderr, qr/error: icuheaders not defined or invalid/s,
+        "Got expected warnings");
+    like($stderr, qr/Something is wrong with your ICU installation/s,
+        "Got expected warnings");
+}
+
+########## _handle_ccflags_status() ##########
+
+$icuheaders = q{alpha};
+my $status = $conf->data->get( 'ccflags' );
+
+{
+    my ($stdout, $stderr);
+    capture(
+        sub {
+           auto::icu::_handle_ccflags_status($conf,
+               {
+                   ccflags_status  => 1,
+                   verbose         => 1,
+                   icuheaders      => $icuheaders,
+               },
+           );
+       },
+       \$stdout,
+       \$stderr,
+   );
+   like($stdout, qr/Your compiler found the icu headers/,
+       "Got expected verbose output");
+}
+$conf->data->set( ccflags => $status ); # re-set for next test
+
+{
+    my ($stdout, $stderr);
+    capture(
+        sub {
+           auto::icu::_handle_ccflags_status($conf,
+               {
+                   ccflags_status  => 0,
+                   verbose         => 1,
+                   icuheaders      => $icuheaders,
+               },
+           );
+       },
+       \$stdout,
+       \$stderr,
+   );
+
+   if ($icuheaders =~ /\s/) {
+       like($stdout, qr/Adding -I \"\Q$icuheaders\E\" to ccflags for icu headers/,
+           "Got expected verbose output");
+   }
+   else {
+       like($stdout, qr/Adding -I \Q$icuheaders\E to ccflags for icu headers/,
+           "Got expected verbose output");
+   }
+}
+if ($icuheaders =~ /\s/) {
+    like($conf->data->get( 'ccflags' ),
+        qr/-I \"\Q$icuheaders\E\"/,
+        "ccflags augmented as expected"
+    );
+}
+else {
+    like($conf->data->get( 'ccflags' ),
+        qr/-I \Q$icuheaders\E/,
+        "ccflags augmented as expected"
+    );
+}
+$conf->data->set( ccflags => $status ); # re-set for next test
+
+{
+    my ($stdout, $stderr);
+    capture(
+        sub {
+           auto::icu::_handle_ccflags_status($conf,
+               {
+                   ccflags_status  => 0,
+                   verbose         => 0,
+                   icuheaders      => $icuheaders,
+               },
+           );
+       },
+       \$stdout,
+       \$stderr,
+   );
+
+   ok(! $stdout, "No verbose output, as expected");
+}
+
+if ($icuheaders =~ /\s/) {
+    like($conf->data->get( 'ccflags'),
+        qr/-I \"\Q$icuheaders\E\"/,
+        "ccflags augmented as expected"
+    );
+}
+else {
+    like($conf->data->get( 'ccflags'),
+        qr/-I \Q$icuheaders\E/,
+        "ccflags augmented as expected"
+    );
+}
+$conf->data->set( ccflags => $status ); # re-set for next test
+
+########## _set_no_configure_with_icu() ##########
+
+$conf->data->set( 'has_icu', undef );
+$conf->data->set( 'icu_shared', undef );
+$conf->data->set( 'icu_dir', undef );
+my $result = q{hooray!};
+$step->_set_no_configure_with_icu($conf, $result);
+is($conf->data->get( 'has_icu' ), 0,
+    "Got expected value for 'has_icu'");
+is($conf->data->get( 'icu_shared' ), q{},
+    "Got expected value for 'icu_shared'");
+is($conf->data->get( 'icu_dir' ), q{},
+    "Got expected value for 'icu_dir'");
+is($step->{result}, $result, "Got expected result");
+# reset for next test
+$conf->data->set( 'has_icu', undef );
+$conf->data->set( 'icu_shared', undef );
+$conf->data->set( 'icu_dir', undef );
+
+$conf->replenish($serialized);
+
+########## --without-icu; --icu-config=none ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--without-icu}, q{--icu-config=none}  ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+
+is( $conf->data->get('has_icu'), 0,
+    "Got expected value for 'has_icu'" );
+is( $conf->data->get('icu_shared'), q{},
+    "Got expected value for 'icu_shared'" );
+is( $conf->data->get('icu_dir'), q{},
+    "Got expected value for 'icu_dir'" );
+is( $step->result(), 'not requested', "Got expected result" );
+
+$conf->replenish($serialized);
+
+########## --icu-config=1; --icuheaders; --icushared ##########
+
+{
+    my ($stdout, $stderr, $ret);
+    eval { ($stdout, $stderr, $ret) =
+        capture_output( qw| icu-config --exists | ); };
+    SKIP: {
+        skip "icu-config not available", 9 if $stderr;
+        ($args, $step_list_ref) = process_options( {
+            argv => [
+                q{--icu-config=1},
+                q{--icuheaders=alpha},
+                q{--icushared=beta}
+            ],
+            mode => q{configure},
+        } );
+        rerun_defaults_for_testing($conf, $args );
+        $conf->add_steps($pkg);
+        $conf->options->set( %{$args} );
+        $step = test_step_constructor_and_description($conf);
+        {
+            my ($stdout, $stderr, $ret);
+            capture(
+                sub { $ret = $step->runstep($conf); },
+                \$stdout,
+                \$stderr,
+            );
+            ok(! defined $ret, "runstep() returned undefined value as expected");
+            like($stderr, qr/error: icuheaders not defined or invalid/s,
+                "Got expected warnings");
+            like($stderr, qr/Something is wrong with your ICU installation/s,
+                "Got expected warnings");
+        }
+    }
+}
+
+$conf->replenish($serialized);
+
+########## --verbose ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--verbose} ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$phony = q{phony};
+$step->{icuconfig_default} = $phony;
+
+{
+    my ($stdout, $stderr);
+    my $ret;
+    capture(
+        sub { $ret = $step->runstep($conf); },
+        \$stdout,
+        \$stderr,
+    );
+    ok( $ret, "runstep() returned true value" );
+    my $expected = q{no icu-config};
+    is($step->result(), $expected,
+        "Got expected return value: $expected");
+    like($stdout,
+        qr/Discovered $step->{icuconfig_default} --exists returns/s,
+        "Got expected verbose output re return value",
+    );
+    like($stdout,
+        qr/Could not locate an icu-config program/s,
+        "Got expected verbose output re inability to locate icu-config program",
+    );
+}
+$step->set_result( q{} );
+
+$conf->options->set( verbose => undef );
+{
+    my ($stdout, $stderr);
+    my $ret;
+    capture(
+        sub { $ret = $step->runstep($conf); },
+        \$stdout,
+        \$stderr,
+    );
+    ok( $ret, "runstep() returned true value" );
+    my $expected = q{no icu-config};
+    is($step->result(), $expected,
+        "Got expected return value: $expected");
+    ok(! $stdout, "No verbose output captured, as expected");
+}
+
+$conf->replenish($serialized);
+
+########## --icuheaders ##########
+
+{
+    my ($stdout, $stderr, $ret);
+    eval { ($stdout, $stderr, $ret) =
+        capture_output( qw| icu-config --exists | ); };
+    SKIP: {
+        skip "icu-config not available", 10 if $stderr;
+        ($args, $step_list_ref) = process_options(
+            {
+                argv => [ q{--icuheaders=alpha}, ],
+                mode => q{configure},
+            }
+        );
+
+        rerun_defaults_for_testing($conf, $args );
+        $conf->add_steps($pkg);
+        $conf->options->set( %{$args} );
+        $step = test_step_constructor_and_description($conf);
+
+        {
+            my ($stdout, $stderr, $ret);
+            capture(
+                sub { $ret = $step->runstep($conf); },
+                \$stdout,
+                \$stderr,
+            );
+            ok(! defined $ret, "runstep() returned undefined value as expected");
+            like($stderr, qr/error: icushared not defined/s,
+                "Got expected warnings");
+            like($stderr, qr/error: icuheaders not defined or invalid/s,
+                "Got expected warnings");
+            like($stderr, qr/Something is wrong with your ICU installation/s,
+                "Got expected warnings");
+        }
+    }
+}
+
+$conf->replenish($serialized);
+
+########## --verbose; _try_icuconfig() ##########
+
+{
+    my ($stdout, $stderr, $ret);
+    eval { ($stdout, $stderr, $ret) =
+        capture_output( qw| icu-config --exists | ); };
+    SKIP: {
+        skip "icu-config not available", 12 if $stderr;
+        ($args, $step_list_ref) = process_options( {
+            argv => [ q{--verbose}, ],
+            mode => q{configure},
+        } );
+        rerun_defaults_for_testing($conf, $args );
+        $conf->add_steps($pkg);
+        $conf->options->set( %{$args} );
+        $step = test_step_constructor_and_description($conf);
+        {
+            my ($stdout, $stderr, $ret);
+            my $icuconfig;
+            my ($without, $icushared, $icuheaders);
+            capture(
+                sub {
+                    $icuconfig = $step->_handle_icuconfig_opt(1);
+                    ($without, $icushared, $icuheaders) = $step->_try_icuconfig(
+                        $conf,
+                        {
+                            without         => 0,
+                            autodetect      => 1,
+                            icuconfig       => $icuconfig,
+                            verbose         => 1,
+                        }
+                    );
+                },
+                \$stdout,
+                \$stderr,
+            );
+            like($stdout, qr/Trying $icuconfig with '--ldflags'/s,
+                "Got expected verbose output re --ldflags");
+            like($stdout, qr/icushared:  captured/s,
+                "Got expected verbose output re icushared");
+            like($stdout, qr/For icushared, found \Q$icushared\E and $without/s,
+                "Got expected verbose output re icushared");
+            like($stdout, qr/Trying $icuconfig with '--prefix'/s,
+                "Got expected verbose output re --prefix");
+            like($stdout, qr/icuheaders:  captured/s,
+                "Got expected verbose output re icuheaders");
+            like($stdout, qr/For icuheaders, found \Q$icuheaders\E and $without/s,
+                "Got expected verbose output re icuheaders");
+        }
+    }
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/icu-01.t - test auto::icu
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/icu-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::icu.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::icu, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/inline-01.t (from r40255, trunk/t/steps/auto/inline-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/inline-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/inline-01.t)
@@ -0,0 +1,165 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/inline-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  37;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::inline');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+########### regular  ###########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::inline};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+
+$conf->replenish($serialized);
+
+########### --inline ###########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--inline} ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+
+$conf->replenish($serialized);
+
+########### _evaluate_inline() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+my $test = 1;
+ok($step->_evaluate_inline($conf, $test),
+    "_evaluate_inline() returned true value");
+is($step->result, q{yes}, "Got expected result");
+is($conf->data->get( 'inline' ), 1,
+    "'inline' attribute has expected value");;
+
+$conf->replenish($serialized);
+
+########### _evaluate_inline() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$test = 0;
+ok($step->_evaluate_inline($conf, $test),
+    "_evaluate_inline() returned true value");
+is($step->result, q{no}, "Got expected result");
+is($conf->data->get( 'inline' ), q{},
+    "'inline' attribute has expected value");;
+
+$conf->replenish($serialized);
+
+########### _evaluate_inline(); --verbose ###########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--verbose} ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    my $test = 1;
+    my $stdout;
+    my $ret = capture(
+        sub { $step->_evaluate_inline($conf, $test) },
+        \$stdout
+    );
+    ok($ret, "_evaluate_inline() returned true value");
+    is($step->result, q{yes}, "Got expected result");;
+    is($conf->data->get( 'inline' ), 1,
+        "'inline' attribute has expected value");
+}
+
+$conf->replenish($serialized);
+
+########### _second_probe_for_inline(); _evaluate_inline() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$test = 0;
+$test = $step->_second_probe_for_inline($conf, $test);
+ok($step->_evaluate_inline($conf, $test),
+    "_evaluate_inline() returned true value");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/inline-01.t - test auto::inline
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/inline-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::inline.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::inline, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/isreg-01.t (from r40255, trunk/t/steps/auto/isreg-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/isreg-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/isreg-01.t)
@@ -0,0 +1,116 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/isreg-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 23;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::isreg');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########## regular ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+
+my $pkg = q{auto::isreg};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set(%{$args});
+my $step = test_step_constructor_and_description($conf);
+ok($step->runstep($conf), "runstep() returned true value");
+
+$conf->replenish($serialized);
+
+########## _evaluate_isreg() ##########
+
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+{
+    my $anyerror;
+    my $stdout;
+    my $ret = capture(
+        sub { $step->_evaluate_isreg($conf, $anyerror) },
+        \$stdout
+    );
+    ok($ret, "_evaluate_isreg returned true value");
+    is($conf->data->get('isreg'), 1, "'isreg' set to true value as expected");
+    is($step->result, 'yes', "Got expected result");
+}
+
+$conf->replenish($serialized);
+
+########## _evaluate_isreg(); --verbose ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ q{--verbose} ],
+    mode            => q{configure},
+} );
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+{
+    my $anyerror = 1;
+    my $stdout;
+    my $ret = capture(
+        sub { $step->_evaluate_isreg($conf, $anyerror) },
+        \$stdout
+    );
+    ok($ret, "_evaluate_isreg returned true value");
+    is($conf->data->get('isreg'), 0, "'isreg' set to false value as expected");
+    is($step->result, 'no', "Got expected result");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/isreg-01.t - test auto::isreg
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/isreg-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::isreg.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::isreg, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/jit-01.t (from r40255, trunk/t/steps/auto/jit-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/jit-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/jit-01.t)
@@ -0,0 +1,396 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/jit-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  51;
+use Carp;
+use Cwd;
+use File::Path qw( mkpath );
+use File::Temp qw( tempdir );
+use File::Spec;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::jit');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+
+my ($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::jit};
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+########### _check_jitcapability() ###########
+
+my $cwd = cwd();
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $jitbase = 'foo';
+    my $cpuarch = 'bar';
+    my $osname = 'baz';
+    my $corejitdir = File::Spec->catdir ( $jitbase, $cpuarch );
+    mkpath( $corejitdir, { mode => 0755 } ) or croak "Unable to make testing directory";
+    my $corejit = File::Spec->catfile( $jitbase, $cpuarch, q{core.jit} );
+    is( $step->_check_jitcapability($corejit, $cpuarch, $osname, 8), 0,
+        "Got expected value for _check_jitcapability(): no core.jit case");
+
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $jitbase = 'foo';
+    my $cpuarch = 'bar';
+    my $osname = 'baz';
+    my $corejitdir = File::Spec->catdir ( $jitbase, $cpuarch );
+    mkpath( $corejitdir, { mode => 0755 } ) or croak "Unable to make testing directory";
+    my $corejit = File::Spec->catfile( $jitbase, $cpuarch, q{core.jit} );
+    open my $FH, '>', $corejit
+        or croak "Unable to open handle to file for testing";
+    print $FH qq{Hello, JIT\n};
+    close $FH or croak "Unable to close handle to file for testing";
+    is( $step->_check_jitcapability($corejit, $cpuarch, $osname, 8), 0,
+        "Got expected value for _check_jitcapability(): no JIT on this architecture case");
+
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $jitbase = 'foo';
+    my $cpuarch = 'bar';
+    my $osname = 'baz';
+    my $corejitdir = File::Spec->catdir ( $jitbase, $cpuarch );
+    mkpath( $corejitdir, { mode => 0755 } ) or croak "Unable to make testing directory";
+    my $corejit = File::Spec->catfile( $jitbase, $cpuarch, q{core.jit} );
+    open my $FH, '>', $corejit
+        or croak "Unable to open handle to file for testing";
+    print $FH qq{Hello, JIT\n};
+    close $FH or croak "Unable to close handle to file for testing";
+    my $orig = $step->{jit_is_working};
+    $step->{jit_is_working} = { $cpuarch => 1 };
+    is( $step->_check_jitcapability($corejit, $cpuarch, $osname, 8), 1,
+        "Got expected value for _check_jitcapability(): mock JIT case");
+    $step->{jit_is_working} = $orig;
+
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $jitbase = 'foo';
+    my $cpuarch = 'i386';
+    my $osname = 'darwin';
+    my $corejitdir = File::Spec->catdir ( $jitbase, $cpuarch );
+    mkpath( $corejitdir, { mode => 0755 } ) or croak "Unable to make testing directory";
+    my $corejit = File::Spec->catfile( $jitbase, $cpuarch, q{core.jit} );
+    open my $FH, '>', $corejit
+        or croak "Unable to open handle to file for testing";
+    print $FH qq{Hello, JIT\n};
+    close $FH or croak "Unable to close handle to file for testing";
+    my $orig = $step->{jit_is_working};
+    $step->{jit_is_working} = { $cpuarch => 1 };
+    is( $step->_check_jitcapability($corejit, $cpuarch, $osname, 8), 0,
+        "Got expected value for _check_jitcapability(): mock darwin-i386 case");
+    $step->{jit_is_working} = $orig;
+
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $jitbase = 'foo';
+    my $cpuarch = 'i386';
+    my $osname = 'MSWin32';
+    my $corejitdir = File::Spec->catdir ( $jitbase, $cpuarch );
+    mkpath( $corejitdir, { mode => 0755 } ) or croak "Unable to make testing directory";
+    my $corejit = File::Spec->catfile( $jitbase, $cpuarch, q{core.jit} );
+    open my $FH, '>', $corejit
+        or croak "Unable to open handle to file for testing";
+    print $FH qq{Hello, JIT\n};
+    close $FH or croak "Unable to close handle to file for testing";
+    my $orig = $step->{jit_is_working};
+    $step->{jit_is_working} = { $cpuarch => 1 };
+    is( $step->_check_jitcapability($corejit, $cpuarch, $osname, 4), 0,
+        "Got expected value for _check_jitcapability(): mock single-float");
+    $step->{jit_is_working} = $orig;
+
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+########### _handle_asm() ###########
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $jitbase = 'foo';
+    my $cpuarch = 'bar';
+    my $jitarchname = "${cpuarch}-baz";
+    my $asmdir = File::Spec->catdir( $jitbase, $cpuarch );
+    mkpath( $asmdir, { mode => 0755 } ) or croak "Unable to make testing directory";
+    mkpath( q{src}, { mode => 0755 } ) or croak "Unable to make testing directory";
+
+    ok(auto::jit::_handle_asm( {
+        conf        => $conf,
+        jitbase     => $jitbase,
+        cpuarch     => $cpuarch,
+        jitarchname => $jitarchname,
+    } ), "_handle_asm() returned successfully");
+    is( $conf->data->get( 'asmfun_o' ), q{},
+        "Got expected value for asmfun_o: no asm case");
+    $conf->data->set( asmfun_o => undef ); # reset for next test
+
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $jitbase = 'foo';
+    my $cpuarch = 'bar';
+    my $jitarchname = "${cpuarch}-baz";
+    my $asmdir = File::Spec->catdir( $jitbase, $cpuarch );
+    mkpath( $asmdir, { mode => 0755 } ) or croak "Unable to make testing directory";
+    mkpath( q{src}, { mode => 0755 } ) or croak "Unable to make testing directory";
+
+    my $sjit =
+        File::Spec->catfile( $jitbase, $cpuarch, qq{${jitarchname}.s} );
+    open my $FH, '>', $sjit
+        or croak "Unable to open handle to file for testing";
+    print $FH qq{Hello, JIT\n};
+    close $FH or croak "Unable to close handle to file for testing";
+
+    ok(auto::jit::_handle_asm( {
+        conf        => $conf,
+        jitbase     => $jitbase,
+        cpuarch     => $cpuarch,
+        jitarchname => $jitarchname,
+    } ), "_handle_asm() returned successfully");
+    is( $conf->data->get( 'asmfun_o' ), q{src/asmfun$(O)},
+        "Got expected value for asmfun_o: sjit case");
+    $conf->data->set( asmfun_o => undef ); # reset for next test
+
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $jitbase = 'foo';
+    my $cpuarch = 'bar';
+    my $jitarchname = "${cpuarch}-baz";
+    my $asmdir = File::Spec->catdir( $jitbase, $cpuarch );
+    mkpath( $asmdir, { mode => 0755 } ) or croak "Unable to make testing directory";
+    mkpath( q{src}, { mode => 0755 } ) or croak "Unable to make testing directory";
+    my $asm = File::Spec->catfile( $jitbase, $cpuarch, q{asm.s} );
+    open my $FH, '>', $asm
+        or croak "Unable to open handle to file for testing";
+    print $FH qq{Hello, JIT\n};
+    close $FH or croak "Unable to close handle to file for testing";
+
+    ok(auto::jit::_handle_asm( {
+        conf        => $conf,
+        jitbase     => $jitbase,
+        cpuarch     => $cpuarch,
+        jitarchname => $jitarchname,
+    } ), "_handle_asm() returned successfully");
+    is( $conf->data->get( 'asmfun_o' ), q{src/asmfun$(O)},
+        "Got expected value for asmfun_o: asm case");
+    $conf->data->set( asmfun_o => undef ); # reset for next test
+
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+########### _first_probe_for_exec() ###########
+
+is(  $step->_first_probe_for_exec( 'i386', 'foobar' ), 0,
+    "Got expected value for _first_probe_for_exec");
+is(  $step->_first_probe_for_exec( 'i386', 'openbsd' ), 1,
+    "Got expected value for _first_probe_for_exec");
+is(  $step->_first_probe_for_exec( 'foobar', 'openbsd' ), 0,
+    "Got expected value for _first_probe_for_exec");
+
+########### _handle_execcapable() ###########
+
+if (! defined $conf->data->get('cpuarch') ) {
+    $conf->data->set('cpuarch' => 1)
+}
+
+ok(auto::jit::_handle_execcapable($conf, 1),
+    "_handle_execcapable() returned true value");
+is($conf->data->get('execcapable'), 1,
+    "Got expected value for execcapable");
+# prepare for next test
+$conf->data->set('execcapable' => undef);
+
+ok(auto::jit::_handle_execcapable($conf, 0),
+    "_handle_execcapable() returned true value");
+is($conf->data->get('execcapable'), 0,
+    "Got expected value for execcapable");
+$conf->data->set('execcapable' => undef);
+
+########### _handle_exec_protect() ###########
+
+$conf->data->set( has_exec_protect => undef );
+auto::jit::_handle_exec_protect($conf, 0, 0);
+ok( ! defined $conf->data->get( 'has_exec_protect'),
+    "'has_exec_protect' undefined, as expected");
+
+auto::jit::_handle_exec_protect($conf, 1, 0);
+is( $conf->data->get( 'has_exec_protect'), 1,
+    "Got expected value for 'has_exec_protect'");
+$conf->data->set( has_exec_protect => undef );
+
+{
+    my ($stdout, $stderr);
+    capture(
+        sub { auto::jit::_handle_exec_protect($conf, 0, 1); },
+        \$stdout,
+        \$stderr,
+    );
+    ok( ! defined $conf->data->get( 'has_exec_protect'),
+        "'has_exec_protect' undefined, as expected");
+    like($stdout, qr/no\)/, "Got expected verbose output");
+    $conf->data->set( has_exec_protect => undef );
+}
+
+{
+    my ($stdout, $stderr);
+    capture(
+        sub { auto::jit::_handle_exec_protect($conf, 1, 1); },
+        \$stdout,
+        \$stderr,
+    );
+    is( $conf->data->get( 'has_exec_protect'), 1,
+        "Got expected value for 'has_exec_protect'");
+    like($stdout, qr/yes\)/, "Got expected verbose output");
+    $conf->data->set( has_exec_protect => undef );
+}
+
+$conf->replenish($serialized);
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--jitcapable=0}, q{--verbose}  ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+# Mock some values so that we can get to the point inside runstep() where the
+# command-line option for jitcapable is relevant.
+
+$cwd = cwd();
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    chdir $tdir or croak "Unable to change to temporary directory";
+    my $jitbase = 'foo';
+    my $cpuarch = 'i386';
+    my $osname = 'darwin';
+    my $corejitdir = File::Spec->catdir ( $jitbase, $cpuarch );
+    mkpath( $corejitdir, { mode => 0755 } ) or croak "Unable to make testing directory";
+    my $corejit = File::Spec->catfile( $jitbase, $cpuarch, q{core.jit} );
+    open my $FH, '>', $corejit
+        or croak "Unable to open handle to file for testing";
+    print $FH qq{Hello, JIT\n};
+    close $FH or croak "Unable to close handle to file for testing";
+    my $orig = $step->{jit_is_working};
+    $step->{jit_is_working} = { $cpuarch => 1 };
+    $conf->data->set( cpuarch => $cpuarch );
+    $conf->data->set( osname => $osname );
+    {
+        my ($stdout, $stderr, $ret);
+        capture(
+            sub { $ret = $step->runstep($conf); },
+            \$stdout,
+            \$stderr,
+        );
+        ok( $ret, "runstep() returned true value" );
+        like($stdout, qr/yes|no/s, "Got expected verbose output");
+    }
+    $step->{jit_is_working} = $orig;
+    $conf->data->set( cpuarch => undef );
+    $conf->data->set( osname => undef );
+
+    is( $conf->data->get( 'jitarchname' ), 'nojit',
+        "Got expected value for jitarchname");
+    is( $conf->data->get( 'jitcapable' ), 0,
+        "Got expected value for jitcapable");
+    is( $conf->data->get( 'execcapable' ), 0,
+        "Got expected value for execcapable");
+    is( $conf->data->get( 'cc_hasjit' ), '',
+        "Got expected value for cc_hasjit");
+    is( $conf->data->get( 'TEMP_jit_o' ), '',
+        "Got expected value for TEMP_jit_o");
+    is( $conf->data->get( 'TEMP_exec_h' ), '',
+        "Got expected value for TEMP_exec_h");
+    is( $conf->data->get( 'TEMP_exec_o' ), '',
+        "Got expected value for TEMP_exec_o");
+    is( $conf->data->get( 'TEMP_exec_dep' ), '',
+        "Got expected value for TEMP_exec_dep");
+    is( $step->result(), 'no',
+        "Got expected result for no JIT");
+
+    chdir $cwd or croak "Unable to change back to starting directory";
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/jit-01.t - test auto::jit
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/jit-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::jit.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::jit, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/memalign-01.t (from r40255, trunk/t/steps/auto/memalign-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/memalign-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/memalign-01.t)
@@ -0,0 +1,275 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/memalign-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 69;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::memalign');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########### regular ###########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::memalign};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+$conf->data->set( memalign => 'memalign');
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($step->result(), q{already set}, "Expected result was set");
+is($conf->data->get('memalign'),
+    q{memalign},
+    "memalign set as expected"
+);
+
+$conf->replenish($serialized);
+
+########### _set_malloc_header()  ###########
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    $conf->data->set('i_malloc' => 1);
+    ok(auto::memalign::_set_malloc_header($conf),
+        "_set_malloc_header() returned true value");
+    is($conf->data->get( 'malloc_header' ), 'malloc.h',
+        "malloc_header has expected value");
+    $conf->data->set('i_malloc' => undef); # reset for next test
+}
+
+{
+    $conf->data->set('i_malloc' => 0);
+    ok(auto::memalign::_set_malloc_header($conf),
+        "_set_malloc_header() returned true value");
+    is($conf->data->get( 'malloc_header' ), 'stdlib.h',
+        "malloc_header has expected value");
+    $conf->data->set('i_malloc' => undef); # reset for next test
+}
+
+########### _set_ptrcast()  ###########
+
+{
+    $conf->data->set('ptrsize' => 2);
+    $conf->data->set('intsize' => 2);
+    ok(auto::memalign::_set_ptrcast($conf),
+        "_set_ptrcast() returned true value");
+    is($conf->data->get( 'ptrcast' ), 'int',
+        "ptrcast has expected value");
+    # reset for next test
+    $conf->data->set('ptrsize' => undef);
+    $conf->data->set('intsize' => undef);
+}
+
+{
+    $conf->data->set('ptrsize' => 2);
+    $conf->data->set('intsize' => 4);
+    ok(auto::memalign::_set_ptrcast($conf),
+        "_set_ptrcast() returned true value");
+    is($conf->data->get( 'ptrcast' ), 'long',
+        "ptrcast has expected value");
+    # reset for next test
+    $conf->data->set('ptrsize' => undef);
+    $conf->data->set('intsize' => undef);
+}
+
+########### _set_memalign()  ###########
+
+{
+    $conf->data->set( malloc_header => 'malloc.h' );
+    ok($step->_set_memalign($conf, 1, 1),
+        "_set_memalign() returned true value");
+    ok(! defined $conf->data->get( 'malloc_header' ),
+        "malloc_header now undef as expected");
+    is($conf->data->get( 'memalign' ), 'posix_memalign',
+        "Got expected value for memalign");
+    is($step->result(), q{yes}, "Got expected result");
+}
+
+{
+    $conf->data->set( malloc_header => 'malloc.h' );
+    ok($step->_set_memalign($conf, 1, 0),
+        "_set_memalign() returned true value");
+    ok(! defined $conf->data->get( 'malloc_header' ),
+        "malloc_header now undef as expected");
+    is($conf->data->get( 'memalign' ), 'memalign',
+        "Got expected value for memalign");
+    is($step->result(), q{yes}, "Got expected result");
+}
+
+{
+    $conf->data->set( malloc_header => 'malloc.h' );
+    ok($step->_set_memalign($conf, 0, 1),
+        "_set_memalign() returned true value");
+    ok(! defined $conf->data->get( 'malloc_header' ),
+        "malloc_header now undef as expected");
+    is($conf->data->get( 'memalign' ), 'posix_memalign',
+        "Got expected value for memalign");
+    is($step->result(), q{no}, "Got expected result");
+}
+
+{
+    $conf->data->set( malloc_header => 'malloc.h' );
+    ok($step->_set_memalign($conf, 0, 0),
+        "_set_memalign() returned true value");
+    ok(! defined $conf->data->get( 'malloc_header' ),
+        "malloc_header now undef as expected");
+    is($conf->data->get( 'memalign' ), '',
+        "Got expected value (empty string) for memalign");
+    is($step->result(), q{no}, "Got expected result");
+}
+
+$conf->replenish($serialized);
+
+########### --verbose; _set_memalign() ###########
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--verbose} ],
+        mode => q{configure},
+    }
+);
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    $conf->data->set( malloc_header => 'malloc.h' );
+    my ($rv, $stdout, $expected);
+    $expected = 'posix_memalign';
+    capture(
+        sub { $rv = $step->_set_memalign($conf, 1, 1); },
+        \$stdout,
+    );
+    ok($rv, "_set_memalign() returned true value");
+    ok(! defined $conf->data->get( 'malloc_header' ),
+        "malloc_header now undef as expected");
+    is($conf->data->get( 'memalign' ), $expected,
+        "Got expected value for memalign");
+    is($step->result(), q{yes}, "Got expected result");
+    like($stdout, qr/Yep:$expected/,
+        "Got expected verbose output");
+}
+
+{
+    $conf->data->set( malloc_header => 'malloc.h' );
+    my ($rv, $stdout, $expected);
+    $expected = 'memalign';
+    capture(
+        sub { $rv = $step->_set_memalign($conf, 1, 0); },
+        \$stdout,
+    );
+    ok($rv, "_set_memalign() returned true value");
+    ok(! defined $conf->data->get( 'malloc_header' ),
+        "malloc_header now undef as expected");
+    is($conf->data->get( 'memalign' ), $expected,
+        "Got expected value for memalign");
+    is($step->result(), q{yes}, "Got expected result");
+    like($stdout, qr/Yep:$expected/,
+        "Got expected verbose output");
+}
+
+{
+    $conf->data->set( malloc_header => 'malloc.h' );
+    my ($rv, $stdout, $expected);
+    $expected = 'posix_memalign';
+    capture(
+        sub { $rv = $step->_set_memalign($conf, 0, 1); },
+        \$stdout,
+    );
+    ok($rv, "_set_memalign() returned true value");
+    ok(! defined $conf->data->get( 'malloc_header' ),
+        "malloc_header now undef as expected");
+    is($conf->data->get( 'memalign' ), $expected,
+        "Got expected value for memalign");
+    is($step->result(), q{no}, "Got expected result");
+    like($stdout, qr/no/,
+        "Got expected verbose output");
+}
+
+{
+    $conf->data->set( malloc_header => 'malloc.h' );
+    my ($rv, $stdout, $expected);
+    $expected = '';
+    capture(
+        sub { $rv = $step->_set_memalign($conf, 0, 0); },
+        \$stdout,
+    );
+    ok($rv, "_set_memalign() returned true value");
+    ok(! defined $conf->data->get( 'malloc_header' ),
+        "malloc_header now undef as expected");
+    is($conf->data->get( 'memalign' ), $expected,
+        "Got expected value (empty string) for memalign");
+    is($step->result(), q{no}, "Got expected result");
+    like($stdout, qr/no/,
+        "Got expected verbose output");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/memalign-01.t - test auto::memalign
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/memalign-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test subroutines exported by
+config::auto::memalign.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::memalign, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/msvc-01.t (from r40255, trunk/t/steps/auto/msvc-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/msvc-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/msvc-01.t)
@@ -0,0 +1,202 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/msvc-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 43;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::msvc');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########## Win32 ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+
+my $pkg = q{auto::msvc};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set(%{$args});
+my $step = test_step_constructor_and_description($conf);
+SKIP: {
+    skip 'MSVC is Windows only', 1 unless $^O =~ /Win32/i;
+    ok($step->runstep($conf), "runstep() returned true value");
+}
+
+$conf->replenish($serialized);
+
+########## _evaluate_msvc() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+my $msvcref = { _MSC_VER => 1399 };
+ok($step->_evaluate_msvc($conf, $msvcref),
+    "_evaluate_msvc returned true value");
+is($step->result, 'yes, 13.99', "Got expected result");
+is($conf->data->get('msvcversion'), '13.99',
+    "Got expected msvc version string");
+
+$conf->replenish($serialized);
+
+########## _evaluate_msvc() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+$msvcref = { _MSC_VER => 1400 };
+ok($step->_evaluate_msvc($conf, $msvcref),
+    "_evaluate_msvc returned true value");
+is($step->result, 'yes, 14.0', "Got expected result");
+is($conf->data->get('msvcversion'), '14.0',
+    "Got expected msvc version string");
+like(
+    $conf->data->get('ccflags'),
+    qr/\-D_CRT_SECURE_NO_DEPRECATE/,
+    "ccflags appropriately adjusted given MSVC version"
+);
+
+$conf->replenish($serialized);
+
+########## _handle_not_msvc() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+
+my ($status, $major, $minor, $verbose);
+
+$major = 13;
+$minor = 99;
+$verbose = undef;
+$status = $step->_handle_not_msvc($conf, $major, $minor, $verbose);
+ok(! defined $status, 'sub return value, as expected, not yet set');
+ok(! $step->result(), 'result, as expected, not yet set');
+
+$major = 13;
+$minor = undef;
+$verbose = undef;
+$status = $step->_handle_not_msvc($conf, $major, $minor, $verbose);
+ok($status, 'sub return value, as expected, set to true value');
+is($step->result(), q{no}, 'Got expected result');
+ok(! defined ($conf->data->get( 'msvcversion' )),
+    'msvcversion is undef, as expected');
+
+$major = undef;
+$minor = 99;
+$verbose = undef;
+$status = $step->_handle_not_msvc($conf, $major, $minor, $verbose);
+ok($status, 'sub return value, as expected, set to true value');
+is($step->result(), q{no}, 'Got expected result');
+ok(! defined ($conf->data->get( 'msvcversion' )),
+    'msvcversion is undef, as expected');
+
+{
+    my $stdout;
+    $major = undef;
+    $minor = undef;
+    $verbose = 1;
+    capture(
+        sub { $status =
+            $step->_handle_not_msvc($conf, $major, $minor, $verbose); },
+        \$stdout,
+    );
+    ok($status, 'sub return value, as expected, set to true value');
+    is($step->result(), q{no}, 'Got expected result');
+    ok(! defined ($conf->data->get( 'msvcversion' )),
+        'msvcversion is undef, as expected');
+    like($stdout, qr/\(no\)/, "Got expected verbose output");
+    # Prepare for the next test.
+    $step->set_result(undef);
+}
+
+########## _compose_msvcversion() ##########
+
+my $msvcversion;
+
+$major = 13;
+$minor = 99;
+$verbose = undef;
+$msvcversion = $step->_compose_msvcversion($major, $minor, $verbose);
+is($msvcversion, '13.99', "Got expected MSVC version");
+is($step->result(), 'yes, 13.99', "Got expected result");
+$step->set_result(undef);
+
+{
+    my $stdout;
+    $major = 13;
+    $minor = 99;
+    $verbose = 1;
+    capture(
+        sub { $msvcversion =
+            $step->_compose_msvcversion($major, $minor, $verbose); },
+        \$stdout,
+    );
+    is($msvcversion, '13.99', "Got expected MSVC version");
+    is($step->result(), 'yes, 13.99', "Got expected result");
+    $step->set_result(undef);
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/msvc-01.t - test auto::msvc
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/msvc-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::msvc.  Some tests run only if the system is
+Win32.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::msvc, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/neg_0-01.t (from r40255, trunk/t/steps/auto/neg_0-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/neg_0-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/neg_0-01.t)
@@ -0,0 +1,165 @@
+#! perl
+# Copyright (C) 2009, Parrot Foundation.
+# $Id$
+# auto_neg_0-01.t
+
+use strict;
+use warnings;
+
+use Test::More tests => 31;
+use Carp;
+
+use lib qw( lib t/configure/testlib );
+
+use_ok('config::init::defaults');
+use_ok('config::auto::neg_0');
+
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput 'capture';
+
+########### regular ###########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => 'configure',
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+test_step_thru_runstep( $conf, 'init::defaults', $args );
+my $pkg = 'auto::neg_0';
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $ret = $step->runstep($conf);
+ok( $ret, 'runstep() returned true value' );
+ok( defined $step->result(), 'A result has been defined');
+
+$conf->replenish($serialized);
+
+##### _evaluate_cc_run() #####
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => 'configure',
+    }
+);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+my $d_neg_0;
+my $orig_has_neg_0 = 0;
+my $verbose = $conf->data->get('verbose');
+
+$d_neg_0 = '-0';
+
+is( $step->_evaluate_cc_run($conf, $d_neg_0, $orig_has_neg_0, $verbose),
+    1,
+    '_evaluate_cc_run() completed satisfactorily' );
+
+is( $step->result(), 'yes', 'Got expected result');
+
+$d_neg_0 = '0';
+
+is( $step->_evaluate_cc_run($conf, $d_neg_0, $orig_has_neg_0, $verbose),
+    0,
+    '_evaluate_cc_run() completed satisfactorily' );
+is( $step->result(), 'no', 'Got expected result' );
+
+$conf->replenish($serialized);
+
+########## --verbose; _evaluate_cc_run() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--verbose} ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+$verbose = $conf->options->get('verbose');
+my $has_neg_0;
+
+$d_neg_0 = '-0';
+{
+    my ($stdout, $stderr);
+    capture(
+        sub {
+            $has_neg_0 = $step->_evaluate_cc_run(
+                $conf, $d_neg_0, $orig_has_neg_0, $verbose
+            ),
+        },
+        \$stdout,
+    );
+    is( $has_neg_0, 1,
+        'Got expected return value from _evaluate_cc_run()' );
+    is( $step->result(), 'yes', 'Got expected result: yes' );
+    like( $stdout, qr/\(yes\)/, 'Got expected verbose output' );
+}
+
+$d_neg_0 = '0';
+{
+    my ($stdout, $stderr);
+    capture(
+        sub {
+            $has_neg_0 = $step->_evaluate_cc_run(
+                $conf, $d_neg_0, $orig_has_neg_0, $verbose
+            ),
+        },
+        \$stdout,
+    );
+    is( $has_neg_0, 0,
+        'Got expected return value from _evaluate_cc_run()' );
+    is( $step->result(), 'no', 'Got expected result: no' );
+    like( $stdout, qr/\(no\)/, 'Got expected verbose output' );
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto_neg_0-01.t - test auto::neg_0
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto_neg_0-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::neg_0.
+
+=head1 AUTHOR
+
+Reini Urban
+
+=head1 SEE ALSO
+
+config::auto::neg_0, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/opengl-01.t (from r40255, trunk/t/steps/auto/opengl-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/opengl-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/opengl-01.t)
@@ -0,0 +1,238 @@
+#! perl
+# Copyright (C) 2007-2008, Parrot Foundation.
+# $Id$
+# auto/opengl-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 43;
+use Carp;
+use lib qw( lib );
+use_ok('config::init::defaults');
+use_ok('config::auto::opengl');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########## --without-opengl ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--without-opengl} ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::opengl};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+ok( $step->runstep($conf), "runstep() returned true value");
+is( $step->result(), 'no', "Got expected result" );
+is( $conf->data->get( 'has_opengl' ), 0,
+    "Got expected value for 'has_opengl'");
+
+$conf->replenish($serialized);
+
+########## _select_lib() ##########
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+# Mock OS/C-compiler combinations
+my ($osname, $cc, $initial_libs);
+$initial_libs = $conf->data->get('libs');
+$osname = 'mswin32';
+$cc = 'gcc';
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_gcc       => '-lglut32 -lglu32 -lopengl32',
+    win32_nongcc    => 'glut.lib glu.lib gl.lib',
+    darwin          => '-framework OpenGL -framework GLUT',
+    default         => '-lglut -lGLU -lGL',
+} ),
+    '-lglut32 -lglu32 -lopengl32',
+   "_select_lib() returned expected value");
+
+$osname = 'mswin32';
+$cc = 'cc';
+$initial_libs = $conf->data->get('libs');
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_gcc       => '-lglut32 -lglu32 -lopengl32',
+    win32_nongcc    => 'glut.lib glu.lib gl.lib',
+    darwin          => '-framework OpenGL -framework GLUT',
+    default         => '-lglut -lGLU -lGL',
+} ),
+   'glut.lib glu.lib gl.lib',
+   "_select_lib() returned expected value");
+
+$osname = 'darwin';
+$cc = 'cc';
+$initial_libs = $conf->data->get('libs');
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_gcc       => '-lglut32 -lglu32 -lopengl32',
+    win32_nongcc    => 'glut.lib glu.lib gl.lib',
+    darwin          => '-framework OpenGL -framework GLUT',
+    default         => '-lglut -lGLU -lGL',
+} ),
+   '-framework OpenGL -framework GLUT',
+   "_select_lib() returned expected value");
+
+$osname = 'foobar';
+$cc = 'cc';
+$initial_libs = $conf->data->get('libs');
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_gcc       => '-lglut32 -lglu32 -lopengl32',
+    win32_nongcc    => 'glut.lib glu.lib gl.lib',
+    darwin          => '-framework OpenGL -framework GLUT',
+    default         => '-lglut -lGLU -lGL',
+} ),
+   '-lglut -lGLU -lGL',
+   "_select_lib() returned expected value");
+
+$conf->replenish($serialized);
+
+########## --verbose; _evaluate_cc_run() ##########
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--verbose} ],
+        mode => q{configure},
+    }
+);
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+my @try = qw( 4 freeglut );
+my $test = qq{$try[0] $try[1]\n};
+
+{
+    my ($stdout, $stderr);
+    my ($glut_api_version, $glut_brand);
+    capture(
+        sub { ($glut_api_version, $glut_brand) = $step->_evaluate_cc_run(
+            $test,
+            0,
+        ); },
+        \$stdout,
+        \$stderr,
+    );
+    is( $glut_api_version, $try[0],
+        "Got first expected return value for _evaluate_cc_run()." );
+    is( $glut_brand, $try[1],
+        "Got first expected return value for _evaluate_cc_run()." );
+    ok(! $stdout, "Nothing captured on STDOUT, as expected");
+}
+
+{
+    my ($stdout, $stderr);
+    my ($glut_api_version, $glut_brand);
+    capture(
+        sub { ($glut_api_version, $glut_brand) = $step->_evaluate_cc_run(
+            $test,
+            $conf->options->get( 'verbose' )
+        ); },
+        \$stdout,
+        \$stderr,
+    );
+    is( $glut_api_version, $try[0],
+        "Got first expected return value for _evaluate_cc_run()." );
+    is( $glut_brand, $try[1],
+        "Got first expected return value for _evaluate_cc_run()." );
+    like(
+        $stdout,
+        qr/yes, $glut_brand API version $glut_api_version/,
+        "Got expected verbose output for _evaluate_cc_run()"
+    );
+}
+
+########## _handle_glut() ##########
+
+{
+    my $glut_api_version = '4';
+    my $glut_brand = 'freeglut';
+    ok(auto::opengl::_handle_glut( $conf, 'lib', $glut_api_version, $glut_brand ),
+        "_handle_glut() returned true value");
+    is( $conf->data->get( 'opengl' ),  'define',
+        "Got expected value for opengl");
+    is( $conf->data->get( 'has_opengl' ),  1,
+        "Got expected value for has_opengl");
+    is( $conf->data->get( 'HAS_OPENGL' ),  1,
+        "Got expected value for HAS_OPENGL");
+    is( $conf->data->get( 'glut' ),  'define',
+        "Got expected value for glut");
+    is( $conf->data->get( 'glut_brand' ),  $glut_brand,
+        "Got expected value for glut_brand");
+    is( $conf->data->get( 'has_glut' ),  $glut_api_version,
+        "Got expected value for has_glut");
+    is( $conf->data->get( 'HAS_GLUT' ),  $glut_api_version,
+        "Got expected value for HAS_GLUT");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+  auto/opengl-01.t - test auto::opengl
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/opengl-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test configuration step class auto::opengl.
+
+=head1 AUTHOR
+
+Geoffrey Broadwell; modified from a similar file by James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::opengl, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/ops-01.t (from r40255, trunk/t/steps/auto/ops-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/ops-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/ops-01.t)
@@ -0,0 +1,77 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/ops-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  6;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::ops');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+
+########## ops ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--ops=alpha} ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::ops};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+$conf->options->set('ops' => 'alpha');
+{
+    open STDOUT, '>', "/dev/null" or croak "Unable to open to myout";
+    my $ret = $step->runstep($conf);
+    close STDOUT or croak "Unable to close after myout";
+    ok( $ret, "runstep() returned true value" );
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/ops-01.t - test auto::ops
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/ops-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::ops.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::ops, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/pcre-01.t (from r40255, trunk/t/steps/auto/pcre-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/pcre-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/pcre-01.t)
@@ -0,0 +1,180 @@
+#! perl
+# Copyright (C) 2007-2008, Parrot Foundation.
+# $Id$
+# auto/pcre-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 34;
+use Carp;
+use lib qw( lib );
+use_ok('config::init::defaults');
+use_ok('config::auto::pcre');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########## --without-pcre ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--without-pcre} ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::pcre};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+ok( $step->runstep($conf), "runstep() returned true value");
+is( $step->result(), 'no', "Got expected result" );
+is( $conf->data->get( 'HAS_PCRE' ), 0,
+    "Got expected value for 'HAS_PCRE'");
+
+$conf->replenish($serialized);
+
+########## _select_lib() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+# Mock values for OS and C-compiler
+my ($osname, $cc, $initial_value);
+
+$osname = 'mswin32';
+$cc = 'gcc';
+$initial_value = $conf->data->get( 'libs' );
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'pcre.lib',
+    default         => '-lpcre',
+} ),
+   '-lpcre',
+   "_select_lib() returned expected value");
+
+$osname = 'mswin32';
+$cc = 'cc';
+$initial_value = $conf->data->get( 'libs' );
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'pcre.lib',
+    default         => '-lpcre',
+} ),
+   'pcre.lib',
+   "_select_lib() returned expected value");
+
+$osname = 'foobar';
+$cc = 'gcc';
+$initial_value = $conf->data->get( 'libs' );
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'pcre.lib',
+    default         => '-lpcre',
+} ),
+   '-lpcre',
+   "_select_lib() returned expected value");
+
+########## _evaluate_cc_run() ##########
+
+# Mock different outcomes of _evaluate_cc_run
+my ($test, $has_pcre);
+my $verbose = $conf->options->get('verbose');
+
+$test = q{pcre foobar};
+ok(! $step->_evaluate_cc_run($test, $verbose),
+    "Got expected setting for HAS_PCRE");
+
+$test = q{pcre 4.1};
+ok($step->_evaluate_cc_run($test, $verbose),
+    "_evaluate_cc_run returned true value as expected");
+is($step->result(), q{yes, 4.1}, "Got expected PCRE version");
+
+$conf->replenish($serialized);
+
+########## --verbose; _evaluate_cc_run() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--verbose} ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+# Mock different outcomes of _evaluate_cc_run
+$verbose = $conf->options->get('verbose');
+
+$test = q{pcre 4.0};
+{
+    my ($stdout, $stderr);
+    capture(
+        sub {
+            $has_pcre = $step->_evaluate_cc_run($test, $verbose);
+        },
+        \$stdout,
+    );
+    ok($has_pcre, "_evaluate_cc_run returned true value as expected");
+    is($step->result(), q{yes, 4.0}, "Got expected PCRE version");
+    like($stdout, qr/\(yes, 4\.0\)/, "Got expected verbose output");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+  auto/pcre-01.t - test auto::pcre
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/pcre-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test configuration step class auto::pcre.
+
+=head1 AUTHOR
+
+Alberto SimÃes.
+
+=head1 SEE ALSO
+
+config::auto::pcre, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/perldoc-01.t (from r40255, trunk/t/steps/auto/perldoc-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/perldoc-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/perldoc-01.t)
@@ -0,0 +1,140 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/perldoc-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 32;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::perldoc');
+use Parrot::BuildUtil;
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########## regular ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+
+my $pkg = q{auto::perldoc};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set(%{$args});
+my $step = test_step_constructor_and_description($conf);
+ok($step->runstep($conf), "runstep() completed successfully");
+ok(defined($step->result), "Result was defined");
+my $has = $conf->data->get('has_perldoc');
+ok( ( ($has == 1) or ($has == 0) ),
+    "Got an acceptable value for 'has_perldoc'");
+my $new = $conf->data->get('new_perldoc');
+ok( ( ($new == 1) or ($new == 0) ),
+    "Got an acceptable value for 'new_perldoc'");
+
+$conf->replenish($serialized);
+
+########## _initial_content_check() ##########
+
+my $content = undef;
+my $rv = $step->_initial_content_check($conf, $content);
+ok(! defined $rv, "Got expected return value when content was undefined");
+is($step->result(),
+    q{no}, "Got expected result when content was undefined");
+
+########## _handle_version() ##########
+
+my $version;
+$version = 0;
+ok(auto::perldoc::_handle_version($conf, $version, 'not_a_path'),
+    "_handle_version() returned true value");
+is($conf->data->get('has_perldoc'), 0,
+    "Got expected value for 'has_perldoc'");
+is($conf->data->get('new_perldoc'), 0,
+    "Got expected value for 'new_perldoc'");
+is($conf->data->get('perldoc'), 'echo',
+    "... and expected 'perldoc' path");
+
+$version = 1;
+ok(auto::perldoc::_handle_version($conf, $version, 'path_to_pd'),
+    "_handle_version() returned true value");
+is($conf->data->get('has_perldoc'), 1,
+    "Got expected value for 'has_perldoc'");
+is($conf->data->get('new_perldoc'), 0,
+    "Got expected value for 'new_perldoc'");
+is($conf->data->get('perldoc'), 'path_to_pd',
+    "... and expected 'perldoc' path");
+
+$version = 2;
+ok(auto::perldoc::_handle_version($conf, $version, 'another_path_to_pd'),
+    "_handle_version() returned true value");
+is($conf->data->get('has_perldoc'), 1,
+    "Got expected value for 'has_perldoc'");
+is($conf->data->get('new_perldoc'), 1,
+    "Got expected value for 'new_perldoc'");
+is($conf->data->get('perldoc'), 'another_path_to_pd',
+    "... and expected 'perldoc' path");
+
+########## _handle_old_perldoc() ##########
+
+$version = $step->_handle_old_perldoc();
+is($version, 1, "Got expected version setting for old perldoc");
+is($step->result(), q{yes, old version},
+    "Got expected result when old perldoc");
+
+########## _handle_no_perldoc() ##########
+
+$version = $step->_handle_no_perldoc();
+is($version, 0, "Got expected version setting for no perldoc");
+is($step->result(), q{failed}, "Got expected result when no perldoc");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/perldoc-01.t - test auto::perldoc
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/perldoc-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::perldoc.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::perldoc, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/pmc-01.t (from r40255, trunk/t/steps/auto/pmc-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/pmc-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/pmc-01.t)
@@ -0,0 +1,177 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/pmc-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  28;
+use Carp;
+use Cwd;
+use File::Path qw| mkpath |;
+use File::Temp qw| tempdir |;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::pmc');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+
+########## regular ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::pmc};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+
+$conf->replenish($serialized);
+
+########## contains_pccmethod()  ##########
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+my $cwd = cwd();
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    ok( chdir $tdir, 'changed to temp directory for testing' );
+
+    my $pmc_with_PCCMETHOD = q{yes.pmc};
+    open my $IN1, ">", $pmc_with_PCCMETHOD
+        or croak "Unable to open file for writing: $!";
+    print $IN1 "PCCMETHOD\n";
+    close $IN1 or croak "Unable to close file after writing: $!";
+    ok(auto::pmc::contains_pccmethod($pmc_with_PCCMETHOD),
+        "Internal subroutine contains_pccmethod returns true as expected");
+
+    my $pmc_sans_PCCMETHOD = q{no.pmc};
+    open my $IN2, ">", $pmc_sans_PCCMETHOD
+        or croak "Unable to open file for writing: $!";
+    print $IN2 "Hello world\n";
+    close $IN2 or croak "Unable to close file after writing: $!";
+    ok( !  defined (
+            auto::pmc::contains_pccmethod($pmc_sans_PCCMETHOD)
+        ), "Internal subroutine contains_pccmethod returns true as expected"
+    );
+
+    my $file = 'foobar';
+    eval { auto::pmc::contains_pccmethod($file); };
+    like($@, qr/Can't read '$file'/, "Got expected 'die' message"); #'
+
+    ok( chdir $cwd, 'changed back to original directory after testing' );
+}
+
+########## get_pmc_order()  ##########
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    ok( chdir $tdir, 'changed to temp directory for testing' );
+
+    my $pmcdir = qq{$tdir/src/pmc};
+    ok(mkpath($pmcdir, { mode => 0755 }), "Able to make directory for testing");
+    my $num = qq{$pmcdir/pmc.num};
+    open my $IN3, ">", $num or croak "Unable to open file for writing: $!";
+    print $IN3 "# comment line\n";
+    print $IN3 "\n";
+    print $IN3 "default.pmc\t0\n";
+    print $IN3 "null.pmc    1\n";
+    print $IN3 "env.pmc 2\n";
+    print $IN3 "notapmc 3\n";
+    close $IN3 or croak "Unable to close file after writing: $!";
+    my $order_ref = auto::pmc::get_pmc_order();
+    is_deeply(
+        $order_ref,
+        {
+            'default.pmc' => 0,
+            'null.pmc' => 1,
+            'env.pmc' => 2,
+        },
+        "Able to read src/pmc/pmc.num correctly"
+    );
+
+    my @pmcs = qw| env.pmc default.pmc null.pmc other.pmc |;
+    my @sorted_pmcs = auto::pmc::sort_pmcs(@pmcs);
+    is_deeply(
+        \@sorted_pmcs,
+        [ qw| default.pmc null.pmc env.pmc other.pmc | ],
+        "PMCs sorted correctly"
+    );
+
+    ok( chdir $cwd, 'changed back to original directory after testing' );
+}
+
+{
+    my $tdir = tempdir( CLEANUP => 1 );
+    ok( chdir $tdir, 'changed to temp directory for testing' );
+
+    my $pmcdir = qq{$tdir/src/pmc};
+    ok(mkpath($pmcdir, { mode => 0755 }), "Able to make directory for testing");
+    eval { my $order_ref = auto::pmc::get_pmc_order(); };
+    like($@,
+        qr/Can't read src\/pmc\/pmc\.num/, "Got expected 'die' message");
+#'
+
+    ok( chdir $cwd, 'changed back to original directory after testing' );
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/pmc-01.t - test auto::pmc
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/pmc-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::pmc.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::pmc, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/pod2man-01.t (from r40255, trunk/t/steps/auto/pod2man-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/pod2man-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/pod2man-01.t)
@@ -0,0 +1,87 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto_pod2man-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 15;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::pod2man');
+use Parrot::BuildUtil;
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########## regular ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+
+my $pkg = q{auto::pod2man};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set(%{$args});
+my $step = test_step_constructor_and_description($conf);
+ok($step->runstep($conf), "runstep() completed successfully");
+ok(defined($step->result), "Result was defined");
+my $has = $conf->data->get('has_pod2man');
+ok( ( ($has == 1) or ($has == 0) ),
+    "Got an acceptable value for 'has_pod2man'");
+
+$conf->replenish($serialized);
+
+########## _initial_content_check() ##########
+
+my $content = undef;
+my $rv = $step->_initial_content_check($conf, $content);
+ok(! defined $rv, "Got expected return value when content was undefined");
+is($step->result(),
+    q{no}, "Got expected result when content was undefined");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto_pod2man-01.t - test auto::pod2man
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto_pod2man-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::pod2man.
+
+=head1 SEE ALSO
+
+config::auto::pod2man, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/readline-01.t (from r40255, trunk/t/steps/auto/readline-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/readline-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/readline-01.t)
@@ -0,0 +1,128 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/readline-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 14;
+use Carp;
+use Cwd;
+use File::Spec;
+use File::Temp qw( tempdir );
+use lib qw( lib );
+use_ok('config::init::defaults');
+use_ok('config::auto::readline');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw | capture |;
+
+########## _select_lib() ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::readline};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+# Mock values for OS and C-compiler
+my ($osname, $cc);
+$osname = 'mswin32';
+$cc = 'gcc';
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'readline.lib',
+    default         => '-lreadline',
+} ),
+   '-lreadline',
+   "_select_lib() returned expected value");
+
+$osname = 'mswin32';
+$cc = 'cc';
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'readline.lib',
+    default         => '-lreadline',
+} ),
+   'readline.lib',
+   "_select_lib() returned expected value");
+
+$osname = 'foobar';
+$cc = undef;
+is($step->_select_lib( {
+    conf            => $conf,
+    osname          => $osname,
+    cc              => $cc,
+    win32_nongcc    => 'readline.lib',
+    default         => '-lreadline',
+} ),
+   '-lreadline',
+   "_select_lib() returned true value");
+
+$osname = 'foobar';
+$cc = undef;
+eval {
+    $step->_select_lib( [
+        conf            => $conf,
+        osname          => $osname,
+        cc              => $cc,
+        win32_nongcc    => 'readline.lib',
+        default         => '-lreadline',
+    ] );
+};
+like($@, qr/_select_lib\(\) takes hashref/,
+    "Bad argument to _select_lib correctly detected");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/readline-01.t - test auto::readline
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/readline-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::readline.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::readline, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/readline-02.t (from r40255, trunk/t/steps/auto/readline-02.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/readline-02.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/readline-02.t)
@@ -0,0 +1,114 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/readline-02.t
+
+use strict;
+use warnings;
+use Test::More tests =>  14;
+use Carp;
+use Cwd;
+use lib qw( lib );
+use_ok('config::auto::readline');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::readline};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+########## _evaluate_cc_run() ##########
+
+my ($has_readline, $verbose);
+
+$verbose = undef;
+$has_readline = $step->_evaluate_cc_run($verbose);
+is($has_readline, 1, "Got expected value for has_readline");
+is($step->result(), 'yes', "Expected result was set");
+# Prepare for next test
+$step->set_result(undef);
+
+{
+    my $stdout;
+    $verbose = 1;
+    capture(
+        sub { $has_readline = $step->_evaluate_cc_run($verbose); },
+        \$stdout,
+    );
+    is($has_readline, 1, "Got expected value for has_readline");
+    is($step->result(), 'yes', "Expected result was set");
+    like($stdout, qr/\(yes\)/, "Got expected verbose output");
+    # Prepare for next test
+    $step->set_result(undef);
+}
+
+########## _handle_readline() ##########
+
+$has_readline = 0;
+ok(auto::readline::_handle_readline($conf, 'lib', $has_readline),
+    "_handle_readline() returned true value");
+is($conf->data->get('readline'), 'define',
+    "Got expected value for 'readline'");
+# Prepare for next test
+$conf->data->set( readline => undef );
+$conf->data->set( HAS_READLINE => undef );
+
+$has_readline = 1;
+ok(auto::readline::_handle_readline($conf, 'lib', $has_readline),
+    "_handle_readline() returned true value");
+is($conf->data->get('readline'), 'define',
+    "Got expected value for 'readline'");
+# Prepare for next test
+$conf->data->set( readline => undef );
+$conf->data->set( HAS_READLINE => undef );
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/readline-02.t - test auto::readline
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/readline-02.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::readline.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::readline, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/revision-01.t (from r40255, trunk/t/steps/auto/revision-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/revision-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/revision-01.t)
@@ -0,0 +1,108 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/revision-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 15;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::revision');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+
+########## regular ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::revision};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+my ($testrev, $ret);
+{
+    $testrev = 99999;
+    local $Parrot::Revision::current = $testrev;
+    $ret = $step->runstep($conf);
+    ok( $ret, "runstep() returned true value" );
+    is($conf->data->get('revision'), $testrev,
+        "'revision' element was set correctly");
+    is($step->result(), qq{r$testrev}, "Expected result was set");
+}
+
+{
+    $testrev = 0;
+    local $Parrot::Revision::current = $testrev;
+    $ret = $step->runstep($conf);
+    ok( $ret, "runstep() returned true value" );
+    is($conf->data->get('revision'), $testrev,
+        "'revision' element was set correctly");
+    is($step->result(), q{done}, "Expected result was set");
+}
+
+{
+    $testrev = q{foobar};
+    local $Parrot::Revision::current = $testrev;
+    eval { $ret = $step->runstep($conf); };
+    like($@, qr/Cannot use non-numeric revision number/,
+        "Got expected error message");
+}
+
+{
+    $testrev = undef;
+    local $Parrot::Revision::current = $testrev;
+    $ret = $step->runstep($conf);
+    ok( $ret, "runstep() returned true value" );
+    ok(! defined($conf->data->get('revision')),
+        "'revision' element is undefined as expected");
+    is($step->result(), q{done}, "Expected result was set");
+}
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/revision-01.t - test auto::revision
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/revision-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::revision.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::revision, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/signal-01.t (from r40255, trunk/t/steps/auto/signal-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/signal-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/signal-01.t)
@@ -0,0 +1,169 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/signal-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  35;
+use Carp;
+use Cwd;
+use File::Temp qw(tempdir);
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::signal');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########### _handle__sighandler_t() ###########
+
+my ($args, $step_list_ref) = process_options( {
+    argv => [ ],
+    mode => q{configure},
+} );
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::signal};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+ok(auto::signal::_handle__sighandler_t($conf),
+    "_handle__sighandler_t() returned true value");
+is($conf->data->get( 'has___sighandler_t'), 'define',
+    "Got expected value for has__sighandler_t");
+
+########### _handle_sigaction() ###########
+
+ok(auto::signal::_handle_sigaction($conf),
+    "_handle_sigaction() returned true value");
+is($conf->data->get( 'has_sigaction'), 'define',
+    "Got expected value for has_sigaction");
+
+########### _handle_setitimer() ###########
+
+ok(auto::signal::_handle_setitimer($conf),
+    "_handle_setitimer() returned true value");
+is($conf->data->get( 'has_setitimer'), 'define',
+    "Got expected value for has_setitimer");
+is($conf->data->get( 'has_sig_atomic_t'), 'define',
+    "Got expected value for has_sig_atomic_t");
+
+########### _print_signalpasm() ###########
+
+my $cwd = cwd();
+{
+    my $tdir = tempdir( CLEANUP => 1);
+    chdir $tdir or croak "Unable to change to $tdir";
+    my $signalpasm = q{signal.pasm};
+    ok(auto::signal::_print_signalpasm($conf, $signalpasm),
+        "_print_signalpasm returned true value");
+    ok(-s $signalpasm, "File with nonzero size created");
+    unlink $signalpasm or croak "Unable to delete file after testing";
+    chdir $cwd or croak "Unable to change back to $cwd";
+}
+
+$conf->replenish($serialized);
+
+########### --verbose; _handle__sighandler_t() ###########
+
+($args, $step_list_ref) = process_options( {
+    argv => [ q{--verbose} ],
+    mode => q{configure},
+} );
+rerun_defaults_for_testing($conf, $args );
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+my $verbose = 1;
+{
+    my ($rv, $stdout);
+    capture(
+        sub { $rv = auto::signal::_handle__sighandler_t($conf, $verbose); },
+        \$stdout,
+    );
+    ok($rv, "_handle__sighandler_t() returned true value");
+    is($conf->data->get( 'has___sighandler_t'), 'define',
+        "Got expected value for has__sighandler_t");
+    like($stdout, qr/__sighandler_t/, "Got expected verbose output");
+}
+
+########### --verbose; _handle_sigaction() ###########
+
+{
+    my ($rv, $stdout);
+    capture(
+        sub { $rv = auto::signal::_handle_sigaction($conf, $verbose); },
+        \$stdout,
+    );
+    ok($rv, "_handle_sigaction() returned true value");
+    is($conf->data->get( 'has_sigaction'), 'define',
+        "Got expected value for has_sigaction");
+    like($stdout, qr/sigaction/, "Got expected verbose output");
+}
+
+########### --verbose; _handle_setitimer() ###########
+
+{
+    my ($rv, $stdout);
+    capture(
+        sub { $rv = auto::signal::_handle_setitimer($conf, $verbose); },
+        \$stdout,
+    );
+    ok($rv, "_handle_setitimer() returned true value");
+    is($conf->data->get( 'has_setitimer'), 'define',
+        "Got expected value for has_setitimer");
+    is($conf->data->get( 'has_sig_atomic_t'), 'define',
+        "Got expected value for has_sig_atomic_t");
+    like($stdout, qr/setitimer/s, "Got expected verbose output");
+}
+
+$conf->cc_clean();
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/signal-01.t - test auto::signal
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/signal-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::signal.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::signal, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/sizes-01.t (from r40255, trunk/t/steps/auto/sizes-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/sizes-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/sizes-01.t)
@@ -0,0 +1,399 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/sizes-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 58;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::auto::sizes');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw | capture |;
+
+
+########## _handle_intval_ptrsize_discrepancy() ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $serialized = $conf->pcfreeze();
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+
+my $pkg = q{auto::sizes};
+
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+{
+    my $stdout;
+    my %results = (
+        ptrsize         => 1,
+        intvalsize      => 1,
+    );
+    capture(
+        sub { auto::sizes::_handle_intval_ptrsize_discrepancy(\%results); },
+        \$stdout,
+    );
+    ok(! $stdout, "As expected, no warning needed");
+}
+
+{
+    my $stdout;
+    my %results = (
+        ptrsize         => 1,
+        intvalsize      => 2,
+    );
+    capture(
+        sub { auto::sizes::_handle_intval_ptrsize_discrepancy(\%results); },
+        \$stdout,
+    );
+    like($stdout, qr/I see your chosen INTVAL/s,
+        "Got expected warning about discrepancy"
+    );
+}
+
+########## _set_int2() ##########
+
+{
+    my $stdout;
+    my %results = ( shortsize   => 2 );
+    capture(
+        sub { auto::sizes::_set_int2($conf, \%results); },
+        \$stdout,
+    );
+    is($conf->data->get( 'int2_t' ), q{short},
+        "Got expected value for int2_t");
+    ok(! $stdout, "As expected, no warning needed");
+}
+
+{
+    my $stdout;
+    my %results = ( shortsize   => 4 );
+    capture(
+        sub { auto::sizes::_set_int2($conf, \%results); },
+        \$stdout,
+    );
+    is($conf->data->get( 'int2_t' ), q{int},
+        "Got expected value for int2_t");
+    like($stdout, qr/conversion ops might fail/s,
+        "Got expected warning");
+}
+
+########## _set_int4() ##########
+
+{
+    my $stdout;
+    my %results = ( shortsize   => 4 );
+    capture(
+        sub { auto::sizes::_set_int4($conf, \%results); },
+        \$stdout,
+    );
+    is($conf->data->get( 'int4_t' ), q{short},
+        "Got expected value for int4_t");
+    ok(! $stdout, "As expected, no warning needed");
+}
+
+{
+    my $stdout;
+    my %results = ( intsize   => 4 );
+    capture(
+        sub { auto::sizes::_set_int4($conf, \%results); },
+        \$stdout,
+    );
+    is($conf->data->get( 'int4_t' ), q{int},
+        "Got expected value for int4_t");
+    ok(! $stdout, "As expected, no warning needed");
+}
+
+{
+    my $stdout;
+    my %results = ( longsize   => 4 );
+    capture(
+        sub { auto::sizes::_set_int4($conf, \%results); },
+        \$stdout,
+    );
+    is($conf->data->get( 'int4_t' ), q{long},
+        "Got expected value for int4_t");
+    ok(! $stdout, "As expected, no warning needed");
+}
+
+{
+    my $stdout;
+    my %results = ( );
+    capture(
+        sub { auto::sizes::_set_int4($conf, \%results); },
+        \$stdout,
+    );
+    is($conf->data->get( 'int4_t' ), q{int},
+        "Got expected value for int4_t");
+    like($stdout, qr/conversion ops might fail/s,
+        "Got expected warning");
+}
+
+########## _set_float4() ##########
+
+{
+    my $stdout;
+    my %results = ( floatsize => 4 );
+    capture(
+        sub { auto::sizes::_set_float4($conf, \%results); },
+        \$stdout,
+    );
+    is($conf->data->get( 'float4_t' ), q{float},
+        "Got expected value for float4_t");
+    ok(! $stdout, "As expected, no warning needed");
+}
+
+{
+    my $stdout;
+    my %results = ( floatsize => 8 );
+    capture(
+        sub { auto::sizes::_set_float4($conf, \%results); },
+        \$stdout,
+    );
+    is($conf->data->get( 'float4_t' ), q{double},
+        "Got expected value for float4_t");
+    like($stdout, qr/conversion ops might fail/s,
+        "Got expected warning");
+}
+
+########## _set_float8() ##########
+
+{
+    my $stdout;
+    my %results = ( doublesize => 8 );
+    capture(
+        sub { auto::sizes::_set_float8($conf, \%results); },
+        \$stdout,
+    );
+    is($conf->data->get( 'float8_t' ), q{double},
+        "Got expected value for float8_t");
+    ok(! $stdout, "As expected, no warning needed");
+}
+
+{
+    my $stdout;
+    my %results = ( );
+    capture(
+        sub { auto::sizes::_set_float8($conf, \%results); },
+        \$stdout,
+    );
+    is($conf->data->get( 'float8_t' ), q{double},
+        "Got expected value for float8_t");
+    like($stdout, qr/conversion ops might fail/s,
+        "Got expected warning");
+}
+
+########## _handle_hugeintvalsize() ##########
+
+my (%hugeintval, $intval, $intvalsize);
+
+$conf->data->set( intval => undef );
+$conf->data->set( intvalsize => undef );
+$hugeintval{hugeintvalsize} = undef;
+$intval = q{integer};
+$intvalsize = 4;
+auto::sizes::_handle_hugeintvalsize(
+    $conf,
+    {
+        hugeintval      => \%hugeintval,
+        intval          => $intval,
+        intvalsize      => $intvalsize,
+    },
+);
+is( $conf->data->get( 'hugeintval' ), $intval,
+    "Got expected value for hugeintval");
+is( $conf->data->get( 'hugeintvalsize' ), $intvalsize,
+    "Got expected value for hugeintvalsize");
+$conf->data->set( hugeintval => undef );
+$conf->data->set( hugeintvalsize => undef );
+
+$conf->data->set( intval => undef );
+$conf->data->set( intvalsize => undef );
+$hugeintval{hugeintvalsize} = 4;
+$intval = q{integer};
+$intvalsize = 4;
+auto::sizes::_handle_hugeintvalsize(
+    $conf,
+    {
+        hugeintval      => \%hugeintval,
+        intval          => $intval,
+        intvalsize      => $intvalsize,
+    },
+);
+is( $conf->data->get( 'hugeintval' ), $intval,
+    "Got expected value for hugeintval");
+is( $conf->data->get( 'hugeintvalsize' ), $intvalsize,
+    "Got expected value for hugeintvalsize");
+$conf->data->set( hugeintval => undef );
+$conf->data->set( hugeintvalsize => undef );
+
+$conf->data->set( intval => undef );
+$conf->data->set( intvalsize => undef );
+$hugeintval{hugeintvalsize} = 8;
+$intval = q{integer};
+$intvalsize = 4;
+auto::sizes::_handle_hugeintvalsize(
+    $conf,
+    {
+        hugeintval      => \%hugeintval,
+        intval          => $intval,
+        intvalsize      => $intvalsize,
+    },
+);
+ok( ! defined $conf->data->get( 'hugeintval' ),
+    "Got expected value for hugeintval");
+ok( ! defined $conf->data->get( 'hugeintvalsize' ),
+    "Got expected value for hugeintvalsize");
+$conf->data->set( hugeintval => undef );
+$conf->data->set( hugeintvalsize => undef );
+
+$conf->data->set( intval => undef );
+$conf->data->set( intvalsize => undef );
+
+########## _set_hugefloatval() ##########
+
+my $size = 12;
+auto::sizes::_set_hugefloatval( $conf, $size );
+is( $conf->data->get( 'hugefloatval' ), 'long double',
+    "Got expected type for hugefloatval");
+is( $conf->data->get( 'hugefloatvalsize' ), $size,
+    "Got expected size for hugefloatvalsize");
+
+auto::sizes::_set_hugefloatval( $conf, 0 );
+is( $conf->data->get( 'hugefloatval' ), 'double',
+    "Got expected type for hugefloatval");
+is( $conf->data->get( 'hugefloatvalsize' ), $conf->data->get('doublesize'),
+    "Got expected size for hugefloatvalsize");
+
+########## _set_intvalmaxmin() ##########
+
+my @trueintvals = (
+    $conf->data->get( 'iv' ),
+    $conf->data->get( 'intvalmin' ),
+    $conf->data->get( 'intvalmax' ),
+);
+$conf->data->set( iv => 'int' );
+auto::sizes::_set_intvalmaxmin( $conf );
+is( $conf->data->get( 'intvalmin' ), 'INT_MIN',
+    "Got expected value for 'intvalmin' when 'iv' is 'int'" );
+is( $conf->data->get( 'intvalmax' ), 'INT_MAX',
+    "Got expected value for 'intvalmax' when 'iv' is 'int'" );
+
+$conf->data->set( iv => 'long' );
+auto::sizes::_set_intvalmaxmin( $conf );
+is( $conf->data->get( 'intvalmin' ), 'LONG_MIN',
+    "Got expected value for 'intvalmin' when 'iv' is 'long'" );
+is( $conf->data->get( 'intvalmax' ), 'LONG_MAX',
+    "Got expected value for 'intvalmax' when 'iv' is 'long'" );
+
+$conf->data->set( iv => 'long int' );
+auto::sizes::_set_intvalmaxmin( $conf );
+is( $conf->data->get( 'intvalmin' ), 'LONG_MIN',
+    "Got expected value for 'intvalmin' when 'iv' is 'long int'" );
+is( $conf->data->get( 'intvalmax' ), 'LONG_MAX',
+    "Got expected value for 'intvalmax' when 'iv' is 'long int'" );
+
+$conf->data->set( iv => 'long long' );
+auto::sizes::_set_intvalmaxmin( $conf );
+is( $conf->data->get( 'intvalmin' ), 'LLONG_MIN',
+    "Got expected value for 'intvalmin' when 'iv' is 'long long'" );
+is( $conf->data->get( 'intvalmax' ), 'LLONG_MAX',
+    "Got expected value for 'intvalmax' when 'iv' is 'long long'" );
+
+$conf->data->set( iv => 'long long int' );
+auto::sizes::_set_intvalmaxmin( $conf );
+is( $conf->data->get( 'intvalmin' ), 'LLONG_MIN',
+    "Got expected value for 'intvalmin' when 'iv' is 'long long int'" );
+is( $conf->data->get( 'intvalmax' ), 'LLONG_MAX',
+    "Got expected value for 'intvalmax' when 'iv' is 'long long int'" );
+
+my $badtype = 'foobar';
+$conf->data->set( iv => $badtype );
+eval { auto::sizes::_set_intvalmaxmin( $conf ); };
+like($@, qr/Configure.pl:  Cannot find limits for type '$badtype'/,
+    "Got expected 'die' message for unrecognized 'iv'");
+
+# Reset true values prior to subsequent tests.
+$conf->data->set( 'iv' => $trueintvals[0] );
+$conf->data->set( 'intvalmin' => $trueintvals[1] );
+$conf->data->set( 'intvalmax' => $trueintvals[2] );
+
+########## _set_floatvalmaxmin() ##########
+
+my @truefloatvals = (
+    $conf->data->get( 'nv' ),
+    $conf->data->get( 'floatvalmin' ),
+    $conf->data->get( 'floatvalmax' ),
+);
+
+$conf->data->set( nv => 'double' );
+auto::sizes::_set_floatvalmaxmin( $conf );
+is( $conf->data->get( 'floatvalmin' ), 'DBL_MIN',
+    "Got expected value for 'floatvalmin' when 'nv' is 'double'" );
+is( $conf->data->get( 'floatvalmax' ), 'DBL_MAX',
+    "Got expected value for 'floatvalmax' when 'nv' is 'double'" );
+
+$conf->data->set( nv => 'long double' );
+auto::sizes::_set_floatvalmaxmin( $conf );
+is( $conf->data->get( 'floatvalmin' ), 'LDBL_MIN',
+    "Got expected value for 'floatvalmin' when 'nv' is 'long double'" );
+is( $conf->data->get( 'floatvalmax' ), 'LDBL_MAX',
+    "Got expected value for 'floatvalmax' when 'nv' is 'long double'" );
+
+$badtype = 'foobar';
+$conf->data->set( nv => $badtype );
+eval { auto::sizes::_set_floatvalmaxmin( $conf ); };
+like($@, qr/Configure.pl:  Cannot find limits for type '$badtype'/,
+    "Got expected 'die' message for unrecognized 'nv'");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/sizes-01.t - test auto::sizes
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/sizes-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::sizes.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::sizes, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/snprintf-01.t (from r40255, trunk/t/steps/auto/snprintf-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/snprintf-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/snprintf-01.t)
@@ -0,0 +1,148 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/snprintf-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 33;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::init::hints');
+use_ok('config::auto::attributes');
+use_ok('config::auto::snprintf');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########## regular ##########
+
+my ($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new();
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+test_step_thru_runstep($conf, q{init::hints}, $args);
+test_step_thru_runstep($conf, q{auto::attributes}, $args);
+
+my $pkg = q{auto::snprintf};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set(%{$args});
+my $step = test_step_constructor_and_description($conf);
+
+# The test of runstep() below will need to be TODO-ed until such time as
+# we can test with all the data which the Parrot::Configure object would
+# normally have during regular configuration at the onset of this step.
+# That's because runstep() consists almost solely of calls to C
+# programs.  We can't refactor runstep()'s guts out into internal
+# subroutines and test them explicitly as we've been able to do for
+# other configuration steps.  We won't lose any coverage by commenting
+# out the TODO block for the time being, as the coverage analysis will,
+# at the very least, pick up runstep() while running the step itself.
+#
+#TODO: {
+#    # http://rt.perl.org/rt3/Ticket/Display.html?id=47391
+#    local $TODO =
+#        q<Reported failing where vendor-supplied Perl 5 Config.pm does not match true state of system available for Parrot configuration>;
+#    ok($step->runstep($conf), "runstep() returned true value");
+#} #'
+
+
+$conf->replenish($serialized);
+
+########## _evaluate_snprintf() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [],
+    mode            => q{configure},
+} );
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+
+my $res;
+$res = q{old snprintf};
+ok($step->_evaluate_snprintf($conf, $res),
+    "_evaluate_snprintf returned true value");
+ok($conf->data->get('HAS_OLD_SNPRINTF'),
+    "Got expected value");
+
+$res = q{C99 snprintf};
+ok($step->_evaluate_snprintf($conf, $res),
+    "_evaluate_snprintf returned true value");
+ok($conf->data->get('HAS_C99_SNPRINTF'),
+    "Got expected value");
+ok($conf->data->get('HAS_SNPRINTF'),
+    "Got expected value");
+
+$conf->replenish($serialized);
+
+########## --verbose; _evaluate_snprintf() ##########
+
+($args, $step_list_ref) = process_options( {
+    argv            => [ q{--verbose} ],
+    mode            => q{configure},
+} );
+$conf->options->set(%{$args});
+$step = test_step_constructor_and_description($conf);
+
+{
+    my $stdout;
+    my $res = q{snprintf};
+    my $ret = capture(
+        sub { $step->_evaluate_snprintf($conf, $res) },
+        \$stdout
+    );
+    ok($ret, "_evaluate_snprintf returned true value");
+    ok($conf->data->get('HAS_SNPRINTF'),
+        "Got expected value");
+}
+
+$conf->cc_clean();
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/snprintf-01.t - test auto::snprintf
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/snprintf-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::snprintf.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::snprintf, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/socklen_t-01.t (from r40255, trunk/t/steps/auto/socklen_t-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/socklen_t-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/socklen_t-01.t)
@@ -0,0 +1,106 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/socklen_t-01.t
+
+use strict;
+use warnings;
+use Test::More tests => 16;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::socklen_t');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw| capture |;
+
+########### regular ###########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::socklen_t};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+ok(defined($step->result()), "A result has been defiined");
+
+$conf->replenish($serialized);
+
+##### _evaluate_socklen_t() #####
+
+($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+
+my $d_socklen_t;
+
+$d_socklen_t = q{alpha};
+ok($step->_evaluate_socklen_t($conf, $d_socklen_t),
+    "_evaluate_socklen_t() completed satisfactorily");
+is($step->result(), q{yes}, "Got expected result");
+is($conf->data->get('has_socklen_t'), 1,
+    "has_socklen_t set as expected");
+
+$d_socklen_t = undef;
+ok($step->_evaluate_socklen_t($conf, $d_socklen_t),
+    "_evaluate_socklen_t() completed satisfactorily");
+is($step->result(), q{no}, "Got expected result");
+is($conf->data->get('has_socklen_t'), 0,
+    "has_socklen_t set as expected");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/socklen_t-01.t - test auto::socklen_t
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/socklen_t-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::socklen_t.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::socklen_t, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/thread-01.t (from r40255, trunk/t/steps/auto/thread-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/thread-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/thread-01.t)
@@ -0,0 +1,84 @@
+#! perl
+# Copyright (C) 2009, Parrot Foundation.
+# $Id$
+
+use strict;
+use warnings;
+use Test::More tests => 8;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::thread');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    rerun_defaults_for_testing
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw( capture );
+
+########## --without-threads ##########
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ q{--without-threads} ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::thread};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+my $ret = $step->runstep($conf);
+ok( $ret, "runstep() returned true value" );
+is($conf->data->get('HAS_THREADS'), 0,
+    "Got expected value for 'HAS_THREADS'");
+is($step->result(), q{no}, "Expected result was set");
+
+$conf->replenish($serialized);
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/thread-01.t - test auto::thread
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/thread-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::thread.
+
+=head1 HISTORY
+
+Mostly taken from F<t/steps/auto_gdbm-01.t>.
+
+=head1 AUTHOR
+
+Francois Perrad
+
+=head1 SEE ALSO
+
+config::auto::thread, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/va_ptr-01.t (from r40255, trunk/t/steps/auto/va_ptr-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/va_ptr-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/va_ptr-01.t)
@@ -0,0 +1,66 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/va_ptr-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  5;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::auto::va_ptr');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+my $pkg = q{auto::va_ptr};
+$conf->add_steps($pkg);
+$conf->options->set( %{$args} );
+my $step = test_step_constructor_and_description($conf);
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/va_ptr-01.t - test auto::va_ptr
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/va_ptr-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test auto::va_ptr.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::va_ptr, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Copied: branches/ops_pct/t/steps/auto/warnings-01.t (from r40255, trunk/t/steps/auto/warnings-01.t)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/ops_pct/t/steps/auto/warnings-01.t	Fri Jul 24 19:42:02 2009	(r40257, copy of r40255, trunk/t/steps/auto/warnings-01.t)
@@ -0,0 +1,183 @@
+#! perl
+# Copyright (C) 2007, Parrot Foundation.
+# $Id$
+# auto/warnings-01.t
+
+use strict;
+use warnings;
+use Test::More tests =>  56;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::init::hints');
+use_ok('config::inter::progs');
+use_ok('config::auto::warnings');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Test qw(
+    test_step_thru_runstep
+    test_step_constructor_and_description
+);
+use IO::CaptureOutput qw | capture |;
+
+my ($args, $step_list_ref) = process_options(
+    {
+        argv => [ ],
+        mode => q{configure},
+    }
+);
+
+my $conf = Parrot::Configure->new;
+
+test_step_thru_runstep( $conf, q{init::defaults}, $args );
+test_step_thru_runstep( $conf, q{init::hints}, $args );
+test_step_thru_runstep( $conf, q{inter::progs}, $args );
+
+my $pkg = q{auto::warnings};
+
+$conf->add_steps($pkg);
+
+my $serialized = $conf->pcfreeze();
+
+$conf->options->set( %{$args} );
+SKIP: {
+    skip 'Tests not yet passing on Sun/Solaris',
+    39
+    if $^O =~ m/sun|solaris/i;
+
+my $step = test_step_constructor_and_description($conf);
+
+my %potential_warnings_seen;
+$conf->options->set(cage => 1);
+$step->_add_cage_warnings($conf);
+%potential_warnings_seen = map { $_, 1 } @{ $step->{potential_warnings} };
+ok($potential_warnings_seen{'-std=c89'}, "Cage warning added");
+
+$conf->replenish($serialized);
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+$conf->options->set(maintainer => 1);
+$step->_add_maintainer_warnings($conf);
+%potential_warnings_seen = map { $_, 1 } @{ $step->{potential_warnings} };
+ok($potential_warnings_seen{'-Wlarger-than-4096'}, "Maintainer warning added");
+
+$conf->replenish($serialized);
+
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+my $warning = q{-Wphony_warning};
+auto::warnings::_set_warning($conf, $warning, 1, undef);
+ok(! $conf->data->get($warning),
+    "Got expected setting for warning");
+
+$conf->replenish($serialized);
+
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    my $warning = q{-Wphony_warning};
+    my $stdout;
+    capture(
+        sub { auto::warnings::_set_warning($conf, $warning, 1, 1); },
+        \$stdout,
+    );
+    ok(! $conf->data->get($warning),
+        "Got expected setting for warning");
+    like($stdout, qr/exit code:\s+1/, "Got expected verbose output");
+}
+
+$conf->replenish($serialized);
+
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+my $output = q{some string};
+my $tryflags = q{some flag};
+my $rv = auto::warnings::_set_ccflags($conf, $output, $tryflags, undef);
+is($rv, 1, "_set_ccflags() returned 1 as expected");
+is($conf->data->get("ccflags"), $tryflags, "ccflags changed as expected");
+
+$conf->replenish($serialized);
+
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    my $output = q{some string};
+    my $tryflags = q{some flag};
+    my ($rv, $stdout);
+    capture(
+        sub { $rv = auto::warnings::_set_ccflags($conf, $output, $tryflags, 1); },
+        \$stdout,
+    );
+    is($rv, 1, "_set_ccflags() returned 1 as expected");
+    is($conf->data->get("ccflags"), $tryflags, "ccflags changed as expected");
+    like($stdout, qr/ccflags:\s+$tryflags/, "Got expected verbose output");
+}
+
+$conf->replenish($serialized);
+
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+# Mock case where C compiler is not gcc.
+$conf->data->set( gccversion => undef );
+ok($step->runstep($conf), "runstep() returned true value");
+is($step->result(), q{skipped}, "Got expected result");
+
+$conf->replenish($serialized);
+
+$conf->options->set( %{$args} );
+$step = test_step_constructor_and_description($conf);
+{
+    my ($stdout, $rv);
+    # Mock case where C compiler is not gcc.
+    $conf->data->set( gccversion => undef );
+    $conf->options->set( verbose => 1 );
+    capture(
+        sub { $rv = $step->runstep($conf); },
+        \$stdout,
+    );
+    ok($rv, "runstep() returned true value");
+    is($step->result(), q{skipped}, "Got expected result");
+    like($stdout,
+        qr/Currently we only set warnings/,
+        "Got expected verbose output"
+    );
+}
+
+} # End SKIP block for Sun/Solaris
+
+$conf->cc_clean();
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+auto/warnings-01.t - test auto::warnings
+
+=head1 SYNOPSIS
+
+    % prove t/steps/auto/warnings-01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test aspects of auto::warnings.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::auto::warnings, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_alignptrs-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_alignptrs-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,99 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_alignptrs-01.t
-
-use strict;
-use warnings;
-use Test::More tests => 17;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::alignptrs');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    test_step_constructor_and_description
-);
-
-
-########## regular; singular ##########
-
-my ($args, $step_list_ref) = process_options(
-    {
-        argv => [ ],
-        mode => q{configure},
-    }
-);
-
-my $conf = Parrot::Configure->new;
-
-my $serialized = $conf->pcfreeze();
-
-test_step_thru_runstep( $conf, q{init::defaults}, $args );
-
-my $pkg = q{auto::alignptrs};
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-my $align = 1;
-$conf->data->set('ptr_alignment' => $align);
-my $ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($step->result(), qq{configured:  $align byte}, "Expected result was set");
-
-$conf->replenish($serialized);
-
-########## regular; plural ##########
-
-($args, $step_list_ref) = process_options(
-    {
-        argv => [ ],
-        mode => q{configure},
-    }
-);
-
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$align = 2;
-$conf->data->set('ptr_alignment' => $align);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($step->result(), qq{configured:  $align bytes}, "Expected result was set");
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_alignptrs-01.t - test auto::alignptrs
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_alignptrs-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::alignptrs.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::alignptrs, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_alignptrs-02.t
==============================================================================
--- branches/ops_pct/t/steps/auto_alignptrs-02.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,119 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_alignptrs-02.t
-
-use strict;
-use warnings;
-use Test::More tests =>  18;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::alignptrs');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    test_step_constructor_and_description
-);
-
-########## mock hpux ##########
-
-my ($args, $step_list_ref) = process_options(
-    {
-        argv => [ ],
-        mode => q{configure},
-    }
-);
-
-my $conf = Parrot::Configure->new;
-
-test_step_thru_runstep( $conf, q{init::defaults}, $args );
-
-my $pkg = q{auto::alignptrs};
-
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-
-my $serialized = $conf->pcfreeze();
-
-{
-    $conf->data->set_p5( OSNAME => 'hpux' );
-    my $ret = $step->runstep($conf);
-    ok( $ret, "runstep() returned true value" );
-    if ( $conf->data->get_p5('ccflags') !~ /DD64/ ) {
-        is($conf->data->get('ptr_alignment'), 4,
-            "Got expected pointer alignment for HP Unix");
-        is($step->result(), qq{for hpux:  4 bytes},
-            "Expected result was set");
-    } else {
-        pass("Cannot mock \%Config");
-        pass("Cannot mock \%Config");
-    }
-}
-
-$conf->replenish($serialized);
-
-########## _evaluate_ptr_alignment()  ##########
-
-my $align = 2;
-auto::alignptrs::_evaluate_ptr_alignment($conf, $align);
-is($conf->data->get( 'ptr_alignment' ), 2,
-    "Got expected pointer alignment");
-
-$conf->replenish($serialized);
-
-########## _evaluate_ptr_alignment()  ##########
-
-$align = undef;
-eval { auto::alignptrs::_evaluate_ptr_alignment($conf, $align); };
-like($@, qr/Can't determine alignment!/, #'
-    "Got expected 'die' message");
-
-$conf->replenish($serialized);
-
-########## _evaluate_results()  ##########
-
-my ($results, $try_align);
-is(auto::alignptrs::_evaluate_results(q{OK}, 2), 2,
-    "Got expected alignment");
-is(auto::alignptrs::_evaluate_results(q{OK align}, 2), undef,
-    "Got undef as expected");
-is(auto::alignptrs::_evaluate_results(q{foobar}, 2), undef,
-    "Got undef as expected");
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_alignptrs-02.t - test auto::alignptrs
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_alignptrs-02.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::alignptrs.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::alignptrs, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_arch-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_arch-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,305 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_arch-01.t
-
-use strict;
-use warnings;
-use Test::More tests => 102;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::arch');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw| capture |;
-
-########## Darwin special case ##########
-
-my ($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-
-my $conf = Parrot::Configure->new;
-
-my $serialized = $conf->pcfreeze();
-
-test_step_thru_runstep( $conf, q{init::defaults}, $args );
-
-my $pkg = q{auto::arch};
-
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-my $errstr;
-{
-    # As the t/configure/ test suite is currently (Dec 25 2007) constructed,
-    # an uninitialized value warning is generated when this test is run on
-    # Darwin because of a hack in config/auto/arch.pm.  We capture the warning
-    # and verify that we did so if on Darwin.  In the future, we will be able
-    # to eliminate this use of the signal handler because the
-    # Parrot::Configure object will have the same information available to it
-    # as it does during regular configuration.
-    local $SIG{__WARN__} = \&_capture;
-    my $ret = $step->runstep($conf);
-    ok( $ret, "runstep() returned true value" );
-    is($step->result(), q{}, "Result was empty string as expected");
-    if ($^O eq 'darwin') {
-        like(
-            $errstr,
-            qr/Uninitialized value/i,
-            "Caught uninitialized value warning as expected"
-        );
-    } else {
-        pass("Test not needed except on Darwin");
-    }
-}
-
-$conf->replenish($serialized);
-
-########## --verbose ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--verbose} ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-{
-    my ($ret, $stdout);
-    capture(
-        sub { $ret = $step->runstep($conf); },
-        \$stdout,
-    );
-    ok( $ret, "runstep() returned true value" );
-    is($step->result(), q{}, "Result was empty string as expected");
-    like($stdout,
-        qr/determining operating system and cpu architecture/s,
-        "Got expected verbose output"
-    );
-}
-
-$conf->replenish($serialized);
-
-########## mock architecture ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-my $pseudoarch = q{foobar};
-$conf->data->set('archname' => $pseudoarch);
-my $ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($step->result(), q{}, "Result was empty string as expected");
-is($conf->data->get('cpuarch'), q{},
-    "'cpuarch' was set as expected");
-is($conf->data->get('osname'), $pseudoarch,
-    "'osname' was set as expected");
-
-$conf->replenish($serialized);
-
-########## mock darwin ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$pseudoarch = q{darwin-thread-multi-2level};
-$conf->data->set('archname' => $pseudoarch);
-my $pseudobyteorder = 1234;
-$conf->data->set('byteorder' => $pseudobyteorder);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($step->result(), q{}, "Result was empty string as expected");
-is($conf->data->get('cpuarch'), q{i386},
-    "'cpuarch' was set as expected");
-is($conf->data->get('osname'), q{darwin},
-    "'osname' was set as expected");
-
-$conf->replenish($serialized);
-
-########## mock darwin ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$pseudoarch = q{darwin-thread-multi-2level};
-$conf->data->set('archname' => $pseudoarch);
-$pseudobyteorder = 4321;
-$conf->data->set('byteorder' => $pseudobyteorder);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($step->result(), q{}, "Result was empty string as expected");
-is($conf->data->get('cpuarch'), q{ppc},
-    "'cpuarch' was set as expected");
-is($conf->data->get('osname'), q{darwin},
-    "'osname' was set as expected");
-
-$conf->replenish($serialized);
-
-########## mock win32 ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$pseudoarch = q{MSWin32-x64};
-$conf->data->set('archname' => $pseudoarch);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($step->result(), q{}, "Result was empty string as expected");
-is($conf->data->get('cpuarch'), q{amd64},
-    "'cpuarch' was set as expected");
-is($conf->data->get('osname'), q{MSWin32},
-    "'osname' was set as expected");
-
-$conf->replenish($serialized);
-
-########## mock win32 ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$pseudoarch = q{MSWin32-i386};
-$conf->data->set('archname' => $pseudoarch);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($step->result(), q{}, "Result was empty string as expected");
-is($conf->data->get('cpuarch'), q{i386},
-    "'cpuarch' was set as expected");
-is($conf->data->get('osname'), q{MSWin32},
-    "'osname' was set as expected");
-
-$conf->replenish($serialized);
-
-########## mock cygwin ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$pseudoarch = q{cygwin};
-$conf->data->set('archname' => $pseudoarch);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($step->result(), q{}, "Result was empty string as expected");
-is($conf->data->get('cpuarch'), q{i386},
-    "'cpuarch' was set as expected");
-is($conf->data->get('osname'), q{cygwin},
-    "'osname' was set as expected");
-
-$conf->replenish($serialized);
-
-########## mock powerpc-linux ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$pseudoarch = q{powerpc-linux};
-$conf->data->set('archname' => $pseudoarch);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($step->result(), q{}, "Result was empty string as expected");
-is($conf->data->get('cpuarch'), q{ppc},
-    "'cpuarch' was set as expected");
-is($conf->data->get('osname'), q{linux},
-    "'osname' was set as expected");
-
-$conf->replenish($serialized);
-
-########## mock cygwin-i486 ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$pseudoarch = q{cygwin-i486};
-$conf->data->set('archname' => $pseudoarch);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($step->result(), q{}, "Result was empty string as expected");
-is($conf->data->get('cpuarch'), q{i386},
-    "'cpuarch' was set as expected");
-is($conf->data->get('osname'), q{cygwin},
-    "'osname' was set as expected");
-
-pass("Completed all tests in $0");
-
-sub _capture { $errstr = $_[0]; }
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_arch-01.t - test auto::arch
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_arch-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::arch.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::arch, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_attributes-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_attributes-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,84 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_attributes-01.t
-
-use strict;
-use warnings;
-use Test::More tests => 12;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::attributes');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw | capture |;
-
-my ($args, $step_list_ref) = process_options( {
-    argv            => [ ],
-    mode            => q{configure},
-} );
-
-my $conf = Parrot::Configure->new();
-
-test_step_thru_runstep($conf, q{init::defaults}, $args);
-
-my $pkg = q{auto::attributes};
-
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-my $step = test_step_constructor_and_description($conf);
-
-{
-    my $rv;
-    my $stdout;
-    capture(
-        sub { $rv = $step->runstep($conf); },
-        \$stdout,
-    );
-    ok( defined $rv, "runstep() returned defined value" );
-    unlike($conf->data->get('ccflags'),
-        qr/HASATTRIBUTE_NEVER_WORKS/,
-        "'ccflags' excludes bogus attribute as expected"
-    );
-}
-$conf->cc_clean();
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_attributes-01.t - test auto::attributes
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_attributes-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::attributes.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::attributes, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_backtrace-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_backtrace-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,94 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_backtrace-01.t
-
-use strict;
-use warnings;
-use Test::More tests => 19;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::backtrace');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    test_step_constructor_and_description
-);
-
-########## regular ##########
-
-my ($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-
-my $conf = Parrot::Configure->new();
-
-test_step_thru_runstep($conf, q{init::defaults}, $args);
-
-my ($task, $step_name, $step, $ret);
-my $pkg = q{auto::backtrace};
-
-$conf->add_steps($pkg);
-
-my $serialized = $conf->pcfreeze();
-
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-
-$conf->replenish($serialized);
-
-########## _evaluate_backtrace()  ##########
-
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-my $error = q{mock_error};
-ok($step->_evaluate_backtrace($conf, $error),
-    "_evaluate_backtrace returned true value");
-is($step->result, 'no', "Got expected result");
-
-$error = q{};
-ok($step->_evaluate_backtrace($conf, $error),
-    "_evaluate_backtrace returned true value");
-is($step->result, 'yes', "Got expected result");
-ok($conf->data->get('backtrace'),
-    "backtrace set as expected");
-
-ok($step->runstep($conf), "runstep() returned true value");
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_backtrace-01.t - test auto::backtrace
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_backtrace-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::backtrace.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::backtrace, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_byteorder-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_byteorder-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,129 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_byteorder-01.t
-
-use strict;
-use warnings;
-use Test::More tests => 24;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::auto::byteorder');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    test_step_constructor_and_description
-);
-
-########## _evaluate_byteorder() ##########
-
-my ($args, $step_list_ref) = process_options(
-    {
-        argv => [ ],
-        mode => q{configure},
-    }
-);
-
-my $conf = Parrot::Configure->new;
-
-my $pkg = q{auto::byteorder};
-
-$conf->add_steps($pkg);
-
-my $serialized = $conf->pcfreeze();
-
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-
-my $byteorder = q{1234};
-my $rv = $step->_evaluate_byteorder($conf, $byteorder);
-ok( $rv, "_evaluate_byteorder() returned true value as expected");
-is( $conf->data->get( 'byteorder'), $byteorder, "Got expected byteorder");
-ok( ! $conf->data->get( 'bigendian' ), "Not big-endian");
-is( $step->result, 'little-endian', "Rather, little-endian");
-
-$conf->replenish($serialized);
-
-########## _evaluate_byteorder() ##########
-
-($args, $step_list_ref) = process_options(
-    {
-        argv => [ ],
-        mode => q{configure},
-    }
-);
-
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-
-$byteorder = q{8765};
-$rv = $step->_evaluate_byteorder($conf, $byteorder);
-ok( $rv, "_evaluate_byteorder() returned true value as expected");
-is( $conf->data->get( 'byteorder'), $byteorder, "Got expected byteorder");
-ok( $conf->data->get( 'bigendian' ), "big-endian");
-is( $step->result, 'big-endian', "Indeed, big-endian");
-
-$byteorder = q{4321};
-$rv = $step->_evaluate_byteorder($conf, $byteorder);
-ok( $rv, "_evaluate_byteorder() returned true value as expected");
-is( $conf->data->get( 'byteorder'), $byteorder, "Got expected byteorder");
-ok( $conf->data->get( 'bigendian' ), "big-endian");
-is( $step->result, 'big-endian', "Indeed, big-endian");
-
-$conf->replenish($serialized);
-
-########## _evaluate_byteorder(); phony byte order ##########
-
-($args, $step_list_ref) = process_options(
-    {
-        argv => [ ],
-        mode => q{configure},
-    }
-);
-
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-
-$byteorder = q{foobar};
-eval {
-    $rv = $step->_evaluate_byteorder($conf, $byteorder);
-};
-like($@,
-    qr/Unsupported byte-order \[$byteorder\]!/,
-    "Got error message expected with bad byte-order");
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_byteorder-01.t - test auto::byteorder
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_byteorder-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::byteorder.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::byteorder, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_cgoto-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_cgoto-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,167 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_cgoto-01.t
-
-use strict;
-use warnings;
-use Test::More tests =>  56;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::cgoto');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw( capture );
-
-
-########### regular ###########
-
-my ($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-
-my $conf = Parrot::Configure->new;
-
-my $serialized = $conf->pcfreeze();
-
-test_step_thru_runstep( $conf, q{init::defaults}, $args );
-
-my $pkg = q{auto::cgoto};
-
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-my $ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-ok(defined($step->result()), "A result was defined");
-ok(defined($conf->data->get('TEMP_cg_h')), "An attribute has been defined");
-ok(defined($conf->data->get('TEMP_cg_c')), "An attribute has been defined");
-ok(defined($conf->data->get('TEMP_cg_o')), "An attribute has been defined");
-ok(defined($conf->data->get('TEMP_cg_r')), "An attribute has been defined");
-ok(defined($conf->data->get('cg_flag')), "An attribute has been defined");
-
-$conf->replenish($serialized);
-
-########### _probe_for_cgoto() ###########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$conf->options->set(cgoto => 1);
-is(auto::cgoto::_probe_for_cgoto($conf), 1,
-    "Got expected return value");
-$conf->options->set(cgoto => 0);
-is(auto::cgoto::_probe_for_cgoto($conf), 0,
-    "Got expected return value");
-$conf->options->set(cgoto => undef);
-ok(defined(auto::cgoto::_probe_for_cgoto($conf)),
-    "Probe returned a defined value");
-
-########### _evaluate_cgoto() ###########
-
-$step->_evaluate_cgoto($conf, 1);
-ok($conf->data->get('TEMP_cg_h'), "An attribute was set to true value");
-ok($conf->data->get('TEMP_cg_c'), "An attribute was set to true value");
-ok($conf->data->get('TEMP_cg_o'), "An attribute was set to true value");
-ok($conf->data->get('TEMP_cg_r'), "An attribute was set to true value");
-ok($conf->data->get('cg_flag'), "An attribute was set to true value");
-is($step->result(), q{yes}, "Expected result was set");
-
-$step->_evaluate_cgoto($conf, 0);
-is($conf->data->get('TEMP_cg_h'), q{}, "An attribute was set to empty string");
-is($conf->data->get('TEMP_cg_c'), q{}, "An attribute was set to empty string");
-is($conf->data->get('TEMP_cg_o'), q{}, "An attribute was set to empty string");
-is($conf->data->get('TEMP_cg_r'), q{}, "An attribute was set to empty string");
-is($conf->data->get('cg_flag'), q{}, "An attribute was set to empty string");
-is($step->result(), q{no}, "Expected result was set");
-
-$conf->replenish($serialized);
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-{
-    my $stdout;
-    capture(
-        sub { $step->_evaluate_cgoto($conf, 1) },
-        \$stdout
-    );
-    ok($conf->data->get('TEMP_cg_h'), "An attribute was set to true value");
-    ok($conf->data->get('TEMP_cg_c'), "An attribute was set to true value");
-    ok($conf->data->get('TEMP_cg_o'), "An attribute was set to true value");
-    ok($conf->data->get('TEMP_cg_r'), "An attribute was set to true value");
-    ok($conf->data->get('cg_flag'), "An attribute was set to true value");
-    is($step->result(), q{yes}, "Expected result was set");
-}
-
-{
-    my $stdout;
-    capture(
-        sub { $step->_evaluate_cgoto($conf, 0) },
-        \$stdout
-    );
-    is($conf->data->get('TEMP_cg_h'), q{},
-        "An attribute was set to empty string");
-    is($conf->data->get('TEMP_cg_c'), q{},
-        "An attribute was set to empty string");
-    is($conf->data->get('TEMP_cg_o'), q{},
-        "An attribute was set to empty string");
-    is($conf->data->get('TEMP_cg_r'), q{},
-        "An attribute was set to empty string");
-    is($conf->data->get('cg_flag'), q{},
-        "An attribute was set to empty string");
-    is($step->result(), q{no}, "Expected result was set");
-}
-
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_cgoto-01.t - test auto::cgoto
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_cgoto-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::cgoto.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::cgoto, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_cpu-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_cpu-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,104 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_cpu-01.t
-
-use strict;
-use warnings;
-use Test::More tests =>  22;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::cpu');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw( capture );
-
-########### --verbose ###########
-
-my ($args, $step_list_ref) = process_options( {
-    argv => [ q{--verbose} ],
-    mode => q{configure},
-} );
-
-my $conf = Parrot::Configure->new;
-
-my $serialized = $conf->pcfreeze();
-
-test_step_thru_runstep( $conf, q{init::defaults}, $args );
-
-my $pkg = q{auto::cpu};
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-{
-    $conf->data->set('cpuarch' => 'foobar');
-    my ($ret, $stdout);
-    capture(
-        sub { $ret = $step->runstep($conf); },
-        \$stdout,
-    );
-    ok($ret, "runstep() returned true value" );
-    ok(! $step->result(), "Got (default) false result as expected");
-    like($stdout, qr/cpu hints = 'auto::cpu::foobar::auto'/s,
-        "Got expected verbose output");
-    like($stdout, qr/no cpu specific hints/s,
-        "Got expected verbose output");
-}
-
-$conf->replenish($serialized);
-
-########### mock cpuarch ###########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$conf->data->set('cpuarch' => 'foobar');
-my $ret = $step->runstep($conf);
-ok($ret, "runstep() returned true value" );
-ok(! $step->result(), "Got (default) false result as expected");
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_cpu-01.t - test auto::cpu
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_cpu-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::cpu.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::cpu, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_crypto-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_crypto-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,177 +0,0 @@
-#! perl
-# Copyright (C) 2008, Parrot Foundation.
-# $Id$
-
-use strict;
-use warnings;
-use Test::More tests =>  24;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::auto::crypto');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw( capture );
-
-########## --without-crypto ##########
-
-my ($args, $step_list_ref) = process_options(
-    {
-        argv => [ q{--without-crypto} ],
-        mode => q{configure},
-    }
-);
-
-my $conf = Parrot::Configure->new;
-
-my $pkg = q{auto::crypto};
-
-$conf->add_steps($pkg);
-
-my $serialized = $conf->pcfreeze();
-
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-my $ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($conf->data->get('has_crypto'), 0,
-    "Got expected value for 'has_crypto'");
-is($step->result(), q{no}, "Expected result was set");
-
-$conf->replenish($serialized);
-
-########## _select_lib() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-# Mock different OS/compiler combinations.
-my ($osname, $cc, $initial_libs);
-$initial_libs = $conf->data->get('libs');
-$osname = 'mswin32';
-$cc = 'gcc';
-is($step->_select_lib( {
-    conf            => $conf,
-    osname          => $osname,
-    cc              => $cc,
-    win32_nongcc    => 'libcrypto.lib',
-    default         => '-lcrypto',
-} ),
-   '-lcrypto',
-   "_select_lib() returned expected value");
-
-$osname = 'mswin32';
-$cc = 'cc';
-is($step->_select_lib( {
-    conf            => $conf,
-    osname          => $osname,
-    cc              => $cc,
-    win32_nongcc    => 'libcrypto.lib',
-    default         => '-lcrypto',
-} ),
-   'libcrypto.lib',
-   "_select_lib() returned expected value");
-
-$osname = 'foobar';
-$cc = 'cc';
-is($step->_select_lib( {
-    conf            => $conf,
-    osname          => $osname,
-    cc              => $cc,
-    win32_nongcc    => 'libcrypto.lib',
-    default         => '-lcrypto',
-} ),
-   '-lcrypto',
-   "_select_lib() returned expected value");
-
-my $verbose = undef;
-
-$conf->replenish($serialized);
-
-########## --without-crypto; _evaluate_cc_run() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--without-crypto} ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-my ($test, $has_crypto);
-$test = qq{OpenSSL 0.9.9z\n};
-$has_crypto = 0;
-$verbose = undef;
-$has_crypto = $step->_evaluate_cc_run($conf, $test, $has_crypto, $verbose);
-is($has_crypto, 1, "'has_crypto' set as expected");
-is($step->result(), 'yes, 0.9.9z', "Expected result was set");
-# Prepare for next test
-$step->set_result(undef);
-
-$test = qq{foobar};
-$has_crypto = 0;
-$verbose = undef;
-$has_crypto = $step->_evaluate_cc_run($conf, $test, $has_crypto, $verbose);
-is($has_crypto, 0, "'has_crypto' set as expected");
-ok(! defined $step->result(), "Result is undefined, as expected");
-
-{
-    my $stdout;
-    $test = qq{OpenSSL 0.9.9z\n};
-    $has_crypto = 0;
-    $verbose = 1;
-    capture(
-        sub { $has_crypto =
-            $step->_evaluate_cc_run($conf, $test, $has_crypto, $verbose); },
-        \$stdout,
-    );
-    is($has_crypto, 1, "'has_crypto' set as expected");
-    is($step->result(), 'yes, 0.9.9z', "Expected result was set");
-    like($stdout, qr/\(yes\)/, "Got expected verbose output");
-    # Prepare for next test
-    $step->set_result(undef);
-}
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_crypto-01.t - test auto::crypto
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_crypto-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::crypto.
-
-=head1 HISTORY
-
-Mostly taken from F<t/steps/auto_gdbm-01.t>.
-
-=head1 AUTHOR
-
-Francois Perrad
-
-=head1 SEE ALSO
-
-config::auto::crypto, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_ctags-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_ctags-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,151 +0,0 @@
-#!perl
-# Copyright (C) 2001-2007, Parrot Foundation.
-# $Id$
-# auto_ctags-01.t
-
-use strict;
-use warnings;
-use Test::More tests =>  28;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::auto::ctags');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw( capture );
-
-########## regular ##########
-
-my ($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-
-my $conf = Parrot::Configure->new;
-
-my $pkg = q{auto::ctags};
-
-$conf->add_steps($pkg);
-
-my $serialized = $conf->pcfreeze();
-
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-my %possible_ctags = map {$_,1}
-    qw( ctags exuberant-ctags ctags-exuberant exctags );
-my $ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-ok(defined($step->result()), "Result was defined");
-ok($possible_ctags{$conf->data->get('ctags')},
-    "Acceptable value for 'ctags' attribute was set");
-
-$conf->replenish($serialized);
-
-########## --verbose ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--verbose} ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-{
-    my $stdout;
-    my $ret = capture(
-        sub { $step->runstep($conf) },
-        \$stdout
-    );
-    ok( $ret, "runstep() returned true value" );
-    ok( defined $step->result(), "Result was defined");
-    ok($possible_ctags{$conf->data->get('ctags')},
-        "Acceptable value for 'ctags' attribute was set");
-}
-
-$conf->replenish($serialized);
-
-########## _evaluate_ctags() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-
-$conf->replenish($serialized);
-
-my $pseudo_ctags;
-$pseudo_ctags = q{alpha};
-$step->_evaluate_ctags($conf, $pseudo_ctags, 1);
-is($conf->data->get('ctags'), $pseudo_ctags,
-    "'ctags' attribute was set as expected");
-is($step->result(), q{yes}, "Got expected result");
-
-$pseudo_ctags = q{alpha};
-$step->_evaluate_ctags($conf, $pseudo_ctags, 0);
-is($conf->data->get('ctags'), 'ctags',
-    "'ctags' attribute was set as expected");
-is($step->result(), q{no}, "Got expected result");
-
-$conf->replenish($serialized);
-
-########## _probe_for_ctags_output() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-ok(auto::ctags::_probe_for_ctags_output('Exuberant Ctags', 0),
-    "Probe returned true when output matched");
-ok(! auto::ctags::_probe_for_ctags_output('alpha', 0),
-    "Probe returned false when output matched");
-{
-    my $stdout;
-    my $rv = capture(
-        sub { auto::ctags::_probe_for_ctags_output('Exuberant Ctags', 1) },
-        \$stdout
-    );
-    ok($rv, "Probe returned true when output matched");
-}
-{
-    my $stdout;
-    my $rv = capture(
-        sub { auto::ctags::_probe_for_ctags_output('alpha', 1) },
-        \$stdout
-    );
-    ok(! $rv, "Probe returned false when output matched");
-}
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-t/steps/auto_ctags-01.t - tests Parrot::Configure step auto::ctags
-
-=head1 SYNOPSIS
-
-    prove t/steps/auto_ctags-01.t
-
-=head1 DESCRIPTION
-
-This file holds tests for auto::ctags.
-
-=head1 AUTHOR
-
-Paul Cochrane <paultcochrane at gmail dot com>
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_env-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_env-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,159 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_env-01.t
-
-use strict;
-use warnings;
-use Test::More tests =>  29;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::env');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw( capture );
-
-########### regular ###########
-
-my ($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-
-my $conf = Parrot::Configure->new();
-
-test_step_thru_runstep($conf, q{init::defaults}, $args);
-
-my $pkg = q{auto::env};
-
-$conf->add_steps($pkg);
-
-my $serialized = $conf->pcfreeze();
-
-$conf->options->set(%{$args});
-my $step = test_step_constructor_and_description($conf);
-ok($step->runstep($conf), "runstep() returned true value");
-
-$conf->replenish($serialized);
-
-########### _evaluate_env() ###########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-my ($setenv, $unsetenv);
-$setenv = 1;
-$unsetenv = 1;
-$step->_evaluate_env($conf, $setenv, $unsetenv);
-is($step->result(), q{both}, "Got expected result");
-$setenv = 1;
-$unsetenv = 0;
-$step->_evaluate_env($conf, $setenv, $unsetenv);
-is($step->result(), q{setenv}, "Got expected result");
-$setenv = 0;
-$unsetenv = 1;
-$step->_evaluate_env($conf, $setenv, $unsetenv);
-is($step->result(), q{unsetenv}, "Got expected result");
-$setenv = 0;
-$unsetenv = 0;
-$step->_evaluate_env($conf, $setenv, $unsetenv);
-is($step->result(), q{no}, "Got expected result");
-
-$conf->replenish($serialized);
-
-########### --verbose; _evaluate_env() ###########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ q{--verbose} ],
-    mode            => q{configure},
-} );
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    my $stdout;
-    $setenv = 1;
-    $unsetenv = 1;
-    capture(
-        sub { $step->_evaluate_env($conf, $setenv, $unsetenv) },
-        \$stdout
-    );
-    like($stdout, qr/both/, "Got expected verbose output");
-    is($step->result(), q{both}, "Got expected result");
-}
-{
-    my $stdout;
-    $setenv = 1;
-    $unsetenv = 0;
-    capture(
-        sub { $step->_evaluate_env($conf, $setenv, $unsetenv) },
-        \$stdout
-    );
-    like($stdout, qr/setenv/, "Got expected verbose output");
-    is($step->result(), q{setenv}, "Got expected result");
-}
-{
-    my $stdout;
-    $setenv = 0;
-    $unsetenv = 1;
-    capture(
-        sub { $step->_evaluate_env($conf, $setenv, $unsetenv) },
-        \$stdout
-    );
-    like($stdout, qr/unsetenv/, "Got expected verbose output");
-    is($step->result(), q{unsetenv}, "Got expected result");
-}
-{
-    my $stdout;
-    $setenv = 0;
-    $unsetenv = 0;
-    capture(
-        sub { $step->_evaluate_env($conf, $setenv, $unsetenv) },
-        \$stdout
-    );
-    like($stdout, qr/no/, "Got expected verbose output");
-    is($step->result(), q{no}, "Got expected result");
-}
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_env-01.t - test auto::env
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_env-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::env.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::env, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_fink-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_fink-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,289 +0,0 @@
-#! perl
-# Copyright (C) 2007-2009, Parrot Foundation.
-# $Id$
-# auto_fink-01.t
-
-use strict;
-use warnings;
-use Test::More;
-use Carp;
-use File::Temp;
-use lib qw( lib t/configure/testlib );
-
-plan( skip_all => 'fink is Darwin only' ) unless $^O =~ /darwin/i;
-plan( tests => 55 );
-
-use_ok('config::init::defaults');
-use_ok('config::auto::fink');
-
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw( capture );
-
-########## Darwin but no good Fink  ##########
-
-my ($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-
-my $conf = Parrot::Configure->new();
-
-test_step_thru_runstep($conf, q{init::defaults}, $args);
-
-my $pkg = q{auto::fink};
-
-$conf->add_steps($pkg);
-
-my $serialized = $conf->pcfreeze();
-
-$conf->options->set(%{$args});
-my $step = test_step_constructor_and_description($conf);
-
-# Success in the following test means:
-# (a) OS is Darwin.
-# (b) Either Fink is not installed or it is installed correctly, i.e., we can
-# locate the Fink subdirectories we need for later Parrot configuration steps.
-ok($step->runstep($conf), "runstep() returned true value");
-
-$conf->replenish($serialized);
-
-########## not Darwin ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-# mock not Darwin
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-$conf->data->set_p5( 'OSNAME' => 'foobar' );
-ok($step->runstep($conf), "runstep() returned true value");
-is($step->result(), q{skipped}, "Got expected result for non-Darwin OS");
-
-$conf->replenish($serialized);
-
-########## no Fink ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-# mock no Fink
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-$step->{fink_conf} = q{my_ridiculous_foobar};
-my $msg = q{Fink not installed};
-
-{
-    ok($step->runstep($conf), "runstep() returned true value");
-    is($step->result(), $msg, "Got expected result for $msg");
-}
-
-$conf->replenish($serialized);
-
-########## Darwin but defective Fink ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    # mock Fink config file with no Basepath
-    my $tfile = File::Temp->new();
-    open my $fh, ">", $tfile
-        or croak "Unable to open temporary file for writing";
-    print $fh "Message: Hello world\n";
-    close $fh or croak "Unable to close temporary file after writing";
-    $step->{fink_conf} = $tfile;
-    ok(! defined $step->runstep($conf),
-        "runstep() returned undef due to defective Fink config file");
-    is($step->result(), q{failed},
-        "Got expected result for defective Fink Config file");
-}
-
-$conf->replenish($serialized);
-
-########## Darwin but defective Fink ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    # mock Fink config file with non-existent Basepath
-    my $tfile = File::Temp->new();
-    open my $fh, ">", $tfile
-        or croak "Unable to open temporary file for writing";
-    print $fh "Basepath: /my/phony/directory\n";
-    close $fh or croak "Unable to close temporary file after writing";
-    $step->{fink_conf} = $tfile;
-    ok(! defined $step->runstep($conf),
-        "runstep() returned undef due to unlocateable Fink directories");
-    is($step->result(), q{failed},
-        "Got expected result for unlocateable Fink directories");
-}
-
-$conf->replenish($serialized);
-
-########## not Darwin; --verbose ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ q{--verbose} ],
-    mode            => q{configure},
-} );
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    # mock not Darwin
-    my $phony_OS = q{foobar};
-    $conf->data->set_p5( 'OSNAME' => $phony_OS );
-    my ($rv, $stdout);
-    capture(
-        sub { $rv = $step->runstep($conf); },
-        \$stdout,
-    );
-    ok($rv, "runstep() returned true value");
-    is($step->result(), q{skipped}, "Got expected result for non-Darwin OS");
-    like($stdout,
-        qr/Operating system is $phony_OS; Fink is Darwin only/,
-        "Got expected verbose output when OS is not Darwin");
-}
-
-$conf->replenish($serialized);
-
-########## Darwin; --verbose; no Fink ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ q{--verbose} ],
-    mode            => q{configure},
-} );
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    # mock no Fink
-    $step->{fink_conf} = q{my_ridiculous_foobar};
-    my $msg = q{Fink not installed};
-    my ($rv, $stdout);
-    capture(
-        sub { $rv = $step->runstep($conf); },
-        \$stdout,
-    );
-    ok($rv, "runstep() returned true value");
-    is($step->result(), $msg,
-        "Got expected result for $msg");
-    like($stdout,
-        qr/Fink configuration file not located/,
-        "Got expected verbose output when OS is not Darwin");
-}
-
-$conf->replenish($serialized);
-
-########## Darwin; --verbose; defective Fink ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ q{--verbose} ],
-    mode            => q{configure},
-} );
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    # mock Fink config file with no Basepath
-    my $tfile = File::Temp->new();
-    open my $fh, ">", $tfile
-        or croak "Unable to open temporary file for writing";
-    print $fh "Message: Hello world\n";
-    close $fh or croak "Unable to close temporary file after writing";
-    $step->{fink_conf} = $tfile;
-
-    my ($rv, $stdout);
-    capture(
-        sub { $rv = $step->runstep($conf); },
-        \$stdout,
-    );
-    ok(! defined $rv,
-        "runstep() returned undef due to defective Fink config file");
-    is($step->result(), q{failed},
-        "Got expected result for defective Fink Config file");
-    like($stdout,
-        qr/Fink configuration file defective:  no 'Basepath'/,
-        "Got expected verbose output when Fink config file lacked 'Basepath'");
-}
-
-$conf->replenish($serialized);
-
-########## Darwin; --verbose; defective Fink ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ q{--verbose} ],
-    mode            => q{configure},
-} );
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    # mock Fink config file with non-existent Basepath
-    my $tfile = File::Temp->new();
-    open my $fh, ">", $tfile
-        or croak "Unable to open temporary file for writing";
-    print $fh "Basepath: /my/phony/directory\n";
-    close $fh or croak "Unable to close temporary file after writing";
-    $step->{fink_conf} = $tfile;
-
-    my ($rv, $stdout);
-    capture(
-        sub { $rv = $step->runstep($conf); },
-        \$stdout,
-    );
-    ok(! defined $rv,
-        "runstep() returned undef due to unlocateable Fink directories");
-    is($step->result(), q{failed},
-        "Got expected result for unlocateable Fink directories");
-    like($stdout,
-        qr/Could not locate Fink directories/,
-        "Got expected verbose output for unlocateable Fink directories");
-}
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_fink-01.t - test auto::fink
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_fink-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::fink.  Some tests will run only on Darwin.
-Others simulate how auto::fink runs on operating systems other than Darwin.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::fink, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_format-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_format-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,157 +0,0 @@
-#! perl
-# Copyright (C) 2008, Parrot Foundation.
-# $Id$
-# auto_format-01.t
-
-use strict;
-use warnings;
-use Test::More tests => 16;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::auto::format');
-use Parrot::BuildUtil;
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    test_step_constructor_and_description
-);
-
-########## _set_intvalfmt() ##########
-
-my ($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-
-my $conf = Parrot::Configure->new();
-
-my ($task, $step_name, $step, $ret);
-my $pkg = q{auto::format};
-
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    $conf->data->set( iv => 'int' );
-    auto::format::_set_intvalfmt($conf);
-    is($conf->data->get( 'intvalfmt' ), '%d',
-        "intvalfmt set as expected");
-    # reset for next test
-    $conf->data->set( iv => undef );
-}
-{
-    $conf->data->set( iv => 'long' );
-    auto::format::_set_intvalfmt($conf);
-    is($conf->data->get( 'intvalfmt' ), '%ld',
-        "intvalfmt set as expected");
-    # reset for next test
-    $conf->data->set( iv => undef );
-}
-{
-    $conf->data->set( iv => 'long int' );
-    auto::format::_set_intvalfmt($conf);
-    is($conf->data->get( 'intvalfmt' ), '%ld',
-        "intvalfmt set as expected");
-    # reset for next test
-    $conf->data->set( iv => undef );
-}
-{
-    $conf->data->set( iv => 'long long' );
-    auto::format::_set_intvalfmt($conf);
-    is($conf->data->get( 'intvalfmt' ), '%lld',
-        "intvalfmt set as expected");
-    # reset for next test
-    $conf->data->set( iv => undef );
-}
-{
-    $conf->data->set( iv => 'long long int' );
-    auto::format::_set_intvalfmt($conf);
-    is($conf->data->get( 'intvalfmt' ), '%lld',
-        "intvalfmt set as expected");
-    # reset for next test
-    $conf->data->set( iv => undef );
-}
-{
-    my $type = 'foobar';
-    $conf->data->set( iv => $type );
-    eval { auto::format::_set_intvalfmt($conf); };
-    like($@,
-        qr/Can't find a printf-style format specifier for type '$type'/, #'
-        "Got expected error message");
-}
-
-########## _set_floatvalfmt_nvsize() ##########
-
-{
-    $conf->data->set( nv => 'double' );
-    auto::format::_set_floatvalfmt_nvsize($conf);
-    is($conf->data->get( 'floatvalfmt' ), '%.15g',
-        "floatvalfmt set as expected");
-    is($conf->data->get( 'nvsize' ), $conf->data->get( 'doublesize' ),
-        "nvsize set as expected");
-    $conf->data->set(
-        nv          => undef,
-        floatvalfmt => undef,
-        nvsize      => undef,
-    );
-}
-{
-    use Config;
-    my $p5format = '%.15' . $Config{sPRIgldbl};
-    $p5format =~ s/"//g;; # Perl 5's Config value has embedded double quotes
-    $conf->data->set( nv => 'long double' );
-    auto::format::_set_floatvalfmt_nvsize($conf);
-    is($conf->data->get( 'floatvalfmt' ), $p5format,
-        "floatvalfmt set as expected");
-    is($conf->data->get( 'nvsize' ), $conf->data->get( 'hugefloatvalsize' ),
-        "nvsize set as expected");
-    $conf->data->set(
-        nv          => undef,
-        floatvalfmt => undef,
-        nvsize      => undef,
-    );
-}
-{
-    my $type = 'foobar';
-    $conf->data->set( nv => 'foobar' );
-    eval { auto::format::_set_floatvalfmt_nvsize($conf); };
-    like($@,
-        qr/Can't find a printf-style format specifier for type '$type'/, #'
-        "Got expected error message");
-}
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_format-01.t - test auto::format
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_format-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::format.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::format, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_funcptr-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_funcptr-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,134 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_funcptr-01.t
-
-use strict;
-use warnings;
-use Test::More tests => 28;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::funcptr');
-use Parrot::BuildUtil;
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw( test_step_thru_runstep);
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw( capture );
-
-########### --jitcapable=0  ###########
-
-my ($args, $step_list_ref) = process_options( {
-    argv            => [ q{--jitcapable=0} ],
-    mode            => q{configure},
-} );
-
-my $conf = Parrot::Configure->new();
-
-my $serialized = $conf->pcfreeze();
-
-test_step_thru_runstep($conf, q{init::defaults}, $args);
-
-my $pkg = q{auto::funcptr};
-
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-my $step = test_step_constructor_and_description($conf);
-my $ret = $step->runstep($conf);
-ok($ret, "runstep() returned defined value" );
-
-$conf->replenish($serialized);
-
-########### _cast_void_pointers_msg() ###########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ ],
-    mode            => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-{
-    my $stdout;
-    my $ret = capture(
-        sub { auto::funcptr::_cast_void_pointers_msg(); },
-        \$stdout,
-    );
-    like($stdout, qr/Although it is not required/s,
-        "Got expected advisory message");
-}
-
-########### _set_positive_result() ###########
-
-{
-    my $stdout;
-    my $ret = capture(
-        sub { auto::funcptr::_set_positive_result($step, $conf); },
-        \$stdout,
-    );
-    is($step->result, q{yes}, "Got expected result");
-    ok(! $stdout, "Nothing printed to STDOUT, as expected");
-}
-
-$conf->replenish($serialized);
-
-########### --verbose; _set_positive_result() ###########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ q{--verbose} ],
-    mode            => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-{
-    my $stdout;
-    my $ret = capture(
-        sub { auto::funcptr::_set_positive_result($step, $conf); },
-        \$stdout,
-    );
-    is($step->result, q{yes}, "Got expected result");
-    like($stdout, qr/yes/, "Got expected verbose output");
-}
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_funcptr-01.t - test auto::funcptr
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_funcptr-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test aspects of auto::funcptr.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::funcptr, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_gc-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_gc-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,165 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_gc-01.t
-
-use strict;
-use warnings;
-use Test::More tests => 35;
-use lib qw( lib t/configure/testlib );
-use_ok('config::auto::gc');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw| capture |;
-
-########### --verbose ###########
-
-my ($args, $step_list_ref) = process_options(
-    {
-        argv => [ q{--verbose} ],
-        mode => q{configure},
-    }
-);
-
-my $conf = Parrot::Configure->new;
-
-my $pkg = q{auto::gc};
-
-$conf->add_steps($pkg);
-
-my $serialized = $conf->pcfreeze();
-
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-{
-    my ($ret, $stdout);
-    capture(
-        sub { $ret = $step->runstep($conf); },
-        \$stdout,
-    );
-    ok( $ret, "runstep() returned true value" );
-    like( $stdout, qr/\(gc\)/, "Got expected verbose output");
-    is($conf->data->get('gc_flag'), q{},
-        "Got expected value for 'gc_flag'");
-}
-
-$conf->replenish($serialized);
-
-########### --gc=gc ###########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--gc=gc} ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-my $ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($conf->data->get('gc_flag'), q{},
-    "Got expected value for 'gc_flag'");
-
-$conf->replenish($serialized);
-
-########### --gc=libc ###########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--gc=libc} ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$conf->data->set('i_malloc' => 1);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($conf->data->get('gc_flag'), '-DGC_IS_MALLOC',
-    "Got expected value for 'gc_flag'");
-is($conf->data->get('malloc_header'), 'malloc.h',
-    "Got expected value for 'malloc_header'");
-
-$conf->replenish($serialized);
-
-########### --gc=libc ###########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--gc=libc} ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$conf->data->set('i_malloc' => undef);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($conf->data->get('gc_flag'), '-DGC_IS_MALLOC',
-    "Got expected value for 'gc_flag'");
-is($conf->data->get('malloc_header'), 'stdlib.h',
-    "Got expected value for 'malloc_header'");
-
-$conf->replenish($serialized);
-
-########### --gc=malloc ###########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--gc=malloc} ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($conf->data->get('gc_flag'), '-DGC_IS_MALLOC',
-    "Got expected value for 'gc_flag'");
-
-$conf->replenish($serialized);
-
-########### --gc=malloc-trace ###########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--gc=malloc-trace} ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-$ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($conf->data->get('gc_flag'), '-DGC_IS_MALLOC',
-    "Got expected value for 'gc_flag'");
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_gc-01.t - test auto::gc
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_gc-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::gc.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::gc, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_gcc-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_gcc-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,327 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_gcc-01.t
-
-use strict;
-use warnings;
-use Test::More tests => 122;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::inter::progs');
-use_ok('config::auto::gcc');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw | capture |;
-
-########## regular  ##########
-
-my ($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-
-my $conf = Parrot::Configure->new();
-
-my $serialized = $conf->pcfreeze();
-
-test_step_thru_runstep($conf, q{init::defaults}, $args);
-test_step_thru_runstep( $conf, q{inter::progs},  $args );
-
-my $pkg = q{auto::gcc};
-
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-my $step = test_step_constructor_and_description($conf);
-
-ok($step->runstep($conf), "runstep returned true value");
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc() ##########
-
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-my $gnucref = {};
-ok($step->_evaluate_gcc($conf, $gnucref),
-    "_evaluate_gcc() returned true value");
-ok(! defined $conf->data->get( 'gccversion' ),
-    "gccversion undef as expected");
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc() ##########
-
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-$gnucref = {};
-$gnucref->{__GNUC__} = 1;
-$gnucref->{__INTEL_COMPILER} = 1;
-ok($step->_evaluate_gcc($conf, $gnucref),
-    "_evaluate_gcc() returned true value");
-ok(! defined $conf->data->get( 'gccversion' ),
-    "gccversion undef as expected");
-is($step->result(), q{no}, "Got expected result");
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc(); --verbose ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ q{--verbose} ],
-    mode            => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    my $rv;
-    my $stdout;
-    my $gnucref = {};
-    $gnucref->{__GNUC__} = undef;
-    capture ( sub {$rv = $step->_evaluate_gcc($conf, $gnucref) }, \$stdout);
-    ok($rv, "_evaluate_gcc() returned true value");
-    ok( $stdout, "verbose output captured" );
-    ok(! defined $conf->data->get( 'gccversion' ),
-        "gccversion undef as expected");
-    is($step->result(), q{no}, "Got expected result");
-}
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-$gnucref = {};
-$gnucref->{__GNUC__} = 1;
-$gnucref->{__INTEL_COMPILER} = 1;
-ok($step->_evaluate_gcc($conf, $gnucref),
-    "_evaluate_gcc() returned true value");
-ok(! defined $conf->data->get( 'gccversion' ),
-    "gccversion undef as expected");
-is($step->result(), q{no}, "Got expected result");
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc(); --verbose ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ q{--verbose} ],
-    mode            => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    my $rv;
-    my $stdout;
-    my $gnucref = {};
-    $gnucref->{__GNUC__} = q{abc123};
-    capture ( sub {$rv = $step->_evaluate_gcc($conf, $gnucref) }, \$stdout);
-    ok($rv, "_evaluate_gcc() returned true value");
-    ok( $stdout, "verbose output captured" );
-    ok(! defined $conf->data->get( 'gccversion' ),
-        "gccversion undef as expected");
-    is($step->result(), q{no}, "Got expected result");
-}
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc() ##########
-
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    my $rv;
-    my $stdout;
-    my $gnucref = {};
-    $gnucref->{__GNUC__} = q{123};
-    $gnucref->{__GNUC_MINOR__} = q{abc};
-    capture ( sub {$rv = $step->_evaluate_gcc($conf, $gnucref) }, \$stdout);
-    ok($rv, "_evaluate_gcc() returned true value");
-    ok( !$stdout, "verbose output captured" );
-    ok(defined $conf->data->get( 'gccversion' ),
-        "gccversion defined as expected");
-    is($conf->data->get( 'gccversion' ), 123,
-        "Got expected value for gccversion");
-    like($step->result(), qr/^yes/, "Got expected result");
-}
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    my $rv;
-    my $stdout;
-    my $gnucref = {};
-    $gnucref->{__GNUC__} = q{123};
-    $gnucref->{__GNUC_MINOR__} = q{456};
-    capture ( sub {$rv = $step->_evaluate_gcc($conf, $gnucref) }, \$stdout);
-    ok($rv, "_evaluate_gcc() returned true value");
-    ok(defined $conf->data->get( 'gccversion' ),
-        "gccversion defined as expected");
-    is($conf->data->get( 'gccversion' ), q{123.456},
-        "Got expected value for gccversion");
-    like($step->result(), qr/^yes/, "Got expected result");
-}
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc(); --verbose ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ q{--verbose} ],
-    mode            => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-{
-    my $rv;
-    my $stdout;
-    my $gnucref = {};
-    $gnucref->{__GNUC__} = q{123};
-    $gnucref->{__GNUC_MINOR__} = q{456};
-    capture ( sub {$rv = $step->_evaluate_gcc($conf, $gnucref) }, \$stdout);
-    ok($rv, "_evaluate_gcc() returned true value");
-    ok( !$stdout, "verbose output captured" );
-    ok(defined $conf->data->get( 'gccversion' ),
-        "gccversion defined as expected");
-    is($conf->data->get( 'gccversion' ), q{123.456},
-        "Got expected value for gccversion");
-    like($step->result(), qr/^yes/, "Got expected result");
-}
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ ],
-    mode            => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-$gnucref = {};
-$gnucref->{__GNUC__} = q{abc123};
-ok($step->_evaluate_gcc($conf, $gnucref),
-    "_evaluate_gcc() returned true value");
-ok(! defined $conf->data->get( 'gccversion' ),
-    "gccversion undef as expected");
-is($step->result(), q{no}, "Got expected result");
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc(); maintaiiner; cage ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ q{--maintainer}, q{--cage} ],
-    mode            => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-$gnucref = {};
-$gnucref->{__GNUC__} = q{3};
-$gnucref->{__GNUC_MINOR__} = q{1};
-$conf->data->set( ccwarn => q{-Wfoobar -Wnofoobaz} );
-ok($step->_evaluate_gcc($conf, $gnucref),
-    "_evaluate_gcc() returned true value");
-ok(defined $conf->data->get( 'gccversion' ),
-    "gccversion defined as expected");
-like($step->result(), qr/^yes/, "Got expected result");
-
-$conf->replenish($serialized);
-
-########## _evaluate_gcc() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv            => [ ],
-    mode            => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-$gnucref = {};
-$gnucref->{__GNUC__} = q{3};
-$gnucref->{__GNUC_MINOR__} = q{1};
-{
-    $conf->data->set_p5( OSNAME => 'hpux' );
-    ok($step->_evaluate_gcc($conf, $gnucref),
-        "_evaluate_gcc() returned true value");
-    ok(defined $conf->data->get( 'gccversion' ),
-        "gccversion defined as expected");
-    is($conf->data->get( 'gccversion' ), q{3.1},
-        "Got expected value for gccversion");
-    like($step->result(), qr/^yes/, "Got expected result");
-}
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_gcc-01.t - test auto::gcc
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_gcc-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::gcc.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::gcc, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_gdbm-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_gdbm-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,201 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_gdbm-01.t
-
-use strict;
-use warnings;
-use Test::More tests =>  47;
-use Carp;
-use Cwd;
-use File::Spec;
-use File::Temp qw( tempdir );
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::gdbm');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw| capture |;
-
-=for hints_for_testing The documentation for this package is skimpy;
-please try to improve it, e.g., by providing a short description of what
-the 'gdbm' is.  Some branches are compiler- or OS-specific.  As noted in
-a comment in the module, please consider the issues raised in
-http://rt.perl.org/rt3/Ticket/Display.html?id=43134.
-
-=cut
-
-########## --without-gdbm  ##########
-
-my ($args, $step_list_ref) = process_options( {
-    argv => [ q{--without-gdbm} ],
-    mode => q{configure},
-} );
-
-my $conf = Parrot::Configure->new;
-
-my $serialized = $conf->pcfreeze();
-
-test_step_thru_runstep( $conf, q{init::defaults}, $args );
-
-my $pkg = q{auto::gdbm};
-
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-my $ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($conf->data->get('has_gdbm'), 0,
-    "Got expected value for 'has_gdbm'");
-is($step->result(), q{no}, "Expected result was set");
-
-$conf->replenish($serialized);
-
-########## --without-gdbm; _handle_darwin_for_fink() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--without-gdbm} ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-my $osname;
-my ($flagsbefore, $flagsafter);
-$osname = 'foobar';
-$flagsbefore = $conf->data->get( 'linkflags' );
-ok($step->_handle_darwin_for_fink($conf, $osname, 'gdbm.h'),
-    "handle_darwin_for_fink() returned true value");
-$flagsafter = $conf->data->get( 'linkflags' );
-is($flagsbefore, $flagsafter, "No change in linkflags, as expected");
-my $cwd = cwd();
-{
-    my $tdir = tempdir( CLEANUP => 1 );
-    ok(chdir $tdir, "Able to change to temporary directory");
-    ok( (mkdir 'lib'), "Able to make lib directory");
-    ok( (mkdir 'include'), "Able to make include directory");
-    my $libdir = File::Spec->catdir( $tdir, 'lib' );
-    my $includedir = File::Spec->catdir( $tdir, 'include' );
-    $conf->data->set('fink_lib_dir' => $libdir);
-    $conf->data->set('fink_include_dir' => $includedir);
-    $osname = 'darwin';
-    $flagsbefore = $conf->data->get( 'linkflags' );
-    ok($step->_handle_darwin_for_fink($conf, $osname, 'gdbm.h'),
-        "handle_darwin_for_fink() returned true value");
-    $flagsafter = $conf->data->get( 'linkflags' );
-    is($flagsbefore, $flagsafter, "No change in linkflags, as expected");
-
-    ok(chdir $cwd, "Able to change back to original directory after testing");
-}
-{
-    my $tdir2 = tempdir( CLEANUP => 1 );
-    ok(chdir $tdir2, "Able to change to temporary directory");
-    ok( (mkdir 'lib'), "Able to make lib directory");
-    ok( (mkdir 'include'), "Able to make include directory");
-    my $libdir = File::Spec->catdir( $tdir2, 'lib' );
-    my $includedir = File::Spec->catdir( $tdir2, 'include' );
-    $conf->data->set('fink_lib_dir' => $libdir);
-    $conf->data->set('fink_include_dir' => $includedir);
-    my $foo = File::Spec->catfile( $includedir, 'gdbm.h' );
-    open my $FH, ">", $foo or croak "Could not open for writing";
-    print $FH "Hello world\n";
-    close $FH or croak "Could not close after writing";
-
-    $osname = 'darwin';
-    $flagsbefore = $conf->data->get( 'linkflags' );
-    ok($step->_handle_darwin_for_fink($conf, $osname, 'gdbm.h'),
-        "handle_darwin_for_fink() returned true value");
-    $flagsafter = $conf->data->get( 'linkflags' );
-    isnt($flagsbefore, $flagsafter, "Change in linkflags, as expected");
-    like($conf->data->get( 'linkflags' ), qr/-L\Q$libdir\E/,
-        "'linkflags' modified as expected");
-
-    ok(chdir $cwd, "Able to change back to original directory after testing");
-}
-
-$conf->replenish($serialized);
-
-########## --without-gdbm; _evaluate_cc_run() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--without-gdbm} ],
-    mode => q{configure},
-} );
-rerun_defaults_for_testing($conf, $args );
-$conf->add_steps($pkg);
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-my ($test, $has_gdbm, $verbose);
-$test = qq{gdbm is working.\n};
-$has_gdbm = 0;
-$verbose = undef;
-$has_gdbm = $step->_evaluate_cc_run($test, $has_gdbm, $verbose);
-is($has_gdbm, 1, "'has_gdbm' set as expected");
-is($step->result(), 'yes', "Expected result was set");
-# Prepare for next test
-$step->set_result(undef);
-$test = qq{foobar};
-$has_gdbm = 0;
-$verbose = undef;
-$has_gdbm = $step->_evaluate_cc_run($test, $has_gdbm, $verbose);
-is($has_gdbm, 0, "'has_gdbm' set as expected");
-ok(! defined $step->result(), "Result is undefined, as expected");
-{
-    my $stdout;
-    $test = qq{gdbm is working.\n};
-    $has_gdbm = 0;
-    $verbose = 1;
-    capture(
-        sub { $has_gdbm =
-            $step->_evaluate_cc_run($test, $has_gdbm, $verbose); },
-        \$stdout,
-    );
-    is($has_gdbm, 1, "'has_gdbm' set as expected");
-    is($step->result(), 'yes', "Expected result was set");
-    like($stdout, qr/\(yes\)/, "Got expected verbose output");
-    # Prepare for next test
-    $step->set_result(undef);
-}
-
-$conf->replenish($serialized);
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_gdbm-01.t - test auto::gdbm
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_gdbm-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::gdbm.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::gdbm, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_gettext-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_gettext-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,217 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_gettext-01.t
-
-use strict;
-use warnings;
-use Test::More tests =>  30;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::auto::gettext');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw( capture );
-
-########## --without-gettext ##########
-
-my ($args, $step_list_ref) = process_options(
-    {
-        argv => [ q{--without-gettext} ],
-        mode => q{configure},
-    }
-);
-
-my $conf = Parrot::Configure->new;
-
-my $pkg = q{auto::gettext};
-
-$conf->add_steps($pkg);
-
-my $serialized = $conf->pcfreeze();
-
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-my $ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($conf->data->get('has_gettext'), 0,
-    "Got expected value for 'has_gettext'");
-is($step->result(), q{no}, "Expected result was set");
-
-$conf->replenish($serialized);
-
-########## _select_lib() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-
-# Mock values for OS and C-compiler
-my ($osname, $cc, $initial_value);
-$osname = 'mswin32';
-$cc = 'gcc';
-$initial_value = $conf->data->get( 'libs' );
-is($step->_select_lib( {
-    conf            => $conf,
-    osname          => $osname,
-    cc              => $cc,
-    win32_gcc       => '-lintl',
-    win32_nongcc    => 'intl.lib',
-    default         => defined $conf->data->get('glibc') ? '' : '-lintl',
-} ),
-   '-lintl',
-   "_select_lib() returned expected value");
-
-$osname = 'mswin32';
-$cc = 'cc';
-is($step->_select_lib( {
-    conf            => $conf,
-    osname          => $osname,
-    cc              => $cc,
-    win32_gcc       => '-lintl',
-    win32_nongcc    => 'intl.lib',
-    default         => defined $conf->data->get('glibc') ? '' : '-lintl',
-} ),
-   'intl.lib',
-   "_select_lib() returned expected value");
-
-$osname = 'foobar';
-$cc = 'cc';
-$conf->data->set( glibc => 1 );
-isnt($step->_select_lib( {
-    conf            => $conf,
-    osname          => $osname,
-    cc              => $cc,
-    win32_gcc       => '-lintl',
-    win32_nongcc    => 'intl.lib',
-    default         => defined $conf->data->get('glibc') ? '' : '-lintl',
-} ),
-   '-lintl',
-   "_select_lib() returned expected value");
-
-$osname = 'foobar';
-$cc = 'cc';
-$conf->data->set( glibc => undef );
-is($step->_select_lib( {
-    conf            => $conf,
-    osname          => $osname,
-    cc              => $cc,
-    win32_gcc       => '-lintl',
-    win32_nongcc    => 'intl.lib',
-    default         => defined $conf->data->get('glibc') ? '' : '-lintl',
-} ),
-   '-lintl',
-   "_select_lib() returned expected value");
-
-########## _evaluate_cc_run() ##########
-
-my ($test, $verbose);
-my $has_gettext;
-
-$test = "Hello, world!\n";
-$verbose = undef;
-$has_gettext = $step->_evaluate_cc_run($test, $verbose);
-is($has_gettext, 1, "Got expected value for has_gettext");
-is($step->result(), 'yes', "Expected result was set");
-# Prepare for next test
-$step->set_result(undef);
-
-{
-    my $stdout;
-    $test = "Hello, world!\n";
-    $verbose = 1;
-    capture(
-        sub {
-            $has_gettext = $step->_evaluate_cc_run($test, $verbose);
-        },
-        \$stdout,
-    );
-    is($has_gettext, 1, "Got expected value for has_gettext");
-    is($step->result(), 'yes', "Expected result was set");
-    like($stdout, qr/\(yes\)/, "Got expected verbose output");
-    # Prepare for next test
-    $step->set_result(undef);
-}
-
-$test = "Foobar\n";
-$verbose = undef;
-$has_gettext = $step->_evaluate_cc_run($test, $verbose);
-is($has_gettext, 0, "Got expected value for has_gettext");
-ok(! defined $step->result(), "As expected, result is not yet defined");
-
-$conf->replenish($serialized);
-
-########## --without-gettext; _handle_gettext() ##########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ q{--without-gettext} ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-
-$verbose = undef;
-$conf->data->set( ccflags => q{} );
-ok(auto::gettext::_handle_gettext($conf, $verbose),
-    "_handle_gettext() returned true value");
-like($conf->data->get( 'ccflags' ), qr/-DHAS_GETTEXT/,
-    "HAS_GETTEXT was added to 'ccflags'");
-
-{
-    my ($stdout, $rv);
-    $verbose = 1;
-    capture(
-        sub { $rv = auto::gettext::_handle_gettext($conf, $verbose); },
-        \$stdout,
-    );
-    ok($rv, "_handle_gettext() returned true value");
-    like($conf->data->get( 'ccflags' ), qr/-DHAS_GETTEXT/,
-        "HAS_GETTEXT was added to 'ccflags'");
-    like($stdout,
-        qr/ccflags:\s.*-DHAS_GETTEXT/,
-        "Got expected verbose output"
-    );
-}
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_gettext-01.t - test auto::gettext
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_gettext-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::gettext.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::gettext, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_glibc-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_glibc-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,94 +0,0 @@
-#! perl
-# Copyright (C) 2008, Parrot Foundation.
-# $Id$
-# auto_glibc-01.t
-
-use strict;
-use warnings;
-use Test::More tests => 18;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::glibc');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    test_step_constructor_and_description
-);
-
-########## regular ##########
-
-my ($args, $step_list_ref) = process_options( {
-    argv            => [],
-    mode            => q{configure},
-} );
-
-my $conf = Parrot::Configure->new();
-
-test_step_thru_runstep($conf, q{init::defaults}, $args);
-
-my ($task, $step_name, $step, $ret);
-my $pkg = q{auto::glibc};
-
-$conf->add_steps($pkg);
-
-my $serialized = $conf->pcfreeze();
-
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-ok($step->runstep($conf), "runstep() returned true value");
-
-$conf->replenish($serialized);
-
-########## _evaluate_glibc() ##########
-
-$conf->options->set(%{$args});
-$step = test_step_constructor_and_description($conf);
-
-my $test = {};
-$test->{glibc} = 1;
-$step->_evaluate_glibc($conf, $test);
-is( $step->result(), q{yes}, "Got expected result" );
-is( $conf->data->get( 'glibc' ), 1, "Got expected value for 'glibc'" );
-
-$test->{glibc} = undef;
-$step->_evaluate_glibc($conf, $test);
-is( $step->result(), q{no}, "Got expected result" );
-ok( ! defined $conf->data->get( 'glibc' ),
-    "'glibc' undefined as expected" );
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_glibc-01.t - test auto::glibc
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_glibc-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::glibc.
-
-=head1 AUTHOR
-
-Jerry Gay
-
-=head1 SEE ALSO
-
-config::auto::glibc, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_gmp-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_gmp-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,306 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_gmp-01.t
-
-use strict;
-use warnings;
-use Test::More tests =>  61;
-use Carp;
-use Cwd;
-use File::Spec;
-use File::Temp qw( tempdir );
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::gmp');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Test qw(
-    test_step_thru_runstep
-    rerun_defaults_for_testing
-    test_step_constructor_and_description
-);
-use IO::CaptureOutput qw( capture );
-
-=for hints_for_testing The documentation for this package is skimpy;
-please try to improve it, e.g., by providing a link to an introduction
-to the GNU MP library.
-
-=cut
-
-########### --without-gmp ###########
-
-my ($args, $step_list_ref) = process_options( {
-    argv => [ q{--without-gmp} ],
-    mode => q{configure},
-} );
-
-my $conf = Parrot::Configure->new;
-
-test_step_thru_runstep( $conf, q{init::defaults}, $args );
-
-my $pkg = q{auto::gmp};
-
-$conf->add_steps($pkg);
-
-my $serialized = $conf->pcfreeze();
-
-$conf->options->set( %{$args} );
-my $step = test_step_constructor_and_description($conf);
-my $ret = $step->runstep($conf);
-ok( $ret, "runstep() returned true value" );
-is($conf->data->get('has_gmp'), 0,
-    "Got expected value for 'has_gmp'");
-is($step->result(), q{no}, "Expected result was set");
-
-$conf->replenish($serialized);
-
-########### _select_lib() ###########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-# Mock values for OS and C-compiler
-my ($osname, $cc, $initial_value);
-$osname = 'mswin32';
-$cc = 'gcc';
-$initial_value = $conf->data->get( 'libs' );
-is($step->_select_lib( {
-    conf            => $conf,
-    osname          => $osname,
-    cc              => $cc,
-    win32_nongcc    => 'gmp.lib',
-    default         => '-lgmp',
-} ),
-   '-lgmp',
-   "_select_lib() returned expected value");
-
-$osname = 'mswin32';
-$cc = 'cc';
-is($step->_select_lib( {
-    conf            => $conf,
-    osname          => $osname,
-    cc              => $cc,
-    win32_nongcc    => 'gmp.lib',
-    default         => '-lgmp',
-} ),
-   'gmp.lib',
-   "_select_lib() returned expected value");
-
-$osname = 'foobar';
-$cc = undef;
-is($step->_select_lib( {
-    conf            => $conf,
-    osname          => $osname,
-    cc              => $cc,
-    win32_nongcc    => 'gmp.lib',
-    default         => '-lgmp',
-} ),
-   '-lgmp',
-   "_select_lib() returned expected value");
-
-########### _handle_darwin_for_fink() ###########
-
-my ($flagsbefore, $flagsafter);
-$osname = 'foobar';
-$flagsbefore = $conf->data->get( 'linkflags' );
-ok($step->_handle_darwin_for_fink($conf, $osname, 'gmp.h'),
-    "handle_darwin_for_fink() returned true value");
-$flagsafter = $conf->data->get( 'linkflags' );
-is($flagsbefore, $flagsafter, "No change in linkflags, as expected");
-
-my $cwd = cwd();
-{
-    my $tdir = tempdir( CLEANUP => 1 );
-    ok(chdir $tdir, "Able to change to temporary directory");
-    ok( (mkdir 'lib'), "Able to make lib directory");
-    ok( (mkdir 'include'), "Able to make include directory");
-    my $libdir = File::Spec->catdir( $tdir, 'lib' );
-    my $includedir = File::Spec->catdir( $tdir, 'include' );
-    $conf->data->set('fink_lib_dir' => $libdir);
-    $conf->data->set('fink_include_dir' => $includedir);
-    $osname = 'darwin';
-    $flagsbefore = $conf->data->get( 'linkflags' );
-    ok($step->_handle_darwin_for_fink($conf, $osname, 'gmp.h'),
-        "handle_darwin_for_fink() returned true value");
-    $flagsafter = $conf->data->get( 'linkflags' );
-    is($flagsbefore, $flagsafter, "No change in linkflags, as expected");
-
-    ok(chdir $cwd, "Able to change back to original directory after testing");
-}
-
-{
-    my $tdir2 = tempdir( CLEANUP => 1 );
-    ok(chdir $tdir2, "Able to change to temporary directory");
-    ok( (mkdir 'lib'), "Able to make lib directory");
-    ok( (mkdir 'include'), "Able to make include directory");
-    my $libdir = File::Spec->catdir( $tdir2, 'lib' );
-    my $includedir = File::Spec->catdir( $tdir2, 'include' );
-    $conf->data->set('fink_lib_dir' => $libdir);
-    $conf->data->set('fink_include_dir' => $includedir);
-    my $foo = File::Spec->catfile( $includedir, 'gmp.h' );
-    open my $FH, ">", $foo or croak "Could not open for writing";
-    print $FH "Hello world\n";
-    close $FH or croak "Could not close after writing";
-
-    $osname = 'darwin';
-    $flagsbefore = $conf->data->get( 'linkflags' );
-    ok($step->_handle_darwin_for_fink($conf, $osname, 'gmp.h'),
-        "handle_darwin_for_fink() returned true value");
-    $flagsafter = $conf->data->get( 'linkflags' );
-    isnt($flagsbefore, $flagsafter, "Change in linkflags, as expected");
-    like($conf->data->get( 'linkflags' ), qr/-L\Q$libdir\E/,
-        "'linkflags' modified as expected");
-
-    ok(chdir $cwd, "Able to change back to original directory after testing");
-}
-
-$conf->replenish($serialized);
-
-########### _evaluate_cc_run() ###########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-
-my ($test, $has_gmp, $verbose);
-
-$test = $step->{cc_run_expected};
-$has_gmp = 0;
-$verbose = undef;
-$has_gmp = $step->_evaluate_cc_run($conf, $test, $has_gmp, $verbose);
-is($step->result, 'yes', "Got expected result");
-is($conf->data->get('gmp'), 'define', "Expected value set for 'gmp'");
-is($conf->data->get('HAS_GMP'), 1, "Expected value set for 'HAS_GMP'");
-# prepare for next test
-$conf->data->set('gmp' => undef);
-$conf->data->set('HAS_GMP' => undef);
-$step->set_result(undef);
-
-$test = '12345';
-$has_gmp = 0;
-$verbose = undef;
-$has_gmp = $step->_evaluate_cc_run($conf, $test, $has_gmp, $verbose);
-ok(! defined($step->result), "Result undefined as expected");
-is($has_gmp, 0, "gmp status unchanged");
-
-{
-    my $stdout;
-    $test = $step->{cc_run_expected};
-    $has_gmp = 0;
-    $verbose = 1;
-    capture(
-        sub { $has_gmp =
-            $step->_evaluate_cc_run($conf, $test, $has_gmp, $verbose); },
-        \$stdout,
-    );
-    is($step->result, 'yes', "Got expected result");
-    is($conf->data->get('gmp'), 'define', "Expected value set for 'gmp'");
-    is($conf->data->get('HAS_GMP'), 1, "Expected value set for 'HAS_GMP'");
-    like($stdout, qr/\(yes\)/, "Got expected verbose output");
-    # prepare for next test
-    $conf->data->set('gmp' => undef);
-    $conf->data->set('HAS_GMP' => undef);
-    $step->set_result(undef);
-}
-
-########### _handle_darwin_for_fink() ###########
-
-($args, $step_list_ref) = process_options( {
-    argv => [ ],
-    mode => q{configure},
-} );
-$conf->options->set( %{$args} );
-$step = test_step_constructor_and_description($conf);
-# Mock values for OS
-$osname = 'darwin';
-$conf->data->set( 'linkflags'  => 'foobar' );
-$flagsbefore = $conf->data->get( 'linkflags' );
-$conf->data->set( fink_lib_dir  => undef );
-$conf->data->set( fink_include_dir  => undef );
-ok($step->_handle_darwin_for_fink($conf, $osname, 'gmp.h'),
-    "handle_darwin_for_fink() returned true value");
-$flagsafter = $conf->data->get( 'linkflags' );
-is($flagsbefore, $flagsafter, "No change in linkflags, as expected");
-
-$cwd = cwd();
-{
-    my $tdir = tempdir( CLEANUP => 1 );
-    ok(chdir $tdir, "Able to change to temporary directory");
-    ok( (mkdir 'lib'), "Able to make lib directory");
-#    ok( (mkdir 'include'), "Able to make include directory");
-    my $libdir = File::Spec->catdir( $tdir, 'lib' );
-    my $includedir = File::Spec->catdir( $tdir, 'include' );
-    $conf->data->set('fink_lib_dir' => $libdir);
-    $conf->data->set('fink_include_dir' => $includedir);
-    $osname = 'darwin';
-    $conf->data->set( 'linkflags'  => 'foobar' );
-    $flagsbefore = $conf->data->get( 'linkflags' );
-    ok($step->_handle_darwin_for_fink($conf, $osname, 'gmp.h'),
-        "handle_darwin_for_fink() returned true value");
-    $flagsafter = $conf->data->get( 'linkflags' );
-    is($flagsbefore, $flagsafter, "No change in linkflags, as expected");
-
-    ok(chdir $cwd, "Able to change back to original directory after testing");
-}
-
-{
-    my $tdir1 = tempdir( CLEANUP => 1 );
-    ok(chdir $tdir1, "Able to change to temporary directory");
-#    ok( (mkdir 'lib'), "Able to make lib directory");
-    ok( (mkdir 'include'), "Able to make include directory");
-    my $libdir = File::Spec->catdir( $tdir1, 'lib' );
-    my $includedir = File::Spec->catdir( $tdir1, 'include' );
-    $conf->data->set('fink_lib_dir' => $libdir);
-    $conf->data->set('fink_include_dir' => $includedir);
-    $osname = 'darwin';
-    $conf->data->set( 'linkflags'  => 'foobar' );
-    $flagsbefore = $conf->data->get( 'linkflags' );
-    ok($step->_handle_darwin_for_fink($conf, $osname, 'gmp.h'),
-        "handle_darwin_for_fink() returned true value");
-    $flagsafter = $conf->data->get( 'linkflags' );
-    is($flagsbefore, $flagsafter, "No change in linkflags, as expected");
-
-    ok(chdir $cwd, "Able to change back to original directory after testing");
-}
-
-pass("Completed all tests in $0");
-
-################### DOCUMENTATION ###################
-
-=head1 NAME
-
-auto_gmp-01.t - test auto::gmp
-
-=head1 SYNOPSIS
-
-    % prove t/steps/auto_gmp-01.t
-
-=head1 DESCRIPTION
-
-The files in this directory test functionality used by F<Configure.pl>.
-
-The tests in this file test auto::gmp.
-
-=head1 AUTHOR
-
-James E Keenan
-
-=head1 SEE ALSO
-
-config::auto::gmp, F<Configure.pl>.
-
-=cut
-
-# Local Variables:
-#   mode: cperl
-#   cperl-indent-level: 4
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4:

Deleted: branches/ops_pct/t/steps/auto_headers-01.t
==============================================================================
--- branches/ops_pct/t/steps/auto_headers-01.t	Fri Jul 24 19:42:02 2009	(r40256)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,132 +0,0 @@
-#! perl
-# Copyright (C) 2007, Parrot Foundation.
-# $Id$
-# auto_headers-01.t
-
-use strict;
-use warnings;
-use Test::More tests =>  30;
-use Carp;
-use lib qw( lib t/configure/testlib );
-use_ok('config::init::defaults');
-use_ok('config::auto::headers');
-use Parrot::Configure;
-use Parrot::Configure::Options qw( process_options );
-use Parrot::Configure::Te