TAKESAKOのはてな出張所 RSSフィード

2009-04-17

[] defined &func の不思議

Ubuntu8.10(x86_64) な環境で perl -e "require 'syscall.ph'" すると

Prototype mismatch: sub main::__LONG_MAX__ () vs none at /usr/lib/perl/5.10/_h2ph_pre.ph line 309.
Constant subroutine __LONG_MAX__ redefined at /usr/lib/perl/5.10/_h2ph_pre.ph line 309.

という警告メッセージが出てしまう問題を深追いしていたんですけど、、、

該当コード /usr/lib/perl/5.10/_h2ph_pre.ph はこんな感じ:

   ...
   192  unless (defined &__LONG_MAX__) { sub __LONG_MAX__() { 9223372036854775807 } }
   ...
   308  # gross hack
   309  unless (defined &__LONG_MAX__) { sub __LONG_MAX__ { 2147483647 } }

Prototype mismatch と Constant subroutine redefined の問題を切り分けるためにサンプルプログラムを書いてみたんですが、

unless (defined &PPP) { sub PPP() { 1 } } warn unless ( PPP() == 2);# Warning: something's wrong at - line 1.
unless (defined &PPP) { sub PPP() { 2 } } warn unless ( PPP() == 2);
unless (defined &PPS) { sub PPS() { 1 } } warn unless (&PPS   == 2);
unless (defined &PPS) { sub PPS() { 2 } } warn unless (&PPS   == 2);
unless (defined &PSP) { sub PSP() { 1 } } warn unless ( PSP() == 2);# Warning: something's wrong at - line 5.
unless (defined &PSP) { sub PSP   { 2 } } warn unless ( PSP() == 2);
unless (defined &PSS) { sub PSS() { 1 } } warn unless (&PSS   == 2);
unless (defined &PSS) { sub PSS   { 2 } } warn unless (&PSS   == 2);
unless (defined &SPP) { sub SPP   { 1 } } warn unless ( SPP() == 2);
unless (defined &SPP) { sub SPP() { 2 } } warn unless ( SPP() == 2);
unless (defined &SPS) { sub SPS   { 1 } } warn unless (&SPS   == 2);
unless (defined &SPS) { sub SPS() { 2 } } warn unless (&SPS   == 2);
unless (defined &SSP) { sub SSP   { 1 } } warn unless ( SSP() == 2);
unless (defined &SSP) { sub SSP   { 2 } } warn unless ( SSP() == 2);
unless (defined &SSS) { sub SSS   { 1 } } warn unless (&SSS   == 2);
unless (defined &SSS) { sub SSS   { 2 } } warn unless (&SSS   == 2);

これを実行すると

Warning: something's wrong at - line 1.
Warning: something's wrong at - line 3.

となっちゃいます。。。

コンパイルフェーズと実行フェーズの違いなんでしょうけど、、、意味がわかりません(><)

元々の意図からすると # gross hack は意味をなしてないってことなんですかね。