[#14459] Overloading Constructors. — "Florian G. Pflug" <fgp@...>
Hi
Hi,
On Tue, May 01, 2001 at 10:20:23AM +0900, Yukihiro Matsumoto wrote:
Hi,
[#14464] who uses Python or Ruby, and for what? — ellard2@...01.fas.harvard.edu (-11,3-3562,3-3076)
A while ago I posted a request for people to share their experiences
Its interesting that people consider the number of
On Tue, 1 May 2001 10:27:58 +0900, Bryan Zarnett <bryan_zarnett@yahoo.ca> wrote:
[#14517] RAA — ptkwt@...1.aracnet.com (Phil Tomson)
[#14552] emacs and ruby debugging — "Joseph McDonald" <joe@...>
[#14555] Ruby as a Mac OS/X scripting language — Dave Thomas <Dave@...>
I was looking at OS/X yesterday and although the sales
I'm confused by people saying that there is no scripting language for Mac OS
Applescript is there, as is Perl. I guess (IMHO) that
[#14557] Arggg Bitten by the block var scope feature!!! — Wayne Scott <wscott@...>
>
[#14598] Re: Arggg Bitten by the block var scope feature!!! — "Conrad Schneiker" <schneik@...>
# On Thu, 3 May 2001, Wayne Scott wrote:
On Fri, 4 May 2001, Conrad Schneiker wrote:
On Fri, May 04, 2001 at 08:51:32AM +0900, David Alan Black wrote:
[#14600] Design by contract — "J J" <jj5412@...>
Any interest/thoughts on implementing simple design by contract in Ruby?
[#14601] bizarre File open, read, close problem on Win98? — ptkwt@...1.aracnet.com (Phil Tomson)
[#14609] scope of base class instance variable — "Chochain Lee" <cclee@...>
Hi,
[#14629] Database Abstraction Framework — "Florian G. Pflug" <fgp@...>
Hi
[#14636] Yet another "About private methods" question — Eric Jacoboni <jacoboni@...2.fr>
I'm still trying to figure out the semantics of private methods in Ruby.
Eric Jacoboni <jaco@teaser.fr> writes:
Greetings from a newbie,
On Sat, 5 May 2001, Chris Montgomery wrote:
On Tue, 8 May 2001, Guy N. Hurst wrote:
"Guy N. Hurst" <gnhurst@hurstlinks.com> writes:
On Tue, 8 May 2001, MJ Ray wrote:
[#14663] Vote for anime character — "Gudrun Heinrichmeyer" <Gudrun.Heinrichmeyer@...>
I vote for a modern friendly symbol clearly associated with japan, the animcharacter.
[#14683] Class refresher please. — "John Kaurin" <jkaurin@...>
class B
[#14689] ranges — "Joseph McDonald" <joe@...>
[#14699] local/nonlocal block vars — "Hal E. Fulton" <hal9000@...>
Well, I don't think I ever put in my (full) two cents...
[#14710] Why's Ruby so slow in this case? — Stefan Matthias Aust <sma@3plus4.de>
Sure, Ruby, being interpreted, is slower than a compiled language.
[#14740] have I messed up my setup, or are these real irb problems? — Dave Thomas <Dave@...>
[#14743] ANTLR rules for Ruby — matz@... (Yukihiro Matsumoto)
Hi,
matz@zetabits.com (Yukihiro Matsumoto) writes:
[#14753] Re: Ruby on AIX? — "Conrad Schneiker" <schneik@...>
Sean Rusell wrote:
[#14762] skipping arguments — touch freedom <stillflame@...>
this is going to be a stream of thought, not really one coherant question. i am sorry(or 'you are welcome', in some cases).
[#14768] SimpleDelegator assymetry — Robert Feldt <feldt@...>
Hi folks,
[#14777] Completely freaky behavior — "J J" <jj5412@...>
I've got a class that sets a variable in a method like so:
[#14780] AW: Re: SimpleDelegator assymetry — Wyss Clemens <WYS@...>
...does your solution remove obsolete methods?
[#14792] Integer division oddness — "Mike T. Miller" <mtm@...>
My father pointed out this oddity.
[#14793] Polymorphic methods — "J J" <jj5412@...>
In C++ you can have polymorphic methods such as
[#14825] [Q] Why module methods are NOT included by 'include' statement? — Leonid Razoumov <see_signature@127.0.0.1>
Ruby has a powerful 'include some_module' statement which imports into the
[#14881] Class/Module Information — "John Kaurin" <jkaurin@...>
It is possible to modify the following code to produce
[#14932] Re: Automatic inclusion of modules — "rashworth" <rashworth@...>
What is your translation of:
[#14945] ICQ LIB for Ruby — "Anders Johannsen" <anders@...>
Hi
[#15004] Re: Standard practices for module distribution — Renald Buter <buter@...>
On Fri, May 11, 2001 at 04:40:00PM +0100, ruby-talk@ruby-lang.org wrote:
Renald Buter wrote:
Ok, the synapsis aren't firing so well today.
[#15005] Re: Mascot/Icon Ruby Laser — "Conrad Schneiker" <schneik@...>
Furio R Filoseta wrote:
[#15006] Komodo support for Ruby? — Brian Sobolak <sobolak@...>
On Sat, 12 May 2001, Brian Sobolak wrote:
[#15011] DRuby/Rinda/TupleSpace Dokumentation — "Florian G. Pflug" <fgp@...>
Hi
# Is there any documentation of DRuby/Rinda/TupleSpace in english?
[#15034] Re: calling .inspect on array/hash causes core dump — ts <decoux@...>
>>>>> "A" == Andreas Riedl <viisi@chello.at> writes:
Question 1
[#15043] Can't compile 1.7 — Urban Hafner <the-master-of-bass@...>
Hello,
[#15047] Ruby/GTK question and future RAA suggestions — "Conrad Schneiker" <schneiker@...>
Hi,
[#15056] Syntax highlighting — Stephan K舂per <Stephan.Kaemper@...>
Hi,
[#15057] ncurses-bindings — Stefan Nobis <stefan@...>
Hi.
[#15069] Flushing TkText — "John Kaurin" <jkaurin@...>
I am converting a command line program that had
[#15071] bytecode compilation — Steven Haryanto <steven@...>
Hi folks,
Not exactly what you want, but look at ruby2c (rb2c)
[#15096] [Q] Rroc#arity ambiguity. Is it a bug? — Leo <slonika@...>
Hi experts,
[#15101] Re: Ruby on AIX? — Christian Szegedy <szegedy@...>
Here is a solution:
[#15115] Q: GUI framework with direct drawing capabilities? — Stefan Matthias Aust <sma@3plus4.de>
Hi!
Stefan Matthias Aust <sma@3plus4.de> writes:
[#15125] Re: How do I alias a class method? — Mathieu Bouchard <matju@...>
On Tue, 15 May 2001, Mathieu Bouchard wrote:
On Tue, 15 May 2001, David Alan Black wrote:
[#15162] Regexp (a\1) — ts <decoux@...>
[#15173] Re: Discussion on new Ruby features — Christian Szegedy <szegedy@...>
Dave Thomas wrote:
[#15174] class << self — Hans-Dieter Stich <hdstich@...>
hi!
Hans-Dieter Stich <hdstich@commplex-media.de> writes:
[#15193] Re: Discussion on new Ruby features — Christian Szegedy <szegedy@...>
Angus McIntyre wrote:
[#15197] Re: Discussion on new Ruby features — Christian Szegedy <szegedy@...>
Dave wrote:
[#15198] Re: Q: GUI framework with direct drawing ca pabilities? — Steve Tuckner <SAT@...>
Would it be a good idea to develop a pure Ruby GUI framework built on top of
-----BEGIN PGP SIGNED MESSAGE-----
[#15216] Re: Discussion on new Ruby features — "Christian Szegedy" <szegedy@...>
matz wrote:
[#15234] Pluggable sorting - How would you do it? — "Hal E. Fulton" <hal9000@...>
Hello all,
Hi,
Wayne Scott <wscott@bitmover.com> writes:
From: Dave Thomas <Dave@PragmaticProgrammer.com>
Is there a built in way to turn an array
[#15235] Bug or feature? eval("x=5") — "Hal E. Fulton" <hal9000@...>
Hello Rubyists...
[#15272] Re: Discussion on new Ruby features — "Benjamin J. Tilly" <ben_tilly@...>
>===== Original Message From matz@zetabits.com (Yukihiro Matsumoto) =====
[#15290] Ruby in Java — Glen Starchman <glen@...>
[#15318] — "Michael Dinowitz" <mdinowit@...2000.com>
subscribe michael dinowitz
[#15325] help with rubyunit — Max Ischenko <max@...>
[#15333] how to use garbage collection relyably? — viisi@... (Andreas Riedl)
hi!
[#15364] Re: Time.times problems in libc5; getrusage request — ts <decoux@...>
>>>>> "G" == Guy N Hurst <gnhurst@hurstlinks.com> writes:
[#15366] UnMac — Chris Moline <ugly-daemon@...>
Hi, I was reading the anti mac paper that showed up on slashdot and figured why not?? For those who don't follow slashdot, the paper was about alternative interfaces. In this case an interface similar to the ones found in text adventure games. I think this is a cool idea. A sample session would be
On Fri, May 18, 2001 at 10:56:41PM +0900, chad fowler wrote:
[#15391] PROPOSAL: Java-like method-based synchronization mechanism in Rub y — Wyss Clemens <WYS@...>
Hi all,
[#15394] Re: Ruby in Java — ts <decoux@...>
>>>>> "M" == Mathieu Bouchard <matju@sympatico.ca> writes:
[#15403] how to remove method from singleton class — Joel VanderWerf <vjoel@...>
[#15434] A proto-RCR: making def and class rvalues — Dave Thomas <Dave@...>
[#15438] Newbye question: retrieving a Class by its classname — "Benoit Cerrina" <benoit.cerrina@...>
Hi,
[#15448] RCR: #const_name_is — Mathieu Bouchard <matju@...>
[#15456] more reflection — Mathieu Bouchard <matju@...>
Hi,
On Mon, 21 May 2001, Yukihiro Matsumoto wrote:
[#15470] Re: Embedding Ruby - Segfaults? — ts <decoux@...>
>>>>> "S" == Sean Middleditch <elanthis@users.sourceforge.net> writes:
[#15474] Ruby catching error signals — Sean Middleditch <elanthis@...>
Hi again!
[#15493] One for the FAQ — "Matthew Bloch" <mattbee@...>
initialize NOT initialise, dammit :-) The error message:
[#15511] Tk Bitmaps — "John Kaurin" <jkaurin@...>
The following code works when I use a bitmap from the Ruby Tk demos kit
[#15512] Newbie GC question — Ashley Roeckelein <ashley.DONT@...>
Hi,
[#15549] ColdFusion for Ruby — "Michael Dinowitz" <mdinowit@...2000.com>
I don't currently use Ruby. To tell the truth, I have no real reason to. I'd
[#15569] I like ruby-chan ... — Rob Armstrong <rob@...>
Ruby is more human(e) than Python. We already have too many animals :-).
----- Original Message -----
On Wed, 23 May 2001, Hal E. Fulton wrote:
[#15590] Re: -lX11 error installing Ruby — ts <decoux@...>
>>>>> "C" == Collins Richey <erichey2@home.com> writes:
[#15599] Language specification reference — Lothar Scholz <llothar@...>
Hello,
[#15601] How to avoid spelling mistakes of variable names — ndrochak@... (Nick Drochak)
Since Ruby does not require a variable to be declared, do people find
ndrochak@gol.com (Nick Drochak) writes:
On Thu, 24 May 2001, Dave Thomas wrote:
Jim Freeze <jim@freeze.org> writes:
[#15602] Interactive Ruby II — Mario Lang <mlang@...>
Hello.
[#15615] help attr_reader — bashar asad <baasad@...>
hello;
[#15633] Q: Function modification/Procedures — Daishi Harada <daishi@...>
Hi,
[#15646] Disabling stderr — "Tom Spilman" <tspilman@...>
Is there a way to keep Ruby from sending exception info to the stderr
[#15683] Newbie: each! — Martin Julian DeMello <mdemello@...>
I'm trying to write an each! iterator that will iterate over an object
[#15688] every body wants java — bashar asad <baasad@...>
its really frustrating when you try to look for a job noadays.... you know so
[#15704] gnome, bonobo and corba. — Erik B虍fors <erik@...>
Hi all,
[#15708] regexp — ts <decoux@...>
[#15725] Wow! (impressed newbie) — sjr3a@... (Stephen Ramsay)
I just got the Programming Ruby book a few days ago and have been reading it
[#15734] java based interpreter and regexes — "Wayne Blair" <wayne.blair@...>
I have been thinking about the java based ruby interpreter project, and I
>
Does anyone have any experience with javacc? I've been playing with it and
[#15735] Compilation helper — Sean Middleditch <elanthis@...>
Hi!
[#15738] Ruby globbing problem? — Guillaume Cottenceau <gc@...>
[#15754] Challenges of java interpreter — "Wayne Blair" <wayne.blair@...>
"Stefan Matthias Aust" <sma@3plus4.de> wrote:
"Wayne Blair" <wayne.blair@relian.com> wrote:
[#15782] Subsets of a set — Harry Ohlsen <harryo@...>
I know that the Array class has a number of methods that make it usable
[#15793] Check a few characters of a string: How? — "Franz GEIGER" <fgeiger@...>
Want to check the first or last character of a string or say any character
[#15804] is it possible to dynamically coerce objects types in Ruby? — mirian@... (Mirian Crzig Lennox)
Greetings to all. I am a newcomer to Ruby and I am exploring the
Hi,
In article <990979671.433370.24481.nullmailer@ev.netlab.zetabits.com>,
Hi,
In article <991006658.571333.26080.nullmailer@ev.netlab.zetabits.com>,
Hi,
In article <991014401.628418.26898.nullmailer@ev.netlab.zetabits.com>,
On Mon, 28 May 2001, Mirian Crzig Lennox wrote:
[#15828] subclassing Date — Michael Husmann <Michael.Husmann@...>
Using ruby 1.6.0 and trying to subclass the Date class like
[#15832] Can irb have smart completion? — Max Ischenko <max@...>
Hi,
[#15846] gtk/glib — Patrik Sundberg <ps@...>
hi,
[#15863] Experimental "in" operator for collections — Stefan Matthias Aust <sma@3plus4.de>
There's one thing where I prefer Python over Ruby. Testing whether an
[#15871] embedded ruby — Wesley J Landaker <wjl@...>
Hello list, =)
[#15886] Q about TrueClass & FalseClass — Stefan Matthias Aust <sma@3plus4.de>
Hi!
[#15894] Dir[] — "Todd Smith" <todd@...>
I can get a list of files to be returned from a line such as:
[#15923] Block arguments vs method arguments — Mike <mike@...>
Hi,
[#15925] Re: Block arguments vs method arguments — ts <decoux@...>
>>>>> "M" == Mike <mike@lepton.fr> writes:
----- Original Message -----
On Thu, May 31, 2001 at 11:53:17AM +0900, Hal E. Fulton wrote:
At 11:01 PM 5/31/2001 +0900, Sean Russell wrote:
In article <5.1.0.14.2.20010531160016.00aa8aa8@mail.vex.net>,
mirian@cosmic.com (Mirian Crzig Lennox) writes:
[#15947] Traffic seems to be up significantly — ptkwt@...1.aracnet.com (Phil Tomson)
[#15954] new keyword idea: tryreturn, tryturn or done — Juha Pohjalainen <voidjump@...>
Hello everyone!
[#15955] .scan() using '/' as the regular expression delimiter — "Luke Crook" <lcluke@...>
I am trying to parse an Apache log file. The date field looks like:
[#15960] Ruby Standard and Enterprise Edition — Bryan Zarnett <b@...>
One of the best "marketing" things that Java did was there standard and
[#15998] ruby-mode not hilighting keywords in XEmacs 21.4? — jeffrey@... (Jeffrey P Shell)
In a freshly-built XEmacs 21.4.3 with lots-o-packages installed,
[#16015] tryreturn - names and intentions — Juha Pohjalainen <voidjump@...>
Hiya all again! :-)
[#16068] require and include confusion — Albert Wagner <alwagner@...>
I have totally confused myself about the relationship between require and
[#16087] linked list redux — Al Chou <hotfusionman@...>
Hi, all,
>Hi, all,
Johan Dahl <Johan.Dahl@ling.lu.se> writes:
[ruby-talk:14537] Rajah: Ruby-Java integration
Hi.
Our names are Dan Munk and Matthew Spencer. We have noticed the recent threads
of discussion regarding Ruby/Java integration, and decided that it was time for
us to announce a project we have been quietly researching and developing for a
while now.
We would like to introduce Rajah, a bridge between the Ruby and Java languages.
Below you will find an outline of the development we have done to date. Please
excuse us if the doc below is a little rough. We want to introduce Rajah to
developers in a detailed way, but bear in mind that this document is also
a submission to the Ruby community outlining a work in progress.
Before we get into the discussion of Rajah itself, we should mention that we
would be very interested in any ideas or feedback regarding this document and
Rajah itself. We are very open minded about the future of this project, and we
would like all of the input we can get. We are both relatively new to Ruby, and
we are most concerned about making Rajah a *complete* Ruby/Java solution, not
simply an extension that is functionally sufficient. We look forward to hearing
from you!
Dan Munk
danmunk@hotmail.com
Matthew Spencer
matthewdspencer@yahoo.com
================================================================================
1. Introduction
2. Roadmap
3. Design
4. Known Issues
1. Introduction
--------------------------------------------------------------------------------
Rajah is an open source project that provides a bridge between the Ruby and Java
languages. Within the Rajah project there are three planned Milestones:
+ From Ruby to Java. The majority of this work is complete, but as we are
fairly new to Ruby we are worried about correctness issues. Thus this
post. :) A later iteration of this milestone would be Ruby extensions
written in Java. This piece has not started, but we would like to mimic
the existing C extension architecture as much as possible.
+ The second milestone is from the JVM to Ruby. The general approach and
architecture has been considered, but no real implementation work has
been done.
+ The third milestone would be a pure Java implementation of the Ruby
interpreter.
The rest of this document is focused on design and implementation details of
the first milestone, from Ruby to Java. Any ideas/feedback related to any
portion of this doc would be greatly appreciated.
2. Roadmap
--------------------------------------------------------------------------------
Once we implement the changes from the feedback that we are hoping to receive
from this post we are planning to release an alpha build on May 14 to the Ruby
application archive. It is possible that this date will slip a week or two
depending on the number and scope of changes. At this time CVS on Sourceforge
will be used for versioning and snapshots will be continuously available.
We are members of the Extreme Programming camp (thank you for the RubyUnit
effort) and internally we have created several iterations for each milestone.
The iterations for the first milestone will be updated and published on
Sourceforge once they are adjusted to include tasks from your input.
Following milestones will not be started until the previous milestone(s) have
been met and are of production quality.
We can test on Solaris(Sparc 7, 8), some Linux flavors, and Windows 98/NT/2000.
Help testing with additional platforms would be greatly appreciated.
The Rajah code is designed to run under any Java environment 1.1+. However, we
will only be testing with 1.2 and later, and for the first iterations (at least)
will not claim to support any Java environments prior to 1.2.
3. Design
--------------------------------------------------------------------------------
One of the major factors influencing all design decisions is that we wanted to
keep the Java side of the interface as transparent as possible. Code to open a
JFrame would be:
require 'Rajah'
frmCls = Java.forName('javax.swing.JFrame')
frame = frmCls.new("Example")
frm.pack
frm.show
The remainder of this section outlines the design of Rajah's Ruby to Java
interface.
The Rajah library introduces a module named "Java". This module encapsulates the
Java functionality, including methods for loading Java classes. Once a Java
class is loaded into Ruby using Rajah, the class can be treated as a Ruby
class, including features such as method invocation, reflection, sub-classing,
and just about everything else you can do with a Ruby class.
Loading Java classes
The most fundamental capability of Rajah is loading Java classes into memory,
and allowing them to be accessed as Ruby classes from within the Ruby language.
This process involves the following primary steps:
+ Find the Java class.
+ Load the super class of the Java object.
+ Register the class with Ruby.
+ Introspect the Java class for all of it's public constructors.
+ Introspect the Java class for all of it's public methods (both static
and instance methods).
+ Introspect the Java class for all of it's public fields (both static
and instance fields).
Let us look at these steps in detail.
+ Find the Java class
In order to load a class into Ruby, the embedded virtual machine must be
able to find the Java class. In order to correctly find the class, the
fully qualified class name must be provided (e.g., "java.lang.String").
The classpath is then searched for the class. If the class is not found,
an exception will be thrown.
+ Load the super class of the Java object
In order to properly load a Java class into Ruby, it's super class must first
be loaded. An attempt will be made to load the super class of the Java object
(this is a recursive process, stopping when the top of the class hierarchy is
reached).
+ Register the class with Ruby
Registering a Java class with Ruby involves creating a new Ruby class that
directly references the Java class. If the Java object has no super class
(and thus is the "java.lang.Object" object), the new Ruby class is created
with a super class of object Java::JavaObject. Otherwise, the new Ruby class
is created with a super class of the Ruby representation of the Java super
class (which must have already been registered with Ruby since super classes
must be loaded before registration of a Java class can take place).
Note that when the class is initially registered with Ruby, none of the
Java constructors, methods, or fields are added to Ruby immediately.
Introspection of the Java class does not occur until after the class is
registered with Ruby (but before the class is finished being loaded by
Rajah).
+ Introspect the Java class for all of it's public constructors
The Java class is then introspected for all of the publicly accessible
constructors. These constructors are added to the in-memory representation
of the Java class. When the first constructor is added to the class, an
"initialize" method with a variable number of parameters is added to the
class. Every constructor for every class loaded via Rajah shares the same
C function callback for handling the "initialize" method. See the section
on object creation for more information.
+ Introspect the Java class for all of it's public methods
The Java class is then introspected for all of the publicly accessible
methods. These methods are added to the in-memory representation of the Java
class. Every method of every class loaded via Rajah shares the same C
function callback for handling the method. See the section on methods
for more information.
+ Introspect the Java class for all of it's public fields
The Java class is then introspected for all of the publicly accessible
fields.
Object creation
Objects are created in Ruby using a class' "new" singleton method.
When Java objects are registered with Ruby, a handler for the singleton method
"new" is registered. When the new method is invoked, a new Java object of the
Java class is instantiated. However, a constructor is not immediately invoked.
Using JNI allows Rajah to instantiate a Java object without any constructor
being invoked, thus we postpone construction of the object till later. After the
new Java object is instantiated, it is wrapped in a Ruby object. Then, the
initialize method is invoked with the same parameters the new method was invoked
with. See the next section for more information on method invocation. The
initialize method will invoke the appropriate constructor on the Java object
created in the new method. If no matching constructor is found using the given
Ruby arguments, an exception will be generated.
Methods
Before delving into the details of how Java methods are handled in Ruby, let us
examine a few of the requirements for Java methods:
+ Support for static and instance methods of Java classes.
+ Support for overloaded Java methods.
+ Support for a lightweight invocation interface (i.e., Java method
invocation should impose as little overhead as possible).
All Java methods registered with Ruby use a variable length argument list to
process the method. This serves a few purposes:
1. Allows every instance method of every class to use the same C function to
handle the method. This minimizes code complexity, and keeps the C API
simple. Likewise, every static method of every class can use another C
function to handle the method.
2. Allows support for overloaded Java methods.
3. Since parameters need to wrapped into an array internally eventually anyway,
the performance of this is negligible.
Method invocation process
When a method is invoked, the following steps occur:
+ The name of the method that was invoked is retrieved.
+ The Java class that the method was invoked on is searched for a method that
matches the name, the argument count, static or non-static criteria, and
the argument types. If no method is found that matches all criteria, an
exception is raised.
+ The Ruby arguments are marshaled (see below) into corresponding Java
parameters.
+ The Java method is invoked via JNI. If any Java exceptions occur, a
corresponding exception will be generated and raised in Ruby.
+ The return value of the method invocation is then unmarshaled into a Ruby
object and returned from the method invocation.
Rules for mapping Ruby types to Java types
When a Java method or constructor is invoked using Ruby arguments, the arguments
must be converted into appropriate Java primitives or objects. This process we
refer to as marshaling. Likewise, the return value of a method (if the method is
not declared to return void) must be converted into the appropriate Ruby object.
This process we refer to as unmarshaling.
Java provides two fundamentally different entities that need to be examined for
the marshaling and unmarshaling processes: primitives and objects. There are
eight primitive types in the Java language:
+ boolean (values values are the Java keywords "true" and "false")
+ byte (signed 8-bit integer)
+ char (16 bit Unicode character)
+ short (signed 16-bit integer)
+ int (signed 32-bit integer)
+ long (signed 64-bit integer)
+ float (signed 32-bit floating point number)
+ double (signed 64-bit floating point number)
These primitives are handled by Rajah to correctly map Ruby values to Java, as
well as map Java values back to Ruby.
In Java, every object (either directly or indirectly) extends the Java class
"java.lang.Object". The single exception to this rule is the "java.lang.Object"
class itself, which has no super class.
Handling of primitives and objects should be fairly transparent from within
Ruby. However, when overloaded methods and constructors surface, some
familiarity with Rajah's mapping marshaling and unmarshaling rules is
necessary.
Marshaling
Marshaling of each individual parameter occurs sequentially, starting with the
first parameter. (Note that since the method is matched before any real
marshaling occurs, errors during the marshaling process should be infrequent.)
The Java type of the parameter is examined, and the Ruby value is marshaled into
an appropriate Java type. Here is a list of the marshaling rules when the given
Java type is encountered:
+ boolean - Ruby "true" will map to a Java "true". Ruby "false" will map to a
Java "false".
+ byte - Fixnums within the range -128 to 127.
+ char - ???
+ short - Fixnums within the range -32768 to 32767.
+ int - Fixnums or Bignums in the range -2^31 to (2^31 - 1).
+ long - Fixnums of Bignums in the range -2^63 to (2^63 - 1).
+ float - Floating poit values in the appropriate range.
+ double - Floating poit values in the appropriate range.
+ java.lang.String object - Ruby string objects will be marshaled to
java.lang.String objets. Of course, java.lang.String objects are also
acceptable.
+ arrays - Ruby arrays will be marshaled into Java arrays. However, this places
restrictions on what the values in the Ruby array can be so that marshaling
can properly occur for every element in the array.
Unmarshaling
Unmarshaling values returned from Java (either via return values from invoked
methods or from field access) will map a Java object to a Ruby object.
If the return type is a Java class that has not been loaded into Ruby yet,
Rajah will go through the class loading process for the return value as
outlined above. This section will be explained in more detail in the Rajah
documentation.
4. Known Issues (in no particular order)
--------------------------------------------------------------------------------
- Support for arrays is not complete.
- There is currently a conflict between Java methods with the name "initialize"
and the predefined "initialize" defined for each Java class when it is
loaded into Ruby. Currently, no special checks are done when a Java method
with the name "initialize" is loaded. The results are undefined if an attempt
is made to load a Java class with a Java defined initialize method.
- Support for exceptions from Java is not complete.
- In Java, throwable types (java.lang.Throwable objects) extend
java.lang.Object. In Ruby, the convention is to create exceptions that
extend the class Exception. It would probably be nice if we made all of the
Java Throwable objects somehow extend the Ruby Exception class. However,
technically the Throwable object should extend the java.lang.Object class.
Is it "bad" Ruby style to throw objects that do not extend Exception?
- Support for Ruby objects implementing Java interfaces is being examined, but
not currently implemented (no pun intended). JDK 1.3 might alleviate parts of
this problem, as JDK 1.3 introduces runtime interfaces (Proxies) for objects.
However, even this approach would probably require helper classes written in
Java.
- What about abstract classes? Abstract methods? Behavior needs to be defined
when abstract classes are loaded.
- What about Java interfaces?
- When no Java constructor is supplied in the class, does introspecting the
class still give us a no-parameter public constructor? If not, should we
supply one ourselves?
- How are methods that begin with capital letters or _'s handled in Ruby?
- How are classes that begin with lowercase letters handled from Ruby?
- If a method is invoked that is not found in the Java class, should we attempt
to invoke the method directly on the super class, or is that even necessary?
- Currently only public methods/fields are loaded. Do we want to load
protected methods/fields too, in case a ruby class is sub-classing one of the
java classes and wants access to protected fields? This might not even be
possible with the reflection API, but it is something we should look in to.
- Subclassing Java classes loaded into Ruby is not supported right now.
- We should make the Java method "String toString()" map to "to_s" in Ruby.