help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Error with octave 3.8.1 when using from Perl via Inline::Octave


From: Andreas Krause
Subject: Error with octave 3.8.1 when using from Perl via Inline::Octave
Date: Mon, 26 May 2014 16:44:51 +0200

Hi,
 
I'm currently trying to get up and running the octave interface for perl again
 
  http://search.cpan.org/~aadler/Inline-Octave-0.31/Octave.pm
 
with the current octave version 3.8.1. Until the previous version 3.6.4
all worked fine. The sample program
 
-- snip --
 
#!/usr/bin/perl
use Inline Octave => DATA;

$f = myfunc(3);
print "jnk1=",$f->disp(),"\n";

__DATA__
__Octave__
function x=myfunc(u)
  x=u+1
endfunction
 
-- snap --
 
gave with 3.6.4 the correct output
 
  jnk1= 4
 
When using octave 3.8.1, I get the following error:
 
  sample.pm
  Warning: function name 'myfunc' does not agree with function file name '';  
(in octave code) at ./sample.pm line 0.
  Undefined subroutine &main::myfunc called at ./sample.pm line 5.
 
Debugging, I found octave-3.8.1/libinterp/parse-tree/oct-parse.in.yy line 2819ff
 
    octave_user_function *
    octave_base_parser::frob_function (const std::string& fname,
                                       octave_user_function *fcn)
    {
      std::string id_name = fname;
      // If input is coming from a file, issue a warning if the name of
      // the file does not match the name of the function stated in the
      // file.  Matlab doesn't provide a diagnostic (it ignores the stated
      // name).
  ->  if (! autoloading && lexer.reading_fcn_file
  ->      && curr_fcn_depth == 1 && ! parsing_subfunctions)
      {
        // FIXME -- should lexer.fcn_file_name already be
        // preprocessed when we get here?  It seems to only be a
        // problem with relative file names.
        std::string nm = lexer.fcn_file_name;
        size_t pos = nm.find_last_of (file_ops::dir_sep_chars ());
        if (pos != std::string::npos)
          nm = lexer.fcn_file_name.substr (pos+1);
        if (nm != id_name)

          {
            warning_with_id
              ("Octave:function-name-clash",
               "function name '%s' does not agree with function file name '%s'",
               id_name.c_str (), lexer.fcn_file_full_name.c_str ());
            id_name = nm;
          }
      }
 
with the if-condition lexer.reading_fcn_file as true -> warning. The "Undefined 
subroutine"
error above seems like a follow-up error as id_name is overwritten with the 
empty variable nm.

The corresponding if-condition in octave-3.6.4/src/oct-parse.yy line 2826ff
looks like
 
    if (! autoloading && reading_fcn_file
        && (current_function_depth == 1
            && ! (parsing_subfunctions || lexer_flags.parsing_class_method)))
 
but with reading_fcn_file as false -> no warning. The reason for the different
value of this flag might be an additional if-clause in
octave-3.8.1/libinterp/parse-tree/lex.ll line 2411ff
 
        case function_kw:
          decrement_promptflag ();
          defining_func++;
          parsed_function_name.push (false);
  ->      if (! force_script && token_count == 0 && input_from_file ())
  ->        {
  ->          reading_fcn_file = true;
  ->          reading_script_file = false;
  ->        }
          if (! (reading_fcn_file || reading_script_file
                 || reading_classdef_file))
            input_line_number = 1;
          break;
 
which sets reading_fcn_file to true but is missing in 3.6.4. But this is too
deep in the octave internals for me to be sure.
 
Inline::Octave starts an octave instance and communicates with it via
   use IPC::Open3;
   use IO::File;
 
So can anybody help me with this issue? An empty function file name seems to be
strange.
 
andi
 
 
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]