[Pharo-project] loading athens - a user perspective
Hi, Here is how to install Athens (I also added this comment to the ConfigurationOfAthens): 1. Install Cairo on your machine For example, for Mac, you open the terminal and run: sudo port install -f cairo +universal More information can be found here: http://cairographics.org/download/ 2. Download the NativeBoost enabled Cog VM from: https://ci.lille.inria.fr/pharo/view/NativeBoost/ 3. Get a Pharo image and run: Gofer new squeaksource: 'Athens'; package: 'ConfigurationOfAthens'; load. (Smalltalk at: #ConfigurationOfAthens) loadDevelopment 4. Play with it. For example: VGTigerDemo runDemo Thanks Igor! Cheers, Doru -- www.tudorgirba.com "Live like you mean it."
On Fri, May 25, 2012 at 4:57 PM, Tudor Girba <tudor@tudorgirba.com> wrote:
Hi,
Here is how to install Athens (I also added this comment to the ConfigurationOfAthens):
1. Install Cairo on your machine For example, for Mac, you open the terminal and run: sudo port install -f cairo +universal
More information can be found here: http://cairographics.org/download/
2. Download the NativeBoost enabled Cog VM from: https://ci.lille.inria.fr/pharo/view/NativeBoost/
3. Get a Pharo image and run: Gofer new     squeaksource: 'Athens';     package: 'ConfigurationOfAthens';     load. (Smalltalk at: #ConfigurationOfAthens) loadDevelopment
4. Play with it. For example: VGTigerDemo runDemo
I install Cairo with brew on mac os x: brew install cairo And I got the following stack trace: 25 May 2012 5:37:03 pm VM: Mac OS - intel - 1074 - NBCoInterpreter NativeBoost-CogPlugin-IgorStasenko.9 uuid: 801decd2-0b42-fa49-bcea-d7564d516a1b May 1 2012, StackToRegisterMappingCogit VMMaker-oscog-EstebanLorenzano.158 uuid: 82eded98-68af-4c80-a472-4f6de293adcf May 1 2012, https://git.gitorious.org/cogvm/blessed.git Commit: 6aa3fd0f1188078d3167dec1a53031a61b97b688 Date: Tue May 1 20:28:14 2012 +0200 By: Esteban Lorenzano <estebanlm@gmail.com> Image: Pharo1.4a [Latest update: #14418] NBFFICallout(Object)>>error: Receiver: a NBFFICallout Arguments and temporary variables: aString: 'function unavailable' Receiver's instance variables: asm: an AJx86Assembler proxy: a NBInterpreterProxy options: a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc... method: (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc... fnSpec: a NBFnSpec requestor: AthensCairoSurface class methodArgs: an OrderedCollection('aFormat' 'aWidth' 'aHeight') coercionMayFail: true callInfo: an AJCdeclCallInfo [:gen | fnAddress := requestor nbGetSymbolAddress: fnSpec functionName module: aModuleNameOrHandle. fnAddress ifNil: [self error: 'function unavailable']. self mayCallback 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: '/opt/local/lib/libcairo.2.dylib' gen: #(nil) Receiver's instance variables: asm: an AJx86Assembler proxy: a NBInterpreterProxy options: a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc... method: (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc... fnSpec: a NBFnSpec requestor: AthensCairoSurface class methodArgs: an OrderedCollection('aFormat' 'aWidth' 'aHeight') 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' while: [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: (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc... fnSpec: a NBFnSpec requestor: AthensCairoSurface class methodArgs: an OrderedCollection('aFormat' 'aWidth' 'aHeight') 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: 151 numArgs: 0 AJx86Assembler>>decorateWith:while: 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' while: [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: (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc... fnSpec: a NBFnSpec requestor: AthensCairoSurface class methodArgs: an OrderedCollection('aFormat' 'aWidth' 'aHeight') 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: (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc... fnSpec: a NBFnSpec requestor: AthensCairoSurface class methodArgs: an OrderedCollection('aFormat' 'aWidth' 'aHeight') 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: (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc... fnSpec: a NBFnSpec requestor: AthensCairoSurface class methodArgs: an OrderedCollection('aFormat' 'aWidth' 'aHeight') 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: (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc... fnSpec: a NBFnSpec requestor: AthensCairoSurface class methodArgs: an OrderedCollection('aFormat' 'aWidth' 'aHeight') coercionMayFail: true callInfo: an AJCdeclCallInfo NBFFICallout>>generateCall:module: Receiver: a NBFFICallout Arguments and temporary variables: functionSpec: #(#AthensCairoSurface #cairo_image_surface_create #(#int #aFormat...etc... aModuleNameOrHandle: '/opt/local/lib/libcairo.2.dylib' fnAddress: #(nil) Receiver's instance variables: asm: an AJx86Assembler proxy: a NBInterpreterProxy options: a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc... method: (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc... fnSpec: a NBFnSpec requestor: AthensCairoSurface class methodArgs: an OrderedCollection('aFormat' 'aWidth' 'aHeight') coercionMayFail: true callInfo: an AJCdeclCallInfo [:gen | gen sender: sender; callType: self nbCallingConvention; generateCall: fnSpec module: self nbLibraryNameOrHandle] in AthensCairoSurface class(Object)>>nbCall: Receiver: AthensCairoSurface Arguments and temporary variables: fnSpec: a NBFFICallout sender: #(#AthensCairoSurface #cairo_image_surface_create #(#int #aFormat #, #i...etc... gen: AthensCairoSurface class>>primImage:width:height: Receiver's instance variables: superclass: AthensSurface methodDict: a MethodDictionary(#asAthensPaintOn:->(AthensCairoSurface>>#asAthen...etc... format: 140 instanceVariables: #('handle' 'context' 'builder' 'id') organization: ('converting' asAthensPaintOn: writeToPng:) ('as yet unclassified...etc... subclasses: {AthensCairoPDFSurface} name: #AthensCairoSurface classPool: nil sharedPools: an OrderedCollection(AthensCairoDefs) environment: a SystemDictionary(lots of globals) category: #'Athens-Cairo' traitComposition: TCairoLibrary localSelectors: a Set(#asForm #createFormPaint: #stride #setOperator: #writeToP...etc... uniqueSession: nil dispatch: nil dispatchStruct: nil NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry: Receiver: NBFFICallout Arguments and temporary variables: aBlock: [:gen | gen sender: sender; callType: self nbCallingConvention; g...etc... retryCtx: AthensCairoSurface class>>primImage:width:height: method: (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc... code: nil newMethod: nil args: nil i: nil iLimiT: 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->nil #CustomErrorMessages->nil #TypeA...etc... sharedPools: nil environment: a SystemDictionary(lots of globals) category: #'NativeBoost-Core' traitComposition: {} localSelectors: nil NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode: Receiver: NBFFICallout Arguments and temporary variables: aContext: AthensCairoSurface class>>primImage:width:height: aBlock: [:gen | gen sender: sender; callType: self nbCallingConvention; g...etc... method: (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...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->nil #CustomErrorMessages->nil #TypeA...etc... sharedPools: nil environment: a SystemDictionary(lots of globals) category: #'NativeBoost-Core' traitComposition: {} localSelectors: nil AthensCairoSurface class(Object)>>nbCall: Receiver: AthensCairoSurface Arguments and temporary variables: fnSpec: #(#AthensCairoSurface #cairo_image_surface_create #(#int #aFormat #, #i...etc... sender: AthensCairoSurface class>>primImage:width:height: Receiver's instance variables: superclass: AthensSurface methodDict: a MethodDictionary(#asAthensPaintOn:->(AthensCairoSurface>>#asAthen...etc... format: 140 instanceVariables: #('handle' 'context' 'builder' 'id') organization: ('converting' asAthensPaintOn: writeToPng:) ('as yet unclassified...etc... subclasses: {AthensCairoPDFSurface} name: #AthensCairoSurface classPool: nil sharedPools: an OrderedCollection(AthensCairoDefs) environment: a SystemDictionary(lots of globals) category: #'Athens-Cairo' traitComposition: TCairoLibrary localSelectors: a Set(#asForm #createFormPaint: #stride #setOperator: #writeToP...etc... uniqueSession: nil dispatch: nil dispatchStruct: nil AthensCairoSurface class>>primImage:width:height: Receiver: AthensCairoSurface Arguments and temporary variables: aFormat: 0 aWidth: 800 aHeight: 800 Receiver's instance variables: superclass: AthensSurface methodDict: a MethodDictionary(#asAthensPaintOn:->(AthensCairoSurface>>#asAthen...etc... format: 140 instanceVariables: #('handle' 'context' 'builder' 'id') organization: ('converting' asAthensPaintOn: writeToPng:) ('as yet unclassified...etc... subclasses: {AthensCairoPDFSurface} name: #AthensCairoSurface classPool: nil sharedPools: an OrderedCollection(AthensCairoDefs) environment: a SystemDictionary(lots of globals) category: #'Athens-Cairo' traitComposition: TCairoLibrary localSelectors: a Set(#asForm #createFormPaint: #stride #setOperator: #writeToP...etc... uniqueSession: nil dispatch: nil dispatchStruct: nil AthensCairoSurface class>>extent:format: Receiver: AthensCairoSurface Arguments and temporary variables: anExtent: (800@800) aFormat: 0 Receiver's instance variables: superclass: AthensSurface methodDict: a MethodDictionary(#asAthensPaintOn:->(AthensCairoSurface>>#asAthen...etc... format: 140 instanceVariables: #('handle' 'context' 'builder' 'id') organization: ('converting' asAthensPaintOn: writeToPng:) ('as yet unclassified...etc... subclasses: {AthensCairoPDFSurface} name: #AthensCairoSurface classPool: nil sharedPools: an OrderedCollection(AthensCairoDefs) environment: a SystemDictionary(lots of globals) category: #'Athens-Cairo' traitComposition: TCairoLibrary localSelectors: a Set(#asForm #createFormPaint: #stride #setOperator: #writeToP...etc... uniqueSession: nil dispatch: nil dispatchStruct: nil AthensCairoSurface class>>extent: Receiver: AthensCairoSurface Arguments and temporary variables: anExtent: (800@800) Receiver's instance variables: superclass: AthensSurface methodDict: a MethodDictionary(#asAthensPaintOn:->(AthensCairoSurface>>#asAthen...etc... format: 140 instanceVariables: #('handle' 'context' 'builder' 'id') organization: ('converting' asAthensPaintOn: writeToPng:) ('as yet unclassified...etc... subclasses: {AthensCairoPDFSurface} name: #AthensCairoSurface classPool: nil sharedPools: an OrderedCollection(AthensCairoDefs) environment: a SystemDictionary(lots of globals) category: #'Athens-Cairo' traitComposition: TCairoLibrary localSelectors: a Set(#asForm #createFormPaint: #stride #setOperator: #writeToP...etc... uniqueSession: nil dispatch: nil dispatchStruct: nil VGTigerDemo>>initialize Receiver: a VGTigerDemo Arguments and temporary variables: Receiver's instance variables: surface: nil VGTigerDemo class(Behavior)>>new Receiver: VGTigerDemo Arguments and temporary variables: Receiver's instance variables: superclass: Object methodDict: a MethodDictionary(#convertPathData2->(VGTigerDemo>>#convertPathDat...etc... format: 132 instanceVariables: #('surface') organization: ('as yet unclassified' convertPathData2 initialize runDemo) subclasses: nil name: #VGTigerDemo classPool: nil sharedPools: nil environment: a SystemDictionary(lots of globals) category: #'Athens-Examples' traitComposition: {} localSelectors: nil VGTigerDemo class>>runDemo Receiver: VGTigerDemo Arguments and temporary variables: Receiver's instance variables: superclass: Object methodDict: a MethodDictionary(#convertPathData2->(VGTigerDemo>>#convertPathDat...etc... format: 132 instanceVariables: #('surface') organization: ('as yet unclassified' convertPathData2 initialize runDemo) subclasses: nil name: #VGTigerDemo classPool: nil sharedPools: nil environment: a SystemDictionary(lots of globals) category: #'Athens-Examples' traitComposition: {} localSelectors: nil UndefinedObject>>DoIt Receiver: nil Arguments and temporary variables: Receiver's instance variables: nil Compiler>>evaluate:in:to:notifying:ifFail:logged: Receiver: a Compiler Arguments and temporary variables: textOrStream: a ReadWriteStream aContext: nil receiver: nil aRequestor: a TextMorphForEditView(741605376) failBlock: [self morph flash. ^ nil] logFlag: true methodNode: DoIt ^ VGTigerDemo runDemo method: (UndefinedObject>>#DoIt "a CompiledMethod(926679040)") value: nil toLog: nil itsSelection: nil itsSelectionString: nil Receiver's instance variables: sourceStream: a ReadWriteStream requestor: a TextMorphForEditView(741605376) class: UndefinedObject category: nil context: nil parser: a Parser [rcvr class evaluatorClass new evaluate: self selectionForDoitAsStream in: ctxt to: rcvr notifying: self morph ifFail: [self morph flash. ^ nil] logged: true] in SmalltalkEditor>>evaluateSelectionAndDo: Receiver: a SmalltalkEditor Arguments and temporary variables: rcvr: nil ctxt: nil Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState BlockClosure>>on:do: Receiver: [rcvr class evaluatorClass new evaluate: self selectionForDoitAsStream in: ctxt to: ...etc... Arguments and temporary variables: exception: OutOfScopeNotification handlerAction: [:ex | ex resume: true] handlerActive: true Receiver's instance variables: outerContext: SmalltalkEditor>>evaluateSelectionAndDo: startpc: 110 numArgs: 0 SmalltalkEditor>>evaluateSelectionAndDo: Receiver: a SmalltalkEditor Arguments and temporary variables: aBlock: [:result | result] result: nil rcvr: nil ctxt: nil Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState SmalltalkEditor>>evaluateSelection Receiver: a SmalltalkEditor Arguments and temporary variables: Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState SmalltalkEditor>>doIt Receiver: a SmalltalkEditor Arguments and temporary variables: Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState SmalltalkEditor>>doIt: Receiver: a SmalltalkEditor Arguments and temporary variables: aKeyboardEvent: [keystroke '<Cmd-d>'] Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState SmalltalkEditor(TextEditor)>>performCmdActionsWith:shifted:return: Receiver: a SmalltalkEditor Arguments and temporary variables: aKeyboardEvent: [keystroke '<Cmd-d>'] aBoolean: false return: [:val | ^ val] asciiValue: 101 actions: #(#noop: #cursorHome: #noop: #noop: #cursorEnd: #noop: #noop: #noop: #...etc... action: #doIt: Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState SmalltalkEditor(TextEditor)>>dispatchCommandOn:return: Receiver: a SmalltalkEditor Arguments and temporary variables: aKeyboardEvent: [keystroke '<Cmd-d>'] return: [:val | ^ val] asciiValue: 100 honorCommandKeys: true char: nil Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState SmalltalkEditor(TextEditor)>>dispatchOn: Receiver: a SmalltalkEditor Arguments and temporary variables: aKeyboardEvent: [keystroke '<Cmd-d>'] char: nil return: [:val | ^ val] keyEvents: nil Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState [self dispatchOn: aKeyboardEvent] in SmalltalkEditor(TextEditor)>>keystroke: Receiver: a SmalltalkEditor Arguments and temporary variables: aKeyboardEvent: [keystroke '<Cmd-d>'] Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState SmalltalkEditor(TextEditor)>>handleKeystrokeAction: Receiver: a SmalltalkEditor Arguments and temporary variables: aBlock: [self dispatchOn: aKeyboardEvent] Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState SmalltalkEditor(TextEditor)>>handleEditionAction:fromKeyboardEvent: Receiver: a SmalltalkEditor Arguments and temporary variables: anAction: [self dispatchOn: aKeyboardEvent] aKeyboardEvent: [keystroke '<Cmd-d>'] Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState SmalltalkEditor(TextEditor)>>keystroke: Receiver: a SmalltalkEditor Arguments and temporary variables: aKeyboardEvent: [keystroke '<Cmd-d>'] Receiver's instance variables: morph: a TextMorphForEditView(741605376) selectionShowing: true model: a Workspace editingState: a SmalltalkEditingState [editor keystroke: evt] in [| action | evt keyValue = 13 ifTrue: [action := self crAction. action ifNotNil: [evt hand newKeyboardFocus: nil. ^ action value]]. self handleInteraction: [editor keystroke: evt]. self updateFromParagraph. super keyStroke: evt] in TextMorphForEditView(TextMorph)>>keyStroke: Receiver: a TextMorphForEditView(741605376) Arguments and temporary variables: evt: [keystroke '<Cmd-d>'] Receiver's instance variables: bounds: (0@0) corner: (473@18) owner: a TransformMorph(38535168) submorphs: #() fullBounds: (0@0) corner: (473@18) color: Color black extension: a MorphExtension (824180736) [other: (blinkStart -> 1085881) (myDep...etc... borderWidth: 0 borderColor: Color black textStyle: a TextStyle Bitmap DejaVu Sans 9 text: a Text for 'VGTigerDemo runDemo' wrapFlag: true paragraph: a Paragraph editor: a SmalltalkEditor container: nil predecessor: nil successor: nil backgroundColor: nil margins: (0@0) corner: (0@0) editView: a PluggableTextMorph(838860800) acceptOnCR: false autoAccept: false acceptOnFocusChange: false selectionColor: nil TextMorphForEditView(TextMorph)>>handleInteraction: Receiver: a TextMorphForEditView(741605376) Arguments and temporary variables: interactionBlock: [editor keystroke: evt] oldEditor: a SmalltalkEditor oldParagraph: a Paragraph oldText: a Text for 'VGTigerDemo runDemo' Receiver's instance variables: bounds: (0@0) corner: (473@18) owner: a TransformMorph(38535168) submorphs: #() fullBounds: (0@0) corner: (473@18) color: Color black extension: a MorphExtension (824180736) [other: (blinkStart -> 1085881) (myDep...etc... borderWidth: 0 borderColor: Color black textStyle: a TextStyle Bitmap DejaVu Sans 9 text: a Text for 'VGTigerDemo runDemo' wrapFlag: true paragraph: a Paragraph editor: a SmalltalkEditor container: nil predecessor: nil successor: nil backgroundColor: nil margins: (0@0) corner: (0@0) editView: a PluggableTextMorph(838860800) acceptOnCR: false autoAccept: false acceptOnFocusChange: false selectionColor: nil --- The full stack --- NBFFICallout(Object)>>error: [:gen | fnAddress := requestor nbGetSymbolAddress: fnSpec functionName module: aModuleNameOrHandle. fnAddress ifNil: [self error: 'function unavailable']. self mayCallback 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' while: [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}. (self optEmitCall or: [self optNoCleanup]) ifTrue: [call disableCleanup]]] in NBFFICallout>>generateInstructions: BlockClosure>>ensure: AJx86Assembler>>decorateWith:while: [:call | self optNoAlignment ifTrue: [call alignment: 1]. self pushArguments. coercionMayFail ifTrue: [proxy ifFailedJumpTo: self failedLabel]. asm decorateWith: 'FFI: performing a call' while: [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; callType: self nbCallingConvention; generateCall: fnSpec module: self nbLibraryNameOrHandle] in AthensCairoSurface class(Object)>>nbCall: NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry: NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode: AthensCairoSurface class(Object)>>nbCall: AthensCairoSurface class>>primImage:width:height: AthensCairoSurface class>>extent:format: AthensCairoSurface class>>extent: VGTigerDemo>>initialize VGTigerDemo class(Behavior)>>new VGTigerDemo class>>runDemo UndefinedObject>>DoIt Compiler>>evaluate:in:to:notifying:ifFail:logged: [rcvr class evaluatorClass new evaluate: self selectionForDoitAsStream in: ctxt to: rcvr notifying: self morph ifFail: [self morph flash. ^ nil] logged: true] in SmalltalkEditor>>evaluateSelectionAndDo: BlockClosure>>on:do: SmalltalkEditor>>evaluateSelectionAndDo: SmalltalkEditor>>evaluateSelection SmalltalkEditor>>doIt SmalltalkEditor>>doIt: SmalltalkEditor(TextEditor)>>performCmdActionsWith:shifted:return: SmalltalkEditor(TextEditor)>>dispatchCommandOn:return: SmalltalkEditor(TextEditor)>>dispatchOn: [self dispatchOn: aKeyboardEvent] in SmalltalkEditor(TextEditor)>>keystroke: SmalltalkEditor(TextEditor)>>handleKeystrokeAction: SmalltalkEditor(TextEditor)>>handleEditionAction:fromKeyboardEvent: SmalltalkEditor(TextEditor)>>keystroke: [editor keystroke: evt] in [| action | evt keyValue = 13 ifTrue: [action := self crAction. action ifNotNil: [evt hand newKeyboardFocus: nil. ^ action value]]. self handleInteraction: [editor keystroke: evt]. self updateFromParagraph. super keyStroke: evt] in TextMorphForEditView(TextMorph)>>keyStroke: TextMorphForEditView(TextMorph)>>handleInteraction: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TextMorphForEditView>>handleInteraction: [| action | evt keyValue = 13 ifTrue: [action := self crAction. action ifNotNil: [evt hand newKeyboardFocus: nil. ^ action value]]. self handleInteraction: [editor keystroke: evt]. self updateFromParagraph. super keyStroke: evt] in TextMorphForEditView(TextMorph)>>keyStroke: ECToolSet class>>codeCompletionAround:textMorph:keyStroke: ToolRegistry>>codeCompletionAround:textMorph:keyStroke: SmalltalkEditor>>codeCompletionAround:textMorph:keyStroke: TextMorphForEditView(TextMorph)>>keyStroke: TextMorphForEditView>>keyStroke: TextMorphForEditView(TextMorph)>>handleKeystroke: KeyboardEvent>>sentTo: TextMorphForEditView(Morph)>>handleEvent: TextMorphForEditView(Morph)>>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 -- Serge Stinckwich UMI UMMISCO 209 (IRD/UPMC), Hanoi, Vietnam Every DSL ends up being Smalltalk http://doesnotunderstand.org/
Should i put more elaborate error message? A 'function unavailable' is exception which you get when... function is not available. I just thinking how to prevent receiving a huge and worthless stack traces. :) One way is of course write documentation.. :) On 25 May 2012 12:39, Serge Stinckwich <serge.stinckwich@gmail.com> wrote:
On Fri, May 25, 2012 at 4:57 PM, Tudor Girba <tudor@tudorgirba.com> wrote:
Hi,
Here is how to install Athens (I also added this comment to the ConfigurationOfAthens):
1. Install Cairo on your machine For example, for Mac, you open the terminal and run: sudo port install -f cairo +universal
More information can be found here: http://cairographics.org/download/
2. Download the NativeBoost enabled Cog VM from: https://ci.lille.inria.fr/pharo/view/NativeBoost/
3. Get a Pharo image and run: Gofer new     squeaksource: 'Athens';     package: 'ConfigurationOfAthens';     load. (Smalltalk at: #ConfigurationOfAthens) loadDevelopment
4. Play with it. For example: VGTigerDemo runDemo
I install Cairo with brew on mac os x: brew install cairo
And I got the following stack trace:
25 May 2012 5:37:03 pm
VM: Mac OS - intel - 1074 - NBCoInterpreter NativeBoost-CogPlugin-IgorStasenko.9 uuid: 801decd2-0b42-fa49-bcea-d7564d516a1b May  1 2012, StackToRegisterMappingCogit VMMaker-oscog-EstebanLorenzano.158 uuid: 82eded98-68af-4c80-a472-4f6de293adcf May  1 2012, https://git.gitorious.org/cogvm/blessed.git Commit: 6aa3fd0f1188078d3167dec1a53031a61b97b688 Date: Tue May 1 20:28:14 2012 +0200 By: Esteban Lorenzano <estebanlm@gmail.com> Image: Pharo1.4a [Latest update: #14418]
NBFFICallout(Object)>>error:     Receiver: a NBFFICallout     Arguments and temporary variables:         aString:     'function unavailable'     Receiver's instance variables:         asm:   an AJx86Assembler         proxy:  a NBInterpreterProxy         options:     a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc...         method:     (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc...         fnSpec:     a NBFnSpec         requestor:    AthensCairoSurface class         methodArgs:   an OrderedCollection('aFormat' 'aWidth' 'aHeight')         coercionMayFail:     true         callInfo:    an AJCdeclCallInfo
[:gen | fnAddress := requestor nbGetSymbolAddress: fnSpec functionName module: aModuleNameOrHandle.     fnAddress         ifNil: [self error: 'function unavailable'].     self mayCallback         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:    '/opt/local/lib/libcairo.2.dylib'         gen:   #(nil)     Receiver's instance variables:         asm:   an AJx86Assembler         proxy:  a NBInterpreterProxy         options:     a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc...         method:     (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc...         fnSpec:     a NBFnSpec         requestor:    AthensCairoSurface class         methodArgs:   an OrderedCollection('aFormat' 'aWidth' 'aHeight')         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'         while: [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:     (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc...         fnSpec:     a NBFnSpec         requestor:    AthensCairoSurface class         methodArgs:   an OrderedCollection('aFormat' 'aWidth' 'aHeight')         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:     151         numArgs:     0
AJx86Assembler>>decorateWith:while:     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'         while: [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:     (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc...         fnSpec:     a NBFnSpec         requestor:    AthensCairoSurface class         methodArgs:   an OrderedCollection('aFormat' 'aWidth' 'aHeight')         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:     (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc...         fnSpec:     a NBFnSpec         requestor:    AthensCairoSurface class         methodArgs:   an OrderedCollection('aFormat' 'aWidth' 'aHeight')         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:     (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc...         fnSpec:     a NBFnSpec         requestor:    AthensCairoSurface class         methodArgs:   an OrderedCollection('aFormat' 'aWidth' 'aHeight')         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:     (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc...         fnSpec:     a NBFnSpec         requestor:    AthensCairoSurface class         methodArgs:   an OrderedCollection('aFormat' 'aWidth' 'aHeight')         coercionMayFail:     true         callInfo:    an AJCdeclCallInfo
NBFFICallout>>generateCall:module:     Receiver: a NBFFICallout     Arguments and temporary variables:         functionSpec:  #(#AthensCairoSurface #cairo_image_surface_create #(#int #aFormat...etc...         aModuleNameOrHandle:   '/opt/local/lib/libcairo.2.dylib'         fnAddress:    #(nil)     Receiver's instance variables:         asm:   an AJx86Assembler         proxy:  a NBInterpreterProxy         options:     a Set(#optCdecl #optAllowByteArraysPtr #optUseStackPointer #optReturnP...etc...         method:     (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc...         fnSpec:     a NBFnSpec         requestor:    AthensCairoSurface class         methodArgs:   an OrderedCollection('aFormat' 'aWidth' 'aHeight')         coercionMayFail:     true         callInfo:    an AJCdeclCallInfo
[:gen | gen sender: sender;         callType: self nbCallingConvention;         generateCall: fnSpec module: self nbLibraryNameOrHandle] in AthensCairoSurface class(Object)>>nbCall:     Receiver: AthensCairoSurface     Arguments and temporary variables:         fnSpec:     a NBFFICallout         sender:     #(#AthensCairoSurface #cairo_image_surface_create #(#int #aFormat #, #i...etc...         gen:   AthensCairoSurface class>>primImage:width:height:     Receiver's instance variables:         superclass:   AthensSurface         methodDict:   a MethodDictionary(#asAthensPaintOn:->(AthensCairoSurface>>#asAthen...etc...         format:     140         instanceVariables:    #('handle' 'context' 'builder' 'id')         organization:  ('converting' asAthensPaintOn: writeToPng:) ('as yet unclassified...etc...         subclasses:   {AthensCairoPDFSurface}         name:  #AthensCairoSurface         classPool:    nil         sharedPools:   an OrderedCollection(AthensCairoDefs)         environment:   a SystemDictionary(lots of globals)         category:    #'Athens-Cairo'         traitComposition:    TCairoLibrary         localSelectors:     a Set(#asForm #createFormPaint: #stride #setOperator: #writeToP...etc...         uniqueSession:  nil         dispatch:    nil         dispatchStruct:     nil
NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry:     Receiver: NBFFICallout     Arguments and temporary variables:         aBlock:     [:gen | gen sender: sender;         callType: self nbCallingConvention;         g...etc...         retryCtx:    AthensCairoSurface class>>primImage:width:height:         method:     (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...etc...         code:  nil         newMethod:    nil         args:  nil         i:    nil         iLimiT:     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->nil #CustomErrorMessages->nil #TypeA...etc...         sharedPools:   nil         environment:   a SystemDictionary(lots of globals)         category:    #'NativeBoost-Core'         traitComposition:    {}         localSelectors:     nil
NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode:     Receiver: NBFFICallout     Arguments and temporary variables:         aContext:    AthensCairoSurface class>>primImage:width:height:         aBlock:     [:gen | gen sender: sender;         callType: self nbCallingConvention;         g...etc...         method:     (AthensCairoSurface class>>#primImage:width:height: "a CompiledMethod(4...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->nil #CustomErrorMessages->nil #TypeA...etc...         sharedPools:   nil         environment:   a SystemDictionary(lots of globals)         category:    #'NativeBoost-Core'         traitComposition:    {}         localSelectors:     nil
AthensCairoSurface class(Object)>>nbCall:     Receiver: AthensCairoSurface     Arguments and temporary variables:         fnSpec:     #(#AthensCairoSurface #cairo_image_surface_create #(#int #aFormat #, #i...etc...         sender:     AthensCairoSurface class>>primImage:width:height:     Receiver's instance variables:         superclass:   AthensSurface         methodDict:   a MethodDictionary(#asAthensPaintOn:->(AthensCairoSurface>>#asAthen...etc...         format:     140         instanceVariables:    #('handle' 'context' 'builder' 'id')         organization:  ('converting' asAthensPaintOn: writeToPng:) ('as yet unclassified...etc...         subclasses:   {AthensCairoPDFSurface}         name:  #AthensCairoSurface         classPool:    nil         sharedPools:   an OrderedCollection(AthensCairoDefs)         environment:   a SystemDictionary(lots of globals)         category:    #'Athens-Cairo'         traitComposition:    TCairoLibrary         localSelectors:     a Set(#asForm #createFormPaint: #stride #setOperator: #writeToP...etc...         uniqueSession:  nil         dispatch:    nil         dispatchStruct:     nil
AthensCairoSurface class>>primImage:width:height:     Receiver: AthensCairoSurface     Arguments and temporary variables:         aFormat:     0         aWidth:     800         aHeight:     800     Receiver's instance variables:         superclass:   AthensSurface         methodDict:   a MethodDictionary(#asAthensPaintOn:->(AthensCairoSurface>>#asAthen...etc...         format:     140         instanceVariables:    #('handle' 'context' 'builder' 'id')         organization:  ('converting' asAthensPaintOn: writeToPng:) ('as yet unclassified...etc...         subclasses:   {AthensCairoPDFSurface}         name:  #AthensCairoSurface         classPool:    nil         sharedPools:   an OrderedCollection(AthensCairoDefs)         environment:   a SystemDictionary(lots of globals)         category:    #'Athens-Cairo'         traitComposition:    TCairoLibrary         localSelectors:     a Set(#asForm #createFormPaint: #stride #setOperator: #writeToP...etc...         uniqueSession:  nil         dispatch:    nil         dispatchStruct:     nil
AthensCairoSurface class>>extent:format:     Receiver: AthensCairoSurface     Arguments and temporary variables:         anExtent:    (800@800)         aFormat:     0     Receiver's instance variables:         superclass:   AthensSurface         methodDict:   a MethodDictionary(#asAthensPaintOn:->(AthensCairoSurface>>#asAthen...etc...         format:     140         instanceVariables:    #('handle' 'context' 'builder' 'id')         organization:  ('converting' asAthensPaintOn: writeToPng:) ('as yet unclassified...etc...         subclasses:   {AthensCairoPDFSurface}         name:  #AthensCairoSurface         classPool:    nil         sharedPools:   an OrderedCollection(AthensCairoDefs)         environment:   a SystemDictionary(lots of globals)         category:    #'Athens-Cairo'         traitComposition:    TCairoLibrary         localSelectors:     a Set(#asForm #createFormPaint: #stride #setOperator: #writeToP...etc...         uniqueSession:  nil         dispatch:    nil         dispatchStruct:     nil
AthensCairoSurface class>>extent:     Receiver: AthensCairoSurface     Arguments and temporary variables:         anExtent:    (800@800)     Receiver's instance variables:         superclass:   AthensSurface         methodDict:   a MethodDictionary(#asAthensPaintOn:->(AthensCairoSurface>>#asAthen...etc...         format:     140         instanceVariables:    #('handle' 'context' 'builder' 'id')         organization:  ('converting' asAthensPaintOn: writeToPng:) ('as yet unclassified...etc...         subclasses:   {AthensCairoPDFSurface}         name:  #AthensCairoSurface         classPool:    nil         sharedPools:   an OrderedCollection(AthensCairoDefs)         environment:   a SystemDictionary(lots of globals)         category:    #'Athens-Cairo'         traitComposition:    TCairoLibrary         localSelectors:     a Set(#asForm #createFormPaint: #stride #setOperator: #writeToP...etc...         uniqueSession:  nil         dispatch:    nil         dispatchStruct:     nil
VGTigerDemo>>initialize     Receiver: a VGTigerDemo     Arguments and temporary variables:
    Receiver's instance variables:         surface:     nil
VGTigerDemo class(Behavior)>>new     Receiver: VGTigerDemo     Arguments and temporary variables:
    Receiver's instance variables:         superclass:   Object         methodDict:   a MethodDictionary(#convertPathData2->(VGTigerDemo>>#convertPathDat...etc...         format:     132         instanceVariables:    #('surface')         organization:  ('as yet unclassified' convertPathData2 initialize runDemo)
        subclasses:   nil         name:  #VGTigerDemo         classPool:    nil         sharedPools:   nil         environment:   a SystemDictionary(lots of globals)         category:    #'Athens-Examples'         traitComposition:    {}         localSelectors:     nil
VGTigerDemo class>>runDemo     Receiver: VGTigerDemo     Arguments and temporary variables:
    Receiver's instance variables:         superclass:   Object         methodDict:   a MethodDictionary(#convertPathData2->(VGTigerDemo>>#convertPathDat...etc...         format:     132         instanceVariables:    #('surface')         organization:  ('as yet unclassified' convertPathData2 initialize runDemo)
        subclasses:   nil         name:  #VGTigerDemo         classPool:    nil         sharedPools:   nil         environment:   a SystemDictionary(lots of globals)         category:    #'Athens-Examples'         traitComposition:    {}         localSelectors:     nil
UndefinedObject>>DoIt     Receiver: nil     Arguments and temporary variables:
    Receiver's instance variables: nil
Compiler>>evaluate:in:to:notifying:ifFail:logged:     Receiver: a Compiler     Arguments and temporary variables:         textOrStream:  a ReadWriteStream         aContext:    nil         receiver:    nil         aRequestor:   a TextMorphForEditView(741605376)         failBlock:    [self morph flash.     ^ nil]         logFlag:     true         methodNode:   DoIt     ^ VGTigerDemo runDemo         method:     (UndefinedObject>>#DoIt "a CompiledMethod(926679040)")         value:  nil         toLog:  nil         itsSelection:  nil         itsSelectionString:   nil     Receiver's instance variables:         sourceStream:  a ReadWriteStream         requestor:    a TextMorphForEditView(741605376)         class:  UndefinedObject         category:    nil         context:     nil         parser:     a Parser
[rcvr class evaluatorClass new         evaluate: self selectionForDoitAsStream         in: ctxt         to: rcvr         notifying: self morph         ifFail: [self morph flash.             ^ nil]         logged: true] in SmalltalkEditor>>evaluateSelectionAndDo:     Receiver: a SmalltalkEditor     Arguments and temporary variables:         rcvr:  nil         ctxt:  nil     Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
BlockClosure>>on:do:     Receiver: [rcvr class evaluatorClass new         evaluate: self selectionForDoitAsStream         in: ctxt         to: ...etc...     Arguments and temporary variables:         exception:    OutOfScopeNotification         handlerAction:  [:ex | ex resume: true]         handlerActive:  true     Receiver's instance variables:         outerContext:  SmalltalkEditor>>evaluateSelectionAndDo:         startpc:     110         numArgs:     0
SmalltalkEditor>>evaluateSelectionAndDo:     Receiver: a SmalltalkEditor     Arguments and temporary variables:         aBlock:     [:result | result]         result:     nil         rcvr:  nil         ctxt:  nil     Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
SmalltalkEditor>>evaluateSelection     Receiver: a SmalltalkEditor     Arguments and temporary variables:
    Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
SmalltalkEditor>>doIt     Receiver: a SmalltalkEditor     Arguments and temporary variables:
    Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
SmalltalkEditor>>doIt:     Receiver: a SmalltalkEditor     Arguments and temporary variables:         aKeyboardEvent:     [keystroke '<Cmd-d>']     Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
SmalltalkEditor(TextEditor)>>performCmdActionsWith:shifted:return:     Receiver: a SmalltalkEditor     Arguments and temporary variables:         aKeyboardEvent:     [keystroke '<Cmd-d>']         aBoolean:    false         return:     [:val | ^ val]         asciiValue:   101         actions:     #(#noop: #cursorHome: #noop: #noop: #cursorEnd: #noop: #noop: #noop: #...etc...         action:     #doIt:     Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
SmalltalkEditor(TextEditor)>>dispatchCommandOn:return:     Receiver: a SmalltalkEditor     Arguments and temporary variables:         aKeyboardEvent:     [keystroke '<Cmd-d>']         return:     [:val | ^ val]         asciiValue:   100         honorCommandKeys:    true         char:  nil     Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
SmalltalkEditor(TextEditor)>>dispatchOn:     Receiver: a SmalltalkEditor     Arguments and temporary variables:         aKeyboardEvent:     [keystroke '<Cmd-d>']         char:  nil         return:     [:val | ^ val]         keyEvents:    nil     Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
[self dispatchOn: aKeyboardEvent] in SmalltalkEditor(TextEditor)>>keystroke:     Receiver: a SmalltalkEditor     Arguments and temporary variables:         aKeyboardEvent:     [keystroke '<Cmd-d>']     Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
SmalltalkEditor(TextEditor)>>handleKeystrokeAction:     Receiver: a SmalltalkEditor     Arguments and temporary variables:         aBlock:     [self dispatchOn: aKeyboardEvent]     Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
SmalltalkEditor(TextEditor)>>handleEditionAction:fromKeyboardEvent:     Receiver: a SmalltalkEditor     Arguments and temporary variables:         anAction:    [self dispatchOn: aKeyboardEvent]         aKeyboardEvent:     [keystroke '<Cmd-d>']     Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
SmalltalkEditor(TextEditor)>>keystroke:     Receiver: a SmalltalkEditor     Arguments and temporary variables:         aKeyboardEvent:     [keystroke '<Cmd-d>']     Receiver's instance variables:         morph:  a TextMorphForEditView(741605376)         selectionShowing:    true         model:  a Workspace         editingState:  a SmalltalkEditingState
[editor keystroke: evt] in [| action | evt keyValue = 13         ifTrue: [action := self crAction.             action                 ifNotNil: [evt hand newKeyboardFocus: nil.                     ^ action value]].     self         handleInteraction: [editor keystroke: evt].     self updateFromParagraph.     super keyStroke: evt] in TextMorphForEditView(TextMorph)>>keyStroke:     Receiver: a TextMorphForEditView(741605376)     Arguments and temporary variables:         evt:   [keystroke '<Cmd-d>']     Receiver's instance variables:         bounds:     (0@0) corner: (473@18)         owner:  a TransformMorph(38535168)         submorphs:    #()         fullBounds:   (0@0) corner: (473@18)         color:  Color black         extension:    a MorphExtension (824180736) [other:  (blinkStart -> 1085881) (myDep...etc...         borderWidth:   0         borderColor:   Color black         textStyle:    a TextStyle Bitmap DejaVu Sans 9         text:  a Text for 'VGTigerDemo runDemo'         wrapFlag:    true         paragraph:    a Paragraph         editor:     a SmalltalkEditor         container:    nil         predecessor:   nil         successor:    nil         backgroundColor:     nil         margins:     (0@0) corner: (0@0)         editView:    a PluggableTextMorph(838860800)         acceptOnCR:   false         autoAccept:   false         acceptOnFocusChange:   false         selectionColor:     nil
TextMorphForEditView(TextMorph)>>handleInteraction:     Receiver: a TextMorphForEditView(741605376)     Arguments and temporary variables:         interactionBlock:    [editor keystroke: evt]         oldEditor:    a SmalltalkEditor         oldParagraph:  a Paragraph         oldText:     a Text for 'VGTigerDemo runDemo'     Receiver's instance variables:         bounds:     (0@0) corner: (473@18)         owner:  a TransformMorph(38535168)         submorphs:    #()         fullBounds:   (0@0) corner: (473@18)         color:  Color black         extension:    a MorphExtension (824180736) [other:  (blinkStart -> 1085881) (myDep...etc...         borderWidth:   0         borderColor:   Color black         textStyle:    a TextStyle Bitmap DejaVu Sans 9         text:  a Text for 'VGTigerDemo runDemo'         wrapFlag:    true         paragraph:    a Paragraph         editor:     a SmalltalkEditor         container:    nil         predecessor:   nil         successor:    nil         backgroundColor:     nil         margins:     (0@0) corner: (0@0)         editView:    a PluggableTextMorph(838860800)         acceptOnCR:   false         autoAccept:   false         acceptOnFocusChange:   false         selectionColor:     nil
--- The full stack --- NBFFICallout(Object)>>error: [:gen | fnAddress := requestor nbGetSymbolAddress: fnSpec functionName module: aModuleNameOrHandle.     fnAddress         ifNil: [self error: 'function unavailable'].     self mayCallback         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'         while: [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}.             (self optEmitCall                     or: [self optNoCleanup])                 ifTrue: [call disableCleanup]]] in NBFFICallout>>generateInstructions: BlockClosure>>ensure: AJx86Assembler>>decorateWith:while: [:call | self optNoAlignment         ifTrue: [call alignment: 1].     self pushArguments.     coercionMayFail         ifTrue: [proxy ifFailedJumpTo: self failedLabel].     asm         decorateWith: 'FFI: performing a call'         while: [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;         callType: self nbCallingConvention;         generateCall: fnSpec module: self nbLibraryNameOrHandle] in AthensCairoSurface class(Object)>>nbCall: NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry: NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode: AthensCairoSurface class(Object)>>nbCall: AthensCairoSurface class>>primImage:width:height: AthensCairoSurface class>>extent:format: AthensCairoSurface class>>extent: VGTigerDemo>>initialize VGTigerDemo class(Behavior)>>new VGTigerDemo class>>runDemo UndefinedObject>>DoIt Compiler>>evaluate:in:to:notifying:ifFail:logged: [rcvr class evaluatorClass new         evaluate: self selectionForDoitAsStream         in: ctxt         to: rcvr         notifying: self morph         ifFail: [self morph flash.             ^ nil]         logged: true] in SmalltalkEditor>>evaluateSelectionAndDo: BlockClosure>>on:do: SmalltalkEditor>>evaluateSelectionAndDo: SmalltalkEditor>>evaluateSelection SmalltalkEditor>>doIt SmalltalkEditor>>doIt: SmalltalkEditor(TextEditor)>>performCmdActionsWith:shifted:return: SmalltalkEditor(TextEditor)>>dispatchCommandOn:return: SmalltalkEditor(TextEditor)>>dispatchOn: [self dispatchOn: aKeyboardEvent] in SmalltalkEditor(TextEditor)>>keystroke: SmalltalkEditor(TextEditor)>>handleKeystrokeAction: SmalltalkEditor(TextEditor)>>handleEditionAction:fromKeyboardEvent: SmalltalkEditor(TextEditor)>>keystroke: [editor keystroke: evt] in [| action | evt keyValue = 13         ifTrue: [action := self crAction.             action                 ifNotNil: [evt hand newKeyboardFocus: nil.                     ^ action value]].     self         handleInteraction: [editor keystroke: evt].     self updateFromParagraph.     super keyStroke: evt] in TextMorphForEditView(TextMorph)>>keyStroke: TextMorphForEditView(TextMorph)>>handleInteraction:  - - - - - - - - - - - - - - -             - - - - - - - - - - - - - - - - - - TextMorphForEditView>>handleInteraction: [| action | evt keyValue = 13         ifTrue: [action := self crAction.             action                 ifNotNil: [evt hand newKeyboardFocus: nil.                     ^ action value]].     self         handleInteraction: [editor keystroke: evt].     self updateFromParagraph.     super keyStroke: evt] in TextMorphForEditView(TextMorph)>>keyStroke: ECToolSet class>>codeCompletionAround:textMorph:keyStroke: ToolRegistry>>codeCompletionAround:textMorph:keyStroke: SmalltalkEditor>>codeCompletionAround:textMorph:keyStroke: TextMorphForEditView(TextMorph)>>keyStroke: TextMorphForEditView>>keyStroke: TextMorphForEditView(TextMorph)>>handleKeystroke: KeyboardEvent>>sentTo: TextMorphForEditView(Morph)>>handleEvent: TextMorphForEditView(Morph)>>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
-- Serge Stinckwich UMI UMMISCO 209 (IRD/UPMC), Hanoi, Vietnam Every DSL ends up being Smalltalk http://doesnotunderstand.org/
-- Best regards, Igor Stasenko.
Envoyé de mon iPhone Le 25 mai 2012 à 20:23, Igor Stasenko <siguctua@gmail.com> a écrit :
Should i put more elaborate error message? A 'function unavailable' is exception which you get when... function is not available.
I just thinking how to prevent receiving a huge and worthless stack traces. :) One way is of course write documentation.. :)
Ahah, so maybe I will send more useless stack traces ;-)
tudor@tudorgirba.com> wrote:
Hi,
Here is how to install Athens (I also added this comment to the ConfigurationOfAthens):
1. Install Cairo on your machine For example, for Mac, you open the terminal and run: sudo port install -f cairo +universal
More information can be found here: http://cairographics.org/download/
2. Download the NativeBoost enabled Cog VM from: https://ci.lille.inria.fr/pharo/view/NativeBoost/
On 25 May 2012 18:51, Serge Stinckwich <serge.stinckwich@gmail.com> wrote:
Envoyé de mon iPhone
Le 25 mai 2012 à 20:23, Igor Stasenko <siguctua@gmail.com> a écrit :
Should i put more elaborate error message? A 'function unavailable' is exception which you get when... function is not available.
I just thinking how to prevent receiving a huge and worthless stack traces. :) One way is of course write documentation.. :)
Ahah, so maybe I will send more useless stack traces ;-)
No, but frankly, please tell me what was unclear to you, and why you thought that sending a trace will be helpful to resolve the problem. Because this is not a bug, and behavior is correct, so what that trace serves for? -- Best regards, Igor Stasenko.
participants (3)
-
Igor Stasenko -
Serge Stinckwich -
Tudor Girba