The interpreter does not crash anymore when using standard streams at the end of the program whereas they have been already freed.
[INTERPRETER] * BUG: The interpreter does not crash anymore when using standard streams at the end of the program whereas they have been already freed.
This commit is contained in:
parent
89c05d8c9f
commit
a390781cd6
1 changed files with 37 additions and 14 deletions
|
@ -88,30 +88,28 @@ static CSTREAM *pop_stream(void **list)
|
||||||
|
|
||||||
static STREAM *get_default(intptr_t val)
|
static STREAM *get_default(intptr_t val)
|
||||||
{
|
{
|
||||||
STREAM *stream;
|
STREAM *stream = NULL;
|
||||||
|
|
||||||
switch(val)
|
switch(val)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if (_default_in)
|
if (_default_in)
|
||||||
stream = CSTREAM_stream(((CSTREAM_NODE *)_default_in)->stream);
|
stream = CSTREAM_stream(((CSTREAM_NODE *)_default_in)->stream);
|
||||||
else
|
else if (CFILE_in)
|
||||||
stream = CSTREAM_stream(CFILE_in);
|
stream = CSTREAM_stream(CFILE_in);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
if (_default_out)
|
if (_default_out)
|
||||||
stream = CSTREAM_stream(((CSTREAM_NODE *)_default_out)->stream);
|
stream = CSTREAM_stream(((CSTREAM_NODE *)_default_out)->stream);
|
||||||
else
|
else if (CFILE_out)
|
||||||
stream = CSTREAM_stream(CFILE_out);
|
stream = CSTREAM_stream(CFILE_out);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
if (_default_err)
|
if (_default_err)
|
||||||
stream = CSTREAM_stream(((CSTREAM_NODE *)_default_err)->stream);
|
stream = CSTREAM_stream(((CSTREAM_NODE *)_default_err)->stream);
|
||||||
else
|
else if (CFILE_err)
|
||||||
stream = CSTREAM_stream(CFILE_err);
|
stream = CSTREAM_stream(CFILE_err);
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
stream = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!stream)
|
if (!stream)
|
||||||
|
@ -120,7 +118,32 @@ static STREAM *get_default(intptr_t val)
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define _get_stream(_value, _can_default) \
|
static inline STREAM *_get_stream(VALUE *value, bool can_default)
|
||||||
|
{
|
||||||
|
STREAM *stream;
|
||||||
|
|
||||||
|
VARIANT_undo(value);
|
||||||
|
|
||||||
|
if ((can_default) && TYPE_is_integer(value->type) && value->_integer.value >= 0 && value->_integer.value <= 2)
|
||||||
|
stream = get_default((intptr_t)(value->_integer.value));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (TYPE_is_object(value->type) && value->_object.object && OBJECT_class(value->_object.object)->is_stream)
|
||||||
|
stream = CSTREAM_stream(value->_object.object);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (VALUE_is_null(value))
|
||||||
|
THROW(E_NULL);
|
||||||
|
|
||||||
|
VALUE_conv_object(value, (TYPE)CLASS_Stream);
|
||||||
|
stream = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*#define _get_stream(_value, _can_default) \
|
||||||
STREAM *stream; \
|
STREAM *stream; \
|
||||||
\
|
\
|
||||||
VARIANT_undo(_value); \
|
VARIANT_undo(_value); \
|
||||||
|
@ -139,26 +162,26 @@ static STREAM *get_default(intptr_t val)
|
||||||
VALUE_conv_object((_value), (TYPE)CLASS_Stream); \
|
VALUE_conv_object((_value), (TYPE)CLASS_Stream); \
|
||||||
stream = NULL; \
|
stream = NULL; \
|
||||||
} \
|
} \
|
||||||
}
|
}*/
|
||||||
|
|
||||||
#define get_stream(_value, _can_default) \
|
#define get_stream(_value, _can_default) \
|
||||||
({ \
|
({ \
|
||||||
_get_stream(_value, _can_default); \
|
STREAM *_stream = _get_stream(_value, _can_default); \
|
||||||
\
|
\
|
||||||
if (STREAM_is_closed(stream)) \
|
if (STREAM_is_closed(_stream)) \
|
||||||
THROW(E_CLOSED); \
|
THROW(E_CLOSED); \
|
||||||
\
|
\
|
||||||
stream; \
|
_stream; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define get_stream_for_writing(_value, _can_default) \
|
#define get_stream_for_writing(_value, _can_default) \
|
||||||
({ \
|
({ \
|
||||||
_get_stream(_value, _can_default); \
|
STREAM *_stream = _get_stream(_value, _can_default); \
|
||||||
\
|
\
|
||||||
if (STREAM_is_closed_for_writing(stream)) \
|
if (STREAM_is_closed_for_writing(_stream)) \
|
||||||
THROW(E_CLOSED); \
|
THROW(E_CLOSED); \
|
||||||
\
|
\
|
||||||
stream; \
|
_stream; \
|
||||||
})
|
})
|
||||||
|
|
||||||
static char *get_path(VALUE *param)
|
static char *get_path(VALUE *param)
|
||||||
|
|
Loading…
Reference in a new issue