binaryen 1.1.6.5 → 1.1.6.7

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: 7ec6cd19949163f81747301353e37912f7d2924205816df9f6620f0cb6a266ce
4
- data.tar.gz: cfc6e449979a806440f5c893640618bd321597e1ae8848108fea8c7b9da88d72
3
+ metadata.gz: e208c99114153cd5edae8ca1125d26eeecb8f2b5f91e218ccc63f807827ee4fe
4
+ data.tar.gz: 6839fedb4b0c710fc1aa852909f3a24daf1729a2f1531e6c3c47b7594f2819d3
5
5
  SHA512:
6
- metadata.gz: 9e83c357446ac3c2e04d6de7a575d8dca7b4164cd4050416edd87d23fe864165085f25b5e3f7a7f28d46debedcc7fa146f1416aa8a529376c5ea07dfd8f1713b
7
- data.tar.gz: 8f3e7d8a8582608436191bdea891aa8564cebc0ccceceb750bdbce38b563bd590c32e8b5025a9a63761eb6592347709e06983c023b950d377b016354da111b35
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("KILL", @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,87 +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)
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
52
34
 
53
- write_to_pipe(iwr, stdin, timeout_checker) if stdin
54
- if stderr
55
- err_output = read_from_pipe(erd, timeout_checker)
56
- begin
57
- write_to_pipe(stderr, err_output, timeout_checker, close_write: false)
58
- rescue Errno::EPIPE
59
- # ignore
60
- end
61
- end
62
- output = read_from_pipe(ord, timeout_checker)
63
- wait_or_kill(pid, timeout_checker, erd, stderr)
35
+ raise Binaryen::NonZeroExitStatus, "command exited with status #{status.exitstatus}" unless status.success?
64
36
 
65
- 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
66
42
  end
67
43
 
68
44
  private
69
45
 
70
- def write_to_pipe(pipe, stdin, timeout_checker, close_write: true)
71
- offset = 0
72
- length = stdin.bytesize
73
-
74
- while offset < length
75
- remaining_time = timeout_checker.check!
76
-
77
- if IO.select(nil, [pipe], nil, remaining_time)
78
- written = pipe.write_nonblock(stdin.byteslice(offset, length), exception: false)
79
- offset += written if written.is_a?(Integer)
80
- else
81
- raise Timeout::Error, "Command timed out"
82
- end
83
- end
84
-
85
- pipe.close_write if close_write
86
- end
87
-
88
- def read_from_pipe(pipe, timeout_checker)
89
- output = +""
90
-
91
- while (result = pipe.read_nonblock(8192, exception: false))
92
- remaining_time = timeout_checker.check!
93
- raise Timeout::Error, "Command timed out" if remaining_time <= 0
94
-
95
- case result
96
- when :wait_readable
97
- IO.select([pipe], nil, nil, remaining_time)
98
- when nil
99
- break
100
- else
101
- output << result
102
- end
103
- end
104
-
105
- output
106
- end
107
-
108
- def wait_or_kill(pid, timeout_checker, err_read, err_write)
109
- loop do
110
- remaining_time = timeout_checker.check!
111
- raise Timeout::Error, "timed out waiting on process" if remaining_time <= 0
112
-
113
- if (_, status = Process.wait2(pid, Process::WNOHANG))
114
-
115
- raise Binaryen::NonZeroExitStatus,
116
- "command exited with status #{status.exitstatus}" if status.exitstatus != 0
117
-
118
- return true
119
- else
120
- sleep(0.1)
121
- end
122
- end
123
- end
124
-
125
- def build_command(*arguments)
126
- [@cmd] + arguments + @default_args
127
- end
128
-
129
46
  def command_path(cmd, ignore_missing)
130
47
  Dir[File.join(Binaryen.bindir, cmd)].first || (ignore_missing && cmd)
131
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.5"
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.5
4
+ version: 1.1.6.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify Inc.