in reply to Using Safe to reval complex math

I don't know how to import Math::Complex into a compartment but you should be very careful not to allow use() as an option. In looking at the example on Safe I note that exporting functions is done without the leading ampersand. Try the $compartment->share_from( 'Math::Complex', [ 'make' ] ) syntax instead. If you do that you may find you have to import a number of symbols from Math::Complex.

Also be sure not to re-use your Safe compartments - there's a known bug in perl versions (less than 5.8.0, I think) which makes re-using the compartment unsafe.

Replies are listed 'Best First'.
Re: Re: Using Safe to reval complex math
by Anonymous Monk on Jun 05, 2003 at 22:16 UTC

    Thanks for the tip about Safe reuse. That is unfortunate, since I was hoping to do just that so as to not have to set up the environment every time (if I can ever figure out how to set it up in the first place).

    The doc for share sez you are welcome to use '&foo' or 'foo' for a subroutine. I have tried both, just for the hell of it, although my preference would be to agree with you and forgo the ampersand, because they make me nervous.

    Certainly I don't want to let users have access to 'use' or require! But I do need to get Math::Complex in there somehow.

    The aforementioned line 165, btw, is:

    return __PACKAGE__->make($re, defined $im ? $im : 0);

    I believe because it explicitly references __PACKAGE__ it is always going to be trying to look explicitly at the Math::Complex namespace, which will be unavailable to the compartment. I am beginning to suspect that no amount of sharing or sharing from will solve the problem... Mzaybe I will have to just drag the guts of Math::Complex into the compartment without a use?

    --Anonymous Original Poster Monk