julia 0.2.0 → 0.3.0.dev
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +11 -2
- data/README.md +1 -2
- data/RbCall.jl/src/RbCall.jl +191 -0
- data/RbCall.jl/src/conversion.jl +56 -0
- data/ext/julia/julia.c +27 -3
- data/ext/julia/julia_internal.h +132 -20
- data/ext/julia/libjulia.c +32 -146
- data/ext/julia/rbcall.c +66 -0
- data/ext/julia/value_ptr.c +49 -0
- data/julia.gemspec +11 -4
- data/lib/julia.rb +3 -3
- data/lib/julia/init.rb +37 -17
- data/lib/julia/version.rb +7 -1
- metadata +20 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6c14a8233ff0a3579610180d5696f5f7647a05a821103e90d2f29c38e5cc5c4
|
4
|
+
data.tar.gz: 2d8acdb2742ec06e627b2b0f1614aec7597a274380221dcc4973ed14c959a7c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 154d08d7ff8c9f75689034a0d0996a499daf1081d1d35e806d730faba824512e2fcbaee056d104676b1cbd3e590e2dd91dd34c2ef56164bef330928f9ea6fdb7
|
7
|
+
data.tar.gz: 010f472ce30703557beb5035d611c1a81b083d995680a8438c882c92beed3b9ea24bc1c58d3de7a67442c1d44df004cd4095b492bee262b32cffaf29dc172f67
|
data/.travis.yml
CHANGED
@@ -1,4 +1,13 @@
|
|
1
|
+
dist: xenial
|
1
2
|
language: ruby
|
2
3
|
rvm:
|
3
|
-
-
|
4
|
-
|
4
|
+
- ruby-head
|
5
|
+
- 2.6
|
6
|
+
- 2.5
|
7
|
+
- 2.4
|
8
|
+
- 2.3
|
9
|
+
before_install:
|
10
|
+
- wget -O /tmp/julia.tar.gz https://julialang-s3.julialang.org/bin/linux/x64/1.1/julia-1.1.0-linux-x86_64.tar.gz
|
11
|
+
- sudo mkdir /usr/local/julia
|
12
|
+
- sudo tar xf /tmp/julia.tar.gz -C /usr/local/julia --strip-components=1
|
13
|
+
- export PATH="/usr/local/julia/bin:$PATH"
|
data/README.md
CHANGED
@@ -0,0 +1,191 @@
|
|
1
|
+
__precompile__()
|
2
|
+
|
3
|
+
module RbCall
|
4
|
+
|
5
|
+
export _refcnt, _incref, _decref, gc_guard_references
|
6
|
+
|
7
|
+
#########################################################################
|
8
|
+
# prepare
|
9
|
+
|
10
|
+
import Libdl
|
11
|
+
|
12
|
+
struct Dl_info
|
13
|
+
dli_fname::Ptr{UInt8}
|
14
|
+
dli_fbase::Ptr{Cvoid}
|
15
|
+
dli_sname::Ptr{UInt8}
|
16
|
+
dli_saddr::Ptr{Cvoid}
|
17
|
+
end
|
18
|
+
|
19
|
+
hassym(lib, sym) = Libdl.dlsym_e(lib, sym) != C_NULL
|
20
|
+
|
21
|
+
proc_handle = unsafe_load(cglobal(:jl_exe_handle, Ptr{Cvoid}))
|
22
|
+
|
23
|
+
symbols_present = false
|
24
|
+
@static if Sys.iswindows()
|
25
|
+
# TODO support windows
|
26
|
+
else
|
27
|
+
global symbols_present = hassym(proc_handle, :rb_define_class)
|
28
|
+
end
|
29
|
+
|
30
|
+
if !symbols_present
|
31
|
+
# TODO load libruby dynamically
|
32
|
+
else
|
33
|
+
@static if Sys.iswindows()
|
34
|
+
# TODO support windows
|
35
|
+
else
|
36
|
+
libruby_handle = proc_handle
|
37
|
+
# Now determine the name of the ruby library that these symbols are from
|
38
|
+
some_address_in_libruby = Libdl.dlsym(libruby_handle, :rb_define_class)
|
39
|
+
some_address_in_main_exe = Libdl.dlsym_e(proc_handle, Sys.isapple() ? :_mh_execute_header : :main)
|
40
|
+
if some_address_in_main_exe == nothing
|
41
|
+
# NOTE: we cannot get main symbol from ruby executable in travis-ci
|
42
|
+
some_address_in_main_exe = Libdl.dlsym_e(proc_handle, :_start)
|
43
|
+
end
|
44
|
+
dlinfo1 = Ref{Dl_info}()
|
45
|
+
dlinfo2 = Ref{Dl_info}()
|
46
|
+
ccall(:dladdr, Cint, (Ptr{Cvoid}, Ptr{Dl_info}), some_address_in_libruby, dlinfo1)
|
47
|
+
ccall(:dladdr, Cint, (Ptr{Cvoid}, Ptr{Dl_info}), some_address_in_main_exe, dlinfo2)
|
48
|
+
if dlinfo1[].dli_fbase == dlinfo2[].dli_fbase
|
49
|
+
const libruby = nothing
|
50
|
+
else
|
51
|
+
const libruby = unsafe_string(dlinfo1[].dli_fname)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
#########################################################################
|
57
|
+
# basic types
|
58
|
+
|
59
|
+
@static if sizeof(Clong) == sizeof(Ptr{Cvoid})
|
60
|
+
const VALUE = Culong
|
61
|
+
const SVALUE = Clong
|
62
|
+
const ID = Culong
|
63
|
+
const Cintptr_t = Clong
|
64
|
+
const Cuintptr_t = Culong
|
65
|
+
elseif sizeof(Clonglong) == sizeof(Ptr{Cvoid})
|
66
|
+
const VALUE = Culonglong
|
67
|
+
const SVALUE = Clonglong
|
68
|
+
const ID = Culonglong
|
69
|
+
const Cintptr_t = Clonglong
|
70
|
+
const Cuintptr_t = Culonglong
|
71
|
+
else
|
72
|
+
error("ruby requires sizeof(Ptr{Cvoid}) == sizeof(Clong) or sizeof(Clonglong) to be compiled.")
|
73
|
+
end
|
74
|
+
|
75
|
+
struct RBasic_struct
|
76
|
+
flags::VALUE
|
77
|
+
klass::VALUE
|
78
|
+
end
|
79
|
+
|
80
|
+
struct RVALUE_struct
|
81
|
+
basic::RBasic_struct
|
82
|
+
v1::VALUE
|
83
|
+
v2::VALUE
|
84
|
+
v3::VALUE
|
85
|
+
end
|
86
|
+
|
87
|
+
const RbPtr = Ptr{RVALUE_struct}
|
88
|
+
|
89
|
+
#########################################################################
|
90
|
+
# basic constants
|
91
|
+
|
92
|
+
const RUBY_FIXNUM_MAX = typemax(Clong) >> 1
|
93
|
+
const RUBY_FIXNUM_MIN = typemin(Clong) >> 1
|
94
|
+
|
95
|
+
@static if sizeof(VALUE) >= sizeof(Cdouble)
|
96
|
+
const RUBY_USE_FLONUM = true
|
97
|
+
else
|
98
|
+
const RUBY_USE_FLONUM = false
|
99
|
+
error("currently RbCall.jl only supports Ruby with flonum.")
|
100
|
+
end
|
101
|
+
|
102
|
+
@static if RUBY_USE_FLONUM
|
103
|
+
const RUBY_Qfalse = 0x00
|
104
|
+
const RUBY_Qtrue = 0x14
|
105
|
+
const RUBY_Qnil = 0x08
|
106
|
+
const RUBY_Qundef = 0x34
|
107
|
+
const RUBY_IMMEDIATE_MASK = 0x07
|
108
|
+
const RUBY_FIXNUM_FLAG = 0x01
|
109
|
+
const RUBY_FLONUM_MASK = 0x03
|
110
|
+
const RUBY_FLONUM_FLAG = 0x02
|
111
|
+
const RUBY_SYMBOL_FLAG = 0x0c
|
112
|
+
else
|
113
|
+
const RUBY_Qfalse = 0
|
114
|
+
const RUBY_Qtrue = 2
|
115
|
+
const RUBY_Qnil = 4
|
116
|
+
const RUBY_Qundef = 6
|
117
|
+
const RUBY_IMMEDIATE_MASK = 0x03
|
118
|
+
const RUBY_FIXNUM_FLAG = 0x01
|
119
|
+
const RUBY_FLONUM_MASK = 0x00
|
120
|
+
const RUBY_FLONUM_FLAG = 0x02
|
121
|
+
const RUBY_SYMBOL_FLAG = 0x0e
|
122
|
+
end
|
123
|
+
const RUBY_SPECIAL_SHIFT = 8
|
124
|
+
|
125
|
+
#########################################################################
|
126
|
+
# basic utilities
|
127
|
+
|
128
|
+
RB_FIXNUM_P(v::VALUE) = (x & RUBY_FIXNUM_FLAG) != 0
|
129
|
+
RB_POSFIXABLE(x::Integer) = x <= RUBY_FIXNUM_MAX
|
130
|
+
RB_NEGFIXABLE(x::Integer) = x >= RUBY_FIXNUM_MIN
|
131
|
+
RB_FIXABLE(x::Integer) = RB_POSFIXABLE(x) && RB_NEGFIXABLE(x)
|
132
|
+
|
133
|
+
RB_INT2FIX(i::Integer) = (VALUE(i) << 1) | RUBY_FIXNUM_FLAG
|
134
|
+
RB_LONG2FIX(i::Clong) = RB_INT2FIX(i)
|
135
|
+
|
136
|
+
function RB_LONG2NUM(i::Clong)
|
137
|
+
if RB_FIXABLE(i)
|
138
|
+
return RB_LONG2FIX(i)
|
139
|
+
else
|
140
|
+
return ccall(:rb_int2big, VALUE, (Cintptr_t,), Cintptr_t(i))
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
function RB_ULONG2NUM(i::Culong)
|
145
|
+
if RB_POSFIXABLE(i)
|
146
|
+
return RB_LONG2FIX(Clong(i))
|
147
|
+
else
|
148
|
+
return ccall(:rb_uint2big, VALUE, (Cuintptr_t,), Cuintptr_t(i))
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
RB_LL2NUM(i::Clonglong) = ccall(:rb_ll2inum, VALUE, (Clonglong,), i)
|
153
|
+
RB_ULL2NUM(i::Culonglong) = ccall(:rb_ull2inum, VALUE, (Culonglong,), i)
|
154
|
+
|
155
|
+
DBL2NUM(d::Cdouble) = ccall(:rb_float_new, VALUE, (Cdouble,), d)
|
156
|
+
|
157
|
+
HAVE_RB_DBL_COMPLEX_NEW = hassym(libruby_handle, :rb_dbl_complex_new)
|
158
|
+
|
159
|
+
#########################################################################
|
160
|
+
# conversion
|
161
|
+
|
162
|
+
include("conversion.jl")
|
163
|
+
|
164
|
+
#########################################################################
|
165
|
+
# gc
|
166
|
+
|
167
|
+
const gc_guard_references = Dict{Any,Clong}()
|
168
|
+
|
169
|
+
function _refcnt(value::Any)
|
170
|
+
return get(gc_guard_references, value , 0)
|
171
|
+
end
|
172
|
+
|
173
|
+
function _incref(value::Any)
|
174
|
+
gc_guard_references[value] = _refcnt(value) + 1
|
175
|
+
return value
|
176
|
+
end
|
177
|
+
|
178
|
+
function _decref(value::Any)
|
179
|
+
if haskey(gc_guard_references, value)
|
180
|
+
new_count = _refcnt(value) - 1
|
181
|
+
if new_count == 0
|
182
|
+
delete!(gc_guard_references, value)
|
183
|
+
else
|
184
|
+
gc_guard_references[value] = new_count
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
#########################################################################
|
190
|
+
|
191
|
+
end # module RbCall
|
@@ -0,0 +1,56 @@
|
|
1
|
+
convert(::Type{VALUE}, ::Nothing) = RUBY_Qnil
|
2
|
+
|
3
|
+
convert(::Type{VALUE}, b::Bool) = b ? RUBY_Qtrue : RUBY_Qfalse
|
4
|
+
|
5
|
+
convert(::Type{VALUE}, i::Int8) = RB_INT2FIX(Cint(i))
|
6
|
+
convert(::Type{VALUE}, i::UInt8) = RB_INT2FIX(Cint(i))
|
7
|
+
convert(::Type{VALUE}, i::Int16) = RB_INT2FIX(Cint(i))
|
8
|
+
convert(::Type{VALUE}, i::UInt16) = RB_INT2FIX(Cint(i))
|
9
|
+
convert(::Type{VALUE}, i::Int32) = RB_LONG2NUM(Clong(i))
|
10
|
+
convert(::Type{VALUE}, i::UInt32) = RB_ULONG2NUM(Culong(i))
|
11
|
+
|
12
|
+
if sizeof(Clong) == sizeof(Int64)
|
13
|
+
convert(::Type{VALUE}, i::Int64) = RB_LONG2NUM(Clong(i))
|
14
|
+
convert(::Type{VALUE}, i::UInt64) = RB_ULONG2NUM(Culong(i))
|
15
|
+
else
|
16
|
+
convert(::Type{VALUE}, i::Int64) = RB_LL2NUM(Clonglong(i))
|
17
|
+
convert(::Type{VALUE}, i::UInt64) = RB_ULL2NUM(Culonglong(i))
|
18
|
+
end
|
19
|
+
|
20
|
+
if sizeof(Clonglong) == sizeof(Int128)
|
21
|
+
convert(::Type{VALUE}, i::Int128) = RB_LL2NUM(Clonglong(i))
|
22
|
+
convert(::Type{VALUE}, i::UInt128) = RB_ULL2NUM(Culonglong(i))
|
23
|
+
end
|
24
|
+
|
25
|
+
function convert(::Type{VALUE}, i::Integer)
|
26
|
+
# TODO convert to Bignum
|
27
|
+
return RUBY_Qnil
|
28
|
+
end
|
29
|
+
|
30
|
+
convert(::Type{VALUE}, d::Union{Float64,Float32}) = DBL2NUM(Cdouble(d))
|
31
|
+
|
32
|
+
if HAVE_RB_DBL_COMPLEX_NEW
|
33
|
+
function convert(::Type{VALUE}, c::Union{ComplexF64,ComplexF32})
|
34
|
+
c64 = ComplexF64(c)
|
35
|
+
return ccall(:rb_dbl_complex_new, VALUE, (Cdouble, Cdouble), real(c64), imag(c64))
|
36
|
+
end
|
37
|
+
else
|
38
|
+
function convert(::Type{VALUE}, c::Union{ComplexF64,ComplexF32})
|
39
|
+
c64 = ComplexF64(c)
|
40
|
+
return ccall(:rb_complex_new, VALUE, (VALUE, VALUE),
|
41
|
+
convert(VALUE, real(c64)), convert(VALUE, imag(c64)))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
function convert(::Type{VALUE}, s::AbstractString)
|
46
|
+
sb = String(s)
|
47
|
+
return ccall(:rb_utf8_str_new, VALUE, (Cstring, Clong), sb, sizeof(sb))
|
48
|
+
end
|
49
|
+
|
50
|
+
# TODO
|
51
|
+
convert(::Type{VALUE}, ::Any) = RUBY_Qnil
|
52
|
+
|
53
|
+
function convert_to_ruby(value::Any)
|
54
|
+
rbobj = convert(VALUE, value)
|
55
|
+
return rbobj
|
56
|
+
end
|
data/ext/julia/julia.c
CHANGED
@@ -1,6 +1,27 @@
|
|
1
1
|
#include "julia_internal.h"
|
2
2
|
|
3
|
-
VALUE
|
3
|
+
VALUE rbjl_mJulia;
|
4
|
+
|
5
|
+
void
|
6
|
+
rbjl_check_julia_exception(const char *message)
|
7
|
+
{
|
8
|
+
jl_function_t *sprint;
|
9
|
+
jl_function_t *showerror;
|
10
|
+
|
11
|
+
jl_value_t *error = JULIA_API(jl_exception_occurred)();
|
12
|
+
if (!error) return;
|
13
|
+
|
14
|
+
JULIA_API(jl_exception_clear)();
|
15
|
+
|
16
|
+
sprint = (jl_function_t *)JULIA_API(jl_eval_string)("sprint");
|
17
|
+
showerror = (jl_function_t *)JULIA_API(jl_eval_string)("showerror");
|
18
|
+
|
19
|
+
jl_value_t *res = JULIA_API(jl_call2)(sprint, showerror, error);
|
20
|
+
if (res && jl_is_string(res)) {
|
21
|
+
const char * c_str = JULIA_API(jl_string_ptr)(res);
|
22
|
+
rb_raise(rb_eRuntimeError, "JuliaError: %s (%s)", c_str, message);
|
23
|
+
}
|
24
|
+
}
|
4
25
|
|
5
26
|
static void
|
6
27
|
init_julia(void)
|
@@ -11,9 +32,12 @@ init_julia(void)
|
|
11
32
|
void
|
12
33
|
Init_julia(void)
|
13
34
|
{
|
14
|
-
|
35
|
+
rbjl_mJulia = rb_define_module("Julia");
|
15
36
|
|
16
|
-
|
37
|
+
rbjl_init_libjulia();
|
17
38
|
|
18
39
|
init_julia();
|
40
|
+
|
41
|
+
rbjl_init_rbcall();
|
42
|
+
rbjl_init_value_ptr();
|
19
43
|
}
|
data/ext/julia/julia_internal.h
CHANGED
@@ -21,9 +21,34 @@ extern "C" {
|
|
21
21
|
# error ---->> ruby requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
|
22
22
|
#endif
|
23
23
|
|
24
|
+
/* from src/support/htable.h */
|
25
|
+
|
26
|
+
#define HT_N_INLINE 32
|
27
|
+
|
28
|
+
typedef struct {
|
29
|
+
size_t size;
|
30
|
+
void **table;
|
31
|
+
void *_space[HT_N_INLINE];
|
32
|
+
} htable_t;
|
33
|
+
|
34
|
+
/* from src/support/arraylist.h */
|
35
|
+
|
36
|
+
#define AL_N_INLINE 29
|
37
|
+
|
38
|
+
typedef struct {
|
39
|
+
size_t len;
|
40
|
+
size_t max;
|
41
|
+
void **items;
|
42
|
+
void *_space[AL_N_INLINE];
|
43
|
+
} arraylist_t;
|
44
|
+
|
45
|
+
/* from src/julia.h */
|
46
|
+
|
24
47
|
typedef struct _jl_value_t jl_value_t;
|
25
48
|
typedef struct _jl_taggedvalue_t jl_taggedvalue_t;
|
26
49
|
|
50
|
+
typedef jl_value_t jl_function_t;
|
51
|
+
|
27
52
|
typedef struct _jl_sym_t {
|
28
53
|
JL_DATA_TYPE
|
29
54
|
struct _jl_sym_t *left;
|
@@ -80,25 +105,55 @@ typedef struct _jl_datatype_t {
|
|
80
105
|
void *ditype;
|
81
106
|
} jl_datatype_t;
|
82
107
|
|
83
|
-
struct
|
108
|
+
typedef struct {
|
109
|
+
uint64_t hi;
|
110
|
+
uint64_t lo;
|
111
|
+
} jl_uuid_t;
|
112
|
+
|
113
|
+
typedef struct _jl_module_t {
|
114
|
+
JL_DATA_TYPE
|
115
|
+
jl_sym_t *name;
|
116
|
+
struct _jl_module_t *parent;
|
117
|
+
htable_t bindings;
|
118
|
+
arraylist_t usings; // modules with all bindings potentially imported
|
119
|
+
uint64_t build_id;
|
120
|
+
jl_uuid_t uuid;
|
121
|
+
size_t primary_world;
|
122
|
+
uint32_t counter;
|
123
|
+
int32_t nospecialize; // global bit flags: initialization for new methods
|
124
|
+
uint8_t istopmod;
|
125
|
+
} jl_module_t;
|
126
|
+
|
127
|
+
struct rbjl_api_table {
|
84
128
|
int (* jl_is_initialized)(void);
|
85
129
|
void (* jl_init)(void);
|
86
130
|
char const * (* jl_ver_string)(void);
|
87
|
-
jl_datatype_t
|
88
|
-
jl_datatype_t
|
89
|
-
jl_datatype_t
|
90
|
-
jl_datatype_t
|
91
|
-
jl_datatype_t
|
92
|
-
jl_datatype_t
|
93
|
-
jl_datatype_t
|
94
|
-
jl_datatype_t
|
95
|
-
jl_datatype_t
|
96
|
-
jl_datatype_t
|
97
|
-
jl_datatype_t
|
98
|
-
jl_datatype_t
|
99
|
-
jl_datatype_t
|
100
|
-
jl_datatype_t
|
131
|
+
jl_datatype_t **jl_bool_type;
|
132
|
+
jl_datatype_t **jl_char_type;
|
133
|
+
jl_datatype_t **jl_string_type;
|
134
|
+
jl_datatype_t **jl_int8_type;
|
135
|
+
jl_datatype_t **jl_uint8_type;
|
136
|
+
jl_datatype_t **jl_int16_type;
|
137
|
+
jl_datatype_t **jl_uint16_type;
|
138
|
+
jl_datatype_t **jl_int32_type;
|
139
|
+
jl_datatype_t **jl_uint32_type;
|
140
|
+
jl_datatype_t **jl_int64_type;
|
141
|
+
jl_datatype_t **jl_uint64_type;
|
142
|
+
jl_datatype_t **jl_float16_type;
|
143
|
+
jl_datatype_t **jl_float32_type;
|
144
|
+
jl_datatype_t **jl_float64_type;
|
145
|
+
jl_datatype_t **jl_module_type;
|
146
|
+
|
147
|
+
jl_module_t **jl_main_module;
|
148
|
+
jl_module_t **jl_base_module;
|
149
|
+
|
150
|
+
jl_value_t * (* jl_call1)(jl_function_t *f, jl_value_t *a);
|
151
|
+
jl_value_t * (* jl_call2)(jl_function_t *f, jl_value_t *a, jl_value_t *b);
|
152
|
+
jl_value_t * (* jl_exception_occurred)(void);
|
153
|
+
void (* jl_exception_clear)(void);
|
101
154
|
jl_value_t * (* jl_eval_string)(const char *str);
|
155
|
+
jl_value_t * (* jl_get_global)(jl_module_t *m, jl_sym_t *var);
|
156
|
+
jl_sym_t * (* jl_symbol)(const char *str);
|
102
157
|
jl_value_t * (* jl_typeof)(jl_value_t *v);
|
103
158
|
const char * (* jl_typeof_str)(jl_value_t *v);
|
104
159
|
const char * (* jl_string_ptr)(jl_value_t *s);
|
@@ -113,13 +168,70 @@ struct julia_api_table {
|
|
113
168
|
uint64_t (* jl_unbox_uint64)(jl_value_t *v);
|
114
169
|
float (* jl_unbox_float32)(jl_value_t *v);
|
115
170
|
double (* jl_unbox_float64)(jl_value_t *v);
|
171
|
+
void * (* jl_unbox_voidpointer)(jl_value_t *v);
|
116
172
|
};
|
117
173
|
|
118
|
-
struct
|
119
|
-
#define JULIA_API(name) (
|
174
|
+
struct rbjl_api_table *rbjl_get_api_table(void);
|
175
|
+
#define JULIA_API(name) (rbjl_get_api_table()->name)
|
176
|
+
|
177
|
+
#define jl_typeis(v,t) (JULIA_API(jl_typeof)(v)==(jl_value_t*)(t))
|
178
|
+
|
179
|
+
// basic predicates -----------------------------------------------------------
|
180
|
+
#define jl_is_nothing(v) (((jl_value_t*)(v)) == ((jl_value_t*)jl_nothing))
|
181
|
+
#define jl_is_tuple(v) (((jl_datatype_t*)JULIA_API(jl_typeof)(v))->name == *JULIA_API(jl_tuple_typename))
|
182
|
+
#define jl_is_svec(v) jl_typeis(v,*JULIA_API(jl_simplevector_type))
|
183
|
+
#define jl_is_simplevector(v) jl_is_svec(v)
|
184
|
+
#define jl_is_datatype(v) jl_typeis(v,*JULIA_API(jl_datatype_type))
|
185
|
+
#define jl_is_mutable(t) (((jl_datatype_t*)t)->mutabl)
|
186
|
+
#define jl_is_mutable_datatype(t) (jl_is_datatype(t) && (((jl_datatype_t*)t)->mutabl))
|
187
|
+
#define jl_is_immutable(t) (!((jl_datatype_t*)t)->mutabl)
|
188
|
+
#define jl_is_immutable_datatype(t) (jl_is_datatype(t) && (!((jl_datatype_t*)t)->mutabl))
|
189
|
+
#define jl_is_uniontype(v) jl_typeis(v,*JULIA_API(jl_uniontype_type))
|
190
|
+
#define jl_is_typevar(v) jl_typeis(v,*JULIA_API(jl_tvar_type))
|
191
|
+
#define jl_is_unionall(v) jl_typeis(v,*JULIA_API(jl_unionall_type))
|
192
|
+
#define jl_is_typename(v) jl_typeis(v,*JULIA_API(jl_typename_type))
|
193
|
+
#define jl_is_int8(v) jl_typeis(v,*JULIA_API(jl_int8_type))
|
194
|
+
#define jl_is_int16(v) jl_typeis(v,*JULIA_API(jl_int16_type))
|
195
|
+
#define jl_is_int32(v) jl_typeis(v,*JULIA_API(jl_int32_type))
|
196
|
+
#define jl_is_int64(v) jl_typeis(v,*JULIA_API(jl_int64_type))
|
197
|
+
#define jl_is_uint8(v) jl_typeis(v,*JULIA_API(jl_uint8_type))
|
198
|
+
#define jl_is_uint16(v) jl_typeis(v,*JULIA_API(jl_uint16_type))
|
199
|
+
#define jl_is_uint32(v) jl_typeis(v,*JULIA_API(jl_uint32_type))
|
200
|
+
#define jl_is_uint64(v) jl_typeis(v,*JULIA_API(jl_uint64_type))
|
201
|
+
#define jl_is_float32(v) jl_typeis(v,*JULIA_API(jl_float32_type))
|
202
|
+
#define jl_is_float64(v) jl_typeis(v,*JULIA_API(jl_float64_type))
|
203
|
+
#define jl_is_bool(v) jl_typeis(v,*JULIA_API(jl_bool_type))
|
204
|
+
#define jl_is_symbol(v) jl_typeis(v,*JULIA_API(jl_sym_type))
|
205
|
+
#define jl_is_method_instance(v) jl_typeis(v,*JULIA_API(jl_method_instance_type))
|
206
|
+
#define jl_is_method(v) jl_typeis(v,*JULIA_API(jl_method_type))
|
207
|
+
#define jl_is_module(v) jl_typeis(v,*JULIA_API(jl_module_type))
|
208
|
+
#define jl_is_string(v) jl_typeis(v,*JULIA_API(jl_string_type))
|
209
|
+
/*#define jl_is_cpointer(v) jl_is_cpointer_type(jl_typeof(v))*/
|
210
|
+
/*#define jl_is_pointer(v) jl_is_cpointer_type(jl_typeof(v))*/
|
211
|
+
|
212
|
+
static inline jl_function_t *
|
213
|
+
jl_get_function(jl_module_t *m, const char *name)
|
214
|
+
{
|
215
|
+
return (jl_function_t*)JULIA_API(jl_get_global)(m, JULIA_API(jl_symbol)(name));
|
216
|
+
}
|
217
|
+
|
218
|
+
void rbjl_check_julia_exception(const char *message);
|
219
|
+
|
220
|
+
void rbjl_init_libjulia(void);
|
221
|
+
void rbjl_init_rbcall(void);
|
222
|
+
void rbjl_init_value_ptr(void);
|
223
|
+
|
224
|
+
VALUE rbjl_rbcall_convert_to_ruby(jl_value_t *value);
|
225
|
+
void rbjl_rbcall_incref(jl_value_t *value);
|
226
|
+
void rbjl_rbcall_decref(jl_value_t *value);
|
227
|
+
long rbjl_rbcall_refcnt(jl_value_t *jlobj);
|
228
|
+
|
229
|
+
VALUE rbjl_value_ptr_new(jl_value_t *value);
|
230
|
+
|
231
|
+
extern VALUE rbjl_mJulia;
|
232
|
+
extern VALUE rbjl_mLibJulia;
|
233
|
+
extern VALUE rbjl_cJuliaValuePtr;
|
120
234
|
|
121
|
-
|
235
|
+
extern jl_module_t *rbjl_rbcall_module;
|
122
236
|
|
123
|
-
extern VALUE julia_mJulia;
|
124
|
-
extern VALUE julia_mLibJulia;
|
125
237
|
#endif /* JULIA_INTERNAL_H */
|
data/ext/julia/libjulia.c
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
#include "julia_internal.h"
|
2
2
|
|
3
|
-
VALUE
|
4
|
-
VALUE
|
5
|
-
struct
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
struct julia_api_table *
|
10
|
-
julia_get_api_table(void)
|
3
|
+
VALUE rbjl_mLibJulia;
|
4
|
+
VALUE rbjl_eAPINotFound;
|
5
|
+
struct rbjl_api_table api_table;
|
6
|
+
|
7
|
+
struct rbjl_api_table *
|
8
|
+
rbjl_get_api_table(void)
|
11
9
|
{
|
12
10
|
return &api_table;
|
13
11
|
}
|
@@ -44,7 +42,7 @@ init_api_table(VALUE handle)
|
|
44
42
|
#define INIT_API_TABLE_ENTRY2(member_name, api_name) do { \
|
45
43
|
void *fptr = LOOKUP_API_ENTRY(api_name); \
|
46
44
|
if (!fptr) { \
|
47
|
-
rb_raise(
|
45
|
+
rb_raise(rbjl_eAPINotFound, "Unable to find the required symbol in libjulia: %s", #api_name); \
|
48
46
|
} \
|
49
47
|
((api_table).member_name) = fptr; \
|
50
48
|
} while (0)
|
@@ -74,6 +72,17 @@ init_api_table(VALUE handle)
|
|
74
72
|
INIT_API_TABLE_ENTRY(jl_float16_type);
|
75
73
|
INIT_API_TABLE_ENTRY(jl_float32_type);
|
76
74
|
INIT_API_TABLE_ENTRY(jl_float64_type);
|
75
|
+
INIT_API_TABLE_ENTRY(jl_module_type);
|
76
|
+
|
77
|
+
INIT_API_TABLE_ENTRY(jl_main_module);
|
78
|
+
INIT_API_TABLE_ENTRY(jl_base_module);
|
79
|
+
|
80
|
+
INIT_API_TABLE_ENTRY(jl_call1);
|
81
|
+
INIT_API_TABLE_ENTRY(jl_call2);
|
82
|
+
INIT_API_TABLE_ENTRY(jl_exception_occurred);
|
83
|
+
INIT_API_TABLE_ENTRY(jl_exception_clear);
|
84
|
+
INIT_API_TABLE_ENTRY(jl_get_global);
|
85
|
+
INIT_API_TABLE_ENTRY(jl_symbol);
|
77
86
|
INIT_API_TABLE_ENTRY(jl_eval_string);
|
78
87
|
INIT_API_TABLE_ENTRY(jl_typeof);
|
79
88
|
INIT_API_TABLE_ENTRY(jl_typeof_str);
|
@@ -89,160 +98,37 @@ init_api_table(VALUE handle)
|
|
89
98
|
INIT_API_TABLE_ENTRY(jl_unbox_uint64);
|
90
99
|
INIT_API_TABLE_ENTRY(jl_unbox_float32);
|
91
100
|
INIT_API_TABLE_ENTRY(jl_unbox_float64);
|
92
|
-
|
93
|
-
|
94
|
-
int
|
95
|
-
jl_typeis(jl_value_t *v, jl_datatype_t *t){
|
96
|
-
return ((jl_typename_t *)JULIA_API(jl_typeof)(v) == t->name);
|
97
|
-
}
|
98
|
-
|
99
|
-
int
|
100
|
-
jl_is_bool(jl_value_t *v)
|
101
|
-
{
|
102
|
-
return jl_typeis(v, JULIA_API(jl_bool_type));
|
103
|
-
}
|
104
|
-
|
105
|
-
int
|
106
|
-
jl_is_char(jl_value_t *v)
|
107
|
-
{
|
108
|
-
return jl_typeis(v, JULIA_API(jl_char_type));
|
109
|
-
}
|
110
|
-
|
111
|
-
int
|
112
|
-
jl_is_string(jl_value_t *v)
|
113
|
-
{
|
114
|
-
return jl_typeis(v, JULIA_API(jl_string_type));
|
115
|
-
}
|
116
|
-
|
117
|
-
int
|
118
|
-
jl_is_int8(jl_value_t *v)
|
119
|
-
{
|
120
|
-
return jl_typeis(v, JULIA_API(jl_int8_type));
|
121
|
-
}
|
122
|
-
|
123
|
-
int
|
124
|
-
jl_is_uint8(jl_value_t *v)
|
125
|
-
{
|
126
|
-
return jl_typeis(v, JULIA_API(jl_uint8_type));
|
127
|
-
}
|
128
|
-
|
129
|
-
int
|
130
|
-
jl_is_int16(jl_value_t *v)
|
131
|
-
{
|
132
|
-
return jl_typeis(v, JULIA_API(jl_int16_type));
|
133
|
-
}
|
134
|
-
|
135
|
-
int
|
136
|
-
jl_is_uint16(jl_value_t *v)
|
137
|
-
{
|
138
|
-
return jl_typeis(v, JULIA_API(jl_uint16_type));
|
139
|
-
}
|
140
|
-
|
141
|
-
int
|
142
|
-
jl_is_int32(jl_value_t *v)
|
143
|
-
{
|
144
|
-
return jl_typeis(v, JULIA_API(jl_int32_type));
|
145
|
-
}
|
146
|
-
|
147
|
-
int
|
148
|
-
jl_is_uint32(jl_value_t *v)
|
149
|
-
{
|
150
|
-
return jl_typeis(v, JULIA_API(jl_uint32_type));
|
151
|
-
}
|
152
|
-
|
153
|
-
int
|
154
|
-
jl_is_int64(jl_value_t *v)
|
155
|
-
{
|
156
|
-
return jl_typeis(v, JULIA_API(jl_int64_type));
|
157
|
-
}
|
158
|
-
|
159
|
-
int
|
160
|
-
jl_is_uint64(jl_value_t *v)
|
161
|
-
{
|
162
|
-
return jl_typeis(v, JULIA_API(jl_uint64_type));
|
163
|
-
}
|
164
|
-
|
165
|
-
int
|
166
|
-
jl_is_float16(jl_value_t *v)
|
167
|
-
{
|
168
|
-
return jl_typeis(v, JULIA_API(jl_float16_type));
|
169
|
-
}
|
170
|
-
|
171
|
-
int
|
172
|
-
jl_is_float32(jl_value_t *v)
|
173
|
-
{
|
174
|
-
return jl_typeis(v, JULIA_API(jl_float32_type));
|
175
|
-
}
|
176
|
-
|
177
|
-
int
|
178
|
-
jl_is_float64(jl_value_t *v)
|
179
|
-
{
|
180
|
-
return jl_typeis(v, JULIA_API(jl_float64_type));
|
101
|
+
INIT_API_TABLE_ENTRY(jl_unbox_voidpointer);
|
181
102
|
}
|
182
103
|
|
183
104
|
static VALUE
|
184
|
-
jl_eval_string(VALUE handle, VALUE arg)
|
105
|
+
jl_eval_string(VALUE handle, VALUE arg, VALUE raw_p)
|
185
106
|
{
|
186
107
|
Check_Type(arg, T_STRING);
|
187
|
-
ans = JULIA_API(jl_eval_string)(StringValuePtr(arg));
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
ans_bool = JULIA_API(jl_unbox_bool)(ans);
|
193
|
-
if (ans_bool == 1){
|
194
|
-
return Qtrue;
|
195
|
-
}else{
|
196
|
-
return Qfalse;
|
197
|
-
}
|
198
|
-
}
|
199
|
-
if (jl_is_int8(ans)) {
|
200
|
-
return INT2NUM(JULIA_API(jl_unbox_int8)(ans));
|
201
|
-
}
|
202
|
-
if (jl_is_uint8(ans)) {
|
203
|
-
return INT2NUM(JULIA_API(jl_unbox_uint8)(ans));
|
204
|
-
}
|
205
|
-
if (jl_is_int16(ans)) {
|
206
|
-
return INT2NUM(JULIA_API(jl_unbox_int16)(ans));
|
207
|
-
}
|
208
|
-
if (jl_is_uint16(ans)) {
|
209
|
-
return INT2NUM(JULIA_API(jl_unbox_uint16)(ans));
|
210
|
-
}
|
211
|
-
if (jl_is_int32(ans)) {
|
212
|
-
return INT2NUM(JULIA_API(jl_unbox_int32)(ans));
|
213
|
-
}
|
214
|
-
if (jl_is_uint32(ans)) {
|
215
|
-
return INT2NUM(JULIA_API(jl_unbox_uint32)(ans));
|
216
|
-
}
|
217
|
-
if (jl_is_int64(ans)) {
|
218
|
-
return INT2NUM(JULIA_API(jl_unbox_int64)(ans));
|
219
|
-
}
|
220
|
-
if (jl_is_uint64(ans)) {
|
221
|
-
return INT2NUM(JULIA_API(jl_unbox_uint64)(ans));
|
222
|
-
}
|
223
|
-
if (jl_is_float32(ans)) {
|
224
|
-
return DBL2NUM(JULIA_API(jl_unbox_float32)(ans));
|
225
|
-
}
|
226
|
-
if (jl_is_float64(ans)) {
|
227
|
-
return DBL2NUM(JULIA_API(jl_unbox_float64)(ans));
|
108
|
+
jl_value_t *ans = JULIA_API(jl_eval_string)(StringValuePtr(arg));
|
109
|
+
rbjl_check_julia_exception("LibJulia.eval_string");
|
110
|
+
|
111
|
+
if (RTEST(raw_p)) {
|
112
|
+
return rbjl_value_ptr_new(ans);
|
228
113
|
}
|
229
|
-
|
114
|
+
|
115
|
+
return rbjl_rbcall_convert_to_ruby(ans);
|
230
116
|
}
|
231
117
|
|
232
118
|
static void
|
233
119
|
define_JULIA_VERSION(void)
|
234
120
|
{
|
235
121
|
char const *version = JULIA_API(jl_ver_string)();
|
236
|
-
rb_define_const(
|
122
|
+
rb_define_const(rbjl_mLibJulia, "JULIA_VERSION", rb_usascii_str_new_static(version, strlen(version)));
|
237
123
|
}
|
238
124
|
|
239
125
|
void
|
240
|
-
|
126
|
+
rbjl_init_libjulia(void)
|
241
127
|
{
|
242
128
|
VALUE handle;
|
243
|
-
|
244
|
-
handle = rb_funcall(
|
245
|
-
rb_define_module_function(
|
129
|
+
rbjl_mLibJulia = rb_const_get_at(rbjl_mJulia, rb_intern("LibJulia"));
|
130
|
+
handle = rb_funcall(rbjl_mLibJulia, rb_intern("handle"), 0);
|
131
|
+
rb_define_module_function(rbjl_mLibJulia, "jl_eval_string", jl_eval_string, 2);
|
246
132
|
init_api_table(handle);
|
247
133
|
|
248
134
|
if (JULIA_API(jl_is_initialized)() == 0) {
|
data/ext/julia/rbcall.c
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
#include "julia_internal.h"
|
2
|
+
|
3
|
+
jl_module_t *rbjl_rbcall_module;
|
4
|
+
|
5
|
+
static jl_function_t *convert_to_ruby_function;
|
6
|
+
static jl_function_t *incref_function;
|
7
|
+
static jl_function_t *decref_function;
|
8
|
+
static jl_function_t *refcnt_function;
|
9
|
+
|
10
|
+
VALUE
|
11
|
+
rbjl_rbcall_convert_to_ruby(jl_value_t *jlobj)
|
12
|
+
{
|
13
|
+
jl_value_t *ans = JULIA_API(jl_call1)(convert_to_ruby_function, jlobj);
|
14
|
+
rbjl_check_julia_exception("rbjl_rbcall_convert_to_ruby");
|
15
|
+
return (VALUE)JULIA_API(jl_unbox_voidpointer)(ans);
|
16
|
+
}
|
17
|
+
|
18
|
+
void
|
19
|
+
rbjl_rbcall_incref(jl_value_t *jlobj)
|
20
|
+
{
|
21
|
+
(void)JULIA_API(jl_call1)(incref_function, jlobj);
|
22
|
+
}
|
23
|
+
|
24
|
+
void
|
25
|
+
rbjl_rbcall_decref(jl_value_t *jlobj)
|
26
|
+
{
|
27
|
+
(void)JULIA_API(jl_call1)(decref_function, jlobj);
|
28
|
+
}
|
29
|
+
|
30
|
+
long
|
31
|
+
rbjl_rbcall_refcnt(jl_value_t *jlobj)
|
32
|
+
{
|
33
|
+
jl_value_t *res = JULIA_API(jl_call1)(refcnt_function, jlobj);
|
34
|
+
/* TODO: exception handling */
|
35
|
+
if (jl_is_int32(res)) {
|
36
|
+
return JULIA_API(jl_unbox_int32)(res);
|
37
|
+
}
|
38
|
+
else if (jl_is_int64(res)) {
|
39
|
+
return JULIA_API(jl_unbox_int64)(res);
|
40
|
+
}
|
41
|
+
|
42
|
+
return -1;
|
43
|
+
}
|
44
|
+
|
45
|
+
void
|
46
|
+
rbjl_init_rbcall(void)
|
47
|
+
{
|
48
|
+
VALUE rbcall_dir = rb_ivar_get(rbjl_mJulia, rb_intern("@rbcall_dir"));
|
49
|
+
StringValue(rbcall_dir);
|
50
|
+
|
51
|
+
VALUE include_rbcall = rb_sprintf("Base.include(Main, \"%"PRIsVALUE"/src/RbCall.jl\")", rbcall_dir);
|
52
|
+
const char *include_rbcall_cstr = StringValueCStr(include_rbcall);
|
53
|
+
(void)JULIA_API(jl_eval_string)(include_rbcall_cstr);
|
54
|
+
rbjl_check_julia_exception("include RbCall.jl");
|
55
|
+
|
56
|
+
jl_module_t *main_module = *JULIA_API(jl_main_module);
|
57
|
+
jl_value_t *rbcall_module = JULIA_API(jl_get_global)(main_module, JULIA_API(jl_symbol)("RbCall"));
|
58
|
+
if (!rbcall_module || !jl_is_module(rbcall_module)) {
|
59
|
+
rb_raise(rb_eRuntimeError, "RbCall is not a module");
|
60
|
+
}
|
61
|
+
rbjl_rbcall_module = (jl_module_t *)rbcall_module;
|
62
|
+
convert_to_ruby_function = jl_get_function(rbjl_rbcall_module, "convert_to_ruby");
|
63
|
+
incref_function = jl_get_function(rbjl_rbcall_module, "_incref");
|
64
|
+
decref_function = jl_get_function(rbjl_rbcall_module, "_decref");
|
65
|
+
refcnt_function = jl_get_function(rbjl_rbcall_module, "_refcnt");
|
66
|
+
}
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#include "julia_internal.h"
|
2
|
+
|
3
|
+
VALUE rbjl_cJuliaValuePtr;
|
4
|
+
|
5
|
+
static void
|
6
|
+
rbjl_value_ptr_free(void *ptr)
|
7
|
+
{
|
8
|
+
jl_value_t *jlobj = ptr;
|
9
|
+
rbjl_rbcall_decref(jlobj);
|
10
|
+
}
|
11
|
+
|
12
|
+
static size_t
|
13
|
+
rbjl_value_ptr_memsize(void const *ptr)
|
14
|
+
{
|
15
|
+
/* FIXME */
|
16
|
+
return 0;
|
17
|
+
}
|
18
|
+
|
19
|
+
const rb_data_type_t rbjl_value_ptr_data_type = {
|
20
|
+
"Julia::ValuePtr",
|
21
|
+
{ 0, rbjl_value_ptr_free, rbjl_value_ptr_memsize, },
|
22
|
+
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
23
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
24
|
+
#endif
|
25
|
+
};
|
26
|
+
|
27
|
+
VALUE
|
28
|
+
rbjl_value_ptr_new(jl_value_t *jlobj)
|
29
|
+
{
|
30
|
+
VALUE rbobj = TypedData_Wrap_Struct(rbjl_cJuliaValuePtr, &rbjl_value_ptr_data_type, jlobj);
|
31
|
+
rbjl_rbcall_incref(jlobj);
|
32
|
+
return rbobj;
|
33
|
+
}
|
34
|
+
|
35
|
+
static VALUE
|
36
|
+
value_ptr_refcnt(VALUE self)
|
37
|
+
{
|
38
|
+
jl_value_t *value;
|
39
|
+
TypedData_Get_Struct(self, jl_value_t, &rbjl_value_ptr_data_type, value);
|
40
|
+
long refcnt = rbjl_rbcall_refcnt(value);
|
41
|
+
return LONG2NUM(refcnt);
|
42
|
+
}
|
43
|
+
|
44
|
+
void
|
45
|
+
rbjl_init_value_ptr(void)
|
46
|
+
{
|
47
|
+
rbjl_cJuliaValuePtr = rb_define_class_under(rbjl_mJulia, "ValuePtr", rb_cData);
|
48
|
+
rb_define_method(rbjl_cJuliaValuePtr, "__refcnt__", value_ptr_refcnt, 0);
|
49
|
+
}
|
data/julia.gemspec
CHANGED
@@ -5,9 +5,15 @@ require 'julia/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "julia"
|
8
|
-
|
8
|
+
version_components = [
|
9
|
+
Julia::Version::MAJOR.to_s,
|
10
|
+
Julia::Version::MINOR.to_s,
|
11
|
+
Julia::Version::MICRO.to_s,
|
12
|
+
Julia::Version::TAG,
|
13
|
+
]
|
14
|
+
spec.version = version_components.compact.join(".")
|
9
15
|
spec.authors = ["Kenta Murata"]
|
10
|
-
spec.email = ["mrkn@
|
16
|
+
spec.email = ["mrkn@mrkn.jp"]
|
11
17
|
|
12
18
|
spec.summary = 'Julia on Ruby'
|
13
19
|
spec.description = 'Julia on Ruby'
|
@@ -21,11 +27,12 @@ Gem::Specification.new do |spec|
|
|
21
27
|
spec.bindir = "exe"
|
22
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
29
|
spec.require_paths = ["lib"]
|
30
|
+
spec.extensions = ["ext/julia/extconf.rb"]
|
24
31
|
|
25
|
-
spec.add_development_dependency "bundler", "
|
32
|
+
spec.add_development_dependency "bundler", ">= 1.17.2"
|
26
33
|
spec.add_development_dependency "pry"
|
27
34
|
spec.add_development_dependency "pry-byebug"
|
28
|
-
spec.add_development_dependency "rake"
|
35
|
+
spec.add_development_dependency "rake"
|
29
36
|
spec.add_development_dependency "rake-compiler"
|
30
37
|
spec.add_development_dependency "rspec"
|
31
38
|
end
|
data/lib/julia.rb
CHANGED
@@ -5,8 +5,8 @@ module Julia
|
|
5
5
|
|
6
6
|
module_function
|
7
7
|
|
8
|
-
def eval(str)
|
9
|
-
Julia.init unless
|
10
|
-
LibJulia.jl_eval_string(str)
|
8
|
+
def eval(str, raw: false)
|
9
|
+
Julia.init unless defined? Julia::JULIA_VERSION
|
10
|
+
LibJulia.jl_eval_string(str, raw)
|
11
11
|
end
|
12
12
|
end
|
data/lib/julia/init.rb
CHANGED
@@ -1,34 +1,43 @@
|
|
1
1
|
module Julia
|
2
2
|
def self.const_missing(name)
|
3
3
|
case name
|
4
|
-
when :JULIA_VERSION
|
5
|
-
Julia.init
|
6
|
-
const_get(name)
|
7
|
-
else
|
8
|
-
super
|
4
|
+
when :JULIA_VERSION, :ValuePtr
|
5
|
+
return const_get(name) if Julia.init
|
9
6
|
end
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.method_missing(*args)
|
11
|
+
return send(*args) if Julia.init
|
12
|
+
super
|
10
13
|
end
|
11
14
|
|
12
15
|
module LibJulia
|
13
16
|
def self.const_missing(name)
|
14
17
|
case name
|
15
18
|
when :JULIA_VERSION
|
16
|
-
Julia.init
|
17
|
-
const_get(name)
|
18
|
-
else
|
19
|
-
super
|
19
|
+
return const_get(name) if Julia.init
|
20
20
|
end
|
21
|
+
super
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.method_missing(*args)
|
25
|
+
return send(*args) if Julia.init
|
26
|
+
super
|
21
27
|
end
|
22
28
|
end
|
23
29
|
|
30
|
+
def self.initialized?
|
31
|
+
@initialized
|
32
|
+
end
|
33
|
+
|
24
34
|
def self.init(julia = ENV['JULIA'])
|
25
|
-
return false if
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
35
|
+
return false if initialized?
|
36
|
+
|
37
|
+
require 'pathname'
|
38
|
+
top_dir = Pathname(__dir__).parent.parent
|
39
|
+
rbcall_dir = top_dir / "RbCall.jl"
|
40
|
+
Julia.instance_variable_set :@rbcall_dir, rbcall_dir.to_s
|
32
41
|
|
33
42
|
LibJulia.instance_variable_set :@handle, LibJulia::Finder.find_libjulia(julia)
|
34
43
|
class << LibJulia
|
@@ -44,6 +53,17 @@ module Julia
|
|
44
53
|
end
|
45
54
|
|
46
55
|
const_set(:JULIA_VERSION, LibJulia::JULIA_VERSION)
|
47
|
-
|
56
|
+
|
57
|
+
class << Julia
|
58
|
+
remove_method :const_missing
|
59
|
+
remove_method :method_missing
|
60
|
+
end
|
61
|
+
|
62
|
+
class << Julia::LibJulia
|
63
|
+
remove_method :const_missing
|
64
|
+
remove_method :method_missing
|
65
|
+
end
|
66
|
+
|
67
|
+
@initialized = true
|
48
68
|
end
|
49
69
|
end
|
data/lib/julia/version.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: julia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0.dev
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenta Murata
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.17.2
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.17.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pry
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake-compiler
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -96,9 +96,10 @@ dependencies:
|
|
96
96
|
version: '0'
|
97
97
|
description: Julia on Ruby
|
98
98
|
email:
|
99
|
-
- mrkn@
|
99
|
+
- mrkn@mrkn.jp
|
100
100
|
executables: []
|
101
|
-
extensions:
|
101
|
+
extensions:
|
102
|
+
- ext/julia/extconf.rb
|
102
103
|
extra_rdoc_files: []
|
103
104
|
files:
|
104
105
|
- ".gitignore"
|
@@ -108,6 +109,8 @@ files:
|
|
108
109
|
- LICENSE.txt
|
109
110
|
- README.md
|
110
111
|
- Rakefile
|
112
|
+
- RbCall.jl/src/RbCall.jl
|
113
|
+
- RbCall.jl/src/conversion.jl
|
111
114
|
- bin/console
|
112
115
|
- bin/setup
|
113
116
|
- examples/pkg_status.rb
|
@@ -115,6 +118,8 @@ files:
|
|
115
118
|
- ext/julia/julia.c
|
116
119
|
- ext/julia/julia_internal.h
|
117
120
|
- ext/julia/libjulia.c
|
121
|
+
- ext/julia/rbcall.c
|
122
|
+
- ext/julia/value_ptr.c
|
118
123
|
- julia.gemspec
|
119
124
|
- lib/julia.rb
|
120
125
|
- lib/julia/error.rb
|
@@ -140,12 +145,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
140
145
|
version: '0'
|
141
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
147
|
requirements:
|
143
|
-
- - "
|
148
|
+
- - ">"
|
144
149
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
150
|
+
version: 1.3.1
|
146
151
|
requirements: []
|
147
|
-
|
148
|
-
rubygems_version: 2.7.6
|
152
|
+
rubygems_version: 3.0.2
|
149
153
|
signing_key:
|
150
154
|
specification_version: 4
|
151
155
|
summary: Julia on Ruby
|