rust_require 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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