rust_require 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4bc920f52a113f72975ec221fca1fb106493c481
4
- data.tar.gz: c2217f4c5a0abcca147ec2c05deb321c25e728eb
3
+ metadata.gz: 5a3163feda277069a1e4aaaebc61c95fb3e8f851
4
+ data.tar.gz: df216541319d78028d4bb3f63dd57a99ec7684d7
5
5
  SHA512:
6
- metadata.gz: 0145328db7639bb2535230934fdf1848e0a684245e31cd6a9ca6066483a64d47fb14f556d34c20ad61f0d7dcddfecd6e516486dda87598338555150631c39441
7
- data.tar.gz: 466cd131e3527f9f5877735a94f291544f468eaa0772f43412a8ef80c4078ac7a8b509c23481721a98e2abf419b68ac5d4365067eda990752c96cbc51f388cea
6
+ metadata.gz: 439bcf99dbcd0f22c975b91c2359bc79498ca2fe0ca73e8c1d95012bfa36777f85cfb212d163d96570ad47dbc6b189733444a797415871a5cf705a4b50295a92
7
+ data.tar.gz: 3a56fc6b74bf27b9d9c254486638a8189f7c44e24665f1b41f6afb2b309a56533c14f42dbfbc1b9b825630dbf7769af5d5fdecaf2590ca01fb47dcaa347bc2c8
@@ -27,7 +27,7 @@ module Rust
27
27
  w << generate_fns(mod['fn_headers'], submod_string)
28
28
  end
29
29
 
30
- # Generates wrapper fns for fn_headers (String)
30
+ # Generates wrapper fns for fn_headers (String)
31
31
  def generate_fns(fn_headers, submod_string)
32
32
  fn_headers.map do |fn|
33
33
  WrapperFn.new(submod_string + fn['name'], fn['inputs'], fn['output']).to_s
@@ -28,9 +28,10 @@ module Rust
28
28
  end
29
29
 
30
30
  attach_fns(rust_module['fn_headers'], mod, mod_string)
31
+ attach_structs(rust_module['structs'], mod)
31
32
  end
32
33
 
33
- # attaches items via FFI to mod
34
+ # attaches fns via FFI to mod
34
35
  def attach_fns(fn_headers, mod, mod_string)
35
36
  # add ffi and the rust lib to mod
36
37
  mod.extend FFI::Library
@@ -68,5 +69,20 @@ module Rust
68
69
  end
69
70
  end
70
71
  end
72
+
73
+ # attaches structs via FFI to mod
74
+ def attach_structs(struct_defs, mod)
75
+ struct_defs.each do |s|
76
+ fields = s['fields'].map do |name, type|
77
+ type = Rust::Types.find_type(type)
78
+ [name.to_sym, type.ffi_output_type]
79
+ end.flatten
80
+
81
+ struct = Class.new(FFI::Struct)
82
+ struct.layout *fields
83
+
84
+ mod.const_set(s['name'], struct)
85
+ end
86
+ end
71
87
  end
72
88
  end
@@ -5,7 +5,7 @@ module Rust
5
5
  SOURCE_ANALYZER = Gem::Specification.find_by_name('rust_require').full_gem_path + '/ext/source_analyzer/lib/libsource_analyzer.so'
6
6
 
7
7
  # default rustc command
8
- RUSTC_CMD = 'rustc --crate-type dylib -A dead_code'
8
+ RUSTC_CMD = 'rustc --crate-type dylib -A dead_code -A unused_features'
9
9
 
10
10
  # @output_path: output path for library generated by Rustc
11
11
  attr_accessor :output_path
@@ -35,9 +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 #FIXME: if this proves to be unnecessary remove it
38
+ # add necessary extern crate definitions
39
39
  f << <<-SRC
40
-
40
+ #![feature(alloc)]
41
41
  SRC
42
42
 
43
43
  # add the actual file content
@@ -70,7 +70,7 @@ module Rust
70
70
  File.open(@input_path, "r") { |input| f << input.read }
71
71
  end
72
72
 
73
- # use the lint to just parse the file (no output)
73
+ # use the lint to just parse the file (no code generation)
74
74
  print `RUST_REQUIRE_FILE=#{@info_file_path} #{RUSTC_CMD} -Z no-trans -L #{File.dirname(@input_path)} -L #{File.dirname(SOURCE_ANALYZER)} #{@tempfile}`
75
75
  raise "rust compiler error" if $? != 0
76
76
 
@@ -1,3 +1,5 @@
1
+ # deactivated for now, maybe reactivated later with explicit conversion
2
+
1
3
  module Rust
2
4
  module Types
3
5
  class String < Type
@@ -17,7 +19,19 @@ module Rust
17
19
  <<-CODE
18
20
  {
19
21
  let mut #{name} = #{name};
20
- #{name}.shrink_to_fit();
22
+
23
+ // deallocate unused capacity if any
24
+ if #{name}.len() != #{name}.capacity() {
25
+ unsafe {
26
+ let ptr = #{name}.as_mut_vec().as_mut_ptr();
27
+ std::rt::heap::deallocate(
28
+ ptr.offset(#{name}.len() as isize),
29
+ #{name}.capacity() - #{name}.len(),
30
+ std::mem::min_align_of::<u8>()
31
+ );
32
+ }
33
+ }
34
+
21
35
  let tuple = (#{name}.as_ptr(), #{name}.len());
22
36
  std::mem::forget(#{name});
23
37
  tuple
@@ -72,6 +86,7 @@ module Rust
72
86
  str.encode!(Encoding::UTF_8)
73
87
  len = str.bytesize
74
88
  start = FFI::MemoryPointer.from_string(str)
89
+ start.autorelease = false # no GC
75
90
  Rust::Slice.from(start.address, len)
76
91
  end
77
92
  end
@@ -1 +1 @@
1
- VERSION = "0.2.1"
1
+ VERSION = "0.2.2"
data/lib/rust_require.rb CHANGED
@@ -15,7 +15,9 @@ require_relative 'rust_require/ruby_wrapper_generator.rb'
15
15
 
16
16
  # Types
17
17
  require_relative 'rust_require/types/primitives.rb'
18
- require_relative 'rust_require/types/string.rb'
18
+
19
+ # deactivated for now, maybe reactivated later with explicit conversion
20
+ # require_relative 'rust_require/types/string.rb'
19
21
 
20
22
  class Module
21
23
  def rust_require(file)
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.1
4
+ version: 0.2.2
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-13 00:00:00.000000000 Z
11
+ date: 2015-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi