A new version of SystemEditor-Squeak was added to project SystemEditor: http://www.squeaksource.com/SystemEditor/SystemEditor-Squeak-mtf.156.mcz
==================== Summary ====================
Name: SystemEditor-Squeak-mtf.156 Author: mtf Time: 18 November 2008, 12:00:30 pm UUID: 382d9f0c-597d-4bfa-a96b-65519b370280 Ancestors: SystemEditor-Squeak-mtf.155
Greatly improved the smartness of finding the compiler for a given class. This should fix all loading problems in which the compiler changes during load. A good test would be to ensure that FFI and a dependent package can be loaded atomicly together
=============== Diff against SystemEditor-Squeak-mtf.155 ===============
Item was changed: ----- Method: MethodEditor>>compileFor: (in category 'building') ----- compileFor: aClassEditor + + ^ self + compileForClass: aClassEditor product + using: aClassEditor ensuredCompilerClass new! - [ - | node method | - node := aClassEditor product compilerClass new - compile: source - in: aClassEditor product - notifying: requestor - ifFail: nil. - node encoder requestor: self. - method := node generate: #(0 0 0 0). - (method respondsTo: #selector:) "set selector on 3.9 and above" - ifTrue: [method selector: node selector]. - ^ method - ] on: SyntaxErrorNotification do: [:ex | - "In 3.10, the class category needs to be set" - ex instVarNamed: #category put: aClassEditor category. - "Let the user fix and install the fixed code into the class's old or temporary MethodDictionary" - ex outer. - "Now fetch and use that code instead" - source := aClassEditor product sourceCodeAt: self selector ifAbsent: [^ nil]. - ^ aClassEditor product compiledMethodAt: self selector - ]!
Item was added: + ----- Method: ClassDescriptionEditor>>lookupSelector: (in category 'debugging') ----- + lookupSelector: aSelector + ^ superclass lookupSelector: aSelector!
Item was added: + ----- Method: PureBehaviorEditor>>edUltimateMethodAt:ifAbsent: (in category 'editing') ----- + edUltimateMethodAt: aSelector ifAbsent: aBlock + ^ self edMethodAt: aSelector ifAbsent: aBlock!
Item was added: + ----- Method: RootMetaclassEditor>>edUltimateMethodAt:ifAbsent: (in category 'accessing') ----- + edUltimateMethodAt: aSelector ifAbsent: aBlock + ^ aBlock value!
Item was added: + ----- Method: ClassEditor>>ensuredCompilerClass (in category 'accessing') ----- + ensuredCompilerClass + "Answer my product's compilerClass, building it if necessary" + + | methodEditor method | + compilerClass ifNotNil: [^ compilerClass]. + + "Normal case: the compiler is already in the system. Check to see if I have a newer version" + self product compilerClass ifNotNil: [ + compilerClass := self system classOrEditorFor: self product compilerClass. + compilerClass edIsEditor ifTrue: [compilerClass := compilerClass product]. + ^ compilerClass]. + + "If we get here, this package is presumably using a compiler that does not yet exist in the system. + Evil evil hackery. Get the method editor, compile it in the context of the system editor, + and run it to find the editor for the new compiler" + methodEditor := self class edUltimateMethodAt: #compilerClass ifAbsent: [^ self subject + ifNil: [Compiler] + ifNotNil: [self subject compilerClass]]. + method := methodEditor compileForClass: self using: Compiler new. + compilerClass := (self new executeMethod: method) product. + compilerClass ifNil: [self error: 'Unknown compiler']. + ^ compilerClass!
Item was added: + ----- Method: ClassDescriptionEditor>>edUltimateMethodAt:ifAbsent: (in category 'accessing') ----- + edUltimateMethodAt: aSelector ifAbsent: aBlock + ^ self edMethodAt: aSelector ifAbsent: [ + self superclass edUltimateMethodAt: aSelector ifAbsent: aBlock]!
Item was added: + ----- Method: MethodEditor>>compileForClass:using: (in category 'building') ----- + compileForClass: aClass using: aCompiler + [ + | node method | + node := aCompiler + compile: source + in: aClass + notifying: requestor + ifFail: nil. + node encoder requestor: self. + method := node generate: #(0 0 0 0). + (method respondsTo: #selector:) "set selector on 3.9 and above" + ifTrue: [method selector: node selector]. + ^ method + ] on: SyntaxErrorNotification do: [:ex | + "In 3.10, the class category needs to be set" + ex instVarNamed: #category put: aClass category. + "Let the user fix and install the fixed code into the class's old or temporary MethodDictionary" + ex outer. + "Now fetch and use that code instead" + source := aClass sourceCodeAt: self selector ifAbsent: [^ nil]. + ^ aClass compiledMethodAt: self selector + ]!
Item was added: + ----- Method: MethodEditor>>source (in category 'accessing') ----- + source + ^ source!
Item was added: + ----- Method: RootClassEditor>>edUltimateMethodAt:ifAbsent: (in category 'accessing') ----- + edUltimateMethodAt: aSelector ifAbsent: aBlock + ^ aBlock value!
Item was added: + ----- Method: PureBehaviorEditor>>ensuredCompilerClass (in category 'accessing') ----- + ensuredCompilerClass + "Answer the compiler for my methods, building it if necessary" + + ^ self product compilerClass!
Item was removed: - ----- Method: MetaclassEditor>>lookupSelector: (in category 'debugging') ----- - lookupSelector: aSelector - - "Override the implementation in Behavior to make ClassEditor - debuggable. The debugger calls this during simulated execution, - and since we override #includesSelector and #superclass to - reflect on the subject, we get incorrect method dispatch." - - | lookupClass dict | - lookupClass := self. - [lookupClass == nil] whileFalse: - [dict := lookupClass instVarAt: 2. - (dict includesKey: aSelector) - ifTrue: [^ dict at: aSelector]. - lookupClass := lookupClass instVarAt: 1]. - ^ nil!
packages@lists.squeakfoundation.org