[Glass] MultibyteString>>encodeUsing: bug

Dale Henrichs dale.henrichs at gemtalksystems.com
Mon Apr 21 15:40:00 PDT 2014


Johan,

I looked into the primitive call and there are a number of possible
failures:

  1. lookup character value beyond end of array
  2. the character in the table is larger than will fit in receiver
(automatic coercion
      not supported in this primitive)
  3. non-character in the table

Presumably the failure code should implement the encodeUsing: in Smalltalk
so that we can get a more meaningful error (or take advantage of automatic
coercion)...

I've submitted a bug against 3.2.

Still curious about your failure mode, tho...

Dale


On Mon, Apr 21, 2014 at 12:39 PM, Dale Henrichs <
dale.henrichs at gemtalksystems.com> wrote:

> Johan,
>
> Could you share some more details about the bug?
>
> GemStone will automatically coerce a `String new` into the appropriate
> *String  class when a multi-byte character is added to the String, so
> presumably `String new` shouldn't be a problem.
>
> I don't know where the `MutiByteString new` is being executed (perhaps not
> necessary?)
>
> Regarding primitive failures, there is typically failure code written in
> Smalltalk to throw an explicit error upon primitive failure, but that code
> is clearly missing in the #encodeUsing: method ... From the comment:
>
>   If the ascii value is >= size of the encodingArray, nil is returned.
>    If the value from the encodingArray is a Character with value > 16rFF
>    or is not a kind of String,  nil is returned.
>
> So there should some Smalltalk code checking for those conditions ... also
> it looks like MutiByteStrings will be problematic since they would involve
> characters > 16rFF, so I will have to check into that ... If
> MultiByteStrings are supported by the primitive, then perhaps moving the
> primitive call to the concrete subclasses of MultiByteString will do the
> trick ...
>
> Finally, for security reasons compilation of methods with primitives must
> be done by SystemUser. It is possible to give a user (like Datacurator)
> the CompilePrimitives privilege to allow primitive compilation. Something
> like the following:
>
>   GsCurrentSession currentSession userProfile
>     addPrivilege: #'CompilePrimitives';
>     yourself.
>   System commitTransaction.
>
> I'll look into the details of the primitive and let you know if I find
> anything new...
>
> Dale
>
>
> On Mon, Apr 21, 2014 at 2:29 AM, Johan Brichau <johan at inceptive.be> wrote:
>
>> Hi,
>>
>> I stumbled upon a situation where the code in
>> MultiByteString>>encodeUsing: is being executed (the primitive has failed?).
>>
>> This code does a "MultibyteString new" but that is a subclass
>> responsibility:
>>
>>         WriteStream on: MultibyteString new.
>>
>> I assume the code should be:
>>
>>         WriteStream on: self species new.
>>
>>
>> A couple of questions:
>> - it seems I need to login as SystemUser to recompile this method. I get
>> an error only a SystemUser can change a primitive ? Anything specific to
>> watch out for when doing that?
>> - is there a way to know why the primitive failed?
>>
>> regards
>> Johan
>> _______________________________________________
>> Glass mailing list
>> Glass at lists.gemtalksystems.com
>> http://lists.gemtalksystems.com/mailman/listinfo/glass
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gemtalksystems.com/mailman/private/glass/attachments/20140421/bb62291c/attachment.html>


More information about the Glass mailing list