Subversion Repositories Kolibri OS

Rev

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

Rev 7693 Rev 7696
Line 1... Line 1...
1
(*
1
(*
2
    BSD 2-Clause License
2
    BSD 2-Clause License
Line 3... Line 3...
3
 
3
 
4
    Copyright (c) 2018, 2019, Anton Krotov
4
    Copyright (c) 2018-2019, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
Line 6... Line 6...
6
*)
6
*)
Line 265... Line 265...
265
 
265
 
266
PROCEDURE assigncomp (e: PARS.EXPR; t: PROG.TYPE_): BOOLEAN;
266
PROCEDURE assigncomp (e: PARS.EXPR; t: PROG.TYPE_): BOOLEAN;
267
VAR
267
VAR
Line 268... Line -...
268
    res: BOOLEAN;
-
 
269
 
-
 
270
 
-
 
271
    PROCEDURE arrcomp (src, dst: PROG.TYPE_): BOOLEAN;
-
 
272
        RETURN (dst.typ = PROG.tARRAY) & PROG.isOpenArray(src) &
-
 
273
                ~PROG.isOpenArray(src.base) & ~PROG.isOpenArray(dst.base) &
-
 
274
                PROG.isTypeEq(src.base, dst.base)
-
 
275
    END arrcomp;
-
 
276
 
268
    res: BOOLEAN;
277
 
269
 
-
 
270
BEGIN
278
BEGIN
271
    IF isExpr(e) OR (e.obj IN {ePROC, eIMP}) THEN
279
    IF isExpr(e) OR (e.obj IN {ePROC, eIMP}) THEN
272
 
280
        IF arrcomp(e.type, t) THEN
273
        IF t = e.type THEN
281
            res := TRUE
274
            res := TRUE
282
        ELSIF isInt(e) & (t.typ IN {PROG.tBYTE, PROG.tINTEGER}) THEN
275
        ELSIF isInt(e) & (t.typ IN {PROG.tBYTE, PROG.tINTEGER}) THEN
283
            IF (e.obj = eCONST) & (t = tBYTE) THEN
276
            IF (e.obj = eCONST) & (t = tBYTE) THEN
284
                res := ARITH.range(e.value, 0, 255)
277
                res := ARITH.range(e.value, 0, 255)
285
            ELSE
278
            ELSE
286
                res := TRUE
-
 
287
            END
-
 
288
        ELSIF isSet(e) & (t = tSET) THEN
-
 
289
            res := TRUE
279
                res := TRUE
290
        ELSIF isBoolean(e) & (t = tBOOLEAN) THEN
-
 
291
            res := TRUE
-
 
292
        ELSIF isReal(e) & (t = tREAL) THEN
-
 
293
            res := TRUE
-
 
294
        ELSIF isChar(e) & (t = tCHAR) THEN
280
            END
295
            res := TRUE
-
 
296
        ELSIF (e.obj = eCONST) & isChar(e) & (t = tWCHAR) THEN
281
        ELSIF
297
            res := TRUE
-
 
298
        ELSIF isStringW1(e) & (t = tWCHAR) THEN
-
 
299
            res := TRUE
-
 
300
        ELSIF isCharW(e) & (t = tWCHAR) THEN
282
            (e.obj = eCONST) & isChar(e) & (t = tWCHAR)
301
            res := TRUE
-
 
302
        ELSIF PROG.isBaseOf(t, e.type) THEN
283
            OR isStringW1(e) & (t = tWCHAR)
303
            res := TRUE
-
 
304
        ELSIF ~PROG.isOpenArray(t) & ~PROG.isOpenArray(e.type) & PROG.isTypeEq(t, e.type) THEN
284
            OR PROG.isBaseOf(t, e.type)
305
            res := TRUE
285
            OR ~PROG.isOpenArray(t) & ~PROG.isOpenArray(e.type) & PROG.isTypeEq(t, e.type)
306
        ELSIF isNil(e) & (t.typ IN {PROG.tPOINTER, PROG.tPROCEDURE}) THEN
286
            OR isNil(e) & (t.typ IN {PROG.tPOINTER, PROG.tPROCEDURE})
307
            res := TRUE
-
 
308
        ELSIF isString(e) & ((t.typ = PROG.tARRAY) & (t.base = tCHAR) & (t.length > strlen(e))) THEN
287
            OR PROG.arrcomp(e.type, t)
-
 
288
            OR isString(e) & (t.typ = PROG.tARRAY) & (t.base = tCHAR) & (t.length > strlen(e))
309
            res := TRUE
289
            OR isStringW(e) & (t.typ = PROG.tARRAY) & (t.base = tWCHAR) & (t.length > utf8strlen(e))
310
        ELSIF isStringW(e) & ((t.typ = PROG.tARRAY) & (t.base = tWCHAR) & (t.length > utf8strlen(e))) THEN
290
        THEN
311
            res := TRUE
291
            res := TRUE
312
        ELSE
292
        ELSE
313
            res := FALSE
293
            res := FALSE
314
        END
294
        END
315
    ELSE
295
    ELSE
-
 
296
        res := FALSE
316
        res := FALSE
297
    END
317
    END
298
 
Line 318... Line 299...
318
    RETURN res
299
    RETURN res
Line 382... Line 363...
382
PROCEDURE assign (e: PARS.EXPR; VarType: PROG.TYPE_; line: INTEGER): BOOLEAN;
363
PROCEDURE assign (e: PARS.EXPR; VarType: PROG.TYPE_; line: INTEGER): BOOLEAN;
383
VAR
364
VAR
384
    res:    BOOLEAN;
365
    res:    BOOLEAN;
385
    label:  INTEGER;
366
    label:  INTEGER;
Line 386... Line -...
386
 
-
 
387
 
-
 
388
    PROCEDURE arrcomp (src, dst: PROG.TYPE_): BOOLEAN;
-
 
389
        RETURN (dst.typ = PROG.tARRAY) & PROG.isOpenArray(src) &
-
 
390
                ~PROG.isOpenArray(src.base) & ~PROG.isOpenArray(dst.base) &
-
 
391
                PROG.isTypeEq(src.base, dst.base)
-
 
392
    END arrcomp;
-
 
393
 
-
 
394
 
367
 
395
BEGIN
368
BEGIN
396
    IF isExpr(e) OR (e.obj IN {ePROC, eIMP}) THEN
369
    IF isExpr(e) OR (e.obj IN {ePROC, eIMP}) THEN
397
        res := TRUE;
370
        res := TRUE;
Line 398... Line 371...
398
        IF arrcomp(e.type, VarType) THEN
371
        IF PROG.arrcomp(e.type, VarType) THEN
399
 
372
 
400
            IF ~PROG.isOpenArray(VarType) THEN
373
            IF ~PROG.isOpenArray(VarType) THEN
401
                IL.Const(VarType.length)
374
                IL.Const(VarType.length)
Line 468... Line 441...
468
            ELSE
441
            ELSE
469
                IL.AddCmd(IL.opCOPY, VarType.size)
442
                IL.AddCmd(IL.opCOPY, VarType.size)
470
            END
443
            END
471
        ELSIF (e.type.typ = PROG.tCARD32) & (VarType.typ = PROG.tCARD32) THEN
444
        ELSIF (e.type.typ = PROG.tCARD32) & (VarType.typ = PROG.tCARD32) THEN
472
            IL.AddCmd0(IL.opSAVE32)
445
            IL.AddCmd0(IL.opSAVE32)
473
        ELSIF (e.type.typ = PROG.tCARD16) & (VarType.typ = PROG.tCARD16) THEN
-
 
474
            IL.AddCmd0(IL.opSAVE16)
-
 
475
        ELSIF ~PROG.isOpenArray(VarType) & ~PROG.isOpenArray(e.type) & PROG.isTypeEq(VarType, e.type) THEN
446
        ELSIF ~PROG.isOpenArray(VarType) & ~PROG.isOpenArray(e.type) & PROG.isTypeEq(VarType, e.type) THEN
476
            IF e.obj = ePROC THEN
447
            IF e.obj = ePROC THEN
477
                IL.AssignProc(e.ident.proc.label)
448
                IL.AssignProc(e.ident.proc.label)
478
            ELSIF e.obj = eIMP THEN
449
            ELSIF e.obj = eIMP THEN
479
                IL.AssignImpProc(e.ident.import)
450
                IL.AssignImpProc(e.ident.import)
Line 640... Line 611...
640
                        END
611
                        END
641
                    ELSE (* WCHAR *)
612
                    ELSE (* WCHAR *)
642
                        stroffs := StringW(e);
613
                        stroffs := StringW(e);
643
                        IL.StrAdr(stroffs)
614
                        IL.StrAdr(stroffs)
644
                    END;
615
                    END;
645
                    IL.codes.dmin := stroffs + p.type.size;
616
                    IL.set_dmin(stroffs + p.type.size);
646
                    IL.Param1
617
                    IL.Param1
647
                ELSE
618
                ELSE
648
                    LoadConst(e);
619
                    LoadConst(e);
649
                    IL.Param1
620
                    IL.Param1
650
                END
621
                END
Line 932... Line 903...
932
                        IL.SysPut(e2.type.size)
903
                        IL.SysPut(e2.type.size)
933
                    END
904
                    END
934
                END
905
                END
Line 935... Line 906...
935
 
906
 
936
            ELSIF (proc = PROG.sysPUT8) OR (proc = PROG.sysPUT16) OR (proc = PROG.sysPUT32) THEN
907
            ELSIF (proc = PROG.sysPUT8) OR (proc = PROG.sysPUT16) OR (proc = PROG.sysPUT32) THEN
937
                PARS.check(e2.type.typ IN {PROG.tINTEGER, PROG.tBYTE, PROG.tCHAR, PROG.tSET, PROG.tWCHAR, PROG.tCARD16, PROG.tCARD32}, pos, 66);
908
                PARS.check(e2.type.typ IN {PROG.tINTEGER, PROG.tBYTE, PROG.tCHAR, PROG.tSET, PROG.tWCHAR, PROG.tCARD32}, pos, 66);
938
                IF e2.obj = eCONST THEN
909
                IF e2.obj = eCONST THEN
939
                    LoadConst(e2)
910
                    LoadConst(e2)
940
                END;
911
                END;
941
                IL.setlast(endcall.prev(IL.COMMAND));
912
                IL.setlast(endcall.prev(IL.COMMAND));
Line 1140... Line 1111...
1140
            PARS.check(isInt(e), pos, 66);
1111
            PARS.check(isInt(e), pos, 66);
1141
            e.type := tBOOLEAN;
1112
            e.type := tBOOLEAN;
1142
            IF e.obj = eCONST THEN
1113
            IF e.obj = eCONST THEN
1143
                ARITH.odd(e.value)
1114
                ARITH.odd(e.value)
1144
            ELSE
1115
            ELSE
1145
                IL.odd
1116
                IL.AddCmd0(IL.opODD)
1146
            END
1117
            END
Line 1147... Line 1118...
1147
 
1118
 
1148
        |PROG.stORD:
1119
        |PROG.stORD:
1149
            PExpression(parser, e);
1120
            PExpression(parser, e);
Line 1154... Line 1125...
1154
                ELSE
1125
                ELSE
1155
                    ARITH.ord(e.value)
1126
                    ARITH.ord(e.value)
1156
                END
1127
                END
1157
            ELSE
1128
            ELSE
1158
                IF isBoolean(e) THEN
1129
                IF isBoolean(e) THEN
1159
                    IL.ord
1130
                    IL.AddCmd0(IL.opORD)
1160
                END
1131
                END
1161
            END;
1132
            END;
1162
            e.type := tINTEGER
1133
            e.type := tINTEGER
Line 1163... Line 1134...
1163
 
1134
 
Line 3255... Line 3226...
3255
 
3226
 
3256
    BEGIN
3227
    BEGIN
Line 3257... Line 3228...
3257
        id := PROG.getIdent(rtl, SCAN.enterid(name), FALSE);
3228
        id := PROG.getIdent(rtl, SCAN.enterid(name), FALSE);
3258
 
3229
 
3259
        IF (id # NIL) & (id.import # NIL) THEN
3230
        IF (id # NIL) & (id.import # NIL) THEN
3260
            IL.codes.rtl[idx] := -id.import(IL.IMPORT_PROC).label;
3231
            IL.set_rtl(idx, -id.import(IL.IMPORT_PROC).label);
3261
            id.proc.used := TRUE
3232
            id.proc.used := TRUE
3262
        ELSIF (id # NIL) & (id.proc # NIL) THEN
3233
        ELSIF (id # NIL) & (id.proc # NIL) THEN
3263
            IL.codes.rtl[idx] := id.proc.label;
3234
            IL.set_rtl(idx, id.proc.label);
3264
            id.proc.used := TRUE
3235
            id.proc.used := TRUE
3265
        ELSE
3236
        ELSE
3266
            ERRORS.WrongRTL(name)
3237
            ERRORS.WrongRTL(name)
Line 3274... Line 3245...
3274
 
3245
 
3275
    IF CPU IN {cpuX86, cpuAMD64} THEN
3246
    IF CPU IN {cpuX86, cpuAMD64} THEN
3276
        getproc(rtl,  "_strcmp",    IL._strcmp);
3247
        getproc(rtl,  "_strcmp",    IL._strcmp);
3277
        getproc(rtl,  "_length",    IL._length);
3248
        getproc(rtl,  "_length",    IL._length);
3278
        getproc(rtl,  "_arrcpy",    IL._arrcpy);
-
 
3279
        getproc(rtl,  "_move",      IL._move);
3249
        getproc(rtl,  "_arrcpy",    IL._arrcpy);
3280
        getproc(rtl,  "_is",        IL._is);
3250
        getproc(rtl,  "_is",        IL._is);
3281
        getproc(rtl,  "_guard",     IL._guard);
3251
        getproc(rtl,  "_guard",     IL._guard);
3282
        getproc(rtl,  "_guardrec",  IL._guardrec);
3252
        getproc(rtl,  "_guardrec",  IL._guardrec);
3283
        getproc(rtl,  "_error",     IL._error);
3253
        getproc(rtl,  "_error",     IL._error);
3284
        getproc(rtl,  "_new",       IL._new);
3254
        getproc(rtl,  "_new",       IL._new);
3285
        getproc(rtl,  "_rot",       IL._rot);
3255
        getproc(rtl,  "_rot",       IL._rot);
3286
        getproc(rtl,  "_strcpy",    IL._strcpy);
3256
        getproc(rtl,  "_strcpy",    IL._strcpy);
3287
        getproc(rtl,  "_move2",     IL._move2);
3257
        getproc(rtl,  "_move",      IL._move);
3288
        getproc(rtl,  "_div2",      IL._div2);
-
 
3289
        getproc(rtl,  "_mod2",      IL._mod2);
-
 
3290
        getproc(rtl,  "_div",       IL._div);
-
 
3291
        getproc(rtl,  "_mod",       IL._mod);
3258
        getproc(rtl,  "_divmod",    IL._divmod);
3292
        getproc(rtl,  "_set",       IL._set);
3259
        getproc(rtl,  "_set",       IL._set);
3293
        getproc(rtl,  "_set2",      IL._set2);
3260
        getproc(rtl,  "_set1",      IL._set1);
3294
        getproc(rtl,  "_isrec",     IL._isrec);
3261
        getproc(rtl,  "_isrec",     IL._isrec);
3295
        getproc(rtl,  "_lengthw",   IL._lengthw);
3262
        getproc(rtl,  "_lengthw",   IL._lengthw);
3296
        getproc(rtl,  "_strcmpw",   IL._strcmpw);
3263
        getproc(rtl,  "_strcmpw",   IL._strcmpw);
3297
        getproc(rtl,  "_dllentry",  IL._dllentry);
3264
        getproc(rtl,  "_dllentry",  IL._dllentry);
Line 3380... Line 3347...
3380
        setrtl
3347
        setrtl
3381
    END;
3348
    END;
Line 3382... Line 3349...
3382
 
3349
 
Line 3383... Line 3350...
3383
    PROG.DelUnused(PARS.program, IL.DelImport);
3350
    PROG.DelUnused(PARS.program, IL.DelImport);
Line 3384... Line 3351...
3384
 
3351
 
3385
    IL.codes.bss := PARS.program.bss;
3352
    IL.set_bss(PARS.program.bss);
3386
 
3353
 
3387
    CASE CPU OF
3354
    CASE CPU OF
3388
    | cpuAMD64:   AMD64.CodeGen(IL.codes, outname, target, options)
3355
    | cpuAMD64:  AMD64.CodeGen(outname, target, options)
Line 3389... Line 3356...
3389
    |   cpuX86:     X86.CodeGen(IL.codes, outname, target, options)
3356
    |   cpuX86:    X86.CodeGen(outname, target, options)