jruby hacking guide

58
JRuby hacking guide David Calavera @calavera

Upload: david-calavera

Post on 15-May-2015

1.429 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: JRuby hacking guide

JRuby hacking guideDavid Calavera@calavera

Page 2: JRuby hacking guide

+70 contributors

Page 3: JRuby hacking guide

9 core members

Page 4: JRuby hacking guide

30 single commits

~

Page 5: JRuby hacking guide

we want you

Page 6: JRuby hacking guide

core

Page 7: JRuby hacking guide

rule of thumb

Page 8: JRuby hacking guide

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)'

Page 9: JRuby hacking guide

do not freak out

Page 10: JRuby hacking guide

ruby-1.8.7 :001 > raise ArgumentError.newArgumentError: ArgumentError from (irb):1

Page 11: JRuby hacking guide

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)'

Page 12: JRuby hacking guide

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)'

Page 13: JRuby hacking guide

your ruby code is our test case

Page 14: JRuby hacking guide

Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")

d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end

Page 15: JRuby hacking guide

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

Page 16: JRuby hacking guide

follow the specification

Page 17: JRuby hacking guide

RubySpecdescribe "Dir.entries" do ...

it "returns an Array of filenames in an existing directory including dotfiles" do ...

Page 18: JRuby hacking guide

RubySpecdescribe "Dir.entries" do ...

ruby_version_is "1.9" do it "calls #to_path on ..." do ...

Page 19: JRuby hacking guide

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

Page 20: JRuby hacking guide

go to the source

Page 21: JRuby hacking guide

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);}

Page 22: JRuby hacking guide

taming the beast

Page 23: JRuby hacking guide

Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")

d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end

Page 24: JRuby hacking guide

Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")

d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end

Page 25: JRuby hacking guide

Ruby class$ vi src/org/jruby/RubyDir.java

@JRubyClass(name = "Dir", include = "Enumerable")public class RubyDir extends RubyObject {

Page 26: JRuby hacking guide

Ruby class$ vi src/org/jruby/RubyDir.java

@JRubyClass(name = "Dir", include = "Enumerable")public class RubyDir extends RubyObject {

Page 27: JRuby hacking guide

Ruby class$ vi src/org/jruby/RubyDir.java

@JRubyClass(name = "Dir", include = "Enumerable")public class RubyDir extends RubyObject {

Page 28: JRuby hacking guide

Ruby class$ vi src/org/jruby/RubyDir.java

@JRubyClass(name = "Dir", include = "Enumerable")public class RubyDir extends RubyObject {

Page 29: JRuby hacking guide

Ruby class$ vi src/org/jruby/RubyDir.java

@JRubyClass(name = "Dir", include = "Enumerable")public class RubyDir extends RubyObject {

Page 30: JRuby hacking guide

Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")

d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end

Page 31: JRuby hacking guide

Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")

d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end

Page 32: JRuby hacking guide

Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)

public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {

Page 33: JRuby hacking guide

Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)

public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {

Page 34: JRuby hacking guide

Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)

public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {

Page 35: JRuby hacking guide

Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)

public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {

Page 36: JRuby hacking guide

Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)

public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {

Page 37: JRuby hacking guide

Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)

public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {

Page 38: JRuby hacking guide

Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)

public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {

Page 39: JRuby hacking guide

Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)

public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {

Page 40: JRuby hacking guide

Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)

public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {

Page 41: JRuby hacking guide

Ruby method@JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true, compat = RUBY1_8)

public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) {

Page 42: JRuby hacking guide

Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")

d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end

Page 43: JRuby hacking guide

Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")

d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end

Page 44: JRuby hacking guide

initialize

@JRubyMethod(compat = RUBY1_8)public IRubyObject initialize(IRubyObject arg)

private static final ObjectAllocator DIR_ALLOCATOR = new ObjectAllocator()

Page 45: JRuby hacking guide

Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")

d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end

Page 46: JRuby hacking guide

Test::Unitdef test_dir_enumerable Dir.mkdir("./testDir_1")

d = Dir.new("./testDir_1") assert(d.kind_of?(Enumerable))end

Page 47: JRuby hacking guide

Ruby module$ vi src/org/jruby/RubyKernel.java

@JRubyModule(name="Kernel")public class RubyKernel {

Page 48: JRuby hacking guide

Ruby module

@JRubyModule(name="Kernel")public class RubyKernel {

$ vi src/org/jruby/RubyKernel.java

Page 49: JRuby hacking guide

Ruby module$ vi src/org/jruby/RubyObject.java

@JRubyClass(name="Object", include="Kernel")public class RubyObject extends ... {

Page 50: JRuby hacking guide

Ruby module@JRubyMethod(name = {"kind_of?", "is_a?"}, required = 1)

public static RubyBoolean kind_of_p(ThreadContext context, IRubyObject recv, IRubyObject type) {

Page 51: JRuby hacking guide

Ruby module@JRubyMethod(name = {"kind_of?", "is_a?"}, required = 1)

public static RubyBoolean kind_of_p(ThreadContext context, IRubyObject recv, IRubyObject type) {

Page 52: JRuby hacking guide

Ruby module@JRubyMethod(name = {"kind_of?", "is_a?"}, required = 1)

public static RubyBoolean kind_of_p(ThreadContext context, IRubyObject recv, IRubyObject type) {

Page 53: JRuby hacking guide

learn more

Page 56: JRuby hacking guide

http://jruby.org

Page 57: JRuby hacking guide

thank you!

Page 58: JRuby hacking guide

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/