1#!/usr/bin/env ruby 2 3# Copyright (C) 2010 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 26input_file = ARGV[0] 27output_file = ARGV[1] 28 29require 'erb' 30 31def line_for_output line 32 return line.chomp if line =~ /^#\s*(if|ifdef|ifndef|else|elif|endif)/ 33 " validateAndPrint(\"#{line.chomp}\");" 34end 35 36TEMPLATE = <<-EOF 37#include "config.h" 38#include <stdio.h> 39#include <wtf/Assertions.h> 40 41#if !OS(WINDOWS) 42#include <cxxabi.h> 43 44static bool symbolCanBeValidated(const char* symbol) 45{ 46 // Symbols containing wildcards cannot be validated. 47 if (strchr(symbol, '?') || strchr(symbol, '*')) 48 return false; 49 50 // Other C++ symbols can be. 51 return !strncmp(symbol, "__Z", strlen("__Z")); 52} 53#endif 54 55static void validateAndPrint(const char* symbol) 56{ 57#if !OS(WINDOWS) 58 if (symbolCanBeValidated(symbol)) { 59 char* demangledName = abi::__cxa_demangle(symbol + 1, nullptr, nullptr, nullptr); 60 if (!demangledName) { 61 fprintf(stderr, "ERROR: \\"%s\\" is not a valid C++ mangled name.\\n", symbol); 62 exit(EXIT_FAILURE); 63 } 64 65 free(demangledName); 66 } 67#endif 68 69 printf("%s\\n", symbol); 70} 71 72int main(int, char**) 73{ 74<%- input.each_line do |line| -%> 75<%= line_for_output line %> 76<%- end -%> 77 78 return 0; 79} 80EOF 81 82File.open(output_file, "w") do |output| 83 File.open(input_file) do |input| 84 renderer = ERB.new(TEMPLATE, 0, "-") 85 output << renderer.result(binding) 86 end 87end 88 89STDERR.puts "Wrote output to #{output_file}" 90