[squeak-dev] Re: [Pharo-project] Prune stack serialization
Mariano Martinez Peck
marianopeck at gmail.com
Sun Dec 4 19:33:08 UTC 2011
Thanks Juan. With the latest version of Eliot, the following are failing:
self deny: [ | outerBlockTemp | [ outerBlockTemp printString ] isClean ]
value.
self deny: [ | outerBlockTemp | [ outerBlockTemp :=7 ] isClean ] value.
self deny: [ tempVar + 1 ] isClean.
self deny: [ tempVar := 1 ] isClean.
self deny: [ ClassVar + 1 ] isClean.
self deny: [ ClassVar := 1 ] isClean.
Thanks
On Sat, Dec 3, 2011 at 3:01 AM, Juan Vuletich <juan at jvuletich.org> wrote:
> Eliot Miranda wrote:
>
>
>>
>> On Fri, Dec 2, 20Tha11 at 4:01 PM, Juan Vuletich <juan at jvuletich.org<mailto:
>> juan at jvuletich.org>> wrote:
>>
>> Eliot Miranda wrote:
>>
>> Hi Juan,
>>
>> ...
>>
>>
>>
>> I can say that it does indeed work. But I'd be really
>> grateful if
>> Eliot took a good look at that code!
>>
>>
>> There is a much better way, using
>> InstructionStream>>**interpreetNextInstructionFor: which
>> abstracts away from the bytecode encoding and allows one to
>> simply use messages. e.g. look at
>>
>> and (SortedCollection sortBlock: [:a :b| a compare: b
>> caseSensitive: false]) sortBlock abstractBytecodes evaluates to
>>
>> an OrderedCollection(#**pushTemporaryVariable:
>> #pushTemporaryVariable: #pushConstant: #send:super:numArgs:)
>>
>> So a check for clean blocks would check for a block's
>> abstractBytecodes not including some particular set of banned
>> messages (which I *think* is pushReceiver
>> pushReceiverVariable: popIntoReceiverVariable:
>> storeIntoReceiverVariable: methodReturnConstant:
>> methodReturnReceiver methodReturnTop).
>>
>> e.g.
>>
>> isClean
>> ^(self abstractBytecodes intersection: #(pushReceiver
>> pushReceiverVariable: popIntoReceiverVariable:
>> storeIntoReceiverVariable: methodReturnConstant:
>> methodReturnReceiver methodReturnTop)) isEmpty
>>
>>
>> Cheers,
>> Juan Vuletich
>>
>>
>>
>>
>> -- best,
>> Eliot
>>
>>
>> Thanks Eliot. However, it looks to me that this needs more tweaking.
>>
>> <blush>Damn right :) I've done zero testing. It was just an
>> example</blush>
>>
>> For instance, your method answers true for
>> [ xx size ] isClean
>> and
>> [ ^ nil ] isClean
>> while mine answers false for both. Maybe we could serialize non
>> local returns using the Compiler (although we won't be able to
>> return anywhere), but external variable acess is a problem.
>>
>> Will keep playing with this for a while...
>>
>>
>> Can you (can I??) write some tests? What's xx in the above? Ah! [^nil]
>> isn't clean in my code since it should be pc <= end, not pc < end!! Try
>> the attached...
>>
>
> This is a start:
>
> testIsClean
> "
> ClosureTests new testIsClean
> "
> | tempVar |
> tempVar := 1.
> self assert: [ 3 + 4 ] isClean.
> self assert: [ :a | a * 2 ] isClean.
> self assert: [ Smalltalk size ] isClean.
> self assert: [ :blockArg | blockArg printString ] isClean.
> self assert: [ | blockTemp | blockTemp printString ] isClean.
> self assert: [ | blockTemp | blockTemp :=7 ] isClean.
> self deny: [ | outerBlockTemp | [ outerBlockTemp printString ] isClean ]
> value.
> self deny: [ | outerBlockTemp | [ outerBlockTemp :=7 ] isClean ] value.
> self deny: [ tempVar + 1 ] isClean.
> self deny: [ tempVar := 1 ] isClean.
> self deny: [ ivar + 1 ] isClean.
> self deny: [ ivar := 1 ] isClean.
> self deny: [ ^ true ] isClean.
> self deny: [ self printString ] isClean.
> self deny: [ ^ self ] isClean.
> self deny: [ ClassVar + 1 ] isClean.
> self deny: [ ClassVar := 1 ] isClean.
>
> This test passes with my implementation.
>
>
>
>>
>> Cheers,
>> Juan Vuletich
>>
>>
>>
>>
>> --
>> best,
>> Eliot
>>
>>
> Cheers,
> Juan Vuletich
>
>
--
Mariano
http://marianopeck.wordpress.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20111204/29dde0b7/attachment.htm
More information about the Squeak-dev
mailing list
|