[#37231] Announcing New Ruby Book Under Development! — <robert.calco@...>

Everybody:

31 messages 2002/04/02
[#37250] Re: [ANN] Announcing New Ruby Book Under Development! — "John" <jyeung@...> 2002/04/02

Have you checked out?

[#37279] About efficiency — Jean-Hugues ROBERT <jean_hugues_robert@...> 2002/04/02

[#37289] Re: About efficiency — nobu.nokada@... 2002/04/03

Hi,

[#37291] Re: About efficiency — Sean Middleditch <elanthis@...> 2002/04/03

On Tue, 2002-04-02 at 20:16, nobu.nokada@softhome.net wrote:

[#37232] seeking to understand... — Mark Probert <probertm@...>

38 messages 2002/04/02
[#37255] Re: Ruby, python, perl, ... — Chris <chris@...> 2002/04/02

In article <87d6xhaoif.fsf@jenny-gnome.dyndns.org>,

[#37281] Is eval a code/design smell? — "Chris Morris" <home@...>

I seem to have an inherent distaste for eval, but I don't know why. I've

51 messages 2002/04/03
[#37323] Re: Is eval a code/design smell? — Ron Jeffries <ronjeffries@...> 2002/04/03

On Wed, 03 Apr 2002 00:15:10 GMT, "Chris Morris" <home@clabs.org> wrote:

[#38034] Re: Is eval a code/design smell? — Ian Macdonald <ian@...> 2002/04/11

On Wed 03 Apr 2002 at 20:35:30 +0900, you wrote:

[#38045] Re: Is eval a code/design smell? — Sean Middleditch <elanthis@...> 2002/04/11

On Thu, 2002-04-11 at 01:40, Ian Macdonald wrote:

[#38061] Re: Is eval a code/design smell? — Ian Macdonald <ian@...> 2002/04/11

On Thu 11 Apr 2002 at 22:07:03 +0900, you wrote:

[#38063] Re: Is eval a code/design smell? — Sean Middleditch <elanthis@...> 2002/04/11

On Thu, 2002-04-11 at 12:06, Ian Macdonald wrote:

[#38064] Re: Is eval a code/design smell? — ts <decoux@...> 2002/04/11

>>>>> "S" == Sean Middleditch <elanthis@awesomeplay.com> writes:

[#38066] Re: Is eval a code/design smell? — Sean Middleditch <elanthis@...> 2002/04/11

On Thu, 2002-04-11 at 12:25, ts wrote:

[#38067] Re: Is eval a code/design smell? — ts <decoux@...> 2002/04/11

>>>>> "S" == Sean Middleditch <elanthis@awesomeplay.com> writes:

[#38068] Re: Is eval a code/design smell? — Sean Middleditch <elanthis@...> 2002/04/11

On Thu, 2002-04-11 at 12:42, ts wrote:

[#38069] Re: Is eval a code/design smell? — ts <decoux@...> 2002/04/11

>>>>> "S" == Sean Middleditch <elanthis@awesomeplay.com> writes:

[#38072] Re: Is eval a code/design smell? — Sean Middleditch <elanthis@...> 2002/04/11

On Thu, 2002-04-11 at 12:59, ts wrote:

[#37342] regular expression question — "Firestone, Mark - Technical Support" <mark.firestone@...>

Thanks for the help with the tread questions guys... I have one about (gasp)

16 messages 2002/04/03

[#37385] TextPad replacement for Linux? — Tobias Reif <tobiasreif@...>

TIA,

25 messages 2002/04/03

[#37397] Really new-new-newbie question :) — "Philip Mateescu" <philip@...>

Hi,

13 messages 2002/04/03

[#37454] ModRUBY question — George Moschovitis <gmosx@...>

Hi everybody,

18 messages 2002/04/04

[#37470] Test the result of an initialization ? — jayce@... (Jayce Piel)

17 messages 2002/04/04

[#37540] Fibonacci Number Generators — jzakiya@... (Jabari Zakiya)

Hi, I'm a newbie, coming to Ruby from a

14 messages 2002/04/04

[#37549] OO/Ruby Terminology — <james@...>

I added a wiki page for Ruby book development ...

22 messages 2002/04/05
[#37808] Re: OO/Ruby Terminology — <bbense+comp.lang.ruby.Apr.07.02@...> 2002/04/10

-----BEGIN PGP SIGNED MESSAGE-----

[#37861] RE: OO/Ruby Terminology — <james@...> 2002/04/10

> From: bbense+comp.lang.ruby.Apr.07.02@telemark.stanford.edu

[#37944] Re: OO/Ruby Terminology — Chris <chris@...> 2002/04/10

In article <PGEPJIFLPEPOHCKEEEIKIEFADCAA.james@rubyxml.com>,

[#37963] RE: OO/Ruby Terminology — <james@...> 2002/04/10

> From: Chris [mailto:chris@cmb-enterprises.com]

[#37617] Addition to file.c (File.extension) — Mike Hall <mghall@...>

18 messages 2002/04/05
[#37736] Re: Addition to file.c (File.extension) — matz@... (Yukihiro Matsumoto) 2002/04/08

Hi,

[#37653] Switching from PHP to Ruby - Comments Please — Jim Freeze <jim@...>

Hi:

34 messages 2002/04/06

[#37746] ruby-dev summary 16501-16750 — TAKAHASHI Masayoshi <maki@...>

Hi all,

17 messages 2002/04/08

[#37833] Ruby as replacement for VB? — "Robb Shecter" <rs@...>

Hi,

19 messages 2002/04/10
[#37923] Re: Ruby as replacement for VB? — Michael Davis <mdavis@...> 2002/04/10

Robb Shecter wrote:

[#39153] Re: Ruby as replacement for VB? — "Euan Mee" <xlucid@...> 2002/04/26

On 11 Apr 2002, at 1:03, Michael Davis wrote:

[#37835] crypting ruby source — Ludo <coquelle@...>

Hi,

32 messages 2002/04/10
[#38280] Re: crypting ruby source — web2ed@... (Edward Wilson) 2002/04/14

Ludo <coquelle@enib.fr> wrote in message news:<3CB31298.13A44B26@enib.fr>...

[#38044] RFC - class_added callback — Michal Rokos <m.rokos@...>

Hello,

16 messages 2002/04/11

[#38046] GetoptLong question — djberg96@... (Daniel Berger)

Hi all,

16 messages 2002/04/11
[#38051] Re: GetoptLong question — "Pit Capitain" <pit@...> 2002/04/11

On 11 Apr 2002, at 22:16, Daniel Berger wrote:

[#38101] How to Make a Method Ineffective Efficiently? — William Djaja Tjokroaminata <billtj@...>

Hi,

15 messages 2002/04/11
[#38135] Re: How to Make a Method Ineffective Efficiently? — Jean-Hugues ROBERT <jean_hugues_robert@...> 2002/04/12

Hello,

[#38159] Re: How to Make a Method Ineffective Efficiently? — William Djaja Tjokroaminata <billtj@...> 2002/04/12

Thanks for all the responses. I just want to add the final

[#38126] Ruby/Google — Ian Macdonald <ian@...>

Hi,

19 messages 2002/04/12

[#38136] Idea for a new shorthand — "Hal E. Fulton" <hal9000@...>

OK, maybe this is an idea no one will like. Or

17 messages 2002/04/12

[#38167] Why Object#class Is Inconsistent in "==" and "case"? — William Djaja Tjokroaminata <billtj@...>

Hi,

12 messages 2002/04/12

[#38199] not vs !, and vs && — <james@...>

I'm confused about the behavior of 'not'. The Pickaxe and Ruby21Days books

17 messages 2002/04/12

[#38238] Barnes & Noble putting on the squeeze — David Alan Black <dblack@...>

Hello --

11 messages 2002/04/13

[#38239] Freshmeat article about Ruby — Tobias DiPasquale <anany@...>

Hi all,

28 messages 2002/04/13
[#38447] Re: Freshmeat article about Ruby — Joel VanderWerf <vjoel@...> 2002/04/16

Tobias DiPasquale wrote:

[#38457] Re: Freshmeat article about Ruby — David Alan Black <dblack@...> 2002/04/16

Hi --

[#38560] Re: Freshmeat article about Ruby — Mark Hulme Jones <mjones@...> 2002/04/18

David Alan Black <dblack@candle.superlink.net> writes:

[#38561] Re: Freshmeat article about Ruby — Paul Brannan <pbrannan@...> 2002/04/18

On Fri, Apr 19, 2002 at 01:07:22AM +0900, Mark Hulme Jones wrote:

[#38562] Re: Freshmeat article about Ruby — Pat Eyler <pate@...> 2002/04/18

On Fri, 19 Apr 2002, Paul Brannan wrote:

[#38564] Re: Freshmeat article about Ruby — Jack Herrington <jack_d_herrington@...> 2002/04/18

On 4/18/02 9:30 AM, "Pat Eyler" <pate@eylerfamily.org> wrote:

[#38648] Ruby golf (FFT) Was: Freshmeat article about Ruby — Christian Szegedy <szegedy@...> 2002/04/19

Jack Herrington wrote:

[#38657] Re: Ruby golf (FFT) Was: Freshmeat article about Ruby — David Alan Black <dblack@...> 2002/04/19

Hello --

[#38331] mime type — Tobias Reif <tobiasreif@...>

Hi all,

15 messages 2002/04/15

[#38338] Compiling Ruby on Mac OS X — Alwyn <alwyn@...>

I've downloaded the latest Stable Snapshot and tried building it. It

18 messages 2002/04/15

[#38449] Help wanted for statvfs extension — djberg96@... (Daniel Berger)

Hi all,

35 messages 2002/04/16
[#38470] Re: Help wanted for statvfs extension — "James F.Hranicky" <jfh@...> 2002/04/17

On Wed, 17 Apr 2002 05:04:06 +0900

[#38525] resolv.rb Bug — "Roy J. Milican" <roy@...>

Greetings,

18 messages 2002/04/17

[#38627] Imlib2-Ruby 0.4.0 — Paul Duncan <pabs@...>

I just posted Imlib2-Ruby version 0.4.0, my Ruby bindings for Imlib2

12 messages 2002/04/19

[#38635] Threads creating threads creating threads... — Tobias Peters <tpeters@...>

I have already asked this question in [ruby-talk:19661], but I will ask it

12 messages 2002/04/19

[#38694] Ruby on .NET? — Ron Jeffries <ronjeffries@...>

I scanned the .net threads here and didn't see whether there is, or is not, an

37 messages 2002/04/19
[#38696] RE: Ruby on .NET? — "repeater" <repeater@...> 2002/04/19

recently found:

[#38839] building extensions-- new vs initialize — "Norman Makoto Su" <normsu@...>

Hi, I'm trying to build a ruby extension in C. While looking at the pickaxe CD

14 messages 2002/04/23

[#38910] Numberic#prev — Sean Chittenden <sean@...>

I do a lot of incrementing and decrementing of values: it'd be nice if

36 messages 2002/04/24

[#39047] A Wild Idea: What do you think? — Jim Freeze <jim@...>

Hi:

16 messages 2002/04/26

[#39122] RE: A Wild Idea: What do you think? — "Morris, Chris" <chris.morris@...>

> > OK, then let's have it in Texas. How about August? Oh, what do you

28 messages 2002/04/26
[#39123] Re: A Wild Idea: What do you think? — Jim Freeze <jim@...> 2002/04/26

On Sat, Apr 27, 2002 at 03:15:21AM +0900, Morris, Chris wrote:

[#39176] Re: A Wild Idea: What do you think? — Pat Eyler <pate@...> 2002/04/27

On Sat, 27 Apr 2002, Jim Freeze wrote:

[#39177] Re: A Wild Idea: What do you think? — David Alan Black <dblack@...> 2002/04/27

Hi --

[#39228] RubyConf.new(2002) - ideas for agenda — "Daniel Berger" <djberg96@...>

Ok - so I'm probably jumping the gun here, but hey, what the heck.

27 messages 2002/04/28

[#39394] ncurses, mingw32 — tony summerfelt <snowzone5@...>

i've been away from ruby for awhile, it was time to dust off the pickaxe book

13 messages 2002/04/30

Re: Help: Ruby<->C++ callbacks

From: Paul Brannan <paul@...>
Date: 2002-04-08 23:20:22 UTC
List: ruby-talk #37770
On Thu, Apr 04, 2002 at 08:03:21PM +0900, Luigi Ballabio wrote:
> class RubyCallback : public Callback {
>    public:
>      RubyCallback(VALUE p)
>      : p_(p), refCount_(new int(1)) {
>          /* how to make sure the Ruby proc stays alive
>             as long as we need it?
>             Is the following the right way? */
>          rb_global_variable(p_);
>      }

Why is refCount_ a pointer?

>      RubyCallback(const RubyCallback& o)
>      : p_(o.p_), refCount_(o.refCount_) {
>          /* how to make sure the Ruby proc stays alive
>             as long as we need it? */
>          o.refCount_++;
Here, you are incrementing o.refCount_, when you should be incrementing
(*o.refCount_).
>      }
>      RubyCallback& operator=(const RubyCallback& o) {
>          if (refCount_ != o.refCount_) {
>              if (--*refCount == 0) {
>                  // tell p_ it can go as far as we are concerned
>                  delete refCount_;
>              }
>              p_ = o.p_;
>              refCount_ = o.refCount_;
>              // make sure p_ stays alive
>              *refCount_++;
>          }
>          return *this;
>      }
>      ~RubyCallback() {
>          if (--*refCount_ == 0) {
>              // now it can go as far as we are concerned
>              // is the following the right way?
>              rb_gc_mark(p_);
>              delete refCount_;
>          }
>      }

rb_gc_mark doesn't mark an object for deletion; it marks the object as
being in use.  You should call this from the mark function that was
passed to Data_Wrap_Struct.

>      void doit() {
>          static ID callId = rb_intern("call");
>          rb_funcall(p_,callId,0);
>      }

This is dangerous.  Ruby uses longjmp() to implement exceptions.  If
your Ruby code throws an exception, and the function that calls doit()
has an object on the stack, then that object's destructor will not get
called.

I do like the use of a static variable here for callId.

>    private:
>      VALUE p_;
>      int* refCount_;  // is this needed?
> };

You probably want something like this:

#include <ruby.h>
#include <intern.h>

// Hack to get this to work on gcc3
#define rb_gc_mark(value) ((void (*)(VALUE))(rb_gc_mark))(value)
#if defined(RUBY_METHOD_FUNC)
#undef RUBY_METHOD_FUNC
#endif
typedef VALUE (*RUBY_METHOD_FUNC)();

extern VALUE ruby_errinfo;

struct Ruby_Exception {
  VALUE ex;
};

class RubyCallback {
public:
  RubyCallback(VALUE p)
    : p_(p)
    , ruby_obj_(Data_Wrap_Struct(rb_cObject, RubyCallback::mark, 0, this))
  { }

  // the default copy constructor and assignment operator will work

  // making this work with an arbitrary number of arguments is left as
  // an excercise to the reader.
  VALUE call();

private:
  static VALUE call_ruby_proc(VALUE p) {
    static ID callId = rb_intern("call");
    return rb_funcall(p, callId, 0);
  }

  static void mark(void * obj) { 
    RubyCallback * rc(static_cast<RubyCallback *>(obj));
    rb_gc_mark(rc->p_);
  }

private:
  VALUE p_;
  VALUE ruby_obj_;
};

VALUE RubyCallback::call() {
  int state = 0;
  VALUE retval = rb_protect(
      RUBY_METHOD_FUNC(RubyCallback::call_ruby_proc),
      p_,
      &state);
  if(state != 0) {
    Ruby_Exception ex = { ruby_errinfo };
    throw ex;
  }
  return retval;
}

// Some test code...

#include <iostream>

#define RUBY_TRY \
  extern VALUE ruby_errinfo; \
  ruby_errinfo = Qnil; \
  try

#define RUBY_CATCH \
  catch (Ruby_Exception & ex) { \
    rb_exc_raise(ex.ex); \
  } \
  catch (...) \
  { \
    /* Can't raise the exception from here, because the C++ exception \
     * won't get properly destroyed. */ \
    ruby_errinfo = rb_exc_new2(rb_eRuntimeError, "Unknown error"); \
  } \
  if(!NIL_P(ruby_errinfo)) { \
    rb_exc_raise(ruby_errinfo); \
  }

VALUE foo(VALUE /* self */, VALUE cb) {
  RUBY_TRY
  {
    struct Foo {
      Foo() { std::cout << "Foo" << std::endl; }
      ~Foo() { std::cout << "~Foo" << std::endl; }
    } foo;
    RubyCallback rc(cb);
    rc.call();
  }
  RUBY_CATCH
}

VALUE run_test(VALUE /* self */) {
  // should print "Foo\nfoo!\n~Foo\n"
  rb_eval_string("foo(proc { puts 'foo!' })");

  // should print "Foo\n~Foo\n" then print an exception msg.
  rb_eval_string("foo(proc { raise 'foo!' })");

  return Qnil;
}

int main() {
  int argc = 3;
  char * argv[] = { "test", "-e" , "run_test()" };
  ruby_init();
  ruby_init_loadpath();
  ruby_options(argc, argv);

  rb_define_global_function("foo", RUBY_METHOD_FUNC(foo), 1);
  rb_define_global_function("run_test", RUBY_METHOD_FUNC(run_test), 0);

  ruby_run();
}

Hope this helps,

Paul

In This Thread

Prev Next