jruby hacking guide

Post on 15-May-2015

1.442 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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/

top related