Newbie questions about Pliant

Newbie questions about Pliant

precompiling breaks something

If I don't precompile, things work. If I precompile,
and then load the image, things don't work. I guess
it has to do with "external" and the way the DLLs are loaded.
Message posted by reitman on 2004/06/18 20:03:23
I have created the following one line script that I called "pliant-perl":
--
/usr/bin/pliant 'precompile /binary/perl.dump module /pliantx/language/perl.pli module /pliantx/lexer/multiline_string.pli' $*
--

First time when I run my array.pli sample, and compiling at the same time, things
work:

--
lebesgue:/pliant/pliantx/language/perl/examples# pliant-perl array.pli
Array size: 3
Got array:0 = 0
Got array:1 = hello
Got array:2 = 3
Got array:3 = 1
Got array:0 = monday
Got array:1 = tuesday
Got array:2 = wednesday
Got array:3 = thursday
Got array:4 = friday
Got array:5 = saturday
Got array:6 = sunday
monday,tuesday,wednesday,thursday,friday,saturday,sunday
2,5,13,18,5,104,5,169,1
Got: 2
Got: 5
Got: 13
Got: 18
Got: 5
Got: 104
Got: 5
Got: 169
Got: 1
--


Then, if I run it the second time, right away, in the same way,  things
don't work,

--
lebesgue:/pliant/pliantx/language/perl/examples# pliant-perl array.pli
exception 11
----------------------------------------------------------------
actions stack is:
compile file:array.pli (internals) 6 1
compile file:array.pli (internals) 6 1
compile file:array.pli (internals) 6 1
compile file:array.pli (internals) 6 1
parse file:array.pli (internals) 8 1
module file:array.pli
----------------------------------------------------------------
processor stack content is:
??? at 1092643729
??? at 1092569355
lperl_newAV +20
build  /pliantx/language/perl/types/array.pli (internals) 21 1 /pliantx/language/perl/types/array.pli (internals) 24 11
build Universal (Type Universal) +127
entry_new (Type) +48
gvar +104
active_type_Meta +62
. evaluate (Expression) +147
. compile_step4 (Expression Address Int) +233
active_type_Ident +130             
. evaluate (Expression) +147
. compile_step4 (Expression Address Int) +233
. compile_step3 (Expression) +18
. compile_step2 (Expression) +64
. compile (Expression) +19
  file:array.pli (internals) 6 1
{} +38
active_type_Meta +62
. evaluate (Expression) +147
. compile_step4 (Expression Address Int) +233
active_type_Ident +130
. evaluate (Expression) +147
. compile_step4 (Expression Address Int) +233
. compile_step3 (Expression) +18
. compile_step2 (Expression) +64
. compile (Expression) +19
  file:array.pli (internals) 6 1
parser_tag_record  /pliant/language/type/misc/tag.pli (internals) 182 1
. execute (ParserContext) +39
parser_filter_execute +240
pliant internal parse_one_token function (ParserContext) +391
compile_text (List Module) +230
pliant_load_module (Str Module Int Module) +920
??? at 134599684
----------------------------------------------------------------


The function lperl_newAV is an external function that is coded in
my perl api wrapper file,  liblperl.so.

AV* lperl_newAV()
{
  AV *retval = newAV();
  return retval;
}

the function calls the newAV() macro or function that is part of the perl API.


--

Should I try to isolate the problem more, 
or there is a better way to go about it?

Thanks,
Boris
Message posted by hubert.tonneau on 2004/06/18 20:20:53
If your perl environment needs some Perl initialisation code to be called,
then if you compile the perl module, then you need to ensure the the Perl
initialisation code is still executed (on the first run it has probably
be run as a side effect of compiling the module, but on the second run,
since the compiled module is loaded from the .dump, compiling will not
append again, so side effect will not take place).

The framework for specifying actions that must be performed at .dump reload
time is:

function perl_init p fh
  arg Address p ; arg Int fh
  ...
gvar DelayedAction restore
restore function :> the_function perl_init Address Int
pliant_restore_actions append addressof:restore