mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/mkmf.rb (what_type?): fixed typo, and refined for member of
aggregation types. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23154 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
64be577b53
commit
a6fa5855a8
2 changed files with 55 additions and 26 deletions
|
@ -1,4 +1,7 @@
|
||||||
Wed Apr 8 13:57:56 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Wed Apr 8 14:00:04 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* lib/mkmf.rb (what_type?): fixed typo, and refined for member of
|
||||||
|
aggregation types.
|
||||||
|
|
||||||
* lib/mkmf.rb (Logging.postpone): copy postponed output always.
|
* lib/mkmf.rb (Logging.postpone): copy postponed output always.
|
||||||
|
|
||||||
|
|
76
lib/mkmf.rb
76
lib/mkmf.rb
|
@ -989,8 +989,7 @@ def check_sizeof(type, headers = nil, &b)
|
||||||
x ? super : "failed"
|
x ? super : "failed"
|
||||||
end
|
end
|
||||||
checking_for checking_message("size of #{type}", headers), fmt do
|
checking_for checking_message("size of #{type}", headers), fmt do
|
||||||
if (($universal and
|
if ((size = UNIVERSAL_INTS.find {|t|
|
||||||
size = UNIVERSAL_INTS.find {|t|
|
|
||||||
try_static_assert("#{expr} == sizeof(#{t})", prelude, &b)
|
try_static_assert("#{expr} == sizeof(#{t})", prelude, &b)
|
||||||
}) or
|
}) or
|
||||||
size = try_constant(expr, prelude, &b))
|
size = try_constant(expr, prelude, &b))
|
||||||
|
@ -1026,48 +1025,74 @@ int t() {return (int)(1-(conftestval#{member ? ".#{member}" : ""}));}
|
||||||
SRC
|
SRC
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Used internally by the what_type? method to check if _typeof_ GCC
|
||||||
|
# extension is available.
|
||||||
|
def have_typeof?
|
||||||
|
return $typeof if defined?($typeof)
|
||||||
|
$typeof = %w[__typeof__ typeof].find do |t|
|
||||||
|
try_compile(<<SRC)
|
||||||
|
int rbcv_foo;
|
||||||
|
#{t}(rbcv_foo) rbcv_bar;
|
||||||
|
SRC
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def what_type?(type, member = nil, headers = nil, &b)
|
def what_type?(type, member = nil, headers = nil, &b)
|
||||||
m = "#{type}"
|
m = "#{type}"
|
||||||
var = "*rbcv_var_"
|
var = val = "*rbcv_var_"
|
||||||
func = "rbcv_func_(void)"
|
func = "rbcv_func_(void)"
|
||||||
if member
|
if member
|
||||||
m << "." << member
|
m << "." << member
|
||||||
else
|
else
|
||||||
type, member = type.split('.', 2)
|
type, member = type.split('.', 2)
|
||||||
end
|
end
|
||||||
prelude = cpp_include(headers).split(/$/)
|
|
||||||
prelude << "typedef #{type} rbcv_typedef_;\n"
|
|
||||||
prelude << "static rbcv_typedef_ #{var};\n"
|
|
||||||
prelude << "extern rbcv_typedef_ #{func};\n"
|
|
||||||
headers = [prelude]
|
|
||||||
if member
|
if member
|
||||||
var = "(#{var}).#{member}"
|
val = "(#{var}).#{member}"
|
||||||
|
end
|
||||||
|
prelude = [cpp_include(headers).split(/^/)]
|
||||||
|
prelude << ["typedef #{type} rbcv_typedef_;\n",
|
||||||
|
"extern rbcv_typedef_ *#{func};\n",
|
||||||
|
"static rbcv_typedef_ #{var};\n",
|
||||||
|
]
|
||||||
|
type = "rbcv_typedef_"
|
||||||
|
fmt = member && !(typeof = have_typeof?) ? "seems %s" : "%s"
|
||||||
|
if typeof
|
||||||
|
var = "*rbcv_member_"
|
||||||
|
func = "rbcv_mem_func_(void)"
|
||||||
|
member = nil
|
||||||
|
type = "rbcv_mem_typedef_"
|
||||||
|
prelude[-1] << "typedef #{typeof}(#{val}) #{type};\n"
|
||||||
|
prelude[-1] << "extern #{type} *#{func};\n"
|
||||||
|
prelude[-1] << "static #{type} #{var};\n"
|
||||||
|
val = var
|
||||||
end
|
end
|
||||||
fmt = "seems %s"
|
|
||||||
def fmt.%(x)
|
def fmt.%(x)
|
||||||
x ? super : "unknown"
|
x ? super : "unknown"
|
||||||
end
|
end
|
||||||
checking_for checking_message(m, headers), fmt do
|
checking_for checking_message(m, headers), fmt do
|
||||||
if scalar_ptr_type?(type, member, headers, &b)
|
if scalar_ptr_type?(type, member, prelude, &b)
|
||||||
if try_static_assert("sizeof(*#{name}) == 1", headers)
|
if try_static_assert("sizeof(*#{var}) == 1", prelude)
|
||||||
return "string"
|
return "string"
|
||||||
end
|
end
|
||||||
ptr = "*"
|
ptr = "*"
|
||||||
elsif scalar_type?(type, member, headers, &b)
|
elsif scalar_type?(type, member, prelude, &b)
|
||||||
|
unless member and !typeof or try_static_assert("(#{type})-1 < 0", prelude)
|
||||||
|
unsigned = "unsigned"
|
||||||
|
end
|
||||||
ptr = ""
|
ptr = ""
|
||||||
else
|
else
|
||||||
return
|
next
|
||||||
end
|
end
|
||||||
unsigned = try_static_assert("(rbcv_typedef_)-1 < 0", headers) ? "unsigned" : ""
|
type = UNIVERSAL_INTS.find do |t|
|
||||||
[
|
pre = prelude
|
||||||
unsigned,
|
unless member
|
||||||
(UNIVERSAL_INTS+["short"]).find do |t|
|
pre += [["static #{unsigned} #{t} #{ptr}#{var};\n",
|
||||||
prelude = headers + [["static #{unsigned} #{t} #{ptr}#{name};\n",
|
"extern #{unsigned} #{t} #{ptr}*#{func};\n"]]
|
||||||
"extern #{unsigned} #{t} #{ptr}#{func};\n"]]
|
end
|
||||||
try_static_assert("sizeof(#{ptr}#{name}) == sizeof(#{unsigned}#{t})", prelude)
|
try_static_assert("sizeof(#{ptr}#{val}) == sizeof(#{unsigned} #{t})", pre)
|
||||||
end,
|
end
|
||||||
ptr
|
type or next
|
||||||
].compact.join(" ")
|
[unsigned, type, ptr].join(" ").strip
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1959,7 +1984,8 @@ LIBPATHFLAG = config_string('LIBPATHFLAG') || ' -L"%s"'
|
||||||
RPATHFLAG = config_string('RPATHFLAG') || ''
|
RPATHFLAG = config_string('RPATHFLAG') || ''
|
||||||
LIBARG = config_string('LIBARG') || '-l%s'
|
LIBARG = config_string('LIBARG') || '-l%s'
|
||||||
MAIN_DOES_NOTHING = config_string('MAIN_DOES_NOTHING') || 'int main() {return 0;}'
|
MAIN_DOES_NOTHING = config_string('MAIN_DOES_NOTHING') || 'int main() {return 0;}'
|
||||||
UNIVERSAL_INTS = config_string('UNIVERSAL_INTS') {|s| Shellwords.shellwords(s)} if $universal
|
UNIVERSAL_INTS = config_string('UNIVERSAL_INTS') {|s| Shellwords.shellwords(s)} ||
|
||||||
|
%w[int short long long\ long]
|
||||||
|
|
||||||
sep = config_string('BUILD_FILE_SEPARATOR') {|s| ":/=#{s}" if s != "/"} || ""
|
sep = config_string('BUILD_FILE_SEPARATOR') {|s| ":/=#{s}" if s != "/"} || ""
|
||||||
CLEANINGS = "
|
CLEANINGS = "
|
||||||
|
|
Loading…
Add table
Reference in a new issue