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] [NativeBoost] calls to munmap always fail on OS X 10.8.2
by Camillo Bruni
most probably this is fine, I would not know why mmap and munmap should use
a different lookup...
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
>>>
>>
>
>
Nov. 18, 2012
[Pharo-project] [update 2.0] #20406
by Marcus Denker
20406
-----
Issue 6995: remove TextStyle class>>#initDefaultFontsAndStyle
http://code.google.com/p/pharo/issues/detail?id=6995
Issue 6482: switch to fullscreen is dependent on Morphic
http://code.google.com/p/pharo/issues/detail?id=6482
Diff information:
http://ss3.gemstone.com/ss/Pharo20/Text-MarcusDenker.36.diff
http://ss3.gemstone.com/ss/Pharo20/Graphics-Display Objects-MarcusDenker.90.diff
--
Marcus Denker -- http://marcusdenker.de
Nov. 18, 2012
Re: [Pharo-project] [update 2.0] #20405
by Marcus Denker
On Nov 17, 2012, at 6:12 PM, Pavel Krivanek <pavel.krivanek(a)gmail.com> wrote:
> Thank you, Marcus, we reduced Undeclared in Pharo Kernel to:
>
Very good!
> WorldState
> - UIManager->#request:regex:
> World
> - DisplayScreen->#fullscreen:
> - ExternalDropHandler class->#defaultImageHandler
> - ExternalDropHandler class->#registerStandardExternalDropHandlers
> MIMEType
> - FileSystemStore->#mimeTypesAt:
> SoundService
> - Beeper->#play
> - Beeper class->#beepPrimitive
> ZnMimeType
> - SmalltalkImage->#sourcesDownloadClient
> PragmaCollector
> - SystemAnnouncer class->#restoreAllNotifications
> ImageReadWriter
> - Form class->#fromBinaryStream:
> StrikeFont
> - TextStyle class->#initDefaultFontsAndStyle
> TestCase
> - ClassDescription->#correspondingForTest
> ZnClient
> - ByteTextConverter class->#parseUnicodeOrgSpec:
> - CombinedChar class->#loadCompositionMapping
> - SmalltalkImage->#sourcesDownloadClient
>
> -- Pavel
>
> On Sat, Nov 17, 2012 at 9:36 PM, Marcus Denker <marcus.denker(a)inria.fr> wrote:
>> 20405
>> -----
>>
>> Issue 6978: UpdateStreamer and UpdateStreamerTest should be in own packages
>> http://code.google.com/p/pharo/issues/detail?id=6978
>>
>> Issue 6977: Move LoadUpdatesCommandLineHandler close to UpdateStreamer
>> http://code.google.com/p/pharo/issues/detail?id=6977
>>
>> Issue 6967: move TestRunnerCommandLineHandler into HudsonBuildTools20
>> http://code.google.com/p/pharo/issues/detail?id=6967
>>
>> Issue 6993: update Pharo Kernel generation
>> http://code.google.com/p/pharo/issues/detail?id=6993
>>
>>
>> Diff information:
>> http://ss3.gemstone.com/ss/Pharo20/Tests-MarcusDenker.481.diff
>> http://ss3.gemstone.com/ss/Pharo20/UpdateStreamer-Core-MarcusDenker.2.diff
>> http://ss3.gemstone.com/ss/Pharo20/UpdateStreamer-Tests-MarcusDenker.2.diff
>> http://ss3.gemstone.com/ss/Pharo20/System-Support-MarcusDenker.737.diff
>> http://ss3.gemstone.com/ss/Pharo20/System-CommandLine-MarcusDenker.61.diff
>> http://ss3.gemstone.com/ss/Pharo20/System-Changes-MarcusDenker.191.diff
>> http://ss3.gemstone.com/ss/Pharo20/HudsonBuildTools20-MarcusDenker.9.diff
>>
>> --
>> Marcus Denker -- http://marcusdenker.de
>>
>>
>
--
Marcus Denker -- http://marcusdenker.de
Nov. 18, 2012
Re: [Pharo-project] Beeper
by Stéphane Ducasse
> 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] about sharing class binding and others
by Igor Stasenko
On 17 November 2012 09:12, Camillo Bruni <camillobruni(a)gmail.com> wrote:
> This is what Pinocchio had, resolving classes was done by looking them up
> in the current environment (so basically the Class name is just a code
> macro). This way we could add simple class scopes without too much effort.
>
> I guess that would make the following code example a bit more complicated:
>
>
> oldDictClass := Dictionary.
> Dictionary := SmallDictionary.
>
> dict := Dictionary new.
>
> Dictionary := oldDictClass
>
> self assert: (dict isKindOf: SmallDictionary).
>
why complicated?
and you need is to translate
<global>
to:
self class environmentAt: #<global>
and
<global> := value
to
self class environmentAt: #<global> put: value.
this is very simple to do.
>
> but this is a rather bad feature in my eyes ;)
>
globals is not good, i agree.. but if you think about them as
'anything which you need to access outside direct method scope', then
you need it and it is not bad idea at all.
To me, there's no much difference between global vars or class/pool vars.
The main dividing line , imo is the method scope:
if variable are not defined in scope of method itself (temps,
arguments etc) then it
should be delegated to class in order to resolve it (yes, including ivars).
The class then can figure, if such name is 'visible' in its scope, as
well as provide a ways to access it,
by instructing encoder to inject appropriate AST nodes, i.e.
'macro-expanding accessors' to these variables.
This could lead to some limitations, of course, because of late-bound
semantics, you won't be able to decompile the method's bytecode and
show the source code which accessing variable 'Foo',
because it will decompile to message send(s). But that is IMO not a big deal.
And to mitigate the overhead of late-binding, we can use literals
(Foo->value) as cache:
class can decide that in order to access value of variable named
'Foo', a compiler should produce following:
(<Foo binding literal>) ifNil: [ <Foo binding literal> := self class
environmentAt: #Foo ]
like that, once cache filled, the overhead can be reduced to simple nil check.
Similar approach is to just put a special 'binding' object into
method's literal, and then simply send #value, or #value: message to
it for accessing its value. The semantics of getting/setting the value
then can be encapsulated inside of behavior of this 'binding'
object(s).
And this even friendlier to decompiler: you can simply check if given
literal is special kind of 'binding object', and then decompile it
appropriately, as well as you don't need to instruct compiler to
encode complex ASTs for accessing the literal value.
> On 2012-11-17, at 07:24, Fernando Olivero <fernando.olivero(a)usi.ch> wrote:
>
>> I love Marcus idea, classes aren't globals any more, and to access them is
>> simply another message send to a receiver: the environment. ( like the
>> lobby in Self ) .
>>
>> Fernando
>>
>>
>> On Sat, Nov 17, 2012 at 8:56 AM, Stéphane Ducasse <stephane.ducasse(a)inria.fr
>>> wrote:
>>
>>>> The alternative to the current scheme would be to not hard-code the
>>> class at all in the method at compile time.
>>>>
>>>> Instead of looking up the class and compiling the shared literal
>>> association, we could compile a message send
>>>> to the current environment.
>>>>
>>>> self class environment at: #NameOfClass
>>>>
>>>> And it should be noted that this could be evaluated at Jit-compile
>>> time... the same is true for ivar offsets. There
>>>> is no reason why these should be visible at the image level. The image
>>> could talk about names and let the runtime
>>>> translator infrastucture do the lookups needed for making a static
>>> version that is fast.
>>>
>>> Yes I would like to measure that too.
>>> My benchmarks were to measure the worse case where we have to manually
>>> update the methods each time the class is modified.
>>>
>>>
>>>
>
>
--
Best regards,
Igor Stasenko.
Nov. 18, 2012
Re: [Pharo-project] Beeper
by Pavel Krivanek
Hi Stef,
firstly I do not understand why we have SoundService at all when we
have AbstractSoundSystem. 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).
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. 17, 2012
Re: [Pharo-project] [update 2.0] #20405
by Pavel Krivanek
Thank you, Marcus, we reduced Undeclared in Pharo Kernel to:
WorldState
- UIManager->#request:regex:
World
- DisplayScreen->#fullscreen:
- ExternalDropHandler class->#defaultImageHandler
- ExternalDropHandler class->#registerStandardExternalDropHandlers
MIMEType
- FileSystemStore->#mimeTypesAt:
SoundService
- Beeper->#play
- Beeper class->#beepPrimitive
ZnMimeType
- SmalltalkImage->#sourcesDownloadClient
PragmaCollector
- SystemAnnouncer class->#restoreAllNotifications
ImageReadWriter
- Form class->#fromBinaryStream:
StrikeFont
- TextStyle class->#initDefaultFontsAndStyle
TestCase
- ClassDescription->#correspondingForTest
ZnClient
- ByteTextConverter class->#parseUnicodeOrgSpec:
- CombinedChar class->#loadCompositionMapping
- SmalltalkImage->#sourcesDownloadClient
-- Pavel
On Sat, Nov 17, 2012 at 9:36 PM, Marcus Denker <marcus.denker(a)inria.fr> wrote:
> 20405
> -----
>
> Issue 6978: UpdateStreamer and UpdateStreamerTest should be in own packages
> http://code.google.com/p/pharo/issues/detail?id=6978
>
> Issue 6977: Move LoadUpdatesCommandLineHandler close to UpdateStreamer
> http://code.google.com/p/pharo/issues/detail?id=6977
>
> Issue 6967: move TestRunnerCommandLineHandler into HudsonBuildTools20
> http://code.google.com/p/pharo/issues/detail?id=6967
>
> Issue 6993: update Pharo Kernel generation
> http://code.google.com/p/pharo/issues/detail?id=6993
>
>
> Diff information:
> http://ss3.gemstone.com/ss/Pharo20/Tests-MarcusDenker.481.diff
> http://ss3.gemstone.com/ss/Pharo20/UpdateStreamer-Core-MarcusDenker.2.diff
> http://ss3.gemstone.com/ss/Pharo20/UpdateStreamer-Tests-MarcusDenker.2.diff
> http://ss3.gemstone.com/ss/Pharo20/System-Support-MarcusDenker.737.diff
> http://ss3.gemstone.com/ss/Pharo20/System-CommandLine-MarcusDenker.61.diff
> http://ss3.gemstone.com/ss/Pharo20/System-Changes-MarcusDenker.191.diff
> http://ss3.gemstone.com/ss/Pharo20/HudsonBuildTools20-MarcusDenker.9.diff
>
> --
> Marcus Denker -- http://marcusdenker.de
>
>
Nov. 17, 2012
[Pharo-project] [update 2.0] #20405
by Marcus Denker
20405
-----
Issue 6978: UpdateStreamer and UpdateStreamerTest should be in own packages
http://code.google.com/p/pharo/issues/detail?id=6978
Issue 6977: Move LoadUpdatesCommandLineHandler close to UpdateStreamer
http://code.google.com/p/pharo/issues/detail?id=6977
Issue 6967: move TestRunnerCommandLineHandler into HudsonBuildTools20
http://code.google.com/p/pharo/issues/detail?id=6967
Issue 6993: update Pharo Kernel generation
http://code.google.com/p/pharo/issues/detail?id=6993
Diff information:
http://ss3.gemstone.com/ss/Pharo20/Tests-MarcusDenker.481.diff
http://ss3.gemstone.com/ss/Pharo20/UpdateStreamer-Core-MarcusDenker.2.diff
http://ss3.gemstone.com/ss/Pharo20/UpdateStreamer-Tests-MarcusDenker.2.diff
http://ss3.gemstone.com/ss/Pharo20/System-Support-MarcusDenker.737.diff
http://ss3.gemstone.com/ss/Pharo20/System-CommandLine-MarcusDenker.61.diff
http://ss3.gemstone.com/ss/Pharo20/System-Changes-MarcusDenker.191.diff
http://ss3.gemstone.com/ss/Pharo20/HudsonBuildTools20-MarcusDenker.9.diff
--
Marcus Denker -- http://marcusdenker.de
Nov. 17, 2012
Re: [Pharo-project] Beeper
by Stéphane Ducasse
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.
> 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. 17, 2012
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
>
> Issue 6993: update Pharo Kernel generation
> http://code.google.com/p/pharo/issues/detail?id=6993
Marcus, I did a small additional fix. Please integrate new slice too.
-- Pavel
>
> 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. 17, 2012