binaryen 1.1.6.6 → 1.1.6.7

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: 44bf5b373ce186bdee3006d16e8129bde2be3e952c1211d3ee550fb529cffbfe
4
- data.tar.gz: c3ef7a60460cdc937e51b538ef4e6d94ebfba2167ff14821292881a9b91d6f1f
3
+ metadata.gz: e208c99114153cd5edae8ca1125d26eeecb8f2b5f91e218ccc63f807827ee4fe
4
+ data.tar.gz: 6839fedb4b0c710fc1aa852909f3a24daf1729a2f1531e6c3c47b7594f2819d3
5
5
  SHA512:
6
- metadata.gz: 290897e4df9079e57df51b4b684fa5ae496ea414c44d801ed8d2be5c167d5347812533511ee26b8f59520d645df1072df5c6368d218ab824d89b38e07373e7b5
7
- data.tar.gz: c30ed5adcb899a8d938d211b3aa3e98e875ec061f19054efd5d7a803b9be0392f9215cbac61283147841e23171ead48391f06695aa06841a64a6be05d5ba57aa
6
+ metadata.gz: 21ec4f01eacfa0d38b08acae723f5f6bf662f42047950354c3260b9d461b774ba91749b82b162a74b83ef0e70aa4b6541fcbbbb70111cd30b11b969955a2cfec
7
+ data.tar.gz: 5dbbf03fe6f8325cdaa1e78c81bfb7feef07d1887d53a647202f56dc58e5ac1b628a2057f0e5cce083bd2868894e622054f1a999d476a568ef04a5c1558a2d72
@@ -15,29 +15,11 @@ module Binaryen
15
15
  # optimized_wasm = command.run("-O4", stdin: "(module)")
16
16
  # ```
17
17
  class Command
18
- include POSIX::Spawn
19
-
18
+ MAX_OUTPUT_SIZE = 256 * 1024 * 1024
20
19
  DEFAULT_ARGS_FOR_COMMAND = {
21
20
  "wasm-opt" => ["--output=-"],
22
21
  }.freeze
23
22
 
24
- class TimeoutChecker
25
- def initialize(end_time:, pid:)
26
- @end_time = end_time
27
- @pid = pid
28
- end
29
-
30
- def check!
31
- now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
32
- if now >= @end_time
33
- Process.kill("TERM", @pid)
34
- raise Timeout::Error, "Command timed out"
35
- end
36
- remaining_time = @end_time - now
37
- remaining_time
38
- end
39
- end
40
-
41
23
  def initialize(cmd, timeout: 10, ignore_missing: false)
42
24
  @cmd = command_path(cmd, ignore_missing) || raise(ArgumentError, "command not found: #{cmd}")
43
25
  @timeout = timeout
@@ -45,85 +27,22 @@ module Binaryen
45
27
  end
46
28
 
47
29
  def run(*arguments, stdin: nil, stderr: nil)
48
- end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) + @timeout
49
- command = build_command(*arguments)
50
- pid, iwr, ord, erd = popen4(*command)
51
- timeout_checker = TimeoutChecker.new(end_time: end_time, pid: pid)
52
-
53
- write_to_pipe(iwr, stdin, timeout_checker, pid) if stdin
30
+ args = [@cmd] + arguments + @default_args
31
+ child = POSIX::Spawn::Child.new(*args, input: stdin, timeout: @timeout, max: MAX_OUTPUT_SIZE)
32
+ stderr&.write(child.err)
33
+ status = child.status
54
34
 
55
- if stderr
56
- err_output = read_from_pipe(erd, timeout_checker)
57
- write_to_pipe(stderr, err_output, timeout_checker, pid, close_write: false)
58
- end
59
- output = read_from_pipe(ord, timeout_checker)
60
- wait_or_kill(pid, timeout_checker)
35
+ raise Binaryen::NonZeroExitStatus, "command exited with status #{status.exitstatus}" unless status.success?
61
36
 
62
- output
37
+ child.out
38
+ rescue POSIX::Spawn::MaximumOutputExceeded => e
39
+ raise Binaryen::MaximumOutputExceeded, e.message
40
+ rescue POSIX::Spawn::TimeoutExceeded => e
41
+ raise Timeout::Error, e.message
63
42
  end
64
43
 
65
44
  private
66
45
 
67
- def write_to_pipe(pipe, stdin, timeout_checker, pid, close_write: true)
68
- offset = 0
69
- length = stdin.bytesize
70
-
71
- while offset < length
72
- remaining_time = timeout_checker.check!
73
-
74
- next unless IO.select(nil, [pipe], nil, remaining_time)
75
-
76
- begin
77
- written = pipe.write_nonblock(stdin.byteslice(offset, length), exception: false)
78
- offset += written if written.is_a?(Integer)
79
- rescue Errno::EPIPE
80
- wait_or_kill(pid, timeout_checker, pid)
81
- end
82
- end
83
- ensure
84
- pipe.close_write if close_write
85
- end
86
-
87
- def read_from_pipe(pipe, timeout_checker, close_read: true)
88
- output = +""
89
-
90
- while (result = pipe.read_nonblock(8192, exception: false))
91
- remaining_time = timeout_checker.check!
92
-
93
- case result
94
- when :wait_readable
95
- IO.select([pipe], nil, nil, remaining_time)
96
- when nil
97
- break
98
- else
99
- output << result
100
- end
101
- end
102
-
103
- output
104
- ensure
105
- pipe.close_read if close_read
106
- end
107
-
108
- def wait_or_kill(pid, timeout_checker)
109
- loop do
110
- timeout_checker.check!
111
-
112
- if (_, status = Process.wait2(pid, Process::WNOHANG))
113
- raise Binaryen::NonZeroExitStatus,
114
- "command exited with status #{status.exitstatus}" if status.exitstatus != 0
115
-
116
- return true
117
- else
118
- sleep(0.1)
119
- end
120
- end
121
- end
122
-
123
- def build_command(*arguments)
124
- [@cmd] + arguments + @default_args
125
- end
126
-
127
46
  def command_path(cmd, ignore_missing)
128
47
  Dir[File.join(Binaryen.bindir, cmd)].first || (ignore_missing && cmd)
129
48
  end
@@ -3,4 +3,5 @@
3
3
  module Binaryen
4
4
  class Error < StandardError; end
5
5
  class NonZeroExitStatus < Error; end
6
+ class MaximumOutputExceeded < Error; end
6
7
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Binaryen
4
- VERSION = "1.1.6.6"
4
+ VERSION = "1.1.6.7"
5
5
  BINARYEN_VERSION = "version_116"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binaryen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6.6
4
+ version: 1.1.6.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify Inc.