cvs commit: ponie/perl/ext/threads threads.xs

[email protected] (Nicholas Clark) 10 Apr 2005 04:17:50 -0000
Newsgroups perl.ponie.changes
Message-ID <[email protected]>
cvsuser     05/04/09 21:17:50

  Modified:    perl     doio.c op.c pad.c pp.c pp_ctl.c pp_hot.c sv.c sv.h
                        toke.c util.c
               perl/ext/ByteLoader byterun.c
               perl/ext/List/Util Util.xs
               perl/ext/threads threads.xs
  Log:
  Assimilate patches from Steve Peters from blead to convert NVX and IVX setting
  to use *_set macros.
  (also parts odf 24201 and 24206)
  
  Revision  Changes    Path
  1.2       +124 -49   ponie/perl/doio.c
  
  Index: doio.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/doio.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- doio.c	9 Sep 2003 11:58:48 -0000	1.1
  +++ doio.c	10 Apr 2005 04:17:48 -0000	1.2
  @@ -1,7 +1,7 @@
   /*    doio.c
    *
    *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
  - *    2000, 2001, 2002, 2003, by Larry Wall and others
  + *    2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
    *
    *    You may distribute under the terms of either the GNU General Public
    *    License or the Artistic License, as specified in the README file.
  @@ -15,6 +15,11 @@
    * chattering, into calmer and more level reaches."
    */
   
  +/* This file contains functions that do the actual I/O on behalf of ops.
  + * For example, pp_print() calls the do_print() function in this file for
  + * each argument needing printing.
  + */
  +
   #include "EXTERN.h"
   #define PERL_IN_DOIO_C
   #include "perl.h"
  @@ -48,9 +53,10 @@
   #  define OPEN_EXCL 0
   #endif
   
  -#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
  +#define PERL_MODE_MAX 8
  +#define PERL_FLAGS_MAX 10
  +
   #include <signal.h>
  -#endif
   
   bool
   Perl_do_open(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
  @@ -86,7 +92,7 @@
       bool was_fdopen = FALSE;
       bool in_raw = 0, in_crlf = 0, out_raw = 0, out_crlf = 0;
       char *type  = NULL;
  -    char mode[8];		/* stdio file mode ("r\0", "rb\0", "r+b\0" etc.) */
  +    char mode[PERL_MODE_MAX];	/* stdio file mode ("r\0", "rb\0", "r+b\0" etc.) */
       SV *namesv;
   
       Zero(mode,sizeof(mode),char);
  @@ -94,7 +100,7 @@
   
       /* Collect default raw/crlf info from the op */
       if (PL_op && PL_op->op_type == OP_OPEN) {
  -	/* set up disciplines */
  +	/* set up IO layers */
   	U8 flags = PL_op->op_private;
   	in_raw = (flags & OPpOPEN_IN_RAW);
   	in_crlf = (flags & OPpOPEN_IN_CRLF);
  @@ -141,7 +147,7 @@
       if (as_raw) {
           /* sysopen style args, i.e. integer mode and permissions */
   	STRLEN ix = 0;
  -	int appendtrunc =
  +	const int appendtrunc =
   	     0
   #ifdef O_APPEND	/* Not fully portable. */
   	     |O_APPEND
  @@ -150,8 +156,7 @@
   	     |O_TRUNC
   #endif
   	     ;
  -	int modifyingmode =
  -	     O_WRONLY|O_RDWR|O_CREAT|appendtrunc;
  +	int modifyingmode = O_WRONLY|O_RDWR|O_CREAT|appendtrunc;
   	int ismodifying;
   
   	if (num_svs != 0) {
  @@ -212,7 +217,7 @@
   	    *--tend = '\0';
   
   	if (num_svs) {
  -	    /* New style explict name, type is just mode and discipline/layer info */
  +	    /* New style explicit name, type is just mode and layer info */
   	    STRLEN l = 0;
   #ifdef USE_STDIO
   	    if (SvROK(*svp) && !strchr(name,'&')) {
  @@ -236,7 +241,7 @@
   	if ((*type == IoTYPE_RDWR) && /* scary */
              (*(type+1) == IoTYPE_RDONLY || *(type+1) == IoTYPE_WRONLY) &&
   	    ((!num_svs || (tend > type+1 && tend[-1] != IoTYPE_PIPE)))) {
  -        TAINT_PROPER("open");
  +	    TAINT_PROPER("open");
   	    mode[1] = *type++;
   	    writing = 1;
   	}
  @@ -244,7 +249,7 @@
   	if (*type == IoTYPE_PIPE) {
   	    if (num_svs) {
   		if (type[1] != IoTYPE_STD) {
  -	          unknown_desr:
  +	          unknown_open_mode:
   		    Perl_croak(aTHX_ "Unknown open() mode '%.*s'", (int)olen, oname);
   		}
   		type++;
  @@ -262,7 +267,7 @@
   		errno = EPIPE;
   		goto say_false;
   	    }
  -	    if (strNE(name,"-") || num_svs)
  +	    if ((*name == '-' && name[1] == '\0') || num_svs)
   		TAINT_ENV();
   	    TAINT_PROPER("piped open");
   	    if (!num_svs && name[len-1] == '|') {
  @@ -272,10 +277,17 @@
   	    }
   	    mode[0] = 'w';
   	    writing = 1;
  +#ifdef HAS_STRLCAT
  +            if (out_raw)
  +                strlcat(mode, "b", PERL_MODE_MAX);
  +            else if (out_crlf)
  +                strlcat(mode, "t", PERL_MODE_MAX); 
  +#else
   	    if (out_raw)
   		strcat(mode, "b");
   	    else if (out_crlf)
   		strcat(mode, "t");
  +#endif
   	    if (num_svs > 1) {
   		fp = PerlProc_popen_list(mode, num_svs, svp);
   	    }
  @@ -289,7 +301,7 @@
   		    }
   		}
   	    }
  -	}
  +	} /* IoTYPE_PIPE */
   	else if (*type == IoTYPE_WRONLY) {
   	    TAINT_PROPER("open");
   	    type++;
  @@ -303,11 +315,17 @@
   	    }
   	    writing = 1;
   
  +#ifdef HAS_STRLCAT
  +            if (out_raw)
  +                strlcat(mode, "b", PERL_MODE_MAX);
  +            else if (out_crlf)
  +                strlcat(mode, "t", PERL_MODE_MAX);
  +#else
   	    if (out_raw)
   		strcat(mode, "b");
   	    else if (out_crlf)
   		strcat(mode, "t");
  -
  +#endif
   	    if (*type == '&') {
   	      duplicity:
   		dodup = PERLIO_DUP_FD;
  @@ -334,7 +352,7 @@
   			fd = atoi(type);
   		    }
   		    else {
  -			IO* thatio;
  +			const IO* thatio;
   			if (num_svs) {
   			    thatio = sv_2io(*svp);
   			}
  @@ -422,16 +440,24 @@
   		    fp = PerlIO_openn(aTHX_ type,mode,-1,0,0,NULL,num_svs,svp);
   		}
   	    } /* !& */
  -	}
  +	    if (!fp && type && *type && *type != ':' && !isIDFIRST(*type))
  +	       goto unknown_open_mode;
  +	} /* IoTYPE_WRONLY */
   	else if (*type == IoTYPE_RDONLY) {
   	    /*SUPPRESS 530*/
   	    for (type++; isSPACE(*type); type++) ;
   	    mode[0] = 'r';
  +#ifdef HAS_STRLCAT
  +            if (in_raw)
  +                strlcat(mode, "b", PERL_MODE_MAX);
  +            else if (in_crlf)
  +                strlcat(mode, "t", PERL_MODE_MAX);
  +#else
   	    if (in_raw)
   		strcat(mode, "b");
   	    else if (in_crlf)
   		strcat(mode, "t");
  -
  +#endif
   	    if (*type == '&') {
   		goto duplicity;
   	    }
  @@ -453,8 +479,11 @@
   		}
   		fp = PerlIO_openn(aTHX_ type,mode,-1,0,0,NULL,num_svs,svp);
   	    }
  -	}
  -	else if ((num_svs && type[0] == IoTYPE_STD && type[1] == IoTYPE_PIPE) ||
  +	    if (!fp && type && *type && *type != ':' && !isIDFIRST(*type))
  +	       goto unknown_open_mode;
  +	} /* IoTYPE_RDONLY */
  +	else if ((num_svs && /* '-|...' or '...|' */
  +		  type[0] == IoTYPE_STD && type[1] == IoTYPE_PIPE) ||
   	         (!num_svs && tend > type+1 && tend[-1] == IoTYPE_PIPE)) {
   	    if (num_svs) {
   		type += 2;   /* skip over '-|' */
  @@ -475,14 +504,23 @@
   		errno = EPIPE;
   		goto say_false;
   	    }
  -	    if (strNE(name,"-") || num_svs)
  +	    if (!(*name == '-' && name[1] == '\0') || num_svs)
   		TAINT_ENV();
   	    TAINT_PROPER("piped open");
   	    mode[0] = 'r';
  +
  +#ifdef HAS_STRLCAT
  +            if (in_raw)
  +                strlcat(mode, "b", PERL_MODE_MAX);
  +            else if (in_crlf)
  +                strlcat(mode, "t", PERL_MODE_MAX);
  +#else
   	    if (in_raw)
   		strcat(mode, "b");
   	    else if (in_crlf)
   		strcat(mode, "t");
  +#endif
  +
   	    if (num_svs > 1) {
   		fp = PerlProc_popen_list(mode,num_svs,svp);
   	    }
  @@ -499,19 +537,28 @@
   		}
   	    }
   	}
  -	else {
  +	else { /* layer(Args) */
   	    if (num_svs)
  -		goto unknown_desr;
  +		goto unknown_open_mode;
   	    name = type;
   	    IoTYPE(io) = IoTYPE_RDONLY;
   	    /*SUPPRESS 530*/
   	    for (; isSPACE(*name); name++) ;
   	    mode[0] = 'r';
  +
  +#ifdef HAS_STRLCAT
  +            if (in_raw)
  +                strlcat(mode, "b", PERL_MODE_MAX);
  +            else if (in_crlf)
  +                strlcat(mode, "t", PERL_MODE_MAX);
  +#else
   	    if (in_raw)
   		strcat(mode, "b");
   	    else if (in_crlf)
   		strcat(mode, "t");
  -	    if (strEQ(name,"-")) {
  +#endif
  +
  +	    if (*name == '-' && name[1] == '\0') {
   		fp = PerlIO_stdin();
   		IoTYPE(io) = IoTYPE_STD;
   	    }
  @@ -629,10 +676,10 @@
                   sv = *av_fetch(PL_fdpid,fd,TRUE);
                   (void)SvUPGRADE(sv, SVt_IV);
                   pid = SvIVX(sv);
  -                SvIVX(sv) = 0;
  +                SvIV_set(sv, 0);
                   sv = *av_fetch(PL_fdpid,savefd,TRUE);
                   (void)SvUPGRADE(sv, SVt_IV);
  -                SvIVX(sv) = pid;
  +                SvIV_set(sv, pid);
                   UNLOCK_FDPID_MUTEX;
               }
   #endif
  @@ -720,11 +767,13 @@
       if (PL_filemode & (S_ISUID|S_ISGID)) {
   	PerlIO_flush(IoIFP(GvIOn(PL_argvoutgv)));  /* chmod must follow last write */
   #ifdef HAS_FCHMOD
  -	(void)fchmod(PL_lastfd,PL_filemode);
  +	if (PL_lastfd != -1)
  +	    (void)fchmod(PL_lastfd,PL_filemode);
   #else
   	(void)PerlLIO_chmod(PL_oldname,PL_filemode);
   #endif
       }
  +    PL_lastfd = -1;
       PL_filemode = 0;
       if (!GvAV(gv))
           return Nullfp;
  @@ -932,8 +981,8 @@
   
       if (PerlProc_pipe(fd) < 0)
   	goto badexit;
  -    IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPESOCK_MODE);
  -    IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPESOCK_MODE);
  +    IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
  +    IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
       IoOFP(rstio) = IoIFP(rstio);
       IoIFP(wstio) = IoOFP(wstio);
       IoTYPE(rstio) = IoTYPE_RDONLY;
  @@ -1009,11 +1058,14 @@
   	    retval = TRUE;
   	else {
   	    if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {		/* a socket */
  -		retval = (PerlIO_close(IoOFP(io)) != EOF);
  +		bool prev_err = PerlIO_error(IoOFP(io));
  +		retval = (PerlIO_close(IoOFP(io)) != EOF && !prev_err);
   		PerlIO_close(IoIFP(io));	/* clear stdio, fd already closed */
   	    }
  -	    else
  -		retval = (PerlIO_close(IoIFP(io)) != EOF);
  +	    else {
  +		bool prev_err = PerlIO_error(IoIFP(io));
  +		retval = (PerlIO_close(IoIFP(io)) != EOF && !prev_err);
  +	    }
   	}
   	IoOFP(io) = IoIFP(io) = Nullfp;
       }
  @@ -1131,7 +1183,7 @@
   	    if (*s == ':') {
   		switch (s[1]) {
   		case 'r':
  -		    if (len > 3 && strnEQ(s+1, "raw", 3)
  +		    if (s[2] == 'a' && s[3] == 'w'
   			&& (!s[4] || s[4] == ':' || isSPACE(s[4])))
   		    {
   			mode = O_BINARY;
  @@ -1141,7 +1193,7 @@
   		    }
   		    /* FALL THROUGH */
   		case 'c':
  -		    if (len > 4 && strnEQ(s+1, "crlf", 4)
  +		    if (s[2] == 'r' && s[3] == 'l' && s[4] == 'f'
   			&& (!s[5] || s[5] == ':' || isSPACE(s[5])))
   		    {
   			mode = O_TEXT;
  @@ -1165,8 +1217,9 @@
   		if (!end)
   		    end = s+len;
   #ifndef PERLIO_LAYERS
  -		Perl_croak(aTHX_ "Unknown discipline '%.*s'", end-s, s);
  +		Perl_croak(aTHX_ "IO layers (like '%.*s') unavailable", end-s, s);
   #else
  +		len -= end-s;
   		s = end;
   #endif
   	    }
  @@ -1181,7 +1234,7 @@
    /* The old body of this is now in non-LAYER part of perlio.c
     * This is a stub for any XS code which might have been calling it.
     */
  - char *name = ":raw";
  + const char *name = ":raw";
   #ifdef PERLIO_USING_CRLF
    if (!(mode & O_BINARY))
        name = ":crlf";
  @@ -1189,14 +1242,15 @@
    return PerlIO_binmode(aTHX_ fp, iotype, mode, name);
   }
   
  -#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
  -	/* code courtesy of William Kucharski */
  -#define HAS_CHSIZE
  -
  +#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE)
   I32 my_chsize(fd, length)
   I32 fd;			/* file descriptor */
   Off_t length;		/* length to set file to */
   {
  +#ifdef F_FREESP
  +	/* code courtesy of William Kucharski */
  +#define HAS_CHSIZE
  +
       struct flock fl;
       Stat_t filebuf;
   
  @@ -1237,13 +1291,17 @@
       }
   
       return 0;
  -}
  +#else
  +    dTHX;
  +    DIE(aTHX_ "truncate not implemented");
   #endif /* F_FREESP */
  +}
  +#endif /* !HAS_TRUNCATE && !HAS_CHSIZE */
   
   bool
   Perl_do_print(pTHX_ register SV *sv, PerlIO *fp)
   {
  -    register char *tmps;
  +    register const char *tmps;
       STRLEN len;
   
       /* assuming fp is checked earlier */
  @@ -1265,7 +1323,7 @@
       switch (SvTYPE(sv)) {
       case SVt_NULL:
   	if (ckWARN(WARN_UNINITIALIZED))
  -	    report_uninit();
  +	    report_uninit(sv);
   	return TRUE;
       case SVt_IV:
   	if (SvIOK(sv)) {
  @@ -1333,6 +1391,9 @@
   	    return (PL_laststatval = -1);
   	}
       }
  +    else if (PL_op->op_private & OPpFT_STACKED) {
  +	return PL_laststatval;
  +    }
       else {
   	SV* sv = POPs;
   	char *s;
  @@ -1359,6 +1420,8 @@
       }
   }
   
  +static char no_prev_lstat[] = "The stat preceding -l _ wasn't an lstat";
  +
   I32
   Perl_my_lstat(pTHX)
   {
  @@ -1369,7 +1432,7 @@
   	EXTEND(SP,1);
   	if (cGVOP_gv == PL_defgv) {
   	    if (PL_laststype != OP_LSTAT)
  -		Perl_croak(aTHX_ "The stat preceding -l _ wasn't an lstat");
  +		Perl_croak(aTHX_ no_prev_lstat);
   	    return PL_laststatval;
   	}
   	if (ckWARN(WARN_IO)) {
  @@ -1378,6 +1441,9 @@
   	    return (PL_laststatval = -1);
   	}
       }
  +    else if (ckWARN(WARN_IO) && PL_laststype != OP_LSTAT
  +	    && (PL_op->op_private & OPpFT_STACKED))
  +	Perl_croak(aTHX_ no_prev_lstat);
   
       PL_laststype = OP_LSTAT;
       PL_statgv = Nullgv;
  @@ -1411,7 +1477,7 @@
       Perl_croak(aTHX_ "exec? I'm not *that* kind of operating system");
   #else
       register char **a;
  -    char *tmps = Nullch;
  +    const char *tmps = Nullch;
       STRLEN n_a;
   
       if (sp > mark) {
  @@ -1484,14 +1550,22 @@
   
   #ifdef CSH
       {
  -        char flags[10];
  +        char flags[PERL_FLAGS_MAX];
   	if (strnEQ(cmd,PL_cshname,PL_cshlen) &&
   	    strnEQ(cmd+PL_cshlen," -c",3)) {
  +#ifdef HAS_STRLCPY
  +          strlcpy(flags, "-c", PERL_FLAGS_MAX);
  +#else
   	  strcpy(flags,"-c");
  +#endif
   	  s = cmd+PL_cshlen+3;
   	  if (*s == 'f') {
   	      s++;
  +#ifdef HAS_STRLCPY
  +              strlcat(flags, "f", PERL_FLAGS_MAX);
  +#else
   	      strcat(flags,"f");
  +#endif
   	  }
   	  if (*s == ' ')
   	      s++;
  @@ -1543,7 +1617,7 @@
   
   		while (*t && isSPACE(*t))
   		    ++t;
  -		if (!*t && (dup2(1,2) != -1)) {
  +		if (!*t && (PerlLIO_dup2(1,2) != -1)) {
   		    s[-2] = '\0';
   		    break;
   		}
  @@ -1600,7 +1674,7 @@
       register I32 val;
       register I32 val2;
       register I32 tot = 0;
  -    char *what;
  +    const char *what;
       char *s;
       SV **oldmark = mark;
       STRLEN n_a;
  @@ -2285,8 +2359,9 @@
   		if (*cp == '?') *cp = '%';  /* VMS style single-char wildcard */
   	    while (ok && ((sts = lib$find_file(&wilddsc,&rsdsc,&cxt,
   					       &dfltdsc,NULL,NULL,NULL))&1)) {
  -		end = rstr + (unsigned long int) *rslt;
  -		if (!hasver) while (*end != ';') end--;
  +		/* with varying string, 1st word of buffer contains result length */
  +		end = rstr + *((unsigned short int*)rslt);
  +		if (!hasver) while (*end != ';' && end > rstr) end--;
   		*(end++) = '\n';  *end = '\0';
   		for (cp = rstr; *cp; cp++) *cp = _tolower(*cp);
   		if (hasdir) {
  
  
  
  1.4       +1 -1      ponie/perl/op.c
  
  Index: op.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/op.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- op.c	4 Apr 2005 17:46:12 -0000	1.3
  +++ op.c	10 Apr 2005 04:17:48 -0000	1.4
  @@ -3445,7 +3445,7 @@
   	SV **svp = av_fetch(CopFILEAV(PL_curcop), (I32)CopLINE(cop), FALSE);
           if (svp && *svp != &PL_sv_undef ) {
              (void)SvIOK_on(*svp);
  -	    SvIVX(*svp) = PTR2IV(cop);
  +	    SvIV_set(*svp, PTR2IV(cop));
   	}
       }
   
  
  
  
  1.5       +10 -10    ponie/perl/pad.c
  
  Index: pad.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/pad.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- pad.c	4 Apr 2005 17:46:12 -0000	1.4
  +++ pad.c	10 Apr 2005 04:17:49 -0000	1.5
  @@ -352,8 +352,8 @@
       }
       else {
   	/* not yet introduced */
  -	SvNVX(namesv) = (NV)PAD_MAX;	/* min */
  -	SvIVX(namesv) = 0;		/* max */
  +	SvNV_set(namesv, (NV)PAD_MAX);	/* min */
  +	SvIV_set(namesv, 0);		/* max */
   
   	if (!PL_min_intro_pending)
   	    PL_min_intro_pending = offset;
  @@ -462,8 +462,8 @@
       name = NEWSV(1106, 0);
       sv_upgrade(name, SVt_PVNV);
       sv_setpvn(name, "&", 1);
  -    SvIVX(name) = -1;
  -    SvNVX(name) = 1;
  +    SvIV_set(name, -1);
  +    SvNV_set(name, 1);
       ix = pad_alloc(op_type, SVs_PADMY);
       av_store(PL_comppad_name, ix, name);
       /* XXX DAPM use PL_curpad[] ? */
  @@ -826,15 +826,15 @@
   	);
   
   	new_namesv = AvARRAY(PL_comppad_name)[new_offset];
  -	SvIVX(new_namesv) = *out_flags;
  +	SvIV_set(new_namesv, *out_flags);
   
  -	SvNVX(new_namesv) = (NV)0;
  +	SvNV_set(new_namesv, (NV)0);
   	if (SvFLAGS(new_namesv) & SVpad_OUR) {
   	   /* do nothing */
   	}
   	else if (CvLATE(cv)) {
   	    /* delayed creation - just note the offset within parent pad */
  -	    SvNVX(new_namesv) = (NV)offset;
  +	    SvNV_set(new_namesv, (NV)offset);
   	    CvCLONE_on(cv);
   	}
   	else {
  @@ -963,8 +963,8 @@
   	if ((sv = svp[i]) && sv != &PL_sv_undef
   		&& !SvFAKE(sv) && !SvIVX(sv))
   	{
  -	    SvIVX(sv) = PAD_MAX;	/* Don't know scope end yet. */
  -	    SvNVX(sv) = (NV)PL_cop_seqmax;
  +	    SvIV_set(sv, PAD_MAX);	/* Don't know scope end yet. */
  +	    SvNV_set(sv, (NV)PL_cop_seqmax);
   	    DEBUG_Xv(PerlIO_printf(Perl_debug_log,
   		"Pad intromy: %ld \"%s\", (%ld,%ld)\n",
   		(long)i, SvPVX(sv),
  @@ -1013,7 +1013,7 @@
   	if ((sv = svp[off]) && sv != &PL_sv_undef
   		&& !SvFAKE(sv) && SvIVX(sv) == PAD_MAX)
   	{
  -	    SvIVX(sv) = PL_cop_seqmax;
  +	    SvIV_set(sv, PL_cop_seqmax);
   	    DEBUG_Xv(PerlIO_printf(Perl_debug_log,
   		"Pad leavemy: %ld \"%s\", (%ld,%ld)\n",
   		(long)off, SvPVX(sv),
  
  
  
  1.5       +3 -3      ponie/perl/pp.c
  
  Index: pp.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/pp.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- pp.c	4 Apr 2005 17:46:12 -0000	1.4
  +++ pp.c	10 Apr 2005 04:17:49 -0000	1.5
  @@ -844,7 +844,7 @@
       if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
           && SvIVX(TOPs) != IV_MIN)
       {
  -	--SvIVX(TOPs);
  +	SvIV_set(TOPs, SvIVX(TOPs) - 1);
   	/* SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK); */
   	SvPOK_off(TOPs);
   	SvNOK_off(TOPs);
  @@ -864,7 +864,7 @@
       if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
           && SvIVX(TOPs) != IV_MAX)
       {
  -	++SvIVX(TOPs);
  +	SvIV_set(TOPs, SvIVX(TOPs) + 1);
   	/* SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK); */
   	SvPOK_off(TOPs);
   	SvNOK_off(TOPs);
  @@ -888,7 +888,7 @@
       if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
           && SvIVX(TOPs) != IV_MIN)
       {
  -	--SvIVX(TOPs);
  +	SvIV_set(TOPs, SvIVX(TOPs) - 1);
   	/* SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK); */
   	SvPOK_off(TOPs);
   	SvNOK_off(TOPs);
  
  
  
  1.4       +5 -1      ponie/perl/pp_ctl.c
  
  Index: pp_ctl.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/pp_ctl.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- pp_ctl.c	4 Apr 2005 17:46:12 -0000	1.3
  +++ pp_ctl.c	10 Apr 2005 04:17:49 -0000	1.4
  @@ -2425,11 +2425,15 @@
   		    SV *sv = GvSV(PL_DBsub);
   		    CV *gotocv;
   
  +		    /* FIXME once we figure out just what the debugger is up to
  +		     */
  +		    save_item(sv);
   		    if (PERLDB_SUB_NN) {
   			(void)SvUPGRADE(sv, SVt_PVIV);
   			(void)SvIOK_on(sv);
  +			/*save_item(sv);*/
   			SAVEIV(SvIVX(sv));
  -			SvIVX(sv) = PTR2IV(cv); /* Do it the quickest way */
  +			SvIV_set(sv, PTR2IV(cv)); /* Do it the quickest way */
   		    } else {
   			save_item(sv);
   			gv_efullname3(sv, CvGV(cv), Nullch);
  
  
  
  1.9       +4 -2      ponie/perl/pp_hot.c
  
  Index: pp_hot.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/pp_hot.c,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- pp_hot.c	4 Apr 2005 17:46:12 -0000	1.8
  +++ pp_hot.c	10 Apr 2005 04:17:49 -0000	1.9
  @@ -315,7 +315,7 @@
       if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
           && SvIVX(TOPs) != IV_MAX)
       {
  -	++SvIVX(TOPs);
  +	SvIV_set(TOPs, SvIVX(TOPs) + 1);
   	/*SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);*/
   	SvPOK_off(TOPs);
   	SvNOK_off(TOPs);
  @@ -2573,6 +2573,7 @@
   {
       SV *dbsv = GvSV(PL_DBsub);
   
  +    /* FIXME once we figure out just what the debugger is up to */
       if (!PERLDB_SUB_NN) {
   	GV *gv = CvGV(cv);
   
  @@ -2595,8 +2596,9 @@
       else {
   	(void)SvUPGRADE(dbsv, SVt_PVIV);
   	(void)SvIOK_on(dbsv);
  +	/*save_item(dbsv);*/
   	SAVEIV(SvIVX(dbsv));
  -	SvIVX(dbsv) = PTR2IV(cv);	/* Do it the quickest way  */
  +	SvIV_set(dbsv, PTR2IV(cv));	/* Do it the quickest way  */
       }
   
       if (CvXSUB(cv))
  
  
  
  1.58      +92 -92    ponie/perl/sv.c
  
  Index: sv.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/sv.c,v
  retrieving revision 1.57
  retrieving revision 1.58
  diff -u -r1.57 -r1.58
  --- sv.c	4 Apr 2005 17:46:12 -0000	1.57
  +++ sv.c	10 Apr 2005 04:17:49 -0000	1.58
  @@ -1955,12 +1955,12 @@
       case SVt_IV:
   	SvANY(sv) = 0;
   	SvPMC_on(sv);
  -	SvIVX(sv)	= iv;
  +	SvIV_set(sv, iv);
   	break;
       case SVt_NV:
   	SvANY(sv) = 0;
   	SvPMC_on(sv);
  -	SvNVX(sv)	= nv;
  +	SvNV_set(sv, nv);
   	break;
       case SVt_RV:
   	SvANY(sv) = 0;
  @@ -1992,7 +1992,7 @@
   	}
   	SvCUR(sv)	= cur;
   	SvLEN(sv)	= len;
  -	SvIVX(sv)	= iv;
  +	SvIV_set(sv, iv);
   	if (SvNIOK(sv))
   	    (void)SvIOK_on(sv);
   	SvNOK_off(sv);
  @@ -2009,8 +2009,8 @@
   	}
   	SvCUR(sv)	= cur;
   	SvLEN(sv)	= len;
  -	SvIVX(sv)	= iv;
  -	SvNVX(sv)	= nv;
  +	SvIV_set(sv, iv);
  +	SvNV_set(sv, nv);
   	break;
       case SVt_PVMG:
   	SvANY(sv) = new_XPVMG();
  @@ -2024,8 +2024,8 @@
   	}
   	SvCUR(sv)	= cur;
   	SvLEN(sv)	= len;
  -	SvIVX(sv)	= iv;
  -	SvNVX(sv)	= nv;
  +	SvIV_set(sv, iv);
  +	SvNV_set(sv, nv);
   	SvMAGIC(sv)	= magic;
   	SvSTASH(sv)	= stash;
   	break;
  @@ -2041,8 +2041,8 @@
   	}
   	SvCUR(sv)	= cur;
   	SvLEN(sv)	= len;
  -	SvIVX(sv)	= iv;
  -	SvNVX(sv)	= nv;
  +	SvIV_set(sv, iv);
  +	SvNV_set(sv, nv);
   	SvMAGIC(sv)	= magic;
   	SvSTASH(sv)	= stash;
   	LvTARGOFF(sv)	= 0;
  @@ -2069,8 +2069,8 @@
   	}
   	AvMAX(sv)	= -1;
   	AvFILLp(sv)	= -1;
  -	SvIVX(sv)	= 0;
  -	SvNVX(sv)	= 0.0;
  +	SvIV_set(sv, 0);
  +	SvNV_set(sv, 0.0);
   	SvMAGIC(sv)	= magic;
   	SvSTASH(sv)	= stash;
   	AvALLOC(sv)	= 0;
  @@ -2109,8 +2109,8 @@
   	Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
   	SvCUR(sv)	= cur;
   	SvLEN(sv)	= len;
  -	SvIVX(sv)	= iv;
  -	SvNVX(sv)	= nv;
  +	SvIV_set(sv, iv);
  +	SvNV_set(sv, nv);
   	SvMAGIC(sv)	= magic;
   	SvSTASH(sv)	= stash;
   	break;
  @@ -2126,8 +2126,8 @@
   	}
   	SvCUR(sv)	= cur;
   	SvLEN(sv)	= len;
  -	SvIVX(sv)	= iv;
  -	SvNVX(sv)	= nv;
  +	SvIV_set(sv, iv);
  +	SvNV_set(sv, nv);
   	SvMAGIC(sv)	= magic;
   	SvSTASH(sv)	= stash;
   	GvGP(sv)	= 0;
  @@ -2148,8 +2148,8 @@
   	}
   	SvCUR(sv)	= cur;
   	SvLEN(sv)	= len;
  -	SvIVX(sv)	= iv;
  -	SvNVX(sv)	= nv;
  +	SvIV_set(sv, iv);
  +	SvNV_set(sv, nv);
   	SvMAGIC(sv)	= magic;
   	SvSTASH(sv)	= stash;
   	BmRARE(sv)	= 0;
  @@ -2169,8 +2169,8 @@
   	}
   	SvCUR(sv)	= cur;
   	SvLEN(sv)	= len;
  -	SvIVX(sv)	= iv;
  -	SvNVX(sv)	= nv;
  +	SvIV_set(sv, iv);
  +	SvNV_set(sv, nv);
   	SvMAGIC(sv)	= magic;
   	SvSTASH(sv)	= stash;
   	break;
  @@ -2187,8 +2187,8 @@
   	}
   	SvCUR(sv)	= cur;
   	SvLEN(sv)	= len;
  -	SvIVX(sv)	= iv;
  -	SvNVX(sv)	= nv;
  +	SvIV_set(sv, iv);
  +	SvNV_set(sv, nv);
   	SvMAGIC(sv)	= magic;
   	SvSTASH(sv)	= stash;
   	IoPAGE_LEN(sv)	= 60;
  @@ -2321,7 +2321,7 @@
   		   OP_DESC(PL_op));
       }
       (void)SvIOK_only(sv);			/* validate number */
  -    SvIVX(sv) = i;
  +    SvIV_set(sv, i);
       SvTAINT(sv);
   }
   
  @@ -2431,7 +2431,7 @@
   	Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
   		   OP_NAME(PL_op));
       }
  -    SvNVX(sv) = num;
  +    SvNV_set(sv, num);
       (void)SvNOK_only(sv);			/* validate number */
       SvTAINT(sv);
   }
  @@ -2642,7 +2642,7 @@
       if (SvNVX(sv) < (NV)IV_MIN) {
   	(void)SvIOKp_on(sv);
   	(void)SvNOK_on(sv);
  -	SvIVX(sv) = IV_MIN;
  +	SvIV_set(sv, IV_MIN);
   	return IS_NUMBER_UNDERFLOW_IV;
       }
       if (SvNVX(sv) > (NV)UV_MAX) {
  @@ -2657,7 +2657,7 @@
       /* Can't use strtol etc to convert this string.  (See truth table in
          sv_2iv  */
       if (SvNVX(sv) <= (UV)IV_MAX) {
  -        SvIVX(sv) = I_V(SvNVX(sv));
  +        SvIV_set(sv, I_V(SvNVX(sv)));
           if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
               SvIOK_on(sv); /* Integer is precise. NOK, IOK */
           } else {
  @@ -2765,7 +2765,7 @@
   	   answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
   	   cases go to UV */
   	if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
  -	    SvIVX(sv) = I_V(SvNVX(sv));
  +	    SvIV_set(sv, I_V(SvNVX(sv)));
   	    if (SvNVX(sv) == (NV) SvIVX(sv)
   #ifndef NV_PRESERVES_UV
   		&& (((UV)1 << NV_PRESERVES_UV_BITS) >
  @@ -2866,7 +2866,7 @@
   	    if (!(numtype & IS_NUMBER_NEG)) {
   		/* positive */;
   		if (value <= (UV)IV_MAX) {
  -		    SvIVX(sv) = (IV)value;
  +		    SvIV_set(sv, (IV)value);
   		} else {
   		    SvUVX(sv) = value;
   		    SvIsUV_on(sv);
  @@ -2874,7 +2874,7 @@
   	    } else {
   		/* 2s complement assumption  */
   		if (value <= (UV)IV_MIN) {
  -		    SvIVX(sv) = -(IV)value;
  +		    SvIV_set(sv, -(IV)value);
   		} else {
   		    /* Too negative for an IV.  This is a double upgrade, but
   		       I'm assuming it will be rare.  */
  @@ -2883,8 +2883,8 @@
   		    SvNOK_on(sv);
   		    SvIOK_off(sv);
   		    SvIOKp_on(sv);
  -		    SvNVX(sv) = -(NV)value;
  -		    SvIVX(sv) = IV_MIN;
  +		    SvNV_set(sv, -(NV)value);
  +		    SvIV_set(sv, IV_MIN);
   		}
   	    }
   	}
  @@ -2895,7 +2895,7 @@
   	if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
   	    != IS_NUMBER_IN_UV) {
   	    /* It wasn't an (integer that doesn't overflow the UV). */
  -	    SvNVX(sv) = Atof(SvPVX(sv));
  +	    SvNV_set(sv, Atof(SvPVX(sv)));
   
   	    if (! numtype && ckWARN(WARN_NUMERIC))
   		not_a_number(sv);
  @@ -2913,7 +2913,7 @@
   	    (void)SvIOKp_on(sv);
   	    (void)SvNOK_on(sv);
   	    if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
  -		SvIVX(sv) = I_V(SvNVX(sv));
  +		SvIV_set(sv, I_V(SvNVX(sv)));
   		if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
   		    SvIOK_on(sv);
   		} else {
  @@ -2953,7 +2953,7 @@
                       /* Small enough to preserve all bits. */
                       (void)SvIOKp_on(sv);
                       SvNOK_on(sv);
  -                    SvIVX(sv) = I_V(SvNVX(sv));
  +                    SvIV_set(sv, I_V(SvNVX(sv)));
                       if ((NV)(SvIVX(sv)) == SvNVX(sv))
                           SvIOK_on(sv);
                       /* Assumption: first non-preserved integer is < IV_MAX,
  @@ -3070,7 +3070,7 @@
   
   	(void)SvIOKp_on(sv);	/* Must do this first, to clear any SvOOK */
   	if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
  -	    SvIVX(sv) = I_V(SvNVX(sv));
  +	    SvIV_set(sv, I_V(SvNVX(sv)));
   	    if (SvNVX(sv) == (NV) SvIVX(sv)
   #ifndef NV_PRESERVES_UV
   		&& (((UV)1 << NV_PRESERVES_UV_BITS) >
  @@ -3167,7 +3167,7 @@
   	    if (!(numtype & IS_NUMBER_NEG)) {
   		/* positive */;
   		if (value <= (UV)IV_MAX) {
  -		    SvIVX(sv) = (IV)value;
  +		    SvIV_set(sv, (IV)value);
   		} else {
   		    /* it didn't overflow, and it was positive. */
   		    SvUVX(sv) = value;
  @@ -3176,7 +3176,7 @@
   	    } else {
   		/* 2s complement assumption  */
   		if (value <= (UV)IV_MIN) {
  -		    SvIVX(sv) = -(IV)value;
  +		    SvIV_set(sv, -(IV)value);
   		} else {
   		    /* Too negative for an IV.  This is a double upgrade, but
   		       I'm assuming it will be rare.  */
  @@ -3185,8 +3185,8 @@
   		    SvNOK_on(sv);
   		    SvIOK_off(sv);
   		    SvIOKp_on(sv);
  -		    SvNVX(sv) = -(NV)value;
  -		    SvIVX(sv) = IV_MIN;
  +		    SvNV_set(sv, -(NV)value);
  +		    SvIV_set(sv, IV_MIN);
   		}
   	    }
   	}
  @@ -3194,7 +3194,7 @@
   	if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
   	    != IS_NUMBER_IN_UV) {
   	    /* It wasn't an integer, or it overflowed the UV. */
  -	    SvNVX(sv) = Atof(SvPVX(sv));
  +	    SvNV_set(sv, Atof(SvPVX(sv)));
   
               if (! numtype && ckWARN(WARN_NUMERIC))
   		    not_a_number(sv);
  @@ -3211,7 +3211,7 @@
               (void)SvIOKp_on(sv);
               (void)SvNOK_on(sv);
               if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
  -                SvIVX(sv) = I_V(SvNVX(sv));
  +                SvIV_set(sv, I_V(SvNVX(sv)));
                   if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
                       SvIOK_on(sv);
                   } else {
  @@ -3251,7 +3251,7 @@
                       /* Small enough to preserve all bits. */
                       (void)SvIOKp_on(sv);
                       SvNOK_on(sv);
  -                    SvIVX(sv) = I_V(SvNVX(sv));
  +                    SvIV_set(sv, I_V(SvNVX(sv)));
                       if ((NV)(SvIVX(sv)) == SvNVX(sv))
                           SvIOK_on(sv);
                       /* Assumption: first non-preserved integer is < IV_MAX,
  @@ -3366,7 +3366,7 @@
           return SvNVX(sv);
       }
       if (SvIOKp(sv)) {
  -	SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
  +	SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
   #ifdef NV_PRESERVES_UV
   	SvNOK_on(sv);
   #else
  @@ -3388,12 +3388,12 @@
   	if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
   	    == IS_NUMBER_IN_UV) {
   	    /* It's definitely an integer */
  -	    SvNVX(sv) = (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value;
  +	    SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
   	} else
  -	    SvNVX(sv) = Atof(SvPVX(sv));
  +	    SvNV_set(sv, Atof(SvPVX(sv)));
   	SvNOK_on(sv);
   #else
  -	SvNVX(sv) = Atof(SvPVX(sv));
  +	SvNV_set(sv, Atof(SvPVX(sv)));
   	/* Only set the public NV OK flag if this NV preserves the value in
   	   the PV at least as well as an IV/UV would.
   	   Not sure how to do this 100% reliably. */
  @@ -3417,9 +3417,9 @@
                   SvIOKp_on(sv);
   
                   if (numtype & IS_NUMBER_NEG) {
  -                    SvIVX(sv) = -(IV)value;
  +                    SvIV_set(sv, -(IV)value);
                   } else if (value <= (UV)IV_MAX) {
  -		    SvIVX(sv) = (IV)value;
  +		    SvIV_set(sv, (IV)value);
   		} else {
   		    SvUVX(sv) = value;
   		    SvIsUV_on(sv);
  @@ -4349,7 +4349,7 @@
   		break;
   	    }
   	    (void)SvIOK_only(dstr);
  -	    SvIVX(dstr) = SvIVX(sstr);
  +	    SvIV_set(dstr,  SvIVX(sstr));
   	    if (SvIsUV(sstr))
   		SvIsUV_on(dstr);
   	    if (SvTAINTED(sstr))
  @@ -4371,7 +4371,7 @@
   		sv_upgrade(dstr, SVt_PVNV);
   		break;
   	    }
  -	    SvNVX(dstr) = SvNVX(sstr);
  +	    SvNV_set(dstr, SvNVX(sstr));
   	    (void)SvNOK_only(dstr);
   	    if (SvTAINTED(sstr))
   		SvTAINT(dstr);
  @@ -4638,7 +4638,7 @@
   	    if (sflags & SVf_NOK)
   		Parrot_PMC_set_intval_intkey(PL_Parrot,MUMBLE(dstr),
   					     Ponie_I_SVf_NOK, 1);
  -	    SvNVX(dstr) = SvNVX(sstr);
  +	    SvNV_set(dstr, SvNVX(sstr));
   	}
   	if (sflags & SVp_IOK) {
   	    (void)SvIOKp_on(dstr);
  @@ -4647,7 +4647,7 @@
   					     Ponie_I_SVf_IOK, 1);
   	    if (sflags & SVf_IVisUV)
   		SvIsUV_on(dstr);
  -	    SvIVX(dstr) = SvIVX(sstr);
  +	    SvIV_set(dstr, SvIVX(sstr));
   	}
   	if (SvAMAGIC(sstr)) {
   	    SvAMAGIC_on(dstr);
  @@ -4784,7 +4784,7 @@
   	    if (sflags & SVf_NOK)
   		Parrot_PMC_set_intval_intkey(PL_Parrot,MUMBLE(dstr),
   					     Ponie_I_SVf_NOK, 1);
  -	    SvNVX(dstr) = SvNVX(sstr);
  +	    SvNV_set(dstr, SvNVX(sstr));
   	}
   	if (sflags & SVp_IOK) {
   	    (void)SvIOKp_on(dstr);
  @@ -4793,7 +4793,7 @@
   					     Ponie_I_SVf_IOK, 1);
   	    if (sflags & SVf_IVisUV)
   		SvIsUV_on(dstr);
  -	    SvIVX(dstr) = SvIVX(sstr);
  +	    SvIV_set(dstr, SvIVX(sstr));
   	}
   	if (SvVOK(sstr)) {
   	    MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
  @@ -4812,13 +4812,13 @@
   	/* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
   	if (sflags & SVf_IVisUV)
   	    SvIsUV_on(dstr);
  -	SvIVX(dstr) = SvIVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
   	if (sflags & SVp_NOK) {
   	    if (sflags & SVf_NOK)
   		(void)SvNOK_on(dstr);
   	    else
   		(void)SvNOKp_on(dstr);
  -	    SvNVX(dstr) = SvNVX(sstr);
  +	    SvNV_set(dstr, SvNVX(sstr));
   	}
       }
       else if (sflags & SVp_NOK) {
  @@ -4828,7 +4828,7 @@
   	    (void)SvOK_off(dstr);
   	    SvNOKp_on(dstr);
   	}
  -	SvNVX(dstr) = SvNVX(sstr);
  +	SvNV_set(dstr, SvNVX(sstr));
       }
       else {
   	if (dtype == SVt_PVGV) {
  @@ -5253,7 +5253,7 @@
   	    Move(pvx,SvPVX(sv),len,char);
   	    *SvEND(sv) = '\0';
   	}
  -	SvIVX(sv) = 0;
  +	SvIV_set(sv, 0);
   	/* Same SvOOK_on but SvOOK_on does a SvIOK_off
   	   and we do that anyway inside the SvNIOK_off
   	*/
  @@ -5263,7 +5263,7 @@
       SvLEN(sv) -= delta;
       SvCUR(sv) -= delta;
       SvPVX(sv) += delta;
  -    SvIVX(sv) += delta;
  +    SvIV_set(sv, SvIVX(sv) + delta);
   }
   
   /* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
  @@ -7500,14 +7500,14 @@
   		sv_setuv(sv, (UV)IV_MAX + 1);
   	    else {
   		(void)SvIOK_only(sv);
  -		++SvIVX(sv);
  +		SvIV_set(sv, SvIVX(sv) + 1);
   	    }	
   	}
   	return;
       }
       if (flags & SVp_NOK) {
   	(void)SvNOK_only(sv);
  -	SvNVX(sv) += 1.0;
  +        SvNV_set(sv, SvNVX(sv) + 1.0);
   	return;
       }
   
  @@ -7515,7 +7515,7 @@
   	if ((flags & SVTYPEMASK) < SVt_PVIV)
   	    sv_upgrade(sv, SVt_IV);
   	(void)SvIOK_only(sv);
  -	SvIVX(sv) = 1;
  +	SvIV_set(sv, 1);
   	return;
       }
       d = SvPVX(sv);
  @@ -7542,7 +7542,7 @@
   	    /* sv_2iv *should* have made this an NV */
   	    if (flags & SVp_NOK) {
   		(void)SvNOK_only(sv);
  -		SvNVX(sv) += 1.0;
  +                SvNV_set(sv, SvNVX(sv) + 1.0);
   		return;
   	    }
   	    /* I don't think we can get here. Maybe I should assert this
  @@ -7644,7 +7644,7 @@
   	if (SvIsUV(sv)) {
   	    if (SvUVX(sv) == 0) {
   		(void)SvIOK_only(sv);
  -		SvIVX(sv) = -1;
  +		SvIV_set(sv, -1);
   	    }
   	    else {
   		(void)SvIOK_only_UV(sv);
  @@ -7655,20 +7655,20 @@
   		sv_setnv(sv, (NV)IV_MIN - 1.0);
   	    else {
   		(void)SvIOK_only(sv);
  -		--SvIVX(sv);
  +		SvIV_set(sv, SvIVX(sv) - 1);
   	    }	
   	}
   	return;
       }
       if (flags & SVp_NOK) {
  -	SvNVX(sv) -= 1.0;
  +        SvNV_set(sv, SvNVX(sv) - 1.0);
   	(void)SvNOK_only(sv);
   	return;
       }
       if (!(flags & SVp_POK)) {
   	if ((flags & SVTYPEMASK) < SVt_PVNV)
   	    sv_upgrade(sv, SVt_NV);
  -	SvNVX(sv) = -1.0;
  +	SvNV_set(sv, 1.0);
   	(void)SvNOK_only(sv);
   	return;
       }
  @@ -7690,7 +7690,7 @@
   	    /* sv_2iv *should* have made this an NV */
   	    if (flags & SVp_NOK) {
   		(void)SvNOK_only(sv);
  -		SvNVX(sv) -= 1.0;
  +                SvNV_set(sv, SvNVX(sv) - 1.0);
   		return;
   	    }
   	    /* I don't think we can get here. Maybe I should assert this
  @@ -11000,11 +11000,11 @@
   	break;
       case SVt_IV:
   	SvANY(dstr)	= new_XIV();
  -	SvIVX(dstr)	= SvIVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
   	break;
       case SVt_NV:
   	SvANY(dstr)	= new_XNV();
  -	SvNVX(dstr)	= SvNVX(sstr);
  +	SvNV_set(dstr, SvNVX(sstr));
   	break;
       case SVt_RV:
   	SvANY(dstr)	= new_XRV();
  @@ -11020,23 +11020,23 @@
   	SvANY(dstr)	= new_XPVIV();
   	SvCUR(dstr)	= SvCUR(sstr);
   	SvLEN(dstr)	= SvLEN(sstr);
  -	SvIVX(dstr)	= SvIVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
   	Perl_rvpv_dup(aTHX_ dstr, sstr, param);
   	break;
       case SVt_PVNV:
   	SvANY(dstr)	= new_XPVNV();
   	SvCUR(dstr)	= SvCUR(sstr);
   	SvLEN(dstr)	= SvLEN(sstr);
  -	SvIVX(dstr)	= SvIVX(sstr);
  -	SvNVX(dstr)	= SvNVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
  +	SvNV_set(dstr, SvNVX(sstr));
   	Perl_rvpv_dup(aTHX_ dstr, sstr, param);
   	break;
       case SVt_PVMG:
   	SvANY(dstr)	= new_XPVMG();
   	SvCUR(dstr)	= SvCUR(sstr);
   	SvLEN(dstr)	= SvLEN(sstr);
  -	SvIVX(dstr)	= SvIVX(sstr);
  -	SvNVX(dstr)	= SvNVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
  +	SvNV_set(dstr, SvNVX(sstr));
   	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr), param);
   	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr), param);
   	Perl_rvpv_dup(aTHX_ dstr, sstr, param);
  @@ -11045,8 +11045,8 @@
   	SvANY(dstr)	= new_XPVBM();
   	SvCUR(dstr)	= SvCUR(sstr);
   	SvLEN(dstr)	= SvLEN(sstr);
  -	SvIVX(dstr)	= SvIVX(sstr);
  -	SvNVX(dstr)	= SvNVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
  +	SvNV_set(dstr, SvNVX(sstr));
   	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr), param);
   	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr), param);
   	Perl_rvpv_dup(aTHX_ dstr, sstr, param);
  @@ -11058,8 +11058,8 @@
   	SvANY(dstr)	= new_XPVLV();
   	SvCUR(dstr)	= SvCUR(sstr);
   	SvLEN(dstr)	= SvLEN(sstr);
  -	SvIVX(dstr)	= SvIVX(sstr);
  -	SvNVX(dstr)	= SvNVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
  +	SvNV_set(dstr, SvNVX(sstr));
   	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr), param);
   	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr), param);
   	Perl_rvpv_dup(aTHX_ dstr, sstr, param);
  @@ -11090,8 +11090,8 @@
   	SvANY(dstr)	= new_XPVGV();
   	SvCUR(dstr)	= SvCUR(sstr);
   	SvLEN(dstr)	= SvLEN(sstr);
  -	SvIVX(dstr)	= SvIVX(sstr);
  -	SvNVX(dstr)	= SvNVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
  +	SvNV_set(dstr, SvNVX(sstr));
   	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr), param);
   	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr), param);
   	Perl_rvpv_dup(aTHX_ dstr, sstr, param);
  @@ -11106,8 +11106,8 @@
   	SvANY(dstr)	= new_XPVIO();
   	SvCUR(dstr)	= SvCUR(sstr);
   	SvLEN(dstr)	= SvLEN(sstr);
  -	SvIVX(dstr)	= SvIVX(sstr);
  -	SvNVX(dstr)	= SvNVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
  +	SvNV_set(dstr, SvNVX(sstr));
   	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr), param);
   	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr), param);
   	Perl_rvpv_dup(aTHX_ dstr, sstr, param);
  @@ -11148,8 +11148,8 @@
   	SvANY(dstr)	= new_XPVAV();
   	SvCUR(dstr)	= SvCUR(sstr);
   	SvLEN(dstr)	= SvLEN(sstr);
  -	SvIVX(dstr)	= SvIVX(sstr);
  -	SvNVX(dstr)	= SvNVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
  +	SvNV_set(dstr, SvNVX(sstr));
   	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr), param);
   	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr), param);
   	AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
  @@ -11185,8 +11185,8 @@
   	SvANY(dstr)	= new_XPVHV();
   	SvCUR(dstr)	= SvCUR(sstr);
   	SvLEN(dstr)	= SvLEN(sstr);
  -	SvIVX(dstr)	= SvIVX(sstr);
  -	SvNVX(dstr)	= SvNVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
  +	SvNV_set(dstr, SvNVX(sstr));
   	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr), param);
   	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr), param);
   	HvRITER((HV*)dstr)	= HvRITER((HV*)sstr);
  @@ -11225,8 +11225,8 @@
           dup_pvcv:
   	SvCUR(dstr)	= SvCUR(sstr);
   	SvLEN(dstr)	= SvLEN(sstr);
  -	SvIVX(dstr)	= SvIVX(sstr);
  -	SvNVX(dstr)	= SvNVX(sstr);
  +	SvIV_set(dstr, SvIVX(sstr));
  +	SvNV_set(dstr, SvNVX(sstr));
   	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr), param);
   	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr), param);
   	Perl_rvpv_dup(aTHX_ dstr, sstr, param);
  @@ -11908,8 +11908,8 @@
       SvPVX(&PL_sv_no)		= SAVEPVN(PL_No, 0);
       SvCUR(&PL_sv_no)		= 0;
       SvLEN(&PL_sv_no)		= 1;
  -    SvIVX(&PL_sv_no)		= 0;
  -    SvNVX(&PL_sv_no)		= 0;
  +    SvIV_set(&PL_sv_no, 0);
  +    SvNV_set(&PL_sv_no, 0);
       ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
   
       SvANY(&PL_sv_yes)		= new_XPVNV();
  @@ -11919,8 +11919,8 @@
       SvPVX(&PL_sv_yes)		= SAVEPVN(PL_Yes, 1);
       SvCUR(&PL_sv_yes)		= 1;
       SvLEN(&PL_sv_yes)		= 2;
  -    SvIVX(&PL_sv_yes)		= 1;
  -    SvNVX(&PL_sv_yes)		= 1;
  +    SvIV_set(&PL_sv_yes, 1);
  +    SvNV_set(&PL_sv_yes, 1);
       ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
   
       /* create (a non-shared!) shared string table */
  
  
  
  1.62      +8 -2      ponie/perl/sv.h
  
  Index: sv.h
  ===================================================================
  RCS file: /cvs/public/ponie/perl/sv.h,v
  retrieving revision 1.61
  retrieving revision 1.62
  diff -u -r1.61 -r1.62
  --- sv.h	4 Apr 2005 17:46:12 -0000	1.61
  +++ sv.h	10 Apr 2005 04:17:49 -0000	1.62
  @@ -864,9 +864,15 @@
   #define SvRV(sv) (* Perl_macro_SvRV(aTHX_ (SV*) (sv)))
   #define SvRVx(sv) SvRV(sv)
   
  +#ifdef PERL_CORE
  +#define SvIVX(sv) (* Perl_macro_SvIVX(aTHX_ (SV*) (sv)))
  +#define SvUVX(sv) (* Perl_macro_SvUVX(aTHX_ (SV*) (sv)))
  +#define SvNVX(sv) (0.0 + * Perl_macro_SvNVX(aTHX_ (SV*) (sv)))
  +#else
   #define SvIVX(sv) (* Perl_macro_SvIVX(aTHX_ (SV*) (sv)))
   #define SvUVX(sv) (* Perl_macro_SvUVX(aTHX_ (SV*) (sv)))
   #define SvNVX(sv) (* Perl_macro_SvNVX(aTHX_ (SV*) (sv)))
  +#endif
   
   #define SvIVXx(sv) SvIVX(sv)
   #define SvUVXx(sv) SvUVX(sv)
  @@ -890,10 +896,10 @@
   		(void) SvIV(sv); } STMT_END
   #define SvIV_set(sv, val) \
   	STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
  -		(SvIVX(sv) = (val)); } STMT_END
  +		(* Perl_macro_SvIVX(aTHX_ (SV*) (sv)) = (val)); } STMT_END
   #define SvNV_set(sv, val) \
   	STMT_START { assert(SvTYPE(sv) == SVt_NV || SvTYPE(sv) >= SVt_PVNV); \
  -		(SvNVX(sv) = (val)); } STMT_END
  +		(* Perl_macro_SvNVX(aTHX_ (SV*) (sv)) = (val)); } STMT_END
   #define SvPV_set(sv, val) \
   	STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
   		(SvPVX(sv) = (val)); } STMT_END
  
  
  
  1.2       +3844 -913 ponie/perl/toke.c
  
  Index: toke.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/toke.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- toke.c	9 Sep 2003 11:58:56 -0000	1.1
  +++ toke.c	10 Apr 2005 04:17:49 -0000	1.2
  @@ -1,7 +1,7 @@
   /*    toke.c
    *
    *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
  - *    2000, 2001, 2002, 2003, by Larry Wall and others
  + *    2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
    *
    *    You may distribute under the terms of either the GNU General Public
    *    License or the Artistic License, as specified in the README file.
  @@ -23,12 +23,12 @@
   #define PERL_IN_TOKE_C
   #include "perl.h"
   
  -#define yychar	PL_yychar
  -#define yylval	PL_yylval
  +#define yychar	(*PL_yycharp)
  +#define yylval	(*PL_yylvalp)
   
  -static char ident_too_long[] = "Identifier too long";
  -static char c_without_g[] = "Use of /c modifier is meaningless without /g";
  -static char c_in_subst[] = "Use of /c modifier is meaningless in s///";
  +static char const ident_too_long[] = "Identifier too long";
  +static char const c_without_g[] = "Use of /c modifier is meaningless without /g";
  +static char const c_in_subst[] = "Use of /c modifier is meaningless in s///";
   
   static void restore_rsfp(pTHX_ void *f);
   #ifndef PERL_NO_UTF16_FILTER
  @@ -75,24 +75,24 @@
   #define LEX_FORMLINE		 1
   #define LEX_KNOWNEXT		 0
   
  -#ifdef ff_next
  -#undef ff_next
  +#ifdef DEBUGGING
  +static char const* lex_state_names[] = {
  +    "KNOWNEXT",
  +    "FORMLINE",
  +    "INTERPCONST",
  +    "INTERPCONCAT",
  +    "INTERPENDMAYBE",
  +    "INTERPEND",
  +    "INTERPSTART",
  +    "INTERPPUSH",
  +    "INTERPCASEMOD",
  +    "INTERPNORMAL",
  +    "NORMAL"
  +};
   #endif
   
  -#ifdef USE_PURE_BISON
  -#  ifndef YYMAXLEVEL
  -#    define YYMAXLEVEL 100
  -#  endif
  -YYSTYPE* yylval_pointer[YYMAXLEVEL];
  -int* yychar_pointer[YYMAXLEVEL];
  -int yyactlevel = -1;
  -#  undef yylval
  -#  undef yychar
  -#  define yylval (*yylval_pointer[yyactlevel])
  -#  define yychar (*yychar_pointer[yyactlevel])
  -#  define PERL_YYLEX_PARAM yylval_pointer[yyactlevel],yychar_pointer[yyactlevel]
  -#  undef yylex
  -#  define yylex()      Perl_yylex_r(aTHX_ yylval_pointer[yyactlevel],yychar_pointer[yyactlevel])
  +#ifdef ff_next
  +#undef ff_next
   #endif
   
   #include "keywords.h"
  @@ -132,79 +132,198 @@
    * Also see LOP and lop() below.
    */
   
  -/* Note that REPORT() and REPORT2() will be expressions that supply
  - * their own trailing comma, not suitable for statements as such. */
   #ifdef DEBUGGING /* Serve -DT. */
  -#   define REPORT(x,retval) tokereport(x,s,(int)retval),
  -#   define REPORT2(x,retval) tokereport(x,s, yylval.ival),
  +#   define REPORT(retval) tokereport(s,(int)retval)
   #else
  -#   define REPORT(x,retval)
  -#   define REPORT2(x,retval)
  +#   define REPORT(retval) (retval)
   #endif
   
  -#define TOKEN(retval) return (REPORT2("token",retval) PL_bufptr = s,(int)retval)
  -#define OPERATOR(retval) return (REPORT2("operator",retval) PL_expect = XTERM, PL_bufptr = s,(int)retval)
  -#define AOPERATOR(retval) return ao((REPORT2("aop",retval) PL_expect = XTERM, PL_bufptr = s,(int)retval))
  -#define PREBLOCK(retval) return (REPORT2("preblock",retval) PL_expect = XBLOCK,PL_bufptr = s,(int)retval)
  -#define PRETERMBLOCK(retval) return (REPORT2("pretermblock",retval) PL_expect = XTERMBLOCK,PL_bufptr = s,(int)retval)
  -#define PREREF(retval) return (REPORT2("preref",retval) PL_expect = XREF,PL_bufptr = s,(int)retval)
  -#define TERM(retval) return (CLINE, REPORT2("term",retval) PL_expect = XOPERATOR, PL_bufptr = s,(int)retval)
  -#define LOOPX(f) return(yylval.ival=f, REPORT("loopx",f) PL_expect = XTERM,PL_bufptr = s,(int)LOOPEX)
  -#define FTST(f) return(yylval.ival=f, REPORT("ftst",f) PL_expect = XTERMORDORDOR,PL_bufptr = s,(int)UNIOP)
  -#define FUN0(f) return(yylval.ival = f, REPORT("fun0",f) PL_expect = XOPERATOR,PL_bufptr = s,(int)FUNC0)
  -#define FUN1(f) return(yylval.ival = f, REPORT("fun1",f) PL_expect = XOPERATOR,PL_bufptr = s,(int)FUNC1)
  -#define BOop(f) return ao((yylval.ival=f, REPORT("bitorop",f) PL_expect = XTERM,PL_bufptr = s,(int)BITOROP))
  -#define BAop(f) return ao((yylval.ival=f, REPORT("bitandop",f) PL_expect = XTERM,PL_bufptr = s,(int)BITANDOP))
  -#define SHop(f) return ao((yylval.ival=f, REPORT("shiftop",f) PL_expect = XTERM,PL_bufptr = s,(int)SHIFTOP))
  -#define PWop(f) return ao((yylval.ival=f, REPORT("powop",f) PL_expect = XTERM,PL_bufptr = s,(int)POWOP))
  -#define PMop(f) return(yylval.ival=f, REPORT("matchop",f) PL_expect = XTERM,PL_bufptr = s,(int)MATCHOP)
  -#define Aop(f) return ao((yylval.ival=f, REPORT("add",f) PL_expect = XTERM,PL_bufptr = s,(int)ADDOP))
  -#define Mop(f) return ao((yylval.ival=f, REPORT("mul",f) PL_expect = XTERM,PL_bufptr = s,(int)MULOP))
  -#define Eop(f) return(yylval.ival=f, REPORT("eq",f) PL_expect = XTERM,PL_bufptr = s,(int)EQOP)
  -#define Rop(f) return(yylval.ival=f, REPORT("rel",f) PL_expect = XTERM,PL_bufptr = s,(int)RELOP)
  +#define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
  +#define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
  +#define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
  +#define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
  +#define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
  +#define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
  +#define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
  +#define LOOPX(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
  +#define FTST(f)  return (yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
  +#define FUN0(f)  return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
  +#define FUN1(f)  return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
  +#define BOop(f)  return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
  +#define BAop(f)  return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
  +#define SHop(f)  return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
  +#define PWop(f)  return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
  +#define PMop(f)  return(yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
  +#define Aop(f)   return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
  +#define Mop(f)   return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
  +#define Eop(f)   return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
  +#define Rop(f)   return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
   
   /* This bit of chicanery makes a unary function followed by
    * a parenthesis into a function with one argument, highest precedence.
    * The UNIDOR macro is for unary functions that can be followed by the //
    * operator (such as C<shift // 0>).
    */
  -#define UNI2(f,x) return(yylval.ival = f, \
  -	REPORT("uni",f) \
  +#define UNI2(f,x) return ( \
  +	yylval.ival = f, \
   	PL_expect = x, \
   	PL_bufptr = s, \
   	PL_last_uni = PL_oldbufptr, \
   	PL_last_lop_op = f, \
  -	(*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
  +	REPORT( \
  +	    (*s == '(' || (s = skipspace(s), *s == '(')  \
  +	    ? (int)FUNC1 : (int)UNIOP)))
   #define UNI(f)    UNI2(f,XTERM)
   #define UNIDOR(f) UNI2(f,XTERMORDORDOR)
   
  -#define UNIBRACK(f) return(yylval.ival = f, \
  -        REPORT("uni",f) \
  +#define UNIBRACK(f) return ( \
  +	yylval.ival = f, \
   	PL_bufptr = s, \
   	PL_last_uni = PL_oldbufptr, \
  -	(*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
  +        REPORT( \
  +	    (*s == '(' || (s = skipspace(s), *s == '(') \
  +	? (int)FUNC1 : (int)UNIOP)))
   
   /* grandfather return to old style */
   #define OLDLOP(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
   
   #ifdef DEBUGGING
   
  -STATIC void
  -S_tokereport(pTHX_ char *thing, char* s, I32 rv)
  -{
  -    DEBUG_T({
  -        SV* report = newSVpv(thing, 0);
  -        Perl_sv_catpvf(aTHX_ report, ":line %d:%"IVdf":", CopLINE(PL_curcop),
  -		(IV)rv);
  +/* how to interpret the yylval associated with the token */
  +enum token_type {
  +    TOKENTYPE_NONE,
  +    TOKENTYPE_IVAL,
  +    TOKENTYPE_OPNUM, /* yylval.ival contains an opcode number */
  +    TOKENTYPE_PVAL,
  +    TOKENTYPE_OPVAL,
  +    TOKENTYPE_GVVAL
  +};
  +
  +static struct debug_tokens { const int token, type; const char *name; } debug_tokens[] =
  +{
  +    { ADDOP,		TOKENTYPE_OPNUM,	"ADDOP" },
  +    { ANDAND,		TOKENTYPE_NONE,		"ANDAND" },
  +    { ANDOP,		TOKENTYPE_NONE,		"ANDOP" },
  +    { ANONSUB,		TOKENTYPE_IVAL,		"ANONSUB" },
  +    { ARROW,		TOKENTYPE_NONE,		"ARROW" },
  +    { ASSIGNOP,		TOKENTYPE_OPNUM,	"ASSIGNOP" },
  +    { BITANDOP,		TOKENTYPE_OPNUM,	"BITANDOP" },
  +    { BITOROP,		TOKENTYPE_OPNUM,	"BITOROP" },
  +    { COLONATTR,	TOKENTYPE_NONE,		"COLONATTR" },
  +    { CONTINUE,		TOKENTYPE_NONE,		"CONTINUE" },
  +    { DO,		TOKENTYPE_NONE,		"DO" },
  +    { DOLSHARP,		TOKENTYPE_NONE,		"DOLSHARP" },
  +    { DORDOR,		TOKENTYPE_NONE,		"DORDOR" },
  +    { DOROP,		TOKENTYPE_OPNUM,	"DOROP" },
  +    { DOTDOT,		TOKENTYPE_IVAL,		"DOTDOT" },
  +    { ELSE,		TOKENTYPE_NONE,		"ELSE" },
  +    { ELSIF,		TOKENTYPE_IVAL,		"ELSIF" },
  +    { EQOP,		TOKENTYPE_OPNUM,	"EQOP" },
  +    { FOR,		TOKENTYPE_IVAL,		"FOR" },
  +    { FORMAT,		TOKENTYPE_NONE,		"FORMAT" },
  +    { FUNC,		TOKENTYPE_OPNUM,	"FUNC" },
  +    { FUNC0,		TOKENTYPE_OPNUM,	"FUNC0" },
  +    { FUNC0SUB,		TOKENTYPE_OPVAL,	"FUNC0SUB" },
  +    { FUNC1,		TOKENTYPE_OPNUM,	"FUNC1" },
  +    { FUNCMETH,		TOKENTYPE_OPVAL,	"FUNCMETH" },
  +    { HASHBRACK,	TOKENTYPE_NONE,		"HASHBRACK" },
  +    { IF,		TOKENTYPE_IVAL,		"IF" },
  +    { LABEL,		TOKENTYPE_PVAL,		"LABEL" },
  +    { LOCAL,		TOKENTYPE_IVAL,		"LOCAL" },
  +    { LOOPEX,		TOKENTYPE_OPNUM,	"LOOPEX" },
  +    { LSTOP,		TOKENTYPE_OPNUM,	"LSTOP" },
  +    { LSTOPSUB,		TOKENTYPE_OPVAL,	"LSTOPSUB" },
  +    { MATCHOP,		TOKENTYPE_OPNUM,	"MATCHOP" },
  +    { METHOD,		TOKENTYPE_OPVAL,	"METHOD" },
  +    { MULOP,		TOKENTYPE_OPNUM,	"MULOP" },
  +    { MY,		TOKENTYPE_IVAL,		"MY" },
  +    { MYSUB,		TOKENTYPE_NONE,		"MYSUB" },
  +    { NOAMP,		TOKENTYPE_NONE,		"NOAMP" },
  +    { NOTOP,		TOKENTYPE_NONE,		"NOTOP" },
  +    { OROP,		TOKENTYPE_IVAL,		"OROP" },
  +    { OROR,		TOKENTYPE_NONE,		"OROR" },
  +    { PACKAGE,		TOKENTYPE_NONE,		"PACKAGE" },
  +    { PMFUNC,		TOKENTYPE_OPVAL,	"PMFUNC" },
  +    { POSTDEC,		TOKENTYPE_NONE,		"POSTDEC" },
  +    { POSTINC,		TOKENTYPE_NONE,		"POSTINC" },
  +    { POWOP,		TOKENTYPE_OPNUM,	"POWOP" },
  +    { PREDEC,		TOKENTYPE_NONE,		"PREDEC" },
  +    { PREINC,		TOKENTYPE_NONE,		"PREINC" },
  +    { PRIVATEREF,	TOKENTYPE_OPVAL,	"PRIVATEREF" },
  +    { REFGEN,		TOKENTYPE_NONE,		"REFGEN" },
  +    { RELOP,		TOKENTYPE_OPNUM,	"RELOP" },
  +    { SHIFTOP,		TOKENTYPE_OPNUM,	"SHIFTOP" },
  +    { SUB,		TOKENTYPE_NONE,		"SUB" },
  +    { THING,		TOKENTYPE_OPVAL,	"THING" },
  +    { UMINUS,		TOKENTYPE_NONE,		"UMINUS" },
  +    { UNIOP,		TOKENTYPE_OPNUM,	"UNIOP" },
  +    { UNIOPSUB,		TOKENTYPE_OPVAL,	"UNIOPSUB" },
  +    { UNLESS,		TOKENTYPE_IVAL,		"UNLESS" },
  +    { UNTIL,		TOKENTYPE_IVAL,		"UNTIL" },
  +    { USE,		TOKENTYPE_IVAL,		"USE" },
  +    { WHILE,		TOKENTYPE_IVAL,		"WHILE" },
  +    { WORD,		TOKENTYPE_OPVAL,	"WORD" },
  +    { 0,		TOKENTYPE_NONE,		0 }
  +};
   
  +/* dump the returned token in rv, plus any optional arg in yylval */
  +
  +STATIC int
  +S_tokereport(pTHX_ const char* s, I32 rv)
  +{
  +    if (DEBUG_T_TEST) {
  +	const char *name = Nullch;
  +	enum token_type type = TOKENTYPE_NONE;
  +	struct debug_tokens *p;
  +	SV* report = newSVpvn("<== ", 4);
  +
  +	for (p = debug_tokens; p->token; p++) {
  +	    if (p->token == (int)rv) {
  +		name = p->name;
  +		type = p->type;
  +		break;
  +	    }
  +	}
  +	if (name)
  +	    Perl_sv_catpv(aTHX_ report, name);
  +	else if ((char)rv > ' ' && (char)rv < '~')
  +	    Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
  +	else if (!rv)
  +	    Perl_sv_catpv(aTHX_ report, "EOF");
  +	else
  +	    Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
  +	switch (type) {
  +	case TOKENTYPE_NONE:
  +	case TOKENTYPE_GVVAL: /* doesn't appear to be used */
  +	    break;
  +	case TOKENTYPE_IVAL:
  +	    Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", yylval.ival);
  +	    break;
  +	case TOKENTYPE_OPNUM:
  +	    Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
  +				    PL_op_name[yylval.ival]);
  +	    break;
  +	case TOKENTYPE_PVAL:
  +	    Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", yylval.pval);
  +	    break;
  +	case TOKENTYPE_OPVAL:
  +	    if (yylval.opval)
  +		Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
  +				    PL_op_name[yylval.opval->op_type]);
  +	    else
  +		Perl_sv_catpv(aTHX_ report, "(opval=null)");
  +	    break;
  +	}
  +        Perl_sv_catpvf(aTHX_ report, " at line %d [", CopLINE(PL_curcop));
           if (s - PL_bufptr > 0)
               sv_catpvn(report, PL_bufptr, s - PL_bufptr);
           else {
               if (PL_oldbufptr && *PL_oldbufptr)
                   sv_catpv(report, PL_tokenbuf);
           }
  -        PerlIO_printf(Perl_debug_log, "### %s\n", SvPV_nolen(report));
  -    });
  +        PerlIO_printf(Perl_debug_log, "### %s]\n", SvPV_nolen(report));
  +    };
  +    return (int)rv;
   }
   
   #endif
  @@ -246,7 +365,7 @@
    */
   
   STATIC void
  -S_no_op(pTHX_ char *what, char *s)
  +S_no_op(pTHX_ const char *what, char *s)
   {
       char *oldbp = PL_bufptr;
       bool is_first = (PL_oldbufptr == PL_linestart);
  @@ -256,18 +375,23 @@
       else
   	PL_bufptr = s;
       yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
  -    if (is_first)
  -	Perl_warn(aTHX_ "\t(Missing semicolon on previous line?)\n");
  -    else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
  -	char *t;
  -	for (t = PL_oldoldbufptr; *t && (isALNUM_lazy_if(t,UTF) || *t == ':'); t++) ;
  -	if (t < PL_bufptr && isSPACE(*t))
  -	    Perl_warn(aTHX_ "\t(Do you need to predeclare %.*s?)\n",
  -		t - PL_oldoldbufptr, PL_oldoldbufptr);
  -    }
  -    else {
  -	assert(s >= oldbp);
  -	Perl_warn(aTHX_ "\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
  +    if (ckWARN_d(WARN_SYNTAX)) {
  +	if (is_first)
  +	    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
  +		    "\t(Missing semicolon on previous line?)\n");
  +	else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
  +	    char *t;
  +	    for (t = PL_oldoldbufptr; *t && (isALNUM_lazy_if(t,UTF) || *t == ':'); t++) ;
  +	    if (t < PL_bufptr && isSPACE(*t))
  +		Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
  +			"\t(Do you need to predeclare %.*s?)\n",
  +		    t - PL_oldoldbufptr, PL_oldoldbufptr);
  +	}
  +	else {
  +	    assert(s >= oldbp);
  +	    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
  +		    "\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
  +	}
       }
       PL_bufptr = oldbp;
   }
  @@ -300,7 +424,6 @@
   	) {
   	*tmpbuf = '^';
   	tmpbuf[1] = toCTRL(PL_multi_close);
  -	s = "\\n";
   	tmpbuf[2] = '\0';
   	s = tmpbuf;
       }
  @@ -318,14 +441,14 @@
    */
   
   void
  -Perl_deprecate(pTHX_ char *s)
  +Perl_deprecate(pTHX_ const char *s)
   {
       if (ckWARN(WARN_DEPRECATED))
   	Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), "Use of %s is deprecated", s);
   }
   
   void
  -Perl_deprecate_old(pTHX_ char *s)
  +Perl_deprecate_old(pTHX_ const char *s)
   {
       /* This function should NOT be called for any new deprecated warnings */
       /* Use Perl_deprecate instead                                         */
  @@ -336,7 +459,7 @@
       /* in its own right.                                                  */
   
       if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
  -	Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX), 
  +	Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
   			"Use of %s is deprecated", s);
   }
   
  @@ -589,15 +712,17 @@
   			     (prevlen = SvCUR(PL_linestr)))) == Nullch)
   	{
   	    /* end of file.  Add on the -p or -n magic */
  -	    if (PL_minus_n || PL_minus_p) {
  -		sv_setpv(PL_linestr,PL_minus_p ?
  -			 ";}continue{print or die qq(-p destination: $!\\n)" :
  -			 "");
  -		sv_catpv(PL_linestr,";}");
  +	    if (PL_minus_p) {
  +		sv_setpv(PL_linestr,
  +			 ";}continue{print or die qq(-p destination: $!\\n);}");
   		PL_minus_n = PL_minus_p = 0;
   	    }
  +	    else if (PL_minus_n) {
  +		sv_setpvn(PL_linestr, ";}", 2);
  +		PL_minus_n = 0;
  +	    }
   	    else
  -		sv_setpv(PL_linestr,";");
  +		sv_setpvn(PL_linestr,";", 1);
   
   	    /* reset variables for next time we lex */
   	    PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
  @@ -650,7 +775,7 @@
   	    sv_upgrade(sv, SVt_PVMG);
   	    sv_setpvn(sv,PL_bufptr,PL_bufend-PL_bufptr);
               (void)SvIOK_on(sv);
  -            SvIVX(sv) = 0;
  +            SvIV_set(sv, 0);
   	    av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
   	}
       }
  @@ -708,20 +833,19 @@
   {
       yylval.ival = f;
       CLINE;
  -    REPORT("lop", f)
       PL_expect = x;
       PL_bufptr = s;
       PL_last_lop = PL_oldbufptr;
       PL_last_lop_op = (OPCODE)f;
       if (PL_nexttoke)
  -	return LSTOP;
  +	return REPORT(LSTOP);
       if (*s == '(')
  -	return FUNC;
  +	return REPORT(FUNC);
       s = skipspace(s);
       if (*s == '(')
  -	return FUNC;
  +	return REPORT(FUNC);
       else
  -	return LSTOP;
  +	return REPORT(LSTOP);
   }
   
   /*
  @@ -745,6 +869,15 @@
       }
   }
   
  +STATIC SV *
  +S_newSV_maybe_utf8(pTHX_ const char *start, STRLEN len)
  +{
  +    SV *sv = newSVpvn(start,len);
  +    if (UTF && !IN_BYTES && is_utf8_string((const U8*)start, len))
  +	SvUTF8_on(sv);
  +    return sv;
  +}
  +
   /*
    * S_force_word
    * When the lexer knows the next thing is a word (for instance, it has
  @@ -784,10 +917,10 @@
   		PL_expect = XOPERATOR;
   	    }
   	}
  -	PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(PL_tokenbuf,0));
  +	PL_nextval[PL_nexttoke].opval
  +	    = (OP*)newSVOP(OP_CONST,0,
  +			   S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
   	PL_nextval[PL_nexttoke].opval->op_private |= OPpCONST_BARE;
  -	if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
  -	    SvUTF8_on(((SVOP*)PL_nextval[PL_nexttoke].opval)->op_sv);
   	force_next(token);
       }
       return s;
  @@ -803,10 +936,10 @@
    */
   
   STATIC void
  -S_force_ident(pTHX_ register char *s, int kind)
  +S_force_ident(pTHX_ register const char *s, int kind)
   {
       if (s && *s) {
  -	OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
  +	OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
   	PL_nextval[PL_nexttoke].opval = o;
   	force_next(WORD);
   	if (kind) {
  @@ -878,7 +1011,7 @@
   	    ver = cSVOPx(version)->op_sv;
   	    if (SvPOK(ver) && !SvNIOK(ver)) {
   		(void)SvUPGRADE(ver, SVt_PVNV);
  -		SvNVX(ver) = str_to_version(ver);
  +		SvNV_set(ver, str_to_version(ver));
   		SvNOK_on(ver);		/* hint that it is a version */
   	    }
           }
  @@ -1231,7 +1364,7 @@
   
       const char *leaveit =	/* set of acceptably-backslashed characters */
   	PL_lex_inpat
  -	    ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxcz0123456789[{]} \t\n\r\f\v#"
  +	    ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxz0123456789[{]} \t\n\r\f\v#"
   	    : "";
   
       if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
  @@ -1416,7 +1549,7 @@
   	    default:
   	        {
   		    if (ckWARN(WARN_MISC) &&
  -			isALNUM(*s) && 
  +			isALNUM(*s) &&
   			*s != '_')
   			Perl_warner(aTHX_ packWARN(WARN_MISC),
   			       "Unrecognized escape \\%c passed through",
  @@ -1570,7 +1703,7 @@
   			 UV uv = utf8_to_uvchr((U8*)str, 0);
   
   			 if (uv < 0x100) {
  -			      U8 tmpbuf[UTF8_MAXLEN+1], *d;
  +			      U8 tmpbuf[UTF8_MAXBYTES+1], *d;
   
   			      d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
   			      sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
  @@ -1841,8 +1974,10 @@
   		    weight -= 5;	/* cope with negative subscript */
   		break;
   	    default:
  -		if (!isALNUM(last_un_char) && !strchr("$@&",last_un_char) &&
  -			isALPHA(*s) && s[1] && isALPHA(s[1])) {
  +		if (!isALNUM(last_un_char)
  +		    && !(last_un_char == '$' || last_un_char == '@'
  +			 || last_un_char == '&')
  +		    && isALPHA(*s) && s[1] && isALPHA(s[1])) {
   		    char *d = tmpbuf;
   		    while (isALPHA(*s))
   			*d++ = *s++;
  @@ -1956,11 +2091,11 @@
    * compile-time require of perl5db.pl.
    */
   
  -STATIC char*
  +STATIC const char*
   S_incl_perldb(pTHX)
   {
       if (PL_perldb) {
  -	char *pdb = PerlEnv_getenv("PERL5DB");
  +	const char *pdb = PerlEnv_getenv("PERL5DB");
   
   	if (pdb)
   	    return pdb;
  @@ -2032,19 +2167,17 @@
   }
   
   
  -/* Invoke the n'th filter function for the current rsfp.	 */
  +/* Invoke the idxth filter function for the current rsfp.	 */
  +/* maxlen 0 = read one text line */
   I32
   Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
  -
  -
  -               		/* 0 = read one text line */
   {
       filter_t funcp;
       SV *datasv = NULL;
   
       if (!PL_rsfp_filters)
   	return -1;
  -    if (idx > AvFILLp(PL_rsfp_filters)){       /* Any more filters?	*/
  +    if (idx > AvFILLp(PL_rsfp_filters)) {       /* Any more filters?	*/
   	/* Provide a default input filter to make life easy.	*/
   	/* Note that we append to the line. This is handy.	*/
   	DEBUG_P(PerlIO_printf(Perl_debug_log,
  @@ -2075,7 +2208,7 @@
   	return SvCUR(buf_sv);
       }
       /* Skip this filter slot if filter has been deleted	*/
  -    if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef){
  +    if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
   	DEBUG_P(PerlIO_printf(Perl_debug_log,
   			      "filter_read %d: skipped (filter deleted)\n",
   			      idx));
  @@ -2101,7 +2234,6 @@
       }
   #endif
       if (PL_rsfp_filters) {
  -
   	if (!append)
               SvCUR_set(sv, 0);	/* start with empty line	*/
           if (FILTER_READ(0, sv, 0) > 0)
  @@ -2114,7 +2246,7 @@
   }
   
   STATIC HV *
  -S_find_in_my_stash(pTHX_ char *pkgname, I32 len)
  +S_find_in_my_stash(pTHX_ const char *pkgname, I32 len)
   {
       GV *gv;
   
  @@ -2140,7 +2272,7 @@
   }
   
   #ifdef DEBUGGING
  -    static char* exp_name[] =
  +    static char const* exp_name[] =
   	{ "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
   	  "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
   	};
  @@ -2171,26 +2303,6 @@
         if we already built the token before, use it.
   */
   
  -#ifdef USE_PURE_BISON
  -int
  -Perl_yylex_r(pTHX_ YYSTYPE *lvalp, int *lcharp)
  -{
  -    int r;
  -
  -    yyactlevel++;
  -    yylval_pointer[yyactlevel] = lvalp;
  -    yychar_pointer[yyactlevel] = lcharp;
  -    if (yyactlevel >= YYMAXLEVEL)
  -	Perl_croak(aTHX_ "panic: YYMAXLEVEL");
  -
  -    r = Perl_yylex(aTHX);
  -
  -    if (yyactlevel > 0)
  -       yyactlevel--;
  -
  -    return r;
  -}
  -#endif
   
   #ifdef __SC__
   #pragma segment Perl_yylex
  @@ -2198,7 +2310,7 @@
   int
   Perl_yylex(pTHX)
   {
  -    register char *s;
  +    register char *s = PL_bufptr;
       register char *d;
       register I32 tmp;
       STRLEN len;
  @@ -2207,9 +2319,13 @@
       bool bof = FALSE;
       I32 orig_keyword = 0;
   
  +    DEBUG_T( {
  +	PerlIO_printf(Perl_debug_log, "### LEX_%s\n",
  +					lex_state_names[PL_lex_state]);
  +    } );
       /* check if there's an identifier for us to look at */
       if (PL_pending_ident)
  -        return S_pending_ident(aTHX);
  +        return REPORT(S_pending_ident(aTHX));
   
       /* no identifier pending identification */
   
  @@ -2233,7 +2349,7 @@
                 "### Next token after '%s' was known, type %"IVdf"\n", PL_bufptr,
                 (IV)PL_nexttype[PL_nexttoke]); });
   
  -	return(PL_nexttype[PL_nexttoke]);
  +	return REPORT(PL_nexttype[PL_nexttoke]);
   
       /* interpolated case modifiers like \L \U, including \Q and \E.
          when we get here, PL_bufptr is at the \
  @@ -2252,11 +2368,12 @@
   		oldmod = PL_lex_casestack[--PL_lex_casemods];
   		PL_lex_casestack[PL_lex_casemods] = '\0';
   
  -		if (PL_bufptr != PL_bufend && strchr("LUQ", oldmod)) {
  +		if (PL_bufptr != PL_bufend
  +		    && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
   		    PL_bufptr += 2;
   		    PL_lex_state = LEX_INTERPCONCAT;
   		}
  -		return ')';
  +		return REPORT(')');
   	    }
   	    if (PL_bufptr != PL_bufend)
   		PL_bufptr += 2;
  @@ -2275,10 +2392,10 @@
   	    else {
   	        if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
   		    tmp = *s, *s = s[2], s[2] = (char)tmp;	/* misordered... */
  -		if (strchr("LU", *s) &&
  +		if ((*s == 'L' || *s == 'U') &&
   		    (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
   		    PL_lex_casestack[--PL_lex_casemods] = '\0';
  -		    return ')';
  +		    return REPORT(')');
   		}
   		if (PL_lex_casemods > 10)
   		    Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
  @@ -2305,18 +2422,22 @@
   	    if (PL_lex_starts) {
   		s = PL_bufptr;
   		PL_lex_starts = 0;
  -		Aop(OP_CONCAT);
  +		/* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
  +		if (PL_lex_casemods == 1 && PL_lex_inpat)
  +		    OPERATOR(',');
  +		else
  +		    Aop(OP_CONCAT);
   	    }
   	    else
   		return yylex();
   	}
   
       case LEX_INTERPPUSH:
  -        return sublex_push();
  +        return REPORT(sublex_push());
   
       case LEX_INTERPSTART:
   	if (PL_bufptr == PL_bufend)
  -	    return sublex_done();
  +	    return REPORT(sublex_done());
   	DEBUG_T({ PerlIO_printf(Perl_debug_log,
                 "### Interpolated variable at '%s'\n", PL_bufptr); });
   	PL_expect = XTERM;
  @@ -2335,7 +2456,11 @@
   	}
   	if (PL_lex_starts++) {
   	    s = PL_bufptr;
  -	    Aop(OP_CONCAT);
  +	    /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
  +	    if (!PL_lex_casemods && PL_lex_inpat)
  +		OPERATOR(',');
  +	    else
  +		Aop(OP_CONCAT);
   	}
   	return yylex();
   
  @@ -2350,7 +2475,7 @@
   	if (PL_lex_dojoin) {
   	    PL_lex_dojoin = FALSE;
   	    PL_lex_state = LEX_INTERPCONCAT;
  -	    return ')';
  +	    return REPORT(')');
   	}
   	if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
   	    && SvEVALED(PL_lex_repl))
  @@ -2366,7 +2491,7 @@
   	    Perl_croak(aTHX_ "panic: INTERPCONCAT");
   #endif
   	if (PL_bufptr == PL_bufend)
  -	    return sublex_done();
  +	    return REPORT(sublex_done());
   
   	if (SvIVX(PL_linestr) == '\'') {
   	    SV *sv = newSVsv(PL_linestr);
  @@ -2389,8 +2514,13 @@
   	    PL_nextval[PL_nexttoke] = yylval;
   	    PL_expect = XTERM;
   	    force_next(THING);
  -	    if (PL_lex_starts++)
  -		Aop(OP_CONCAT);
  +	    if (PL_lex_starts++) {
  +		/* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
  +		if (!PL_lex_casemods && PL_lex_inpat)
  +		    OPERATOR(',');
  +		else
  +		    Aop(OP_CONCAT);
  +	    }
   	    else {
   		PL_bufptr = s;
   		return yylex();
  @@ -2410,7 +2540,7 @@
       PL_oldoldbufptr = PL_oldbufptr;
       PL_oldbufptr = s;
       DEBUG_T( {
  -	PerlIO_printf(Perl_debug_log, "### Tokener expecting %s at %s\n",
  +	PerlIO_printf(Perl_debug_log, "### Tokener expecting %s at [%s]\n",
   		      exp_name[PL_expect], s);
       } );
   
  @@ -2427,8 +2557,12 @@
   	if (!PL_rsfp) {
   	    PL_last_uni = 0;
   	    PL_last_lop = 0;
  -	    if (PL_lex_brackets)
  -		yyerror("Missing right curly or square bracket");
  +	    if (PL_lex_brackets) {
  + 	        if (PL_lex_formbrack)
  +		    yyerror("Format not terminated");
  +                else
  +		    yyerror("Missing right curly or square bracket");
  +	    }
               DEBUG_T( { PerlIO_printf(Perl_debug_log,
                           "### Tokener got EOF\n");
               } );
  @@ -2442,12 +2576,12 @@
   	    PL_preambled = TRUE;
   	    sv_setpv(PL_linestr,incl_perldb());
   	    if (SvCUR(PL_linestr))
  -		sv_catpv(PL_linestr,";");
  +		sv_catpvn(PL_linestr,";", 1);
   	    if (PL_preambleav){
   		while(AvFILLp(PL_preambleav) >= 0) {
   		    SV *tmpsv = av_shift(PL_preambleav);
   		    sv_catsv(PL_linestr, tmpsv);
  -		    sv_catpv(PL_linestr, ";");
  +		    sv_catpvn(PL_linestr, ";", 1);
   		    sv_free(tmpsv);
   		}
   		sv_free((SV*)PL_preambleav);
  @@ -2459,29 +2593,35 @@
   		    sv_catpv(PL_linestr,"chomp;");
   		if (PL_minus_a) {
   		    if (PL_minus_F) {
  -			if (strchr("/'\"", *PL_splitstr)
  +			if ((*PL_splitstr == '/' || *PL_splitstr == '\''
  +			     || *PL_splitstr == '"')
   			      && strchr(PL_splitstr + 1, *PL_splitstr))
   			    Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
   			else {
  -			    char delim;
  -			    s = "'~#\200\1'"; /* surely one char is unused...*/
  -			    while (s[1] && strchr(PL_splitstr, *s))  s++;
  -			    delim = *s;
  -			    Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s%c",
  -				      "q" + (delim == '\''), delim);
  -			    for (s = PL_splitstr; *s; s++) {
  -				if (*s == '\\')
  -				    sv_catpvn(PL_linestr, "\\", 1);
  -				sv_catpvn(PL_linestr, s, 1);
  -			    }
  -			    Perl_sv_catpvf(aTHX_ PL_linestr, "%c);", delim);
  +			    /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
  +			       bytes can be used as quoting characters.  :-) */
  +			    /* The count here deliberately includes the NUL
  +			       that terminates the C string constant.  This
  +			       embeds the opening NUL into the string.  */
  +			    const char *splits = PL_splitstr;
  +			    sv_catpvn(PL_linestr, "our @F=split(q", 15);
  +			    do {
  +				/* Need to \ \s  */
  +				if (*splits == '\\')
  +				    sv_catpvn(PL_linestr, splits, 1);
  +				sv_catpvn(PL_linestr, splits, 1);
  +			    } while (*splits++);
  +			    /* This loop will embed the trailing NUL of
  +			       PL_linestr as the last thing it does before
  +			       terminating.  */
  +			    sv_catpvn(PL_linestr, ");", 2);
   			}
   		    }
   		    else
   		        sv_catpv(PL_linestr,"our @F=split(' ');");
   		}
   	    }
  -	    sv_catpv(PL_linestr, "\n");
  +	    sv_catpvn(PL_linestr, "\n", 1);
   	    PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
   	    PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
   	    PL_last_lop = PL_last_uni = Nullch;
  @@ -2491,7 +2631,7 @@
   		sv_upgrade(sv, SVt_PVMG);
   		sv_setsv(sv,PL_linestr);
                   (void)SvIOK_on(sv);
  -                SvIVX(sv) = 0;
  +                SvIV_set(sv, 0);
   		av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
   	    }
   	    goto retry;
  @@ -2511,8 +2651,8 @@
   		    PL_doextract = FALSE;
   		}
   		if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
  -		    sv_setpv(PL_linestr,PL_minus_p ? ";}continue{print" : "");
  -		    sv_catpv(PL_linestr,";}");
  +		    sv_setpv(PL_linestr,PL_minus_p
  +			     ? ";}continue{print;}" : ";}");
   		    PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
   		    PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
   		    PL_last_lop = PL_last_uni = Nullch;
  @@ -2524,8 +2664,13 @@
   		sv_setpv(PL_linestr,"");
   		TOKEN(';');	/* not infinite loop because rsfp is NULL now */
   	    }
  -	    /* if it looks like the start of a BOM, check if it in fact is */
  -	    else if (bof && (!*s || *(U8*)s == 0xEF || *(U8*)s >= 0xFE)) {
  +	    /* If it looks like the start of a BOM or raw UTF-16,
  +	     * check if it in fact is. */
  +	    else if (bof &&
  +		     (*s == 0 ||
  +		      *(U8*)s == 0xEF ||
  +		      *(U8*)s >= 0xFE ||
  +		      s[1] == 0)) {
   #ifdef PERLIO_IS_STDIO
   #  ifdef __GNU_LIBRARY__
   #    if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
  @@ -2573,7 +2718,7 @@
   	    sv_upgrade(sv, SVt_PVMG);
   	    sv_setsv(sv,PL_linestr);
               (void)SvIOK_on(sv);
  -            SvIVX(sv) = 0;
  +            SvIV_set(sv, 0);
   	    av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
   	}
   	PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
  @@ -2589,7 +2734,7 @@
   		    d = s + 2;
   #ifdef ALTERNATE_SHEBANG
   		else {
  -		    static char as[] = ALTERNATE_SHEBANG;
  +		    static char const as[] = ALTERNATE_SHEBANG;
   		    if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
   			d = s + (sizeof(as) - 1);
   		}
  @@ -2721,7 +2866,7 @@
   		    if (*d++ == '-') {
   			bool switches_done = PL_doswitches;
   			do {
  -			    if (*d == 'M' || *d == 'm') {
  +			    if (*d == 'M' || *d == 'm' || *d == 'C') {
   				char *m = d;
   				while (*d && !isSPACE(*d)) d++;
   				Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
  @@ -2875,10 +3020,10 @@
   		/* Assume it was a minus followed by a one-letter named
   		 * subroutine call (or a -bareword), then. */
   		DEBUG_T( { PerlIO_printf(Perl_debug_log,
  -			"### %c looked like a file test but was not\n",
  -			(int)ftst);
  +			"### '-%c' looked like a file test but was not\n",
  +			(int) tmp);
   		} );
  -		s -= 2;
  +		s = --PL_bufptr;
   	    }
   	}
   	tmp = *s++;
  @@ -3014,7 +3159,7 @@
   			yyerror("Unterminated attribute parameter in attribute list");
   			if (attrs)
   			    op_free(attrs);
  -			return 0;	/* EOF indicator */
  +			return REPORT(0);	/* EOF indicator */
   		    }
   		}
   		if (PL_lex_stuff) {
  @@ -3026,9 +3171,20 @@
   		    PL_lex_stuff = Nullsv;
   		}
   		else {
  +		    if (len == 6 && strnEQ(s, "unique", len)) {
  +			if (PL_in_my == KEY_our)
  +#ifdef USE_ITHREADS
  +			    GvUNIQUE_on(cGVOPx_gv(yylval.opval));
  +#else
  +			    ; /* skip to avoid loading attributes.pm */
  +#endif
  +			else
  +			    Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
  +		    }
  +
   		    /* NOTE: any CV attrs applied here need to be part of
   		       the CVf_BUILTIN_ATTRS define in cv.h! */
  -		    if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
  +		    else if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
   			CvLVALUE_on(PL_compcv);
   		    else if (!PL_in_my && len == 6 && strnEQ(s, "locked", len))
   			CvLOCKED_on(PL_compcv);
  @@ -3036,11 +3192,6 @@
   			CvMETHOD_on(PL_compcv);
   		    else if (!PL_in_my && len == 9 && strnEQ(s, "assertion", len))
   		        CvASSERTION_on(PL_compcv);
  -#ifdef USE_ITHREADS
  -		    else if (PL_in_my == KEY_our && len == 6 &&
  -			     strnEQ(s, "unique", len))
  -			GvUNIQUE_on(cGVOPx_gv(yylval.opval));
  -#endif
   		    /* After we've set the flags, it could be argued that
   		       we don't need to do the attributes.pm-based setting
   		       process, and shouldn't bother appending recognized
  @@ -3403,8 +3554,24 @@
       case '!':
   	s++;
   	tmp = *s++;
  -	if (tmp == '=')
  +	if (tmp == '=') {
  +            /* was this !=~ where !~ was meant?
  +             * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
  +
  +            if (*s == '~' && ckWARN(WARN_SYNTAX)) {
  +                char *t = s+1;
  +
  +                while (t < PL_bufend && isSPACE(*t))
  +                    ++t;
  +
  +                if (*t == '/' || *t == '?' ||
  +                    ((*t == 'm' || *t == 's' || *t == 'y') && !isALNUM(t[1])) ||
  +                    (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
  +                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
  +                                "!=~ should be !~");
  +            }
   	    Eop(OP_NE);
  +        }
   	if (tmp == '~')
   	    PMop(OP_NOT);
   	s--;
  @@ -3449,7 +3616,7 @@
   	    if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
   		PL_expect = XTERM;
   		depcom();
  -		return ','; /* grandfather non-comma-format format */
  +		return REPORT(','); /* grandfather non-comma-format format */
   	    }
   	}
   
  @@ -3564,7 +3731,8 @@
   		PL_expect = XTERM;		/* e.g. print $fh 3 */
   	    else if (*s == '.' && isDIGIT(s[1]))
   		PL_expect = XTERM;		/* e.g. print $fh .3 */
  -	    else if (strchr("?-+", *s) && !isSPACE(s[1]) && s[1] != '=')
  +	    else if ((*s == '?' || *s == '-' || *s == '+')
  +		     && !isSPACE(s[1]) && s[1] != '=')
    		PL_expect = XTERM;		/* e.g. print $fh -1 */
   	    else if (*s == '/' && !isSPACE(s[1]) && s[1] != '=' && s[1] != '/')
   		PL_expect = XTERM;		/* e.g. print $fh /.../
  @@ -3692,7 +3860,7 @@
   	    if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
   		PL_expect = XTERM;
   		depcom();
  -		return ',';	/* grandfather non-comma-format format */
  +		return REPORT(','); /* grandfather non-comma-format format */
   	    }
   	    else
   		no_op("String",s);
  @@ -3711,7 +3879,7 @@
   	    if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
   		PL_expect = XTERM;
   		depcom();
  -		return ',';	/* grandfather non-comma-format format */
  +		return REPORT(','); /* grandfather non-comma-format format */
   	    }
   	    else
   		no_op("String",s);
  @@ -3848,10 +4016,10 @@
   	/* Is this a word before a => operator? */
   	if (*d == '=' && d[1] == '>') {
   	    CLINE;
  -	    yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf,0));
  +	    yylval.opval
  +		= (OP*)newSVOP(OP_CONST, 0,
  +			       S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
   	    yylval.opval->op_private = OPpCONST_BARE;
  -	    if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
  -	      SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
   	    TERM(WORD);
   	}
   
  @@ -3887,6 +4055,16 @@
   	    {
   		tmp = 0;		/* any sub overrides "weak" keyword */
   	    }
  +	    else if (gv && !gvp
  +		    && tmp == -KEY_err
  +		    && GvCVu(gv)
  +		    && PL_expect != XOPERATOR
  +		    && PL_expect != XTERMORDORDOR)
  +	    {
  +		/* any sub overrides the "err" keyword, except when really an
  +		 * operator is expected */
  +		tmp = 0;
  +	    }
   	    else {			/* no override */
   		tmp = -tmp;
   		if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
  @@ -3963,8 +4141,12 @@
   		    sv = newSVpvn("CORE::GLOBAL::",14);
   		    sv_catpv(sv,PL_tokenbuf);
   		}
  -		else
  -		    sv = newSVpv(PL_tokenbuf,0);
  +		else {
  +		    /* If len is 0, newSVpv does strlen(), which is correct.
  +		       If len is non-zero, then it will be the true length,
  +		       and so the scalar will be created correctly.  */
  +		    sv = newSVpv(PL_tokenbuf,len);
  +		}
   
   		/* Presume this is going to be a bareword of some sort. */
   
  @@ -3999,7 +4181,7 @@
   		    /* Two barewords in a row may indicate method call. */
   
   		    if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
  -			return tmp;
  +			return REPORT(tmp);
   
   		    /* If not a declared subroutine, it's an indirect object. */
   		    /* (But it's an indir obj regardless for sort.) */
  @@ -4056,7 +4238,7 @@
   		if (!orig_keyword
   			&& (isIDFIRST_lazy_if(s,UTF) || *s == '$')
   			&& (tmp = intuit_method(s,gv)))
  -		    return tmp;
  +		    return REPORT(tmp);
   
   		/* Not a method, so call it a subroutine (if defined) */
   
  @@ -4088,12 +4270,12 @@
   			char *proto = SvPV((SV*)cv, len);
   			if (!len)
   			    TERM(FUNC0SUB);
  -			if (strEQ(proto, "$"))
  +			if (*proto == '$' && proto[1] == '\0')
   			    OPERATOR(UNIOPSUB);
   			while (*proto == ';')
   			    proto++;
   			if (*proto == '&' && *s == '{') {
  -			    sv_setpv(PL_subname, PL_curstash ? 
  +			    sv_setpv(PL_subname, PL_curstash ?
   					"__ANON__" : "__ANON__::__ANON__");
   			    PREBLOCK(LSTOPSUB);
   			}
  @@ -4121,7 +4303,8 @@
   		}
   
   	    safe_bareword:
  -		if (lastchar && strchr("*%&", lastchar) && ckWARN_d(WARN_AMBIGUOUS)) {
  +		if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
  +		    && ckWARN_d(WARN_AMBIGUOUS)) {
   		    Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
   		  	"Operator or semicolon missing before %c%s",
   			lastchar, PL_tokenbuf);
  @@ -4145,7 +4328,7 @@
   	case KEY___PACKAGE__:
   	    yylval.opval = (OP*)newSVOP(OP_CONST, 0,
   					(PL_curstash
  -					 ? newSVsv(PL_curstname)
  +					 ? newSVpv(HvNAME(PL_curstash), 0)
   					 : &PL_sv_undef));
   	    TERM(THING);
   
  @@ -4155,7 +4338,7 @@
   
   	    /*SUPPRESS 560*/
   	    if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
  -		char *pname = "main";
  +		const char *pname = "main";
   		if (PL_tokenbuf[2] == 'D')
   		    pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
   		gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
  @@ -4222,7 +4405,7 @@
   			SPAGAIN;
   			name = POPs;
   			PUTBACK;
  -			PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, 
  +			PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
   					    Perl_form(aTHX_ ":encoding(%"SVf")",
   						      name));
   			FREETMPS;
  @@ -4686,8 +4869,8 @@
   	    if (isIDFIRST_lazy_if(s,UTF)) {
   		char *t;
   		for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
  -		t = skipspace(d);
  -		if (strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
  +		for (t=d; *t && isSPACE(*t); t++) ;
  +		if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
   		    /* [perl #16184] */
   		    && !(t[0] == '=' && t[1] == '>')
   		) {
  @@ -4807,7 +4990,7 @@
   		missingterm((char*)0);
   	    yylval.ival = OP_STRINGIFY;
   	    if (SvIVX(PL_lex_stuff) == '\'')
  -		SvIVX(PL_lex_stuff) = 0;	/* qq'$foo' should intepolate */
  +		SvIV_set(PL_lex_stuff, 0);	/* qq'$foo' should intepolate */
   	    TERM(sublex_start());
   
   	case KEY_qr:
  @@ -5095,8 +5278,12 @@
   
   		if (*s == ':' && s[1] != ':')
   		    PL_expect = attrful;
  -		else if (!have_name && *s != '{' && key == KEY_sub)
  -		    Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
  +		else if (*s != '{' && key == KEY_sub) {
  +		    if (!have_name)
  +			Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
  +		    else if (*s != ';')
  +			Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, PL_subname);
  +		}
   
   		if (have_proto) {
   		    PL_nextval[PL_nexttoke].opval =
  @@ -5336,7 +5523,7 @@
                   sv_catpv(sym, PL_tokenbuf+1);
                   yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
                   yylval.opval->op_private = OPpCONST_ENTERED;
  -                gv_fetchpv(SvPVX(sym),
  +                gv_fetchsv(sym,
                       (PL_in_eval
                           ? (GV_ADDMULTI | GV_ADDINEVAL)
                           : GV_ADDMULTI
  @@ -5397,612 +5584,3310 @@
       return WORD;
   }
   
  +/*
  + *  The following code was generated by perl_keyword.pl.
  + */
  +
   I32
  -Perl_keyword(pTHX_ register char *d, I32 len)
  +Perl_keyword (pTHX_ char *name, I32 len)
   {
  -    switch (*d) {
  -    case '_':
  -	if (d[1] == '_') {
  -	    if (strEQ(d,"__FILE__"))		return -KEY___FILE__;
  -	    if (strEQ(d,"__LINE__"))		return -KEY___LINE__;
  -	    if (strEQ(d,"__PACKAGE__"))		return -KEY___PACKAGE__;
  -	    if (strEQ(d,"__DATA__"))		return KEY___DATA__;
  -	    if (strEQ(d,"__END__"))		return KEY___END__;
  -	}
  -	break;
  -    case 'A':
  -	if (strEQ(d,"AUTOLOAD"))		return KEY_AUTOLOAD;
  -	break;
  -    case 'a':
  -	switch (len) {
  -	case 3:
  -	    if (strEQ(d,"and"))			return -KEY_and;
  -	    if (strEQ(d,"abs"))			return -KEY_abs;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"alarm"))		return -KEY_alarm;
  -	    if (strEQ(d,"atan2"))		return -KEY_atan2;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"accept"))		return -KEY_accept;
  -	    break;
  -	}
  -	break;
  -    case 'B':
  -	if (strEQ(d,"BEGIN"))			return KEY_BEGIN;
  -	break;
  -    case 'b':
  -	if (strEQ(d,"bless"))			return -KEY_bless;
  -	if (strEQ(d,"bind"))			return -KEY_bind;
  -	if (strEQ(d,"binmode"))			return -KEY_binmode;
  -	break;
  -    case 'C':
  -	if (strEQ(d,"CORE"))			return -KEY_CORE;
  -	if (strEQ(d,"CHECK"))			return KEY_CHECK;
  -	break;
  -    case 'c':
  -	switch (len) {
  -	case 3:
  -	    if (strEQ(d,"cmp"))			return -KEY_cmp;
  -	    if (strEQ(d,"chr"))			return -KEY_chr;
  -	    if (strEQ(d,"cos"))			return -KEY_cos;
  -	    break;
  -	case 4:
  -	    if (strEQ(d,"chop"))		return -KEY_chop;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"close"))		return -KEY_close;
  -	    if (strEQ(d,"chdir"))		return -KEY_chdir;
  -	    if (strEQ(d,"chomp"))		return -KEY_chomp;
  -	    if (strEQ(d,"chmod"))		return -KEY_chmod;
  -	    if (strEQ(d,"chown"))		return -KEY_chown;
  -	    if (strEQ(d,"crypt"))		return -KEY_crypt;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"chroot"))		return -KEY_chroot;
  -	    if (strEQ(d,"caller"))		return -KEY_caller;
  -	    break;
  -	case 7:
  -	    if (strEQ(d,"connect"))		return -KEY_connect;
  -	    break;
  -	case 8:
  -	    if (strEQ(d,"closedir"))		return -KEY_closedir;
  -	    if (strEQ(d,"continue"))		return -KEY_continue;
  -	    break;
  -	}
  -	break;
  -    case 'D':
  -	if (strEQ(d,"DESTROY"))			return KEY_DESTROY;
  -	break;
  -    case 'd':
  -	switch (len) {
  -	case 2:
  -	    if (strEQ(d,"do"))			return KEY_do;
  -	    break;
  -	case 3:
  -	    if (strEQ(d,"die"))			return -KEY_die;
  -	    break;
  -	case 4:
  -	    if (strEQ(d,"dump"))		return -KEY_dump;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"delete"))		return KEY_delete;
  -	    break;
  -	case 7:
  -	    if (strEQ(d,"defined"))		return KEY_defined;
  -	    if (strEQ(d,"dbmopen"))		return -KEY_dbmopen;
  -	    break;
  -	case 8:
  -	    if (strEQ(d,"dbmclose"))		return -KEY_dbmclose;
  -	    break;
  -	}
  -	break;
  -    case 'E':
  -	if (strEQ(d,"END"))			return KEY_END;
  -	break;
  -    case 'e':
  -	switch (len) {
  -	case 2:
  -	    if (strEQ(d,"eq"))			return -KEY_eq;
  -	    break;
  -	case 3:
  -	    if (strEQ(d,"eof"))			return -KEY_eof;
  -	    if (strEQ(d,"err"))			return -KEY_err;
  -	    if (strEQ(d,"exp"))			return -KEY_exp;
  -	    break;
  -	case 4:
  -	    if (strEQ(d,"else"))		return KEY_else;
  -	    if (strEQ(d,"exit"))		return -KEY_exit;
  -	    if (strEQ(d,"eval"))		return KEY_eval;
  -	    if (strEQ(d,"exec"))		return -KEY_exec;
  -           if (strEQ(d,"each"))                return -KEY_each;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"elsif"))		return KEY_elsif;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"exists"))		return KEY_exists;
  -	    if (strEQ(d,"elseif")) Perl_warn(aTHX_ "elseif should be elsif");
  -	    break;
  -	case 8:
  -	    if (strEQ(d,"endgrent"))		return -KEY_endgrent;
  -	    if (strEQ(d,"endpwent"))		return -KEY_endpwent;
  -	    break;
  -	case 9:
  -	    if (strEQ(d,"endnetent"))		return -KEY_endnetent;
  -	    break;
  -	case 10:
  -	    if (strEQ(d,"endhostent"))		return -KEY_endhostent;
  -	    if (strEQ(d,"endservent"))		return -KEY_endservent;
  -	    break;
  -	case 11:
  -	    if (strEQ(d,"endprotoent"))		return -KEY_endprotoent;
  -	    break;
  -	}
  -	break;
  -    case 'f':
  -	switch (len) {
  -	case 3:
  -	    if (strEQ(d,"for"))			return KEY_for;
  -	    break;
  -	case 4:
  -	    if (strEQ(d,"fork"))		return -KEY_fork;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"fcntl"))		return -KEY_fcntl;
  -	    if (strEQ(d,"flock"))		return -KEY_flock;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"format"))		return KEY_format;
  -	    if (strEQ(d,"fileno"))		return -KEY_fileno;
  -	    break;
  -	case 7:
  -	    if (strEQ(d,"foreach"))		return KEY_foreach;
  -	    break;
  -	case 8:
  -	    if (strEQ(d,"formline"))		return -KEY_formline;
  -	    break;
  -	}
  -	break;
  -    case 'g':
  -	if (strnEQ(d,"get",3)) {
  -	    d += 3;
  -	    if (*d == 'p') {
  -		switch (len) {
  -		case 7:
  -		    if (strEQ(d,"ppid"))	return -KEY_getppid;
  -		    if (strEQ(d,"pgrp"))	return -KEY_getpgrp;
  -		    break;
  -		case 8:
  -		    if (strEQ(d,"pwent"))	return -KEY_getpwent;
  -		    if (strEQ(d,"pwnam"))	return -KEY_getpwnam;
  -		    if (strEQ(d,"pwuid"))	return -KEY_getpwuid;
  -		    break;
  -		case 11:
  -		    if (strEQ(d,"peername"))	return -KEY_getpeername;
  -		    if (strEQ(d,"protoent"))	return -KEY_getprotoent;
  -		    if (strEQ(d,"priority"))	return -KEY_getpriority;
  -		    break;
  -		case 14:
  -		    if (strEQ(d,"protobyname"))	return -KEY_getprotobyname;
  -		    break;
  -		case 16:
  -		    if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
  -		    break;
  -		}
  -	    }
  -	    else if (*d == 'h') {
  -		if (strEQ(d,"hostbyname"))	return -KEY_gethostbyname;
  -		if (strEQ(d,"hostbyaddr"))	return -KEY_gethostbyaddr;
  -		if (strEQ(d,"hostent"))		return -KEY_gethostent;
  -	    }
  -	    else if (*d == 'n') {
  -		if (strEQ(d,"netbyname"))	return -KEY_getnetbyname;
  -		if (strEQ(d,"netbyaddr"))	return -KEY_getnetbyaddr;
  -		if (strEQ(d,"netent"))		return -KEY_getnetent;
  -	    }
  -	    else if (*d == 's') {
  -		if (strEQ(d,"servbyname"))	return -KEY_getservbyname;
  -		if (strEQ(d,"servbyport"))	return -KEY_getservbyport;
  -		if (strEQ(d,"servent"))		return -KEY_getservent;
  -		if (strEQ(d,"sockname"))	return -KEY_getsockname;
  -		if (strEQ(d,"sockopt"))		return -KEY_getsockopt;
  -	    }
  -	    else if (*d == 'g') {
  -		if (strEQ(d,"grent"))		return -KEY_getgrent;
  -		if (strEQ(d,"grnam"))		return -KEY_getgrnam;
  -		if (strEQ(d,"grgid"))		return -KEY_getgrgid;
  -	    }
  -	    else if (*d == 'l') {
  -		if (strEQ(d,"login"))		return -KEY_getlogin;
  -	    }
  -	    else if (strEQ(d,"c"))		return -KEY_getc;
  -	    break;
  -	}
  -	switch (len) {
  -	case 2:
  -	    if (strEQ(d,"gt"))			return -KEY_gt;
  -	    if (strEQ(d,"ge"))			return -KEY_ge;
  -	    break;
  -	case 4:
  -	    if (strEQ(d,"grep"))		return KEY_grep;
  -	    if (strEQ(d,"goto"))		return KEY_goto;
  -	    if (strEQ(d,"glob"))		return KEY_glob;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"gmtime"))		return -KEY_gmtime;
  -	    break;
  -	}
  -	break;
  -    case 'h':
  -	if (strEQ(d,"hex"))			return -KEY_hex;
  -	break;
  -    case 'I':
  -	if (strEQ(d,"INIT"))			return KEY_INIT;
  -	break;
  -    case 'i':
  -	switch (len) {
  -	case 2:
  -	    if (strEQ(d,"if"))			return KEY_if;
  -	    break;
  -	case 3:
  -	    if (strEQ(d,"int"))			return -KEY_int;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"index"))		return -KEY_index;
  -	    if (strEQ(d,"ioctl"))		return -KEY_ioctl;
  -	    break;
  -	}
  -	break;
  -    case 'j':
  -	if (strEQ(d,"join"))			return -KEY_join;
  -	break;
  -    case 'k':
  -	if (len == 4) {
  -           if (strEQ(d,"keys"))                return -KEY_keys;
  -	    if (strEQ(d,"kill"))		return -KEY_kill;
  -	}
  -	break;
  -    case 'l':
  -	switch (len) {
  -	case 2:
  -	    if (strEQ(d,"lt"))			return -KEY_lt;
  -	    if (strEQ(d,"le"))			return -KEY_le;
  -	    if (strEQ(d,"lc"))			return -KEY_lc;
  -	    break;
  -	case 3:
  -	    if (strEQ(d,"log"))			return -KEY_log;
  -	    break;
  -	case 4:
  -	    if (strEQ(d,"last"))		return KEY_last;
  -	    if (strEQ(d,"link"))		return -KEY_link;
  -	    if (strEQ(d,"lock"))		return -KEY_lock;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"local"))		return KEY_local;
  -	    if (strEQ(d,"lstat"))		return -KEY_lstat;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"length"))		return -KEY_length;
  -	    if (strEQ(d,"listen"))		return -KEY_listen;
  -	    break;
  -	case 7:
  -	    if (strEQ(d,"lcfirst"))		return -KEY_lcfirst;
  -	    break;
  -	case 9:
  -	    if (strEQ(d,"localtime"))		return -KEY_localtime;
  -	    break;
  -	}
  -	break;
  -    case 'm':
  -	switch (len) {
  -	case 1:					return KEY_m;
  -	case 2:
  -	    if (strEQ(d,"my"))			return KEY_my;
  -	    break;
  -	case 3:
  -	    if (strEQ(d,"map"))			return KEY_map;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"mkdir"))		return -KEY_mkdir;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"msgctl"))		return -KEY_msgctl;
  -	    if (strEQ(d,"msgget"))		return -KEY_msgget;
  -	    if (strEQ(d,"msgrcv"))		return -KEY_msgrcv;
  -	    if (strEQ(d,"msgsnd"))		return -KEY_msgsnd;
  -	    break;
  -	}
  -	break;
  -    case 'n':
  -	if (strEQ(d,"next"))			return KEY_next;
  -	if (strEQ(d,"ne"))			return -KEY_ne;
  -	if (strEQ(d,"not"))			return -KEY_not;
  -	if (strEQ(d,"no"))			return KEY_no;
  -	break;
  -    case 'o':
  -	switch (len) {
  -	case 2:
  -	    if (strEQ(d,"or"))			return -KEY_or;
  -	    break;
  -	case 3:
  -	    if (strEQ(d,"ord"))			return -KEY_ord;
  -	    if (strEQ(d,"oct"))			return -KEY_oct;
  -	    if (strEQ(d,"our"))			return KEY_our;
  -	    break;
  -	case 4:
  -	    if (strEQ(d,"open"))		return -KEY_open;
  -	    break;
  -	case 7:
  -	    if (strEQ(d,"opendir"))		return -KEY_opendir;
  -	    break;
  -	}
  -	break;
  -    case 'p':
  -	switch (len) {
  -	case 3:
  -           if (strEQ(d,"pop"))                 return -KEY_pop;
  -	    if (strEQ(d,"pos"))			return KEY_pos;
  -	    break;
  -	case 4:
  -           if (strEQ(d,"push"))                return -KEY_push;
  -	    if (strEQ(d,"pack"))		return -KEY_pack;
  -	    if (strEQ(d,"pipe"))		return -KEY_pipe;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"print"))		return KEY_print;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"printf"))		return KEY_printf;
  -	    break;
  -	case 7:
  -	    if (strEQ(d,"package"))		return KEY_package;
  -	    break;
  -	case 9:
  -	    if (strEQ(d,"prototype"))		return KEY_prototype;
  -	}
  -	break;
  -    case 'q':
  -	if (len <= 2) {
  -	    if (strEQ(d,"q"))			return KEY_q;
  -	    if (strEQ(d,"qr"))			return KEY_qr;
  -	    if (strEQ(d,"qq"))			return KEY_qq;
  -	    if (strEQ(d,"qw"))			return KEY_qw;
  -	    if (strEQ(d,"qx"))			return KEY_qx;
  -	}
  -	else if (strEQ(d,"quotemeta"))		return -KEY_quotemeta;
  -	break;
  -    case 'r':
  -	switch (len) {
  -	case 3:
  -	    if (strEQ(d,"ref"))			return -KEY_ref;
  -	    break;
  -	case 4:
  -	    if (strEQ(d,"read"))		return -KEY_read;
  -	    if (strEQ(d,"rand"))		return -KEY_rand;
  -	    if (strEQ(d,"recv"))		return -KEY_recv;
  -	    if (strEQ(d,"redo"))		return KEY_redo;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"rmdir"))		return -KEY_rmdir;
  -	    if (strEQ(d,"reset"))		return -KEY_reset;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"return"))		return KEY_return;
  -	    if (strEQ(d,"rename"))		return -KEY_rename;
  -	    if (strEQ(d,"rindex"))		return -KEY_rindex;
  -	    break;
  -	case 7:
  -	    if (strEQ(d,"require"))		return KEY_require;
  -	    if (strEQ(d,"reverse"))		return -KEY_reverse;
  -	    if (strEQ(d,"readdir"))		return -KEY_readdir;
  -	    break;
  -	case 8:
  -	    if (strEQ(d,"readlink"))		return -KEY_readlink;
  -	    if (strEQ(d,"readline"))		return -KEY_readline;
  -	    if (strEQ(d,"readpipe"))		return -KEY_readpipe;
  -	    break;
  -	case 9:
  -	    if (strEQ(d,"rewinddir"))		return -KEY_rewinddir;
  -	    break;
  -	}
  -	break;
  -    case 's':
  -	switch (d[1]) {
  -	case 0:					return KEY_s;
  -	case 'c':
  -	    if (strEQ(d,"scalar"))		return KEY_scalar;
  -	    break;
  -	case 'e':
  -	    switch (len) {
  -	    case 4:
  -		if (strEQ(d,"seek"))		return -KEY_seek;
  -		if (strEQ(d,"send"))		return -KEY_send;
  -		break;
  -	    case 5:
  -		if (strEQ(d,"semop"))		return -KEY_semop;
  -		break;
  -	    case 6:
  -		if (strEQ(d,"select"))		return -KEY_select;
  -		if (strEQ(d,"semctl"))		return -KEY_semctl;
  -		if (strEQ(d,"semget"))		return -KEY_semget;
  -		break;
  -	    case 7:
  -		if (strEQ(d,"setpgrp"))		return -KEY_setpgrp;
  -		if (strEQ(d,"seekdir"))		return -KEY_seekdir;
  -		break;
  -	    case 8:
  -		if (strEQ(d,"setpwent"))	return -KEY_setpwent;
  -		if (strEQ(d,"setgrent"))	return -KEY_setgrent;
  -		break;
  -	    case 9:
  -		if (strEQ(d,"setnetent"))	return -KEY_setnetent;
  -		break;
  -	    case 10:
  -		if (strEQ(d,"setsockopt"))	return -KEY_setsockopt;
  -		if (strEQ(d,"sethostent"))	return -KEY_sethostent;
  -		if (strEQ(d,"setservent"))	return -KEY_setservent;
  -		break;
  -	    case 11:
  -		if (strEQ(d,"setpriority"))	return -KEY_setpriority;
  -		if (strEQ(d,"setprotoent"))	return -KEY_setprotoent;
  -		break;
  -	    }
  -	    break;
  -	case 'h':
  -	    switch (len) {
  -	    case 5:
  -               if (strEQ(d,"shift"))           return -KEY_shift;
  -		break;
  -	    case 6:
  -		if (strEQ(d,"shmctl"))		return -KEY_shmctl;
  -		if (strEQ(d,"shmget"))		return -KEY_shmget;
  -		break;
  -	    case 7:
  -		if (strEQ(d,"shmread"))		return -KEY_shmread;
  -		break;
  -	    case 8:
  -		if (strEQ(d,"shmwrite"))	return -KEY_shmwrite;
  -		if (strEQ(d,"shutdown"))	return -KEY_shutdown;
  -		break;
  -	    }
  -	    break;
  -	case 'i':
  -	    if (strEQ(d,"sin"))			return -KEY_sin;
  -	    break;
  -	case 'l':
  -	    if (strEQ(d,"sleep"))		return -KEY_sleep;
  -	    break;
  -	case 'o':
  -	    if (strEQ(d,"sort"))		return KEY_sort;
  -	    if (strEQ(d,"socket"))		return -KEY_socket;
  -	    if (strEQ(d,"socketpair"))		return -KEY_socketpair;
  -	    break;
  -	case 'p':
  -	    if (strEQ(d,"split"))		return KEY_split;
  -	    if (strEQ(d,"sprintf"))		return -KEY_sprintf;
  -           if (strEQ(d,"splice"))              return -KEY_splice;
  -	    break;
  -	case 'q':
  -	    if (strEQ(d,"sqrt"))		return -KEY_sqrt;
  -	    break;
  -	case 'r':
  -	    if (strEQ(d,"srand"))		return -KEY_srand;
  -	    break;
  -	case 't':
  -	    if (strEQ(d,"stat"))		return -KEY_stat;
  -	    if (strEQ(d,"study"))		return KEY_study;
  -	    break;
  -	case 'u':
  -	    if (strEQ(d,"substr"))		return -KEY_substr;
  -	    if (strEQ(d,"sub"))			return KEY_sub;
  -	    break;
  -	case 'y':
  -	    switch (len) {
  -	    case 6:
  -		if (strEQ(d,"system"))		return -KEY_system;
  -		break;
  -	    case 7:
  -		if (strEQ(d,"symlink"))		return -KEY_symlink;
  -		if (strEQ(d,"syscall"))		return -KEY_syscall;
  -		if (strEQ(d,"sysopen"))		return -KEY_sysopen;
  -		if (strEQ(d,"sysread"))		return -KEY_sysread;
  -		if (strEQ(d,"sysseek"))		return -KEY_sysseek;
  -		break;
  -	    case 8:
  -		if (strEQ(d,"syswrite"))	return -KEY_syswrite;
  -		break;
  -	    }
  -	    break;
  -	}
  -	break;
  -    case 't':
  -	switch (len) {
  -	case 2:
  -	    if (strEQ(d,"tr"))			return KEY_tr;
  -	    break;
  -	case 3:
  -	    if (strEQ(d,"tie"))			return KEY_tie;
  -	    break;
  -	case 4:
  -	    if (strEQ(d,"tell"))		return -KEY_tell;
  -	    if (strEQ(d,"tied"))		return KEY_tied;
  -	    if (strEQ(d,"time"))		return -KEY_time;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"times"))		return -KEY_times;
  -	    break;
  -	case 7:
  -	    if (strEQ(d,"telldir"))		return -KEY_telldir;
  -	    break;
  -	case 8:
  -	    if (strEQ(d,"truncate"))		return -KEY_truncate;
  -	    break;
  -	}
  -	break;
  -    case 'u':
  -	switch (len) {
  -	case 2:
  -	    if (strEQ(d,"uc"))			return -KEY_uc;
  -	    break;
  -	case 3:
  -	    if (strEQ(d,"use"))			return KEY_use;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"undef"))		return KEY_undef;
  -	    if (strEQ(d,"until"))		return KEY_until;
  -	    if (strEQ(d,"untie"))		return KEY_untie;
  -	    if (strEQ(d,"utime"))		return -KEY_utime;
  -	    if (strEQ(d,"umask"))		return -KEY_umask;
  -	    break;
  -	case 6:
  -	    if (strEQ(d,"unless"))		return KEY_unless;
  -	    if (strEQ(d,"unpack"))		return -KEY_unpack;
  -	    if (strEQ(d,"unlink"))		return -KEY_unlink;
  -	    break;
  -	case 7:
  -           if (strEQ(d,"unshift"))             return -KEY_unshift;
  -	    if (strEQ(d,"ucfirst"))		return -KEY_ucfirst;
  -	    break;
  -	}
  -	break;
  -    case 'v':
  -	if (strEQ(d,"values"))			return -KEY_values;
  -	if (strEQ(d,"vec"))			return -KEY_vec;
  -	break;
  -    case 'w':
  -	switch (len) {
  -	case 4:
  -	    if (strEQ(d,"warn"))		return -KEY_warn;
  -	    if (strEQ(d,"wait"))		return -KEY_wait;
  -	    break;
  -	case 5:
  -	    if (strEQ(d,"while"))		return KEY_while;
  -	    if (strEQ(d,"write"))		return -KEY_write;
  -	    break;
  -	case 7:
  -	    if (strEQ(d,"waitpid"))		return -KEY_waitpid;
  -	    break;
  -	case 9:
  -	    if (strEQ(d,"wantarray"))		return -KEY_wantarray;
  -	    break;
  -	}
  -	break;
  -    case 'x':
  -	if (len == 1)				return -KEY_x;
  -	if (strEQ(d,"xor"))			return -KEY_xor;
  -	break;
  -    case 'y':
  -	if (len == 1)				return KEY_y;
  -	break;
  -    case 'z':
  -	break;
  -    }
  -    return 0;
  +  switch (len)
  +  {
  +    case 1: /* 5 tokens of length 1 */
  +      switch (name[0])
  +      {
  +        case 'm':
  +          {                                       /* m          */
  +            return KEY_m;
  +          }
  +
  +        case 'q':
  +          {                                       /* q          */
  +            return KEY_q;
  +          }
  +
  +        case 's':
  +          {                                       /* s          */
  +            return KEY_s;
  +          }
  +
  +        case 'x':
  +          {                                       /* x          */
  +            return -KEY_x;
  +          }
  +
  +        case 'y':
  +          {                                       /* y          */
  +            return KEY_y;
  +          }
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 2: /* 18 tokens of length 2 */
  +      switch (name[0])
  +      {
  +        case 'd':
  +          if (name[1] == 'o')
  +          {                                       /* do         */
  +            return KEY_do;
  +          }
  +
  +          goto unknown;
  +
  +        case 'e':
  +          if (name[1] == 'q')
  +          {                                       /* eq         */
  +            return -KEY_eq;
  +          }
  +
  +          goto unknown;
  +
  +        case 'g':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              {                                   /* ge         */
  +                return -KEY_ge;
  +              }
  +
  +            case 't':
  +              {                                   /* gt         */
  +                return -KEY_gt;
  +              }
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'i':
  +          if (name[1] == 'f')
  +          {                                       /* if         */
  +            return KEY_if;
  +          }
  +
  +          goto unknown;
  +
  +        case 'l':
  +          switch (name[1])
  +          {
  +            case 'c':
  +              {                                   /* lc         */
  +                return -KEY_lc;
  +              }
  +
  +            case 'e':
  +              {                                   /* le         */
  +                return -KEY_le;
  +              }
  +
  +            case 't':
  +              {                                   /* lt         */
  +                return -KEY_lt;
  +              }
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'm':
  +          if (name[1] == 'y')
  +          {                                       /* my         */
  +            return KEY_my;
  +          }
  +
  +          goto unknown;
  +
  +        case 'n':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              {                                   /* ne         */
  +                return -KEY_ne;
  +              }
  +
  +            case 'o':
  +              {                                   /* no         */
  +                return KEY_no;
  +              }
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'o':
  +          if (name[1] == 'r')
  +          {                                       /* or         */
  +            return -KEY_or;
  +          }
  +
  +          goto unknown;
  +
  +        case 'q':
  +          switch (name[1])
  +          {
  +            case 'q':
  +              {                                   /* qq         */
  +                return KEY_qq;
  +              }
  +
  +            case 'r':
  +              {                                   /* qr         */
  +                return KEY_qr;
  +              }
  +
  +            case 'w':
  +              {                                   /* qw         */
  +                return KEY_qw;
  +              }
  +
  +            case 'x':
  +              {                                   /* qx         */
  +                return KEY_qx;
  +              }
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 't':
  +          if (name[1] == 'r')
  +          {                                       /* tr         */
  +            return KEY_tr;
  +          }
  +
  +          goto unknown;
  +
  +        case 'u':
  +          if (name[1] == 'c')
  +          {                                       /* uc         */
  +            return -KEY_uc;
  +          }
  +
  +          goto unknown;
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 3: /* 28 tokens of length 3 */
  +      switch (name[0])
  +      {
  +        case 'E':
  +          if (name[1] == 'N' &&
  +              name[2] == 'D')
  +          {                                       /* END        */
  +            return KEY_END;
  +          }
  +
  +          goto unknown;
  +
  +        case 'a':
  +          switch (name[1])
  +          {
  +            case 'b':
  +              if (name[2] == 's')
  +              {                                   /* abs        */
  +                return -KEY_abs;
  +              }
  +
  +              goto unknown;
  +
  +            case 'n':
  +              if (name[2] == 'd')
  +              {                                   /* and        */
  +                return -KEY_and;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'c':
  +          switch (name[1])
  +          {
  +            case 'h':
  +              if (name[2] == 'r')
  +              {                                   /* chr        */
  +                return -KEY_chr;
  +              }
  +
  +              goto unknown;
  +
  +            case 'm':
  +              if (name[2] == 'p')
  +              {                                   /* cmp        */
  +                return -KEY_cmp;
  +              }
  +
  +              goto unknown;
  +
  +            case 'o':
  +              if (name[2] == 's')
  +              {                                   /* cos        */
  +                return -KEY_cos;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'd':
  +          if (name[1] == 'i' &&
  +              name[2] == 'e')
  +          {                                       /* die        */
  +            return -KEY_die;
  +          }
  +
  +          goto unknown;
  +
  +        case 'e':
  +          switch (name[1])
  +          {
  +            case 'o':
  +              if (name[2] == 'f')
  +              {                                   /* eof        */
  +                return -KEY_eof;
  +              }
  +
  +              goto unknown;
  +
  +            case 'r':
  +              if (name[2] == 'r')
  +              {                                   /* err        */
  +                return -KEY_err;
  +              }
  +
  +              goto unknown;
  +
  +            case 'x':
  +              if (name[2] == 'p')
  +              {                                   /* exp        */
  +                return -KEY_exp;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'f':
  +          if (name[1] == 'o' &&
  +              name[2] == 'r')
  +          {                                       /* for        */
  +            return KEY_for;
  +          }
  +
  +          goto unknown;
  +
  +        case 'h':
  +          if (name[1] == 'e' &&
  +              name[2] == 'x')
  +          {                                       /* hex        */
  +            return -KEY_hex;
  +          }
  +
  +          goto unknown;
  +
  +        case 'i':
  +          if (name[1] == 'n' &&
  +              name[2] == 't')
  +          {                                       /* int        */
  +            return -KEY_int;
  +          }
  +
  +          goto unknown;
  +
  +        case 'l':
  +          if (name[1] == 'o' &&
  +              name[2] == 'g')
  +          {                                       /* log        */
  +            return -KEY_log;
  +          }
  +
  +          goto unknown;
  +
  +        case 'm':
  +          if (name[1] == 'a' &&
  +              name[2] == 'p')
  +          {                                       /* map        */
  +            return KEY_map;
  +          }
  +
  +          goto unknown;
  +
  +        case 'n':
  +          if (name[1] == 'o' &&
  +              name[2] == 't')
  +          {                                       /* not        */
  +            return -KEY_not;
  +          }
  +
  +          goto unknown;
  +
  +        case 'o':
  +          switch (name[1])
  +          {
  +            case 'c':
  +              if (name[2] == 't')
  +              {                                   /* oct        */
  +                return -KEY_oct;
  +              }
  +
  +              goto unknown;
  +
  +            case 'r':
  +              if (name[2] == 'd')
  +              {                                   /* ord        */
  +                return -KEY_ord;
  +              }
  +
  +              goto unknown;
  +
  +            case 'u':
  +              if (name[2] == 'r')
  +              {                                   /* our        */
  +                return KEY_our;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'p':
  +          if (name[1] == 'o')
  +          {
  +            switch (name[2])
  +            {
  +              case 'p':
  +                {                                 /* pop        */
  +                  return -KEY_pop;
  +                }
  +
  +              case 's':
  +                {                                 /* pos        */
  +                  return KEY_pos;
  +                }
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 'r':
  +          if (name[1] == 'e' &&
  +              name[2] == 'f')
  +          {                                       /* ref        */
  +            return -KEY_ref;
  +          }
  +
  +          goto unknown;
  +
  +        case 's':
  +          switch (name[1])
  +          {
  +            case 'i':
  +              if (name[2] == 'n')
  +              {                                   /* sin        */
  +                return -KEY_sin;
  +              }
  +
  +              goto unknown;
  +
  +            case 'u':
  +              if (name[2] == 'b')
  +              {                                   /* sub        */
  +                return KEY_sub;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 't':
  +          if (name[1] == 'i' &&
  +              name[2] == 'e')
  +          {                                       /* tie        */
  +            return KEY_tie;
  +          }
  +
  +          goto unknown;
  +
  +        case 'u':
  +          if (name[1] == 's' &&
  +              name[2] == 'e')
  +          {                                       /* use        */
  +            return KEY_use;
  +          }
  +
  +          goto unknown;
  +
  +        case 'v':
  +          if (name[1] == 'e' &&
  +              name[2] == 'c')
  +          {                                       /* vec        */
  +            return -KEY_vec;
  +          }
  +
  +          goto unknown;
  +
  +        case 'x':
  +          if (name[1] == 'o' &&
  +              name[2] == 'r')
  +          {                                       /* xor        */
  +            return -KEY_xor;
  +          }
  +
  +          goto unknown;
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 4: /* 40 tokens of length 4 */
  +      switch (name[0])
  +      {
  +        case 'C':
  +          if (name[1] == 'O' &&
  +              name[2] == 'R' &&
  +              name[3] == 'E')
  +          {                                       /* CORE       */
  +            return -KEY_CORE;
  +          }
  +
  +          goto unknown;
  +
  +        case 'I':
  +          if (name[1] == 'N' &&
  +              name[2] == 'I' &&
  +              name[3] == 'T')
  +          {                                       /* INIT       */
  +            return KEY_INIT;
  +          }
  +
  +          goto unknown;
  +
  +        case 'b':
  +          if (name[1] == 'i' &&
  +              name[2] == 'n' &&
  +              name[3] == 'd')
  +          {                                       /* bind       */
  +            return -KEY_bind;
  +          }
  +
  +          goto unknown;
  +
  +        case 'c':
  +          if (name[1] == 'h' &&
  +              name[2] == 'o' &&
  +              name[3] == 'p')
  +          {                                       /* chop       */
  +            return -KEY_chop;
  +          }
  +
  +          goto unknown;
  +
  +        case 'd':
  +          if (name[1] == 'u' &&
  +              name[2] == 'm' &&
  +              name[3] == 'p')
  +          {                                       /* dump       */
  +            return -KEY_dump;
  +          }
  +
  +          goto unknown;
  +
  +        case 'e':
  +          switch (name[1])
  +          {
  +            case 'a':
  +              if (name[2] == 'c' &&
  +                  name[3] == 'h')
  +              {                                   /* each       */
  +                return -KEY_each;
  +              }
  +
  +              goto unknown;
  +
  +            case 'l':
  +              if (name[2] == 's' &&
  +                  name[3] == 'e')
  +              {                                   /* else       */
  +                return KEY_else;
  +              }
  +
  +              goto unknown;
  +
  +            case 'v':
  +              if (name[2] == 'a' &&
  +                  name[3] == 'l')
  +              {                                   /* eval       */
  +                return KEY_eval;
  +              }
  +
  +              goto unknown;
  +
  +            case 'x':
  +              switch (name[2])
  +              {
  +                case 'e':
  +                  if (name[3] == 'c')
  +                  {                               /* exec       */
  +                    return -KEY_exec;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'i':
  +                  if (name[3] == 't')
  +                  {                               /* exit       */
  +                    return -KEY_exit;
  +                  }
  +
  +                  goto unknown;
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'f':
  +          if (name[1] == 'o' &&
  +              name[2] == 'r' &&
  +              name[3] == 'k')
  +          {                                       /* fork       */
  +            return -KEY_fork;
  +          }
  +
  +          goto unknown;
  +
  +        case 'g':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              if (name[2] == 't' &&
  +                  name[3] == 'c')
  +              {                                   /* getc       */
  +                return -KEY_getc;
  +              }
  +
  +              goto unknown;
  +
  +            case 'l':
  +              if (name[2] == 'o' &&
  +                  name[3] == 'b')
  +              {                                   /* glob       */
  +                return KEY_glob;
  +              }
  +
  +              goto unknown;
  +
  +            case 'o':
  +              if (name[2] == 't' &&
  +                  name[3] == 'o')
  +              {                                   /* goto       */
  +                return KEY_goto;
  +              }
  +
  +              goto unknown;
  +
  +            case 'r':
  +              if (name[2] == 'e' &&
  +                  name[3] == 'p')
  +              {                                   /* grep       */
  +                return KEY_grep;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'j':
  +          if (name[1] == 'o' &&
  +              name[2] == 'i' &&
  +              name[3] == 'n')
  +          {                                       /* join       */
  +            return -KEY_join;
  +          }
  +
  +          goto unknown;
  +
  +        case 'k':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              if (name[2] == 'y' &&
  +                  name[3] == 's')
  +              {                                   /* keys       */
  +                return -KEY_keys;
  +              }
  +
  +              goto unknown;
  +
  +            case 'i':
  +              if (name[2] == 'l' &&
  +                  name[3] == 'l')
  +              {                                   /* kill       */
  +                return -KEY_kill;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'l':
  +          switch (name[1])
  +          {
  +            case 'a':
  +              if (name[2] == 's' &&
  +                  name[3] == 't')
  +              {                                   /* last       */
  +                return KEY_last;
  +              }
  +
  +              goto unknown;
  +
  +            case 'i':
  +              if (name[2] == 'n' &&
  +                  name[3] == 'k')
  +              {                                   /* link       */
  +                return -KEY_link;
  +              }
  +
  +              goto unknown;
  +
  +            case 'o':
  +              if (name[2] == 'c' &&
  +                  name[3] == 'k')
  +              {                                   /* lock       */
  +                return -KEY_lock;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'n':
  +          if (name[1] == 'e' &&
  +              name[2] == 'x' &&
  +              name[3] == 't')
  +          {                                       /* next       */
  +            return KEY_next;
  +          }
  +
  +          goto unknown;
  +
  +        case 'o':
  +          if (name[1] == 'p' &&
  +              name[2] == 'e' &&
  +              name[3] == 'n')
  +          {                                       /* open       */
  +            return -KEY_open;
  +          }
  +
  +          goto unknown;
  +
  +        case 'p':
  +          switch (name[1])
  +          {
  +            case 'a':
  +              if (name[2] == 'c' &&
  +                  name[3] == 'k')
  +              {                                   /* pack       */
  +                return -KEY_pack;
  +              }
  +
  +              goto unknown;
  +
  +            case 'i':
  +              if (name[2] == 'p' &&
  +                  name[3] == 'e')
  +              {                                   /* pipe       */
  +                return -KEY_pipe;
  +              }
  +
  +              goto unknown;
  +
  +            case 'u':
  +              if (name[2] == 's' &&
  +                  name[3] == 'h')
  +              {                                   /* push       */
  +                return -KEY_push;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'r':
  +          switch (name[1])
  +          {
  +            case 'a':
  +              if (name[2] == 'n' &&
  +                  name[3] == 'd')
  +              {                                   /* rand       */
  +                return -KEY_rand;
  +              }
  +
  +              goto unknown;
  +
  +            case 'e':
  +              switch (name[2])
  +              {
  +                case 'a':
  +                  if (name[3] == 'd')
  +                  {                               /* read       */
  +                    return -KEY_read;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'c':
  +                  if (name[3] == 'v')
  +                  {                               /* recv       */
  +                    return -KEY_recv;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'd':
  +                  if (name[3] == 'o')
  +                  {                               /* redo       */
  +                    return KEY_redo;
  +                  }
  +
  +                  goto unknown;
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 's':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              switch (name[2])
  +              {
  +                case 'e':
  +                  if (name[3] == 'k')
  +                  {                               /* seek       */
  +                    return -KEY_seek;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'n':
  +                  if (name[3] == 'd')
  +                  {                               /* send       */
  +                    return -KEY_send;
  +                  }
  +
  +                  goto unknown;
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            case 'o':
  +              if (name[2] == 'r' &&
  +                  name[3] == 't')
  +              {                                   /* sort       */
  +                return KEY_sort;
  +              }
  +
  +              goto unknown;
  +
  +            case 'q':
  +              if (name[2] == 'r' &&
  +                  name[3] == 't')
  +              {                                   /* sqrt       */
  +                return -KEY_sqrt;
  +              }
  +
  +              goto unknown;
  +
  +            case 't':
  +              if (name[2] == 'a' &&
  +                  name[3] == 't')
  +              {                                   /* stat       */
  +                return -KEY_stat;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 't':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              if (name[2] == 'l' &&
  +                  name[3] == 'l')
  +              {                                   /* tell       */
  +                return -KEY_tell;
  +              }
  +
  +              goto unknown;
  +
  +            case 'i':
  +              switch (name[2])
  +              {
  +                case 'e':
  +                  if (name[3] == 'd')
  +                  {                               /* tied       */
  +                    return KEY_tied;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'm':
  +                  if (name[3] == 'e')
  +                  {                               /* time       */
  +                    return -KEY_time;
  +                  }
  +
  +                  goto unknown;
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'w':
  +          if (name[1] == 'a')
  +          {
  +            switch (name[2])
  +            {
  +              case 'i':
  +                if (name[3] == 't')
  +                {                                 /* wait       */
  +                  return -KEY_wait;
  +                }
  +
  +                goto unknown;
  +
  +              case 'r':
  +                if (name[3] == 'n')
  +                {                                 /* warn       */
  +                  return -KEY_warn;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 5: /* 36 tokens of length 5 */
  +      switch (name[0])
  +      {
  +        case 'B':
  +          if (name[1] == 'E' &&
  +              name[2] == 'G' &&
  +              name[3] == 'I' &&
  +              name[4] == 'N')
  +          {                                       /* BEGIN      */
  +            return KEY_BEGIN;
  +          }
  +
  +          goto unknown;
  +
  +        case 'C':
  +          if (name[1] == 'H' &&
  +              name[2] == 'E' &&
  +              name[3] == 'C' &&
  +              name[4] == 'K')
  +          {                                       /* CHECK      */
  +            return KEY_CHECK;
  +          }
  +
  +          goto unknown;
  +
  +        case 'a':
  +          switch (name[1])
  +          {
  +            case 'l':
  +              if (name[2] == 'a' &&
  +                  name[3] == 'r' &&
  +                  name[4] == 'm')
  +              {                                   /* alarm      */
  +                return -KEY_alarm;
  +              }
  +
  +              goto unknown;
  +
  +            case 't':
  +              if (name[2] == 'a' &&
  +                  name[3] == 'n' &&
  +                  name[4] == '2')
  +              {                                   /* atan2      */
  +                return -KEY_atan2;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'b':
  +          if (name[1] == 'l' &&
  +              name[2] == 'e' &&
  +              name[3] == 's' &&
  +              name[4] == 's')
  +          {                                       /* bless      */
  +            return -KEY_bless;
  +          }
  +
  +          goto unknown;
  +
  +        case 'c':
  +          switch (name[1])
  +          {
  +            case 'h':
  +              switch (name[2])
  +              {
  +                case 'd':
  +                  if (name[3] == 'i' &&
  +                      name[4] == 'r')
  +                  {                               /* chdir      */
  +                    return -KEY_chdir;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'm':
  +                  if (name[3] == 'o' &&
  +                      name[4] == 'd')
  +                  {                               /* chmod      */
  +                    return -KEY_chmod;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'o':
  +                  switch (name[3])
  +                  {
  +                    case 'm':
  +                      if (name[4] == 'p')
  +                      {                           /* chomp      */
  +                        return -KEY_chomp;
  +                      }
  +
  +                      goto unknown;
  +
  +                    case 'w':
  +                      if (name[4] == 'n')
  +                      {                           /* chown      */
  +                        return -KEY_chown;
  +                      }
  +
  +                      goto unknown;
  +
  +                    default:
  +                      goto unknown;
  +                  }
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            case 'l':
  +              if (name[2] == 'o' &&
  +                  name[3] == 's' &&
  +                  name[4] == 'e')
  +              {                                   /* close      */
  +                return -KEY_close;
  +              }
  +
  +              goto unknown;
  +
  +            case 'r':
  +              if (name[2] == 'y' &&
  +                  name[3] == 'p' &&
  +                  name[4] == 't')
  +              {                                   /* crypt      */
  +                return -KEY_crypt;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'e':
  +          if (name[1] == 'l' &&
  +              name[2] == 's' &&
  +              name[3] == 'i' &&
  +              name[4] == 'f')
  +          {                                       /* elsif      */
  +            return KEY_elsif;
  +          }
  +
  +          goto unknown;
  +
  +        case 'f':
  +          switch (name[1])
  +          {
  +            case 'c':
  +              if (name[2] == 'n' &&
  +                  name[3] == 't' &&
  +                  name[4] == 'l')
  +              {                                   /* fcntl      */
  +                return -KEY_fcntl;
  +              }
  +
  +              goto unknown;
  +
  +            case 'l':
  +              if (name[2] == 'o' &&
  +                  name[3] == 'c' &&
  +                  name[4] == 'k')
  +              {                                   /* flock      */
  +                return -KEY_flock;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'i':
  +          switch (name[1])
  +          {
  +            case 'n':
  +              if (name[2] == 'd' &&
  +                  name[3] == 'e' &&
  +                  name[4] == 'x')
  +              {                                   /* index      */
  +                return -KEY_index;
  +              }
  +
  +              goto unknown;
  +
  +            case 'o':
  +              if (name[2] == 'c' &&
  +                  name[3] == 't' &&
  +                  name[4] == 'l')
  +              {                                   /* ioctl      */
  +                return -KEY_ioctl;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'l':
  +          switch (name[1])
  +          {
  +            case 'o':
  +              if (name[2] == 'c' &&
  +                  name[3] == 'a' &&
  +                  name[4] == 'l')
  +              {                                   /* local      */
  +                return KEY_local;
  +              }
  +
  +              goto unknown;
  +
  +            case 's':
  +              if (name[2] == 't' &&
  +                  name[3] == 'a' &&
  +                  name[4] == 't')
  +              {                                   /* lstat      */
  +                return -KEY_lstat;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'm':
  +          if (name[1] == 'k' &&
  +              name[2] == 'd' &&
  +              name[3] == 'i' &&
  +              name[4] == 'r')
  +          {                                       /* mkdir      */
  +            return -KEY_mkdir;
  +          }
  +
  +          goto unknown;
  +
  +        case 'p':
  +          if (name[1] == 'r' &&
  +              name[2] == 'i' &&
  +              name[3] == 'n' &&
  +              name[4] == 't')
  +          {                                       /* print      */
  +            return KEY_print;
  +          }
  +
  +          goto unknown;
  +
  +        case 'r':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              if (name[2] == 's' &&
  +                  name[3] == 'e' &&
  +                  name[4] == 't')
  +              {                                   /* reset      */
  +                return -KEY_reset;
  +              }
  +
  +              goto unknown;
  +
  +            case 'm':
  +              if (name[2] == 'd' &&
  +                  name[3] == 'i' &&
  +                  name[4] == 'r')
  +              {                                   /* rmdir      */
  +                return -KEY_rmdir;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 's':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              if (name[2] == 'm' &&
  +                  name[3] == 'o' &&
  +                  name[4] == 'p')
  +              {                                   /* semop      */
  +                return -KEY_semop;
  +              }
  +
  +              goto unknown;
  +
  +            case 'h':
  +              if (name[2] == 'i' &&
  +                  name[3] == 'f' &&
  +                  name[4] == 't')
  +              {                                   /* shift      */
  +                return -KEY_shift;
  +              }
  +
  +              goto unknown;
  +
  +            case 'l':
  +              if (name[2] == 'e' &&
  +                  name[3] == 'e' &&
  +                  name[4] == 'p')
  +              {                                   /* sleep      */
  +                return -KEY_sleep;
  +              }
  +
  +              goto unknown;
  +
  +            case 'p':
  +              if (name[2] == 'l' &&
  +                  name[3] == 'i' &&
  +                  name[4] == 't')
  +              {                                   /* split      */
  +                return KEY_split;
  +              }
  +
  +              goto unknown;
  +
  +            case 'r':
  +              if (name[2] == 'a' &&
  +                  name[3] == 'n' &&
  +                  name[4] == 'd')
  +              {                                   /* srand      */
  +                return -KEY_srand;
  +              }
  +
  +              goto unknown;
  +
  +            case 't':
  +              if (name[2] == 'u' &&
  +                  name[3] == 'd' &&
  +                  name[4] == 'y')
  +              {                                   /* study      */
  +                return KEY_study;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 't':
  +          if (name[1] == 'i' &&
  +              name[2] == 'm' &&
  +              name[3] == 'e' &&
  +              name[4] == 's')
  +          {                                       /* times      */
  +            return -KEY_times;
  +          }
  +
  +          goto unknown;
  +
  +        case 'u':
  +          switch (name[1])
  +          {
  +            case 'm':
  +              if (name[2] == 'a' &&
  +                  name[3] == 's' &&
  +                  name[4] == 'k')
  +              {                                   /* umask      */
  +                return -KEY_umask;
  +              }
  +
  +              goto unknown;
  +
  +            case 'n':
  +              switch (name[2])
  +              {
  +                case 'd':
  +                  if (name[3] == 'e' &&
  +                      name[4] == 'f')
  +                  {                               /* undef      */
  +                    return KEY_undef;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 't':
  +                  if (name[3] == 'i')
  +                  {
  +                    switch (name[4])
  +                    {
  +                      case 'e':
  +                        {                         /* untie      */
  +                          return KEY_untie;
  +                        }
  +
  +                      case 'l':
  +                        {                         /* until      */
  +                          return KEY_until;
  +                        }
  +
  +                      default:
  +                        goto unknown;
  +                    }
  +                  }
  +
  +                  goto unknown;
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            case 't':
  +              if (name[2] == 'i' &&
  +                  name[3] == 'm' &&
  +                  name[4] == 'e')
  +              {                                   /* utime      */
  +                return -KEY_utime;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'w':
  +          switch (name[1])
  +          {
  +            case 'h':
  +              if (name[2] == 'i' &&
  +                  name[3] == 'l' &&
  +                  name[4] == 'e')
  +              {                                   /* while      */
  +                return KEY_while;
  +              }
  +
  +              goto unknown;
  +
  +            case 'r':
  +              if (name[2] == 'i' &&
  +                  name[3] == 't' &&
  +                  name[4] == 'e')
  +              {                                   /* write      */
  +                return -KEY_write;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 6: /* 33 tokens of length 6 */
  +      switch (name[0])
  +      {
  +        case 'a':
  +          if (name[1] == 'c' &&
  +              name[2] == 'c' &&
  +              name[3] == 'e' &&
  +              name[4] == 'p' &&
  +              name[5] == 't')
  +          {                                       /* accept     */
  +            return -KEY_accept;
  +          }
  +
  +          goto unknown;
  +
  +        case 'c':
  +          switch (name[1])
  +          {
  +            case 'a':
  +              if (name[2] == 'l' &&
  +                  name[3] == 'l' &&
  +                  name[4] == 'e' &&
  +                  name[5] == 'r')
  +              {                                   /* caller     */
  +                return -KEY_caller;
  +              }
  +
  +              goto unknown;
  +
  +            case 'h':
  +              if (name[2] == 'r' &&
  +                  name[3] == 'o' &&
  +                  name[4] == 'o' &&
  +                  name[5] == 't')
  +              {                                   /* chroot     */
  +                return -KEY_chroot;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'd':
  +          if (name[1] == 'e' &&
  +              name[2] == 'l' &&
  +              name[3] == 'e' &&
  +              name[4] == 't' &&
  +              name[5] == 'e')
  +          {                                       /* delete     */
  +            return KEY_delete;
  +          }
  +
  +          goto unknown;
  +
  +        case 'e':
  +          switch (name[1])
  +          {
  +            case 'l':
  +              if (name[2] == 's' &&
  +                  name[3] == 'e' &&
  +                  name[4] == 'i' &&
  +                  name[5] == 'f')
  +              {                                   /* elseif     */
  +                if(ckWARN_d(WARN_SYNTAX))
  +                  Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
  +              }
  +
  +              goto unknown;
  +
  +            case 'x':
  +              if (name[2] == 'i' &&
  +                  name[3] == 's' &&
  +                  name[4] == 't' &&
  +                  name[5] == 's')
  +              {                                   /* exists     */
  +                return KEY_exists;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'f':
  +          switch (name[1])
  +          {
  +            case 'i':
  +              if (name[2] == 'l' &&
  +                  name[3] == 'e' &&
  +                  name[4] == 'n' &&
  +                  name[5] == 'o')
  +              {                                   /* fileno     */
  +                return -KEY_fileno;
  +              }
  +
  +              goto unknown;
  +
  +            case 'o':
  +              if (name[2] == 'r' &&
  +                  name[3] == 'm' &&
  +                  name[4] == 'a' &&
  +                  name[5] == 't')
  +              {                                   /* format     */
  +                return KEY_format;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'g':
  +          if (name[1] == 'm' &&
  +              name[2] == 't' &&
  +              name[3] == 'i' &&
  +              name[4] == 'm' &&
  +              name[5] == 'e')
  +          {                                       /* gmtime     */
  +            return -KEY_gmtime;
  +          }
  +
  +          goto unknown;
  +
  +        case 'l':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              if (name[2] == 'n' &&
  +                  name[3] == 'g' &&
  +                  name[4] == 't' &&
  +                  name[5] == 'h')
  +              {                                   /* length     */
  +                return -KEY_length;
  +              }
  +
  +              goto unknown;
  +
  +            case 'i':
  +              if (name[2] == 's' &&
  +                  name[3] == 't' &&
  +                  name[4] == 'e' &&
  +                  name[5] == 'n')
  +              {                                   /* listen     */
  +                return -KEY_listen;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'm':
  +          if (name[1] == 's' &&
  +              name[2] == 'g')
  +          {
  +            switch (name[3])
  +            {
  +              case 'c':
  +                if (name[4] == 't' &&
  +                    name[5] == 'l')
  +                {                                 /* msgctl     */
  +                  return -KEY_msgctl;
  +                }
  +
  +                goto unknown;
  +
  +              case 'g':
  +                if (name[4] == 'e' &&
  +                    name[5] == 't')
  +                {                                 /* msgget     */
  +                  return -KEY_msgget;
  +                }
  +
  +                goto unknown;
  +
  +              case 'r':
  +                if (name[4] == 'c' &&
  +                    name[5] == 'v')
  +                {                                 /* msgrcv     */
  +                  return -KEY_msgrcv;
  +                }
  +
  +                goto unknown;
  +
  +              case 's':
  +                if (name[4] == 'n' &&
  +                    name[5] == 'd')
  +                {                                 /* msgsnd     */
  +                  return -KEY_msgsnd;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 'p':
  +          if (name[1] == 'r' &&
  +              name[2] == 'i' &&
  +              name[3] == 'n' &&
  +              name[4] == 't' &&
  +              name[5] == 'f')
  +          {                                       /* printf     */
  +            return KEY_printf;
  +          }
  +
  +          goto unknown;
  +
  +        case 'r':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              switch (name[2])
  +              {
  +                case 'n':
  +                  if (name[3] == 'a' &&
  +                      name[4] == 'm' &&
  +                      name[5] == 'e')
  +                  {                               /* rename     */
  +                    return -KEY_rename;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 't':
  +                  if (name[3] == 'u' &&
  +                      name[4] == 'r' &&
  +                      name[5] == 'n')
  +                  {                               /* return     */
  +                    return KEY_return;
  +                  }
  +
  +                  goto unknown;
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            case 'i':
  +              if (name[2] == 'n' &&
  +                  name[3] == 'd' &&
  +                  name[4] == 'e' &&
  +                  name[5] == 'x')
  +              {                                   /* rindex     */
  +                return -KEY_rindex;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 's':
  +          switch (name[1])
  +          {
  +            case 'c':
  +              if (name[2] == 'a' &&
  +                  name[3] == 'l' &&
  +                  name[4] == 'a' &&
  +                  name[5] == 'r')
  +              {                                   /* scalar     */
  +                return KEY_scalar;
  +              }
  +
  +              goto unknown;
  +
  +            case 'e':
  +              switch (name[2])
  +              {
  +                case 'l':
  +                  if (name[3] == 'e' &&
  +                      name[4] == 'c' &&
  +                      name[5] == 't')
  +                  {                               /* select     */
  +                    return -KEY_select;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'm':
  +                  switch (name[3])
  +                  {
  +                    case 'c':
  +                      if (name[4] == 't' &&
  +                          name[5] == 'l')
  +                      {                           /* semctl     */
  +                        return -KEY_semctl;
  +                      }
  +
  +                      goto unknown;
  +
  +                    case 'g':
  +                      if (name[4] == 'e' &&
  +                          name[5] == 't')
  +                      {                           /* semget     */
  +                        return -KEY_semget;
  +                      }
  +
  +                      goto unknown;
  +
  +                    default:
  +                      goto unknown;
  +                  }
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            case 'h':
  +              if (name[2] == 'm')
  +              {
  +                switch (name[3])
  +                {
  +                  case 'c':
  +                    if (name[4] == 't' &&
  +                        name[5] == 'l')
  +                    {                             /* shmctl     */
  +                      return -KEY_shmctl;
  +                    }
  +
  +                    goto unknown;
  +
  +                  case 'g':
  +                    if (name[4] == 'e' &&
  +                        name[5] == 't')
  +                    {                             /* shmget     */
  +                      return -KEY_shmget;
  +                    }
  +
  +                    goto unknown;
  +
  +                  default:
  +                    goto unknown;
  +                }
  +              }
  +
  +              goto unknown;
  +
  +            case 'o':
  +              if (name[2] == 'c' &&
  +                  name[3] == 'k' &&
  +                  name[4] == 'e' &&
  +                  name[5] == 't')
  +              {                                   /* socket     */
  +                return -KEY_socket;
  +              }
  +
  +              goto unknown;
  +
  +            case 'p':
  +              if (name[2] == 'l' &&
  +                  name[3] == 'i' &&
  +                  name[4] == 'c' &&
  +                  name[5] == 'e')
  +              {                                   /* splice     */
  +                return -KEY_splice;
  +              }
  +
  +              goto unknown;
  +
  +            case 'u':
  +              if (name[2] == 'b' &&
  +                  name[3] == 's' &&
  +                  name[4] == 't' &&
  +                  name[5] == 'r')
  +              {                                   /* substr     */
  +                return -KEY_substr;
  +              }
  +
  +              goto unknown;
  +
  +            case 'y':
  +              if (name[2] == 's' &&
  +                  name[3] == 't' &&
  +                  name[4] == 'e' &&
  +                  name[5] == 'm')
  +              {                                   /* system     */
  +                return -KEY_system;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'u':
  +          if (name[1] == 'n')
  +          {
  +            switch (name[2])
  +            {
  +              case 'l':
  +                switch (name[3])
  +                {
  +                  case 'e':
  +                    if (name[4] == 's' &&
  +                        name[5] == 's')
  +                    {                             /* unless     */
  +                      return KEY_unless;
  +                    }
  +
  +                    goto unknown;
  +
  +                  case 'i':
  +                    if (name[4] == 'n' &&
  +                        name[5] == 'k')
  +                    {                             /* unlink     */
  +                      return -KEY_unlink;
  +                    }
  +
  +                    goto unknown;
  +
  +                  default:
  +                    goto unknown;
  +                }
  +
  +              case 'p':
  +                if (name[3] == 'a' &&
  +                    name[4] == 'c' &&
  +                    name[5] == 'k')
  +                {                                 /* unpack     */
  +                  return -KEY_unpack;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 'v':
  +          if (name[1] == 'a' &&
  +              name[2] == 'l' &&
  +              name[3] == 'u' &&
  +              name[4] == 'e' &&
  +              name[5] == 's')
  +          {                                       /* values     */
  +            return -KEY_values;
  +          }
  +
  +          goto unknown;
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 7: /* 28 tokens of length 7 */
  +      switch (name[0])
  +      {
  +        case 'D':
  +          if (name[1] == 'E' &&
  +              name[2] == 'S' &&
  +              name[3] == 'T' &&
  +              name[4] == 'R' &&
  +              name[5] == 'O' &&
  +              name[6] == 'Y')
  +          {                                       /* DESTROY    */
  +            return KEY_DESTROY;
  +          }
  +
  +          goto unknown;
  +
  +        case '_':
  +          if (name[1] == '_' &&
  +              name[2] == 'E' &&
  +              name[3] == 'N' &&
  +              name[4] == 'D' &&
  +              name[5] == '_' &&
  +              name[6] == '_')
  +          {                                       /* __END__    */
  +            return KEY___END__;
  +          }
  +
  +          goto unknown;
  +
  +        case 'b':
  +          if (name[1] == 'i' &&
  +              name[2] == 'n' &&
  +              name[3] == 'm' &&
  +              name[4] == 'o' &&
  +              name[5] == 'd' &&
  +              name[6] == 'e')
  +          {                                       /* binmode    */
  +            return -KEY_binmode;
  +          }
  +
  +          goto unknown;
  +
  +        case 'c':
  +          if (name[1] == 'o' &&
  +              name[2] == 'n' &&
  +              name[3] == 'n' &&
  +              name[4] == 'e' &&
  +              name[5] == 'c' &&
  +              name[6] == 't')
  +          {                                       /* connect    */
  +            return -KEY_connect;
  +          }
  +
  +          goto unknown;
  +
  +        case 'd':
  +          switch (name[1])
  +          {
  +            case 'b':
  +              if (name[2] == 'm' &&
  +                  name[3] == 'o' &&
  +                  name[4] == 'p' &&
  +                  name[5] == 'e' &&
  +                  name[6] == 'n')
  +              {                                   /* dbmopen    */
  +                return -KEY_dbmopen;
  +              }
  +
  +              goto unknown;
  +
  +            case 'e':
  +              if (name[2] == 'f' &&
  +                  name[3] == 'i' &&
  +                  name[4] == 'n' &&
  +                  name[5] == 'e' &&
  +                  name[6] == 'd')
  +              {                                   /* defined    */
  +                return KEY_defined;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'f':
  +          if (name[1] == 'o' &&
  +              name[2] == 'r' &&
  +              name[3] == 'e' &&
  +              name[4] == 'a' &&
  +              name[5] == 'c' &&
  +              name[6] == 'h')
  +          {                                       /* foreach    */
  +            return KEY_foreach;
  +          }
  +
  +          goto unknown;
  +
  +        case 'g':
  +          if (name[1] == 'e' &&
  +              name[2] == 't' &&
  +              name[3] == 'p')
  +          {
  +            switch (name[4])
  +            {
  +              case 'g':
  +                if (name[5] == 'r' &&
  +                    name[6] == 'p')
  +                {                                 /* getpgrp    */
  +                  return -KEY_getpgrp;
  +                }
  +
  +                goto unknown;
  +
  +              case 'p':
  +                if (name[5] == 'i' &&
  +                    name[6] == 'd')
  +                {                                 /* getppid    */
  +                  return -KEY_getppid;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 'l':
  +          if (name[1] == 'c' &&
  +              name[2] == 'f' &&
  +              name[3] == 'i' &&
  +              name[4] == 'r' &&
  +              name[5] == 's' &&
  +              name[6] == 't')
  +          {                                       /* lcfirst    */
  +            return -KEY_lcfirst;
  +          }
  +
  +          goto unknown;
  +
  +        case 'o':
  +          if (name[1] == 'p' &&
  +              name[2] == 'e' &&
  +              name[3] == 'n' &&
  +              name[4] == 'd' &&
  +              name[5] == 'i' &&
  +              name[6] == 'r')
  +          {                                       /* opendir    */
  +            return -KEY_opendir;
  +          }
  +
  +          goto unknown;
  +
  +        case 'p':
  +          if (name[1] == 'a' &&
  +              name[2] == 'c' &&
  +              name[3] == 'k' &&
  +              name[4] == 'a' &&
  +              name[5] == 'g' &&
  +              name[6] == 'e')
  +          {                                       /* package    */
  +            return KEY_package;
  +          }
  +
  +          goto unknown;
  +
  +        case 'r':
  +          if (name[1] == 'e')
  +          {
  +            switch (name[2])
  +            {
  +              case 'a':
  +                if (name[3] == 'd' &&
  +                    name[4] == 'd' &&
  +                    name[5] == 'i' &&
  +                    name[6] == 'r')
  +                {                                 /* readdir    */
  +                  return -KEY_readdir;
  +                }
  +
  +                goto unknown;
  +
  +              case 'q':
  +                if (name[3] == 'u' &&
  +                    name[4] == 'i' &&
  +                    name[5] == 'r' &&
  +                    name[6] == 'e')
  +                {                                 /* require    */
  +                  return KEY_require;
  +                }
  +
  +                goto unknown;
  +
  +              case 'v':
  +                if (name[3] == 'e' &&
  +                    name[4] == 'r' &&
  +                    name[5] == 's' &&
  +                    name[6] == 'e')
  +                {                                 /* reverse    */
  +                  return -KEY_reverse;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 's':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              switch (name[2])
  +              {
  +                case 'e':
  +                  if (name[3] == 'k' &&
  +                      name[4] == 'd' &&
  +                      name[5] == 'i' &&
  +                      name[6] == 'r')
  +                  {                               /* seekdir    */
  +                    return -KEY_seekdir;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 't':
  +                  if (name[3] == 'p' &&
  +                      name[4] == 'g' &&
  +                      name[5] == 'r' &&
  +                      name[6] == 'p')
  +                  {                               /* setpgrp    */
  +                    return -KEY_setpgrp;
  +                  }
  +
  +                  goto unknown;
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            case 'h':
  +              if (name[2] == 'm' &&
  +                  name[3] == 'r' &&
  +                  name[4] == 'e' &&
  +                  name[5] == 'a' &&
  +                  name[6] == 'd')
  +              {                                   /* shmread    */
  +                return -KEY_shmread;
  +              }
  +
  +              goto unknown;
  +
  +            case 'p':
  +              if (name[2] == 'r' &&
  +                  name[3] == 'i' &&
  +                  name[4] == 'n' &&
  +                  name[5] == 't' &&
  +                  name[6] == 'f')
  +              {                                   /* sprintf    */
  +                return -KEY_sprintf;
  +              }
  +
  +              goto unknown;
  +
  +            case 'y':
  +              switch (name[2])
  +              {
  +                case 'm':
  +                  if (name[3] == 'l' &&
  +                      name[4] == 'i' &&
  +                      name[5] == 'n' &&
  +                      name[6] == 'k')
  +                  {                               /* symlink    */
  +                    return -KEY_symlink;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 's':
  +                  switch (name[3])
  +                  {
  +                    case 'c':
  +                      if (name[4] == 'a' &&
  +                          name[5] == 'l' &&
  +                          name[6] == 'l')
  +                      {                           /* syscall    */
  +                        return -KEY_syscall;
  +                      }
  +
  +                      goto unknown;
  +
  +                    case 'o':
  +                      if (name[4] == 'p' &&
  +                          name[5] == 'e' &&
  +                          name[6] == 'n')
  +                      {                           /* sysopen    */
  +                        return -KEY_sysopen;
  +                      }
  +
  +                      goto unknown;
  +
  +                    case 'r':
  +                      if (name[4] == 'e' &&
  +                          name[5] == 'a' &&
  +                          name[6] == 'd')
  +                      {                           /* sysread    */
  +                        return -KEY_sysread;
  +                      }
  +
  +                      goto unknown;
  +
  +                    case 's':
  +                      if (name[4] == 'e' &&
  +                          name[5] == 'e' &&
  +                          name[6] == 'k')
  +                      {                           /* sysseek    */
  +                        return -KEY_sysseek;
  +                      }
  +
  +                      goto unknown;
  +
  +                    default:
  +                      goto unknown;
  +                  }
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 't':
  +          if (name[1] == 'e' &&
  +              name[2] == 'l' &&
  +              name[3] == 'l' &&
  +              name[4] == 'd' &&
  +              name[5] == 'i' &&
  +              name[6] == 'r')
  +          {                                       /* telldir    */
  +            return -KEY_telldir;
  +          }
  +
  +          goto unknown;
  +
  +        case 'u':
  +          switch (name[1])
  +          {
  +            case 'c':
  +              if (name[2] == 'f' &&
  +                  name[3] == 'i' &&
  +                  name[4] == 'r' &&
  +                  name[5] == 's' &&
  +                  name[6] == 't')
  +              {                                   /* ucfirst    */
  +                return -KEY_ucfirst;
  +              }
  +
  +              goto unknown;
  +
  +            case 'n':
  +              if (name[2] == 's' &&
  +                  name[3] == 'h' &&
  +                  name[4] == 'i' &&
  +                  name[5] == 'f' &&
  +                  name[6] == 't')
  +              {                                   /* unshift    */
  +                return -KEY_unshift;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'w':
  +          if (name[1] == 'a' &&
  +              name[2] == 'i' &&
  +              name[3] == 't' &&
  +              name[4] == 'p' &&
  +              name[5] == 'i' &&
  +              name[6] == 'd')
  +          {                                       /* waitpid    */
  +            return -KEY_waitpid;
  +          }
  +
  +          goto unknown;
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 8: /* 26 tokens of length 8 */
  +      switch (name[0])
  +      {
  +        case 'A':
  +          if (name[1] == 'U' &&
  +              name[2] == 'T' &&
  +              name[3] == 'O' &&
  +              name[4] == 'L' &&
  +              name[5] == 'O' &&
  +              name[6] == 'A' &&
  +              name[7] == 'D')
  +          {                                       /* AUTOLOAD   */
  +            return KEY_AUTOLOAD;
  +          }
  +
  +          goto unknown;
  +
  +        case '_':
  +          if (name[1] == '_')
  +          {
  +            switch (name[2])
  +            {
  +              case 'D':
  +                if (name[3] == 'A' &&
  +                    name[4] == 'T' &&
  +                    name[5] == 'A' &&
  +                    name[6] == '_' &&
  +                    name[7] == '_')
  +                {                                 /* __DATA__   */
  +                  return KEY___DATA__;
  +                }
  +
  +                goto unknown;
  +
  +              case 'F':
  +                if (name[3] == 'I' &&
  +                    name[4] == 'L' &&
  +                    name[5] == 'E' &&
  +                    name[6] == '_' &&
  +                    name[7] == '_')
  +                {                                 /* __FILE__   */
  +                  return -KEY___FILE__;
  +                }
  +
  +                goto unknown;
  +
  +              case 'L':
  +                if (name[3] == 'I' &&
  +                    name[4] == 'N' &&
  +                    name[5] == 'E' &&
  +                    name[6] == '_' &&
  +                    name[7] == '_')
  +                {                                 /* __LINE__   */
  +                  return -KEY___LINE__;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 'c':
  +          switch (name[1])
  +          {
  +            case 'l':
  +              if (name[2] == 'o' &&
  +                  name[3] == 's' &&
  +                  name[4] == 'e' &&
  +                  name[5] == 'd' &&
  +                  name[6] == 'i' &&
  +                  name[7] == 'r')
  +              {                                   /* closedir   */
  +                return -KEY_closedir;
  +              }
  +
  +              goto unknown;
  +
  +            case 'o':
  +              if (name[2] == 'n' &&
  +                  name[3] == 't' &&
  +                  name[4] == 'i' &&
  +                  name[5] == 'n' &&
  +                  name[6] == 'u' &&
  +                  name[7] == 'e')
  +              {                                   /* continue   */
  +                return -KEY_continue;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 'd':
  +          if (name[1] == 'b' &&
  +              name[2] == 'm' &&
  +              name[3] == 'c' &&
  +              name[4] == 'l' &&
  +              name[5] == 'o' &&
  +              name[6] == 's' &&
  +              name[7] == 'e')
  +          {                                       /* dbmclose   */
  +            return -KEY_dbmclose;
  +          }
  +
  +          goto unknown;
  +
  +        case 'e':
  +          if (name[1] == 'n' &&
  +              name[2] == 'd')
  +          {
  +            switch (name[3])
  +            {
  +              case 'g':
  +                if (name[4] == 'r' &&
  +                    name[5] == 'e' &&
  +                    name[6] == 'n' &&
  +                    name[7] == 't')
  +                {                                 /* endgrent   */
  +                  return -KEY_endgrent;
  +                }
  +
  +                goto unknown;
  +
  +              case 'p':
  +                if (name[4] == 'w' &&
  +                    name[5] == 'e' &&
  +                    name[6] == 'n' &&
  +                    name[7] == 't')
  +                {                                 /* endpwent   */
  +                  return -KEY_endpwent;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 'f':
  +          if (name[1] == 'o' &&
  +              name[2] == 'r' &&
  +              name[3] == 'm' &&
  +              name[4] == 'l' &&
  +              name[5] == 'i' &&
  +              name[6] == 'n' &&
  +              name[7] == 'e')
  +          {                                       /* formline   */
  +            return -KEY_formline;
  +          }
  +
  +          goto unknown;
  +
  +        case 'g':
  +          if (name[1] == 'e' &&
  +              name[2] == 't')
  +          {
  +            switch (name[3])
  +            {
  +              case 'g':
  +                if (name[4] == 'r')
  +                {
  +                  switch (name[5])
  +                  {
  +                    case 'e':
  +                      if (name[6] == 'n' &&
  +                          name[7] == 't')
  +                      {                           /* getgrent   */
  +                        return -KEY_getgrent;
  +                      }
  +
  +                      goto unknown;
  +
  +                    case 'g':
  +                      if (name[6] == 'i' &&
  +                          name[7] == 'd')
  +                      {                           /* getgrgid   */
  +                        return -KEY_getgrgid;
  +                      }
  +
  +                      goto unknown;
  +
  +                    case 'n':
  +                      if (name[6] == 'a' &&
  +                          name[7] == 'm')
  +                      {                           /* getgrnam   */
  +                        return -KEY_getgrnam;
  +                      }
  +
  +                      goto unknown;
  +
  +                    default:
  +                      goto unknown;
  +                  }
  +                }
  +
  +                goto unknown;
  +
  +              case 'l':
  +                if (name[4] == 'o' &&
  +                    name[5] == 'g' &&
  +                    name[6] == 'i' &&
  +                    name[7] == 'n')
  +                {                                 /* getlogin   */
  +                  return -KEY_getlogin;
  +                }
  +
  +                goto unknown;
  +
  +              case 'p':
  +                if (name[4] == 'w')
  +                {
  +                  switch (name[5])
  +                  {
  +                    case 'e':
  +                      if (name[6] == 'n' &&
  +                          name[7] == 't')
  +                      {                           /* getpwent   */
  +                        return -KEY_getpwent;
  +                      }
  +
  +                      goto unknown;
  +
  +                    case 'n':
  +                      if (name[6] == 'a' &&
  +                          name[7] == 'm')
  +                      {                           /* getpwnam   */
  +                        return -KEY_getpwnam;
  +                      }
  +
  +                      goto unknown;
  +
  +                    case 'u':
  +                      if (name[6] == 'i' &&
  +                          name[7] == 'd')
  +                      {                           /* getpwuid   */
  +                        return -KEY_getpwuid;
  +                      }
  +
  +                      goto unknown;
  +
  +                    default:
  +                      goto unknown;
  +                  }
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 'r':
  +          if (name[1] == 'e' &&
  +              name[2] == 'a' &&
  +              name[3] == 'd')
  +          {
  +            switch (name[4])
  +            {
  +              case 'l':
  +                if (name[5] == 'i' &&
  +                    name[6] == 'n')
  +                {
  +                  switch (name[7])
  +                  {
  +                    case 'e':
  +                      {                           /* readline   */
  +                        return -KEY_readline;
  +                      }
  +
  +                    case 'k':
  +                      {                           /* readlink   */
  +                        return -KEY_readlink;
  +                      }
  +
  +                    default:
  +                      goto unknown;
  +                  }
  +                }
  +
  +                goto unknown;
  +
  +              case 'p':
  +                if (name[5] == 'i' &&
  +                    name[6] == 'p' &&
  +                    name[7] == 'e')
  +                {                                 /* readpipe   */
  +                  return -KEY_readpipe;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 's':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              if (name[2] == 't')
  +              {
  +                switch (name[3])
  +                {
  +                  case 'g':
  +                    if (name[4] == 'r' &&
  +                        name[5] == 'e' &&
  +                        name[6] == 'n' &&
  +                        name[7] == 't')
  +                    {                             /* setgrent   */
  +                      return -KEY_setgrent;
  +                    }
  +
  +                    goto unknown;
  +
  +                  case 'p':
  +                    if (name[4] == 'w' &&
  +                        name[5] == 'e' &&
  +                        name[6] == 'n' &&
  +                        name[7] == 't')
  +                    {                             /* setpwent   */
  +                      return -KEY_setpwent;
  +                    }
  +
  +                    goto unknown;
  +
  +                  default:
  +                    goto unknown;
  +                }
  +              }
  +
  +              goto unknown;
  +
  +            case 'h':
  +              switch (name[2])
  +              {
  +                case 'm':
  +                  if (name[3] == 'w' &&
  +                      name[4] == 'r' &&
  +                      name[5] == 'i' &&
  +                      name[6] == 't' &&
  +                      name[7] == 'e')
  +                  {                               /* shmwrite   */
  +                    return -KEY_shmwrite;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'u':
  +                  if (name[3] == 't' &&
  +                      name[4] == 'd' &&
  +                      name[5] == 'o' &&
  +                      name[6] == 'w' &&
  +                      name[7] == 'n')
  +                  {                               /* shutdown   */
  +                    return -KEY_shutdown;
  +                  }
  +
  +                  goto unknown;
  +
  +                default:
  +                  goto unknown;
  +              }
  +
  +            case 'y':
  +              if (name[2] == 's' &&
  +                  name[3] == 'w' &&
  +                  name[4] == 'r' &&
  +                  name[5] == 'i' &&
  +                  name[6] == 't' &&
  +                  name[7] == 'e')
  +              {                                   /* syswrite   */
  +                return -KEY_syswrite;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        case 't':
  +          if (name[1] == 'r' &&
  +              name[2] == 'u' &&
  +              name[3] == 'n' &&
  +              name[4] == 'c' &&
  +              name[5] == 'a' &&
  +              name[6] == 't' &&
  +              name[7] == 'e')
  +          {                                       /* truncate   */
  +            return -KEY_truncate;
  +          }
  +
  +          goto unknown;
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 9: /* 8 tokens of length 9 */
  +      switch (name[0])
  +      {
  +        case 'e':
  +          if (name[1] == 'n' &&
  +              name[2] == 'd' &&
  +              name[3] == 'n' &&
  +              name[4] == 'e' &&
  +              name[5] == 't' &&
  +              name[6] == 'e' &&
  +              name[7] == 'n' &&
  +              name[8] == 't')
  +          {                                       /* endnetent  */
  +            return -KEY_endnetent;
  +          }
  +
  +          goto unknown;
  +
  +        case 'g':
  +          if (name[1] == 'e' &&
  +              name[2] == 't' &&
  +              name[3] == 'n' &&
  +              name[4] == 'e' &&
  +              name[5] == 't' &&
  +              name[6] == 'e' &&
  +              name[7] == 'n' &&
  +              name[8] == 't')
  +          {                                       /* getnetent  */
  +            return -KEY_getnetent;
  +          }
  +
  +          goto unknown;
  +
  +        case 'l':
  +          if (name[1] == 'o' &&
  +              name[2] == 'c' &&
  +              name[3] == 'a' &&
  +              name[4] == 'l' &&
  +              name[5] == 't' &&
  +              name[6] == 'i' &&
  +              name[7] == 'm' &&
  +              name[8] == 'e')
  +          {                                       /* localtime  */
  +            return -KEY_localtime;
  +          }
  +
  +          goto unknown;
  +
  +        case 'p':
  +          if (name[1] == 'r' &&
  +              name[2] == 'o' &&
  +              name[3] == 't' &&
  +              name[4] == 'o' &&
  +              name[5] == 't' &&
  +              name[6] == 'y' &&
  +              name[7] == 'p' &&
  +              name[8] == 'e')
  +          {                                       /* prototype  */
  +            return KEY_prototype;
  +          }
  +
  +          goto unknown;
  +
  +        case 'q':
  +          if (name[1] == 'u' &&
  +              name[2] == 'o' &&
  +              name[3] == 't' &&
  +              name[4] == 'e' &&
  +              name[5] == 'm' &&
  +              name[6] == 'e' &&
  +              name[7] == 't' &&
  +              name[8] == 'a')
  +          {                                       /* quotemeta  */
  +            return -KEY_quotemeta;
  +          }
  +
  +          goto unknown;
  +
  +        case 'r':
  +          if (name[1] == 'e' &&
  +              name[2] == 'w' &&
  +              name[3] == 'i' &&
  +              name[4] == 'n' &&
  +              name[5] == 'd' &&
  +              name[6] == 'd' &&
  +              name[7] == 'i' &&
  +              name[8] == 'r')
  +          {                                       /* rewinddir  */
  +            return -KEY_rewinddir;
  +          }
  +
  +          goto unknown;
  +
  +        case 's':
  +          if (name[1] == 'e' &&
  +              name[2] == 't' &&
  +              name[3] == 'n' &&
  +              name[4] == 'e' &&
  +              name[5] == 't' &&
  +              name[6] == 'e' &&
  +              name[7] == 'n' &&
  +              name[8] == 't')
  +          {                                       /* setnetent  */
  +            return -KEY_setnetent;
  +          }
  +
  +          goto unknown;
  +
  +        case 'w':
  +          if (name[1] == 'a' &&
  +              name[2] == 'n' &&
  +              name[3] == 't' &&
  +              name[4] == 'a' &&
  +              name[5] == 'r' &&
  +              name[6] == 'r' &&
  +              name[7] == 'a' &&
  +              name[8] == 'y')
  +          {                                       /* wantarray  */
  +            return -KEY_wantarray;
  +          }
  +
  +          goto unknown;
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 10: /* 9 tokens of length 10 */
  +      switch (name[0])
  +      {
  +        case 'e':
  +          if (name[1] == 'n' &&
  +              name[2] == 'd')
  +          {
  +            switch (name[3])
  +            {
  +              case 'h':
  +                if (name[4] == 'o' &&
  +                    name[5] == 's' &&
  +                    name[6] == 't' &&
  +                    name[7] == 'e' &&
  +                    name[8] == 'n' &&
  +                    name[9] == 't')
  +                {                                 /* endhostent */
  +                  return -KEY_endhostent;
  +                }
  +
  +                goto unknown;
  +
  +              case 's':
  +                if (name[4] == 'e' &&
  +                    name[5] == 'r' &&
  +                    name[6] == 'v' &&
  +                    name[7] == 'e' &&
  +                    name[8] == 'n' &&
  +                    name[9] == 't')
  +                {                                 /* endservent */
  +                  return -KEY_endservent;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 'g':
  +          if (name[1] == 'e' &&
  +              name[2] == 't')
  +          {
  +            switch (name[3])
  +            {
  +              case 'h':
  +                if (name[4] == 'o' &&
  +                    name[5] == 's' &&
  +                    name[6] == 't' &&
  +                    name[7] == 'e' &&
  +                    name[8] == 'n' &&
  +                    name[9] == 't')
  +                {                                 /* gethostent */
  +                  return -KEY_gethostent;
  +                }
  +
  +                goto unknown;
  +
  +              case 's':
  +                switch (name[4])
  +                {
  +                  case 'e':
  +                    if (name[5] == 'r' &&
  +                        name[6] == 'v' &&
  +                        name[7] == 'e' &&
  +                        name[8] == 'n' &&
  +                        name[9] == 't')
  +                    {                             /* getservent */
  +                      return -KEY_getservent;
  +                    }
  +
  +                    goto unknown;
  +
  +                  case 'o':
  +                    if (name[5] == 'c' &&
  +                        name[6] == 'k' &&
  +                        name[7] == 'o' &&
  +                        name[8] == 'p' &&
  +                        name[9] == 't')
  +                    {                             /* getsockopt */
  +                      return -KEY_getsockopt;
  +                    }
  +
  +                    goto unknown;
  +
  +                  default:
  +                    goto unknown;
  +                }
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 's':
  +          switch (name[1])
  +          {
  +            case 'e':
  +              if (name[2] == 't')
  +              {
  +                switch (name[3])
  +                {
  +                  case 'h':
  +                    if (name[4] == 'o' &&
  +                        name[5] == 's' &&
  +                        name[6] == 't' &&
  +                        name[7] == 'e' &&
  +                        name[8] == 'n' &&
  +                        name[9] == 't')
  +                    {                             /* sethostent */
  +                      return -KEY_sethostent;
  +                    }
  +
  +                    goto unknown;
  +
  +                  case 's':
  +                    switch (name[4])
  +                    {
  +                      case 'e':
  +                        if (name[5] == 'r' &&
  +                            name[6] == 'v' &&
  +                            name[7] == 'e' &&
  +                            name[8] == 'n' &&
  +                            name[9] == 't')
  +                        {                         /* setservent */
  +                          return -KEY_setservent;
  +                        }
  +
  +                        goto unknown;
  +
  +                      case 'o':
  +                        if (name[5] == 'c' &&
  +                            name[6] == 'k' &&
  +                            name[7] == 'o' &&
  +                            name[8] == 'p' &&
  +                            name[9] == 't')
  +                        {                         /* setsockopt */
  +                          return -KEY_setsockopt;
  +                        }
  +
  +                        goto unknown;
  +
  +                      default:
  +                        goto unknown;
  +                    }
  +
  +                  default:
  +                    goto unknown;
  +                }
  +              }
  +
  +              goto unknown;
  +
  +            case 'o':
  +              if (name[2] == 'c' &&
  +                  name[3] == 'k' &&
  +                  name[4] == 'e' &&
  +                  name[5] == 't' &&
  +                  name[6] == 'p' &&
  +                  name[7] == 'a' &&
  +                  name[8] == 'i' &&
  +                  name[9] == 'r')
  +              {                                   /* socketpair */
  +                return -KEY_socketpair;
  +              }
  +
  +              goto unknown;
  +
  +            default:
  +              goto unknown;
  +          }
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 11: /* 8 tokens of length 11 */
  +      switch (name[0])
  +      {
  +        case '_':
  +          if (name[1] == '_' &&
  +              name[2] == 'P' &&
  +              name[3] == 'A' &&
  +              name[4] == 'C' &&
  +              name[5] == 'K' &&
  +              name[6] == 'A' &&
  +              name[7] == 'G' &&
  +              name[8] == 'E' &&
  +              name[9] == '_' &&
  +              name[10] == '_')
  +          {                                       /* __PACKAGE__ */
  +            return -KEY___PACKAGE__;
  +          }
  +
  +          goto unknown;
  +
  +        case 'e':
  +          if (name[1] == 'n' &&
  +              name[2] == 'd' &&
  +              name[3] == 'p' &&
  +              name[4] == 'r' &&
  +              name[5] == 'o' &&
  +              name[6] == 't' &&
  +              name[7] == 'o' &&
  +              name[8] == 'e' &&
  +              name[9] == 'n' &&
  +              name[10] == 't')
  +          {                                       /* endprotoent */
  +            return -KEY_endprotoent;
  +          }
  +
  +          goto unknown;
  +
  +        case 'g':
  +          if (name[1] == 'e' &&
  +              name[2] == 't')
  +          {
  +            switch (name[3])
  +            {
  +              case 'p':
  +                switch (name[4])
  +                {
  +                  case 'e':
  +                    if (name[5] == 'e' &&
  +                        name[6] == 'r' &&
  +                        name[7] == 'n' &&
  +                        name[8] == 'a' &&
  +                        name[9] == 'm' &&
  +                        name[10] == 'e')
  +                    {                             /* getpeername */
  +                      return -KEY_getpeername;
  +                    }
  +
  +                    goto unknown;
  +
  +                  case 'r':
  +                    switch (name[5])
  +                    {
  +                      case 'i':
  +                        if (name[6] == 'o' &&
  +                            name[7] == 'r' &&
  +                            name[8] == 'i' &&
  +                            name[9] == 't' &&
  +                            name[10] == 'y')
  +                        {                         /* getpriority */
  +                          return -KEY_getpriority;
  +                        }
  +
  +                        goto unknown;
  +
  +                      case 'o':
  +                        if (name[6] == 't' &&
  +                            name[7] == 'o' &&
  +                            name[8] == 'e' &&
  +                            name[9] == 'n' &&
  +                            name[10] == 't')
  +                        {                         /* getprotoent */
  +                          return -KEY_getprotoent;
  +                        }
  +
  +                        goto unknown;
  +
  +                      default:
  +                        goto unknown;
  +                    }
  +
  +                  default:
  +                    goto unknown;
  +                }
  +
  +              case 's':
  +                if (name[4] == 'o' &&
  +                    name[5] == 'c' &&
  +                    name[6] == 'k' &&
  +                    name[7] == 'n' &&
  +                    name[8] == 'a' &&
  +                    name[9] == 'm' &&
  +                    name[10] == 'e')
  +                {                                 /* getsockname */
  +                  return -KEY_getsockname;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        case 's':
  +          if (name[1] == 'e' &&
  +              name[2] == 't' &&
  +              name[3] == 'p' &&
  +              name[4] == 'r')
  +          {
  +            switch (name[5])
  +            {
  +              case 'i':
  +                if (name[6] == 'o' &&
  +                    name[7] == 'r' &&
  +                    name[8] == 'i' &&
  +                    name[9] == 't' &&
  +                    name[10] == 'y')
  +                {                                 /* setpriority */
  +                  return -KEY_setpriority;
  +                }
  +
  +                goto unknown;
  +
  +              case 'o':
  +                if (name[6] == 't' &&
  +                    name[7] == 'o' &&
  +                    name[8] == 'e' &&
  +                    name[9] == 'n' &&
  +                    name[10] == 't')
  +                {                                 /* setprotoent */
  +                  return -KEY_setprotoent;
  +                }
  +
  +                goto unknown;
  +
  +              default:
  +                goto unknown;
  +            }
  +          }
  +
  +          goto unknown;
  +
  +        default:
  +          goto unknown;
  +      }
  +
  +    case 12: /* 2 tokens of length 12 */
  +      if (name[0] == 'g' &&
  +          name[1] == 'e' &&
  +          name[2] == 't' &&
  +          name[3] == 'n' &&
  +          name[4] == 'e' &&
  +          name[5] == 't' &&
  +          name[6] == 'b' &&
  +          name[7] == 'y')
  +      {
  +        switch (name[8])
  +        {
  +          case 'a':
  +            if (name[9] == 'd' &&
  +                name[10] == 'd' &&
  +                name[11] == 'r')
  +            {                                     /* getnetbyaddr */
  +              return -KEY_getnetbyaddr;
  +            }
  +
  +            goto unknown;
  +
  +          case 'n':
  +            if (name[9] == 'a' &&
  +                name[10] == 'm' &&
  +                name[11] == 'e')
  +            {                                     /* getnetbyname */
  +              return -KEY_getnetbyname;
  +            }
  +
  +            goto unknown;
  +
  +          default:
  +            goto unknown;
  +        }
  +      }
  +
  +      goto unknown;
  +
  +    case 13: /* 4 tokens of length 13 */
  +      if (name[0] == 'g' &&
  +          name[1] == 'e' &&
  +          name[2] == 't')
  +      {
  +        switch (name[3])
  +        {
  +          case 'h':
  +            if (name[4] == 'o' &&
  +                name[5] == 's' &&
  +                name[6] == 't' &&
  +                name[7] == 'b' &&
  +                name[8] == 'y')
  +            {
  +              switch (name[9])
  +              {
  +                case 'a':
  +                  if (name[10] == 'd' &&
  +                      name[11] == 'd' &&
  +                      name[12] == 'r')
  +                  {                               /* gethostbyaddr */
  +                    return -KEY_gethostbyaddr;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'n':
  +                  if (name[10] == 'a' &&
  +                      name[11] == 'm' &&
  +                      name[12] == 'e')
  +                  {                               /* gethostbyname */
  +                    return -KEY_gethostbyname;
  +                  }
  +
  +                  goto unknown;
  +
  +                default:
  +                  goto unknown;
  +              }
  +            }
  +
  +            goto unknown;
  +
  +          case 's':
  +            if (name[4] == 'e' &&
  +                name[5] == 'r' &&
  +                name[6] == 'v' &&
  +                name[7] == 'b' &&
  +                name[8] == 'y')
  +            {
  +              switch (name[9])
  +              {
  +                case 'n':
  +                  if (name[10] == 'a' &&
  +                      name[11] == 'm' &&
  +                      name[12] == 'e')
  +                  {                               /* getservbyname */
  +                    return -KEY_getservbyname;
  +                  }
  +
  +                  goto unknown;
  +
  +                case 'p':
  +                  if (name[10] == 'o' &&
  +                      name[11] == 'r' &&
  +                      name[12] == 't')
  +                  {                               /* getservbyport */
  +                    return -KEY_getservbyport;
  +                  }
  +
  +                  goto unknown;
  +
  +                default:
  +                  goto unknown;
  +              }
  +            }
  +
  +            goto unknown;
  +
  +          default:
  +            goto unknown;
  +        }
  +      }
  +
  +      goto unknown;
  +
  +    case 14: /* 1 tokens of length 14 */
  +      if (name[0] == 'g' &&
  +          name[1] == 'e' &&
  +          name[2] == 't' &&
  +          name[3] == 'p' &&
  +          name[4] == 'r' &&
  +          name[5] == 'o' &&
  +          name[6] == 't' &&
  +          name[7] == 'o' &&
  +          name[8] == 'b' &&
  +          name[9] == 'y' &&
  +          name[10] == 'n' &&
  +          name[11] == 'a' &&
  +          name[12] == 'm' &&
  +          name[13] == 'e')
  +      {                                           /* getprotobyname */
  +        return -KEY_getprotobyname;
  +      }
  +
  +      goto unknown;
  +
  +    case 16: /* 1 tokens of length 16 */
  +      if (name[0] == 'g' &&
  +          name[1] == 'e' &&
  +          name[2] == 't' &&
  +          name[3] == 'p' &&
  +          name[4] == 'r' &&
  +          name[5] == 'o' &&
  +          name[6] == 't' &&
  +          name[7] == 'o' &&
  +          name[8] == 'b' &&
  +          name[9] == 'y' &&
  +          name[10] == 'n' &&
  +          name[11] == 'u' &&
  +          name[12] == 'm' &&
  +          name[13] == 'b' &&
  +          name[14] == 'e' &&
  +          name[15] == 'r')
  +      {                                           /* getprotobynumber */
  +        return -KEY_getprotobynumber;
  +      }
  +
  +      goto unknown;
  +
  +    default:
  +      goto unknown;
  +  }
  +
  +unknown:
  +  return 0;
   }
   
   STATIC void
  -S_checkcomma(pTHX_ register char *s, char *name, char *what)
  +S_checkcomma(pTHX_ register char *s, char *name, const char *what)
   {
       char *w;
   
  @@ -6052,7 +8937,7 @@
      and type is used with error messages only. */
   
   STATIC SV *
  -S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
  +S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
   	       const char *type)
   {
       dSP;
  @@ -6147,6 +9032,9 @@
       return res;
   }
   
  +/* Returns a NUL terminated string, with the length of the string written to
  +   *slp
  +   */
   STATIC char *
   S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
   {
  @@ -6240,7 +9128,7 @@
   	return s;
       }
       if (*s == '$' && s[1] &&
  -	(isALNUM_lazy_if(s+1,UTF) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
  +	(isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
       {
   	return s;
       }
  @@ -6382,7 +9270,7 @@
   	    pmflag(&pm->op_pmflags,*s++);
       }
       /* issue a warning if /c is specified,but /g is not */
  -    if (ckWARN(WARN_REGEXP) && 
  +    if (ckWARN(WARN_REGEXP) &&
           (pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
       {
           Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
  @@ -6493,19 +9381,28 @@
       }
   
       complement = del = squash = 0;
  -    while (strchr("cds", *s)) {
  -	if (*s == 'c')
  +    while (1) {
  +	switch (*s) {
  +	case 'c':
   	    complement = OPpTRANS_COMPLEMENT;
  -	else if (*s == 'd')
  +	    break;
  +	case 'd':
   	    del = OPpTRANS_DELETE;
  -	else if (*s == 's')
  +	    break;
  +	case 's':
   	    squash = OPpTRANS_SQUASH;
  +	    break;
  +	default:
  +	    goto no_more;
  +	}
   	s++;
       }
  +  no_more:
   
       New(803, tbl, complement&&!del?258:256, short);
       o = newPVOP(OP_TRANS, 0, (char*)tbl);
  -    o->op_private = del|squash|complement|
  +    o->op_private &= ~OPpTRANS_ALL;
  +    o->op_private |= del|squash|complement|
         (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
         (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
   
  @@ -6522,6 +9419,8 @@
       I32 len;
       SV *tmpstr;
       char term;
  +    const char newline[] = "\n";
  +    const char *found_newline;
       register char *d;
       register char *e;
       char *peek;
  @@ -6533,7 +9432,7 @@
       if (!outer)
   	*d++ = '\n';
       for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
  -    if (*peek && strchr("`'\"",*peek)) {
  +    if (*peek == '`' || *peek == '\'' || *peek =='"') {
   	s = peek;
   	term = *s++;
   	s = delimcpy(d, e, s, PL_bufend, term, &len);
  @@ -6582,22 +9481,24 @@
   	s = olds;
       }
   #endif
  -    d = "\n";
  -    if (outer || !(d=ninstr(s,PL_bufend,d,d+1)))
  -	herewas = newSVpvn(s,PL_bufend-s);
  -    else
  -	s--, herewas = newSVpvn(s,d-s);
  +    if ( outer || !(found_newline = ninstr(s,PL_bufend,newline,newline+1)) ) {
  +        herewas = newSVpvn(s,PL_bufend-s);
  +    }
  +    else {
  +        s--;
  +        herewas = newSVpvn(s,found_newline-s);
  +    }
       s += SvCUR(herewas);
   
       tmpstr = NEWSV(87,79);
       sv_upgrade(tmpstr, SVt_PVIV);
       if (term == '\'') {
   	op_type = OP_CONST;
  -	SvIVX(tmpstr) = -1;
  +	SvIV_set(tmpstr, -1);
       }
       else if (term == '`') {
   	op_type = OP_BACKTICK;
  -	SvIVX(tmpstr) = '\\';
  +	SvIV_set(tmpstr, '\\');
       }
   
       CLINE;
  @@ -6625,7 +9526,7 @@
   	sv_setpvn(tmpstr,d+1,s-d);
   	s += len - 1;
   	sv_catpvn(herewas,s,bufend-s);
  -	(void)strcpy(bufptr,SvPVX(herewas));
  +	Copy(SvPVX(herewas),bufptr,SvCUR(herewas) + 1,char);
   
   	s = olds;
   	goto retval;
  @@ -6683,14 +9584,15 @@
   	    sv_upgrade(sv, SVt_PVMG);
   	    sv_setsv(sv,PL_linestr);
               (void)SvIOK_on(sv);
  -            SvIVX(sv) = 0;
  +            SvIV_set(sv, 0);
   	    av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
   	}
   	if (*s == term && memEQ(s,PL_tokenbuf,len)) {
  -	    s = PL_bufend - 1;
  -	    *s = ' ';
  +	    STRLEN off = PL_bufend - 1 - SvPVX(PL_linestr);
  +	    *(SvPVX(PL_linestr) + off ) = ' ';
   	    sv_catsv(PL_linestr,herewas);
   	    PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
  +	    s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
   	}
   	else {
   	    s = PL_bufend;
  @@ -6795,7 +9697,7 @@
   
   	/* turn <> into <ARGV> */
   	if (!len)
  -	    (void)strcpy(d,"ARGV");
  +	    Copy("ARGV",d,5,char);
   
   	/* Check whether readline() is overriden */
   	if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
  @@ -6930,7 +9832,7 @@
       I32 brackets = 1;			/* bracket nesting level */
       bool has_utf8 = FALSE;		/* is there any utf8 content? */
       I32 termcode;			/* terminating char. code */
  -    U8 termstr[UTF8_MAXLEN];		/* terminating string */
  +    U8 termstr[UTF8_MAXBYTES];		/* terminating string */
       STRLEN termlen;			/* length of terminating string */
       char *last = NULL;			/* last position for nesting bracket */
   
  @@ -6968,7 +9870,7 @@
          assuming.  79 is the SV's initial length.  What a random number. */
       sv = NEWSV(87,79);
       sv_upgrade(sv, SVt_PVIV);
  -    SvIVX(sv) = termcode;
  +    SvIV_set(sv, termcode);
       (void)SvPOK_only(sv);		/* validate pointer */
   
       /* move past delimiter and try to read a complete string */
  @@ -7154,7 +10056,7 @@
   	    sv_upgrade(sv, SVt_PVMG);
   	    sv_setsv(sv,PL_linestr);
               (void)SvIOK_on(sv);
  -            SvIVX(sv) = 0;
  +            SvIV_set(sv, 0);
   	    av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
   	}
   
  @@ -7215,16 +10117,16 @@
   */
   
   char *
  -Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
  +Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
   {
  -    register char *s = start;		/* current position in buffer */
  +    register const char *s = start;	/* current position in buffer */
       register char *d;			/* destination in temp buffer */
       register char *e;			/* end of temp buffer */
       NV nv;				/* number read, as a double */
       SV *sv = Nullsv;			/* place to put the converted number */
       bool floatit;			/* boolean: int or float? */
  -    char *lastub = 0;			/* position of last underbar */
  -    static char number_too_long[] = "Number too long";
  +    const char *lastub = 0;		/* position of last underbar */
  +    static char const number_too_long[] = "Number too long";
   
       /* We use the first character to decide what type of number this is */
   
  @@ -7250,25 +10152,28 @@
   	    UV u = 0;
   	    I32 shift;
   	    bool overflowed = FALSE;
  +	    bool just_zero  = TRUE;	/* just plain 0 or binary number? */
   	    static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
  -	    static char* bases[5] = { "", "binary", "", "octal",
  +	    static char const* bases[5] = { "", "binary", "", "octal",
   				      "hexadecimal" };
  -	    static char* Bases[5] = { "", "Binary", "", "Octal",
  +	    static char const* Bases[5] = { "", "Binary", "", "Octal",
   				      "Hexadecimal" };
  -	    static char *maxima[5] = { "",
  +	    static char const *maxima[5] = { "",
   				       "0b11111111111111111111111111111111",
   				       "",
   				       "037777777777",
   				       "0xffffffff" };
  -	    char *base, *Base, *max;
  +	    const char *base, *Base, *max;
   
   	    /* check for hex */
   	    if (s[1] == 'x') {
   		shift = 4;
   		s += 2;
  +		just_zero = FALSE;
   	    } else if (s[1] == 'b') {
   		shift = 1;
   		s += 2;
  +		just_zero = FALSE;
   	    }
   	    /* check for a decimal in disguise */
   	    else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
  @@ -7340,6 +10245,7 @@
   		    */
   
   		  digit:
  +		    just_zero = FALSE;
   		    if (!overflowed) {
   			x = u << shift;	/* make room for the digit */
   
  @@ -7398,7 +10304,10 @@
   #endif
   		sv_setuv(sv, u);
   	    }
  -	    if (PL_hints & HINT_NEW_BINARY)
  +	    if (just_zero && (PL_hints & HINT_NEW_INTEGER))
  +		sv = new_constant(start, s - start, "integer",
  +				  sv, Nullsv, NULL);
  +	    else if (PL_hints & HINT_NEW_BINARY)
   		sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
   	}
   	break;
  @@ -7484,7 +10393,7 @@
   	}
   
   	/* read exponent part, if present */
  -	if (*s && strchr("eE",*s) && strchr("+-0123456789_", s[1])) {
  +	if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
   	    floatit = TRUE;
   	    s++;
   
  @@ -7584,7 +10493,7 @@
       else
   	lvalp->opval = Nullop;
   
  -    return s;
  +    return (char *)s;
   }
   
   STATIC char *
  @@ -7594,20 +10503,23 @@
       register char *t;
       SV *stuff = newSVpvn("",0);
       bool needargs = FALSE;
  +    bool eofmt = FALSE;
   
       while (!needargs) {
  -	if (*s == '.' || *s == /*{*/'}') {
  +	if (*s == '.') {
   	    /*SUPPRESS 530*/
   #ifdef PERL_STRICT_CR
   	    for (t = s+1;SPACE_OR_TAB(*t); t++) ;
   #else
   	    for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
   #endif
  -	    if (*t == '\n' || t == PL_bufend)
  +	    if (*t == '\n' || t == PL_bufend) {
  +	        eofmt = TRUE;
   		break;
  +            }
   	}
   	if (PL_in_eval && !PL_rsfp) {
  -	    eol = strchr(s,'\n');
  +	    eol = memchr(s,'\n',PL_bufend-s);
   	    if (!eol++)
   		eol = PL_bufend;
   	}
  @@ -7644,7 +10556,6 @@
   	    PL_last_lop = PL_last_uni = Nullch;
   	    if (!s) {
   		s = PL_bufptr;
  -		yyerror("Format not terminated");
   		break;
   	    }
   	}
  @@ -7673,7 +10584,8 @@
       }
       else {
   	SvREFCNT_dec(stuff);
  -	PL_lex_formbrack = 0;
  +	if (eofmt)
  +	    PL_lex_formbrack = 0;
   	PL_bufptr = s;
       }
       return s;
  @@ -7717,7 +10629,7 @@
   #pragma segment Perl_yylex
   #endif
   int
  -Perl_yywarn(pTHX_ char *s)
  +Perl_yywarn(pTHX_ const char *s)
   {
       PL_in_eval |= EVAL_WARNONLY;
       yyerror(s);
  @@ -7726,10 +10638,10 @@
   }
   
   int
  -Perl_yyerror(pTHX_ char *s)
  +Perl_yyerror(pTHX_ const char *s)
   {
  -    char *where = NULL;
  -    char *context = NULL;
  +    const char *where = NULL;
  +    const char *context = NULL;
       int contlen = -1;
       SV *msg;
   
  @@ -7769,12 +10681,7 @@
       }
       else if (yychar > 255)
   	where = "next token ???";
  -#ifdef USE_PURE_BISON
  -/*  GNU Bison sets the value -2 */
  -    else if (yychar == -2) {
  -#else
  -    else if ((yychar & 127) == 127) {
  -#endif
  +    else if (yychar == -2) { /* YYEMPTY */
   	if (PL_lex_state == LEX_NORMAL ||
   	   (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
   	    where = "at end of line";
  @@ -7806,8 +10713,8 @@
                   (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
           PL_multi_end = 0;
       }
  -    if (PL_in_eval & EVAL_WARNONLY)
  -	Perl_warn(aTHX_ "%"SVf, msg);
  +    if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
  +	Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, msg);
       else
   	qerror(msg);
       if (PL_error_count >= 10) {
  @@ -7831,72 +10738,92 @@
   {
       STRLEN slen;
       slen = SvCUR(PL_linestr);
  -    switch (*s) {
  +    switch (s[0]) {
       case 0xFF:
   	if (s[1] == 0xFE) {
  -	    /* UTF-16 little-endian */
  +	    /* UTF-16 little-endian? (or UTF32-LE?) */
   	    if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
  -		Perl_croak(aTHX_ "Unsupported script encoding");
  +		Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
   #ifndef PERL_NO_UTF16_FILTER
  -	    DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-LE script encoding\n"));
  +	    if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
   	    s += 2;
  +	utf16le:
   	    if (PL_bufend > (char*)s) {
   		U8 *news;
   		I32 newlen;
   
   		filter_add(utf16rev_textfilter, NULL);
   		New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
  -		PL_bufend = (char*)utf16_to_utf8_reversed(s, news,
  -						 PL_bufend - (char*)s - 1,
  -						 &newlen);
  -		Copy(news, s, newlen, U8);
  -		SvCUR_set(PL_linestr, newlen);
  -		PL_bufend = SvPVX(PL_linestr) + newlen;
  -		news[newlen++] = '\0';
  +		utf16_to_utf8_reversed(s, news,
  +				       PL_bufend - (char*)s - 1,
  +				       &newlen);
  +		sv_setpvn(PL_linestr, (const char*)news, newlen);
   		Safefree(news);
  +		SvUTF8_on(PL_linestr);
  +		s = (U8*)SvPVX(PL_linestr);
  +		PL_bufend = SvPVX(PL_linestr) + newlen;
   	    }
   #else
  -	    Perl_croak(aTHX_ "Unsupported script encoding");
  +	    Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
   #endif
   	}
   	break;
       case 0xFE:
  -	if (s[1] == 0xFF) {   /* UTF-16 big-endian */
  +	if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
   #ifndef PERL_NO_UTF16_FILTER
  -	    DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding\n"));
  +	    if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
   	    s += 2;
  +	utf16be:
   	    if (PL_bufend > (char *)s) {
   		U8 *news;
   		I32 newlen;
   
   		filter_add(utf16_textfilter, NULL);
   		New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
  -		PL_bufend = (char*)utf16_to_utf8(s, news,
  -						 PL_bufend - (char*)s,
  -						 &newlen);
  -		Copy(news, s, newlen, U8);
  -		SvCUR_set(PL_linestr, newlen);
  -		PL_bufend = SvPVX(PL_linestr) + newlen;
  -		news[newlen++] = '\0';
  +		utf16_to_utf8(s, news,
  +			      PL_bufend - (char*)s,
  +			      &newlen);
  +		sv_setpvn(PL_linestr, (const char*)news, newlen);
   		Safefree(news);
  +		SvUTF8_on(PL_linestr);
  +		s = (U8*)SvPVX(PL_linestr);
  +		PL_bufend = SvPVX(PL_linestr) + newlen;
   	    }
   #else
  -	    Perl_croak(aTHX_ "Unsupported script encoding");
  +	    Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
   #endif
   	}
   	break;
       case 0xEF:
   	if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
  -	    DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-8 script encoding\n"));
  +	    if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
   	    s += 3;                      /* UTF-8 */
   	}
   	break;
       case 0:
  -	if (slen > 3 && s[1] == 0 &&  /* UTF-32 big-endian */
  -	    s[2] == 0xFE && s[3] == 0xFF)
  -	{
  -	    Perl_croak(aTHX_ "Unsupported script encoding");
  +	if (slen > 3) {
  +	     if (s[1] == 0) {
  +		  if (s[2] == 0xFE && s[3] == 0xFF) {
  +		       /* UTF-32 big-endian */
  +		       Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
  +		  }
  +	     }
  +	     else if (s[2] == 0 && s[3] != 0) {
  +		  /* Leading bytes
  +		   * 00 xx 00 xx
  +		   * are a good indicator of UTF-16BE. */
  +		  if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
  +		  goto utf16be;
  +	     }
   	}
  +    default:
  +	 if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
  +		  /* Leading bytes
  +		   * xx 00 xx 00
  +		   * are a good indicator of UTF-16LE. */
  +	      if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
  +	      goto utf16le;
  +	 }
       }
       return (char*)s;
   }
  @@ -7922,38 +10849,42 @@
   static I32
   utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
   {
  +    STRLEN old = SvCUR(sv);
       I32 count = FILTER_READ(idx+1, sv, maxlen);
  +    DEBUG_P(PerlIO_printf(Perl_debug_log,
  +			  "utf16_textfilter(%p): %d %d (%d)\n",
  +			  utf16_textfilter, idx, maxlen, (int) count));
       if (count) {
   	U8* tmps;
  -	U8* tend;
   	I32 newlen;
   	New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
  -	if (!*SvPV_nolen(sv))
  -	/* Game over, but don't feed an odd-length string to utf16_to_utf8 */
  -	return count;
  -
  -	tend = utf16_to_utf8((U8*)SvPVX(sv), tmps, SvCUR(sv), &newlen);
  -	sv_usepvn(sv, (char*)tmps, tend - tmps);
  +	Copy(SvPVX(sv), tmps, old, char);
  +	utf16_to_utf8((U8*)SvPVX(sv) + old, tmps + old,
  +		      SvCUR(sv) - old, &newlen);
  +	sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
       }
  -    return count;
  +    DEBUG_P({sv_dump(sv);});
  +    return SvCUR(sv);
   }
   
   static I32
   utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
   {
  +    STRLEN old = SvCUR(sv);
       I32 count = FILTER_READ(idx+1, sv, maxlen);
  +    DEBUG_P(PerlIO_printf(Perl_debug_log,
  +			  "utf16rev_textfilter(%p): %d %d (%d)\n",
  +			  utf16rev_textfilter, idx, maxlen, (int) count));
       if (count) {
   	U8* tmps;
  -	U8* tend;
   	I32 newlen;
  -	if (!*SvPV_nolen(sv))
  -	/* Game over, but don't feed an odd-length string to utf16_to_utf8 */
  -	return count;
  -
   	New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
  -	tend = utf16_to_utf8_reversed((U8*)SvPVX(sv), tmps, SvCUR(sv), &newlen);
  -	sv_usepvn(sv, (char*)tmps, tend - tmps);
  +	Copy(SvPVX(sv), tmps, old, char);
  +	utf16_to_utf8((U8*)SvPVX(sv) + old, tmps + old,
  +		      SvCUR(sv) - old, &newlen);
  +	sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
       }
  +    DEBUG_P({ sv_dump(sv); });
       return count;
   }
   #endif
  @@ -7973,28 +10904,28 @@
   */
   
   char *
  -Perl_scan_vstring(pTHX_ char *s, SV *sv)
  +Perl_scan_vstring(pTHX_ const char *s, SV *sv)
   {
  -    char *pos = s;
  -    char *start = s;
  +    const char *pos = s;
  +    const char *start = s;
       if (*pos == 'v') pos++;  /* get past 'v' */
       while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
   	pos++;
       if ( *pos != '.') {
   	/* this may not be a v-string if followed by => */
  -	char *next = pos;
  +	const char *next = pos;
   	while (next < PL_bufend && isSPACE(*next))
   	    ++next;
   	if ((PL_bufend - next) >= 2 && *next == '=' && next[1] == '>' ) {
   	    /* return string not v-string */
   	    sv_setpvn(sv,(char *)s,pos-s);
  -	    return pos;
  +	    return (char *)pos;
   	}
       }
   
       if (!isALPHA(*pos)) {
   	UV rev;
  -	U8 tmpbuf[UTF8_MAXLEN+1];
  +	U8 tmpbuf[UTF8_MAXBYTES+1];
   	U8 *tmpend;
   
   	if (*s == 'v') s++;  /* get past 'v' */
  @@ -8005,7 +10936,7 @@
   	    rev = 0;
   	    {
   		/* this is atoi() that tolerates underscores */
  -		char *end = pos;
  +		const char *end = pos;
   		UV mult = 1;
   		while (--end >= s) {
   		    UV orev;
  @@ -8041,6 +10972,6 @@
   	sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
   	SvRMAGICAL_on(sv);
       }
  -    return s;
  +    return (char *)s;
   }
   
  
  
  
  1.11      +3 -3      ponie/perl/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/util.c,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- util.c	4 Apr 2005 17:46:13 -0000	1.10
  +++ util.c	10 Apr 2005 04:17:49 -0000	1.11
  @@ -2040,7 +2040,7 @@
       sv = *av_fetch(PL_fdpid,p[This],TRUE);
       UNLOCK_FDPID_MUTEX;
       (void)SvUPGRADE(sv,SVt_IV);
  -    SvIVX(sv) = pid;
  +    SvIV_set(sv, pid);
       PL_forkprocess = pid;
       /* If we managed to get status pipe check for exec fail */
       if (did_pipes && pid > 0) {
  @@ -2193,7 +2193,7 @@
       sv = *av_fetch(PL_fdpid,p[This],TRUE);
       UNLOCK_FDPID_MUTEX;
       (void)SvUPGRADE(sv,SVt_IV);
  -    SvIVX(sv) = pid;
  +    SvIV_set(sv, pid);
       PL_forkprocess = pid;
       if (did_pipes && pid > 0) {
   	int errkid;
  @@ -2650,7 +2650,7 @@
       sprintf(spid, "%"IVdf, (IV)pid);
       sv = *hv_fetch(PL_pidstatus,spid,strlen(spid),TRUE);
       (void)SvUPGRADE(sv,SVt_IV);
  -    SvIVX(sv) = status;
  +    SvIV_set(sv, status);
       return;
   }
   
  
  
  
  1.2       +63 -56    ponie/perl/ext/ByteLoader/byterun.c
  
  Index: byterun.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/ext/ByteLoader/byterun.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- byterun.c	9 Sep 2003 11:58:59 -0000	1.1
  +++ byterun.c	10 Apr 2005 04:17:50 -0000	1.2
  @@ -249,7 +249,7 @@
   	    {
   		NV arg;
   		BGET_NV(arg);
  -		SvNVX(bstate->bs_sv) = arg;
  +		SvNV_set(bstate->bs_sv, arg);
   		break;
   	    }
   	  case INSN_XLV_TARGOFF:		/* 27 */
  @@ -749,63 +749,70 @@
   		BSET_op_type(PL_op, arg);
   		break;
   	    }
  -	  case INSN_OP_SEQ:		/* 99 */
  +	  case INSN_OP_OPT:		/* 99 */
   	    {
  -		U16 arg;
  -		BGET_U16(arg);
  -		PL_op->op_seq = arg;
  +		U8 arg;
  +		BGET_U8(arg);
  +		PL_op->op_opt = arg;
  +		break;
  +	    }
  +	  case INSN_OP_STATIC:		/* 100 */
  +	    {
  +		U8 arg;
  +		BGET_U8(arg);
  +		PL_op->op_static = arg;
   		break;
   	    }
  -	  case INSN_OP_FLAGS:		/* 100 */
  +	  case INSN_OP_FLAGS:		/* 101 */
   	    {
   		U8 arg;
   		BGET_U8(arg);
   		PL_op->op_flags = arg;
   		break;
   	    }
  -	  case INSN_OP_PRIVATE:		/* 101 */
  +	  case INSN_OP_PRIVATE:		/* 102 */
   	    {
   		U8 arg;
   		BGET_U8(arg);
   		PL_op->op_private = arg;
   		break;
   	    }
  -	  case INSN_OP_FIRST:		/* 102 */
  +	  case INSN_OP_FIRST:		/* 103 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
   		cUNOP->op_first = arg;
   		break;
   	    }
  -	  case INSN_OP_LAST:		/* 103 */
  +	  case INSN_OP_LAST:		/* 104 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
   		cBINOP->op_last = arg;
   		break;
   	    }
  -	  case INSN_OP_OTHER:		/* 104 */
  +	  case INSN_OP_OTHER:		/* 105 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
   		cLOGOP->op_other = arg;
   		break;
   	    }
  -	  case INSN_OP_PMREPLROOT:		/* 105 */
  +	  case INSN_OP_PMREPLROOT:		/* 106 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
   		cPMOP->op_pmreplroot = arg;
   		break;
   	    }
  -	  case INSN_OP_PMREPLSTART:		/* 106 */
  +	  case INSN_OP_PMREPLSTART:		/* 107 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
   		cPMOP->op_pmreplstart = arg;
   		break;
   	    }
  -	  case INSN_OP_PMNEXT:		/* 107 */
  +	  case INSN_OP_PMNEXT:		/* 108 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
  @@ -813,14 +820,14 @@
   		break;
   	    }
   #ifdef USE_ITHREADS
  -	  case INSN_OP_PMSTASHPV:		/* 108 */
  +	  case INSN_OP_PMSTASHPV:		/* 109 */
   	    {
   		pvindex arg;
   		BGET_pvindex(arg);
   		BSET_op_pmstashpv(cPMOP, arg);
   		break;
   	    }
  -	  case INSN_OP_PMREPLROOTPO:		/* 109 */
  +	  case INSN_OP_PMREPLROOTPO:		/* 110 */
   	    {
   		PADOFFSET arg;
   		BGET_PADOFFSET(arg);
  @@ -828,14 +835,14 @@
   		break;
   	    }
   #else
  -	  case INSN_OP_PMSTASH:		/* 110 */
  +	  case INSN_OP_PMSTASH:		/* 111 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		*(SV**)&cPMOP->op_pmstash = arg;
   		break;
   	    }
  -	  case INSN_OP_PMREPLROOTGV:		/* 111 */
  +	  case INSN_OP_PMREPLROOTGV:		/* 112 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
  @@ -843,84 +850,84 @@
   		break;
   	    }
   #endif
  -	  case INSN_PREGCOMP:		/* 112 */
  +	  case INSN_PREGCOMP:		/* 113 */
   	    {
   		pvcontents arg;
   		BGET_pvcontents(arg);
   		BSET_pregcomp(PL_op, arg);
   		break;
   	    }
  -	  case INSN_OP_PMFLAGS:		/* 113 */
  +	  case INSN_OP_PMFLAGS:		/* 114 */
   	    {
   		U16 arg;
   		BGET_U16(arg);
   		cPMOP->op_pmflags = arg;
   		break;
   	    }
  -	  case INSN_OP_PMPERMFLAGS:		/* 114 */
  +	  case INSN_OP_PMPERMFLAGS:		/* 115 */
   	    {
   		U16 arg;
   		BGET_U16(arg);
   		cPMOP->op_pmpermflags = arg;
   		break;
   	    }
  -	  case INSN_OP_PMDYNFLAGS:		/* 115 */
  +	  case INSN_OP_PMDYNFLAGS:		/* 116 */
   	    {
   		U8 arg;
   		BGET_U8(arg);
   		cPMOP->op_pmdynflags = arg;
   		break;
   	    }
  -	  case INSN_OP_SV:		/* 116 */
  +	  case INSN_OP_SV:		/* 117 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		cSVOP->op_sv = arg;
   		break;
   	    }
  -	  case INSN_OP_PADIX:		/* 117 */
  +	  case INSN_OP_PADIX:		/* 118 */
   	    {
   		PADOFFSET arg;
   		BGET_PADOFFSET(arg);
   		cPADOP->op_padix = arg;
   		break;
   	    }
  -	  case INSN_OP_PV:		/* 118 */
  +	  case INSN_OP_PV:		/* 119 */
   	    {
   		pvcontents arg;
   		BGET_pvcontents(arg);
   		cPVOP->op_pv = arg;
   		break;
   	    }
  -	  case INSN_OP_PV_TR:		/* 119 */
  +	  case INSN_OP_PV_TR:		/* 120 */
   	    {
   		op_tr_array arg;
   		BGET_op_tr_array(arg);
   		cPVOP->op_pv = arg;
   		break;
   	    }
  -	  case INSN_OP_REDOOP:		/* 120 */
  +	  case INSN_OP_REDOOP:		/* 121 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
   		cLOOP->op_redoop = arg;
   		break;
   	    }
  -	  case INSN_OP_NEXTOP:		/* 121 */
  +	  case INSN_OP_NEXTOP:		/* 122 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
   		cLOOP->op_nextop = arg;
   		break;
   	    }
  -	  case INSN_OP_LASTOP:		/* 122 */
  +	  case INSN_OP_LASTOP:		/* 123 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
   		cLOOP->op_lastop = arg;
   		break;
   	    }
  -	  case INSN_COP_LABEL:		/* 123 */
  +	  case INSN_COP_LABEL:		/* 124 */
   	    {
   		pvindex arg;
   		BGET_pvindex(arg);
  @@ -928,14 +935,14 @@
   		break;
   	    }
   #ifdef USE_ITHREADS
  -	  case INSN_COP_STASHPV:		/* 124 */
  +	  case INSN_COP_STASHPV:		/* 125 */
   	    {
   		pvindex arg;
   		BGET_pvindex(arg);
   		BSET_cop_stashpv(cCOP, arg);
   		break;
   	    }
  -	  case INSN_COP_FILE:		/* 125 */
  +	  case INSN_COP_FILE:		/* 126 */
   	    {
   		pvindex arg;
   		BGET_pvindex(arg);
  @@ -943,14 +950,14 @@
   		break;
   	    }
   #else
  -	  case INSN_COP_STASH:		/* 126 */
  +	  case INSN_COP_STASH:		/* 127 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		BSET_cop_stash(cCOP, arg);
   		break;
   	    }
  -	  case INSN_COP_FILEGV:		/* 127 */
  +	  case INSN_COP_FILEGV:		/* 128 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
  @@ -958,119 +965,119 @@
   		break;
   	    }
   #endif
  -	  case INSN_COP_SEQ:		/* 128 */
  +	  case INSN_COP_SEQ:		/* 129 */
   	    {
   		U32 arg;
   		BGET_U32(arg);
   		cCOP->cop_seq = arg;
   		break;
   	    }
  -	  case INSN_COP_ARYBASE:		/* 129 */
  +	  case INSN_COP_ARYBASE:		/* 130 */
   	    {
   		I32 arg;
   		BGET_I32(arg);
   		cCOP->cop_arybase = arg;
   		break;
   	    }
  -	  case INSN_COP_LINE:		/* 130 */
  +	  case INSN_COP_LINE:		/* 131 */
   	    {
   		line_t arg;
   		BGET_U32(arg);
   		cCOP->cop_line = arg;
   		break;
   	    }
  -	  case INSN_COP_IO:		/* 131 */
  +	  case INSN_COP_IO:		/* 132 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		cCOP->cop_io = arg;
   		break;
   	    }
  -	  case INSN_COP_WARNINGS:		/* 132 */
  +	  case INSN_COP_WARNINGS:		/* 133 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		cCOP->cop_warnings = arg;
   		break;
   	    }
  -	  case INSN_MAIN_START:		/* 133 */
  +	  case INSN_MAIN_START:		/* 134 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
   		PL_main_start = arg;
   		break;
   	    }
  -	  case INSN_MAIN_ROOT:		/* 134 */
  +	  case INSN_MAIN_ROOT:		/* 135 */
   	    {
   		opindex arg;
   		BGET_opindex(arg);
   		PL_main_root = arg;
   		break;
   	    }
  -	  case INSN_MAIN_CV:		/* 135 */
  +	  case INSN_MAIN_CV:		/* 136 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		*(SV**)&PL_main_cv = arg;
   		break;
   	    }
  -	  case INSN_CURPAD:		/* 136 */
  +	  case INSN_CURPAD:		/* 137 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		BSET_curpad(PL_curpad, arg);
   		break;
   	    }
  -	  case INSN_PUSH_BEGIN:		/* 137 */
  +	  case INSN_PUSH_BEGIN:		/* 138 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		BSET_push_begin(PL_beginav, arg);
   		break;
   	    }
  -	  case INSN_PUSH_INIT:		/* 138 */
  +	  case INSN_PUSH_INIT:		/* 139 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		BSET_push_init(PL_initav, arg);
   		break;
   	    }
  -	  case INSN_PUSH_END:		/* 139 */
  +	  case INSN_PUSH_END:		/* 140 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		BSET_push_end(PL_endav, arg);
   		break;
   	    }
  -	  case INSN_CURSTASH:		/* 140 */
  +	  case INSN_CURSTASH:		/* 141 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		*(SV**)&PL_curstash = arg;
   		break;
   	    }
  -	  case INSN_DEFSTASH:		/* 141 */
  +	  case INSN_DEFSTASH:		/* 142 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		*(SV**)&PL_defstash = arg;
   		break;
   	    }
  -	  case INSN_DATA:		/* 142 */
  +	  case INSN_DATA:		/* 143 */
   	    {
   		U8 arg;
   		BGET_U8(arg);
   		BSET_data(none, arg);
   		break;
   	    }
  -	  case INSN_INCAV:		/* 143 */
  +	  case INSN_INCAV:		/* 144 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		*(SV**)&GvAV(PL_incgv) = arg;
   		break;
   	    }
  -	  case INSN_LOAD_GLOB:		/* 144 */
  +	  case INSN_LOAD_GLOB:		/* 145 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
  @@ -1078,7 +1085,7 @@
   		break;
   	    }
   #ifdef USE_ITHREADS
  -	  case INSN_REGEX_PADAV:		/* 145 */
  +	  case INSN_REGEX_PADAV:		/* 146 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
  @@ -1086,35 +1093,35 @@
   		break;
   	    }
   #endif
  -	  case INSN_DOWARN:		/* 146 */
  +	  case INSN_DOWARN:		/* 147 */
   	    {
   		U8 arg;
   		BGET_U8(arg);
   		PL_dowarn = arg;
   		break;
   	    }
  -	  case INSN_COMPPAD_NAME:		/* 147 */
  +	  case INSN_COMPPAD_NAME:		/* 148 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		*(SV**)&PL_comppad_name = arg;
   		break;
   	    }
  -	  case INSN_XGV_STASH:		/* 148 */
  +	  case INSN_XGV_STASH:		/* 149 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
   		*(SV**)&GvSTASH(bstate->bs_sv) = arg;
   		break;
   	    }
  -	  case INSN_SIGNAL:		/* 149 */
  +	  case INSN_SIGNAL:		/* 150 */
   	    {
   		strconst arg;
   		BGET_strconst(arg);
   		BSET_signal(bstate->bs_sv, arg);
   		break;
   	    }
  -	  case INSN_FORMFEED:		/* 150 */
  +	  case INSN_FORMFEED:		/* 151 */
   	    {
   		svindex arg;
   		BGET_svindex(arg);
  
  
  
  1.2       +9 -8      ponie/perl/ext/List/Util/Util.xs
  
  Index: Util.xs
  ===================================================================
  RCS file: /cvs/public/ponie/perl/ext/List/Util/Util.xs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Util.xs	9 Sep 2003 11:59:14 -0000	1.1
  +++ Util.xs	10 Apr 2005 04:17:50 -0000	1.2
  @@ -47,9 +47,9 @@
   #endif
   
   #ifdef SVf_IVisUV
  -#  define slu_sv_value(sv) (NV)(SvIOK(sv) ? SvIOK_UV(sv) ? SvUVX(sv) : SvIVX(sv) : SvNV(sv))
  +#  define slu_sv_value(sv) (SvIOK(sv)) ? (SvIOK_UV(sv)) ? (NV)(SvUVX(sv)) : (NV)(SvIVX(sv)) : (SvNV(sv))
   #else
  -#  define slu_sv_value(sv) (NV)(SvIOK(sv) ? SvIVX(sv) : SvNV(sv))
  +#  define slu_sv_value(sv) (SvIOK(sv)) ? (NV)(SvIVX(sv)) : (SvNV(sv))
   #endif
   
   #ifndef Drand01
  @@ -242,8 +242,6 @@
       CATCH_SET(TRUE);
       PUSHBLOCK(cx, CXt_SUB, SP);
       PUSHSUB(cx);
  -    if (!CvDEPTH(cv))
  -        (void)SvREFCNT_inc(cv);
       for(index = 2 ; index < items ; index++) {
   	GvSV(bgv) = ST(index);
   	PL_op = reducecop;
  @@ -252,6 +250,7 @@
       }
       ST(0) = ret;
       POPBLOCK(cx,PL_curpm);
  +    LEAVESUB(cv);
       CATCH_SET(oldcatch);
       XSRETURN(1);
   }
  @@ -292,8 +291,6 @@
       CATCH_SET(TRUE);
       PUSHBLOCK(cx, CXt_SUB, SP);
       PUSHSUB(cx);
  -    if (!CvDEPTH(cv))
  -        (void)SvREFCNT_inc(cv);
   
       for(index = 1 ; index < items ; index++) {
   	GvSV(PL_defgv) = ST(index);
  @@ -302,11 +299,13 @@
   	if (SvTRUE(*PL_stack_sp)) {
   	  ST(0) = ST(index);
   	  POPBLOCK(cx,PL_curpm);
  +	  LEAVESUB(cv);
   	  CATCH_SET(oldcatch);
   	  XSRETURN(1);
   	}
       }
       POPBLOCK(cx,PL_curpm);
  +    LEAVESUB(cv);
       CATCH_SET(oldcatch);
       XSRETURN_UNDEF;
   }
  @@ -354,7 +353,7 @@
       (void)SvUPGRADE(ST(0),SVt_PVNV);
       sv_setpvn(ST(0),ptr,len);
       if(SvNOK(num) || SvPOK(num) || SvMAGICAL(num)) {
  -	SvNVX(ST(0)) = SvNV(num);
  +	SvNV_set(ST(0), SvNV(num));
   	SvNOK_on(ST(0));
       }
   #ifdef SVf_IVisUV
  @@ -365,7 +364,7 @@
       }
   #endif
       else {
  -	SvIVX(ST(0)) = SvIV(num);
  +	SvIV_set(ST(0), SvIV(num));
   	SvIOK_on(ST(0));
       }
       if(PL_tainting && (SvTAINTED(num) || SvTAINTED(str)))
  @@ -411,6 +410,8 @@
   PROTOTYPE: $
   CODE:
   {
  +    if (SvMAGICAL(sv))
  +	mg_get(sv);
       if(!SvROK(sv)) {
   	XSRETURN_UNDEF;
       }
  
  
  
  1.2       +55 -7     ponie/perl/ext/threads/threads.xs
  
  Index: threads.xs
  ===================================================================
  RCS file: /cvs/public/ponie/perl/ext/threads/threads.xs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- threads.xs	9 Sep 2003 11:59:17 -0000	1.1
  +++ threads.xs	10 Apr 2005 04:17:50 -0000	1.2
  @@ -93,6 +93,7 @@
   void
   Perl_ithread_destruct (pTHX_ ithread* thread, const char *why)
   {
  +        PerlInterpreter *freeperl = NULL;
   	MUTEX_LOCK(&thread->mutex);
   	if (!thread->next) {
   	    Perl_croak(aTHX_ "panic: destruct destroyed thread %p (%s)",thread, why);
  @@ -144,12 +145,19 @@
   
   	    thread->params = Nullsv;
   	    perl_destruct(thread->interp);
  -            perl_free(thread->interp);
  +            freeperl = thread->interp;
   	    thread->interp = NULL;
   	}
   	MUTEX_UNLOCK(&thread->mutex);
   	MUTEX_DESTROY(&thread->mutex);
  +#ifdef WIN32
  +	if (thread->handle)
  +	    CloseHandle(thread->handle);
  +	thread->handle = 0;
  +#endif
           PerlMemShared_free(thread);
  +        if (freeperl)
  +            perl_free(freeperl);
   
   	PERL_SET_CONTEXT(aTHX);
   }
  @@ -197,7 +205,7 @@
   ithread_mg_get(pTHX_ SV *sv, MAGIC *mg)
   {
       ithread *thread = (ithread *) mg->mg_ptr;
  -    SvIVX(sv) = PTR2IV(thread);
  +    SvIV_set(sv, PTR2IV(thread));
       SvIOK_on(sv);
       return 0;
   }
  @@ -373,10 +381,20 @@
   
   	SV**            tmps_tmp = PL_tmps_stack;
   	I32             tmps_ix  = PL_tmps_ix;
  +#ifndef WIN32
  +	int		failure;
  +	const char*	panic = NULL;
  +#endif
   
   
   	MUTEX_LOCK(&create_destruct_mutex);
   	thread = PerlMemShared_malloc(sizeof(ithread));
  +	if (!thread) {	
  +	    MUTEX_UNLOCK(&create_destruct_mutex);
  +	    PerlLIO_write(PerlIO_fileno(Perl_error_log),
  +			  PL_no_mem, strlen(PL_no_mem));
  +	    my_exit(1);
  +	}
   	Zero(thread,1,ithread);
   	thread->next = threads;
   	thread->prev = threads->prev;
  @@ -472,10 +490,8 @@
   	/* Start the thread */
   
   #ifdef WIN32
  -
   	thread->handle = CreateThread(NULL, 0, Perl_ithread_run,
   			(LPVOID)thread, 0, &thread->thr);
  -
   #else
   	{
   	  static pthread_attr_t attr;
  @@ -490,20 +506,40 @@
   #  endif
   #  ifdef THREAD_CREATE_NEEDS_STACK
   	    if(pthread_attr_setstacksize(&attr, THREAD_CREATE_NEEDS_STACK))
  -	      Perl_croak(aTHX_ "panic: pthread_attr_setstacksize failed");
  +	      panic = "panic: pthread_attr_setstacksize failed";
   #  endif
   
   #ifdef OLD_PTHREADS_API
  -	  pthread_create( &thread->thr, attr, Perl_ithread_run, (void *)thread);
  +	    failure
  +	      = panic ? 1 : pthread_create( &thread->thr, attr,
  +					    Perl_ithread_run, (void *)thread);
   #else
   #  if defined(HAS_PTHREAD_ATTR_SETSCOPE) && defined(PTHREAD_SCOPE_SYSTEM)
   	  pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );
   #  endif
  -	  pthread_create( &thread->thr, &attr, Perl_ithread_run, (void *)thread);
  +	  failure
  +	    = panic ? 1 : pthread_create( &thread->thr, &attr,
  +					  Perl_ithread_run, (void *)thread);
   #endif
   	}
   #endif
   	known_threads++;
  +	if (
  +#ifdef WIN32
  +	    thread->handle == NULL
  +#else
  +	    failure
  +#endif
  +	    ) {
  +	  MUTEX_UNLOCK(&create_destruct_mutex);
  +	  sv_2mortal(params);
  +	  Perl_ithread_destruct(aTHX_ thread, "create failed");
  +#ifndef WIN32
  +	  if (panic)
  +	    Perl_croak(aTHX_ panic);
  +#endif
  +	  return &PL_sv_undef;
  +	}
   	active_threads++;
   	MUTEX_UNLOCK(&create_destruct_mutex);
   	sv_2mortal(params);
  @@ -563,6 +599,8 @@
   	MUTEX_UNLOCK(&thread->mutex);
   #ifdef WIN32
   	waitcode = WaitForSingleObject(thread->handle, INFINITE);
  +	CloseHandle(thread->handle);
  +	thread->handle = 0;
   #else
   	pthread_join(thread->thr,&retval);
   #endif
  @@ -572,12 +610,17 @@
   	{
   	  ithread*        current_thread;
   	  AV* params = (AV*) SvRV(thread->params);	
  +	  PerlInterpreter *other_perl = thread->interp;
   	  CLONE_PARAMS clone_params;
   	  clone_params.stashes = newAV();
   	  clone_params.flags |= CLONEf_JOIN_IN;
   	  PL_ptr_table = ptr_table_new();
   	  current_thread = Perl_ithread_get(aTHX);
   	  Perl_ithread_set(aTHX_ thread);
  +	  /* ensure 'meaningful' addresses retain their meaning */
  +	  ptr_table_store(PL_ptr_table, &other_perl->Isv_undef, &PL_sv_undef);
  +	  ptr_table_store(PL_ptr_table, &other_perl->Isv_no, &PL_sv_no);
  +	  ptr_table_store(PL_ptr_table, &other_perl->Isv_yes, &PL_sv_yes);
   
   #if 0
   	  {
  @@ -718,6 +761,11 @@
   	MUTEX_LOCK(&create_destruct_mutex);
   	PL_threadhook = &Perl_ithread_hook;
   	thread  = PerlMemShared_malloc(sizeof(ithread));
  +	if (!thread) {
  +	    PerlLIO_write(PerlIO_fileno(Perl_error_log),
  +			  PL_no_mem, strlen(PL_no_mem));
  +	    my_exit(1);
  +	}
   	Zero(thread,1,ithread);
   	PL_perl_destruct_level = 2;
   	MUTEX_INIT(&thread->mutex);