[svn:parrot] r38398 - in branches/pmc_pct: compilers/pmc compilers/pmc/src compilers/pmc/t compilers/pmc/tools config/gen/makefiles

bacek at svn.parrot.org bacek at svn.parrot.org
Wed Apr 29 09:45:15 UTC 2009


Author: bacek
Date: Wed Apr 29 09:45:11 2009
New Revision: 38398
URL: https://trac.parrot.org/parrot/changeset/38398

Log:
Add handling of VTableInfo.

Added:
   branches/pmc_pct/compilers/pmc/src/vtable_info.pir
   branches/pmc_pct/compilers/pmc/src/vtable_info.pm
   branches/pmc_pct/compilers/pmc/t/05-vtable-info.t
   branches/pmc_pct/compilers/pmc/tools/
   branches/pmc_pct/compilers/pmc/tools/vtable_pm.pl
Modified:
   branches/pmc_pct/compilers/pmc/pmc.pir
   branches/pmc_pct/config/gen/makefiles/pmc.in

Modified: branches/pmc_pct/compilers/pmc/pmc.pir
==============================================================================
--- branches/pmc_pct/compilers/pmc/pmc.pir	Wed Apr 29 05:57:10 2009	(r38397)
+++ branches/pmc_pct/compilers/pmc/pmc.pir	Wed Apr 29 09:45:11 2009	(r38398)
@@ -28,8 +28,10 @@
     .tailcall $P0.'command_line'(args, 'encoding'=>'utf8', 'transcode'=>'ascii')
 .end
 
-.include 'src/gen_compiler.pir'
 .include 'src/nodes.pir'
+.include 'src/vtable_info.pir'
+.include 'src/gen_compiler.pir'
+.include 'src/gen_vtable_info.pir'
 .include 'src/parser/gen_grammar.pir'
 .include 'src/parser/gen_actions.pir'
 .include 'src/builtins.pir'

Added: branches/pmc_pct/compilers/pmc/src/vtable_info.pir
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/pmc_pct/compilers/pmc/src/vtable_info.pir	Wed Apr 29 09:45:11 2009	(r38398)
@@ -0,0 +1,143 @@
+# Copyright (C) 2009, Parrot Foundation.
+# $Id$
+
+=head1 C<PMC::VTableInfo>
+
+Holds information about single VTable method.
+
+=cut
+
+.namespace ['PMC';'VTableInfo']
+
+.sub '' :load
+    .local pmc p6meta
+
+    p6meta = new 'P6metaclass'
+
+    p6meta.'new_class'('PMC::VTableInfo', 'parent' => 'Capture')
+
+.end
+
+=item new([attr1=>val1, attr2=>val2, ...])
+
+Create a new VTable of initialized with the given
+attributes.  Returns the newly created node.
+
+=cut
+
+.sub 'new' :method
+    .param pmc adverbs :slurpy :named
+
+    .local pmc res
+    $P0 = self.'HOW'()
+    $P0 = getattribute $P0, 'parrotclass'
+    res = new $P0
+    
+    res.'init'(adverbs :flat :named)
+
+    .return (res)
+.end
+
+=item init([attr1=>val1, attr2=>val2, ... ])
+
+Initializes VTableInfo 
+
+=cut
+
+.sub 'init' :method
+    .param pmc adverbs         :slurpy :named
+
+    .local pmc iter
+
+    iter = new 'Iterator', adverbs
+  adverbs_loop:
+    unless iter goto adverbs_end
+    $S0 = shift iter
+    $P0 = iter[$S0]
+    $P1 = find_method self, $S0
+    self.$P1($P0)
+    goto adverbs_loop
+  adverbs_end:
+  end:
+    .return (self)
+.end
+
+
+=item name
+
+Get/Set name.
+
+=cut
+
+.sub 'name' :method
+    .param string name      :optional
+    .param int    has_name
+    .tailcall self.'attr'('name', name, has_name)
+.end
+
+=item ret_type
+
+Get/Set ret_type of method.
+
+=cut
+
+.sub 'ret_type' :method
+    .param string type      :optional
+    .param int    has_type
+    .tailcall self.'attr'('ret_type', type, has_type)
+.end
+
+=item parameters
+
+Get/Set "C" parameters.
+
+=cut
+
+.sub 'parameters' :method
+    .param string parameters    :optional
+    .param int    has_parameters
+    .tailcall self.'attr'('parameters', parameters, has_parameters)
+.end
+
+=item is_write
+
+Get/set that vtable method updates PMC.
+
+=cut
+
+.sub 'is_write' :method
+    .param int is_write     :optional
+    .param int has_is_write
+    .tailcall self.'attr'('is_write', is_write, has_is_write)
+.end
+
+=item attr(STR attrname, PMC value, INT has_value)
+
+Helper method for accessors.  If C<has_value> is true then set
+the invocant's value of C<attrname> to C<value>.  Returns the
+(resulting) value of C<attrname> in the invocant.
+
+=cut
+
+.sub 'attr' :method
+    .param string attrname
+    .param pmc value
+    .param int has_value
+    if has_value goto setattr
+    value = self[attrname]
+    unless null value goto value_done
+    value = new 'Undef'
+  value_done:
+    .return (value)
+  setattr:
+    self[attrname] = value
+    .return (value)
+.end
+
+
+
+# Local Variables:
+#   mode: pir
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4 ft=pir:

Added: branches/pmc_pct/compilers/pmc/src/vtable_info.pm
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/pmc_pct/compilers/pmc/src/vtable_info.pm	Wed Apr 29 09:45:11 2009	(r38398)
@@ -0,0 +1,1732 @@
+# $Id$
+#
+# DO NOT EDIT THIS FILE. Generated from src/vtable.pl by
+# compilers/pmc/tool/vtable_pm.pl
+#
+# In future this file will be replaced by full featured PCT parser for
+# src/vtable.tbl
+#
+
+class PMC::VTableInfo;
+
+# Ordered list of VTable methods
+our @?VTABLES := build_vtable_list();
+our %?VTABLES;
+
+sub build_vtable_list() {
+    my @res;
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('absolute'),
+        :parameters('PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('add'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('add_attribute'),
+        :parameters('STRING* name, PMC* type'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('add_float'),
+        :parameters('FLOATVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('add_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('add_method'),
+        :parameters('STRING* method_name, PMC* sub_pmc'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('add_parent'),
+        :parameters('PMC* parent'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('add_role'),
+        :parameters('PMC* role'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('add_vtable_override'),
+        :parameters('STRING* vtable_name, PMC* sub_pmc'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('assign_pmc'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('assign_string_native'),
+        :parameters('STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_and'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_and_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_ands'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_ands_str'),
+        :parameters('STRING* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_lsr'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_lsr_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_not'),
+        :parameters('PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_nots'),
+        :parameters('PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_or'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_or_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_ors'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_ors_str'),
+        :parameters('STRING* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_shl'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_shl_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_shr'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_shr_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_xor'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_xor_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_xors'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('bitwise_xors_str'),
+        :parameters('STRING* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('can'),
+        :parameters('STRING* method'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('clone'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('clone_pmc'),
+        :parameters('PMC* args'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('cmp'),
+        :parameters('PMC* value'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('cmp_num'),
+        :parameters('PMC* value'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('cmp_pmc'),
+        :parameters('PMC* value'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('cmp_string'),
+        :parameters('PMC* value'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('concatenate'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('concatenate_str'),
+        :parameters('STRING* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('decrement'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('defined'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('defined_keyed'),
+        :parameters('PMC* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('defined_keyed_int'),
+        :parameters('INTVAL key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('defined_keyed_str'),
+        :parameters('STRING* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('delete_keyed'),
+        :parameters('PMC* key'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('delete_keyed_int'),
+        :parameters('INTVAL key'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('delete_keyed_str'),
+        :parameters('STRING* key'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('delprop'),
+        :parameters('STRING* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('destroy'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('divide'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('divide_float'),
+        :parameters('FLOATVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('divide_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('does'),
+        :parameters('STRING* role'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('does_pmc'),
+        :parameters('PMC* role'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('elements'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('exists_keyed'),
+        :parameters('PMC* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('exists_keyed_int'),
+        :parameters('INTVAL key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('exists_keyed_str'),
+        :parameters('STRING* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('find_method'),
+        :parameters('STRING* method_name'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('floor_divide'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('floor_divide_float'),
+        :parameters('FLOATVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('floor_divide_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('freeze'),
+        :parameters('visit_info* info'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('get_attr_keyed'),
+        :parameters('PMC* key, STRING* idx'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('get_attr_str'),
+        :parameters('STRING* idx'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('get_bignum'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('get_bool'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('get_class'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('get_integer'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('get_integer_keyed'),
+        :parameters('PMC* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('get_integer_keyed_int'),
+        :parameters('INTVAL key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('get_integer_keyed_str'),
+        :parameters('STRING* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('get_iter'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('get_namespace'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('FLOATVAL'),
+        :name('get_number'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('FLOATVAL'),
+        :name('get_number_keyed'),
+        :parameters('PMC* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('FLOATVAL'),
+        :name('get_number_keyed_int'),
+        :parameters('INTVAL key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('FLOATVAL'),
+        :name('get_number_keyed_str'),
+        :parameters('STRING* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('get_pmc'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('get_pmc_keyed'),
+        :parameters('PMC* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('get_pmc_keyed_int'),
+        :parameters('INTVAL key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('get_pmc_keyed_str'),
+        :parameters('STRING* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void*'),
+        :name('get_pointer'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void*'),
+        :name('get_pointer_keyed'),
+        :parameters('PMC* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void*'),
+        :name('get_pointer_keyed_int'),
+        :parameters('INTVAL key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void*'),
+        :name('get_pointer_keyed_str'),
+        :parameters('STRING* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('STRING*'),
+        :name('get_repr'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('STRING*'),
+        :name('get_string'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('STRING*'),
+        :name('get_string_keyed'),
+        :parameters('PMC* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('STRING*'),
+        :name('get_string_keyed_int'),
+        :parameters('INTVAL key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('STRING*'),
+        :name('get_string_keyed_str'),
+        :parameters('STRING* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('getprop'),
+        :parameters('STRING* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('getprops'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_absolute'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_add'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_add_float'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_add_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_and'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_and_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_ands'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_ands_str'),
+        :parameters('STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_lsr'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_lsr_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_not'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_nots'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_or'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_or_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_ors'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_ors_str'),
+        :parameters('STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_shl'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_shl_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_shr'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_shr_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_xor'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_xor_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_xors'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_bitwise_xors_str'),
+        :parameters('STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_concatenate'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_concatenate_str'),
+        :parameters('STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_divide'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_divide_float'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_divide_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_floor_divide'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_floor_divide_float'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_floor_divide_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_logical_not'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_modulus'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_modulus_float'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_modulus_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_multiply'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_multiply_float'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_multiply_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_neg'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_pow'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_pow_float'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_pow_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_repeat'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_repeat_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_subtract'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_subtract_float'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('i_subtract_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('increment'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('init'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('init_pmc'),
+        :parameters('PMC* initializer'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('inspect'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('inspect_str'),
+        :parameters('STRING* what'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('instantiate'),
+        :parameters('PMC* sig'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('instantiate_str'),
+        :parameters('STRING* rep, INTVAL flags'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('opcode_t*'),
+        :name('invoke'),
+        :parameters('void* next'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('is_equal'),
+        :parameters('PMC* value'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('is_equal_num'),
+        :parameters('PMC* value'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('is_equal_string'),
+        :parameters('PMC* value'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('is_same'),
+        :parameters('PMC* value'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('isa'),
+        :parameters('STRING* _class'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('isa_pmc'),
+        :parameters('PMC* _class'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('logical_and'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('logical_not'),
+        :parameters('PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('logical_or'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('logical_xor'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('mark'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('modulus'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('modulus_float'),
+        :parameters('FLOATVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('modulus_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('morph'),
+        :parameters('PMC* type'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('multiply'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('multiply_float'),
+        :parameters('FLOATVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('multiply_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('STRING*'),
+        :name('name'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('neg'),
+        :parameters('PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('nextkey_keyed'),
+        :parameters('PMC* key, INTVAL what'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('nextkey_keyed_int'),
+        :parameters('INTVAL key, INTVAL what'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('nextkey_keyed_str'),
+        :parameters('STRING* key, INTVAL what'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('FLOATVAL'),
+        :name('pop_float'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('pop_integer'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('pop_pmc'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('STRING*'),
+        :name('pop_string'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('pow'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('pow_float'),
+        :parameters('FLOATVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('pow_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('push_float'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('push_integer'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('push_pmc'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('push_string'),
+        :parameters('STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('remove_attribute'),
+        :parameters('STRING* name'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('remove_method'),
+        :parameters('STRING* method_name'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('remove_parent'),
+        :parameters('PMC* parent'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('remove_role'),
+        :parameters('PMC* role'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('remove_vtable_override'),
+        :parameters('STRING* vtable_name'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('repeat'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('repeat_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_attr_keyed'),
+        :parameters('PMC* key, STRING* idx, PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_attr_str'),
+        :parameters('STRING* idx, PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_bignum_int'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_bignum_num'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_bignum_str'),
+        :parameters('STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_bool'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_integer_keyed'),
+        :parameters('PMC* key, INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_integer_keyed_int'),
+        :parameters('INTVAL key, INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_integer_keyed_str'),
+        :parameters('STRING* key, INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_integer_native'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_integer_same'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_number_keyed'),
+        :parameters('PMC* key, FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_number_keyed_int'),
+        :parameters('INTVAL key, FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_number_keyed_str'),
+        :parameters('STRING* key, FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_number_native'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_number_same'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_pmc'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_pmc_keyed'),
+        :parameters('PMC* key, PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_pmc_keyed_int'),
+        :parameters('INTVAL key, PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_pmc_keyed_str'),
+        :parameters('STRING* key, PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_pointer'),
+        :parameters('void* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_pointer_keyed'),
+        :parameters('PMC* key, void* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_pointer_keyed_int'),
+        :parameters('INTVAL key, void* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_pointer_keyed_str'),
+        :parameters('STRING* key, void* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_string_keyed'),
+        :parameters('PMC* key, STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_string_keyed_int'),
+        :parameters('INTVAL key, STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_string_keyed_str'),
+        :parameters('STRING* key, STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_string_native'),
+        :parameters('STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('set_string_same'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('setprop'),
+        :parameters('STRING* key, PMC* value'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('share'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('share_ro'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('FLOATVAL'),
+        :name('shift_float'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('shift_integer'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('shift_pmc'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('STRING*'),
+        :name('shift_string'),
+        :parameters(''),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('slice'),
+        :parameters('PMC* key, INTVAL flag'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('splice'),
+        :parameters('PMC* value, INTVAL offset, INTVAL count'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('substr'),
+        :parameters('INTVAL offset, INTVAL length, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('STRING*'),
+        :name('substr_str'),
+        :parameters('INTVAL offset, INTVAL length'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('subtract'),
+        :parameters('PMC* value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('subtract_float'),
+        :parameters('FLOATVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('PMC*'),
+        :name('subtract_int'),
+        :parameters('INTVAL value, PMC* dest'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('thaw'),
+        :parameters('visit_info* info'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('thawfinish'),
+        :parameters('visit_info* info'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('type'),
+        :parameters(''),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('INTVAL'),
+        :name('type_keyed'),
+        :parameters('PMC* key'),
+        :is_write(0)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('unshift_float'),
+        :parameters('FLOATVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('unshift_integer'),
+        :parameters('INTVAL value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('unshift_pmc'),
+        :parameters('PMC* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('unshift_string'),
+        :parameters('STRING* value'),
+        :is_write(1)
+   ));
+
+    @res.push(PMC::VTableInfo.new(
+        :ret_type('void'),
+        :name('visit'),
+        :parameters('visit_info* info'),
+        :is_write(0)
+   ));
+
+
+    @res;
+}
+
+sub vtable_list() {
+    our @?VTABLES;
+    @?VTABLES;
+}
+
+# Local Variables:
+#   mode: perl6
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Added: branches/pmc_pct/compilers/pmc/t/05-vtable-info.t
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/pmc_pct/compilers/pmc/t/05-vtable-info.t	Wed Apr 29 09:45:11 2009	(r38398)
@@ -0,0 +1,26 @@
+#!parrot
+
+# Test that vtables initialised properly.
+
+.sub 'main' :main
+.include 'test_more.pir'
+    load_bytecode 'compilers/pmc/pmc.pbc'
+
+    plan(1)
+
+    $P0 = get_hll_global ["PMC"; "VTableInfo"], 'vtable_list'
+    $P1 = $P0()
+
+    $I0 = elements $P1
+    ok($I0, "We've got some vtables")
+.end
+
+
+# Don't forget to update plan!
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4 ft=pir:

Added: branches/pmc_pct/compilers/pmc/tools/vtable_pm.pl
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/pmc_pct/compilers/pmc/tools/vtable_pm.pl	Wed Apr 29 09:45:11 2009	(r38398)
@@ -0,0 +1,66 @@
+#!perl
+use warnings;
+use strict;
+
+=pod
+
+Temporary helper script for generating vtable.pm
+
+Invoke
+"perl -Ilib compilers/pmc/tools/vtable_pm.pl > compilers/pmc/src/vtable_info.pm"
+
+=cut
+
+use Parrot::Vtable;
+
+my $vtable = parse_vtable;
+
+print <<'HEADER';
+# $Id$
+#
+# DO NOT EDIT THIS FILE. Generated from src/vtable.pl by
+# compilers/pmc/tool/vtable_pm.pl
+#
+# In future this file will be replaced by full featured PCT parser for
+# src/vtable.tbl
+#
+
+class PMC::VTableInfo;
+
+# Ordered list of VTable methods
+our @?VTABLES := build_vtable_list();
+our %?VTABLES;
+
+HEADER
+
+
+print "sub build_vtable_list() {\n    my \@res;\n";
+
+foreach (@$vtable) {
+    my $is_write = int exists $_->[5]{write};
+    print <<"VTABLE"
+    \@res.push(PMC::VTableInfo.new(
+        :ret_type('$_->[0]'),
+        :name('$_->[1]'),
+        :parameters('$_->[2]'),
+        :is_write($is_write)
+   ));
+
+VTABLE
+}
+
+print "\n    \@res;\n}\n";
+
+print <<'FOOTER';
+
+sub vtable_list() {
+    our @?VTABLES;
+    @?VTABLES;
+}
+
+# Local Variables:
+#   mode: perl6
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+FOOTER

Modified: branches/pmc_pct/config/gen/makefiles/pmc.in
==============================================================================
--- branches/pmc_pct/config/gen/makefiles/pmc.in	Wed Apr 29 05:57:10 2009	(r38397)
+++ branches/pmc_pct/config/gen/makefiles/pmc.in	Wed Apr 29 09:45:11 2009	(r38398)
@@ -16,10 +16,12 @@
 
 SOURCES := \
   pmc.pir \
+  src/nodes.pir \
+  src/vtable_info.pir \
   src/parser/gen_grammar.pir \
   src/parser/gen_actions.pir \
-  src/nodes.pir \
   src/gen_compiler.pir \
+  src/gen_vtable_info.pir \
   src/builtins.pir
 
 # the default target
@@ -41,6 +43,10 @@
 	$(PARROT) $(PARROT_ARGS) $(NQP) --output=src/gen_compiler.pir \
 	    --target=pir src/compiler.pm
 
+src/gen_vtable_info.pir: $(NQP) $(PCT) src/vtable_info.pm
+	$(PARROT) $(PARROT_ARGS) $(NQP) --output=src/gen_vtable_info.pir \
+	    --target=pir src/vtable_info.pm
+
 
 # This is a listing of all targets, that are meant to be called by users
 help:
@@ -72,7 +78,8 @@
   pmc.pbc \
   src/parser/gen_grammar.pir \
   src/parser/gen_actions.pir \
-  src/gen_compiler.pir
+  src/gen_compiler.pir \
+  src/gen_vtable_info.pir
 
 
 clean:


More information about the parrot-commits mailing list