aboutsummaryrefslogtreecommitdiff
path: root/lang
diff options
context:
space:
mode:
authorPav Lucistnik <pav@FreeBSD.org>2005-06-06 18:52:04 +0000
committerPav Lucistnik <pav@FreeBSD.org>2005-06-06 18:52:04 +0000
commit6d059a7cd23c0adb206ee59e5a672583e78f84b1 (patch)
tree0e25cd352031a42b9ce557317835d1fb0e27bd60 /lang
parent041059c67c1ef111ed0288ef532efd6603ef2c72 (diff)
downloadports-6d059a7cd23c0adb206ee59e5a672583e78f84b1.tar.gz
ports-6d059a7cd23c0adb206ee59e5a672583e78f84b1.zip
Notes
Diffstat (limited to 'lang')
-rw-r--r--lang/itcl/Makefile9
-rw-r--r--lang/itcl/distinfo4
-rw-r--r--lang/itcl/files/Makefile.lib2
-rw-r--r--lang/itcl/files/patch-generic+itcl.h107
-rw-r--r--lang/itcl/files/patch-generic+itclInt.h101
-rw-r--r--lang/itcl/files/patch-generic+itcl_cmds.c211
-rw-r--r--lang/itcl/files/patch-tests+ensemble.test32
7 files changed, 457 insertions, 9 deletions
diff --git a/lang/itcl/Makefile b/lang/itcl/Makefile
index 594aa6ed061d..172364d17076 100644
--- a/lang/itcl/Makefile
+++ b/lang/itcl/Makefile
@@ -6,12 +6,12 @@
#
PORTNAME= itcl
-PORTVERSION= ${MAJOR}.${MINOR}
-PORTREVISION= 2
+PORTVERSION= ${MAJOR}.${MINOR}.1
CATEGORIES= lang
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR=incrtcl
DISTNAME= itcl${PORTVERSION}
+EXTRACT_SUFX= _src.tgz
MAINTAINER= ports@FreeBSD.org
COMMENT= [incr Tcl] (A.K.A. "itcl")
@@ -26,7 +26,7 @@ PKGDEINSTALL= ${PORTSDIR}/lang/tcl83/pkg-deinstall.tclsh
MAKE_ENV+= ${PLIST_SUB} \
SHLIB_MAJOR=${SHLIB_MAJOR} SHLIB_MINOR=${SHLIB_MINOR}
-EXTRACT_AFTER_ARGS=| ${TAR} -xf - ./itcl${MAJOR}.${MINOR}/itcl
+EXTRACT_AFTER_ARGS=| ${TAR} -xf - itcl${PORTVERSION}/itcl
.if defined(MAKE_JOBS)
MAKE_ARGS+= -j${MAKE_JOBS}
@@ -46,9 +46,6 @@ MANN+= itcl.n itcl_class.n itcl_info.n itclvars.n local.n scope.n
ITCL_LIB_FILE= ${ITCL_LIB}.${SHLIB_MAJOR}
-post-extract:
- ${RM} ${WRKSRC}/pkgIndex.tcl
-
post-patch:
${REINPLACE_CMD} \
-e 's,package require Itcl,load [glob \
diff --git a/lang/itcl/distinfo b/lang/itcl/distinfo
index 8dd40ed57c76..f0840a234f20 100644
--- a/lang/itcl/distinfo
+++ b/lang/itcl/distinfo
@@ -1,2 +1,2 @@
-MD5 (itcl3.2.tar.gz) = b41ed909969eaa5f0a06ab698393760f
-SIZE (itcl3.2.tar.gz) = 1498517
+MD5 (itcl3.2.1_src.tgz) = 44dcc2129232329cacd6c8abebf38403
+SIZE (itcl3.2.1_src.tgz) = 427026
diff --git a/lang/itcl/files/Makefile.lib b/lang/itcl/files/Makefile.lib
index c9fe57f90e05..de65a293d51f 100644
--- a/lang/itcl/files/Makefile.lib
+++ b/lang/itcl/files/Makefile.lib
@@ -6,7 +6,7 @@ CFLAGS+= -I. -I./../generic \
-DHAVE_GETCWD=1 -DNO_VALUES_H=1 -DHAVE_UNISTD_H=1 -DUSE_TERMIOS=1\
-DHAVE_SYS_TIME_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_TM_ZONE=1\
-DHAVE_TM_GMTOFF=1 -DHAVE_ST_BLKSIZE=1 -DSTDC_HEADERS=1\
- -DNEED_MATHERR=1 -DHAVE_SIGNED_CHAR=1 -DHAVE_SYS_IOCTL_H=1\
+ -DHAVE_SIGNED_CHAR=1 -DHAVE_SYS_IOCTL_H=1\
-DTCL_SHLIB_EXT=\".so\" \
-DHAVE_SYS_FILIO_H=1 \
-DRETSIGTYPE=void \
diff --git a/lang/itcl/files/patch-generic+itcl.h b/lang/itcl/files/patch-generic+itcl.h
new file mode 100644
index 000000000000..27c74b36f278
--- /dev/null
+++ b/lang/itcl/files/patch-generic+itcl.h
@@ -0,0 +1,107 @@
+===================================================================
+RCS file: /cvsroot/incrtcl/incrTcl/itcl/generic/itcl.h,v
+retrieving revision 1.15
+retrieving revision 1.19
+diff -u -r1.15 -r1.19
+--- generic/itcl.h 2001/05/25 00:12:29 1.15
++++ generic/itcl.h 2002/01/16 22:29:41 1.19
+@@ -40,9 +40,9 @@
+ * http://www.tcltk.com/itcl
+ *
+ * modified for Stubs 5/20/1999 by
+- * David Gravereaux <davygrvy@bigfoot.com>
++ * David Gravereaux <davygrvy@pobox.com>
+ *
+- * RCS: $Id: itcl.h,v 1.15 2001/05/25 00:12:29 davygrvy Exp $
++ * RCS: $Id: itcl.h,v 1.19 2002/01/16 22:29:41 andreas_kupries Exp $
+ * ========================================================================
+ * Copyright (c) 1993-1998 Lucent Technologies, Inc.
+ * ------------------------------------------------------------------------
+@@ -54,17 +54,6 @@
+
+ #include "tcl.h"
+
+-#undef TCL_STORAGE_CLASS
+-#ifdef BUILD_itcl
+-# define TCL_STORAGE_CLASS DLLEXPORT
+-#else
+-# ifdef USE_ITCL_STUBS
+-# define TCL_STORAGE_CLASS
+-# else
+-# define TCL_STORAGE_CLASS DLLIMPORT
+-# endif
+-#endif
+-
+ #define ITCL_VERSION "3.2"
+ #define ITCL_PATCH_LEVEL "3.2.1"
+ #define ITCL_MAJOR_VERSION 3
+@@ -80,6 +69,58 @@
+
+ #ifndef RC_INVOKED
+
++#undef TCL_STORAGE_CLASS
++#ifdef BUILD_itcl
++# define TCL_STORAGE_CLASS DLLEXPORT
++#else
++# ifdef USE_ITCL_STUBS
++# define TCL_STORAGE_CLASS
++# else
++# define TCL_STORAGE_CLASS DLLIMPORT
++# endif
++#endif
++
++/*
++ * Fix the Borland bug that's in the EXTERN macro from tcl.h.
++ */
++#ifndef TCL_EXTERN
++# undef DLLIMPORT
++# undef DLLEXPORT
++# if defined(STATIC_BUILD)
++# define DLLIMPORT
++# define DLLEXPORT
++# elif (defined(__WIN32__) && (defined(_MSC_VER) || (__BORLANDC__ >= 0x0550) || (defined(__GNUC__) && defined(__declspec)))) \
++ || (defined(MAC_TCL) && FUNCTION_DECLSPEC)
++# define DLLIMPORT __declspec(dllimport)
++# define DLLEXPORT __declspec(dllexport)
++# elif defined(__BORLANDC__)
++# define OLDBORLAND 1
++# define DLLIMPORT __import
++# define DLLEXPORT __export
++# else
++# define DLLIMPORT
++# define DLLEXPORT
++# endif
++
++ /*
++ * Make sure name mangling won't happen when the c++ language extensions
++ * are used.
++ */
++# ifdef __cplusplus
++# define TCL_CPP "C"
++# else
++# define TCL_CPP
++# endif
++ /*
++ * Borland requires the attributes be placed after the return type.
++ */
++# ifdef OLDBORLAND
++# define TCL_EXTERN(rtnType) extern TCL_CPP rtnType TCL_STORAGE_CLASS
++# else
++# define TCL_EXTERN(rtnType) extern TCL_CPP TCL_STORAGE_CLASS rtnType
++# endif
++#endif
++
+ /*
+ * Protection levels:
+ *
+@@ -152,9 +193,7 @@
+
+ #ifdef USE_ITCL_STUBS
+
+-#ifdef __cplusplus
+-extern "C"
+-#endif
++extern TCL_CPP
+ CONST char * Itcl_InitStubs _ANSI_ARGS_((Tcl_Interp *interp,
+ char *version, int exact));
+ #else
diff --git a/lang/itcl/files/patch-generic+itclInt.h b/lang/itcl/files/patch-generic+itclInt.h
new file mode 100644
index 000000000000..2d468fc6990f
--- /dev/null
+++ b/lang/itcl/files/patch-generic+itclInt.h
@@ -0,0 +1,101 @@
+===================================================================
+RCS file: /cvsroot/incrtcl/incrTcl/itcl/generic/itclInt.h,v
+retrieving revision 1.7
+retrieving revision 1.11
+diff -u -r1.7 -r1.11
+--- generic/itclInt.h 2001/04/07 07:20:53 1.7
++++ generic/itclInt.h 2003/12/23 06:58:27 1.11
+@@ -39,7 +39,7 @@
+ * mmclennan@lucent.com
+ * http://www.tcltk.com/itcl
+ *
+- * RCS: $Id: itclInt.h,v 1.7 2001/04/07 07:20:53 davygrvy Exp $
++ * RCS: $Id: itclInt.h,v 1.11 2003/12/23 06:58:27 davygrvy Exp $
+ * ========================================================================
+ * Copyright (c) 1993-1998 Lucent Technologies, Inc.
+ * ------------------------------------------------------------------------
+@@ -49,14 +49,64 @@
+ #ifndef ITCLINT_H
+ #define ITCLINT_H
+
+-#include "itcl.h"
+ #include "tclInt.h"
++#include "itcl.h"
+
+ #ifdef BUILD_itcl
+ # undef TCL_STORAGE_CLASS
+ # define TCL_STORAGE_CLASS DLLEXPORT
+ #endif
+
++/*
++ * Fix Tcl bug #803489 the right way. We need to always use the old Stub
++ * slot positions, not the new broken ones. I do like that these functions
++ * have moved to the public space, but the slot change is the killer and is
++ * the painful side affect.
++ */
++
++#if defined(USE_TCL_STUBS) && \
++ (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION >= 5)
++# undef Tcl_CreateNamespace
++# define Tcl_CreateNamespace \
++ (tclIntStubsPtr->tcl_CreateNamespace)
++# undef Tcl_DeleteNamespace
++# define Tcl_DeleteNamespace \
++ (tclIntStubsPtr->tcl_DeleteNamespace)
++# undef Tcl_AppendExportList
++# define Tcl_AppendExportList \
++ (tclIntStubsPtr->tcl_AppendExportList)
++# undef Tcl_Export
++# define Tcl_Export \
++ (tclIntStubsPtr->tcl_Export)
++# undef Tcl_Import
++# define Tcl_Import \
++ (tclIntStubsPtr->tcl_Import)
++# undef Tcl_ForgetImport
++# define Tcl_ForgetImport \
++ (tclIntStubsPtr->tcl_ForgetImport)
++# undef Tcl_GetCurrentNamespace
++# define Tcl_GetCurrentNamespace \
++ (tclIntStubsPtr->tcl_GetCurrentNamespace)
++# undef Tcl_GetGlobalNamespace
++# define Tcl_GetGlobalNamespace \
++ (tclIntStubsPtr->tcl_GetGlobalNamespace)
++# undef Tcl_FindNamespace
++# define Tcl_FindNamespace \
++ (tclIntStubsPtr->tcl_FindNamespace)
++# undef Tcl_FindCommand
++# define Tcl_FindCommand \
++ (tclIntStubsPtr->tcl_FindCommand)
++# undef Tcl_GetCommandFromObj
++# define Tcl_GetCommandFromObj \
++ (tclIntStubsPtr->tcl_GetCommandFromObj)
++# undef Tcl_GetCommandFullName
++# define Tcl_GetCommandFullName \
++ (tclIntStubsPtr->tcl_GetCommandFullName)
++#endif
++
++#define TCL_DOES_STUBS \
++ (TCL_MAJOR_VERSION > 8 || TCL_MAJOR_VERSION == 8 && (TCL_MINOR_VERSION > 1 || \
++ (TCL_MINOR_VERSION == 1 && TCL_RELEASE_LEVEL == TCL_FINAL_RELEASE)))
+
+ /*
+ * Common info for managing all known objects.
+@@ -255,15 +305,11 @@
+ */
+
+ #undef assert
+-#ifdef NDEBUG
++#ifndef DEBUG
+ #define assert(EX) ((void)0)
+ #else
+-#if defined(__STDC__)
+-#define assert(EX) (void)((EX) || (Itcl_Assert(#EX, __FILE__, __LINE__), 0))
+-#else
+-#define assert(EX) (void)((EX) || (Itcl_Assert("EX", __FILE__, __LINE__), 0))
+-#endif /* __STDC__ */
+-#endif /* NDEBUG */
++#define assert(EX) (void)((EX) || (Itcl_Assert(STRINGIFY(EX), __FILE__, __LINE__), 0))
++#endif /* DEBUG */
+
+ #undef TCL_STORAGE_CLASS
+ #define TCL_STORAGE_CLASS DLLIMPORT
diff --git a/lang/itcl/files/patch-generic+itcl_cmds.c b/lang/itcl/files/patch-generic+itcl_cmds.c
new file mode 100644
index 000000000000..34d8905683e9
--- /dev/null
+++ b/lang/itcl/files/patch-generic+itcl_cmds.c
@@ -0,0 +1,211 @@
+===================================================================
+RCS file: /cvsroot/incrtcl/incrTcl/itcl/generic/itcl_cmds.c,v
+retrieving revision 1.13
+retrieving revision 1.15
+diff -u -r1.13 -r1.15
+--- generic/itcl_cmds.c 2001/05/22 01:50:21 1.13
++++ generic/itcl_cmds.c 2002/01/10 11:43:37 1.15
+@@ -21,7 +21,7 @@
+ * mmclennan@lucent.com
+ * http://www.tcltk.com/itcl
+ *
+- * RCS: $Id: itcl_cmds.c,v 1.13 2001/05/22 01:50:21 davygrvy Exp $
++ * RCS: $Id: itcl_cmds.c,v 1.15 2002/01/10 11:43:37 davygrvy Exp $
+ * ========================================================================
+ * Copyright (c) 1993-1998 Lucent Technologies, Inc.
+ * ------------------------------------------------------------------------
+@@ -469,7 +469,7 @@
+ int forceFullNames = 0;
+
+ char *pattern;
+- CONST char *name;
++ CONST char *cmdName;
+ int newEntry, handledActiveNs;
+ Tcl_HashTable unique;
+ Tcl_HashEntry *entry;
+@@ -477,7 +477,7 @@
+ Itcl_Stack search;
+ Tcl_Command cmd, originalCmd;
+ Namespace *nsPtr;
+- Tcl_Obj *listPtr, *objPtr;
++ Tcl_Obj *objPtr;
+
+ if (objc > 2) {
+ Tcl_WrongNumArgs(interp, 1, objv, "?pattern?");
+@@ -485,7 +485,7 @@
+ }
+
+ if (objc == 2) {
+- pattern = Tcl_GetStringFromObj(objv[1], (int*)NULL);
++ pattern = Tcl_GetString(objv[1]);
+ forceFullNames = (strstr(pattern, "::") != NULL);
+ } else {
+ pattern = NULL;
+@@ -497,7 +497,6 @@
+ * in this interpreter. If we find any commands that
+ * represent classes, report them.
+ */
+- listPtr = Tcl_NewListObj(0, (Tcl_Obj* CONST*)NULL);
+
+ Itcl_InitStack(&search);
+ Itcl_PushStack((ClientData)globalNs, &search);
+@@ -532,10 +531,10 @@
+
+ objPtr = Tcl_NewStringObj((char*)NULL, 0);
+ Tcl_GetCommandFullName(interp, cmd, objPtr);
+- name = Tcl_GetStringFromObj(objPtr, (int*)NULL);
++ cmdName = Tcl_GetString(objPtr);
+ } else {
+- name = Tcl_GetCommandName(interp, cmd);
+- objPtr = Tcl_NewStringObj(name, -1);
++ cmdName = Tcl_GetCommandName(interp, cmd);
++ objPtr = Tcl_NewStringObj(cmdName, -1);
+ }
+
+ if (originalCmd) {
+@@ -543,9 +542,10 @@
+ }
+ Tcl_CreateHashEntry(&unique, (char*)cmd, &newEntry);
+
+- if (newEntry && (!pattern || Tcl_StringMatch(name, pattern))) {
++ if (newEntry &&
++ (!pattern || Tcl_StringMatch(cmdName, pattern))) {
+ Tcl_ListObjAppendElement((Tcl_Interp*)NULL,
+- listPtr, objPtr);
++ Tcl_GetObjResult(interp), objPtr);
+ }
+ }
+ entry = Tcl_NextHashEntry(&place);
+@@ -565,7 +565,6 @@
+ Tcl_DeleteHashTable(&unique);
+ Itcl_DeleteStack(&search);
+
+- Tcl_SetObjResult(interp, listPtr);
+ return TCL_OK;
+ }
+
+@@ -598,8 +597,8 @@
+ ItclClass *classDefn = NULL;
+ ItclClass *isaDefn = NULL;
+
+- char *name, *token;
+- CONST char *cmdName;
++ char *name = NULL, *token = NULL;
++ CONST char *cmdName = NULL;
+ int pos, newEntry, match, handledActiveNs;
+ ItclObject *contextObj;
+ Tcl_HashTable unique;
+@@ -609,7 +608,7 @@
+ Tcl_Command cmd, originalCmd;
+ Namespace *nsPtr;
+ Command *cmdPtr;
+- Tcl_Obj *listPtr, *objPtr;
++ Tcl_Obj *objPtr;
+
+ /*
+ * Parse arguments:
+@@ -617,7 +616,7 @@
+ */
+ pos = 0;
+ while (++pos < objc) {
+- token = Tcl_GetStringFromObj(objv[pos], (int*)NULL);
++ token = Tcl_GetString(objv[pos]);
+ if (*token != '-') {
+ if (!pattern) {
+ pattern = token;
+@@ -627,7 +626,7 @@
+ }
+ }
+ else if ((pos+1 < objc) && (strcmp(token,"-class") == 0)) {
+- name = Tcl_GetStringFromObj(objv[pos+1], (int*)NULL);
++ name = Tcl_GetString(objv[pos+1]);
+ classDefn = Itcl_FindClass(interp, name, /* autoload */ 1);
+ if (classDefn == NULL) {
+ return TCL_ERROR;
+@@ -635,7 +634,7 @@
+ pos++;
+ }
+ else if ((pos+1 < objc) && (strcmp(token,"-isa") == 0)) {
+- name = Tcl_GetStringFromObj(objv[pos+1], (int*)NULL);
++ name = Tcl_GetString(objv[pos+1]);
+ isaDefn = Itcl_FindClass(interp, name, /* autoload */ 1);
+ if (isaDefn == NULL) {
+ return TCL_ERROR;
+@@ -669,7 +668,6 @@
+ * in this interpreter. If we find any commands that
+ * represent objects, report them.
+ */
+- listPtr = Tcl_NewListObj(0, (Tcl_Obj* CONST*)NULL);
+
+ Itcl_InitStack(&search);
+ Itcl_PushStack((ClientData)globalNs, &search);
+@@ -709,7 +707,7 @@
+
+ objPtr = Tcl_NewStringObj((char*)NULL, 0);
+ Tcl_GetCommandFullName(interp, cmd, objPtr);
+- name = Tcl_GetStringFromObj(objPtr, (int*)NULL);
++ cmdName = Tcl_GetString(objPtr);
+ } else {
+ cmdName = Tcl_GetCommandName(interp, cmd);
+ objPtr = Tcl_NewStringObj(cmdName, -1);
+@@ -718,7 +716,8 @@
+ Tcl_CreateHashEntry(&unique, (char*)cmd, &newEntry);
+
+ match = 0;
+- if (newEntry && (!pattern || Tcl_StringMatch(name, pattern))) {
++ if (newEntry &&
++ (!pattern || Tcl_StringMatch(cmdName, pattern))) {
+ if (!classDefn || (contextObj->classDefn == classDefn)) {
+ if (!isaDefn) {
+ match = 1;
+@@ -736,10 +735,9 @@
+
+ if (match) {
+ Tcl_ListObjAppendElement((Tcl_Interp*)NULL,
+- listPtr, objPtr);
++ Tcl_GetObjResult(interp), objPtr);
+ } else {
+- Tcl_IncrRefCount(objPtr); /* throw away the name */
+- Tcl_DecrRefCount(objPtr);
++ Tcl_DecrRefCount(objPtr); /* throw away the name */
+ }
+ }
+ entry = Tcl_NextHashEntry(&place);
+@@ -759,7 +757,6 @@
+ Tcl_DeleteHashTable(&unique);
+ Itcl_DeleteStack(&search);
+
+- Tcl_SetObjResult(interp, listPtr);
+ return TCL_OK;
+ }
+
+@@ -821,9 +818,8 @@
+ }
+ else if (result != TCL_OK) {
+ char mesg[256], *name;
+- name = Tcl_GetStringFromObj(objv[0], (int*)NULL);
+- sprintf(mesg, "\n (%.100s body line %d)",
+- name, interp->errorLine);
++ name = Tcl_GetString(objv[0]);
++ sprintf(mesg, "\n (%.100s body line %d)", name, interp->errorLine);
+ Tcl_AddErrorInfo(interp, mesg);
+ }
+
+@@ -865,7 +861,7 @@
+ * then delete them.
+ */
+ for (i=1; i < objc; i++) {
+- name = Tcl_GetStringFromObj(objv[i], (int*)NULL);
++ name = Tcl_GetString(objv[i]);
+ cdefn = Itcl_FindClass(interp, name, /* autoload */ 1);
+ if (cdefn == NULL) {
+ return TCL_ERROR;
+@@ -873,7 +869,7 @@
+ }
+
+ for (i=1; i < objc; i++) {
+- name = Tcl_GetStringFromObj(objv[i], (int*)NULL);
++ name = Tcl_GetString(objv[i]);
+ cdefn = Itcl_FindClass(interp, name, /* autoload */ 0);
+
+ if (cdefn) {
diff --git a/lang/itcl/files/patch-tests+ensemble.test b/lang/itcl/files/patch-tests+ensemble.test
new file mode 100644
index 000000000000..7470860d29bc
--- /dev/null
+++ b/lang/itcl/files/patch-tests+ensemble.test
@@ -0,0 +1,32 @@
+===================================================================
+RCS file: /cvsroot/incrtcl/incrTcl/itcl/tests/ensemble.test,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- tests/ensemble.test 2000/06/01 20:34:35 1.3
++++ tests/ensemble.test 2001/11/05 19:42:11 1.4
+@@ -6,7 +6,7 @@
+ # mmclennan@lucent.com
+ # http://www.tcltk.com/itcl
+ #
+-# RCS: $Id: ensemble.test,v 1.3 2000/06/01 20:34:35 wart Exp $
++# RCS: $Id: ensemble.test,v 1.4 2001/11/05 19:42:11 hobbs Exp $
+ # ----------------------------------------------------------------------
+ # Copyright (c) 1993-1998 Lucent Technologies, Inc.
+ # ======================================================================
+@@ -45,8 +45,13 @@
+ } {{one: 1} {two: 2 3} {three: 3 4 5}}
+
+ test ensemble-1.5 {invoking parts with improper arguments} {
+- list [catch "test_numbers three x" msg] $msg
+-} {1 {no value given for parameter "y" to "test_numbers three"}}
++ set res [catch "test_numbers three x" msg]
++ if {[package vsatisfies [package provide Tcl] 8.4]} {
++ lappend res [string match "wrong # args*" $msg]
++ } else {
++ lappend res [string match "no value given*" $msg]
++ }
++} {1 1}
+
+ test ensemble-1.6 {errors trigger a usage summary} {
+ list [catch "test_numbers foo x y" msg] $msg