Pharo-dev
By thread
pharo-dev@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
November 2012
- 98 participants
- 1194 messages
Re: [Pharo-project] [update 2.0] #20404
by Pavel Krivanek
On Sat, Nov 17, 2012 at 9:12 PM, Marcus Denker <marcus.denker(a)inria.fr> wrote:
> 20404
> -----
>
> Issue 6994: move DisplayScreen >> #defaultCanvasClass to Morphic
> http://code.google.com/p/pharo/issues/detail?id=6994
This fix has very interesting consequence when loading Morphic.
Because when the Morphic package is loaded, it firstly loads
Form>>#defaultCanvasClass that calls "Display defaultCanvasClass". But
Display is a Form too so before the DisplayScreen implementation
(^FormCanvas) is loaded too, it can lead and leads to infinite
recursion.
-- Pavel
>
> Issue 6993: update Pharo Kernel generation
> http://code.google.com/p/pharo/issues/detail?id=6993
>
> Issue 6991: Move #cleanUpForProduction to its own class
> http://code.google.com/p/pharo/issues/detail?id=6991
>
>
>
> Diff information:
> http://ss3.gemstone.com/ss/Pharo20/Tools-MarcusDenker.980.diff
> http://ss3.gemstone.com/ss/Pharo20/System-Support-MarcusDenker.735.diff
> http://ss3.gemstone.com/ss/Pharo20/Morphic-MarcusDenker.1284.diff
> http://ss3.gemstone.com/ss/Pharo20/Graphics-Display Objects-MarcusDenker.88.diff
>
> --
> Marcus Denker -- http://marcusdenker.de
>
>
Nov. 18, 2012
Re: [Pharo-project] Beeper
by Pavel Krivanek
Issue and slice created: http://code.google.com/p/pharo/issues/detail?id=6996
-- Pavel
On Sun, Nov 18, 2012 at 9:47 AM, Stéphane Ducasse
<stephane.ducasse(a)inria.fr> wrote:
>
>> Hi Stef,
>>
>> firstly I do not understand why we have SoundService at all when we
>> have AbstractSoundSystem.
>
> Yes me too :)
>
>> And why it is a AppRegistry. AppRegistry
>> associates some application, tool. It is very confusing to use it for
>> a sound provider. Then I do not understand why it is named
>> AbstractSoundSystem and not simply SoundSystem (remember
>> AbstractString).
>
> Yes let us clean all that :)
> Can you take the lead on that?
> We could include the sound package in the release.
>
>>
>> On Sat, Nov 17, 2012 at 9:33 PM, Stéphane Ducasse
>> <stephane.ducasse(a)inria.fr> wrote:
>>> Hi pavel
>>>
>>> In fact the registration default sound system is broken and we should fix it.
>>> I forgot what is the problem :)
>>>
>>>> Hi,
>>>>
>>>> I would like to discuss the Beeper class a little bit. The main
>>>> purpose of this class is to provide Beeper beep message and use
>>>> SoundService with respect to current sound enabled settings or VM
>>>> implemented primitive for beeping.
>>>
>>> Yes this was the idea and to remove it from smalltalk.
>>>
>>>> I think that we should:
>>>> - move the beep function to UIManager
>>>> - change all calls of Beeper beep to UIManager default beep
>>>> - in MorphicUIManager use classic Beeper implementation
>>>> - move Beeper to System-Sound package
>>>> - in default UIManager implementation use VM beep primitive
>>>
>>> Imagine an headless system without even ui (we did that in the microscopic kernel) and the only interaction
>>> we got at the beginning was to do beep. After we could write a file something.
>>> So moving beep to UI anything worries me.
>>
>> On my system the beep primitive does nothing so I use quitPrimitive
>> for that ;-)
>>
>>>
>>>> There are two main reasons for that. You surely do not want to listen
>>>> beeping server with Pharo images running remote UIs and I want to make
>>>> Pharo Kernel independent on SoundService.
>>>
>>> I see when we load the sound package beep is not using beep primitive but the associated sound.
>>> May be Beep should have a kind of call back system
>>> by default invoke its own primitive
>>> and when sound system is loaded it should invoke sound system via the call back
>>> I thought is was like that because I do not want to link sound to kernel that for sure.
>>>
>>>> What do you think?
>>>
>>> May be we should simply fix the behavior when adding sound service.
>>>
>>> Stef
>>>>
>>>> -- Pavel
>>>>
>>>
>>>
>>
>
>
Nov. 18, 2012
Re: [Pharo-project] [Pharo-Project] About new TxText text model
by Camillo Bruni
On 2012-11-14, at 17:36, Denis Kudriashov <dionisiydk(a)gmail.com> wrote:
> Hello.
>
> I look deep at TxText package where Igor and Camillo introduced new text
> model.
>
> Text model based on sequence of span objects. There are now two kind of
> spans: CharacterSpan and LineSeparator. Each span has reference to next and
> previous spans. There is TxSelection object which contains cursor. So you
> can insert new text at cursor, you can cut selection, replace selection
> with another text. Such maniulation changes text model structure. It can
> create new span objects. It can split current span at cursor position, It
> can remove selected spans. Also you can move cursor up, down, left, right.
> Cursor always know about current span and span position.
>
> I like design :). And I want use this package. And I have questions and
> suggestions:
>
> 1) Cursor is end of selection object. So now when you move cursor selection
> changed, because start of selection stay same. Am I right?
yes
> I think cursor movement should always reset selection. It is what we see
> with basic text editors.
> But cursor now is just instance of TxPosition which implements simple
> position protocol (move left, up...). It just change current span and span
> position by movement. TxPosition knows nothing about TxSelection object.
> That's why I think Cursor class should be introduced here which alway reset
> text selection by any move.
> And if you want to change selection bounds just get explicitly start or end
> of selection and use position api.
> What do you think?
Humm not so sure about this :). Your argument in favor of a default behavior
which conforms to other editors is definitely something to consider. In the
end it's not that much work to get the a decent default behavior. Somewhere
in the view where you modify the mode you can do `text selection collapse`.
If you want you can try to implement it ;) and we see how it feels to use
it that way (most probably I will be in favor then..)
> 2) Next question about changes notification of text model. First I want
> Cursor and Selection objects are annnouncers. So I can implement
> CursorPresenter and SelectionPresenter to show such objects and handle
> changes. For example when CursorMovedAnnouncement happen I can move cursor
> caret morph at appropriate position.
this sounds like a good idea! I don't remember if we replace/create new
instances of the cursors/selections... This might have an impact on where
you want to listen for changes. But definitely we want something like that
to decouple the model from any view.
> Another idea is make span objects announcers. Maybe it is not good idea but
> I want to subscribe at SpanAdded, SpanRemoved. SpanChanged, SpanSplitted.
> With such events I can make very simple implementation of TextEditor as
> list of SpanMorph's. Maybe it is not optimized solution but I think it is
> most simple thing. So I want to try it.
>
> 3) What about auto wrap behaviour?
> If you have auto wrap option at text editors you have line width
> restriction. And you should spit real lines of text to visual lines which
> satisfed this restriction. And text mode should know about such restriction
> because any text insertion can require new visual lines creation.
I don't think the basic model should know about the visual lines. We discussed
that for a while, but in the end that's purely a view on the basic model.
For instance if you want to get the insertion point when clicking on some
text view you have to take so many model-unrelated things into account
(global transformation, font sizes).
> I think insertion single line text at span position should be executed by
> special "restriction object". It should return new characters of span which
> satisfied that restriction. And it should return new span object (or just
> remains characters) which will present new visual lines. Then this "remains
> characters" should be inserted to next span at 0 position.
> When wrap behavior not needed "restriction object" just inserts new text
> into current characters at given position and returns result.
> If you agree about such logic please suggest good name for such
> "restriction object" and instance variable where it will placed (at TxModel
> I think)
>
> Ok, now what do you think about all this?
> I want implement all my suggestions. But first I want listen your opinions.
>
> Best regards,
> Denis
Nov. 18, 2012
Re: [Pharo-project] [NativeBoost] calls to munmap always fail on OS X 10.8.2
by Igor Stasenko
On 18 November 2012 11:16, Camillo Bruni <camillobruni(a)gmail.com> wrote:
> most probably this is fine, I would not know why mmap and munmap should use
> a different lookup...
>
the explanation is simple: i need to call mmap before finishing bootstrap phase
to allocate some memory for gate function and install it.
while for munmap it is no longer requirement, because gate is already there.
The gate function is needed to call any interpreter function which may
trigger GC (and therefore
relocate machine code).. like if function answers an address, which means
there is a call to instantiate fresh instance of NBExternalAddress,
which may trigger GC.
> On 2012-11-16, at 10:40, Max Leske <maxleske(a)gmail.com> wrote:
>
>> It seems I found a fix. I simply copied the code from the "mmap" call over to "munmap". Can somebody (Igor?) *please* confirm that this is ok to do? My tests are green but I'm really not sure about thisâ¦
>>
>> Here's the new code for NBMacExternalHeapManager>>unmap:length:
>>
>> NBMacExternalHeapManager >>unmap: addr length: len
>>
>> <primitive: #primitiveNativeCall module: #NativeBoostPlugin error: errorCode>
>>
>> "unmap memory page"
>>
>> ^ NBFFICallout
>> cdecl: #( int (uint addr, ulong len) )
>> emitCall: [:gen | | munmap |
>> munmap := NativeBoost forCurrentPlatform getGlobalSymbolPointer: 'munmap'.
>> gen asm mov: munmap asUImm32 to: gen asm EAX.
>> gen asm call: gen asm EAX
>> ]
>> options: #( - optDirectProxyFnAddress )
>>
>>
>> Cheers,
>> Max
>>
>>
>> On 16.11.2012, at 14:11, Max Leske <maxleske(a)gmail.com> wrote:
>>
>>> A followup on the munmap issue:
>>>
>>> I think it has something to do with how NativeBoost does the lookup. I looked at the way that "mmap" is called and noticed that the selector #getGlobalSymbolPointer: is being used. Resolving "munmap" with this selector succeeds while doing
>>>
>>> NativeBoost loadSymbol: 'munmap' aName fromModule: -2
>>>
>>> (which is what happens when the heap manager tries to call "munmap") results the stack trace shown below.
>>>
>>> I'll keep digging...
>>>
>>>
>>> On 15.11.2012, at 17:20, Max Leske <maxleske(a)gmail.com> wrote:
>>>
>>>> Hi
>>>>
>>>> When NativeBoost tries to call munmap to free a page (happens because a pointer I freed was the last reserved one in that page) it will throw a NBFFICalloutError (every time) because (I think) it can't find the symbol. I have absolutely no clue how to fix this so I'm in need of help.
>>>>
>>>> System: OS X 10.8.2
>>>> Image: 1.4
>>>> NativeBoost-Core: CamilloBruni.80 (Installed by using the latest NBInstaller)
>>>>
>>>> Cheers,
>>>> Max
>>>>
>>>> Here's the stack:
>>>>
>>>> 15 November 2012 5:04:23.895 pm
>>>>
>>>> VM: Mac OS - intel - 1082 - NBCoInterpreter NativeBoost-CogPlugin-IgorStasenko.14 uuid: da3a649c-e2b2-bd4c-aa2f-9c2ebdb2658a Oct 26 2012, StackToRegisterMappingCogit VMMaker-oscog-EstebanLorenzano.164 uuid: d77dee73-00f5-4d00-847b-00646b08329d Oct 26 2012, git://gitorious.org/cogvm/blessed.git Commit: 48af8595004fd0ec3a3ac6d44c3d7516a87981ca Date: 2012-10-24 16:56:20 +0200 By: Igor Stasenko <siguctua(a)gmail.com> Jenkins build #131
>>>> Image: Pharo1.4 [Latest update: #14457]
>>>>
>>>> NBFFICallout class>>signalError:
>>>> Receiver: NBFFICallout
>>>> Arguments and temporary variables:
>>>> errorCode: 1
>>>> Receiver's instance variables:
>>>> superclass: NBNativeCodeGen
>>>> methodDict: a MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc...
>>>> format: 148
>>>> instanceVariables: #('fnSpec' 'requestor' 'methodArgs' 'coercionMayFail' 'callI...etc...
>>>> organization: ('type aliases' aliasForType:)
>>>> ('accessing' anonSpec: callType: c...etc...
>>>> subclasses: {NBNativeFunctionGen}
>>>> name: #NBFFICallout
>>>> classPool: a Dictionary(#CustomErrorCodes->a Dictionary(600->'An instance of NB...etc...
>>>> sharedPools: nil
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Core-FFI'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode:
>>>> Receiver: NBFFICallout
>>>> Arguments and temporary variables:
>>>> aContext: NativeBoostMac32(NativeBoost)>>bootstrapLoadSymbol:ofLength:fromModul...etc...
>>>> aBlock: [:gen | gen useEmitCall; sender: sender; parseOptions: anOptions; cdecl...etc...
>>>> method: (NativeBoost>>#bootstrapLoadSymbol:ofLength:fromModule:into: "a Compile...etc...
>>>> lastError: 1
>>>> Receiver's instance variables:
>>>> superclass: NBNativeCodeGen
>>>> methodDict: a MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc...
>>>> format: 148
>>>> instanceVariables: #('fnSpec' 'requestor' 'methodArgs' 'coercionMayFail' 'callI...etc...
>>>> organization: ('type aliases' aliasForType:)
>>>> ('accessing' anonSpec: callType: c...etc...
>>>> subclasses: {NBNativeFunctionGen}
>>>> name: #NBFFICallout
>>>> classPool: a Dictionary(#CustomErrorCodes->a Dictionary(600->'An instance of NB...etc...
>>>> sharedPools: nil
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Core-FFI'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> NBFFICallout class>>cdecl:emitCall:options:
>>>> Receiver: NBFFICallout
>>>> Arguments and temporary variables:
>>>> functionSpec: #(#NBBootstrapUlong #(#byte #* #symbolName #, #long #symbolLen #,...etc...
>>>> aCallEmittingBlock: [:gen | gen proxy callFn: #ioLoadSymbol:OfLength:FromModule...etc...
>>>> anOptions: #(#- #optDirectProxyFnAddress #optAllowExternalAddressPtr)
>>>> sender: NativeBoostMac32(NativeBoost)>>bootstrapLoadSymbol:ofLength:fromModule:...etc...
>>>> Receiver's instance variables:
>>>> superclass: NBNativeCodeGen
>>>> methodDict: a MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc...
>>>> format: 148
>>>> instanceVariables: #('fnSpec' 'requestor' 'methodArgs' 'coercionMayFail' 'callI...etc...
>>>> organization: ('type aliases' aliasForType:)
>>>> ('accessing' anonSpec: callType: c...etc...
>>>> subclasses: {NBNativeFunctionGen}
>>>> name: #NBFFICallout
>>>> classPool: a Dictionary(#CustomErrorCodes->a Dictionary(600->'An instance of NB...etc...
>>>> sharedPools: nil
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Core-FFI'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> NativeBoostMac32(NativeBoost)>>bootstrapLoadSymbol:ofLength:fromModule:into:
>>>> Receiver: a NativeBoostMac32
>>>> Arguments and temporary variables:
>>>> symbolName: 'munmap'
>>>> symbolLen: 6
>>>> moduleHandle: -2
>>>> returnValueBuffer: #[0 0 0 0 0 0 0 0]
>>>> Receiver's instance variables:
>>>> bootstrapping: false
>>>> insideCallback: nil
>>>> callbackCounterAddr: @ 16r5F74000
>>>> extraRootsRegistry: a NBExtraRootsRegistry
>>>> rootsCell: @ 16r5F7402A
>>>> gateFunction: @ 16r5F74004
>>>> heap: a NBMacExternalHeapManager
>>>>
>>>> NativeBoostMac32(NativeBoost)>>loadSymbol:fromModule:
>>>> Receiver: a NativeBoostMac32
>>>> Arguments and temporary variables:
>>>> aSymbolName: 'munmap'
>>>> moduleName: -2
>>>> bytes: #[0 0 0 0 0 0 0 0]
>>>> module: -2
>>>> handle: nil
>>>> Receiver's instance variables:
>>>> bootstrapping: false
>>>> insideCallback: nil
>>>> callbackCounterAddr: @ 16r5F74000
>>>> extraRootsRegistry: a NBExtraRootsRegistry
>>>> rootsCell: @ 16r5F7402A
>>>> gateFunction: @ 16r5F74004
>>>> heap: a NBMacExternalHeapManager
>>>>
>>>> NativeBoostMac32(NativeBoostLinux32)>>loadSymbol:fromModule:
>>>> Receiver: a NativeBoostMac32
>>>> Arguments and temporary variables:
>>>> aSymbolName: 'munmap'
>>>> moduleName: -2
>>>> Receiver's instance variables:
>>>> bootstrapping: false
>>>> insideCallback: nil
>>>> callbackCounterAddr: @ 16r5F74000
>>>> extraRootsRegistry: a NBExtraRootsRegistry
>>>> rootsCell: @ 16r5F7402A
>>>> gateFunction: @ 16r5F74004
>>>> heap: a NBMacExternalHeapManager
>>>>
>>>> NativeBoost class>>loadSymbol:fromModule:
>>>> Receiver: NativeBoost
>>>> Arguments and temporary variables:
>>>> aSymbolName: 'munmap'
>>>> moduleName: -2
>>>> Receiver's instance variables:
>>>> superclass: Object
>>>> methodDict: a MethodDictionary(#CLibrary->(NativeBoost>>#CLibrary "a CompiledMe...etc...
>>>> format: 142
>>>> instanceVariables: #('bootstrapping' 'insideCallback' 'callbackCounterAddr' 'ex...etc...
>>>> organization: ('retrieving symbols' CLibrary VMModule ioLoadFunction:from: ioLo...etc...
>>>> subclasses: {NativeBoostLinux32. NativeBoostWin32}
>>>> name: #NativeBoost
>>>> classPool: a Dictionary(#Current->a NativeBoostMac32 #NBAnnouncer->an Announcer...etc...
>>>> sharedPools: an OrderedCollection(AJx86Registers NativeBoostConstants)
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Core'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> NBMacExternalHeapManager class(Object)>>nbGetSymbolAddress:module:
>>>> Receiver: NBMacExternalHeapManager
>>>> Arguments and temporary variables:
>>>> aName: 'munmap'
>>>> aModuleNameOrHandle: -2
>>>> addr: nil
>>>> Receiver's instance variables:
>>>> superclass: NBExternalHeapManager
>>>> methodDict: a MethodDictionary(#mapFlags->(NBMacExternalHeapManager>>#mapFlags ...etc...
>>>> format: 138
>>>> instanceVariables: nil
>>>> organization: ('as yet unclassified' mapFlags mmapLength:prot:flags:into: primA...etc...
>>>> subclasses: nil
>>>> name: #NBMacExternalHeapManager
>>>> classPool: nil
>>>> sharedPools: an OrderedCollection(NBMacConstants)
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Mac'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> [:gen |
>>>> fnAddress := requestor nbGetSymbolAddress: fnSpec functionName module: aModuleNameOrHandle.
>>>> fnAddress
>>>> ifNil: [self error: 'function unavailable'].
>>>> self optMayGC
>>>> ifTrue: [asm push: fnAddress asUImm32;
>>>> mov: NativeBoost callgateFunctionAddress asUImm32 to: EAX;
>>>> call: EAX]
>>>> ifFalse: [asm mov: fnAddress asUImm32 to: EAX;
>>>> call: EAX]] in NBFFICallout>>generateCall:module:
>>>> Receiver: a NBFFICallout
>>>> Arguments and temporary variables:
>>>> aModuleNameOrHandle: a NBFFICallout
>>>> fnAddress: -2
>>>> gen: #(nil)
>>>> Receiver's instance variables:
>>>> asm: an AJx86Assembler
>>>> proxy: a NBInterpreterProxy
>>>> options: a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc...
>>>> method: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)"...etc...
>>>> fnSpec: a NBFnSpec
>>>> requestor: NBMacExternalHeapManager
>>>> methodArgs: an OrderedCollection('addr' 'len')
>>>> coercionMayFail: true
>>>> callInfo: an AJCdeclCallInfo
>>>>
>>>> BlockClosure>>valueWithPossibleArgs:
>>>> Receiver: [:gen |
>>>> fnAddress := requestor nbGetSymbolAddress: fnSpec functionName module: aModuleNam...etc...
>>>> Arguments and temporary variables:
>>>> anArray: an Array(a NBFFICallout a NBInterpreterProxy an AJx86Assembler)
>>>> Receiver's instance variables:
>>>> outerContext: NBFFICallout>>generateCall:module:
>>>> startpc: 91
>>>> numArgs: 1
>>>>
>>>> [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}.
>>>> (self optEmitCall
>>>> or: [self optNoCleanup])
>>>> ifTrue: [call disableCleanup]] in [:call |
>>>> self optNoAlignment
>>>> ifTrue: [call alignment: 1].
>>>> self pushArguments.
>>>> coercionMayFail
>>>> ifTrue: [proxy ifFailedJumpTo: self failedLabel].
>>>> asm
>>>> decorateWith: 'FFI: performing a call'
>>>> during: [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}.
>>>> (self optEmitCall
>>>> or: [self optNoCleanup])
>>>> ifTrue: [call disableCleanup]]] in NBFFICallout>>generateInstructions:
>>>> Receiver: a NBFFICallout
>>>> Arguments and temporary variables:
>>>> aFunctionBodyBlock: an AJCdeclCallInfo
>>>> call: [:gen |
>>>> fnAddress := requestor nbGetSymbolAddress: fnSpec functionName m...etc...
>>>> Receiver's instance variables:
>>>> asm: an AJx86Assembler
>>>> proxy: a NBInterpreterProxy
>>>> options: a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc...
>>>> method: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)"...etc...
>>>> fnSpec: a NBFnSpec
>>>> requestor: NBMacExternalHeapManager
>>>> methodArgs: an OrderedCollection('addr' 'len')
>>>> coercionMayFail: true
>>>> callInfo: an AJCdeclCallInfo
>>>>
>>>> BlockClosure>>ensure:
>>>> Receiver: [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}.
>>>> (self optEmitCall
>>>> or: [...etc...
>>>> Arguments and temporary variables:
>>>> aBlock: [level := level - 1.
>>>> self
>>>> addInstruction: (AJInstructionDecoration n...etc...
>>>> complete: nil
>>>> returnValue: nil
>>>> Receiver's instance variables:
>>>> outerContext: [:call |
>>>> self optNoAlignment
>>>> ifTrue: [call alignment: 1].
>>>> sel...etc...
>>>> startpc: 155
>>>> numArgs: 0
>>>>
>>>> AJx86Assembler>>decorateWith:during:
>>>> Receiver: an AJx86Assembler
>>>> Arguments and temporary variables:
>>>> annotation: 'FFI: performing a call'
>>>> aBlock: [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}.
>>>> (self o...etc...
>>>> Receiver's instance variables:
>>>> instructions: <<error during printing>>
>>>>
>>>> [:call |
>>>> self optNoAlignment
>>>> ifTrue: [call alignment: 1].
>>>> self pushArguments.
>>>> coercionMayFail
>>>> ifTrue: [proxy ifFailedJumpTo: self failedLabel].
>>>> asm
>>>> decorateWith: 'FFI: performing a call'
>>>> during: [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}.
>>>> (self optEmitCall
>>>> or: [self optNoCleanup])
>>>> ifTrue: [call disableCleanup]]] in NBFFICallout>>generateInstructions:
>>>> Receiver: a NBFFICallout
>>>> Arguments and temporary variables:
>>>> aFunctionBodyBlock: an AJCdeclCallInfo
>>>> call: [:gen |
>>>> fnAddress := requestor nbGetSymbolAddress: fnSpec functionName m...etc...
>>>> Receiver's instance variables:
>>>> asm: an AJx86Assembler
>>>> proxy: a NBInterpreterProxy
>>>> options: a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc...
>>>> method: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)"...etc...
>>>> fnSpec: a NBFnSpec
>>>> requestor: NBMacExternalHeapManager
>>>> methodArgs: an OrderedCollection('addr' 'len')
>>>> coercionMayFail: true
>>>> callInfo: an AJCdeclCallInfo
>>>>
>>>> AJx86Assembler>>performingCall:in:
>>>> Receiver: an AJx86Assembler
>>>> Arguments and temporary variables:
>>>> ci: an AJCdeclCallInfo
>>>> aBlock: [:call |
>>>> self optNoAlignment
>>>> ifTrue: [call alignment: 1].
>>>> self push...etc...
>>>> Receiver's instance variables:
>>>> instructions: <<error during printing>>
>>>>
>>>> NBFFICallout>>foreignCall:
>>>> Receiver: a NBFFICallout
>>>> Arguments and temporary variables:
>>>> aBlock: [:call |
>>>> self optNoAlignment
>>>> ifTrue: [call alignment: 1].
>>>> self push...etc...
>>>> Receiver's instance variables:
>>>> asm: an AJx86Assembler
>>>> proxy: a NBInterpreterProxy
>>>> options: a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc...
>>>> method: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)"...etc...
>>>> fnSpec: a NBFnSpec
>>>> requestor: NBMacExternalHeapManager
>>>> methodArgs: an OrderedCollection('addr' 'len')
>>>> coercionMayFail: true
>>>> callInfo: an AJCdeclCallInfo
>>>>
>>>> NBFFICallout>>generateInstructions:
>>>> Receiver: a NBFFICallout
>>>> Arguments and temporary variables:
>>>> aFunctionBodyBlock: [:gen |
>>>> fnAddress := requestor nbGetSymbolAddress: fnSpec ...etc...
>>>> instructions: nil
>>>> Receiver's instance variables:
>>>> asm: an AJx86Assembler
>>>> proxy: a NBInterpreterProxy
>>>> options: a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc...
>>>> method: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)"...etc...
>>>> fnSpec: a NBFnSpec
>>>> requestor: NBMacExternalHeapManager
>>>> methodArgs: an OrderedCollection('addr' 'len')
>>>> coercionMayFail: true
>>>> callInfo: an AJCdeclCallInfo
>>>>
>>>> NBFFICallout>>generate:
>>>> Receiver: a NBFFICallout
>>>> Arguments and temporary variables:
>>>> aFunctionBodyBlock: [:gen |
>>>> fnAddress := requestor nbGetSymbolAddress: fnSpec ...etc...
>>>> generatedCode: nil
>>>> Receiver's instance variables:
>>>> asm: an AJx86Assembler
>>>> proxy: a NBInterpreterProxy
>>>> options: a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc...
>>>> method: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)"...etc...
>>>> fnSpec: a NBFnSpec
>>>> requestor: NBMacExternalHeapManager
>>>> methodArgs: an OrderedCollection('addr' 'len')
>>>> coercionMayFail: true
>>>> callInfo: an AJCdeclCallInfo
>>>>
>>>> NBFFICallout>>generateCall:module:
>>>> Receiver: a NBFFICallout
>>>> Arguments and temporary variables:
>>>> functionSpec: #(#int #munmap #(#uint #addr #, #ulong #len))
>>>> aModuleNameOrHandle: -2
>>>> fnAddress: #(nil)
>>>> Receiver's instance variables:
>>>> asm: an AJx86Assembler
>>>> proxy: a NBInterpreterProxy
>>>> options: a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc...
>>>> method: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)"...etc...
>>>> fnSpec: a NBFnSpec
>>>> requestor: NBMacExternalHeapManager
>>>> methodArgs: an OrderedCollection('addr' 'len')
>>>> coercionMayFail: true
>>>> callInfo: an AJCdeclCallInfo
>>>>
>>>> [:gen | gen sender: sender;
>>>> cdecl;
>>>> generateCall: functionSpec module: aModuleName] in NBFFICallout class>>cdecl:module:
>>>> Receiver: NBFFICallout
>>>> Arguments and temporary variables:
>>>> functionSpec: a NBFFICallout
>>>> aModuleName: #(#int #munmap #(#uint #addr #, #ulong #len))
>>>> sender: -2
>>>> gen: NBMacExternalHeapManager>>unmap:length:
>>>> Receiver's instance variables:
>>>> superclass: NBNativeCodeGen
>>>> methodDict: a MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc...
>>>> format: 148
>>>> instanceVariables: #('fnSpec' 'requestor' 'methodArgs' 'coercionMayFail' 'callI...etc...
>>>> organization: ('type aliases' aliasForType:)
>>>> ('accessing' anonSpec: callType: c...etc...
>>>> subclasses: {NBNativeFunctionGen}
>>>> name: #NBFFICallout
>>>> classPool: a Dictionary(#CustomErrorCodes->a Dictionary(600->'An instance of NB...etc...
>>>> sharedPools: nil
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Core-FFI'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> [bytes := aBlock
>>>> value: (self newForMethod: method)] in NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry:
>>>> Receiver: NBFFICallout
>>>> Arguments and temporary variables:
>>>> aBlock: [:gen | gen sender: sender;
>>>> cdecl;
>>>> generateCall: functionSpec mod...etc...
>>>> method: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)"...etc...
>>>> bytes: #(nil)
>>>> Receiver's instance variables:
>>>> superclass: NBNativeCodeGen
>>>> methodDict: a MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc...
>>>> format: 148
>>>> instanceVariables: #('fnSpec' 'requestor' 'methodArgs' 'coercionMayFail' 'callI...etc...
>>>> organization: ('type aliases' aliasForType:)
>>>> ('accessing' anonSpec: callType: c...etc...
>>>> subclasses: {NBNativeFunctionGen}
>>>> name: #NBFFICallout
>>>> classPool: a Dictionary(#CustomErrorCodes->a Dictionary(600->'An instance of NB...etc...
>>>> sharedPools: nil
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Core-FFI'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> BlockClosure>>on:do:
>>>> Receiver: [bytes := aBlock
>>>> value: (self newForMethod: method)]
>>>> Arguments and temporary variables:
>>>> exception: NBRecursionDetect
>>>> handlerAction: [:ex | ex check: aMethod]
>>>> handlerActive: true
>>>> Receiver's instance variables:
>>>> outerContext: NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry:...etc...
>>>> startpc: 96
>>>> numArgs: 0
>>>>
>>>> NBRecursionDetect class>>in:during:
>>>> Receiver: NBRecursionDetect
>>>> Arguments and temporary variables:
>>>> aMethod: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)...etc...
>>>> aBlock: [bytes := aBlock
>>>> value: (self newForMethod: method)]
>>>> Receiver's instance variables:
>>>> superclass: Notification
>>>> methodDict: a MethodDictionary(#check:->(NBRecursionDetect>>#check: "a Compiled...etc...
>>>> format: 144
>>>> instanceVariables: #('method')
>>>> organization: ('as yet unclassified' check: defaultAction method signalForMetho...etc...
>>>> subclasses: nil
>>>> name: #NBRecursionDetect
>>>> classPool: nil
>>>> sharedPools: nil
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Core-Errors'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry:
>>>> Receiver: NBFFICallout
>>>> Arguments and temporary variables:
>>>> aBlock: [:gen | gen sender: sender;
>>>> cdecl;
>>>> generateCall: functionSpec mod...etc...
>>>> retryCtx: NBMacExternalHeapManager>>unmap:length:
>>>> method: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)"...etc...
>>>> newMethod: nil
>>>> args: nil
>>>> bytes: #(nil)
>>>> Receiver's instance variables:
>>>> superclass: NBNativeCodeGen
>>>> methodDict: a MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc...
>>>> format: 148
>>>> instanceVariables: #('fnSpec' 'requestor' 'methodArgs' 'coercionMayFail' 'callI...etc...
>>>> organization: ('type aliases' aliasForType:)
>>>> ('accessing' anonSpec: callType: c...etc...
>>>> subclasses: {NBNativeFunctionGen}
>>>> name: #NBFFICallout
>>>> classPool: a Dictionary(#CustomErrorCodes->a Dictionary(600->'An instance of NB...etc...
>>>> sharedPools: nil
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Core-FFI'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode:
>>>> Receiver: NBFFICallout
>>>> Arguments and temporary variables:
>>>> aContext: NBMacExternalHeapManager>>unmap:length:
>>>> aBlock: [:gen | gen sender: sender;
>>>> cdecl;
>>>> generateCall: functionSpec mod...etc...
>>>> method: (NBMacExternalHeapManager>>#unmap:length: "a CompiledMethod(355205120)"...etc...
>>>> lastError: 502
>>>> Receiver's instance variables:
>>>> superclass: NBNativeCodeGen
>>>> methodDict: a MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc...
>>>> format: 148
>>>> instanceVariables: #('fnSpec' 'requestor' 'methodArgs' 'coercionMayFail' 'callI...etc...
>>>> organization: ('type aliases' aliasForType:)
>>>> ('accessing' anonSpec: callType: c...etc...
>>>> subclasses: {NBNativeFunctionGen}
>>>> name: #NBFFICallout
>>>> classPool: a Dictionary(#CustomErrorCodes->a Dictionary(600->'An instance of NB...etc...
>>>> sharedPools: nil
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Core-FFI'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> NBFFICallout class>>cdecl:module:
>>>> Receiver: NBFFICallout
>>>> Arguments and temporary variables:
>>>> functionSpec: #(#int #munmap #(#uint #addr #, #ulong #len))
>>>> aModuleName: -2
>>>> sender: NBMacExternalHeapManager>>unmap:length:
>>>> Receiver's instance variables:
>>>> superclass: NBNativeCodeGen
>>>> methodDict: a MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc...
>>>> format: 148
>>>> instanceVariables: #('fnSpec' 'requestor' 'methodArgs' 'coercionMayFail' 'callI...etc...
>>>> organization: ('type aliases' aliasForType:)
>>>> ('accessing' anonSpec: callType: c...etc...
>>>> subclasses: {NBNativeFunctionGen}
>>>> name: #NBFFICallout
>>>> classPool: a Dictionary(#CustomErrorCodes->a Dictionary(600->'An instance of NB...etc...
>>>> sharedPools: nil
>>>> environment: a SystemDictionary(lots of globals)
>>>> category: #'NativeBoost-Core-FFI'
>>>> traitComposition: {}
>>>> localSelectors: nil
>>>>
>>>> NBMacExternalHeapManager>>unmap:length:
>>>> Receiver: a NBMacExternalHeapManager
>>>> Arguments and temporary variables:
>>>> addr: 7380992
>>>> len: 32768
>>>> errorCode: 502
>>>> Receiver's instance variables:
>>>> pages: a Dictionary(24981504->a NBMemoryPage 100089856->a NBMemoryPage )
>>>> freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, 17, free) a NBMemoryB...etc...
>>>> reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( @ 16r17D3000, 38) 24981...etc...
>>>> sema: a Semaphore()
>>>>
>>>> NBMacExternalHeapManager>>primFreePage:
>>>> Receiver: a NBMacExternalHeapManager
>>>> Arguments and temporary variables:
>>>> aMemoryPage: a NBMemoryPage
>>>> res: nil
>>>> Receiver's instance variables:
>>>> pages: a Dictionary(24981504->a NBMemoryPage 100089856->a NBMemoryPage )
>>>> freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, 17, free) a NBMemoryB...etc...
>>>> reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( @ 16r17D3000, 38) 24981...etc...
>>>> sema: a Semaphore()
>>>>
>>>> NBMacExternalHeapManager(NBExternalHeapManager)>>freePage:
>>>> Receiver: a NBMacExternalHeapManager
>>>> Arguments and temporary variables:
>>>> aMemoryPage: a NBMemoryPage
>>>> Receiver's instance variables:
>>>> pages: a Dictionary(24981504->a NBMemoryPage 100089856->a NBMemoryPage )
>>>> freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, 17, free) a NBMemoryB...etc...
>>>> reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( @ 16r17D3000, 38) 24981...etc...
>>>> sema: a Semaphore()
>>>>
>>>> [:page |
>>>> page length = aMemoryBlock length
>>>> ifTrue: [self freePage: page.
>>>> ^ true].
>>>> nil] in NBMacExternalHeapManager(NBExternalHeapManager)>>checkForFreePage:
>>>> Receiver: a NBMacExternalHeapManager
>>>> Arguments and temporary variables:
>>>> aMemoryBlock: a NBMemoryPage
>>>> page: a NBMemoryBlock( @ 16r70A000, 32768, free)
>>>> Receiver's instance variables:
>>>> pages: a Dictionary(24981504->a NBMemoryPage 100089856->a NBMemoryPage )
>>>> freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, 17, free) a NBMemoryB...etc...
>>>> reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( @ 16r17D3000, 38) 24981...etc...
>>>> sema: a Semaphore()
>>>>
>>>> BlockClosure>>cull:
>>>> Receiver: [:page |
>>>> page length = aMemoryBlock length
>>>> ifTrue: [self freePage: page.
>>>> ^ true].
>>>> n...etc...
>>>> Arguments and temporary variables:
>>>> anArg: a NBMemoryPage
>>>> Receiver's instance variables:
>>>> outerContext: NBMacExternalHeapManager(NBExternalHeapManager)>>checkForFreePage...etc...
>>>> startpc: 41
>>>> numArgs: 1
>>>>
>>>> Dictionary>>at:ifPresent:
>>>> Receiver: a Dictionary(24981504->a NBMemoryPage 100089856->a NBMemoryPage )
>>>> Arguments and temporary variables:
>>>> key: 7380992
>>>> aBlock: [:page |
>>>> page length = aMemoryBlock length
>>>> ifTrue: [self freePage: p...etc...
>>>> assoc: 7380992->a NBMemoryPage
>>>> Receiver's instance variables:
>>>> tally: 2
>>>> array: an Array(nil 100089856->a NBMemoryPage nil nil 24981504->a NBMemoryPage)...etc...
>>>>
>>>> NBMacExternalHeapManager(NBExternalHeapManager)>>checkForFreePage:
>>>> Receiver: a NBMacExternalHeapManager
>>>> Arguments and temporary variables:
>>>> aMemoryBlock: a NBMemoryBlock( @ 16r70A000, 32768, free)
>>>> Receiver's instance variables:
>>>> pages: a Dictionary(24981504->a NBMemoryPage 100089856->a NBMemoryPage )
>>>> freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, 17, free) a NBMemoryB...etc...
>>>> reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( @ 16r17D3000, 38) 24981...etc...
>>>> sema: a Semaphore()
>>>>
>>>> NBMemoryBlock>>makeFreeFor:
>>>> Receiver: a NBMemoryBlock( @ 16r70A030, 32720, free)
>>>> Arguments and temporary variables:
>>>> heapManager: a NBMacExternalHeapManager
>>>> Receiver's instance variables:
>>>> left: a NBMemoryBlock( @ 16r70A000, 32768, free)
>>>> right: nil
>>>> address: 7381040
>>>> length: 32720
>>>> free: true
>>>>
>>>> [| block |
>>>> block := reservedBlocks
>>>> removeKey: address
>>>> ifAbsent: [self error: 'Unable to find a memory block with given address'].
>>>> block makeFreeFor: self] in NBMacExternalHeapManager(NBExternalHeapManager)>>free:
>>>> Receiver: a NBMacExternalHeapManager
>>>> Arguments and temporary variables:
>>>> address: 7381040
>>>> block: a NBMemoryBlock( @ 16r70A030, 32720, free)
>>>> Receiver's instance variables:
>>>> pages: a Dictionary(24981504->a NBMemoryPage 100089856->a NBMemoryPage )
>>>> freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, 17, free) a NBMemoryB...etc...
>>>> reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( @ 16r17D3000, 38) 24981...etc...
>>>> sema: a Semaphore()
>>>>
>>>> [caught := true.
>>>> self wait.
>>>> blockValue := mutuallyExcludedBlock value] in Semaphore>>critical:
>>>> Receiver: a Semaphore()
>>>> Arguments and temporary variables:
>>>> <<error during printing>
>>>> Receiver's instance variables:
>>>> firstLink: nil
>>>> lastLink: nil
>>>> excessSignals: 0
>>>>
>>>> BlockClosure>>ensure:
>>>> Receiver: [caught := true.
>>>> self wait.
>>>> blockValue := mutuallyExcludedBlock value]
>>>> Arguments and temporary variables:
>>>> aBlock: [caught
>>>> ifTrue: [self signal]]
>>>> complete: nil
>>>> returnValue: nil
>>>> Receiver's instance variables:
>>>> outerContext: Semaphore>>critical:
>>>> startpc: 42
>>>> numArgs: 0
>>>>
>>>> Semaphore>>critical:
>>>> Receiver: a Semaphore()
>>>> Arguments and temporary variables:
>>>> <<error during printing>
>>>> Receiver's instance variables:
>>>> firstLink: nil
>>>> lastLink: nil
>>>> excessSignals: 0
>>>>
>>>> NBMacExternalHeapManager(NBExternalHeapManager)>>free:
>>>> Receiver: a NBMacExternalHeapManager
>>>> Arguments and temporary variables:
>>>> address: 7381040
>>>> Receiver's instance variables:
>>>> pages: a Dictionary(24981504->a NBMemoryPage 100089856->a NBMemoryPage )
>>>> freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, 17, free) a NBMemoryB...etc...
>>>> reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( @ 16r17D3000, 38) 24981...etc...
>>>> sema: a Semaphore()
>>>>
>>>>
>>>> --- The full stack ---
>>>> NBFFICallout class>>signalError:
>>>> NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode:
>>>> NBFFICallout class>>cdecl:emitCall:options:
>>>> NativeBoostMac32(NativeBoost)>>bootstrapLoadSymbol:ofLength:fromModule:into:
>>>> NativeBoostMac32(NativeBoost)>>loadSymbol:fromModule:
>>>> NativeBoostMac32(NativeBoostLinux32)>>loadSymbol:fromModule:
>>>> NativeBoost class>>loadSymbol:fromModule:
>>>> NBMacExternalHeapManager class(Object)>>nbGetSymbolAddress:module:
>>>> [:gen |
>>>> fnAddress := requestor nbGetSymbolAddress: fnSpec functionName module: aModuleNameOrHandle.
>>>> fnAddress
>>>> ifNil: [self error: 'function unavailable'].
>>>> self optMayGC
>>>> ifTrue: [asm push: fnAddress asUImm32;
>>>> mov: NativeBoost callgateFunctionAddress asUImm32 to: EAX;
>>>> call: EAX]
>>>> ifFalse: [asm mov: fnAddress asUImm32 to: EAX;
>>>> call: EAX]] in NBFFICallout>>generateCall:module:
>>>> BlockClosure>>valueWithPossibleArgs:
>>>> [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}.
>>>> (self optEmitCall
>>>> or: [self optNoCleanup])
>>>> ifTrue: [call disableCleanup]] in [:call |
>>>> self optNoAlignment
>>>> ifTrue: [call alignment: 1].
>>>> self pushArguments.
>>>> coercionMayFail
>>>> ifTrue: [proxy ifFailedJumpTo: self failedLabel].
>>>> asm
>>>> decorateWith: 'FFI: performing a call'
>>>> during: [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}.
>>>> (self optEmitCall
>>>> or: [self optNoCleanup])
>>>> ifTrue: [call disableCleanup]]] in NBFFICallout>>generateInstructions:
>>>> BlockClosure>>ensure:
>>>> AJx86Assembler>>decorateWith:during:
>>>> [:call |
>>>> self optNoAlignment
>>>> ifTrue: [call alignment: 1].
>>>> self pushArguments.
>>>> coercionMayFail
>>>> ifTrue: [proxy ifFailedJumpTo: self failedLabel].
>>>> asm
>>>> decorateWith: 'FFI: performing a call'
>>>> during: [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}.
>>>> (self optEmitCall
>>>> or: [self optNoCleanup])
>>>> ifTrue: [call disableCleanup]]] in NBFFICallout>>generateInstructions:
>>>> AJx86Assembler>>performingCall:in:
>>>> NBFFICallout>>foreignCall:
>>>> NBFFICallout>>generateInstructions:
>>>> NBFFICallout>>generate:
>>>> NBFFICallout>>generateCall:module:
>>>> [:gen | gen sender: sender;
>>>> cdecl;
>>>> generateCall: functionSpec module: aModuleName] in NBFFICallout class>>cdecl:module:
>>>> [bytes := aBlock
>>>> value: (self newForMethod: method)] in NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry:
>>>> BlockClosure>>on:do:
>>>> NBRecursionDetect class>>in:during:
>>>> NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry:
>>>> NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode:
>>>> NBFFICallout class>>cdecl:module:
>>>> NBMacExternalHeapManager>>unmap:length:
>>>> NBMacExternalHeapManager>>primFreePage:
>>>> NBMacExternalHeapManager(NBExternalHeapManager)>>freePage:
>>>> [:page |
>>>> page length = aMemoryBlock length
>>>> ifTrue: [self freePage: page.
>>>> ^ true].
>>>> nil] in NBMacExternalHeapManager(NBExternalHeapManager)>>checkForFreePage:
>>>> BlockClosure>>cull:
>>>> Dictionary>>at:ifPresent:
>>>> NBMacExternalHeapManager(NBExternalHeapManager)>>checkForFreePage:
>>>> NBMemoryBlock>>makeFreeFor:
>>>> [| block |
>>>> block := reservedBlocks
>>>> removeKey: address
>>>> ifAbsent: [self error: 'Unable to find a memory block with given address'].
>>>> block makeFreeFor: self] in NBMacExternalHeapManager(NBExternalHeapManager)>>free:
>>>> [caught := true.
>>>> self wait.
>>>> blockValue := mutuallyExcludedBlock value] in Semaphore>>critical:
>>>> BlockClosure>>ensure:
>>>> Semaphore>>critical:
>>>> NBMacExternalHeapManager(NBExternalHeapManager)>>free:
>>>> - - - - - - - - - - - - - - -
>>>> - - - - - - - - - - - - - - - - - -
>>>> NativeBoostMac32(NativeBoostLinux32)>>free:
>>>> NativeBoost class>>free:
>>>> NBExternalAddress>>free
>>>> [:pointer | pointer value free] in LimboCommand>>freePointers
>>>> Set>>do:
>>>> LimboCommand>>freePointers
>>>> [self freePointers] in LimboCommand>>run
>>>> BlockClosure>>ensure:
>>>> LimboCommand>>run
>>>> Limbo>>run:arguments:
>>>> Limbo>>runSh:
>>>> Limbo class>>runSh:
>>>> [limbo := Limbo runSh: '/bin/echo ' , arg] in LimboTest>>testShellCommandWithNewLines
>>>> [aBlock value.
>>>> false] in LimboTest(TestCase)>>executeShould:inScopeOf:
>>>> BlockClosure>>on:do:
>>>> LimboTest(TestCase)>>executeShould:inScopeOf:
>>>> LimboTest(TestCase)>>shouldnt:raise:
>>>> LimboTest>>testShellCommandWithNewLines
>>>> LimboTest(TestCase)>>performTest
>>>> [self setUp.
>>>> self performTest] in LimboTest(TestCase)>>runCase
>>>> BlockClosure>>ensure:
>>>> LimboTest(TestCase)>>runCase
>>>> [(self class selector: testSelector) runCase] in LimboTest(TestCase)>>debug
>>>> BlockClosure>>ensure:
>>>> LimboTest(TestCase)>>debug
>>>> OBCmdRunTests>>execute
>>>> [:each |
>>>> (each isActive
>>>> and: [each isEnabled])
>>>> ifTrue: [each execute.
>>>> ^ true].
>>>> nil] in OBNodeCommandScan(OBCommandScan)>>processKeystroke:withNode:for:
>>>> OrderedCollection>>do:
>>>> OBNodeCommandScan(OBCommandScan)>>processKeystroke:withNode:for:
>>>> [:each |
>>>> (scan
>>>> processKeystroke: aCharacter asKeystroke
>>>> withNode: each
>>>> for: self)
>>>> ifTrue: [^ self].
>>>> nil] in OBColumn>>keystroke:from:
>>>> OrderedCollection>>reverseDo:
>>>> OBColumn>>keystroke:from:
>>>> OBPluggableListMorph(PluggableListMorph)>>modifierKeyPressed:
>>>> OBPluggableListMorph(PluggableListMorph)>>keyStroke:
>>>> OBPluggableListMorph(Morph)>>handleKeystroke:
>>>> KeyboardEvent>>sentTo:
>>>> OBPluggableListMorph(Morph)>>handleEvent:
>>>> MorphicEventDispatcher>>dispatchDefault:with:
>>>> MorphicEventDispatcher>>dispatchEvent:with:
>>>> OBPluggableListMorph(Morph)>>processEvent:using:
>>>> OBPluggableListMorph(Morph)>>processEvent:
>>>> OBPluggableListMorph(PluggableListMorph)>>handleFocusEvent:
>>>> [ActiveHand := self.
>>>> ActiveEvent := anEvent.
>>>> result := focusHolder
>>>> handleFocusEvent: (anEvent
>>>> transformedBy: (focusHolder transformedFrom: self))] in HandMorph>>sendFocusEvent:to:clear:
>>>> [aBlock value] in PasteUpMorph>>becomeActiveDuring:
>>>> BlockClosure>>on:do:
>>>> PasteUpMorph>>becomeActiveDuring:
>>>> HandMorph>>sendFocusEvent:to:clear:
>>>> HandMorph>>sendEvent:focus:clear:
>>>> HandMorph>>sendKeyboardEvent:
>>>> HandMorph>>handleEvent:
>>>> HandMorph>>processEvents
>>>> [:h |
>>>> ActiveHand := h.
>>>> h processEvents.
>>>> ActiveHand := nil] in WorldState>>doOneCycleNowFor:
>>>> Array(SequenceableCollection)>>do:
>>>> WorldState>>handsDo:
>>>> WorldState>>doOneCycleNowFor:
>>>> WorldState>>doOneCycleFor:
>>>> PasteUpMorph>>doOneCycle
>>>> [[World doOneCycle.
>>>> Processor yield.
>>>> false] whileFalse.
>>>> nil] in MorphicUIManager>>spawnNewProcess
>>>> [self value.
>>>> Processor terminateActive] in BlockClosure>>newProcess
>>>>
>>>
>>
>>
>
>
--
Best regards,
Igor Stasenko.
Nov. 18, 2012
Re: [Pharo-project] [NativeBoost] calls to munmap always fail on OS X 10.8.2
by Max Leske
Awesome, thanks Igor!
I'll let you know if it works for me.
Cheers,
Max
On 18.11.2012, at 17:14, Igor Stasenko <siguctua(a)gmail.com> wrote:
> On 18 November 2012 12:54, Igor Stasenko <siguctua(a)gmail.com> wrote:
>> On 18 November 2012 12:41, Igor Stasenko <siguctua(a)gmail.com> wrote:
>>> Try loading
>>> NativeBoost-Mac-IgorStasenko.7
>>> (and do NBMacConstants initialize, and then restart the image)
>>> see if it will fix the issue.
>>>
>> oh wait. this won't work..
>> i really don't like to use signed values for arguments..
>>
> okay, this one should do the work:
>
> Name: NativeBoost-Core-IgorStasenko.78
> Author: IgorStasenko
> Time: 18 November 2012, 5:11:19.289 pm
> UUID: 749eb374-06d6-480d-8aeb-6de80c89ce33
> Ancestors: NativeBoost-Core-IgorStasenko.77
>
> - use 32-bit complement for negative values in loadModule function.
>
> (oops.. comment is a bit wrong, it is not loadModule, but loadSymbol..,
> but i already commited the code )
>
> There is no need for any changes in mac constants (it is better to
> keep them negative for future
> 64 bit compliance)
>
> --
> Best regards,
> Igor Stasenko.
>
Nov. 18, 2012
Re: [Pharo-project] [NativeBoost] calls to munmap always fail on OS X 10.8.2
by Igor Stasenko
On 18 November 2012 12:54, Igor Stasenko <siguctua(a)gmail.com> wrote:
> On 18 November 2012 12:41, Igor Stasenko <siguctua(a)gmail.com> wrote:
>> Try loading
>> NativeBoost-Mac-IgorStasenko.7
>> (and do NBMacConstants initialize, and then restart the image)
>> see if it will fix the issue.
>>
> oh wait. this won't work..
> i really don't like to use signed values for arguments..
>
okay, this one should do the work:
Name: NativeBoost-Core-IgorStasenko.78
Author: IgorStasenko
Time: 18 November 2012, 5:11:19.289 pm
UUID: 749eb374-06d6-480d-8aeb-6de80c89ce33
Ancestors: NativeBoost-Core-IgorStasenko.77
- use 32-bit complement for negative values in loadModule function.
(oops.. comment is a bit wrong, it is not loadModule, but loadSymbol..,
but i already commited the code )
There is no need for any changes in mac constants (it is better to
keep them negative for future
64 bit compliance)
--
Best regards,
Igor Stasenko.
Nov. 18, 2012
Re: [Pharo-project] [NativeBoost] calls to munmap always fail on OS X 10.8.2
by Igor Stasenko
On 18 November 2012 12:41, Igor Stasenko <siguctua(a)gmail.com> wrote:
> Try loading
> NativeBoost-Mac-IgorStasenko.7
> (and do NBMacConstants initialize, and then restart the image)
> see if it will fix the issue.
>
oh wait. this won't work..
i really don't like to use signed values for arguments..
--
Best regards,
Igor Stasenko.
Nov. 18, 2012
Re: [Pharo-project] [NativeBoost] calls to munmap always fail on OS X 10.8.2
by Igor Stasenko
Try loading
NativeBoost-Mac-IgorStasenko.7
(and do NBMacConstants initialize, and then restart the image)
see if it will fix the issue.
On 18 November 2012 12:35, Igor Stasenko <siguctua(a)gmail.com> wrote:
> On 16 November 2012 10:11, Max Leske <maxleske(a)gmail.com> wrote:
>> A followup on the munmap issue:
>>
>> I think it has something to do with how NativeBoost does the lookup. I looked at the way that "mmap" is called and noticed that the selector #getGlobalSymbolPointer: is being used. Resolving "munmap" with this selector succeeds while doing
>>
>> NativeBoost loadSymbol: 'munmap' aName fromModule: -2
>>
>> (which is what happens when the heap manager tries to call "munmap") results the stack trace shown below.
>>
>> I'll keep digging...
>>
>
> -2 corresponds to RTLD_DEFAULT on macs..
> which i find a bit strange, because on linuxes it is 0. nevertheless,
> i discovered it when making mac-os port for NB.
>
> I doubt, but who knows, maybe it is redefined to 0 in 10.8.x
> i am using 10.7 version so i cannot tell.
>
> btw, can you tell us, what exactly error is signaled? inspect the
> exception object, or just evaluate
> 'self description' for exception..
>
>
> Okay, it looks like i know what happens.. if you do
>
> NativeBoost loadSymbol: 'munmap' fromModule: 0
> or
> NativeBoost loadSymbol: 'munmap' fromModule: 16rFFFFFFFE
> it prints
> @ 16r9ACD2A26
> but if you do
>
> NativeBoost loadSymbol: 'munmap' fromModule: -2
>
> it fails the call.. and i know why, because function signature in
> #bootstrapLoadSymbol:ofLength:fromModule:into:
> expects 'ulong moduleHandle' which is unsigned 32 bit int,
> while we passing something not really unsigned..
> because it makes a call to #positive32BitValueOf: interpreter function
> which fails the primitive.
>
> so, a fix would be to change -2 to 16rFFFFFFFE.
>
> It appears that after putting order in type conversions, i made it
> more strict, and now
> passing negative values, where only positive expected is punished violently :)
>
> It is in NBMacConstants method.
>
> --
> Best regards,
> Igor Stasenko.
--
Best regards,
Igor Stasenko.
Nov. 18, 2012
Re: [Pharo-project] [NativeBoost] calls to munmap always fail on OS X 10.8.2
by Igor Stasenko
On 16 November 2012 10:11, Max Leske <maxleske(a)gmail.com> wrote:
> A followup on the munmap issue:
>
> I think it has something to do with how NativeBoost does the lookup. I looked at the way that "mmap" is called and noticed that the selector #getGlobalSymbolPointer: is being used. Resolving "munmap" with this selector succeeds while doing
>
> NativeBoost loadSymbol: 'munmap' aName fromModule: -2
>
> (which is what happens when the heap manager tries to call "munmap") results the stack trace shown below.
>
> I'll keep digging...
>
-2 corresponds to RTLD_DEFAULT on macs..
which i find a bit strange, because on linuxes it is 0. nevertheless,
i discovered it when making mac-os port for NB.
I doubt, but who knows, maybe it is redefined to 0 in 10.8.x
i am using 10.7 version so i cannot tell.
btw, can you tell us, what exactly error is signaled? inspect the
exception object, or just evaluate
'self description' for exception..
Okay, it looks like i know what happens.. if you do
NativeBoost loadSymbol: 'munmap' fromModule: 0
or
NativeBoost loadSymbol: 'munmap' fromModule: 16rFFFFFFFE
it prints
@ 16r9ACD2A26
but if you do
NativeBoost loadSymbol: 'munmap' fromModule: -2
it fails the call.. and i know why, because function signature in
#bootstrapLoadSymbol:ofLength:fromModule:into:
expects 'ulong moduleHandle' which is unsigned 32 bit int,
while we passing something not really unsigned..
because it makes a call to #positive32BitValueOf: interpreter function
which fails the primitive.
so, a fix would be to change -2 to 16rFFFFFFFE.
It appears that after putting order in type conversions, i made it
more strict, and now
passing negative values, where only positive expected is punished violently :)
It is in NBMacConstants method.
--
Best regards,
Igor Stasenko.
Nov. 18, 2012
[Pharo-project] [Issue Tracker] Status
by Marcus Denker
- Open issues: 385
http://code.google.com/p/pharo/issues/list?can=2
- Tagged for 2.0: 133
http://code.google.com/p/pharo/issues/list?can=2&q=milestone%3D2.0
- Tagged for 1.4: 21
http://code.google.com/p/pharo/issues/list?can=2&q=milestone%3D1.4
Issues with solution that need to be reviewed: 4
http://code.google.com/p/pharo/issues/list?can=2&q=status=HumanReviewNeeded
Failing Tests: 4
http://code.google.com/p/pharo/issues/list?can=2&q=status=FailingTest
--
Marcus Denker -- http://marcusdenker.de
Nov. 18, 2012