[Modern Media Controls] Toggle playback when clicking on the video on macOS
[WebKit-https.git] / Tools / ReducedFTL / combineModules.rb
1 #!/usr/bin/env ruby
2
3 # Copyright (C) 2013 Apple Inc. All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 # THE POSSIBILITY OF SUCH DAMAGE.
25
26 class Reference
27     attr_reader :kind, :number
28     
29     def initialize(kind, number)
30         @kind = kind
31         @number = number
32     end
33     
34     def resolve(hashTable, bangTable)
35         case @kind
36         when "#"
37             result = hashTable[@number]
38         when "!"
39             result = bangTable[@number]
40         else
41             raise
42         end
43         raise unless result
44         result
45     end
46 end
47
48 def parse(string)
49     result = []
50     until string.empty?
51         before, match, string = string.partition(/[!#]([0-9]+)/)
52         result << before
53         if match.empty?
54             result << string
55             break
56         end
57         result << Reference.new(match[0..0], match[1..-1].to_i)
58     end
59     result
60 end
61
62 class MetaData
63     attr_reader :index, :name, :parent, :val
64
65     def initialize(index, name, parent, val)
66         @index = index
67         @name = name
68         @parent = parent
69         @val = val
70     end
71 end
72
73 $definitions = []
74 $declarations = {}
75 $attributes = []
76 $metaData = {}
77 $attributesBackMap = {}
78 $count = 0
79
80 loop {
81     line = $stdin.readline
82     if line =~ /^; NOTE: THIS IS A COMBINED MODULE/
83         puts line
84         puts $stdin.read
85         exit 0
86     end
87     break if line =~ /^define/
88 }
89
90 puts "; NOTE: THIS IS A COMBINED MODULE"
91
92 # Loop over all definitions.
93 shouldContinue = true
94 while shouldContinue
95     # We're starting a new definition.
96     body = ""
97     loop {
98         line = $stdin.readline
99         break if line.chomp == "}"
100         body += line
101     }
102     
103     body = parse(body)
104     
105     declarations=[]
106     metaDataMap=[]
107     attributeMap = []
108     unresolvedMetaData = []
109     
110     loop {
111         line = $stdin.gets
112         
113         if not line
114             shouldContinue = false
115             break
116         elsif line =~ /^define/
117             break
118         elsif line =~ /^declare/
119             declarations << parse(line)
120         elsif line =~ /!([0-9]+) = metadata !{metadata !\"([a-zA-Z0-9_]+)\"}/
121             index = $1.to_i
122             name = $2
123             unless $metaData[name]
124                 $metaData[name] = MetaData.new($metaData.size, name, nil, nil)
125             end
126             metaDataMap[index] = $metaData[$2].index
127         elsif line =~ /!([0-9]+) = metadata !{metadata !\"([a-zA-Z0-9_]+)\", metadata !([0-9]+)/
128             metaData = MetaData.new($1.to_i, $2, $3.to_i, nil)
129             unresolvedMetaData << metaData
130         elsif line =~ /!([0-9]+) = metadata !{metadata !\"branch_weights\"/
131             index = $1.to_i
132             arr1 = line.split(',');
133             arr1.shift
134             arr2 = Array.new
135             name = "branch_weights"
136             arr1.each { |a|
137               a =~ /i32 ([0-9]+)/
138               name.concat($1)
139               arr2.push($1)
140             }
141             unless $metaData[name]
142                 $metaData[name] = MetaData.new($metaData.size, "branch_weights", nil, arr2)
143             end
144             metaDataMap[index] = $metaData[name].index
145         elsif line =~ /!([0-9]+) = metadata !{i32 ([-+0-9]+), i32 ([-+0-9]+)}/
146             index = $1.to_i
147             name = "#$2#$3"
148             unless $metaData[name]
149                 $metaData[name] = MetaData.new($metaData.size, nil, nil, [$2, $3])
150             end
151             metaDataMap[index] = $metaData[name].index
152         elsif line =~ /attributes #([0-9]+) = /
153             attributeNumber = $1.to_i
154             attributeBody = $~.post_match
155             if $attributesBackMap[attributeBody]
156                 attributeMap[attributeNumber] = $attributesBackMap[attributeBody]
157             else
158                 attributeMap[attributeNumber] = $attributes.size
159                 $attributesBackMap[attributeBody] = $attributes.size
160                 $attributes << attributeBody
161             end
162         end
163     }
164     
165     # Iteratively resolve meta-data references
166     until unresolvedMetaData.empty?
167         index = 0
168         while index < unresolvedMetaData.size
169             metaData = unresolvedMetaData[index]
170             if $metaData[metaData.name]
171                 metaDataMap[metaData.index] = $metaData[metaData.name].index
172                 unresolvedMetaData[index] = unresolvedMetaData[-1]
173                 unresolvedMetaData.pop
174             elsif metaDataMap[metaData.parent]
175                 metaDataMap[metaData.index] = $metaData.size
176                 $metaData[metaData.name] = MetaData.new($metaData.size, metaData.name, metaDataMap[metaData.parent], nil)
177                 unresolvedMetaData[index] = unresolvedMetaData[-1]
178                 unresolvedMetaData.pop
179             else
180                 index += 1
181             end
182         end
183     end
184     
185     # Output the body with all of the things remapped.
186     puts "define i64 @jsBody_#{$count += 1}() {"
187     body.each {
188         | thing |
189         if thing.is_a? Reference
190             print(thing.kind + thing.resolve(attributeMap, metaDataMap).to_s)
191         else
192             print(thing)
193         end
194     }
195     puts "}"
196     
197     # Figure out what to do with declarations.
198     declarations.each {
199         | declaration |
200         declaration = declaration.map {
201             | thing |
202             if thing.is_a? Reference
203                 thing.kind + thing.resolve(attributeMap, metaDataMap).to_s
204             else
205                 thing
206             end
207         }
208         declaration = declaration.join('')
209         
210         next if $declarations[declaration]
211         
212         $declarations[declaration] = true
213     }
214 end
215
216 $declarations.each_key {
217     | declaration |
218     puts declaration
219 }
220
221 $attributes.each_with_index {
222     | attribute, index |
223     puts "attributes ##{index} = #{attribute}"
224 }
225
226 $metaData.each_value {
227     | metaData |
228     print "!#{metaData.index} = metadata !{"
229     if metaData.name
230         print "metadata !\"#{metaData.name}\""
231     end
232     if metaData.parent
233         print ", metadata !#{metaData.parent}"
234     end
235     if (metaData.val)
236         index = 0
237         if metaData.name
238           index = 1
239         end
240         metaData.val.each { |a|
241             if (index == 0)
242                 print "i32 #{a}"
243             else
244                 print ", i32 #{a}"
245             end
246             index += 1
247         }
248     end
249     puts "}"
250 }
251