I expect other fallout than bugs 289 and 290 is possible.

I suggest to also check the code for the various grep matches:

c/array.d:141:  case t_base_string:
c/array.d:284:  case t_base_string:
c/array.d:876:  case t_base_string:
c/array.d:903:  case t_base_string:
c/array.d:1053: case t_base_string:
c/array.d:1134: case t_base_string:
c/character.d:353:      case t_base_string:
c/compiler.d:2175:        case t_base_string:
c/file.d:1632:  if (ECL_BASE_STRING_P(strng) == t_base_string) {
c/file.d:4741:  case t_base_string: {
c/format.d:1494:        if (ecl_t_of(s) != t_base_string)
c/gbc-new.d:252:        case t_base_string:
c/gbc.d:258:    case t_base_string:
c/hash.d:94:    case t_base_string:
c/hash.d:100:   case t_base_string:
c/hash.d:173:   case t_base_string:
c/instance.d:333:       case t_base_string:
c/instance.d:336:       case t_base_string:
c/load.d:86:    if (ecl_t_of(source) != t_pathname && ecl_t_of(source) != 
t_base_string) {
c/load.d:135:   if (ecl_t_of(source) != t_pathname && ecl_t_of(source) != 
t_base_string) {
c/printer/write_ugly.d:275:                tag->base_string.t = t_base_string;
c/printer/write_ugly.d:443:     _ecl_write_base_string, /* t_base_string */
c/package.d:1022:       case t_base_string:
c/package.d:1047:       case t_base_string:
c/package.d:1069:       case t_base_string:
c/pathname.d:310:       case t_base_string:
c/pathname.d:755:       case t_base_string:
c/pathname.d:1527:      case t_base_string:
c/predicate.d:143:      return t == t_base_string || t == t_string;
c/predicate.d:145:      return t == t_base_string;
c/predicate.d:367:      case t_base_string:
c/predicate.d:370:              if (ty != t_base_string && ty != t_string)
c/predicate.d:373:              if (ty != t_base_string)
c/predicate.d:435:      case t_base_string:
c/predicate.d:439:              if (ty != t_vector && ty != t_base_string && ty 
!= t_bitvector
c/predicate.d:443:              if (ty != t_vector && ty != t_base_string && ty 
!= t_bitvector)
c/print.d:378:  case t_base_string:
c/sequence.d:94:        case t_base_string:
c/sequence.d:136:       case t_base_string:
c/sequence.d:170:       case t_base_string: {
c/sequence.d:233:       case t_base_string:
c/sequence.d:260:       case t_base_string:
c/sequence.d:293:       case t_base_string:
c/serialize.d:58:       ROUNDED_SIZE(ecl_base_string), /* t_base_string */
c/serialize.d:265:        case t_base_string: {
c/serialize.d:435:        case t_base_string:
c/serialize.d:517:        case t_base_string:
c/string.d:161: case t_base_string:
c/string.d:193: case t_base_string: {
c/string.d:240: case t_base_string:
c/string.d:276: case t_base_string: {
c/string.d:317: case t_base_string:
c/string.d:346: case t_base_string:
c/string.d:487:         case t_base_string: {
c/string.d:498: case t_base_string:
c/string.d:502:         case t_base_string:
c/string.d:678: case t_base_string:
c/structure.d:121:      case t_base_string:
c/symbol.d:102: case t_base_string:
c/tcp.d:336:    if (ecl_unlikely(ecl_t_of(path) != t_base_string))
c/tcp.d:377:    case t_base_string:
c/typespec.d:143:       case t_base_string:
c/typespec.d:305:       case t_base_string:
c/vector_push.d:55:     case t_base_string:
cmp/cmpwt.lsp:107:      (int8_t)t_base_string, 0, ecl_aet_bc, 0,
h/ecl-inl.h:77:                (int8_t)t_base_string, 0, ecl_aet_bc, 0,         
   \
h/ecl-inl.h:84:                (int8_t)t_base_string, 0, ecl_aet_bc, 0,         
   \
h/object.h:63:  t_base_string,
h/object.h:165:                                 ((x)->d.t == t_base_string || 
(x)->d.t == t_string))
h/object.h:168:#define ECL_STRINGP(x)           ((ECL_IMMEDIATE(x) == 0) && 
((x)->d.t == t_base_string))
h/object.h:171:#define ECL_BASE_STRING_P(x)     ((ECL_IMMEDIATE(x) == 0) && 
((x)->d.t == t_base_string))


Possible solutions:

- Temporarily revert the change, documenting that ECL is not compliant
  on this aspect (we can't just pass string objects to usual C code,
  more work is needed); moreover, the current behaviour is most
  probably expected by third party code using ECL FFI facilities.
  I also surprised when I learned that the standard specifies STRING,
  because it's common to reduce to the closest type other object types
  such as numbers and characters.

- Carefully check other possibly affected code in the tree.
  Perhaps replace the checks like that for bug 290 to explicit
  coercions to base_string, which may signal a condition as needed if a
  character cannot be encoded to ASCII.
  Another possibility would be to encode to UTF-8 instead in the
  future, although this may cause other problems depending on libc/OS.
  A configurable, system-specific default FFI encoding could perhaps be
  used in the future (i.e. using a dynamic variable to define the
  encoding for FFI/C external encoding)...


Thanks,
-- 
Matt

------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.  Get 
unparalleled scalability from the best Selenium testing platform available.
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Ecls-list mailing list
Ecls-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ecls-list

Reply via email to