binaryen 1.1.6.10 → 1.1.6.12

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
  SHA256:
3
- metadata.gz: 7a03d6e05a577d6579506e64e603e11f9430bf4d4f19c4d3f5cf0e984ad78387
4
- data.tar.gz: c2995a3d92c07731d5b54b832c0d838159aebd2770dc1b4e0155bcc09ef2e7a8
3
+ metadata.gz: aeb3dcecc8a8a66da44273ff8440bb951eae7bb2abb227b754dd78e7b2b24ae4
4
+ data.tar.gz: 2154294d63c97358fdf3f1dcbd25e7afe92368d05bb3fb12299e6ffeee088420
5
5
  SHA512:
6
- metadata.gz: 01cdacd58083894fd4356f23032b00c00a4f586ac4d141742a50471228d772623027178e2b93879d9d224b3dc98fcdeb5c90374700914a7021752acbdaa78720
7
- data.tar.gz: cfddf72d19ad3922e7152ec150d1ce31a936b54f25e1638674be47d453dd808353110ec481749977bd54a78369b2db3c7331342af7ae918a9cbef447261ec3f9
6
+ metadata.gz: ff121e7ba9acbe92590726f82ea50d5f5a31e2c7c0225a973fb6f34ba22f17d2da8315666d4ab5e84482efe0cdcb685a952a0dc9062fd313a9bdcac737e81cc5
7
+ data.tar.gz: 268acda447d3979778e7c391ff659da4c798e48da5a952d021aa74761630ab62be2631970cfae12b48c4afd97442dab195c1cc7630f55efaf79842c73271654f
@@ -9,10 +9,7 @@ module Binaryen
9
9
  include POSIX::Spawn
10
10
  DEFAULT_MAX_OUTPUT_SIZE = 256 * 1024 * 1024 * 1024 # 256 MiB
11
11
  DEFAULT_TIMEOUT = 10
12
- DEFAULT_ARGS_FOR_COMMAND = {
13
- "wasm-opt" => ["--output=-"],
14
- }.freeze
15
- BUFSIZE = 32 * 1024
12
+ DEFAULT_ARGS_FOR_COMMAND = {}.freeze
16
13
 
17
14
  def initialize(cmd, timeout: DEFAULT_TIMEOUT, max_output_size: DEFAULT_MAX_OUTPUT_SIZE, ignore_missing: false)
18
15
  @cmd = command_path(cmd, ignore_missing) || raise(ArgumentError, "command not found: #{cmd}")
@@ -23,83 +20,71 @@ module Binaryen
23
20
 
24
21
  def run(*arguments, stdin: nil, stderr: nil)
25
22
  args = [@cmd] + arguments + @default_args
26
-
27
- if stdin
28
- with_stdin_tempfile(stdin) { |path| spawn_command(*args, path, stderr: stderr) }
29
- else
30
- spawn_command(*args, stderr: stderr)
23
+ Timeout.timeout(@timeout) do
24
+ spawn_command(*args, stderr: stderr, stdin: stdin)
31
25
  end
32
26
  end
33
27
 
34
28
  private
35
29
 
36
- def with_stdin_tempfile(content)
37
- Tempfile.open("binaryen-stdin") do |f|
38
- f.binmode
39
- f.write(content)
40
- f.close
41
- yield f.path
42
- end
43
- end
44
-
45
30
  def command_path(cmd, ignore_missing)
46
31
  Dir[File.join(Binaryen.bindir, cmd)].first || (ignore_missing && cmd)
47
32
  end
48
33
 
49
- def spawn_command(*args, stderr: nil)
50
- out = "".b
51
- start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
52
- pid, stdin, stdout, stderr_stream = popen4(*args)
53
- stdin.close
54
- readers = [stdout, stderr_stream]
55
-
56
- while readers.any?
57
- elapsed_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time
58
- remaining_time = @timeout - elapsed_time
59
- ready = IO.select(readers, nil, nil, remaining_time)
60
- raise Timeout::Error, "command timed out after #{@timeout} seconds" if ready.nil?
61
-
62
- ready[0].each do |io|
63
- data = io.read_nonblock(BUFSIZE, exception: false)
64
-
65
- if data == :wait_readable
66
- # If the IO object is not ready for reading, read_nonblock returns :wait_readable.
67
- # This isn't an error, but a notification.
68
- elsif data.nil?
69
- # At EOF, read_nonblock returns nil instead of raising EOFError.
70
- readers.delete(io)
71
- io.close
72
- elsif io == stdout
73
- out << data
74
- elsif io == stderr_stream && stderr
75
- stderr << data
34
+ def spawn_command(*args, stderr: nil, stdin: nil)
35
+ pid = nil
36
+
37
+ IO.pipe do |in_read, in_write|
38
+ in_read.binmode
39
+ in_write.binmode
40
+ in_write.sync = true
41
+ in_write.write(stdin) if stdin
42
+
43
+ Tempfile.create("binaryen-output") do |tmpfile|
44
+ tmpfile.close
45
+
46
+ File.open(File::NULL, "w") do |devnull|
47
+ IO.pipe do |err_read, err_write|
48
+ pid = POSIX::Spawn.pspawn(*args, "--output=#{tmpfile.path}", in: in_read, out: devnull, err: err_write)
49
+ in_read.close
50
+ err_write.close
51
+ in_write.close
52
+
53
+ _, status = Process.waitpid2(pid)
54
+ pid = nil
55
+
56
+ stderr&.write(err_read.read)
57
+ err_read.close
58
+
59
+ if status.signaled?
60
+ raise Binaryen::Signal, "command terminated by signal #{status.termsig}"
61
+ elsif status.exited? && !status.success?
62
+ raise Binaryen::NonZeroExitStatus, "command exited with status #{status.exitstatus}"
63
+ elsif File.size(tmpfile.path) > @max_output_size
64
+ raise Binaryen::MaximumOutputExceeded, "maximum output size exceeded (#{@max_output_size} bytes)"
65
+ end
66
+
67
+ File.binread(tmpfile.path)
68
+ end
69
+ end
70
+ rescue
71
+ if pid
72
+ begin
73
+ Process.kill(:KILL, pid)
74
+ rescue SystemCallError
75
+ # Expected
76
+ end
77
+
78
+ begin
79
+ Process.wait(pid, Process::WNOHANG)
80
+ rescue SystemCallError
81
+ # Expected
82
+ end
76
83
  end
77
- rescue Errno::EINTR
78
- # This means that the read was interrupted by a signal, which is not an error. So we just retry.
79
- end
80
-
81
- if out.bytesize > @max_output_size
82
- Process.kill("TERM", pid)
83
- raise Binaryen::MaximumOutputExceeded, "maximum output size exceeded (#{@max_output_size} bytes)"
84
- end
85
84
 
86
- if remaining_time < 0
87
- Process.kill("TERM", pid)
88
- raise Timeout::Error, "command timed out after #{@timeout} seconds"
85
+ raise
89
86
  end
90
87
  end
91
-
92
- _, status = Process.waitpid2(pid, Process::WUNTRACED)
93
-
94
- raise Binaryen::NonZeroExitStatus, "command exited with status #{status.exitstatus}" unless status.success?
95
-
96
- out
97
- ensure
98
- [stdin, stdout, stderr_stream].each do |io|
99
- io.close
100
- rescue
101
- nil
102
- end
103
88
  end
104
89
  end
105
90
  end
@@ -4,4 +4,5 @@ module Binaryen
4
4
  class Error < StandardError; end
5
5
  class NonZeroExitStatus < Error; end
6
6
  class MaximumOutputExceeded < Error; end
7
+ class Signal < Error; end
7
8
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Binaryen
4
- VERSION = "1.1.6.10"
4
+ VERSION = "1.1.6.12"
5
5
  BINARYEN_VERSION = "version_116"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binaryen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6.10
4
+ version: 1.1.6.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-09 00:00:00.000000000 Z
11
+ date: 2024-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: posix-spawn