Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!iuvax!cica!ctrsol!ginosko!uunet!mcvax!ukc!icdoc!qmc-cs!markm From: markm@cs.qmc.ac.uk (Mark Magennis) Newsgroups: comp.lang.smalltalk Subject: Re: Adding instance variables to Sm/V classes Message-ID: <1177@sequent.cs.qmc.ac.uk> Date: 3 Aug 89 13:32:35 GMT References: <1174@sequent.cs.qmc.ac.uk> <1176@sequent.cs.qmc.ac.uk> Reply-To: markm@cs.qmc.ac.uk (Mark Magennis) Organization: Computer Science Dept, Queen Mary College, University of London, UK. Lines: 88 Summary: Expires: Sender: Followup-To: Keywords: How embarrasing, sorry. I'm afraid the previous message I sent on this subject was completely wrong. I copied an older and non-working method. I can't even delete it either, it tells me that it's someone elses message. In that case I wont take the blame :-) Here is code that definitely works for Menu class among others, SO FAR. That means my image hasn't fallen over yet, after a lot of menu work. If you want to try it please work on a spare image until you are absolutely sure it is safe with whatever class you wish to use it. Again, this is for a class (Menu) without subclasses. *************************************************************** The new method in Class, removeAndBecome: aClass is a copy of removeFromSystem but with the two occurences of DeletedClass changed to aClass. |newInstance| "Change instances of Menu into instances of NewMenu" Menu allInstances do: [:anInstance | newInstance := NewMenu new. 1 to: Menu instSize do: [:index | newInstance instVarAt: index put: (anInstance instVarAt: index)]. anInstance become: newInstance]. "Copy instance methods from Menu to NewMenu " Menu selectors do: [ :each | NewMenu addSelector: each withMethod: (Menu compiledMethodAt: each)]. "Copy class methods from Menu to NewMenu" Menu class selectors do: [ :each | NewMenu class addSelector: each withMethod: (Menu class compiledMethodAt: each)]. "Copy class variable values from Menu to NewMenu" Menu classVarNames do: [ :aClassVar | NewMenu classPool at: aClassVar put: (Menu classPool at: aClassVar)]. "Set the instance methods' class field to NewMenu" Menu selectors do: [ :each | (Menu compiledMethodAt: each) classField: #NewMenu]. "Set the class methods' class field to NewMenu" Menu class selectors do: [ :each | (Menu class compiledMethodAt: each) classField: NewMenu class]. "Copy the structure variable" NewMenu structure: Menu structure. NewMenu class structure: Menu class structure. "Remove Menu, change references to become NewMenu and rename NewMenu" Menu removeAndBecome: NewMenu. "*A new method in Class*" NewMenu rename: #Menu. "Reset the instance methods' class field to Menu" Menu selectors do: [ :each | (Menu compiledMethodAt: each) classField: #Menu]. "Reset the class methods' class field to Menu" Menu class selectors do: [ :each | (Menu class compiledMethodAt: each) classField: Menu class]. *************************************************************** -- UUCP: markm@qmc-cs.uucp | Computer Science Dept ARPA: markm%cs.qmc.ac.uk@nsfnet-relay.ac.uk | Queen Mary College JANET: markm@uk.ac.qmc.cs | Mile End Road Voice: +44 1 975 5241 (Direct Dial) | London E1 4NS