public IInterpreter ExplicitDereferencing() { var interpreter = new Interpreter.Interpreter(); foreach (var mutability in Options.AllMutabilityModes) { var env = Language.Environment.Create(new Options() { AllowInvalidMainResult = true, DebugThrowOnError = true, AllowDereference = true }.SetMutability(mutability)); var root_ns = env.Root; VariableDeclaration decl = VariableDeclaration.CreateStatement("x", NameFactory.PointerNameReference(NameFactory.Int64NameReference(env.Options.ReassignableTypeMutability())), ExpressionFactory.HeapConstructor(NameFactory.Int64NameReference(env.Options.ReassignableTypeMutability()), FunctionArgument.Create(Int64Literal.Create("4"))), env.Options.ReassignableModifier()); var main_func = root_ns.AddBuilder(FunctionBuilder.Create( "main", ExpressionReadMode.OptionalUse, NameFactory.Int64NameReference(), Block.CreateStatement(new IExpression[] { // x *Int = new Int(4) decl, // y *Int = x VariableDeclaration.CreateStatement("y", NameFactory.PointerNameReference(NameFactory.Int64NameReference(env.Options.ReassignableTypeMutability())), NameReference.Create("x")), // *x = 7 // y <- 7 Assignment.CreateStatement(Dereference.Create(NameReference.Create("x")), Int64Literal.Create("7")), // z *Int VariableDeclaration.CreateStatement("z", NameFactory.PointerNameReference(NameFactory.Int64NameReference(env.Options.ReassignableTypeMutability())), null, env.Options.ReassignableModifier()), // z = x Assignment.CreateStatement(NameReference.Create("z"), NameReference.Create("x")), // v = y + z // 14 VariableDeclaration.CreateStatement("v", null, ExpressionFactory.Add("y", "z"), env.Options.ReassignableModifier()), // x = -12 Assignment.CreateStatement(NameReference.Create("x"), ExpressionFactory.HeapConstructor(NameFactory.Int64NameReference(env.Options.ReassignableTypeMutability()), FunctionArgument.Create(Int64Literal.Create("-12")))), // *z = *x // z <- -12 Assignment.CreateStatement(Dereference.Create(NameReference.Create("z")), Dereference.Create(NameReference.Create("x"))), // x = -1000 Assignment.CreateStatement(NameReference.Create("x"), ExpressionFactory.HeapConstructor(NameFactory.Int64NameReference(env.Options.ReassignableTypeMutability()), FunctionArgument.Create(Int64Literal.Create("-1000")))), // v = v+z // v = 14 + (-12) Assignment.CreateStatement(NameReference.Create("v"), ExpressionFactory.Add("v", "z")), Return.Create(NameReference.Create("v")) }))); ExecValue result = interpreter.TestRun(env); Assert.AreEqual(2L, result.RetValue.PlainValue); } return(interpreter); }