public object Execute(object receiver, params object[] arguments)
        {
            IClass self = (IClass)receiver;
            string name = (string)arguments[0];

            self.AddVariable(name);

            // TODO review what to return
            return(name);
        }
        public void ShouldCompileSetMethod()
        {
            PepsiMachine machine = new PepsiMachine();
            IClass       cls     = machine.CreateClass();

            cls.AddVariable("x");
            Compiler compiler = new Compiler("x: newX [x := newX]");

            compiler.CompileInstanceMethod(cls);

            Assert.IsNotNull(cls.Lookup("x:"));
        }
        public void ShouldCompileMethodWithLocals()
        {
            PepsiMachine machine = new PepsiMachine();
            IClass       cls     = machine.CreateClass();

            cls.AddVariable("x");
            Compiler compiler = new Compiler("x [| temp | temp := x. ^temp]");

            compiler.CompileInstanceMethod(cls);

            Assert.IsNotNull(cls.Lookup("x"));
        }
        public void ShouldDefineSubclassWithVariables()
        {
            IClass baseClass = new BaseClass();

            baseClass.AddVariable("a");

            IClass subClass = (IClass)baseClass.CreateDelegated();

            subClass.AddVariable("b");

            Assert.AreEqual(1, baseClass.InstanceSize);
            Assert.AreEqual(2, subClass.InstanceSize);
            Assert.AreEqual(0, baseClass.GetInstanceVariableOffset("a"));
            Assert.AreEqual(-1, subClass.GetInstanceVariableOffset("a"));
            Assert.AreEqual(1, subClass.GetInstanceVariableOffset("b"));
        }
        public void ShouldCreateSubclassInstanceWithVariables()
        {
            IClass baseClass = new BaseClass();

            baseClass.AddVariable("a");

            IClass subClass = (IClass)baseClass.CreateDelegated();

            subClass.AddVariable("b");

            IObject instance = subClass.CreateInstance();

            Assert.IsNotNull(instance);
            Assert.AreEqual(2, instance.Size);
            Assert.IsNull(instance.GetValueAt(0));
            Assert.IsNull(instance.GetValueAt(1));
        }
Exemple #6
0
        public IObject CreatePrototype(string prototypeName, string superName, List <string> variableNames)
        {
            IObject   super      = (IObject)this.globals[superName];
            IBehavior superclass = (IBehavior)super.Behavior;
            IClass    cls        = (IClass)superclass.CreateDelegated();

            if (variableNames != null)
            {
                foreach (string name in variableNames)
                {
                    cls.AddVariable(name);
                }
            }

            IObject obj = cls.CreateInstance();

            this.globals[prototypeName] = obj;
            return(obj);
        }
Exemple #7
0
        public void ShouldCompile()
        {
            PepsiMachine machine = new PepsiMachine();
            IClass       cls     = machine.CreateClass();

            cls.AddVariable("x");

            Block block;

            block = new Block();
            block.CompileArgument("newX");
            block.CompileGet("newX");
            block.CompileSet("x");

            Assert.AreEqual(1, block.Arity);
            Assert.AreEqual(0, block.NoLocals);
            Assert.IsNotNull(block.ByteCodes);
            Assert.IsTrue(block.ByteCodes.Length > 0);
        }
        public static IClass CompileClass(string clsname, string[] varnames, string[] methods)
        {
            PepsiMachine machine = new PepsiMachine();
            IClass       cls     = machine.CreateClass();

            if (varnames != null)
            {
                foreach (string varname in varnames)
                {
                    cls.AddVariable(varname);
                }
            }

            if (methods != null)
            {
                foreach (string method in methods)
                {
                    Compiler compiler = new Compiler(method);
                    compiler.CompileInstanceMethod(cls);
                }
            }

            return(cls);
        }