From bc32055f5aee675fe87a19c75bb7d85426a3a4f8 Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Thu, 13 Oct 2011 17:15:13 -0400 Subject: [PATCH 01/20] added to_R function --- ext/Converters.c | 8 ++++++++ ext/Converters.h | 1 + ext/rsruby.c | 18 ++++++------------ ext/rsruby.h | 2 +- test/tc_mem.rb | 35 +++++++++++++++++++++++++++++++++++ test/tc_robj.rb | 5 ++++- test/test_memory_usage.rb | 1 + 7 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 test/tc_mem.rb diff --git a/ext/Converters.c b/ext/Converters.c index 1e12a60..fb0f1ec 100644 --- a/ext/Converters.c +++ b/ext/Converters.c @@ -36,6 +36,14 @@ // ************** Converters from Ruby to R *********// +VALUE ruby_to_Robj(VALUE self, VALUE args){ + + SEXP robj; + VALUE val; + robj = ruby_to_R(args); + val = to_ruby_with_mode(robj,NO_CONVERSION); + return val; +} SEXP ruby_to_R(VALUE obj) { SEXP robj; diff --git a/ext/Converters.h b/ext/Converters.h index 678f8d3..9d95573 100644 --- a/ext/Converters.h +++ b/ext/Converters.h @@ -36,6 +36,7 @@ //Converters for Ruby to R SEXP ruby_to_R(VALUE val); +VALUE ruby_to_Robj(VALUE self,VALUE args); SEXP array_to_R(VALUE obj); SEXP hash_to_R(VALUE obj); diff --git a/ext/rsruby.c b/ext/rsruby.c index fa88bba..98fc9ff 100644 --- a/ext/rsruby.c +++ b/ext/rsruby.c @@ -37,8 +37,7 @@ /* This is inspired in $R_SRC/src/main/memory.c */ static SEXP R_References; void protect_robj(SEXP robj){ - R_References = CONS(robj, R_References); - SET_SYMVALUE(install("R.References"), R_References); + R_PreserveObject(robj); } SEXP @@ -55,16 +54,10 @@ RecursiveRelease(SEXP obj, SEXP list) /* TODO: This needs implementing as a Ruby destructor for each RObj */ void -Robj_dealloc(VALUE self) +Robj_dealloc(SEXP robj) { - SEXP robj; - - Data_Get_Struct(self, struct SEXPREC, robj); - - R_References = RecursiveRelease(robj, R_References); - SET_SYMVALUE(install("R.References"), R_References); - - return; + R_ReleaseObject(robj); + } @@ -170,13 +163,14 @@ void Init_rsruby_c(){ rb_define_method(cRRuby, "shutdown", rs_shutdown, 0); rb_define_method(cRRuby, "crash", crash, 0); + rb_define_method(cRRuby, "to_R", ruby_to_Robj, 1); //Add the lcall method to RObj cRObj = rb_const_get(rb_cObject,rb_intern("RObj")); rb_define_method(cRObj, "lcall", RObj_lcall, 1); rb_define_method(cRObj, "__init_lcall__", RObj_init_lcall, 1); rb_define_method(cRObj, "to_ruby", RObj_to_ruby, -2); - rb_define_method(cRObj, "to_R", ruby_to_R, 1); + } diff --git a/ext/rsruby.h b/ext/rsruby.h index 39b6ede..1b1bade 100644 --- a/ext/rsruby.h +++ b/ext/rsruby.h @@ -84,6 +84,6 @@ VALUE RObj_init_lcall(VALUE self, VALUE args); VALUE RObj_to_ruby(VALUE self, VALUE args); int make_argl(VALUE args, SEXP *e); void protect_robj(SEXP robj); -void Robj_dealloc(VALUE self); +void Robj_dealloc(SEXP robj); #endif diff --git a/test/tc_mem.rb b/test/tc_mem.rb new file mode 100644 index 0000000..8f8a407 --- /dev/null +++ b/test/tc_mem.rb @@ -0,0 +1,35 @@ +require 'test/unit' +require 'rsruby' + +class TestMem < Test::Unit::TestCase + + def setup + @r = RSRuby.instance + RSRuby.set_default_mode(RSRuby::NO_DEFAULT) + @r.class_table.clear + @r.proc_table.clear + end + + #test that robjects are not killed + def test_robjpersist + RSRuby.set_default_mode(RSRuby::NO_CONVERSION) + randarray = r.eval_R("x=runif(100,0,1)") + RSRuby.set_default_mode(RSRuby::BASIC_CONVERSION) + vals = r.x + r.eval_R("rm(x)") + RSRuby.set_default_mode(RSRuby::NO_CONVERSION) + + #do a bunch of stuff + 10000.times do |n| + a = RSRuby.instance.parse(:text =>"x#{n} = c(1:10000);") + RSRuby.instance.eval(a) + RSRuby.instance.eval_R("rm(x#{n})") + end + + RSRuby.set_default_mode(RSRuby::BASIC_CONVERSION) + assert_equal(vals, r.x) + + end + +end + diff --git a/test/tc_robj.rb b/test/tc_robj.rb index 30e2589..1f680d2 100644 --- a/test/tc_robj.rb +++ b/test/tc_robj.rb @@ -80,5 +80,8 @@ def test_lcall RSRuby.set_default_mode(RSRuby::BASIC_CONVERSION) assert_equal(@r.names(arr), ['','a','b','c']) end - + def test_initialize + robj = RObj.new([1,2,3]) + assert_equal('RObj',robj.class) + end end diff --git a/test/test_memory_usage.rb b/test/test_memory_usage.rb index c52ddbb..9038457 100644 --- a/test/test_memory_usage.rb +++ b/test/test_memory_usage.rb @@ -2,6 +2,7 @@ 10000.times do |n| a = RSRuby.instance.parse(:text =>"x#{n} = c(1:1000000);") RSRuby.instance.eval(a) + RSRuby.instance.eval_R("rm(x#{n})") #RSRuby.instance.eval_R("x#{n} = c(1:1000000)") end From e2787d848d12a954da18ea61f24a071a44bb054b Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Wed, 2 Nov 2011 13:10:54 -0400 Subject: [PATCH 02/20] duplicate string on conversion to so things work with hash keys --- lib/rsruby.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/rsruby.rb b/lib/rsruby.rb index 91f3f78..f8ccab5 100644 --- a/lib/rsruby.rb +++ b/lib/rsruby.rb @@ -181,9 +181,9 @@ def RSRuby.convert_method_name(name) if name.length > 1 and name[-1].chr == '_' and name[-2].chr != '_' name = name[0..-2] end - name.gsub!(/__/,'<-') - name.gsub!(/_/, '.') - return name + newname = name.gsub(/__/,'<-') + newname = name.gsub(/_/, '.') + return newname end #Converts an Array of function arguments into lcall format. If the last From e100fcc28db358a1265b50659a5ecdb10645044e Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Thu, 12 Jan 2012 03:36:41 -0500 Subject: [PATCH 03/20] added rarray to handle r arrays in ruby --- ext/Converters.c | 30 +++++++++++---- ext/Converters.h | 4 +- ext/Converters.o | Bin 0 -> 62208 bytes lib/rsruby.rb | 1 + lib/rsruby/rarray.rb | 89 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 115 insertions(+), 9 deletions(-) create mode 100644 ext/Converters.o create mode 100644 lib/rsruby/rarray.rb diff --git a/ext/Converters.c b/ext/Converters.c index fb0f1ec..b965cc2 100644 --- a/ext/Converters.c +++ b/ext/Converters.c @@ -412,8 +412,7 @@ to_ruby_vector(SEXP robj, VALUE *obj, int mode) dim = GET_DIM(robj); if (dim != R_NilValue) { - len = GET_LENGTH(dim); - *obj = to_ruby_array(tmp, INTEGER(dim), len); + *obj = to_ruby_array(tmp, robj); return 1; } @@ -647,10 +646,24 @@ VALUE ltranspose(VALUE list, int *dims, int *strides, /* Convert a R Array to a Ruby Array (in the form of * array of arrays of ...) */ -VALUE to_ruby_array(VALUE obj, int *dims, int l) +VALUE to_ruby_array(VALUE obj, SEXP robj) { - VALUE list; - int i, c, *strides; + VALUE rarrayComponents[3]; //values, dimnames, dimnamesnames + VALUE cRArray; + VALUE rarray; + SEXP dim; + int i, c, *strides,l; + int *dims; + int status; + dim = GET_DIM(robj); + dims = INTEGER(dim); + l = GET_LENGTH(dim); + status = to_ruby_vector(GET_DIMNAMES(robj),&rarrayComponents[1],VECTOR_CONVERSION); + if (!status) + rb_raise(rb_eRuntimeError,"Could not convert dimnames\n"); + status = to_ruby_vector(GET_NAMES(GET_DIMNAMES(robj)),&rarrayComponents[2],VECTOR_CONVERSION); + if (!status) + rb_raise(rb_eRuntimeError,"Could not convert dimnames names\n"); strides = (int *)ALLOC_N(int,l); if (!strides) @@ -662,8 +675,11 @@ VALUE to_ruby_array(VALUE obj, int *dims, int l) c *= dims[i]; } - list = ltranspose(obj, dims, strides, 0, 0, l); + rarrayComponents[0] = ltranspose(obj, dims, strides, 0, 0, l); free(strides); - return list; + cRArray = rb_const_get(rb_cObject,rb_intern("RArray")); + rarray = rb_class_new_instance(3,rarrayComponents,cRArray); + + return rarray; } diff --git a/ext/Converters.h b/ext/Converters.h index 9d95573..64fe5d9 100644 --- a/ext/Converters.h +++ b/ext/Converters.h @@ -56,10 +56,10 @@ VALUE call_proc(VALUE data); VALUE reset_mode(VALUE mode); VALUE to_ruby_hash(VALUE obj, SEXP names); -VALUE to_ruby_array(VALUE obj, int *dims, int l); +VALUE to_ruby_array(VALUE obj, SEXP robj); VALUE ltranspose(VALUE list, int *dims, int *strides, - int pos, int shift, int len); + int pos, int shift, int len); //Macros for quick checks #define Robj_Check(v) (rb_obj_is_instance_of(v,rb_const_get(rb_cObject,rb_intern("RObj")))) diff --git a/ext/Converters.o b/ext/Converters.o new file mode 100644 index 0000000000000000000000000000000000000000..5ca637f22dab52b294742567641216c0201c61d5 GIT binary patch literal 62208 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 H{Pq6<&Jp+( literal 0 HcmV?d00001 diff --git a/lib/rsruby.rb b/lib/rsruby.rb index f8ccab5..f39f067 100644 --- a/lib/rsruby.rb +++ b/lib/rsruby.rb @@ -1,4 +1,5 @@ require 'rsruby/robj' +require 'rsruby/rarray' require 'rsruby_c' require 'singleton' diff --git a/lib/rsruby/rarray.rb b/lib/rsruby/rarray.rb new file mode 100644 index 0000000..f708250 --- /dev/null +++ b/lib/rsruby/rarray.rb @@ -0,0 +1,89 @@ +require 'rsruby' +class RArray + attr_reader :array + def initialize(_array,_dimnames,_dimnamesorder) + @array = _array + @dimnames = _dimnames + @dimnamesorder = _dimnamesorder + end +# def method_missing(m,*args) +# if args.length>0 +# @array.send(m,args) +# else +# @array.send(m) +# end +# end + def [](index) + @array[index] + end + # trim the innermost dimension to n + # innermost dimension is outermost dimension in R + def trim(_n) + end + #we must handle either array or hash of dim names + #since we don't know what rsruby is going to give + def dimension_count + @dimnames.length + end + def subset(_keys,_dim) + all_keys = dimnames_along_dimension(_dim) + new_order = _keys.map{|x| + all_keys.index(x) + } + new_order=new_order.compact + new_array = subset_helper(@array,new_order,0,_dim) + if @dimnames.is_a? Array + new_dimnames = @dimnames.dup + new_dimnames[_dim] = _keys + RArray.new(new_array,new_dimnames,nil) + else #hash + new_dimnames = @dimnames.merge({@dimnamesorder[_dim] => _keys}) + RArray.new(new_array,new_dimnames,@dimnamesorder.dup) + end + end + def subset_helper(_array,_new_order,_current_depth,_target_depth) + if _current_depth == _target_depth + _new_order.map{|x| + _array.fetch(x) + } + else + _array.map{|x| + subset_helper(x,_new_order,_current_depth+1,_target_depth) + } + end + end + def get(*_args) + indices = _args.each_with_index.map{|x,i| + d = dimnames_along_dimension(i) + j= d.index(x) + return nil unless j + j + } + a=@array + indices.each{|i| + a=a[i] + } + a + end +# def first(_n) +# new_array = @array.first(_n) +# new_dimnames = nil +# if @dimnames.is_a? Array +# new_dimnames = dimnames.dup +# new_dimnames[0] = new_dimnames[0].first(_n) +# else #hash +# new_dimnames = @dimnames.merge ({@dimnamesorder[0] => dimnames(0).first(_n)}) +# end +# RArray.new(new_array,new_dimnames,@dimnamesorder) +# end + + + def dimnames_along_dimension(_index) + return @dimnames[_index] if @dimnames.is_a? Array + return @dimnames[@dimnamesorder[_index]] if @dimnames.is_a? Hash + raise "unsupported dimnames" + end + def dimension_names + return @dimnamesorder + end +end From d707bdf6a1ba315f99bc9cf4bb9d479a89135de1 Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Thu, 1 Mar 2012 10:58:50 -0500 Subject: [PATCH 04/20] allow namespaces in R function calls with :: --- lib/rsruby.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/rsruby.rb b/lib/rsruby.rb index f39f067..a278412 100644 --- a/lib/rsruby.rb +++ b/lib/rsruby.rb @@ -134,8 +134,7 @@ def method_missing(r_id,*args) #Translate Ruby method call to R robj_name = RSRuby.convert_method_name(r_id.to_s) - #Retrieve it - robj = self.__getitem__(robj_name) + robj = robj_name =~ /(.+)::(.+)/ ? self.send('::',$1,$2) : self.__getitem__(robj_name) #TODO perhaps this is not neccessary - always call these methods #use the [] syntax for variables etc... From ae4e6ebbf086f245d907d939d1d46a2cda6be5ad Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Thu, 1 Mar 2012 10:59:07 -0500 Subject: [PATCH 05/20] add /usr/share/R/include to search paths --- ext/extconf.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/extconf.rb b/ext/extconf.rb index cd1954f..a0312f5 100644 --- a/ext/extconf.rb +++ b/ext/extconf.rb @@ -18,7 +18,7 @@ exit 1 end -some_include_paths = some_paths.map{|dir| File.join(dir, 'include') } + %w[/usr/include/R] +some_include_paths = some_paths.map{|dir| File.join(dir, 'include') } + %w[/usr/include/R] + %w[/usr/share/R/include] find_header('R.h', nil, *some_include_paths) unless have_header("R.h") From 70d34d796667340308ff7821bde2c1e08eb574fc Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Thu, 1 Mar 2012 10:59:35 -0500 Subject: [PATCH 06/20] fix up rarray subscript operation --- lib/rsruby/rarray.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/rsruby/rarray.rb b/lib/rsruby/rarray.rb index f708250..1bcb8f7 100644 --- a/lib/rsruby/rarray.rb +++ b/lib/rsruby/rarray.rb @@ -30,7 +30,6 @@ def subset(_keys,_dim) new_order = _keys.map{|x| all_keys.index(x) } - new_order=new_order.compact new_array = subset_helper(@array,new_order,0,_dim) if @dimnames.is_a? Array new_dimnames = @dimnames.dup @@ -44,7 +43,7 @@ def subset(_keys,_dim) def subset_helper(_array,_new_order,_current_depth,_target_depth) if _current_depth == _target_depth _new_order.map{|x| - _array.fetch(x) + x.nil? ? nil : _array.fetch(x) } else _array.map{|x| From 3ef03e3660cd69415a32421656a2997997fcf20b Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Thu, 1 Mar 2012 10:59:56 -0500 Subject: [PATCH 07/20] minor version bump --- rsruby.gemspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rsruby.gemspec b/rsruby.gemspec index 3c0284a..ccf19d9 100644 --- a/rsruby.gemspec +++ b/rsruby.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |s| s.name = %q{rsruby} - s.version = "0.5.1.1" + s.version = "0.5.1.1c" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Alex Gutteridge"] @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.email = %q{ag357@cam.ac.uk} s.extensions = ["ext/extconf.rb"] s.extra_rdoc_files = ["README.txt", "History.txt", "License.txt", "examples/bioc.rb", "examples/dataframe.rb", "examples/arrayfields.rb", "examples/erobj.rb"] - s.files = ["History.txt", "License.txt", "Manifest.txt", "README.txt", "Rakefile.rb", "examples/arrayfields.rb", "examples/bioc.rb", "examples/dataframe.rb", "examples/erobj.rb", "ext/Converters.c", "ext/Converters.h", "ext/R_eval.c", "ext/R_eval.h", "ext/extconf.rb", "ext/robj.c", "ext/rsruby.c", "ext/rsruby.h", "lib/rsruby.rb", "lib/rsruby/dataframe.rb", "lib/rsruby/erobj.rb", "lib/rsruby/robj.rb", "test/table.txt", "test/tc_array.rb", "test/tc_boolean.rb", "test/tc_cleanup.rb", "test/tc_eval.rb", "test/tc_extensions.rb", "test/tc_init.rb", "test/tc_io.rb", "test/tc_library.rb", "test/tc_matrix.rb", "test/tc_modes.rb", "test/tc_robj.rb", "test/tc_sigint.rb", "test/tc_to_r.rb", "test/tc_to_ruby.rb", "test/tc_util.rb", "test/tc_vars.rb", "test/test_all.rb"] + s.files = ["History.txt", "License.txt", "Manifest.txt", "README.txt", "Rakefile.rb", "examples/arrayfields.rb", "examples/bioc.rb", "examples/dataframe.rb", "examples/erobj.rb", "ext/Converters.c", "ext/Converters.h", "ext/R_eval.c", "ext/R_eval.h", "ext/extconf.rb", "ext/robj.c", "ext/rsruby.c", "ext/rsruby.h", "lib/rsruby.rb", "lib/rsruby/dataframe.rb", "lib/rsruby/erobj.rb", "lib/rsruby/rarray.rb", "lib/rsruby/robj.rb", "test/table.txt", "test/tc_array.rb", "test/tc_boolean.rb", "test/tc_cleanup.rb", "test/tc_eval.rb", "test/tc_extensions.rb", "test/tc_init.rb", "test/tc_io.rb", "test/tc_library.rb", "test/tc_matrix.rb", "test/tc_modes.rb", "test/tc_robj.rb", "test/tc_sigint.rb", "test/tc_to_r.rb", "test/tc_to_ruby.rb", "test/tc_util.rb", "test/tc_vars.rb", "test/test_all.rb"] s.has_rdoc = true s.homepage = %q{http://web.kuicr.kyoto-u.ac.jp/~alexg/rsruby/} s.rdoc_options = ["--exclude", "test/*", "--main", "README.txt", "--inline-source"] From aafccaf1d82b5d10a549bd61458270cbb1cba94b Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Thu, 1 Mar 2012 14:56:20 -0500 Subject: [PATCH 08/20] backtrace in R code load this code into R workspace to make it work traceback.character<- function (x = NULL, max.lines = getOption("deparse.max.lines")) { res <- character() if (is.null(x) && (exists(".Traceback", envir = baseenv()))) x <- get(".Traceback", envir = baseenv()) n <- length(x) if (n == 0L) res <- c(res,gettext("No traceback available")) else { for (i in 1L:n) { label <- paste(n - i + 1L, ": ", sep = "") m <- length(x[[i]]) if (!is.null(srcref <- attr(x[[i]], "srcref"))) { srcfile <- attr(srcref, "srcfile") x[[i]][m] <- paste(x[[i]][m], " at ", basename(srcfile$filename), "#", srcref[1L], sep = "") } if (m > 1) label <- c(label, rep(substr(" ", 1L, nchar(label, type = "w")), m - 1L)) if (is.numeric(max.lines) && max.lines > 0L && max.lines < m) { res <- c(res,paste(label[1L:max.lines], x[[i]][1L:max.lines], sep = "")) res <- c(res,paste(label[max.lines + 1L], "...")) } else res <- c(res,paste(label, x[[i]], sep = "")) } } res } --- lib/rsruby.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/rsruby.rb b/lib/rsruby.rb index a278412..34641e4 100644 --- a/lib/rsruby.rb +++ b/lib/rsruby.rb @@ -299,4 +299,22 @@ def __getitem__(name,init=false) end class RException < RuntimeError + def initialize(_msg) + e = RSRuby.get_default_mode + RSRuby.set_default_mode(RSRuby::VECTOR_CONVERSION ) + if RSRuby.instance.exists('traceback.character')[0] + @r_traceback = RSRuby.instance.traceback_character('max.lines'=>10) + else + r_full_traceback = RSRuby.instance.get(".Traceback") + r_shortened_traceback = r_full_traceback.map{|x| x.first(10)} + @r_traceback = r_shortened_traceback.flatten + end + RSRuby.set_default_mode(e) + super + end + def backtrace + x = super + return x if x.nil? + @r_traceback +x + end end From c99ca04bfc151b4a99b825e058561a86c2245fc5 Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Thu, 1 Mar 2012 15:01:05 -0500 Subject: [PATCH 09/20] version bump --- rsruby.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rsruby.gemspec b/rsruby.gemspec index ccf19d9..ff0a89d 100644 --- a/rsruby.gemspec +++ b/rsruby.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |s| s.name = %q{rsruby} - s.version = "0.5.1.1c" + s.version = "0.5.1.1d" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Alex Gutteridge"] From bb3fd2dbfee58aec6461a50fcc5f37d21b0c5d55 Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Wed, 18 Apr 2012 15:56:01 -0400 Subject: [PATCH 10/20] Disable stack checking limit better support multithreads work on rails --- ext/rsruby.c | 8 ++++++-- ext/rsruby.h | 7 +++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ext/rsruby.c b/ext/rsruby.c index 98fc9ff..8a7ef16 100644 --- a/ext/rsruby.c +++ b/ext/rsruby.c @@ -117,7 +117,7 @@ VALUE rs_shutdown(VALUE self){ */ VALUE rr_init(VALUE self){ - + init_R(0,NULL); // Initialize the list of protected objects R_References = R_NilValue; @@ -137,7 +137,11 @@ void init_R(int argc, char **argv){ if (RSRUBY_R_HOME) { setenv("R_HOME", RSRUBY_R_HOME, 0); } - Rf_initEmbeddedR(sizeof(defaultArgv) / sizeof(defaultArgv[0]), defaultArgv); + // Rf_initEmbeddedR(sizeof(defaultArgv) / sizeof(defaultArgv[0]), defaultArgv); + Rf_initialize_R(sizeof(defaultArgv) / sizeof(defaultArgv[0]), defaultArgv); + R_Interactive = TRUE; + R_CStackLimit = (uintptr_t)-1; //disable stack limit checking + setup_Rmainloop(); R_Interactive = FALSE; //Remove crash menu (and other interactive R features) } diff --git a/ext/rsruby.h b/ext/rsruby.h index 1b1bade..92e2790 100644 --- a/ext/rsruby.h +++ b/ext/rsruby.h @@ -31,14 +31,15 @@ #ifndef R_RUBY_MAIN #define R_RUBY_MAIN - +#define CSTACK_DEFNS #include "ruby.h" #include "R.h" #include "Rdefines.h" #include "Rinternals.h" #include "Rdefines.h" - +#include "Rinterface.h" +#include "Rembedded.h" #include "signal.h" #include "R_eval.h" @@ -58,8 +59,6 @@ /* Missing definitions from Rinterface.h or RStartup.h */ # define CleanEd Rf_CleanEd -extern int Rf_initEmbeddedR(int argc, char **argv); -extern int R_Interactive; extern void CleanEd(void); extern int R_CollectWarnings; # define PrintWarnings Rf_PrintWarnings From af1a784f8f3a66fb7bd9c5ff844f78e7901d40bf Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Wed, 22 Aug 2012 18:06:45 -0400 Subject: [PATCH 11/20] return nil when dimension names are nil --- lib/rsruby/rarray.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/rsruby/rarray.rb b/lib/rsruby/rarray.rb index 1bcb8f7..f535606 100644 --- a/lib/rsruby/rarray.rb +++ b/lib/rsruby/rarray.rb @@ -54,7 +54,8 @@ def subset_helper(_array,_new_order,_current_depth,_target_depth) def get(*_args) indices = _args.each_with_index.map{|x,i| d = dimnames_along_dimension(i) - j= d.index(x) + return nil unless d + j = d.index(x) return nil unless j j } From f769e1a2d37f0d257c09ba451b5f36411fab1b42 Mon Sep 17 00:00:00 2001 From: Aaron Goodman Date: Wed, 3 Oct 2012 12:34:21 -0400 Subject: [PATCH 12/20] force utf-8 encoding from R --- ext/Converters.c | 2 +- ext/rsruby.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ext/Converters.c b/ext/Converters.c index b965cc2..d819f9b 100644 --- a/ext/Converters.c +++ b/ext/Converters.c @@ -392,7 +392,7 @@ to_ruby_vector(SEXP robj, VALUE *obj, int mode) else { strings = CHAR(STRING_ELT(robj, i)); - if (!(it = rb_str_new2(strings))) + if (!(it = rb_external_str_new_cstr(strings))) return -1; } break; diff --git a/ext/rsruby.h b/ext/rsruby.h index 92e2790..ffde0d8 100644 --- a/ext/rsruby.h +++ b/ext/rsruby.h @@ -33,7 +33,6 @@ #define R_RUBY_MAIN #define CSTACK_DEFNS #include "ruby.h" - #include "R.h" #include "Rdefines.h" #include "Rinternals.h" From e4c309766add4d5a060b0e1882c24239d72a516c Mon Sep 17 00:00:00 2001 From: Jon Pospischil Date: Thu, 4 Oct 2012 01:42:38 -0400 Subject: [PATCH 13/20] force some more utf-8 encoding from R --- ext/Converters.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/Converters.c b/ext/Converters.c index d819f9b..911a66e 100644 --- a/ext/Converters.c +++ b/ext/Converters.c @@ -360,11 +360,11 @@ to_ruby_vector(SEXP robj, VALUE *obj, int mode) if(isFactor(robj)) { /* Watch for NA's! */ if(integers[i]==NA_INTEGER) - it = rb_str_new2(CHAR(NA_STRING)); + it = rb_external_str_new_cstr(CHAR(NA_STRING)); else { thislevel = CHAR(STRING_ELT(GET_LEVELS(robj), integers[i]-1)); - if (!(it = rb_str_new2(thislevel))) + if (!(it = rb_external_str_new_cstr(thislevel))) return -1; } } @@ -388,7 +388,7 @@ to_ruby_vector(SEXP robj, VALUE *obj, int mode) break; case STRSXP: if(STRING_ELT(robj, i)==R_NaString) - it = rb_str_new2(CHAR(NA_STRING)); + it = rb_external_str_new_cstr(CHAR(NA_STRING)); else { strings = CHAR(STRING_ELT(robj, i)); @@ -552,7 +552,7 @@ VALUE from_class_table(SEXP robj) for (i=0; i Date: Wed, 11 Jun 2014 16:24:53 -0700 Subject: [PATCH 14/20] const correctness --- ext/Converters.c | 5 ++--- ext/R_eval.c | 2 +- ext/R_eval.h | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ext/Converters.c b/ext/Converters.c index ef971ec..fb58280 100644 --- a/ext/Converters.c +++ b/ext/Converters.c @@ -317,10 +317,9 @@ int to_ruby_vector(SEXP robj, VALUE *obj, int mode) { VALUE it, tmp; - VALUE params[2]; SEXP names, dim; int len, *integers, i, type; - char *strings, *thislevel; + const char *strings, *thislevel; double *reals; Rcomplex *complexes; @@ -599,7 +598,7 @@ VALUE to_ruby_hash(VALUE obj, SEXP names) { int len, i; VALUE it, hash; - char *name; + const char *name; if ((len = RARRAY_LEN(obj)) < 0) return Qnil; diff --git a/ext/R_eval.c b/ext/R_eval.c index 9556ef1..5ba7da7 100644 --- a/ext/R_eval.c +++ b/ext/R_eval.c @@ -136,7 +136,7 @@ SEXP get_fun_from_name(char *ident) { } /* Obtain the text of the last R error message */ -char *get_last_error_msg() { +const char *get_last_error_msg() { SEXP msg; msg = do_eval_fun("geterrmessage"); diff --git a/ext/R_eval.h b/ext/R_eval.h index 30024ce..1d40c46 100644 --- a/ext/R_eval.h +++ b/ext/R_eval.h @@ -37,4 +37,4 @@ SEXP get_fun_from_name(char *); /* Interrupt the R interpreter */ void interrupt_R(int); -char *get_last_error_msg(void); +const char *get_last_error_msg(void); From b32ef9fe3358af217226420c818cec2966ba2688 Mon Sep 17 00:00:00 2001 From: Jon Wilkes Date: Wed, 11 Jun 2014 16:26:33 -0700 Subject: [PATCH 15/20] Remove pointless buf. --- ext/Converters.c | 4 +--- ext/rsruby.c | 3 --- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/ext/Converters.c b/ext/Converters.c index fb58280..b45043e 100644 --- a/ext/Converters.c +++ b/ext/Converters.c @@ -48,7 +48,6 @@ SEXP ruby_to_R(VALUE obj) { SEXP robj; VALUE str; - char buf [100]; //Return nil if object is nil if (obj == Qnil) { @@ -112,8 +111,7 @@ SEXP ruby_to_R(VALUE obj) { str = rb_funcall(obj,rb_intern("inspect"),0); str = rb_funcall(str,rb_intern("slice"),2,INT2NUM(0),INT2NUM(60)); - sprintf(buf,"Unsupported object '%s' passed to R.\n",RSTRING_PTR(str)); - rb_raise(rb_eArgError,"%s",buf); + rb_raise(rb_eArgError, "Unsupported object '%s' passed to R.\n", RSTRING_PTR(str)); PROTECT(robj = NULL); /* Protected to avoid stack inbalance */ } diff --git a/ext/rsruby.c b/ext/rsruby.c index 8a7ef16..50f1a43 100644 --- a/ext/rsruby.c +++ b/ext/rsruby.c @@ -94,9 +94,6 @@ VALUE get_fun(VALUE self, VALUE name){ //TODO - This function does not appear to be working correctly void r_finalize(void) { - unsigned char buf[1024]; - char * tmpdir; - R_dot_Last(); R_gc(); /* Remove any remaining R objects from memory */ } From 38f87adce2cc5c799648569e155c8b9b40e25937 Mon Sep 17 00:00:00 2001 From: Jon Wilkes Date: Wed, 11 Jun 2014 16:33:08 -0700 Subject: [PATCH 16/20] Eliminate gcc warning. This also simplifies --with-R-dir handling from b80d4410. --- ext/extconf.rb | 4 ++-- ext/rsruby.c | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ext/extconf.rb b/ext/extconf.rb index a0312f5..d3691e5 100644 --- a/ext/extconf.rb +++ b/ext/extconf.rb @@ -29,8 +29,8 @@ File.open("config.h", "w") do |f| f.puts("#ifndef R_CONFIG_H") f.puts("#define R_CONFIG_H") - r_home = $configure_args.has_key?('--with-R-dir') ? $configure_args['--with-R-dir'].inspect : 'NULL' - f.puts("#define RSRUBY_R_HOME #{r_home}") + r_home = $configure_args['--with-R-dir'] + f.puts("#define RSRUBY_R_HOME \"#{r_home}\"") if r_home f.puts("#endif") end $extconf_h = 'config.h' diff --git a/ext/rsruby.c b/ext/rsruby.c index 50f1a43..c85e2c4 100644 --- a/ext/rsruby.c +++ b/ext/rsruby.c @@ -131,9 +131,10 @@ void init_R(int argc, char **argv){ char *defaultArgv[] = {"rsruby","-q","--vanilla"}; - if (RSRUBY_R_HOME) { - setenv("R_HOME", RSRUBY_R_HOME, 0); - } +#ifdef RSRUBY_R_HOME + setenv("R_HOME", RSRUBY_R_HOME, 0); +#endif + // Rf_initEmbeddedR(sizeof(defaultArgv) / sizeof(defaultArgv[0]), defaultArgv); Rf_initialize_R(sizeof(defaultArgv) / sizeof(defaultArgv[0]), defaultArgv); R_Interactive = TRUE; From 1541ca4b6e2157dd37da6e1bdddd5ee5ea991133 Mon Sep 17 00:00:00 2001 From: Jon Wilkes Date: Wed, 11 Jun 2014 16:38:35 -0700 Subject: [PATCH 17/20] git rm ext/Converters.o --- ext/Converters.o | Bin 62208 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ext/Converters.o diff --git a/ext/Converters.o b/ext/Converters.o deleted file mode 100644 index 5ca637f22dab52b294742567641216c0201c61d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62208 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 H{Pq6<&Jp+( From 5fb76459921a524c2c9a7a3ac5c09a10e19791f3 Mon Sep 17 00:00:00 2001 From: Jon Wilkes Date: Wed, 11 Jun 2014 17:03:12 -0700 Subject: [PATCH 18/20] Bump version to 0.5.1.1e. --- rsruby.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rsruby.gemspec b/rsruby.gemspec index ff0a89d..ebaa5a6 100644 --- a/rsruby.gemspec +++ b/rsruby.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |s| s.name = %q{rsruby} - s.version = "0.5.1.1d" + s.version = "0.5.1.1e" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Alex Gutteridge"] From 963d46c31163591bad5fcaeafb3e44c2725a04b4 Mon Sep 17 00:00:00 2001 From: Jon Wilkes Date: Thu, 12 Jun 2014 11:33:06 -0700 Subject: [PATCH 19/20] If --with-R-dir is not set, try `R RHOME`. --- ext/extconf.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ext/extconf.rb b/ext/extconf.rb index d3691e5..5ac3193 100644 --- a/ext/extconf.rb +++ b/ext/extconf.rb @@ -26,11 +26,16 @@ exit 1 end +def r_home + @r_home ||= + $configure_args['--with-R-dir'] || + %x(R RHOME 2>/dev/null).gsub(/[\r\n]/,"") +end + File.open("config.h", "w") do |f| f.puts("#ifndef R_CONFIG_H") f.puts("#define R_CONFIG_H") - r_home = $configure_args['--with-R-dir'] - f.puts("#define RSRUBY_R_HOME \"#{r_home}\"") if r_home + f.puts("#define RSRUBY_R_HOME \"#{r_home}\"") if Dir.exist?(r_home) f.puts("#endif") end $extconf_h = 'config.h' From 70a90608e5d365a5a3d56aaaab8fdf080b6977f1 Mon Sep 17 00:00:00 2001 From: Jon Wilkes Date: Thu, 12 Jun 2014 16:02:57 -0700 Subject: [PATCH 20/20] Bump version to 0.5.2. --- rsruby.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rsruby.gemspec b/rsruby.gemspec index ebaa5a6..e08e94c 100644 --- a/rsruby.gemspec +++ b/rsruby.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |s| s.name = %q{rsruby} - s.version = "0.5.1.1e" + s.version = "0.5.2" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Alex Gutteridge"]