⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 goto_xs.t

📁 UNIX下perl实现代码
💻 T
字号:
#!./perl# tests for "goto &sub"-ing into XSUBs# $RCSfile$$Revision$$Date$# Note: This only tests things that should *work*.  At some point, it may#       be worth while to write some failure tests for things that should#       *break* (such as calls with wrong number of args).  For now, I'm#       guessing that if all of these work correctly, the bad ones will#       break correctly as well.chdir 't' if -d 't';@INC = '../lib';$ENV{PERL5LIB} = "../lib";# turn warnings into fatal errors$SIG{__WARN__} = sub { die "WARNING: @_" } ;BEGIN { $| = 1; }eval 'require Fcntl'  or do { print "1..0\n# Fcntl unavailable, can't test XS goto.\n"; exit 0 };print "1..10\n";# We don't know what symbols are defined in platform X's system headers.# We don't even want to guess, because some platform out there will# likely do the unthinkable.  However, Fcntl::constant("LOCK_SH",0)# should always return a value, even on platforms which don't define the# cpp symbol; Fcntl.xs says:#           /* We support flock() on systems which don't have it, so#              always supply the constants. */# If this ceases to be the case, we're in trouble. =)$VALID = 'LOCK_SH';### First, we check whether Fcntl::constant returns sane answers.# Fcntl::constant("LOCK_SH",0) should always succeed.$value = Fcntl::constant($VALID,0);print((!defined $value)      ? "not ok 1\n# Sanity check broke, remaining tests will fail.\n"      : "ok 1\n");### OK, we're ready to do real tests.# test "goto &function_constant"sub goto_const { goto &Fcntl::constant; }$ret = goto_const($VALID,0);print(($ret == $value) ? "ok 2\n" : "not ok 2\n# ($ret != $value)\n");# test "goto &$function_package_and_name"$FNAME1 = 'Fcntl::constant';sub goto_name1 { goto &$FNAME1; }$ret = goto_name1($VALID,0);print(($ret == $value) ? "ok 3\n" : "not ok 3\n# ($ret != $value)\n");# test "goto &$function_package_and_name" again, with dirtier stack$ret = goto_name1($VALID,0);print(($ret == $value) ? "ok 4\n" : "not ok 4\n# ($ret != $value)\n");$ret = goto_name1($VALID,0);print(($ret == $value) ? "ok 5\n" : "not ok 5\n# ($ret != $value)\n");# test "goto &$function_name" from local packagepackage Fcntl;$FNAME2 = 'constant';sub goto_name2 { goto &$FNAME2; }package main;$ret = Fcntl::goto_name2($VALID,0);print(($ret == $value) ? "ok 6\n" : "not ok 6\n# ($ret != $value)\n");# test "goto &$function_ref"$FREF = \&Fcntl::constant;sub goto_ref { goto &$FREF; }$ret = goto_ref($VALID,0);print(($ret == $value) ? "ok 7\n" : "not ok 7\n# ($ret != $value)\n");### tests where the args are not on stack but in GvAV(defgv) (ie, @_)# test "goto &function_constant" from a sub called without arglistsub call_goto_const { &goto_const; }$ret = call_goto_const($VALID,0);print(($ret == $value) ? "ok 8\n" : "not ok 8\n# ($ret != $value)\n");# test "goto &$function_package_and_name" from a sub called without arglistsub call_goto_name1 { &goto_name1; }$ret = call_goto_name1($VALID,0);print(($ret == $value) ? "ok 9\n" : "not ok 9\n# ($ret != $value)\n");# test "goto &$function_ref" from a sub called without arglistsub call_goto_ref { &goto_ref; }$ret = call_goto_ref($VALID,0);print(($ret == $value) ? "ok 10\n" : "not ok 10\n# ($ret != $value)\n");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -