[#33161] Call/CC and Ruby iterators. — olczyk@... (Thaddeus L Olczyk)

Reading about call/cc in Scheme I get the impression that it is very

11 messages 2002/02/05

[#33242] favicon.ico — Dave Thomas <Dave@...>

19 messages 2002/02/06
[#33256] Re: favicon.ico — Leon Torres <leon@...> 2002/02/06

[#33435] Reg: tiny contest: who's faster? (add_a_gram) — grady@... (Steven Grady)

> My current solution works correctly with various inputs.

17 messages 2002/02/08

[#33500] Ruby Embedded Documentation — William Djaja Tjokroaminata <billtj@...>

Hi,

24 messages 2002/02/10
[#33502] Re: Ruby Embedded Documentation — "Lyle Johnson" <ljohnson@...> 2002/02/10

> Now, I am using Ruby on Linux, and I have downloaded Ruby version

[#33615] Name resolution in Ruby — stern@... (Alan Stern)

I've been struggling to understand how name resolution is supposed to

16 messages 2002/02/11

[#33617] choice of HTML templating system — Paul Brannan <paul@...>

I am not a web developer, nor do I pretend to be one.

23 messages 2002/02/11

[#33619] make first letter lowercase — sebi@... (sebi)

hello,

20 messages 2002/02/11
[#33620] Re: [newbie] make first letter lowercase — Tobias Reif <tobiasreif@...> 2002/02/11

sebi wrote:

[#33624] Re: [newbie] make first letter lowercase — "Jeff 'japhy' Pinyan" <jeffp@...> 2002/02/11

On Feb 11, Tobias Reif said:

[#33632] Re: [newbie] make first letter lowercase — Mathieu Bouchard <matju@...> 2002/02/12

[#33731] simple XML parsing (greedy / non-greedy — Ron Jeffries <ronjeffries@...>

Suppose I had this text

14 messages 2002/02/13

[#33743] qualms about respond_to? idiom — David Alan Black <dblack@...>

Hi --

28 messages 2002/02/13
[#33751] Re: qualms about respond_to? idiom — Dave Thomas <Dave@...> 2002/02/13

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

[#33754] Re: qualms about respond_to? idiom — David Alan Black <dblack@...> 2002/02/13

Hi --

[#33848] "Powered by Ruby" banner — Yuri Leikind <YuriLeikind@...>

Hello Ruby folks,

78 messages 2002/02/14
[#33909] Re: "Powered by Ruby" banner — Leon Torres <leon@...> 2002/02/14

On Thu, 14 Feb 2002, Yuri Leikind wrote:

[#33916] RE: "Powered by Ruby" banner — "Jack Dempsey" <dempsejn@...> 2002/02/15

A modest submission:

[#33929] Re: "Powered by Ruby" banner — yet another bill smith <bigbill.smith@...> 2002/02/15

Kent Dahl wrote:

[#33932] OT Netscape 4.x? was Re: "Powered by Ruby" banner — Chris Gehlker <gehlker@...> 2002/02/15

On 2/15/02 5:54 AM, "yet another bill smith" <bigbill.smith@verizon.net>

[#33933] RE: OT Netscape 4.x? was Re: "Powered by Ruby" banner — "Jack Dempsey" <dempsejn@...> 2002/02/15

i just don't understand why it didn't show up! dhtml/javascript, ok, but a

[#33937] Re: OT Netscape 4.x? was Re: "Powered by Ruby" banner — Chris Gehlker <gehlker@...> 2002/02/15

On 2/15/02 7:16 AM, "Jack Dempsey" <dempsejn@georgetown.edu> wrote:

[#33989] Re: OT OmniWeb [was: Netscape 4.x?] — Sean Russell <ser@...> 2002/02/16

Chris Gehlker wrote:

[#33991] Re: OT OmniWeb [was: Netscape 4.x?] — Rob Partington <rjp@...> 2002/02/16

In message <3c6e5e01_1@spamkiller.newsgroups.com>,

[#33993] Re: OT OmniWeb [was: Netscape 4.x?] — Thomas Hurst <tom.hurst@...> 2002/02/16

* Rob Partington (rjp@browser.org) wrote:

[#33925] Re: "Powered by Ruby" banner — Martin Maciaszek <mmaciaszek@...> 2002/02/15

In article <3C6CFCCA.5AD5CA67@scnsoft.com>, Yuri Leikind wrote:

[#33956] Re: "Powered by Ruby" banner — Leon Torres <leon@...> 2002/02/15

On Fri, 15 Feb 2002, Martin Maciaszek wrote:

[#33851] Ruby and .NET — Patrik Sundberg <ps@...>

I have been reading a bit about .NET for the last couple of days and must say

53 messages 2002/02/14

[#34024] Compiled companion language for Ruby? — Erik Terpstra <erik@...>

Hmmm, seems that my previous post was in a different thread, I'll try

12 messages 2002/02/16

[#34036] The GUI Returns — "Horacio Lopez" <vruz@...>

Hello all,

33 messages 2002/02/17

[#34162] Epic4/Ruby — Thomas Hurst <tom.hurst@...>

Rejoice, for you no longer have to put up with that evil excuse for a

34 messages 2002/02/18

[#34185] Operator overloading and multiple arguments — ptkwt@...1.aracnet.com (Phil Tomson)

I'm trying to overload the '<=' operator in a class in order to use it for

10 messages 2002/02/18

[#34217] Ruby for web development — beripome@... (Billy)

Hi all,

21 messages 2002/02/19

[#34350] FAQ for comp.lang.ruby — "Hal E. Fulton" <hal9000@...>

RUBY NEWSGROUP FAQ -- Welcome to comp.lang.ruby! (Revised 2001-2-18)

15 messages 2002/02/20

[#34375] Setting the Ruby continued — <jostein.berntsen@...>

Hi,

24 messages 2002/02/20
[#34384] Re: Setting the Ruby continued — Paulo Schreiner <paulo@...> 2002/02/20

Also VERY important:

[#34467] recursive require — Ron Jeffries <ronjeffries@...>

I'm having a really odd thing happen with two files that mutually

18 messages 2002/02/21

[#34503] special characters — Tobias Reif <tobiasreif@...>

Hi all,

13 messages 2002/02/22

[#34517] Windows Installer Ruby 166-0 available — Andrew Hunt <andy@...>

16 messages 2002/02/22

[#34597] rdoc/xml questions — Dave Thomas <Dave@...>

24 messages 2002/02/23

[#34631] Object/Memory Management — "Sean O'Dell" <sean@...>

I'm new to Ruby and the community here (I've been learning Ruby for a grand

44 messages 2002/02/23

[#34682] duplicate method name — Ron Jeffries <ronjeffries@...>

I just found a case in a test file where i had two tests of the same

16 messages 2002/02/24
[#34687] Re: duplicate method name — s@... (Stefan Schmiedl) 2002/02/24

Hi Ron.

[#34791] Style Question — Ron Jeffries <ronjeffries@...>

So I'm building this set theory library. The "only" object is supposed

13 messages 2002/02/25

[#34912] RCR?: parallel to until: as_soon_as — Tobias Reif <tobiasreif@...>

Hi,

18 messages 2002/02/26

[#34972] OT A Question on work styles — Chris Gehlker <gehlker@...>

As a Mac baby I just had to step through ruby in GDB *from the command line*

20 messages 2002/02/28

[#35015] Time Comparison — "Sean O'Dell" <sean@...>

I am using the time object to compare times between two files and I'm

21 messages 2002/02/28

patch to allow dump/load to work on DATA objects

From: Joel VanderWerf <vjoel@...>
Date: 2002-02-20 03:54:59 UTC
List: ruby-talk #34335
I don't think there's any *general* way to marshal objects that have a C
struct attached to them (i.e., created with DATA_MAKE_STRUCT or
DATA_WRAP_STRUCT) and which contain arbitrary data (including references
to Ruby objects), so here's a patch that cleanly adds that
functionality.

This patch is conservative in the sense that it only affects execution
paths that resulted in exceptions before. It should not break existing
code or formatted data. The patch is based on 1.6.6.


USAGE
=====

The following methods should be implemented in a class used to wrap C
data if some of that C data needs to be serialized:

Instance methods:

_dump_data
  
  Returns an Object that encapsulates the data stored in the struct.
  
_load_data Object

  Called on the object after it is allocated, but before instance vars
are restored. (Unlike the _load method used with Marshal, this is an
instance method.) Used to populate the struct with data from the
argument object.

These two instance methods can be written in Ruby if there are accessor
methods available for reading and writing all the persistent C data. (It
may be advantageous to write them in C, though.)

Class method:
  
_alloc

  Invoke DATA_MAKE_STRUCT, and return the resulting object.


Notes:

(1) I originally thought of using just a string argument in place of the
Object, for consistency with _dump/_load, but that made life hard within
the _dump_data/_load_data implementation, and also it is impossible to
connect to Marhsal's hash of objects that it has seen, so your object
graph gets turned into a tree with duplicates.

(2) There is no limit parameter to _dump_data because this gets applied
automatically in the w_obejct call in the T_DATA case.

(3) The reason I didn't just use _dump/_load or redefine
Marshal.dump/load, is that my C data is very general. It may refer to
other Ruby objects. To maintain referential integrity, I need to
continue with the same Marshal.dump/load call without starting the
process from scratch with a new arg->data hash.

(4) The _dump_data/_load_data methods are called only in the case of a
T_DATA object. They are used in conjuntion with w_object/r_object.

(5) I have tested this code in my CGen/CShadow library to make sure that
both Ruby attrs and C data are marshalled, and that referential
integrity is preserved (including cycles).

(6) I've also tested that the proc argument to Marshal.load is called.
When this proc is called, instance vars are all nil, but that's the way
it works in other cases now, anyway.

<plug>
This new functionality supports CGen/CShadow, which can now manage the
marshalling of C attributes for you. I'll upload the latest version in a
day or two.
</plug>

--
Joel VanderWerf                          California PATH, UC Berkeley
mailto:vjoel@path.berkeley.edu                     Ph. (510) 231-9446
http://www.path.berkeley.edu                       FAX (510) 231-9512

Attachments (1)

marshal.patch (2.69 KB, text/x-diff)
--- marshal.c.orig	Mon Feb 18 21:54:34 2002
+++ marshal.c	Tue Feb 19 18:23:56 2002
@@ -62,4 +62,5 @@
 #define TYPE_UCLASS	'C'
 #define TYPE_OBJECT	'o'
+#define TYPE_DATA       'd'
 #define TYPE_USERDEF	'u'
 #define TYPE_FLOAT	'f'
@@ -82,4 +83,5 @@
 
 static ID s_dump, s_load;
+static ID s_dump_data, s_load_data, s_alloc;
 
 struct dump_arg {
@@ -484,4 +486,32 @@
 	    break;
 
+          case T_DATA:
+            w_byte(TYPE_DATA, arg);
+            {
+                VALUE klass = CLASS_OF(obj);
+                char *path;
+
+                if (FL_TEST(klass, FL_SINGLETON)) {
+                    if (RCLASS(klass)->m_tbl->num_entries > 0 ||
+                        RCLASS(klass)->iv_tbl->num_entries > 1) {
+                        rb_raise(rb_eTypeError, "singleton can't be dumped");
+                    }
+                }
+                path = rb_class2name(klass);
+                w_unique(path, arg);
+            }
+            {
+                VALUE v;
+
+                if (!rb_respond_to(obj, s_dump_data)) {
+                    rb_raise(rb_eTypeError,
+                             "class %s needs to have instance method `_dump_data'",
+                             rb_class2name(CLASS_OF(obj)));
+                }
+                v = rb_funcall(obj, s_dump_data, 0);
+                w_object(v, arg, limit);
+            }
+            break;
+
 	  default:
 	    rb_raise(rb_eTypeError, "can't dump %s",
@@ -992,4 +1022,29 @@
 	break;
 
+      case TYPE_DATA:
+        {
+            VALUE klass;
+
+            klass = rb_path2class(r_unique(arg));
+            if (!rb_respond_to(klass, s_alloc)) {
+                rb_raise(rb_eTypeError,
+                         "class %s needs to have class method `_alloc'",
+                         rb_class2name(klass));
+            }
+            v = rb_funcall(klass, s_alloc, 0);
+            if (TYPE(v) != T_DATA) {
+                rb_raise(rb_eArgError, "dump format error");
+            }
+            r_regist(v, arg);
+            if (!rb_respond_to(v, s_load_data)) {
+                rb_raise(rb_eTypeError,
+                         "class %s needs to have instance method `_load_data'",
+                         rb_class2name(klass));
+            }
+            rb_funcall(v, s_load_data, 1, r_object(arg));
+            return v;
+        }
+        break;
+
       case TYPE_MODULE_OLD:
         {
@@ -1114,4 +1169,8 @@
     s_dump = rb_intern("_dump");
     s_load = rb_intern("_load");
+    s_dump_data = rb_intern("_dump_data");
+    s_load_data = rb_intern("_load_data");
+    s_alloc = rb_intern("_alloc");
+
     rb_define_module_function(rb_mMarshal, "dump", marshal_dump, -1);
     rb_define_module_function(rb_mMarshal, "load", marshal_load, -1);

In This Thread

Prev Next