protected override object DoesNotUnderstand(Machine machine, IObject self, string msgname, object[] args) { if (self != null && !(self is IBehavior)) return base.DoesNotUnderstand(machine, self, msgname, args); if (msgname.Equals("new")) return ((IBehavior)self).NewObject(); if (msgname.StartsWith("commentStamp:")) return new ChunkReaderProcessor((Machine mach, ICompiler compiler, string text) => { }, 1); if (msgname == "methods" || msgname.StartsWith("methodsFor:")) { IBehavior behavior = (IBehavior)self; return new ChunkReaderProcessor((Machine mach, ICompiler compiler, string text) => { var method = compiler.CompileInstanceMethod(text, behavior); if (reservedMethods.Contains(method.Name)) return; if (reservedRedefinedMethods.Contains(method.Name) && behavior.GetInstanceMethod(method.Name) != null) return; behavior.DefineInstanceMethod(compiler.CompileInstanceMethod(text, behavior)); }); } if (msgname.StartsWith("new:") && self is NativeBehavior) return ((NativeBehavior)self).CreateObject(args); if (msgname.Equals("subclass:") || msgname.Equals("agent:")) { IClass newclass = machine.CreateClass((string)args[0], (IClass)self); machine.SetCurrentEnvironmentObject(newclass.Name, newclass); if (msgname.Equals("agent:")) ((BaseClass)newclass).IsAgentClass = true; return newclass; } if (msgname.Equals("subclass:instanceVariableNames:") || msgname.Equals("subclass:instanceVariableNames:classVariableNames:poolDictionaries:category:") || msgname.Equals("variableSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:") || // TODO weakSubclass because Pharo Kernel Objects defines one, WeakMessageSend msgname.Equals("weakSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:") || // TODO variableWordSubclass because Pharo Kernel Number use it msgname.Equals("variableWordSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:") || // TODO variableByteSubclass because Pharo Kernel Number use it msgname.Equals("variableByteSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:") || msgname.Equals("agent:instanceVariableNames:") || msgname.Equals("agent:instanceVariableNames:classVariableNames:poolDictionaries:category:")) { string clsname = (string)args[0]; string instancevarnames = (string)args[1]; string classvarnames = args.Length > 2 ? (string)args[2] : string.Empty; IClass newclass = machine.CreateClass((string)args[0], (IClass)self, instancevarnames, classvarnames); if (msgname.StartsWith("agent:")) ((BaseClass)newclass).IsAgentClass = true; if (msgname.StartsWith("variableSubclass:") || msgname.StartsWith("variableWordSubclass:")) ((BaseClass)newclass).IsIndexed = true; if (args.Length >= 5) ((BaseClass)newclass).Category = (string)args[4]; machine.SetCurrentEnvironmentObject(newclass.Name, newclass); return newclass; } if (msgname.Equals("subclass:nativeType:")) { Type type = (Type)args[1]; NativeBehavior newbehavior = machine.GetNativeBehavior(type); if (newbehavior == null) { newbehavior = (NativeBehavior)machine.CreateNativeBehavior((IClassDescription)self, type); machine.RegisterNativeBehavior(newbehavior.NativeType, newbehavior); } else if (newbehavior.SuperClass != self) newbehavior.SetSuperClass((IBehavior)self); machine.SetCurrentEnvironmentObject((string)args[0], newbehavior); return newbehavior; } if (msgname.Equals("instanceVariableNames:")) { string names = (string)args[0]; if (!string.IsNullOrEmpty(names)) throw new NotSupportedException(); return self; } return base.DoesNotUnderstand(machine, self, msgname, args); }