Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LABEL<newline>: only works in string eval #13270

Open
p5pRT opened this issue Sep 15, 2013 · 6 comments
Open

LABEL<newline>: only works in string eval #13270

p5pRT opened this issue Sep 15, 2013 · 6 comments

Comments

@p5pRT
Copy link

p5pRT commented Sep 15, 2013

Migrated from rt.perl.org#119823 (status was 'open')

Searchable as RT119823$

@p5pRT
Copy link
Author

p5pRT commented Sep 15, 2013

From @cpansprout

$ ./perl -Ilib -MO=Deparse -e 'foo​:bar'
foo​: '???';
-e syntax OK
$ ./perl -Ilib -MO=Deparse -e 'foo' -e '​:bar'
syntax error at -e line 2, near "foo
:"
-e had compilation errors.
$ ./perl -Ilib -e 'warn eval "foo\n​:bar";'
bar at -e line 1.

The colon search does not like newlines, except in string eval, where it is fine.


Flags​:
  category=core
  severity=low


Site configuration information for perl 5.19.4​:

Configured by sprout at Mon Sep 9 00​:16​:24 PDT 2013.

Summary of my perl5 (revision 5 version 19 subversion 4) configuration​:
  Commit id​: d47819ff6f55bfaa4b7eddc66c6db7d7dfdec11c
  Platform​:
  osname=darwin, osvers=12.2.0, archname=darwin-2level
  uname='darwin pint.local 12.2.0 darwin kernel version 12.2.0​: sat aug 25 00​:48​:52 pdt 2012; root​:xnu-2050.18.24~1release_x86_64 x86_64 '
  config_args='-de -Dcc=gcc -Dusedevel -Doptimize=-ggdb3 -Aoptimize=-O0 -DDEBUGGING'
  hint=recommended, useposix=true, d_sigaction=define
  useithreads=undef, usemultiplicity=undef
  useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
  use64bitint=define, use64bitall=define, uselongdouble=undef
  usemymalloc=n, bincompat5005=undef
  Compiler​:
  cc='gcc', ccflags ='-fno-common -DPERL_DARWIN -no-cpp-precomp -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include',
  optimize='-ggdb3 -O0',
  cppflags='-no-cpp-precomp -fno-common -DPERL_DARWIN -no-cpp-precomp -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
  ccversion='', gccversion='4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)', gccosandvers=''
  intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
  d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
  ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
  alignbytes=8, prototype=define
  Linker and Libraries​:
  ld='env MACOSX_DEPLOYMENT_TARGET=10.3 cc', ldflags =' -fstack-protector -L/usr/local/lib'
  libpth=/usr/local/lib /usr/lib
  libs=-ldbm -ldl -lm -lutil -lc
  perllibs=-ldl -lm -lutil -lc
  libc=, so=dylib, useshrplib=false, libperl=libperl.a
  gnulibc_version=''
  Dynamic Linking​:
  dlsrc=dl_dlopen.xs, dlext=bundle, d_dlsymun=undef, ccdlflags=' '
  cccdlflags=' ', lddlflags=' -bundle -undefined dynamic_lookup -L/usr/local/lib -fstack-protector'


@​INC for perl 5.19.4​:
  lib
  /usr/local/lib/perl5/site_perl/5.19.4/darwin-2level
  /usr/local/lib/perl5/site_perl/5.19.4
  /usr/local/lib/perl5/5.19.4/darwin-2level
  /usr/local/lib/perl5/5.19.4
  /usr/local/lib/perl5/site_perl
  .


Environment for perl 5.19.4​:
  DYLD_LIBRARY_PATH (unset)
  HOME=/Users/sprout
  LANG=en_US.UTF-8
  LANGUAGE (unset)
  LD_LIBRARY_PATH (unset)
  LOGDIR (unset)
  PATH=/usr/bin​:/bin​:/usr/sbin​:/sbin​:/usr/local/bin​:/usr/local/bin
  PERL_BADLANG (unset)
  SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Sep 15, 2013

From @Hugmeir

On Sun, Sep 15, 2013 at 5​:45 PM, Father Chrysostomos <
perlbug-followup@​perl.org> wrote​:

# New Ticket Created by Father Chrysostomos
# Please include the string​: [perl #119823]
# in the subject line of all future correspondence about this issue.
# <URL​: https://rt-archive.perl.org/perl5/Ticket/Display.html?id=119823 >

$ ./perl -Ilib -MO=Deparse -e 'foo​:bar'
foo​: '???';
-e syntax OK
$ ./perl -Ilib -MO=Deparse -e 'foo' -e '​:bar'
syntax error at -e line 2, near "foo
:"
-e had compilation errors.
$ ./perl -Ilib -e 'warn eval "foo\n​:bar";'
bar at -e line 1.

The colon search does not like newlines, except in string eval, where it
is fine.

This probably happens because the code that skips whitespace preceding the
colon search is 'while (d < PL_bufend && isSPACE(*d)) d++;', which is wrong
if there can be a newline between the end of the current token and the
start of the next, since for the non-eval case we're reading from a file
and PL_bufend will point to the next \n.
Ideally we should be using PEEKSPACE() there, but that calls
lex_read_space, which swallows up # and anything following it, and that
would break s#foo#bar#.
So the groundwork to get this and similar bugs fixed would be, I think,
adding a LEX_NO_SWALLOW_COMMENTS-style flag for
lex_read_space/skipspace_flags.

@p5pRT
Copy link
Author

p5pRT commented Sep 15, 2013

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Sep 15, 2013

From @cpansprout

On Sun Sep 15 14​:32​:09 2013, Hugmeir wrote​:

On Sun, Sep 15, 2013 at 5​:45 PM, Father Chrysostomos <
perlbug-followup@​perl.org> wrote​:

# New Ticket Created by Father Chrysostomos
# Please include the string​: [perl #119823]
# in the subject line of all future correspondence about this issue.
# <URL​: https://rt-archive.perl.org/perl5/Ticket/Display.html?id=119823 >

$ ./perl -Ilib -MO=Deparse -e 'foo​:bar'
foo​: '???';
-e syntax OK
$ ./perl -Ilib -MO=Deparse -e 'foo' -e '​:bar'
syntax error at -e line 2, near "foo
:"
-e had compilation errors.
$ ./perl -Ilib -e 'warn eval "foo\n​:bar";'
bar at -e line 1.

The colon search does not like newlines, except in string eval, where it
is fine.

This probably happens because the code that skips whitespace preceding the
colon search is 'while (d < PL_bufend && isSPACE(*d)) d++;', which is
wrong
if there can be a newline between the end of the current token and the
start of the next, since for the non-eval case we're reading from a file
and PL_bufend will point to the next \n.

Yes, that is the cause.

Ideally we should be using PEEKSPACE() there, but that calls
lex_read_space, which swallows up # and anything following it, and that
would break s#foo#bar#.
So the groundwork to get this and similar bugs fixed would be, I think,
adding a LEX_NO_SWALLOW_COMMENTS-style flag for
lex_read_space/skipspace_flags.

I think that would work.

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Sep 15, 2013

From [Unknown Contact. See original ticket]

On Sun Sep 15 14​:32​:09 2013, Hugmeir wrote​:

On Sun, Sep 15, 2013 at 5​:45 PM, Father Chrysostomos <
perlbug-followup@​perl.org> wrote​:

# New Ticket Created by Father Chrysostomos
# Please include the string​: [perl #119823]
# in the subject line of all future correspondence about this issue.
# <URL​: https://rt-archive.perl.org/perl5/Ticket/Display.html?id=119823 >

$ ./perl -Ilib -MO=Deparse -e 'foo​:bar'
foo​: '???';
-e syntax OK
$ ./perl -Ilib -MO=Deparse -e 'foo' -e '​:bar'
syntax error at -e line 2, near "foo
:"
-e had compilation errors.
$ ./perl -Ilib -e 'warn eval "foo\n​:bar";'
bar at -e line 1.

The colon search does not like newlines, except in string eval, where it
is fine.

This probably happens because the code that skips whitespace preceding the
colon search is 'while (d < PL_bufend && isSPACE(*d)) d++;', which is
wrong
if there can be a newline between the end of the current token and the
start of the next, since for the non-eval case we're reading from a file
and PL_bufend will point to the next \n.

Yes, that is the cause.

Ideally we should be using PEEKSPACE() there, but that calls
lex_read_space, which swallows up # and anything following it, and that
would break s#foo#bar#.
So the groundwork to get this and similar bugs fixed would be, I think,
adding a LEX_NO_SWALLOW_COMMENTS-style flag for
lex_read_space/skipspace_flags.

I think that would work.

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Nov 27, 2017

From zefram@fysh.org

Brian Fraser wrote​:

Ideally we should be using PEEKSPACE() there, but that calls
lex_read_space, which swallows up # and anything following it, and that
would break s#foo#bar#.

It's not as simple as breaking that, and actually that worry is easily
dealt with because we can see before doing the whitespace skipping that
the word is "s" which isn't eligible to become a label. In fact, we
can see from how well "=>" on a following line works that it should be
possible to detect "​:" on a following line, by postponing the recognition
until we know it's OK to process whitespace normally.

-zefram

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants