Dear all,

I'm a Chinese developer who have used ECL for some time in 2013. Although I 
don't use it recently, I'd like to report an old issue (and our investigations) 
that I struggled with.

Problem: ECL fails to compile under CHINESE windows XP and windows 7, due to 
ecl_min.exe crash.

This issue is present in 13.5 (and also 15.3.7-rc1) but not in version 12.12.1. 

I've discussed this with Juan Jose in private emails (thanks, Juanjo!) but we 
were both quite busy and didn't finish it.

However, we have some important observations: 

1. Before 2012-12-16, the whole ECL is working on our machines (not only 
ecl-min) so something that changed after that is causing this problem.

2. I debugged with windbg, found that ecl_min.exe crashed in cl_boot, here:

if (cl_fboundp(@'ext::make-encoding') != ECL_NIL) {
        maybe_fix_console_stream(cl_core.standard_input);
        maybe_fix_console_stream(cl_core.standard_output);
        maybe_fix_console_stream(cl_core.error_output);
    }

(BTW: our encoding is CP936 and windbg showed the code successfully detected 
this, i.e. known_cp[i].name is "WINDOWS-CP936")

In maybe_fix_console_stream(cl_object stream), there is a call:

    si_stream_external_format_set(stream, external_format);

Then I traced into it, and found it got here:

#ifdef ECL_CLOS_STREAMS
        unlikely_if (ECL_INSTANCEP(stream)) {
                FEerror("Cannot change external format of stream ~A", 1, 
stream);  <--- *** it got here. ***
        }
#endif

and here:

                        cl_object elt_type = ecl_stream_element_type(stream);
                        unlikely_if (elt_type != @'character' &&
                                     elt_type != @'base-char')
                                FEerror("Cannot change external format"
                                        "of binary stream ~A", 1, stream); <-- 
*** and here. ***
                        set_stream_elt_type(stream, stream->stream.byte_size,
                                            stream->stream.flags, format);

Then in set_stream_elt_type, it got into an INFINITE RECURSION:

static int
parse_external_format(cl_object stream, cl_object format, int flags)
{
        if (format == @':default') {
                format = ecl_symbol_value(@'ext::*default-external-format*');
        }
    if (CONSP(format)) {  <-- this is always true, so it recurses indefinitely
        flags = parse_external_format(stream, ECL_CONS_CDR(format), flags);
        format = ECL_CONS_CAR(format);
    }

I don't know why format is such "infinite cons", maybe because of the FEerrors, 
the format variable is left in an abnormal state?

3. In ECL12.12.1, the condition below is not satisfied so the 'troublesome' 
maybe_fix_console_stream is not called at all (that's why ecl_min.exe does NOT 
crash under 12.12.1).

if (cl_fboundp(@'ext::make-encoding') != ECL_NIL) {
        maybe_fix_console_stream(cl_core.standard_input);
        maybe_fix_console_stream(cl_core.standard_output);
        maybe_fix_console_stream(cl_core.error_output);
    }

Actually, after I commented out these lines in git repository's master, 
everything seems to work fine.

I've tested some programs, outputing chinese characters without any problem. 
But since I haven't tested a lot of program, I'm not sure whether there is any 
potential problem.

Finally, my questions:

1. Is it possible to skip setting the external format? Actually our program 
will reset the encoding to utf-8, despite our windows defaults to CP936 so it 
really doesn't matter whether to set it in cl_boot. It's perfectly ok to set it 
to LATIN-1 instead. We tested ECL12.12.1, it depends on msvc/encodings 
directory (when I removed the director it asks for WINDOWS-CP936 file) but it 
works.

2. Since this issue affacts a lot of (potential) users, should we add it 
somewhere in the document or wrap these lines in a compiler directive so that 
user can choose to skip this part when compiling?

BTW: I'm very happy to see that ECL has a new maintainer now. That's REALLY 
great!
‍
Best regards,
Rujia Liu
------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Ecls-list mailing list
Ecls-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ecls-list

Reply via email to