Subversion Repositories Kolibri OS

Rev

Rev 6613 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6613 Rev 7107
Line 1... Line 1...
1
(*
1
(*
2
    Copyright 2016 Anton Krotov
2
    Copyright 2016, 2017 Anton Krotov
Line 3... Line 3...
3
 
3
 
Line 4... Line 4...
4
    This file is part of Compiler.
4
    This file is part of Compiler.
5
 
5
 
Line 50... Line 50...
50
  IDMOD = 1; IDCONST = 2; IDTYPE = 3; IDVAR = 4; IDPROC = 5; IDSTPROC = 6; IDGUARD = 7; IDPARAM = 8; IDSYSPROC = 9;
50
  IDMOD = 1; IDCONST = 2; IDTYPE = 3; IDVAR = 4; IDPROC = 5; IDSTPROC = 6; IDGUARD = 7; IDPARAM = 8; IDSYSPROC = 9;
Line 51... Line 51...
51
 
51
 
52
  stABS = 1; stODD = 2; stLEN = 3; stLSL = 4; stASR = 5; stROR = 6; stFLOOR = 7; stFLT = 8;
52
  stABS = 1; stODD = 2; stLEN = 3; stLSL = 4; stASR = 5; stROR = 6; stFLOOR = 7; stFLT = 8;
53
  stORD = 9; stCHR = 10; stLONG = 11; stSHORT = 12; stINC = 13; stDEC = 14; stINCL = 15;
53
  stORD = 9; stCHR = 10; stLONG = 11; stSHORT = 12; stINC = 13; stDEC = 14; stINCL = 15;
54
  stEXCL = 16; stCOPY = 17; stNEW = 18; stASSERT = 19; stPACK = 20; stUNPK = 21; stDISPOSE = 22;
54
  stEXCL = 16; stCOPY = 17; stNEW = 18; stASSERT = 19; stPACK = 20; stUNPK = 21; stDISPOSE = 22;
Line 55... Line 55...
55
  stBITS = 23; stLSR = 24; stLENGTH = 25;
55
  stBITS = 23; stLSR = 24; stLENGTH = 25; stMIN = 26; stMAX = 27;
56
 
56
 
Line 57... Line 57...
57
  sysADR = 101; sysSIZE = 102; sysINF = 103; sysGET = 104; sysPUT = 105;
57
  sysADR = 101; sysSIZE = 102; sysINF = 103; sysGET = 104; sysPUT = 105;
Line 58... Line 58...
58
  sysCODE = 106; sysTYPEID = 107; sysMOVE = 108;
58
  sysCODE = 106; sysTYPEID = 107; sysMOVE = 108; sysCOPY = 109;
59
 
59
 
Line 392... Line 392...
392
      NextCoord(coord);
392
      NextCoord(coord);
393
      pExpr(b);
393
      pExpr(b);
394
      IntType(b.T, coord);
394
      IntType(b.T, coord);
395
      IF b.eType = eCONST THEN
395
      IF b.eType = eCONST THEN
396
	Assert(ASR(FLOOR(b.Value), 5) = 0, coord, 53);
396
        Assert(ASR(FLOOR(b.Value), 5) = 0, coord, 53);
-
 
397
        IF a.eType = eCONST THEN
397
	Assert(a.Value <= b.Value, coord, 54)
398
          Assert(a.Value <= b.Value, coord, 54)
-
 
399
        END
398
      END;
400
      END;
399
      Load(b)
401
      Load(b)
400
    ELSE
402
    ELSE
401
      X86.Dup
403
      X86.Dup
402
    END;
404
    END;
Line 613... Line 615...
613
      e.eType := eCONST
615
      e.eType := eCONST
614
    END;
616
    END;
615
    Str(e1);
617
    Str(e1);
616
    e.T := inttype;
618
    e.T := inttype;
617
    X86.StFunc(X86.stLENGTH)
619
    X86.StFunc(X86.stLENGTH)
-
 
620
  |stMIN, stMAX:
-
 
621
    pExpr(e1);
-
 
622
    IntType(e1.T, coord);
-
 
623
    Load(e1);
-
 
624
    Check(lxComma);
-
 
625
    NextCoord(coord);
-
 
626
    pExpr(e2);
-
 
627
    IntType(e2.T, coord);
-
 
628
    Load(e2);
-
 
629
    IF (e1.eType = eCONST) & (e2.eType = eCONST) THEN
-
 
630
      a := FLOOR(e1.Value);
-
 
631
      b := FLOOR(e2.Value);
-
 
632
      CASE func OF
-
 
633
      |stMIN: a := MIN(a, b)
-
 
634
      |stMAX: a := MAX(a, b)
-
 
635
      ELSE
-
 
636
      END;
-
 
637
      e.Value := LONG(FLT(a));
-
 
638
      e.eType := eCONST
-
 
639
    END;
-
 
640
    IF func = stMIN THEN
-
 
641
      X86.StFunc(X86.stMIN)
-
 
642
    ELSE
-
 
643
      X86.StFunc(X86.stMAX)
-
 
644
    END;
-
 
645
    e.T := inttype
618
  |sysADR:
646
  |sysADR:
619
    Assert((SCAN.tLex = lxIDENT) OR (SCAN.tLex = lxSTRING) OR (SCAN.tLex = lxCHX), coord, 43);
647
    Assert((SCAN.tLex = lxIDENT) OR (SCAN.tLex = lxSTRING) OR (SCAN.tLex = lxCHX), coord, 43);
620
    IF SCAN.tLex = lxIDENT THEN
648
    IF SCAN.tLex = lxIDENT THEN
621
      Designator(e1);
649
      Designator(e1);
622
      Assert((e1.eType = eVAR) OR (e1.eType = ePROC) OR (e1.T = strtype), coord, 43);
650
      Assert((e1.eType = eVAR) OR (e1.eType = ePROC) OR (e1.T = strtype), coord, 43);
Line 1634... Line 1662...
1634
    X86.EndCall;
1662
    X86.EndCall;
1635
    NextCoord(coord);
1663
    NextCoord(coord);
1636
    Expr(e1);
1664
    Expr(e1);
1637
    IntType(e1.T, coord);
1665
    IntType(e1.T, coord);
1638
    Load(e1);
1666
    Load(e1);
-
 
1667
  |sysCOPY:
-
 
1668
    begcall := X86.current;
-
 
1669
    Designator(e1);
-
 
1670
    Assert(e1.eType = eVAR, coord, 63);
-
 
1671
    Check(lxComma);
-
 
1672
    X86.PushCall(begcall);
-
 
1673
    X86.Param;
-
 
1674
    NextCoord(coord);
-
 
1675
    Designator(e1);
-
 
1676
    Assert(e1.eType = eVAR, coord, 63);
-
 
1677
    Assert(~e1.Read, coord, 115);
-
 
1678
    Check(lxComma);
-
 
1679
    X86.EndCall;
-
 
1680
    NextCoord(coord);
-
 
1681
    Expr(e1);
-
 
1682
    IntType(e1.T, coord);
-
 
1683
    Load(e1);
1639
  ELSE
1684
  ELSE
1640
    Assert(FALSE, coord2, 132)
1685
    Assert(FALSE, coord2, 132)
1641
  END;
1686
  END;
1642
  Check(lxRRound);
1687
  Check(lxRRound);
1643
  Next;
1688
  Next;
1644
  IF proc = sysMOVE THEN
1689
  IF (proc = sysMOVE) OR (proc = sysCOPY) THEN
1645
    X86.StProc(X86.sysMOVE)
1690
    X86.StProc(X86.sysMOVE)
1646
  END
1691
  END
1647
END StProc;
1692
END StProc;
Line 1648... Line 1693...
1648
 
1693
 
Line 1676... Line 1721...
1676
    ELSIF (e2.T.tType = TSTRING) & (e1.T.tType = TARRAY) THEN
1721
    ELSIF (e2.T.tType = TSTRING) & (e1.T.tType = TARRAY) THEN
1677
      s := DECL.GetString(e2.Value);
1722
      s := DECL.GetString(e2.Value);
1678
      IF s.Len = 1 THEN
1723
      IF s.Len = 1 THEN
1679
	X86.Mono(s.Number)
1724
        X86.Mono(s.Number)
1680
      END;
1725
      END;
1681
      X86.PushConst(UTILS.min(s.Len + 1, e1.T.Len))
1726
      X86.PushConst(MIN(s.Len + 1, e1.T.Len))
1682
    END;
1727
    END;
1683
    X86.Save(e1.T.tType)
1728
    X86.Save(e1.T.tType)
1684
  ELSIF e1.eType = ePROC THEN
1729
  ELSIF e1.eType = ePROC THEN
1685
    Assert((e1.id.T.Base.tType = TVOID) OR (e1.id.T.Call = DECL.winapi), coord, 132);
1730
    Assert((e1.id.T.Base.tType = TVOID) OR (e1.id.T.Call = DECL.winapi), coord, 132);
1686
    IF e1.id.ParamCount > 0 THEN
1731
    IF e1.id.ParamCount > 0 THEN