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) |