package Iotta::Copp::CodeGen::Meth; use strict; require Iotta::Elem; our @ISA = ("Iotta::Elem"); sub run { my $self = shift; my $meta = shift; my $data = shift; my %meth_ar; $$meta{o_meth_decls} = "/* test */\n"; for (@{$$meta{meths}}) { my $args; my $mi; my $o = $$_{object}; my $meth = $$_{name}; $mi = "#define CO_METH_INI_" . $$_{object} . "_" . $$_{name} . " \\\n"; $mi .= "\t$o td CO_POSSIBLY_UNUSED = this -> data; \\\n"; #print "METH: $$_{object}: $$_{name}\n"; for (@{$$_{args}}) { my ($t, $n) = split /:/; $args .= "\t$t $n = va_arg (ap, $t); \\\n"; #print "ARG: $_\n"; } $mi .= $args; $mi =~ s/; \\\n$//; $$meta{o_meth_ini_defs} .= "$mi\n"; $$meta{o_meth_decls} .= "co_v ${o}_$meth (\n" . "\tco_o_minimal this CO_POSSIBLY_UNUSED,\n" . "\tco self CO_POSSIBLY_UNUSED,\n" . "\tco_id_t message CO_POSSIBLY_UNUSED,\n" . "\tva_list ap CO_POSSIBLY_UNUSED\n);\n"; $meth_ar{$o} .= "\tco_meth_add" . " (o -> meth_ar, COM ($meth)," . " (co_message_handler) ${o}_$meth);\n"; } for my $o (@{$$meta{objs}}) { my $def = ""; for (keys %{$$meta{def_meth}}) { my $func = ${$$meta{def_meth}}{$_}; $func =~ s/#FLAV#/$$o{flav}/; $def .= "\tco_meth_add" . " (o -> meth_ar, COM ($_)," . " (co_message_handler) $func);\n"; } $$meta{o_meth_ar_init} .= "void $$o{name}_meth_ar_init (co_o_small o) { o -> meth_ar = co_meth_array_new (); $meth_ar{$$o{name}} $def }\n"; } $self->next->run ($meta, $data) if ($self->next); } 1;