From: ts Date: 2000-04-03T14:21:42+02:00 Subject: [ruby-talk:02349] Re: rb_catch >>>>> "t" == ts writes: t> pigeon% diff -u eval.c~ eval.c t> --- eval.c~ Tue Dec 7 17:47:15 1999 t> +++ eval.c Mon Apr 3 12:43:58 2000 t> @@ -7548,7 +7548,7 @@ t> catch_i(tag) t> ID tag; t> { t> - return rb_f_catch(0, FIX2INT(tag)); t> + return rb_f_catch(0, INT2FIX(tag)); t> } Same problem with rb_throw() pigeon% make ruby gcc -g -O2 -rdynamic main.o libruby.a -ldl -lcrypt -lm -o ruby pigeon% diff -u eval.c~ eval.c --- eval.c~ Mon Apr 3 12:43:58 2000 +++ eval.c Mon Apr 3 14:14:40 2000 @@ -7601,7 +7601,7 @@ VALUE argv[2]; ID t = rb_intern(tag); - argv[0] = FIX2INT(t); + argv[0] = INT2FIX(t); argv[1] = val; rb_f_throw(2, argv); } pigeon% It seems to work now, I use rb_catch() and rb_throw() for the transactions pigeon% cat b.rb #!/usr/bin/ruby -w require "bdb" env = BDB::Env.new("/tmp", ["DB_DATA_DIR /tmp"], BDB::CREATE | BDB::INIT_MPOOL | BDB::INIT_TXN, {"aa" => "bb", "cc" => "aa"}) db = env.open_db(BDB::BTREE, "aa", nil, BDB::CREATE, 0644) db["a"] = 12 env.begin(db) do |txn, b| b["a"] = 24 txn.begin do |txn1| c = txn1.assoc(db) c["a"] = 36 print "txn1 -- #{db['a']}\n" txn1.abort print "AFTER THROW\n" end txn.commit print "AFTER THROW\n" end print "#{db['a']}\n" db.close env.remove pigeon% b.rb txn1 -- 36 24 pigeon% Guy Decoux