| 285 | | str <- fromVal v |
| 286 | | env <- ask |
| 287 | | tryIO undef $ do |
| 288 | | envSV <- mkEnv env |
| 289 | | sv <- evalPerl5 str envSV $ enumCxt (envContext env) |
| 290 | | svToVal sv |
| | 286 | str <- fromVal v |
| | 287 | env <- ask |
| | 288 | lex <- asks envLexical |
| | 289 | let vars = [ v | v@MkVar{ v_sigil = SScalar, v_twigil = TNil } <- Set.toList (padKeys lex), v /= varTopic ] |
| | 290 | code = "sub { my (" ++ (concat $ intersperse ", " (map (`showsVar` "") vars)) ++ ") = @_;\n" ++ str ++ "\n}" |
| | 291 | vals <- mapM readVar vars |
| | 292 | rv <- tryIO (Perl5ErrorString "") $ do |
| | 293 | envSV <- mkEnv env |
| | 294 | sub <- evalPerl5 code envSV 0 |
| | 295 | args <- mapM newSVval vals |
| | 296 | invokePerl5 sub nullSV args envSV (enumCxt $ envContext env) |
| | 297 | case rv of |
| | 298 | Perl5ReturnValues [x] -> liftIO $ svToVal x |
| | 299 | Perl5ReturnValues xs -> liftIO $ fmap VList (mapM svToVal xs) |
| | 300 | Perl5ErrorString str -> fail str |
| | 301 | Perl5ErrorObject err -> throwError (PerlSV err) |