binaryen 1.1.6.10 → 1.1.6.12

Sign up to get free protection for your applications and to get access to all the features.
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