summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2001-03-25 22:25:04 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2001-03-25 22:25:04 +0000
commit4ddf6213325a6e94c722116190f88d13ab30b7fc (patch)
treeee50d44acd92700f4181facc7b23f197060e253a
parentd3b9c6891b7459d54058317f1c1f213e6a01409e (diff)
parent09e8efccba1f47d53c182ecd6161dfcbbbc53b0f (diff)
downloadperl-4ddf6213325a6e94c722116190f88d13ab30b7fc.tar.gz
Integrate perlio:
[ 9351] Fix readline in list mode to tell rest of world that it has things on the stack. Otherwise if perl code gets invoked underneath it it scribbles over results-so-far. (Why TIEHANDLE has not tripped on this is a mystery.) [ 9350] win32/makefile.mk typos [ 9348] Make it text [ 9346] Add destruct time hook to PerlIO (for work-in-process implementing layers in perl code. In such cases layers need to be popped before we loose the ability to run perl code.) Also back-out "PerlIO::object" hook - it isn't going to work like that... [ 9345] Avoid at leasy one of undefined warnings in Encode. [ 9343] Missing return value. p4raw-link: @9351 on //depot/perlio: 09e8efccba1f47d53c182ecd6161dfcbbbc53b0f p4raw-link: @9350 on //depot/perlio: 2590d28705872a65d11745576d64aa79a6c9cdfe p4raw-link: @9348 on //depot/perlio: e8c26a5fe91df45297036573f4007ab8d23de7e9 p4raw-link: @9346 on //depot/perlio: 13621cfb31449eed71b690b723c2463019b1b277 p4raw-link: @9345 on //depot/perlio: 8040349a05f5a3f1e93bde55d8359e415c47bf01 p4raw-link: @9343 on //depot/perlio: a144b9898613715625621889c13893a8238e4af6 p4raw-id: //depot/perl@9353
-rw-r--r--ext/Encode/Encode.pm6
-rw-r--r--ext/Encode/Encode.xs11
-rw-r--r--ext/PerlIO/Scalar/Scalar.xs1
-rw-r--r--perl.c8
-rw-r--r--perlio.c58
-rw-r--r--perlio.h2
-rw-r--r--perliol.h1
-rw-r--r--pp_hot.c3
-rw-r--r--win32/makefile.mk4
9 files changed, 69 insertions, 25 deletions
diff --git a/ext/Encode/Encode.pm b/ext/Encode/Encode.pm
index fd85520311..650180647b 100644
--- a/ext/Encode/Encode.pm
+++ b/ext/Encode/Encode.pm
@@ -273,7 +273,7 @@ use base 'Encode::Encoding';
# Encoding is 16-bit network order Unicode (no surogates)
# Used for X font encodings
-__PACKAGE__->Define(qw(UCS-2 iso10646-1));
+__PACKAGE__->Define(qw(UCS-2 iso-10646-1));
sub decode
{
@@ -285,7 +285,7 @@ sub decode
$uni .= chr($code);
}
$_[1] = $str if $chk;
- Encode::utf8_upgrade($uni);
+ utf8::upgrade($uni);
return $uni;
}
@@ -586,7 +586,7 @@ UTF-16 is similar to UCS-2, 16 bit or 2-byte chunks.
UCS-2 can only represent 0..0xFFFF, while UTF-16 has a "surogate pair"
scheme which allows it to cover the whole Unicode range.
-Encode implements big-endian UCS-2 aliased to "iso10646-1" as that
+Encode implements big-endian UCS-2 aliased to "iso-10646-1" as that
happens to be the name used by that representation when used with X11 fonts.
UTF-32 or UCS-4 is 32-bit or 4-byte chunks. Perl's logical characters
diff --git a/ext/Encode/Encode.xs b/ext/Encode/Encode.xs
index 74303c9389..13ba7045c4 100644
--- a/ext/Encode/Encode.xs
+++ b/ext/Encode/Encode.xs
@@ -219,9 +219,11 @@ PerlIOEncode_flush(PerlIO *f)
{
PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
IV code = 0;
- dTHX;
- if (e->bufsv && (PerlIOBase(f)->flags & (PERLIO_F_RDBUF|PERLIO_F_WRBUF)))
+ if (e->bufsv && (PerlIOBase(f)->flags & (PERLIO_F_RDBUF|PERLIO_F_WRBUF))
+ &&(e->base.ptr > e->base.buf)
+ )
{
+ dTHX;
dSP;
SV *str;
char *s;
@@ -452,6 +454,11 @@ encode_method(pTHX_ encode_t *enc, encpage_t *dir, SV *src, int check)
SvCUR_set(src,SvCUR(src)-slen);
}
}
+ else
+ {
+ SvCUR_set(dst,slen);
+ SvPOK_on(dst);
+ }
return dst;
}
diff --git a/ext/PerlIO/Scalar/Scalar.xs b/ext/PerlIO/Scalar/Scalar.xs
index 650cc5a67a..7a01ec696c 100644
--- a/ext/PerlIO/Scalar/Scalar.xs
+++ b/ext/PerlIO/Scalar/Scalar.xs
@@ -124,6 +124,7 @@ PerlIOScalar_get_base(PerlIO *f)
dTHX;
return (STDCHAR *)SvPV_nolen(s->var);
}
+ return (STDCHAR *) Nullch;
}
STDCHAR *
diff --git a/perl.c b/perl.c
index b3637fcd22..41ffdaaf90 100644
--- a/perl.c
+++ b/perl.c
@@ -395,6 +395,7 @@ perl_destruct(pTHXx)
LEAVE;
FREETMPS;
+
/* We must account for everything. */
/* Destroy the main CV and syntax tree */
@@ -409,6 +410,13 @@ perl_destruct(pTHXx)
PL_main_cv = Nullcv;
PL_dirty = TRUE;
+ /* Tell PerlIO we are about to tear things apart in case
+ we have layers which are using resources that should
+ be cleaned up now.
+ */
+
+ PerlIO_destruct(aTHX);
+
if (PL_sv_objcount) {
/*
* Try to destruct global references. We do this first so that the
diff --git a/perlio.c b/perlio.c
index 94b7c17fcd..d33c0cb708 100644
--- a/perlio.c
+++ b/perlio.c
@@ -93,6 +93,11 @@ PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
return -1;
}
+void
+PerlIO_destruct(pTHX)
+{
+}
+
int
PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
{
@@ -313,6 +318,37 @@ PerlIO_cleanup()
}
void
+PerlIO_destruct(pTHX)
+{
+ PerlIO **table = &_perlio;
+ PerlIO *f;
+ while ((f = *table))
+ {
+ int i;
+ table = (PerlIO **)(f++);
+ for (i=1; i < PERLIO_TABLE_SIZE; i++)
+ {
+ PerlIO *x = f;
+ PerlIOl *l;
+ while ((l = *x))
+ {
+ if (l->tab->kind & PERLIO_K_DESTRUCT)
+ {
+ PerlIO_debug("Destruct popping %s\n",l->tab->name);
+ PerlIO_flush(x);
+ PerlIO_pop(aTHX_ x);
+ }
+ else
+ {
+ x = PerlIONext(x);
+ }
+ }
+ f++;
+ }
+ }
+}
+
+void
PerlIO_pop(pTHX_ PerlIO *f)
{
PerlIOl *l = *f;
@@ -888,11 +924,11 @@ PerlIO_resolve_layers(pTHX_ const char *layers,const char *mode,int narg, SV **a
PerlIO_stdstreams(aTHX);
if (narg)
{
- if (SvROK(*args))
+ if (SvROK(*args) && !sv_isobject(*args))
{
- if (sv_isobject(*args))
+ if (SvTYPE(SvRV(*args)) < SVt_PVAV)
{
- SV *handler = PerlIO_find_layer(aTHX_ "object",6);
+ SV *handler = PerlIO_find_layer(aTHX_ "Scalar",6);
if (handler)
{
def = newAV();
@@ -903,21 +939,7 @@ PerlIO_resolve_layers(pTHX_ const char *layers,const char *mode,int narg, SV **a
}
else
{
- if (SvTYPE(SvRV(*args)) < SVt_PVAV)
- {
- SV *handler = PerlIO_find_layer(aTHX_ "Scalar",6);
- if (handler)
- {
- def = newAV();
- av_push(def,handler);
- av_push(def,&PL_sv_undef);
- incdef = 0;
- }
- }
- else
- {
- Perl_croak(aTHX_ "Unsupported reference arg to open()");
- }
+ Perl_croak(aTHX_ "Unsupported reference arg to open()");
}
}
}
diff --git a/perlio.h b/perlio.h
index ce28c8da5a..cd722a1018 100644
--- a/perlio.h
+++ b/perlio.h
@@ -327,6 +327,8 @@ extern int PerlIO_apply_layers (pTHX_ PerlIO *f, const char *mode, const char *n
extern int PerlIO_binmode (pTHX_ PerlIO *f, int iotype, int omode, const char *names);
#endif
+extern void PerlIO_destruct(pTHX);
+
#ifndef PERLIO_IS_STDIO
extern void PerlIO_cleanup(void);
diff --git a/perliol.h b/perliol.h
index 449ea89983..d4604e2342 100644
--- a/perliol.h
+++ b/perliol.h
@@ -46,6 +46,7 @@ struct _PerlIO_funcs
#define PERLIO_K_FASTGETS 0x00000008
#define PERLIO_K_DUMMY 0x00000010
#define PERLIO_K_UTF8 0x00008000
+#define PERLIO_K_DESTRUCT 0x00010000
/*--------------------------------------------------------------------------------------*/
struct _PerlIO
diff --git a/pp_hot.c b/pp_hot.c
index 58874a87b9..7a6ad3224d 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1511,6 +1511,7 @@ Perl_do_readline(pTHX)
|| (IoFLAGS(io) & IOf_NOLINE) || !RsSNARF(rs))
for (;;) {
+ PUTBACK;
if (!sv_gets(sv, fp, offset)
&& (type == OP_GLOB || SNARF_EOF(gimme, PL_rs, io, sv)))
{
@@ -1531,6 +1532,7 @@ Perl_do_readline(pTHX)
}
if (gimme == G_SCALAR) {
(void)SvOK_off(TARG);
+ SPAGAIN;
PUSHTARG;
}
MAYBE_TAINT_LINE(io, sv);
@@ -1540,6 +1542,7 @@ Perl_do_readline(pTHX)
IoLINES(io)++;
IoFLAGS(io) |= IOf_NOLINE;
SvSETMAGIC(sv);
+ SPAGAIN;
XPUSHs(sv);
if (type == OP_GLOB) {
char *tmps;
diff --git a/win32/makefile.mk b/win32/makefile.mk
index f365bcff12..4b369ed11a 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -1254,9 +1254,9 @@ $(MD5_DLL): $(PERLDEP) $(MD5).xs
cd $(EXTDIR)\Digest\MD5 && $(MAKE)
$(MIMEBASE64_DLL): $(PERLDEP) $(MIMEBASE64).xs
- cd $(EXTDIR)\Digest\Mime\Base64 && \
+ cd $(EXTDIR)\MIME\Base64 && \
..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl
- cd $(EXTDIR)\Digest\MIMEBASE64 && $(MAKE)
+ cd $(EXTDIR)\MIME\Base64 && $(MAKE)
$(ERRNO_PM): $(PERLDEP) $(ERRNO)_pm.PL
cd $(EXTDIR)\$(*B) && \