ghazel-ffi_gen 1.3.1 → 1.3.3

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: 01d9a31a03b353773ac55436aceb61ed358db558
4
- data.tar.gz: b1bc130c65b38f4cc1932198bed025608765cdde
3
+ metadata.gz: 43bc6326ee11945bede82eb49c7481a27217099a
4
+ data.tar.gz: fa9c1dcff4c9cc46df121774b78a3de43908df8b
5
5
  SHA512:
6
- metadata.gz: e8a2ec67c9d5d03610b6567d5bfa877f88a4f01dfd7dc7d8346874af55a9274a9c89c87b771d6791267331a7d31d36f525969b294d52ebf45d670a7e56d5f66f
7
- data.tar.gz: 69d90f9cf9ada7339e33e4ddebf7e847b26421f9814d6bccfccd419ec52968f00996cf9f94d9b0ecdb6a032b02fbe6f12eb363dd8d5de358cb06d05edb0973d4
6
+ metadata.gz: 22209a392916602e57e97af4f5577c53c4ba81d2d9b8a8baf4b7a8ef9330df791bf18ec8e1a0c68801a00e9d320aa9002f87cbd992f630ffecb9b8fdec66abe4
7
+ data.tar.gz: f85eef1eedd50c1f337f6d3d0df92d95498992d2d728069fb0603ece080f51eb55f3258fab0c9bf1fc9e40d762aa939aa87620518be15c419c1bf2acae429a85
data/lib/ffi_gen.rb CHANGED
@@ -230,9 +230,10 @@ class FFIGen
230
230
  end
231
231
 
232
232
  class PointerType < Type
233
- attr_reader :pointee_name, :depth
233
+ attr_reader :pointee_type, :pointee_name, :depth
234
234
 
235
- def initialize(pointee_name, depth)
235
+ def initialize(pointee_type, pointee_name, depth)
236
+ @pointee_type = pointee_type
236
237
  @pointee_name = pointee_name
237
238
  @depth = depth
238
239
  end
@@ -677,7 +678,8 @@ class FFIGen
677
678
  break
678
679
  end
679
680
  end
680
- type = PointerType.new pointee_name, pointer_depth
681
+ pointee_type = resolve_type current_type
682
+ type = PointerType.new pointee_type, pointee_name, pointer_depth
681
683
  end
682
684
 
683
685
  type
@@ -693,7 +695,7 @@ class FFIGen
693
695
  when :unexposed, :function_proto
694
696
  UnknownType.new
695
697
  when :incomplete_array
696
- PointerType.new resolve_type(Clang.get_array_element_type(canonical_type)).name, 1
698
+ ArrayType.new resolve_type(Clang.get_array_element_type(canonical_type)), nil
697
699
  else
698
700
  raise NotImplementedError, "No translation for values of type #{canonical_type[:kind]}"
699
701
  end
File without changes
@@ -4,7 +4,7 @@ class FFIGen
4
4
  writer.puts "// Generated by ffi_gen. Please do not change this file by hand.", "import java.util.*;", "import com.sun.jna.*;", "import java.lang.annotation.*;", "import java.lang.reflect.Method;", "", "public class #{@module_name} {"
5
5
  writer.indent do
6
6
  writer.puts "private static #{@module_name}Interface INSTANCE = #{@module_name}Interface.JnaInstanceCreator.createInstance();"
7
- writer.puts "", *IO.readlines(File.join(File.dirname(__FILE__), "java_enum.java")).map(&:rstrip), ""
7
+ writer.puts "", *IO.readlines(File.join(File.dirname(__FILE__), "java_static.java")).map(&:rstrip), ""
8
8
 
9
9
  declarations.each do |declaration|
10
10
  if declaration.respond_to? :write_static_java
@@ -17,7 +17,7 @@ class FFIGen
17
17
 
18
18
  writer.puts "private interface #{@module_name}Interface extends Library {"
19
19
  writer.indent do
20
- writer.puts "", *IO.readlines(File.join(File.dirname(__FILE__), "java_pre.java")).map(&:rstrip), ""
20
+ writer.puts "", *IO.readlines(File.join(File.dirname(__FILE__), "java_interface.java")).map(&:rstrip), ""
21
21
  writer.puts "static class JnaInstanceCreator {"
22
22
  writer.indent do
23
23
  writer.puts "private static #{@module_name}Interface createInstance() {"
@@ -165,23 +165,49 @@ class FFIGen
165
165
  def write_static_java(writer)
166
166
  return if @is_callback # not yet supported
167
167
 
168
+ replace = {}
169
+ parameters = []
170
+ lp = nil
171
+ @parameters.each do |p|
172
+ if lp && lp[:type].is_a?(PointerType) && lp[:type].pointee_type.clang_type == :u_char && p[:type].clang_type == :u_long
173
+ n = lp[:name].to_java_downcase
174
+ replace[n] = "bytesToPointer(#{n})"
175
+ replace[p[:name].to_java_downcase] = "#{n}.length";
176
+ d = lp.dup
177
+ d[:type] = ArrayType.new(lp[:type].pointee_type, nil)
178
+ parameters << d
179
+ lp = nil
180
+ else
181
+ if lp
182
+ parameters << lp
183
+ end
184
+ lp = p
185
+ end
186
+ end
187
+ if lp
188
+ parameters << lp
189
+ end
190
+
168
191
  writer.comment do
169
192
  writer.write_description @function_description
170
193
  writer.puts "", "<em>This entry is only for documentation and no real method.</em>" if @is_callback
171
- writer.puts "", "@method #{@is_callback ? "_callback_#{java_name}_" : java_name}(#{@parameters.map{ |parameter| parameter[:name].to_java_downcase }.join(', ')})"
172
- @parameters.each do |parameter|
194
+ writer.puts "", "@method #{@is_callback ? "_callback_#{java_name}_" : java_name}(#{parameters.map{ |parameter| parameter[:name].to_java_downcase }.join(', ')})"
195
+ parameters.each do |parameter|
173
196
  writer.write_description parameter[:description], false, "@param [#{parameter[:type].java_description}] #{parameter[:name].to_java_downcase} ", " "
174
197
  end
175
198
  writer.write_description @return_value_description, false, "@return [#{@return_type.java_description}] ", " "
176
199
  writer.puts "@scope class"
177
200
  end
178
201
 
179
- args = @parameters.map{ |parameter| parameter[:name].to_java_downcase }.join(', ')
180
- jna_signature = "#{@parameters.map{ |parameter| "#{parameter[:type].java_jna_type} #{parameter[:name].to_java_downcase}" }.join(', ')}"
202
+ args = @parameters.map{ |parameter|
203
+ n = parameter[:name].to_java_downcase
204
+ replace[n] || n
205
+ }.join(', ')
206
+ jna_signature = "#{parameters.map{ |parameter| "#{parameter[:type].java_jna_type} #{parameter[:name].to_java_downcase}" }.join(', ')}"
181
207
  writer.puts "static #{@return_type.java_jna_type} #{java_name}(#{jna_signature}) {"
182
208
  writer.indent do
183
209
  call = "INSTANCE.#{java_name}(#{args});"
184
- if @return_type.respond_to? :no_return and @return_type.no_return
210
+ if @return_type.respond_to? :clang_type and @return_type.clang_type == :void
185
211
  writer.puts call
186
212
  else
187
213
  writer.puts "return #{call}"
@@ -225,6 +251,8 @@ class FFIGen
225
251
  end
226
252
 
227
253
  class PrimitiveType
254
+ attr_accessor :clang_type
255
+
228
256
  def java_name
229
257
  case @clang_type
230
258
  when :void
@@ -256,10 +284,6 @@ class FFIGen
256
284
  when :double then "double"
257
285
  end
258
286
  end
259
-
260
- def no_return
261
- @clang_type == :void
262
- end
263
287
  end
264
288
 
265
289
  class StringType
@@ -303,7 +327,7 @@ class FFIGen
303
327
 
304
328
  def java_jna_type
305
329
  if @constant_size
306
- raise
330
+ "#{@element_type.java_jna_type}[#{@constant_size}]"
307
331
  else
308
332
  "#{@element_type.java_jna_type}[]"
309
333
  end
@@ -0,0 +1,9 @@
1
+ interface NativeEnum {
2
+ public int toNativeInt();
3
+ }
4
+
5
+ static Pointer bytesToPointer(byte[] b) {
6
+ Pointer p = new Memory(b.length);
7
+ p.write(0, b, 0, b.length);
8
+ return p;
9
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ghazel-ffi_gen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Musiol
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-26 00:00:00.000000000 Z
11
+ date: 2015-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -38,8 +38,8 @@ files:
38
38
  - LICENSE
39
39
  - README.md
40
40
  - lib/ffi_gen/empty.h
41
- - lib/ffi_gen/java_pre.java
42
- - lib/ffi_gen/java_enum.java
41
+ - lib/ffi_gen/java_interface.java
42
+ - lib/ffi_gen/java_static.java
43
43
  homepage: https://github.com/neelance/ffi_gen
44
44
  licenses:
45
45
  - MIT
@@ -1,3 +0,0 @@
1
- interface NativeEnum {
2
- public int toNativeInt();
3
- }