[ruby-dl] unexpected type 'N'

My program (aeditor) works ok on my setup (ruby-1.8.1, linux).
However when installing on another box (ruby-1.8.2, linux), then the
following crash happens.

[shevegen] I, [2005-01-23T18:10:35.392024 #3970] INFO -- : program begin.
[shevegen] F, [2005-01-23T18:10:35.420153 #3970] FATAL -- : uncaught
exception occured
[shevegen] DL::DLTypeError unexpected type 'N'
[shevegen] struct.rb | 114 | in `sizeof'
[shevegen] struct.rb | 114 | in `parse'
[shevegen] struct.rb | 74 | in `initialize'
[shevegen] struct.rb | 11 | in `new'
[shevegen] struct.rb | 11 | in `struct'
[shevegen] ncursesw.rb | 74 |
[shevegen] main_tui.rb | 46 | in `require'
[shevegen] main_tui.rb | 46 | in `run'
[shevegen] main_tui.rb | 358 |
[shevegen] I, [2005-01-23T18:10:35.420424 #3970] INFO -- : program end.

The wrapper code goes like this:

require 'dl/import'
require 'dl/struct'
module Curses
  extend DL::Importable
  dlload 'libncursesw.so'
  
  typealias 'NCURSES_SIZE_T', 'short'
  typealias 'chtype', 'unsigned long'
  typealias 'attr_t', 'chtype'
  typealias 'bool', 'int'
  
  WINDOW = struct [
    # current cursor position
    'NCURSES_SIZE_T cury',
    'NCURSES_SIZE_T curx',

    # window location and size
    # maximums of x and y, NOT window size
    'NCURSES_SIZE_T maxy',
    'NCURSES_SIZE_T maxx',
    # screen coords of upper-left-hand corner
    'NCURSES_SIZE_T begy',
    'NCURSES_SIZE_T begx',

    # window state flags
    'short flags',

    # attribute tracking
    'attr_t attrs', # current attribute for non-space character
    'chtype bkgd', # current background char/attribute pair

    # option values set by user
    'bool notimeout', # no time out on function-key entry?
    'bool clear', # consider all data in the window invalid?
    'bool leaveok', # OK to not reset cursor on exit?
    'bool scroll', # OK to scroll this window?
    'bool idlok', # OK to use insert/delete line?
    'bool idcok', # OK to use insert/delete char?
    'bool immed', # window in immed mode? (not yet used)
    'bool sync', # window in sync mode?
    'bool use_keypad', # process function keys into KEY_ symbols?
    'int delay', # 0 = nodelay, <0 = blocking, >0 = delay
    
    # the actual line data
    'void *line', # TODO: ldat is used.. but what is ldat?
    
    # global screen state
    'NCURSES_SIZE_T regtop', # top line of scrolling region
    'NCURSES_SIZE_T regbottom', # bottom line of scrolling region
    
    # these are used only if this is a sub-window
    'int parx', # x coordinate of this window in parent
    'int pary', # y coordinate of this window in parent
    # pointer to parent if a sub-window
    'void *parent', # TODO: this is a struct window * pointer
    
    # these are used only if this is a pad
    'NCURSES_SIZE_T pad_y',
    'NCURSES_SIZE_T pad_x',
    'NCURSES_SIZE_T pad_top',
    'NCURSES_SIZE_T pad_left',
    'NCURSES_SIZE_T pad_bottom',
    'NCURSES_SIZE_T pad_right',
    
    # real begy is _begy + _yoffset
    'NCURSES_SIZE_T yoffset'
  ]

  # setup
  extern 'void *initscr()'
  extern 'int cbreak()'
  extern 'int keypad(void *, bool)'
  extern 'int noecho()'
  extern 'int nonl()'
  extern 'int raw()'
  extern 'int meta(void *, bool)'
  extern 'int nodelay(void *, bool)'
  extern 'int keyok(int, bool)'

  extern 'bool has_colors()'
  extern 'int start_color()'
  extern 'int init_pair(short, short, short)'
  extern 'int wcolor_set(void*, short, void*)'
  extern 'void wbkgdset(void *, chtype)'
  extern 'int wattrset(void *, int)'
  def self.has_colors?
    (has_colors != 0)
  end
  
  # access global variables
  Int = struct ["int value"]
  COLORS_PTR = symbol 'COLORS'
  ESCDELAY_PTR = symbol 'ESCDELAY'
  def self.COLORS
    Int.new(COLORS_PTR).value
  end
  def self.ESCDELAY
    Int.new(ESCDELAY_PTR).value
  end
  
  # teardown
  extern 'int endwin()'

  # runtime
  extern 'int clear()'
  extern 'int addstr(const char *)'
  #extern 'int add_wch(const cchar_t *)'
  extern 'int getch()'
  extern 'int refresh()'
  extern 'int clrtoeol()'
  extern 'int addnstr(const char *, int)'
  extern 'int move(int, int)'
  extern 'int refresh()'
end

I cannot figure out what the problem seems to be?
Maybe something is different in 1.8.2 ?
(maybe I should upgrade to 1.8.2)

···

--
Simon Strandgaard

Simon Strandgaard wrote:

My program (aeditor) works ok on my setup (ruby-1.8.1, linux).
However when installing on another box (ruby-1.8.2, linux), then the
following crash happens.

[shevegen] I, [2005-01-23T18:10:35.392024 #3970] INFO -- : program begin.
[shevegen] F, [2005-01-23T18:10:35.420153 #3970] FATAL -- : uncaught

I think I've been experiencing similar trouble with evil-ruby. I thought it was just me and that it didn't work for some time, but now we know that it was introduced only recently.

The wrapper code goes like this:

require 'dl/import'
require 'dl/struct'
module Curses
  extend DL::Importable
  dlload 'libncursesw.so'
  
  typealias 'NCURSES_SIZE_T', 'short'
  typealias 'chtype', 'unsigned long'
  typealias 'attr_t', 'chtype'
  typealias 'bool', 'int'

  typealias 'NCURSES_SIZE_T', nil, nil, nil, 'short'
  typealias 'chtype', nil, nil, nil, 'unsigned long'
  typealias 'attr_t', nil, nil, nil, 'chtype'
  typealias 'bool', nil, nil, nil, 'int'

I cannot figure out what the problem seems to be?
Maybe something is different in 1.8.2 ?
(maybe I should upgrade to 1.8.2)

I'm not sure if this change was accidental or on purpose. It might be a bug that was introduced in 1.8.2. Maybe Takaaki Tateishi could respond on this?