rust_require 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rust_require/rustc.rb +2 -4
- data/lib/rust_require/types/primitives.rb +65 -8
- data/lib/rust_require/types/string.rb +3 -3
- data/lib/rust_require/version.rb +1 -3
- data/lib/rust_require.rb +4 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4bc920f52a113f72975ec221fca1fb106493c481
|
4
|
+
data.tar.gz: c2217f4c5a0abcca147ec2c05deb321c25e728eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0145328db7639bb2535230934fdf1848e0a684245e31cd6a9ca6066483a64d47fb14f556d34c20ad61f0d7dcddfecd6e516486dda87598338555150631c39441
|
7
|
+
data.tar.gz: 466cd131e3527f9f5877735a94f291544f468eaa0772f43412a8ef80c4078ac7a8b509c23481721a98e2abf419b68ac5d4365067eda990752c96cbc51f388cea
|
data/lib/rust_require/rustc.rb
CHANGED
@@ -35,11 +35,9 @@ module Rust
|
|
35
35
|
gen = CWrapperGenerator.new(info_file)
|
36
36
|
|
37
37
|
File.open(@tempfile, "w+") do |f|
|
38
|
-
# add necessary extern crate definitions
|
38
|
+
# add necessary extern crate definitions #FIXME: if this proves to be unnecessary remove it
|
39
39
|
f << <<-SRC
|
40
|
-
|
41
|
-
#![feature(libc,cstr_to_str)]
|
42
|
-
extern crate libc;
|
40
|
+
|
43
41
|
SRC
|
44
42
|
|
45
43
|
# add the actual file content
|
@@ -16,25 +16,68 @@ module Rust
|
|
16
16
|
@rust_type = "bool"
|
17
17
|
end
|
18
18
|
|
19
|
-
class
|
20
|
-
|
21
|
-
|
19
|
+
class PrimitiveInteger < Type
|
20
|
+
def initialize
|
21
|
+
@bits = self.class.bits
|
22
|
+
@signed = self.class.signed
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.bits; @bits; end
|
27
|
+
def self.signed; @signed; end
|
28
|
+
|
29
|
+
def rust_type_regex
|
30
|
+
@rust_type ? super : /.^/ # will never match
|
31
|
+
end
|
32
|
+
|
33
|
+
def type_check(num)
|
34
|
+
bounds = if @signed
|
35
|
+
(-2**(@bits-1)+1)..(2**(@bits-1)-1)
|
36
|
+
else
|
37
|
+
0..(2**@bits-1)
|
38
|
+
end
|
39
|
+
|
40
|
+
raise ArgumentError, "#{num.inspect} is no integer." unless [Fixnum, Bignum].include? num.class
|
41
|
+
raise ArgumentError, "#{num} is not in the expected input range #{bounds}" unless bounds.include? num
|
42
|
+
end
|
43
|
+
|
44
|
+
def ruby_input_conversion(num)
|
45
|
+
type_check(num)
|
46
|
+
num
|
47
|
+
end
|
22
48
|
end
|
23
49
|
|
24
|
-
class Usize <
|
50
|
+
class Usize < PrimitiveInteger
|
25
51
|
@rust_type = "usize"
|
26
|
-
|
52
|
+
@bits = FFI::Pointer.size * 8
|
53
|
+
@signed = false
|
54
|
+
|
55
|
+
def ffi_type; :ulong; end
|
27
56
|
end
|
28
57
|
|
29
|
-
|
58
|
+
class Isize < PrimitiveInteger
|
59
|
+
@rust_type = "isize"
|
60
|
+
@bits = FFI::Pointer.size * 8
|
61
|
+
@signed = true
|
62
|
+
|
63
|
+
def ffi_type; :long; end
|
64
|
+
end
|
65
|
+
|
66
|
+
# metaprogramming!!
|
30
67
|
%w[8 16 32 64].each do |x|
|
31
|
-
usize = Class.new(
|
68
|
+
usize = Class.new(PrimitiveInteger) do
|
69
|
+
@bits = x.to_i
|
70
|
+
@signed = false
|
32
71
|
@rust_type = "u#{x}"
|
72
|
+
|
33
73
|
def ffi_type; rust_type.sub('u', 'uint').to_sym; end
|
34
74
|
end
|
35
75
|
|
36
|
-
isize = Class.new(
|
76
|
+
isize = Class.new(PrimitiveInteger) do
|
37
77
|
@rust_type = "i#{x}"
|
78
|
+
@bits = x.to_i
|
79
|
+
@signed = true
|
80
|
+
|
38
81
|
def ffi_type; rust_type.sub('i', 'int').to_sym; end
|
39
82
|
end
|
40
83
|
|
@@ -51,11 +94,25 @@ module Rust
|
|
51
94
|
def c_output_conversion(name); "#{name} as f64"; end
|
52
95
|
|
53
96
|
def ffi_type; :double; end
|
97
|
+
|
98
|
+
def ruby_input_conversion(float)
|
99
|
+
bounds = -3.4028234663852886e+38 .. 3.4028234663852886e+38
|
100
|
+
raise ArgumentError, "#{float.inspect} is no Float." unless float.is_a? Float
|
101
|
+
raise ArgumentError, "#{float} is not in the expected input range #{bounds}" unless bounds.include? float
|
102
|
+
float
|
103
|
+
end
|
54
104
|
end
|
55
105
|
|
56
106
|
class F64 < Type
|
57
107
|
@rust_type = 'f64'
|
58
108
|
def ffi_type; :double; end
|
109
|
+
|
110
|
+
def ruby_input_conversion(float)
|
111
|
+
bounds = Float::MIN..Float::MAX
|
112
|
+
raise ArgumentError, "#{float.inspect} is no Float." unless float.is_a? Float
|
113
|
+
raise ArgumentError, "#{float} is not in the expected input range #{bounds}" unless bounds.include? float
|
114
|
+
float
|
115
|
+
end
|
59
116
|
end
|
60
117
|
end
|
61
118
|
end
|
@@ -47,7 +47,7 @@ module Rust
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def not_implemented
|
50
|
-
raise NotImplementedError, '&str as rust output parameter is not supported, use String instead!'
|
50
|
+
raise NotImplementedError, '&mut str/&str as rust output parameter is not supported, use String instead!'
|
51
51
|
end
|
52
52
|
|
53
53
|
def c_output_type
|
@@ -71,8 +71,8 @@ module Rust
|
|
71
71
|
def ruby_input_conversion(str)
|
72
72
|
str.encode!(Encoding::UTF_8)
|
73
73
|
len = str.bytesize
|
74
|
-
start = FFI::MemoryPointer.from_string(str)
|
75
|
-
Rust::Slice.from(start, len)
|
74
|
+
start = FFI::MemoryPointer.from_string(str)
|
75
|
+
Rust::Slice.from(start.address, len)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
end
|
data/lib/rust_require/version.rb
CHANGED
data/lib/rust_require.rb
CHANGED
@@ -3,7 +3,10 @@ require 'ffi'
|
|
3
3
|
require 'active_support/core_ext/string/inflections'
|
4
4
|
|
5
5
|
# Libs
|
6
|
-
|
6
|
+
module Rust
|
7
|
+
require_relative 'rust_require/version.rb'
|
8
|
+
end
|
9
|
+
|
7
10
|
require_relative 'rust_require/rust_require.rb'
|
8
11
|
require_relative 'rust_require/rustc.rb'
|
9
12
|
require_relative 'rust_require/types.rb'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rust_require
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Lackner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|