malachite 0.0.12 → 0.0.13

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: f319b755b9c05e4ac64a06e6f0ec471b238348c5
4
- data.tar.gz: 7e8648e07455dc3c8ee001e12d03cabe120f79dd
3
+ metadata.gz: dd016a22eedcf5b977bc76ddbbccbd1cc70cf310
4
+ data.tar.gz: 53e4d8524532480053e2b4907c026bbcc312dc3a
5
5
  SHA512:
6
- metadata.gz: 5add33f74ee13f3ee771d8a927b067853e0f01555c26989a1f258846e223a8d547a98d61a3b11df675a29df8eecedd10a1176abeb2747836156c0a63ca62a8dc
7
- data.tar.gz: 1aefda396bb0a2848c2e39e6dde4150488b45cb20605b0cc52daef9e531530f273d3391e432f82f61ab3f2859de4305ace0bb9783c84e8d4e4bdf067190f4f7c
6
+ metadata.gz: 038d697e33760f5b9ea5e57d22cdc97be0e02dff985ddfeb0699fc6495d9c2a38a52b464a12ce4b82eeb9b930314a91b46438ffce216231f85ab1b4ac72cc054
7
+ data.tar.gz: d50113f159b764eba506d17790167a96eeb9419712de69030bee5306bbeb4e07b81c3022f047874efacf4317b6e173e598b7498cd4ba0ef8e2ed86e70668e36c
data/PROFILING.md ADDED
@@ -0,0 +1,10 @@
1
+ ### Profiling Malachite
2
+
3
+ 0.0263 Serializing arguments
4
+ 0.0641 Fiddle dlopen
5
+ 0.0245 Fiddle function new
6
+ 0.0978 Fiddle call + to_s
7
+ 0.0131 De-serializing response
8
+ 0.1000 UNKNOWN
9
+ ------
10
+ 0.3831 Actual total
@@ -5,5 +5,7 @@ func callXXXXXX(data *C.char) *C.char {
5
5
  if err != nil {
6
6
  return C.CString(err.Error())
7
7
  }
8
- return C.CString(Marshal(HandleXXXXXX(things)))
8
+ marshaled := C.CString(Marshal(HandleXXXXXX(things)))
9
+ defer C.free(unsafe.Pointer(marshaled))
10
+ return marshaled
9
11
  }
@@ -7,7 +7,9 @@ module Malachite
7
7
  def compile
8
8
  File.open(path_to_tmp_file(@file), 'w') do |file|
9
9
  file.puts 'package main'
10
+ file.puts '// #include <stdlib.h>'
10
11
  file.puts "import \"C\""
12
+ file.puts "import \"unsafe\""
11
13
  file.puts source_file(@file)
12
14
  file.puts exporter_boilerplate(@file)
13
15
  file.close
@@ -8,27 +8,7 @@ module Malachite
8
8
  end
9
9
 
10
10
  def call
11
- fiddle_function.call(@args).to_s
12
- end
13
-
14
- private
15
-
16
- def fiddle_function
17
- Fiddle::Function.new(open_dylib[called_method], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP)
18
- end
19
-
20
- def called_method
21
- "call#{@name.to_s.camelize}"
22
- end
23
-
24
- def open_dylib
25
- Fiddle.dlopen(shared_object_path)
26
- rescue Fiddle::DLError
27
- raise Malachite::DLError, 'Unable to open dynamic library.'
28
- end
29
-
30
- def shared_object_path
31
- Malachite::Compiler.new.compile
11
+ Malachite.from_function_cache(@name).call(@args).to_s
32
12
  end
33
13
  end
34
14
  end
@@ -0,0 +1,42 @@
1
+ module Malachite
2
+ def self.function_cache
3
+ @function_cache ||= {}
4
+ end
5
+
6
+ def self.function_cache=(cache)
7
+ @function_cache = cache
8
+ end
9
+
10
+ def self.from_function_cache(method_name)
11
+ existing_function = Malachite.function_cache[method_name]
12
+ return existing_function if existing_function.present?
13
+ Malachite.add_to_function_cache(method_name)
14
+ end
15
+
16
+ def self.add_to_function_cache(method_name)
17
+ function_cache = Malachite.function_cache
18
+ function = Malachite.fiddle_function(method_name)
19
+ function_cache[method_name] = function
20
+ Malachite.function_cache = function_cache
21
+ function
22
+ end
23
+
24
+ def self.dylib
25
+ @dylib ||= Fiddle.dlopen(Malachite.shared_object_path)
26
+ rescue Fiddle::DLError
27
+ raise Malachite::DLError, 'Unable to open dynamic library.'
28
+ end
29
+
30
+ def self.fiddle_function(method_name)
31
+ call_method = Malachite.called_method(method_name)
32
+ Fiddle::Function.new(Malachite.dylib[call_method], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP)
33
+ end
34
+
35
+ def self.called_method(method_name)
36
+ "call#{method_name.to_s.camelize}"
37
+ end
38
+
39
+ def self.shared_object_path
40
+ @so_path ||= Malachite::Compiler.new.compile
41
+ end
42
+ end
@@ -1,6 +1,6 @@
1
1
  package main
2
- import "encoding/json"
3
2
  import "C"
3
+ import "encoding/json"
4
4
 
5
5
  func main() {}
6
6
 
@@ -1,3 +1,3 @@
1
1
  module Malachite
2
- VERSION = '0.0.12'
2
+ VERSION = '0.0.13'
3
3
  end
data/lib/malachite.rb CHANGED
@@ -5,6 +5,7 @@ require 'json'
5
5
  require 'fiddle'
6
6
 
7
7
  require 'malachite/errors'
8
+ require 'malachite/function_cache'
8
9
  require 'malachite/function'
9
10
  require 'malachite/client'
10
11
  require 'malachite/file_compiler'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: malachite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zack Hubert
@@ -61,6 +61,7 @@ extra_rdoc_files: []
61
61
  files:
62
62
  - ".gitignore"
63
63
  - Gemfile
64
+ - PROFILING.md
64
65
  - README.md
65
66
  - Rakefile
66
67
  - lib/malachite.rb
@@ -70,6 +71,7 @@ files:
70
71
  - lib/malachite/exporter.go.tmpl
71
72
  - lib/malachite/file_compiler.rb
72
73
  - lib/malachite/function.rb
74
+ - lib/malachite/function_cache.rb
73
75
  - lib/malachite/main.go.tmpl
74
76
  - lib/malachite/railtie.rb
75
77
  - lib/malachite/tasks.rb