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

eval return value is only sometimes copied #11794

Closed
p5pRT opened this issue Dec 11, 2011 · 6 comments
Closed

eval return value is only sometimes copied #11794

p5pRT opened this issue Dec 11, 2011 · 6 comments

Comments

@p5pRT
Copy link

p5pRT commented Dec 11, 2011

Migrated from rt.perl.org#105910 (status was 'resolved')

Searchable as RT105910$

@p5pRT
Copy link
Author

p5pRT commented Dec 11, 2011

From @cpansprout

#!perl -l
print \$x;
$a = sub { \@​_ }->($x);
print \eval ' shift @​$a ';
print \eval ' $x ';

This gives me​:

SCALAR(0x826d50)
SCALAR(0x826d50)
SCALAR(0x826e60)


Flags​:
  category=core
  severity=low


Site configuration information for perl 5.15.4​:

Configured by sprout at Wed Nov 2 09​:06​:14 PDT 2011.

Summary of my perl5 (revision 5 version 15 subversion 4) configuration​:
  Snapshot of​: f364061
  Platform​:
  osname=darwin, osvers=10.5.0, archname=darwin-thread-multi-2level
  uname='darwin pint.local 10.5.0 darwin kernel version 10.5.0​: fri nov 5 23​:20​:39 pdt 2010; root​:xnu-1504.9.17~1release_i386 i386 '
  config_args='-de -Doptimize=-g -Dusedevel -Duseithreads -Dmad'
  hint=recommended, useposix=true, d_sigaction=define
  useithreads=define, usemultiplicity=define
  useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
  use64bitint=undef, use64bitall=undef, uselongdouble=undef
  usemymalloc=n, bincompat5005=undef
  Compiler​:
  cc='cc', ccflags ='-fno-common -DPERL_DARWIN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include',
  optimize='-g',
  cppflags='-fno-common -DPERL_DARWIN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
  ccversion='', gccversion='4.2.1 (Apple Inc. build 5664)', gccosandvers=''
  intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
  d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
  ivtype='long', ivsize=4, 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'

Locally applied patches​:
 


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


Environment for perl 5.15.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/X11/bin​:/usr/local/bin
  PERL_BADLANG (unset)
  SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented May 19, 2014

From @jkeenan

On Sun Dec 11 13​:07​:43 2011, sprout wrote​:

#!perl -l
print \$x;
$a = sub { \@​_ }->($x);
print \eval ' shift @​$a ';
print \eval ' $x ';

This gives me​:

SCALAR(0x826d50)
SCALAR(0x826d50)
SCALAR(0x826e60)

This bug report is too terse for a mere mortal like me to understand.

Can anyone explicate?

Thank you very much.
Jim Keenan

@p5pRT
Copy link
Author

p5pRT commented May 19, 2014

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

@p5pRT
Copy link
Author

p5pRT commented May 21, 2014

From @epa

When you eval() a string of code and it returns a value, do you get back that value or a copy of it? The code example shows that in the first eval() call the same scalar $a is being returned, since the SCALAR(0xwhatever) printed is the same as for the original print() call. However, the second eval() call, while the code being evaluated is equivalent, somehow returns a copy of the scalar, printing a different SCALAR(0xsomethingelse). I can reproduce this on 5.18.2 also.

The behaviour should be more consistent​: either always copying the value, or (probably more useful) always returning the value without copying.

@p5pRT
Copy link
Author

p5pRT commented Mar 29, 2017

From @iabyn

On Sun, Dec 11, 2011 at 01​:07​:44PM -0800, Father Chrysostomos wrote​:

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

#!perl -l
print \$x;
$a = sub { \@​_ }->($x);
print \eval ' shift @​$a ';
print \eval ' $x ';

This gives me​:

SCALAR(0x826d50)
SCALAR(0x826d50)
SCALAR(0x826e60)

I think that's been fixed by my context stack reworking for 5.24.0.

--
Never work with children, animals, or actors.

@p5pRT p5pRT closed this as completed Mar 29, 2017
@p5pRT
Copy link
Author

p5pRT commented Mar 29, 2017

@iabyn - Status changed from 'open' to 'resolved'

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

1 participant