[squeak-dev] Re: FFI on 3.10 Dev image?

Andrew Tween amtween at hotmail.com
Tue Feb 26 08:05:36 UTC 2008


Hi,
I noticed the same problem and tracked it down to this...
ExternalStructure class implements doneCompiling, and doneCompiling is sent 
during the MC1.5 loading process.
(specifically - it is sent from 
ClassBuilder>>name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category:unsafe: 
 )

ExternalStructure class>>doneCompiling then calls  ExternalType 
class>>noticeModificationOf: , which then accesses its StructTypes class 
var.
But ExternalType hasn't been sent #initialize yet, so its StructTypes class 
var is nil.

I presume that the old MC loader loads/initializes things in a different 
order, which is why the problem doesn't occur in a standard 3.10 image.

To workaround the problem, and get FFI loaded, I hacked 
ClassBuilder>>name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category:unsafe: 
so that errors occuring during doneCompiling are ignored. (hacked method 
attached).
FFI then loads ok from Universes, and seems to function correctly.

I've also noticed that preambles and postscripts aren't being run by the 
MC1.5 loader, which causes problems for other packages (such as FreeType 
Plus).

I have added both these issues to Mantis...
http://bugs.squeak.org/view.php?id=6952
http://bugs.squeak.org/view.php?id=6953

Cheers,
Andy



"Ken G. Brown" <kbrown at mac.com> wrote in message 
news:p0624043cc3e90f0bbeb8@[169.254.1.2]...
> Is FFI supposed to load into 3.10?
> When I try loading FFI() from SqueakMap into a fresh sq3.10-7159dev08.02.1 
> I get the following failure:
>
> Ken G. Brown
> -----------------------------------------------------------------------------------
> VM: Mac OS - a SmalltalkImage
> Image: Squeak3.10beta [latest update: #7159]
>
> SecurityManager state:
> Restricted: false
> FileAccess: true
> SocketAccess: true
> Working Dir /mySqueakStuff/Sqkb/Sqkb3.10/sq3.10-7159dev08.02.1
> Trusted Dir /foobar/tooBar/forSqueak/bogus
> Untrusted Dir /Users/kbrownMPro/Library/Preferences/Squeak/Internet/My 
> Squeak
>
> UndefinedObject(Object)>>doesNotUnderstand: #at:ifAbsent:
> Receiver: nil
> Arguments and temporary variables:
> aMessage: at: #ExternalStructure ifAbsent: [] in ExternalType 
> class>>noticeModi...etc...
> Receiver's instance variables:
> nil
>
> [] in ExternalType class>>noticeModificationOf: {[:cls |  type := 
> StructTypes     at: cls name     ifAbsent: [].  type   ifNo...]}
> Arguments and temporary variables:
> aClass: ExternalStructure
> type: nil
> cls: ExternalStructure
>
> ExternalStructure class(Behavior)>>withAllSubclassesDo:
> Receiver: ExternalStructure
> Arguments and temporary variables:
> aBlock: [] in ExternalType class>>noticeModificationOf: {[:cls |  type := 
> Struc...etc...
> Receiver's instance variables:
> superclass: ExternalObject
> methodDict: a MethodDictionary(#free->a CompiledMethod (1328) 
> #longPrintOn:->a ...etc...
> format: 132
> instanceVariables: nil
> organization: ('as yet unclassified')
>
> subclasses: {ExternalData}
> name: #ExternalStructure
> classPool: nil
> sharedPools: an OrderedCollection(FFIConstants)
> environment: a SystemDictionary(lots of globals)
> category: #'FFI-Kernel'
> traitComposition: {}
> localSelectors: nil
> compiledSpec: nil
>
> ExternalType class>>noticeModificationOf:
> Receiver: ExternalType
> Arguments and temporary variables:
> aClass: ExternalStructure
> type: nil
> cls: ExternalStructure
> Receiver's instance variables:
> superclass: Object
> methodDict: a MethodDictionary(#asNonPointerType->a CompiledMethod (3691) 
> #asPo...etc...
> format: 136
> instanceVariables: #('compiledSpec' 'referentClass' 'referencedType')
> organization: ('as yet unclassified')
>
> subclasses: nil
> name: #ExternalType
> classPool: a Dictionary(#AtomicSelectors->nil #AtomicTypeNames->nil 
> #AtomicType...etc...
> sharedPools: an OrderedCollection(FFIConstants)
> environment: a SystemDictionary(lots of globals)
> category: #'FFI-Kernel'
> traitComposition: {}
> localSelectors: nil
>
>
> --- The full stack ---
> UndefinedObject(Object)>>doesNotUnderstand: #at:ifAbsent:
> [] in ExternalType class>>noticeModificationOf: {[:cls |  type := 
> StructTypes     at: cls name     ifAbsent: [].  type   ifNo...]}
> ExternalStructure class(Behavior)>>withAllSubclassesDo:
> ExternalType class>>noticeModificationOf:
> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> ExternalStructure class>>doneCompiling
> [] in 
> ClassBuilder>>name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category:unsafe: 
> {[unsafe   ifFalse: [(self validateSuperclass: newSuper forSubclass: 
> oldClass...]}
> BlockContext>>ensure:
> ClassBuilder>>name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category:unsafe:
> ClassBuilder>>name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category:
> MCClassDefinition>>createUnionClassWith:
> MCClassDefinition>>postinstall
> [] in MCPackageLoader1b>>basicLoad {[:ea | ea postinstall]}
> OrderedCollection>>do:
> MCPackageLoader1b>>basicLoad
> [] in MCPackageLoader1b>>protectedLoad {[self basicLoad]}
> BlockContext>>on:do:
> [] in MCPackageLoader1b>>protectedLoad {[[self basicLoad]   on: 
> InMidstOfFileinNotification   do: [:n | n resume: tr...]}
> BlockContext>>ensure:
> [] in MCPackageLoader1b>>protectedLoad {[[[self basicLoad]   on: 
> InMidstOfFileinNotification   do: [:n | n resume: t...]}
> BlockContext>>on:do:
> MCPackageLoader1b>>protectedLoad
> [] in MCPackageLoader1b>>loadWithNameLike: {[self protectedLoad]}
> [] in MCPackageLoader1b>>useChangeSetNamed:during: {[aBlock value]}
> BlockContext>>ensure:
> MCPackageLoader1b>>useChangeSetNamed:during:
> MCPackageLoader1b>>useNewChangeSetNamedLike:during:
> MCPackageLoader1b>>loadWithNameLike:
> MCVersionLoader>>loadWithNameLike:
> MCVersionLoader>>load
> MCVersionLoader class>>loadVersion:
> MCVersion>>load
> [] in UndefinedObject>>DoIt {[:t2 :t3 |  t1 value: t2 * 2 - 1.  reader := 
> repo versionReaderForFileNamed:...]}
> Array(SequenceableCollection)>>keysAndValuesDo:
> [] in UndefinedObject>>DoIt {[:t1 | #('FFI-Kernel-ar.8.mcz' 
> 'FFI-Tests-ar.2.mcz' 'FFI-Examples-ar.1.mcz' ...]}
> ...etc...
>
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ClassBuilder-nameinEnvironmentsubclassOftypeinstanceVariableNamesclassVariableNamespoolDictionariescategoryunsafe.st
Type: application/octet-stream
Size: 3957 bytes
Desc: not available
Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20080226/6bdbf5f3/ClassBuilder-nameinEnvironmentsubclassOftypeinstanceVariableNamesclassVariableNamespoolDictionariescategoryunsafe.obj


More information about the Squeak-dev mailing list