[Seaside] Entry and Re-Entry from Legacy Rails App

Ken Treis ken at miriamtech.com
Tue Feb 20 20:21:33 UTC 2007


On Feb 18, 2007, at 11:19 AM, Giles Bowkett wrote:

> By the way I'd definitely be interested to see the Marshall-reading
> stuff. I'm using Squeak, so I'll be able to test its portability
> pretty quickly.

OK, here it is. I attached it as a VisualWorks 3.0 fileout. Let me  
know if this doesn't work for you, and I can try the "dangerous"  
squeak fileout goodie.

I've been able to use this to load all of the file-serialized Rails  
sessions I can easily get my hands on, and it is able to handle them  
all.

Here's the class comment from RubyMarshal:

======

RubyMarshal is an implementation of the Ruby built-in "Marshal"  
class. Based in part on marshal.c from the Ruby 1.8.5 codebase.

Booleans, Strings, Symbols, Numbers, Arrays, and Hashes are returned  
as equivalent Smalltalk objects. Class names are returned as symbols.  
All other objects are returned as instances of RubyObject.

Things that aren't supported:

* The internal Ruby "DATA" type, which is used for wrapped C pointers
* Options for Regexps (the flags that follow the final slash, e.g.  
the $i from /$foo/i. We just return regexps as their inner strings  
anyway (see below).

Caveats:

* Regexps are returned as strings that do *not* include leading and  
trailing slashes.

* User-marshaled classes (classes that define _dump and _load or use  
the old marshal_dump/marshal_load protocol) are supported, but their  
raw dump data is the only thing we know how to load. This raw data is  
accessible as RubyObject>>marshalData.

* Hashes with default values (defined like: "Hash.new(5)") are  
supported, but returned as a Dictionary. The default value is stored  
under the key #rubyDefault.

* Floats include some information about the size of the mantissa, but  
we discard that and let Smalltalk handle it. This seems to work, but  
I make no guarantees.

* Some old Modules were serialized as classes. I don't have a test  
for this (MODULE_OLD), but the code should work.

* When particular instances have been extended (like "obj.extend 
(Module)"), we read the module name but throw it away.

There are undoubtedly some edge cases that I missed. If you find one  
of these, send it to me and I'll figure out what we're missing.

--
Ken Treis
Miriam Technologies, Inc.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: RubyMarshal.st
Type: application/octet-stream
Size: 19132 bytes
Desc: not available
Url : http://lists.squeakfoundation.org/pipermail/seaside/attachments/20070220/5d57ab3f/RubyMarshal-0001.obj
-------------- next part --------------



More information about the Seaside mailing list