You shouldnt use Brew, because it cant compile universal binaries.
Athens, with a cairo backend, uses NativeBoost which needs 32 bit libraries, because CogGM is targeted to 32 bits.
I also tried with Brew, that's why i found out is hard to instruct brew to compile universal binaries.
Fernando
On Fri, May 25, 2012 at 12:39 PM, 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):
- 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/
- Download the NativeBoost enabled Cog VM from:
https://ci.lille.inria.fr/pharo/view/NativeBoost/
- Get a Pharo image and run:
Gofer new squeaksource: 'Athens'; package: 'ConfigurationOfAthens'; load. (Smalltalk at: #ConfigurationOfAthens) loadDevelopment
- 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/