| #!/usr/bin/env ruby |
| # -*- coding: utf-8 -*- |
| # Copyright (C) 2016 Apple Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # |
| # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| # THE POSSIBILITY OF SUCH DAMAGE. |
| |
| require "yaml" |
| |
| class HeapRange |
| attr_reader :first, :last |
| def initialize(first, last) |
| @first = first |
| @last = last |
| end |
| end |
| |
| class AbstractHeap |
| attr_reader :range, :name, :parent |
| def initialize(name, tree) |
| @name = name |
| @parent = nil |
| if tree.nil? |
| @children = [] |
| else |
| @children = tree.map {|key, value| AbstractHeap.new(key, value) } |
| end |
| @range = nil |
| end |
| |
| def setParent(parent) |
| parent.children.push(self) |
| @parent = parent |
| end |
| |
| def compute(start) |
| current = start |
| if @children.empty? |
| @range = HeapRange.new(start, current + 1) |
| return |
| end |
| |
| @children.each {|child| |
| child.compute(current) |
| current = child.range.last |
| } |
| |
| @range = HeapRange.new(start, current) |
| end |
| |
| def dump output |
| shallowDump(output) |
| if @parent |
| output.print "-> " |
| @parent.dump(output) |
| end |
| end |
| |
| def shallowDump(output) |
| output.print "#{@name}<#{@range.first},#{@range.last}>" |
| end |
| |
| def deepDump output, indent |
| printIndent(output, indent) |
| shallowDump(output) |
| if @children.empty? |
| output.print "\n" |
| return |
| end |
| |
| output.print ":\n" |
| @children.each {|child| |
| child.deepDump(output, indent + 1) |
| } |
| end |
| |
| def generate output |
| output.puts "constexpr JSC::DOMJIT::HeapRange #{@name}(JSC::DOMJIT::HeapRange::ConstExpr, #{@range.first}, #{@range.last});" |
| @children.each {|child| |
| child.generate(output) |
| } |
| end |
| |
| private |
| def printIndent output, indent |
| indent.times { |
| output.print " " |
| } |
| end |
| end |
| |
| header = <<-EOS |
| /* |
| * Copyright (C) 2016 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| // Auto-generated file. Do not modify. |
| |
| #pragma once |
| |
| #include <JavaScriptCore/DOMJITHeapRange.h> |
| |
| namespace WebCore { namespace DOMJIT { namespace AbstractHeapRepository { |
| EOS |
| |
| footer = <<-EOS |
| } } } |
| EOS |
| |
| $inputFileName = ARGV.shift |
| $outputFileName = ARGV.shift |
| File.open($outputFileName, "w") {|output| |
| File.open($inputFileName, "rb") {|file| |
| tree = YAML::load(file.read()) |
| heap = tree.map {|key, value| |
| AbstractHeap.new(key, value) |
| }.first |
| heap.compute(0) |
| |
| output.print(header) |
| output.puts("/* DOMJIT Abstract Heap Tree.") |
| heap.deepDump(output, 0) |
| output.puts("*/") |
| heap.generate(output) |
| output.print(footer) |
| } |
| } |