Post on 15-May-2015
JRuby hacking guideDavid Calavera@calavera
+70 contributors
9 core members
30 single commits
~
we want you
core
rule of thumb
jruby-1.6.2 :003 > raise ArgumentError.newArgumentError: ArgumentError from (irb):3:in `evaluate' from org/jruby/RubyKernel.java:1088:in `eval' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:158:in `eval_input' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:271:in `signal_status' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:155:in `eval_input' from org/jruby/RubyKernel.java:1419:in `loop' from org/jruby/RubyKernel.java:1191:in `catch' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:154:in `eval_input' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:71:in `start' from org/jruby/RubyKernel.java:1191:in `catch' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:70:in `start' from /Users/david/.rvm/rubies/jruby-1.6.2/bin/irb:17:in `(root)'
do not freak out
ruby-1.8.7 :001 > raise ArgumentError.newArgumentError: ArgumentError from (irb):1
jruby-1.6.2 :001 > raise ArgumentError.newArgumentError: ArgumentError from (irb):1:in `evaluate' from org/jruby/RubyKernel.java:1088:in `eval' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:158:in `eval_input' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:271:in `signal_status' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:155:in `eval_input' from org/jruby/RubyKernel.java:1419:in `loop' from org/jruby/RubyKernel.java:1191:in `catch' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:154:in `eval_input' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:71:in `start' from org/jruby/RubyKernel.java:1191:in `catch' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:70:in `start' from /Users/david/.rvm/rubies/jruby-1.6.2/bin/irb:17:in `(root)'
jruby-1.6.2 :001 > raise ArgumentError.newArgumentError: ArgumentError from (irb):1:in `evaluate' from org/jruby/RubyKernel.java:1088:in `eval' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:158:in `eval_input' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:271:in `signal_status' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:155:in `eval_input' from org/jruby/RubyKernel.java:1419:in `loop' from org/jruby/RubyKernel.java:1191:in `catch' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:154:in `eval_input' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:71:in `start' from org/jruby/RubyKernel.java:1191:in `catch' from /Users/david/.rvm/rubies/jruby-1.6.2/lib/ruby/1.8/irb.rb:70:in `start' from /Users/david/.rvm/rubies/jruby-1.6.2/bin/irb:17:in `(root)'
your ruby code is our test case
Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")
d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end
Rspecdescribe "glob file path" do it "lists contents of a file" do dir = Dir.new(@local_file_path) dir.entries.should include("junit.jar") endend
follow the specification
RubySpecdescribe "Dir.entries" do ...
it "returns an Array of filenames in an existing directory including dotfiles" do ...
RubySpecdescribe "Dir.entries" do ...
ruby_version_is "1.9" do it "calls #to_path on ..." do ...
RubySpec$ bin/jruby -S mspec \ spec/ruby/core/dir/entries_spec.rb
$ bin/jruby --1.9 -S mspec \ spec/ruby/core/dir/entries_spec.rb
go to the source
ruby codestatic VALUEdir_entries(int argc, VALUE *argv, VALUE io){ VALUE dir;
dir = dir_open_dir(argc, argv); return rb_ensure(rb_Array, dir, dir_close, dir);}
taming the beast
Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")
d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end
Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")
d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end
Ruby class$ vi src/org/jruby/RubyDir.java
@JRubyClass(name = "Dir", include = "Enumerable")public class RubyDir extends RubyObject {
Ruby class$ vi src/org/jruby/RubyDir.java
@JRubyClass(name = "Dir", include = "Enumerable")public class RubyDir extends RubyObject {
Ruby class$ vi src/org/jruby/RubyDir.java
@JRubyClass(name = "Dir", include = "Enumerable")public class RubyDir extends RubyObject {
Ruby class$ vi src/org/jruby/RubyDir.java
@JRubyClass(name = "Dir", include = "Enumerable")public class RubyDir extends RubyObject {
Ruby class$ vi src/org/jruby/RubyDir.java
@JRubyClass(name = "Dir", include = "Enumerable")public class RubyDir extends RubyObject {
Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")
d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end
Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")
d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end
Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)
public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {
Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)
public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {
Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)
public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {
Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)
public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {
Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)
public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {
Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)
public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {
Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)
public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {
Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)
public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {
Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)
public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {
Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)
public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {
Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")
d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end
Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")
d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end
initialize
@JRubyMethod(compat = RUBY1_8)public IRubyObject initialize(IRubyObject arg)
private static final ObjectAllocator DIR_ALLOCATOR = new ObjectAllocator()
Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")
d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end
Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")
d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end
Ruby module$ vi src/org/jruby/RubyKernel.java
@JRubyModule(name="Kernel")public class RubyKernel {
Ruby module
@JRubyModule(name="Kernel")public class RubyKernel {
$ vi src/org/jruby/RubyKernel.java
Ruby module$ vi src/org/jruby/RubyObject.java
@JRubyClass(name="Object", include="Kernel")public class RubyObject extends ... {
Ruby module@JRubyMethod(name = {"kind_of?", "is_a?"}, required = 1)
public static RubyBoolean kind_of_p(ThreadContext context, IRubyObject recv, IRubyObject type) {
Ruby module@JRubyMethod(name = {"kind_of?", "is_a?"}, required = 1)
public static RubyBoolean kind_of_p(ThreadContext context, IRubyObject recv, IRubyObject type) {
Ruby module@JRubyMethod(name = {"kind_of?", "is_a?"}, required = 1)
public static RubyBoolean kind_of_p(ThreadContext context, IRubyObject recv, IRubyObject type) {
learn more
by Hiroshi Nakamura
http://tinyurl.com/jruby-hacking-guide
by R.J. Lorimer
http://tinyurl.com/distilling-jruby
http://jruby.org
thank you!
CreditsCharles Nutter’s Photo Booth
http://www.flickr.com/photos/zpeckler/2648345658/
http://www.flickr.com/photos/dcmetroblogger/3298543398/
http://www.flickr.com/photos/jenny-pics/4520503357/