The Trunk: Kernel-ul.485.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Kernel-ul.485.mcz

commits-2
Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-ul.485.mcz

==================== Summary ====================

Name: Kernel-ul.485
Author: ul
Time: 23 August 2010, 2:13:52.357 pm
UUID: fce08992-f821-ed46-a863-9935d6a7fe2e
Ancestors: Kernel-dtl.484

- fix LargeInteger printing

=============== Diff against Kernel-dtl.484 ===============

Item was changed:
  ----- Method: LargePositiveInteger>>printOn:base:nDigits: (in category 'printing') -----
  printOn: aStream base: b nDigits: n
  "Append a representation of this number in base b on aStream using n digits.
  In order to reduce cost of LargePositiveInteger ops, split the number of digts approximatily in two
  Should be invoked with: 0 <= self < (b raisedToInteger: n)"
 
  | halfPower half head tail |
  n <= 1 ifTrue: [
  n <= 0 ifTrue: [self error: 'Number of digits n should be > 0'].
 
  "Note: this is to stop an infinite loop if one ever attempts to print with a huge base
  This can happen because choice was to not hardcode any limit for base b
  We let Character>>#digitValue: fail"
+ ^aStream nextPut: (Character digitValue: self) ].
- ^Character digitValue: self].
  halfPower := n bitShift: -1.
  half := b raisedToInteger: halfPower.
  head := self quo: half.
  tail := self - (head * half).
  head printOn: aStream base: b nDigits: n - halfPower.
  tail printOn: aStream base: b nDigits: halfPower!


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Kernel-ul.485.mcz

Nicolas Cellier
Waouh!

I don't know how you could possibly find this one!
Chapeau bas

Nicolas

2010/8/23  <[hidden email]>:

> Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
> http://source.squeak.org/trunk/Kernel-ul.485.mcz
>
> ==================== Summary ====================
>
> Name: Kernel-ul.485
> Author: ul
> Time: 23 August 2010, 2:13:52.357 pm
> UUID: fce08992-f821-ed46-a863-9935d6a7fe2e
> Ancestors: Kernel-dtl.484
>
> - fix LargeInteger printing
>
> =============== Diff against Kernel-dtl.484 ===============
>
> Item was changed:
>  ----- Method: LargePositiveInteger>>printOn:base:nDigits: (in category 'printing') -----
>  printOn: aStream base: b nDigits: n
>        "Append a representation of this number in base b on aStream using n digits.
>        In order to reduce cost of LargePositiveInteger ops, split the number of digts approximatily in two
>        Should be invoked with: 0 <= self < (b raisedToInteger: n)"
>
>        | halfPower half head tail |
>        n <= 1 ifTrue: [
>                n <= 0 ifTrue: [self error: 'Number of digits n should be > 0'].
>
>                "Note: this is to stop an infinite loop if one ever attempts to print with a huge base
>                This can happen because choice was to not hardcode any limit for base b
>                We let Character>>#digitValue: fail"
> +               ^aStream nextPut: (Character digitValue: self) ].
> -               ^Character digitValue: self].
>        halfPower := n bitShift: -1.
>        half := b raisedToInteger: halfPower.
>        head := self quo: half.
>        tail := self - (head * half).
>        head printOn: aStream base: b nDigits: n - halfPower.
>        tail printOn: aStream base: b nDigits: halfPower!
>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Kernel-ul.485.mcz

Levente Uzonyi-2
On Mon, 23 Aug 2010, Nicolas Cellier wrote:

> Waouh!
>
> I don't know how you could possibly find this one!
> Chapeau bas

It was just an "accident". There was a discussion on the Pharo list
about converting a ByteArray to an Integer. Since LargeIntegers are
variableByteSubclasses (just like ByteArrays), I tried this:
#[1] as: LargePositiveInteger.
The printString was empty without #normalize, so I started debugging. It's
a bit strange though, that LargePositiveInteger >> #printOn:base: has the
following lines:
"Don't engage any arithmetic if not normalized"
(self digitLength = 0 or: [(self digitAt: self digitLength) = 0]) ifTrue: [^self normalize printOn: aStream base: b].
But the "artifically created" not normalized LargePositiveInteger passes
this check.


Levente

>
> Nicolas
>
> 2010/8/23  <[hidden email]>:
>> Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
>> http://source.squeak.org/trunk/Kernel-ul.485.mcz
>>
>> ==================== Summary ====================
>>
>> Name: Kernel-ul.485
>> Author: ul
>> Time: 23 August 2010, 2:13:52.357 pm
>> UUID: fce08992-f821-ed46-a863-9935d6a7fe2e
>> Ancestors: Kernel-dtl.484
>>
>> - fix LargeInteger printing
>>
>> =============== Diff against Kernel-dtl.484 ===============
>>
>> Item was changed:
>>  ----- Method: LargePositiveInteger>>printOn:base:nDigits: (in category 'printing') -----
>>  printOn: aStream base: b nDigits: n
>>        "Append a representation of this number in base b on aStream using n digits.
>>        In order to reduce cost of LargePositiveInteger ops, split the number of digts approximatily in two
>>        Should be invoked with: 0 <= self < (b raisedToInteger: n)"
>>
>>        | halfPower half head tail |
>>        n <= 1 ifTrue: [
>>                n <= 0 ifTrue: [self error: 'Number of digits n should be > 0'].
>>
>>                "Note: this is to stop an infinite loop if one ever attempts to print with a huge base
>>                This can happen because choice was to not hardcode any limit for base b
>>                We let Character>>#digitValue: fail"
>> +               ^aStream nextPut: (Character digitValue: self) ].
>> -               ^Character digitValue: self].
>>        halfPower := n bitShift: -1.
>>        half := b raisedToInteger: halfPower.
>>        head := self quo: half.
>>        tail := self - (head * half).
>>        head printOn: aStream base: b nDigits: n - halfPower.
>>        tail printOn: aStream base: b nDigits: halfPower!
>>
>>
>>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Kernel-ul.485.mcz

Nicolas Cellier
2010/8/23 Levente Uzonyi <[hidden email]>:

> On Mon, 23 Aug 2010, Nicolas Cellier wrote:
>
>> Waouh!
>>
>> I don't know how you could possibly find this one!
>> Chapeau bas
>
> It was just an "accident". There was a discussion on the Pharo list about
> converting a ByteArray to an Integer. Since LargeIntegers are
> variableByteSubclasses (just like ByteArrays), I tried this:
> #[1] as: LargePositiveInteger.
> The printString was empty without #normalize, so I started debugging. It's a
> bit strange though, that LargePositiveInteger >> #printOn:base: has the
> following lines:
> "Don't engage any arithmetic if not normalized"
> (self digitLength = 0 or: [(self digitAt: self digitLength) = 0]) ifTrue:
> [^self normalize printOn: aStream base: b].
> But the "artifically created" not normalized LargePositiveInteger passes
> this check.
>

Ah, I see, nice trick...
Does it deserve a dedicated test, or is it too fragile a feature ?

Nicolas

>
> Levente
>
>>
>> Nicolas
>>
>> 2010/8/23  <[hidden email]>:
>>>
>>> Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
>>> http://source.squeak.org/trunk/Kernel-ul.485.mcz
>>>
>>> ==================== Summary ====================
>>>
>>> Name: Kernel-ul.485
>>> Author: ul
>>> Time: 23 August 2010, 2:13:52.357 pm
>>> UUID: fce08992-f821-ed46-a863-9935d6a7fe2e
>>> Ancestors: Kernel-dtl.484
>>>
>>> - fix LargeInteger printing
>>>
>>> =============== Diff against Kernel-dtl.484 ===============
>>>
>>> Item was changed:
>>>  ----- Method: LargePositiveInteger>>printOn:base:nDigits: (in category
>>> 'printing') -----
>>>  printOn: aStream base: b nDigits: n
>>>        "Append a representation of this number in base b on aStream using
>>> n digits.
>>>        In order to reduce cost of LargePositiveInteger ops, split the
>>> number of digts approximatily in two
>>>        Should be invoked with: 0 <= self < (b raisedToInteger: n)"
>>>
>>>        | halfPower half head tail |
>>>        n <= 1 ifTrue: [
>>>                n <= 0 ifTrue: [self error: 'Number of digits n should be
>>> > 0'].
>>>
>>>                "Note: this is to stop an infinite loop if one ever
>>> attempts to print with a huge base
>>>                This can happen because choice was to not hardcode any
>>> limit for base b
>>>                We let Character>>#digitValue: fail"
>>> +               ^aStream nextPut: (Character digitValue: self) ].
>>> -               ^Character digitValue: self].
>>>        halfPower := n bitShift: -1.
>>>        half := b raisedToInteger: halfPower.
>>>        head := self quo: half.
>>>        tail := self - (head * half).
>>>        head printOn: aStream base: b nDigits: n - halfPower.
>>>        tail printOn: aStream base: b nDigits: halfPower!
>>>
>>>
>>>
>>
>
>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Kernel-ul.485.mcz

Levente Uzonyi-2
On Mon, 23 Aug 2010, Nicolas Cellier wrote:

> 2010/8/23 Levente Uzonyi <[hidden email]>:
>> On Mon, 23 Aug 2010, Nicolas Cellier wrote:
>>
>>> Waouh!
>>>
>>> I don't know how you could possibly find this one!
>>> Chapeau bas
>>
>> It was just an "accident". There was a discussion on the Pharo list about
>> converting a ByteArray to an Integer. Since LargeIntegers are
>> variableByteSubclasses (just like ByteArrays), I tried this:
>> #[1] as: LargePositiveInteger.
>> The printString was empty without #normalize, so I started debugging. It's a
>> bit strange though, that LargePositiveInteger >> #printOn:base: has the
>> following lines:
>> "Don't engage any arithmetic if not normalized"
>> (self digitLength = 0 or: [(self digitAt: self digitLength) = 0]) ifTrue:
>> [^self normalize printOn: aStream base: b].
>> But the "artifically created" not normalized LargePositiveInteger passes
>> this check.
>>
>
> Ah, I see, nice trick...
> Does it deserve a dedicated test, or is it too fragile a feature ?
I think that we shouldn't expect that not LargeIntegers work correctly
without normalization. For example:
(#[1] as: LargePositiveInteger) = 1 "===> false"
So I think this shouldn't be tested.


Levente

>
> Nicolas
>
>>
>> Levente
>>
>>>
>>> Nicolas
>>>
>>> 2010/8/23  <[hidden email]>:
>>>>
>>>> Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
>>>> http://source.squeak.org/trunk/Kernel-ul.485.mcz
>>>>
>>>> ==================== Summary ====================
>>>>
>>>> Name: Kernel-ul.485
>>>> Author: ul
>>>> Time: 23 August 2010, 2:13:52.357 pm
>>>> UUID: fce08992-f821-ed46-a863-9935d6a7fe2e
>>>> Ancestors: Kernel-dtl.484
>>>>
>>>> - fix LargeInteger printing
>>>>
>>>> =============== Diff against Kernel-dtl.484 ===============
>>>>
>>>> Item was changed:
>>>>  ----- Method: LargePositiveInteger>>printOn:base:nDigits: (in category
>>>> 'printing') -----
>>>>  printOn: aStream base: b nDigits: n
>>>>        "Append a representation of this number in base b on aStream using
>>>> n digits.
>>>>        In order to reduce cost of LargePositiveInteger ops, split the
>>>> number of digts approximatily in two
>>>>        Should be invoked with: 0 <= self < (b raisedToInteger: n)"
>>>>
>>>>        | halfPower half head tail |
>>>>        n <= 1 ifTrue: [
>>>>                n <= 0 ifTrue: [self error: 'Number of digits n should be
>>>>> 0'].
>>>>
>>>>                "Note: this is to stop an infinite loop if one ever
>>>> attempts to print with a huge base
>>>>                This can happen because choice was to not hardcode any
>>>> limit for base b
>>>>                We let Character>>#digitValue: fail"
>>>> +               ^aStream nextPut: (Character digitValue: self) ].
>>>> -               ^Character digitValue: self].
>>>>        halfPower := n bitShift: -1.
>>>>        half := b raisedToInteger: halfPower.
>>>>        head := self quo: half.
>>>>        tail := self - (head * half).
>>>>        head printOn: aStream base: b nDigits: n - halfPower.
>>>>        tail printOn: aStream base: b nDigits: halfPower!
>>>>
>>>>
>>>>
>>>
>>
>>
>>
>>
>
>