binaryen 1.1.6.9 → 1.1.6.11

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