Ejemplo n.º 1
0
 public void Visit(Instanceof n)
 {
     Helpers.Write("(");
     n.LeftExpression.Accept(this);
     Helpers.Write($" instanceof {n.TypeNameToCheck}");
     Helpers.Write(")");
 }
        public SemanticAtom Visit(Instanceof n)
        {
            var utilizedType = new UtilizedType(n.TypeNameToCheck, n.Location);

            AddToGlobalUtilization(utilizedType, s => { n.RealizedTypeToCheck = s; });

            n.LeftExpression.Accept(this);
            return(null);
        }
        public SemanticAtom Visit(Instanceof n)
        {
            var left         = n.LeftExpression.Accept(this);
            var leftLocation = n.LeftExpression.Location;

            if (!(left is Class))
            {
                Globals.Errors.Add($"[{leftLocation.StartLine}, {leftLocation.StartColumn}] Left expression of operator(instanceof) ({left.Name}) is not a class type.");
            }

            n.RealizedType = Primitive.Boolean;
            return(n.RealizedType);
        }
Ejemplo n.º 4
0
        public void Visit(Instanceof n)
        {
            Helpers.WriteLine($"{_tab}{n.Text} [{n.Location.StartLine}, {n.Location.StartColumn}]");
            Tab();

            Helpers.WriteLine($"{_tab}Left");
            Tab();
            n.LeftExpression.Accept(this);
            Untab();
            Helpers.WriteLine($"{_tab}Right");
            Tab();
            Helpers.WriteLine($"{_tab}{n.TypeNameToCheck}");
            Untab();

            Untab();
        }
Ejemplo n.º 5
0
        public void Visit(Instanceof n)
        {
            Globals.Builder.Start($"instanceof [{n.Location.StartLine}, {n.Location.StartColumn}]");

            var labelFalse = $"instanceofFalse{Globals.Builder.Count()}";
            var labelEnd   = $"instanceofEnd{Globals.Builder.Count()}";

            CanCast(n.LeftExpression, n.RealizedTypeToCheck as Class, false /* check null */);
            Globals.Builder.WriteBinaryOp("cmp", "rax", 0.ToString());
            Globals.Builder.WriteUnaryOp("je", labelFalse);

            Globals.Builder.WriteBinaryOp("mov", "rax", 1.ToString());
            Globals.Builder.WriteUnaryOp("jmp", labelEnd);

            Globals.Builder.WriteLabel(labelFalse);
            Globals.Builder.WriteBinaryOp("mov", "rax", 0.ToString());

            Globals.Builder.WriteLabel(labelEnd);

            Globals.Builder.End($"instanceof [{n.Location.EndLine}, {n.Location.EndColumn}]");
        }