forked from XusinboyBekchanov/fbc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
changelog.txt
3277 lines (3068 loc) · 296 KB
/
changelog.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Version 1.20.0
[changed]
- internal: changes to all backends gcc/llvm/gas64/gas/gas+SSE for floating point comparison handling
- allow '-fpmode fast' command line option for any target (previously was SSE only) - this can be used augment floating point handling where some accuracy is sacrificed for smaller and faster code generation
- CBOOL(float-expression) returns false if and only if float-expression is zero (0), otherwise returns true (including NaN's)
- if (float-expression) then .. equivalent to if cbool(float-expression) ...
[added]
- x86_64: optimize SHL MOD INTDIV to use 32-bit operation when result will be converted to long/ulong
[fixed]
- github #410: give consistent floating point comparisons results involving NaNs.
- consistent handling for float comparisons involving NaN's. gcc/gas64/gas/gas+SSE (LLVM not-tested) - this includes IF expr then, IIF(), CBOOL, result = (a rel-op b), etc.
- sf.net #984: Incorrect syntax for a member array passed as argument to a procedure
- github #292: Boolean bitfields writes treated as 32/64-bit rather than 8-bit
Version 1.10.1
[changed]
- rtlib: printf format specifier, use 'll' instead of 'I64' if building for ucrt or mingw-w64's stdio implementation (for newer gcc versions and c std)
- gcc backend: use 'char' types for zstring instead of 'uint8' to avoid warnings in newer gcc 11+
- release: update to build libffi 3.4.4 - this is needed to work with newer mingw-w64 based toolchains for gcc 11.x and up
- emscripten/fbc: in debug version of fbc (__FB_DEBUG__<>0) allow wchar conversion on win32 host to allow building and testing of the test-suite
[added]
- release: add recipes for building fbc distros using gcc-11.2 and gcc-12.2 Mingw-w64 project toolchains
- release: add recipe for building fbc distros using winlibs-gcc-11.2/3/4 toolchain
- fbc: '-fbgfx' command line option to link against correct libfbgfx variant, for platforms (emscripten) where it's not automatic due to missing objinfo support
[fixed]
- sf.net #982: Array descriptors emitted incorrectly in gcc backend
- gas64: emit debug information for statics
- gas64: handle #inf's and NaN's in float comparisons
- unable to set opengl scaling to 1 after initial screen mode - previously: logic error in the driver code prevented the scaling from being set to 1
- emscripten: fbc created faulty static libraries (it called ar instead of emar)
- fbc: emscripten: wstring was broken because sizeof(wstring) was 2 rather than 4
- emscripten: non-graphical programs will now run under node.js. Use -x output.js to produce a .js rather than an .html
- rtlib: emscripten: CURDIR and EXEPATH always returned ""
- emscripten/fbc: -sASYNCIFY wasn't passed to emcc at link-time as needed by recent Emscripten
Version 1.10.0
[changed]
- gcc: '-funwind-tables' enabled on 64-bit targets for stack unwinding (adeyblue)
- fbc: '--eh-frame-hdr' for linking on 64-bit nix targets for stack unwinding (adeyblue)
- x86: arch 686 by default instead of 486 (SARG)
- x86: arch 586 by default instead of 486 on DOS
- asm backend: only with 686 arch, use of fcomi(p) to avoid slower instructions and also less code (SARG)
- fbc: #DUMP <expr> and #ODUMP <expr> pragmas only available in debug version of fbc
- inc/fbmath.bi renamed to inc/fbprng.bi
- fbc: file I/O statements return "Expected file number expression" when checking for file number expression
- fbc: [LINE] INPUT statements return "Expected ',' or ';'" error when checking for the comma or semi-colon separator
- sf.net #953: fbc: improve compile time error messages for INPUT [#] statements
- sf.net #953: fbc: improve compile time error messages for LINE INPUT [#] statements giving better positional information
- sf.net #826: fbc: booleans are ranked against integer types to determine closest match in type resolution
- sf.net #455: fbc: Allow &nnn... octal literals in source (like VALINT and friends)
- fbc: automatically restart fbc/parser at first executable statement if required after preprocessor statements parsed
- fbc: -forcelang overrides default lang, -lang, previous -forcelang, #lang, #cmdline "-lang", #cmdline "-forcelang"
- fbc: allow gnu triplets for -target option even in standalone builds
- gfxlib2: store alpha from source to destination when blending alpha primitives in MMX blender to match C blender
- makefile: internal rename (TARGET_PRFEX => BUILD_PREFIX) and conditionally set the library and object directories (default is still based on TARGET)
- fbc: dos: set DXE_LD_LIBRARY_PATH environment variable when calling DXE3GEN
- release: target DOS gcc 9.3.0 and binutils 2.35.1 for next release
- Unix GETMOUSE() under TERM=linux now requires libgpm 1.20.4 or higher (libgpm.so.2), instead of the older libgpm.so.1 versions. (for compatibility with modern Debian/Ubuntu versions, and probably other distros, since 2008)
- gas64 : SGN type is INTEGER for whole numbers instead LONG
- fbc: thiscall calling convention default for extern "c++" / win32 / x86 / non-static member procedures
- fbc: disable byval cva_list returns on ARM targets
- fbc: If a procedure definition has a declaration and the definition does not explicitly specify a calling convention, then the calling convention is implied by the declaration.
- fbc: Improve handling of closing parenthesis in first argument of a procedure call for some expressions (sf.net # 468). If there is no leading parenthesis, then there should be no ambiguity that the procedure is being invoked without the parentheses
- fbc: remove #pragma push( lookup108 ) to use symbol lookup method from fbc-1.08.x and earlier on unqualified symbol names - it was crutch for fb 1.09.0 to help with testing and transition to better lookups
- fbc: passing byval constructor preference: prefer A.constructor( B ) instead of of B.operator CAST() as A + A.constructor() when passing UDT by value - this is to fix some inconsistencies in the rules when converting by construction one type to another
- fbc: only up-cast initializers when needed. New behaviour is to try matching initializers without up-casting before matching with up-casting.
- fbc: don't join operators separated by white space. Previously, '<' + '=', '<' + '>', '=' + '>', and '-' + '>' were joined together even if separated by whitespace.
- fbc: don't skip whitespace between decimal point and digit. Previously, '.' + '0..9' floating point literals were allowed to be separated by whitespace.
- gfxlib2: gfx_dos drivers initialize the internal dirty array based on scanline size
[added]
- gas/gas64: '.cif_sections' and '.cif_' directives for stack unwinding (adeyblue)
- gas/gas64: '.seh_' directives for stack unwinding (adeyblue)
- fbc: '-eunwind' command line option to enable stack unwind information, implied by '-e', '-ex', '-exx'
- fbc: set bit value '__FB_ERR__' = &h200 if '-eunwind' is enabled
- gas64 : stack overflow check (total of all local variables) at compile time --> warning - stack size for linux = 8MB, for Windows = default or defined by user (SARG)
- gas64 : stack overflow check at run time if -exx is used - stack size for linux = 8MB, for Windows = default or defined by user (SARG)
- fbc: debug pragma #LOOKUP <sym>
- rtlib: DOS serial driver - add support for second PIC and IRQ 8 to 15
- fbc allow '-target i386-pc-msdosdjgpp' and similar for cross compiling dos targets (even in stand alone)
- rtlib: ./inc/fbc-int/system.bi - for fb_CpuDetect()
- gfxlib2: ./inc/fbc-int/gfx.bi - to expose FB_GFXCTX structure and some typedefs from gfx lib (useful for some tests in the test-suite)
- fbc: basic-macros: add __FB_IIF__( compare-expr, true-expr, false-expr ) macro
- github #357: fbc: add '-buildprefix <name>' command line option to specify tool name prefix in both fbc standalone and normal set-ups. Overrides default 'target-' prefix on tool names in normal fbc set-up
- fbgfx.bi: add scancode SC_CENTER=&h4C as alias for SC_CLEAR - used for NUMPAD 5 key
- makefile: 'DISABLE_GAS64_DEBUG=1' makefile configuration option to disable debugging comments in gas64 asm files
- gfxlib2: add FB.GET_SCANLINE_SIZE to fbgfx.bi and ScreenControl() to get current internal scan line size multiplier
- gfxlib2: SCREENCONTROL: add getters for GL parameters - new GET_GL_* constants in fbgfx.bi
- fbc: allow a TYPE or UNION to be declared inside another TYPE or UNION to allow declaration of nested named types. Support c++ name mangling parameters of named nested types. Support definition of variables declared in a named nested type.
- Name mangling for c++ 'char' through BYTE/UBYTE parameters using the form "[unsigned] byte alias "char". Data type size is still 8 byte signed/unsigned from fbc side, but will be mangled as 'char'; neither signed nor unsigned for the c++ side.
- Support 'SOURCE_DATE_EPOCH' environment variable for controlling the instrinsic __DATE__, __DATE_ISO__, __TIME__ macros. This in turn controls __FB_BUILD_DATE__ and __FB_BUILD_DATE_ISO__ macros when building the compiler. Report error message on malformed values.
- fbc -nolib a,b,c command line option for selectively excluding specific libraries when linking (more fine-grained control than -nodeflibs, and not only for default libraries)
- fbc will restart the parser when #cmdline "-mt" is used or usage of any threaded functions automatically enable -mt. This allows the compiler to parse the current module from the beginning and process any __FB_MT__ checks.
- fbc: __fastcall support for gcc/gas 32-bit x86 - fbc passes first and second integer arguments in ECX and EDX registers respectively, caller cleans up stack.
- fbc: __FB_QUERY_SYMBOL__( what, sym ) built-in macro for querying fbc symbol internals. Added fbc-int/symbol.bi.
- add '-z retinflts' command line option for code generation. This option enables returning some structures (types) in floating point registers. This is a work-around for different handling of structs returned by value on different tool chains / targets.
- fbgfx.bi: add private function fb.__pixels() to return a pointer to the image data (paul doe)
- fbc: add command line option and warning '-w upcast' to warn when up-casting would discard initializers
- fbc headers: add ./inc/fblimits.bi for minimum and maximum value constants - for example fb.MIN_VALUE_INTEGER and fb.MAX_VALUE_INTEGER
- In normal build of fbc, try to automatically use gcc to query the search path for a std c++ library. This helps with dependency for tests/cpp and for some users that want to interop with c++
- Add makefile option DISABLE_STDCXX_PATH to disable using gcc to search for some c++ library path
- fbc: allow typename.member symbol checks for #ifdef / #ifndef / defined() where member can be a data field, static data field, nested type, constructor, destructor, property, operator (self-assignment, new, new[], delete, delete[], let, cast, for, step, next), or member procedure.
- rtlib: dos: add "__fb_dos_no_dpmi_yield" variable to control calling "__dpmi_yield()" and prevent a crash under some dos extenders in dosbox
- fbc: PROCPTR( UDT.member [, ANY|SUB|FUNCTION ...] ) to get a procedure pointer for type member procedures. If the member is abstract, then return 0 (null function pointer of the member procedure's call signature)
- fbc: PROCPTR( UDT.member [, VIRTUAL ANY|SUB|FUNCTION ...] ) to get the zero based index in the virtual table. If there is no virtual table entry (or no virtual table at all) then return the special value of -1
[fixed]
- gas64: missing restoring of use of one virtual register on sqr for float (SARG)
- gas64: variable of constant datatype not propagated when emitting uop (SARG)
- llvm: add missing data type in datatype array (not tested)
- sf.net #951: fbc: remove guessed type for cva_list (aka __builtin_va_list)
- sf.net #952: fbc: CINT (and other conversion keywords) fails - don't allow inexact conversions or casts from UDT cast operators
- sf.net #817: fbc: Type mismatch not detected when passing an array of UDT incompatible with the expected UDT
- sf.net #953: fbc: no error generated on INPUT #h, "text" statements
- sf.net #953: fbc: no error generated on LINE INPUT #h, "text" statements
- sf.net #826: fbc: Weird overload resolution with booleans
- sf.net #916: fbc: 'LINE INPUT [#1 | prompt,] variable [, maxchars]' requires length parameter for ZSTRING/WSTRING PTR variable
- sf.net #916: fbc: Error on LINE INPUT [#1] if either missing or irrelevant max length argument
- sf.net #892: fbc: Bug when default calling via a pointer to a 'Sub' defined with the only 'Any Ptr' optional parameter
- github #403: fbc: The default value of the parameter was passed incorrectly when calling the pointer function (Skyfish) [optional parameter values are specified by the function pointer declaration]
- sf.net #944: fbc: regression - local static arrays shouldn't have the array descriptor moved to global scope - partially revert #944 and add test
- fbc: parser skips extra token on error recovery for #if/#ifndef/defined() statements
- sf.net #455: fbc: Number lexing allows much bad input - a show a warning message "Expected digit" where '&o', '&h', '&b' has no digits following
- gas64: initialize debug structure even if not emitting debug info to prevent errors due to setup changes by #cmdline inside the parser
- fbc: don't allow '-lang' option to override '-forcelang' option on command line
- github #199: Gfxlib Different Pixel Output Between C & MMX - change MMX Alpha blenders to match C blenders
- github #368: Fix mangling involving toplevel CONST and abbreviations (dkl)
- fbc: dos: invoke dxe3gen when cross compiling to dos - previously only executed on DOS host
- fbc: dos: when invoking dxe3gen on cross compiler, don't write to ldopt.tmp, dxe3gen doesn't seem to be able to handle the ldopt.tmp argument
- fbc: remove double path separator characters '/', '\' when setting the fbc path prefix
- rtlib: multikey was missing VK_NUMPAD5 and SC_CLEAR scancodes in the key table, causing NUMPAD-5 to be handled as escape in the windows D2D gfx driver
- sf.net: #961: rtlib/gfxlib: COLOR() function returns LONG but should be ULONG
- The DISABLE_GPM build option for the Unix rtlib now only disables GETMOUSE() for TERM=linux, which is the case that uses GPM, however GETMOUSE() for TERM=xterm now keeps working under DISABLE_GPM, since that case does not use GPM.
- Unix rtlib: Multi-threaded use of shell()/exec()/dylibload()/dylibfree() can no longer cause input/output terminal configuration cleanup at program exit to fail
- sf.net #965: fbc: Bad code generation in gcc backend for NOT PTR_EXPR - don't allow unary ops on pointers
- Internal (unit tests): Stack corruption in mid() tests (regression from 1.07.0)
- gfxlib2: LINE statement computing an incorrect line style pattern on any non-X86 (i.e. 64-bit, etc)
- github #393: rtlib: OPEN fails when opening an encoded file for append. Check the BOM on existing files for INPUT/APPEND, write the BOM for new files for OUTPUT/APPEND.
- sf.net #968: fbc: major changes how initializers are handled and pairing of a UDT's (internal) structure and the initializer list given by the user.
- fbc: show an error on byref initializers that can't take address of. Previously this was checked by fbc debug assertion only.
- sf.net #894: Can't initialise a UDT as copy of another if the first element is a UNION, fixed by sf.net #968
- sf.net #922: Sometimes can't use extra backets inside TYPE UDT initialiser - now, don't allow optional parentheses when parsing type<UDT>(...) if left parenthesis is found
- sf.net #824: Illegal destructor call after '#print typeof( f() )' when f() is a function returning an object by value
- fbc: delete destructor calls of discarded expressions in IIF(), previously, unscoped dtors (to be called after the expression) and deleted dtors (to be never called) were being handled the same
- gas backend: fix spill registers when all reused registers are within the same emit operation
- github #404: gas64: fix stack size and alignment for GOSUB usage (SARG)
- fbc: #macro definition parsing incorrectly handles single line comments ending with line continuation character and incorrectly joins the following line to the comment
- fbc: add special handling for #inclib "fbgfx?" to fix incorrect linking to non-threaded gfx library. #include "fbgfx.bi" was causing the libfbgfx library to always be linked even when thread safe version was expected (causing deadlocks in user programs)
- gfxlib2: fix dos keyboard handler so that left shift key will release in multikey() checks
- sf.net #970: Illicit "error 202: Illegal member access, UDT.operator.cast" compiler error message - suppress bogus error message when checking procedure overloads for possible candidate
- sf.net #811: *(ptr).field should give an error
- sf.net #972: A local Type cannot access members of an inherited Type external to its scope but normally accessible
- sf.net #834: Line continuation not handled during #if 0 skipping - fixed by ignoring line continuation characters and invalid directives - continue to preserve multiline comment parsing
- fbc: internal: throw an error if __FB_EVAL__ would cause the parser to nest too deeply
- fbc: improve code generation for structs returned by value and structs returned in registers - some structs where not handled correctly and had mismatched code generation when mixing modules with different fbc backends or linking again c libraries (e.g. gas+gcc or gas64+gcc) resulting in stack corruption or wrong values returned in structs
- gas64: improve code generation for structs returned by value, fix optimization no 16, fix relocations for static / shared in shared libraries
- fbgfx.bi: fix structures and declarations for #lang "qb" (paul doe)
- gas64: fix structures passed by upcasting (SARG)
- fbc: discard assignments and constructor calls in initializers that would write outside of the target when emitting initializer lists - previously, up-casted initializers were writing beyond the limits of the target and trashing memory
- fix regression due to previous change on sf.net #917: optimization of 'm += s'. The optimization failed to consider 's = s + expr' where expr might contain 's'. In such a case, the optimization cannot be applied.
- fbc: basic-macros: improve the handling of optional parens in function like macros by ending a macro argument list on the number of arguments expected (non-variadic macros only).
- fbc: bad error recovery after overloaded operator [] caused compiler crash, for example if overloaded operator [] is found but can't be used due to mixing const and non-const types, or invalid members
- fbc: improve error message 215 to indicate that only static members can be accessed from parameter intializers as well as static functions
- fbc: #cmdline "-c ..." needs to restart parser since code generation is affected. The implicit main was being emitted even when '-c' was give in #cmdline and was working differently than when '-c' given on the actual command line.
- fbc: extend lifetime of temporary variables in WITH TYPE(...) expressions to the END WITH statement
- fbc: #cmdline "-r -rr -R -RR -o objfile ..." needs to restart the parser and handle changes in keeping the ASM file. In the case of '-o objfile' a major restart is needed since some initialization of filenames is done before parsing starts. By default the temporary ASM file was being kept even if #cmdline options indicate to keep it.
- sf.net #569: gfxlib2: GetMouse/SetMouse scaling problem in QB modes Screen 2 & 8 - adjust GetMouse/SetMouse by internal scanline_size
- fbc: fbc: fix bad error recovery on BYREF intializer. 'Dim Byref As UDT u = UDT()' would case compiler crash if UDT constructor argument optional
Version 1.09.0
[changed]
- github #314: fbc: pass '-T scriptfile' option to linker LD and add 'INSERT AFTER .data;' to fbextra.x linker script to quiet warning on LD version 2.36 and higher
- gas64: .a64 replaced by .asm to be coherent with documentation
- fbc-tests: add gcc compiler options -Wno-tautological-compare to quiet the constant comparison warnings in the test-suite
- crt headers: guard some definitions in crt/sys/win32/stat.bi to avoid collisions of 'stat' and 'chmod' with some other crt headers
- crt headers: add const qualifiers in crt/stdlib.bi
- crt headers: add const qualifiers in crt/stdio.bi, crt/sys/stat.bi, crt/wchar.bi
- crt headers: add const qualifiers in crt/sys/win32/stat.bi, crt/win32/stdio.bi
- github #325, #326: fbc: internal changes for string processing functions
- fbc-tests: xargs on freebsd does not support the '-a filename' option, use 'cat filename | xargs' instead
- fbc: gen gcc: allow compiling with GCC 4.5 and older, by avoiding -Wno-unused-but-set-variable (TeeEmCee)
- fbc: internal function fbcQueryGcc() to ask gcc for the correct as & ld to use (TeeEmCee)
- rtlib: freebsd: minimum thread stacksize 8192 KiB
- sf.net #666: allow overload 'as string' with 'as zstring ptr' parameters
- fbc: internal changes to restructure fbctools table, cache search results in fbctoolTB(), solve out fbcFindBin() parameters
- fbc: EXTERN "rtlib" will still mangle internally generated symbols: vtable, rtti, default constructors and destructors
[added]
- fbc: add '-z fbrt' command line option to link against libfbrt*.a instead of libfb*.a
- '-z valist-as-ptr' command line option for varargs. On targets that implement va_list as a pointer, allow overriding gcc __builtin_va* macros with our own expressions
- makefile: add target for fbrt, fb runtime library written in fbc. Bulid libfbrt*.a and merge any missing object modules from libfb*.a
- github #325, #326: fbc: add support for wstrings used with __FB_EVAL__()
- crt headers: minimal crt headers to compile fbc and build test-suite on freebsd-13.0-i386
- darwin: Implemented objinfo for Darwin/OSX Mach-O .o files, so #inclib etc. work (TeeEmCee)
- fbc: add '-entry name' command line option to set program entry point (TeeEmCee)
- added objinfo support for ELF files on freebsd
- PROCPTR( identifier, type ) syntax to allow getting procedure pointer for based on sub/function type
- sf.net #666: overload matching for UDT's with CAST() operators as [w|z]string type and implicit conversions
- makefile: add initial support for powerpc and powerpc64 on FreeBSD (lenoil98)
- makefile: normalize ppc*[le] & powerpc*[le] ARCH to powerpc*[le]
- bootstrap: normalize powerpc bootstrap directories to match ARCH as <os>-<powerpc*>
- bootstrap: add cygwin-x86_64 to the bootstrap package
- fbc: add 'powerpc' and 'powerpc64' cpu families and cpu type for '-arch' command line option (lenoil98)
- fbc: add 'powerpc64le' cpu type for -arch command line option
- fbc: allow shortnames 'ppc', 'ppc64', 'ppc64le' for '-target' command line option
- fbc: add the __FB_PPC__ intrinsic constant (lenoil98)
- fbc: internal add big endian information to the CPUFAMILYINFO() internal table
- fbc: defined __FB_BIGENDIAN__ if cpu type is bigendian
- objinfo: check ELF files for little endian or big endian signature
- fbc: __thiscall declaration support for gcc/gas 32-bit x86. Pass first instance/integer/pointer parameter in ECX, caller cleans up stack except on win32 x86.
- fbc: add __FB_OPTIMIZE__ intrinisic define - always defined and will have a value from 0 to 3 to indicate the optimization level passed to the backend compiler
- github #341: fbc: #cmdline "args..." directive to specify command line arguments within source files, restarting the parser for some options, and restarting fbc for others. Don't allow '-print', '-help' options
- github #341: fbc: #cmdline "-end" will trigger a parser or fbc restart if needed. fbc can't detect the end of reading all the #cmdlines to do this automatically
- github #341: fbc: #cmdline "-restart" will always trigger one fbc restart
- github #341: fbc: only process #cmdline in the first pass of the source module (which must be specified on the real command line)
- github #341: fbc: '-z nocmdline' command line option to ignore #cmdline directives, allows overriding source directives with real fbc command line, show warning if used with '-w all'
- fbc: #cmdline "-version" will immediately print the fbc version information if it was not already printed. To get verbose version information '-v' option must appear before '-version'. fbc command line option '-v' option behaviour overrides #cmdline "-v"
- fbc: '#pragma reserve symbol' statement will reserve a symbol name in the current scope / namespace and generate an error if the symbol redefined or is used in an expression
- fbc: '#pragma reserve (asm) symbol' statement will reserve an ASM symbol name in all ASM statements and blocks
- sf.net #515: fbc: update reserved ASM keywords list for ASM statements and ASM blocks
- fbc: '#pragma reserve (extern) symbol' reserves global symbols. fbc shows a warning if a reserved symbol is used for a public sub or shared variable in the global namespace
- sf.net #645: respect global namespace '.' and '..' prefixes in REDIM
- rtlib: Add new higher baud rates to the serial driver 1500000,2000000,2500000,3000000,35000000,4000000
- fbc: '-w error' command line option to report warnings as errors. Warnings cause the error count to increase, warning messages are displayed as "error warning...", compilation / assembly / linking aborts, fbc exits with an error code
- sf.net #945, #948: improve error message for ambiguous symbol access to list all of the conflicted symbols
- ./inc/fbc-int/array.bi - add fb.ArrayLen( array ) function to return total number of elements in an array
- ./inc/fbc-int/array.bi - add fb.ArraySize( array ) function to return total size of an array in bytes
- fbc: #pragma push( lookup108 ) to use symbol lookup method from fbc-1.08.x and earlier on unqualified symbol names
- fbc: add '-sysroot <path>' command line option to specify the sysroot, needed by some cross-compiling toolchains
[fixed]
- github #315: set parameters when calling SCREENCONTROL (was broken in fbc 1.08.0 due to new LONG/LONGINT SCREENCONTROL API's)
- github #318: duplicate definition for deleting destructor; the deleting destructor was being emitted even though the class was declarations only on the fbc side
- github #320: oGLfbGFX: scaling set by SCREENCONTROL not used when initializing opengl unix driver
- github #321: __FB_ARG_EXTRACT__ incorrectly recognizes commas nested in other forms with variadic macros - internally use new hlp-str.bas:hStr2Args() procedure
- github #322: Fix D2D not rendering the rightmost column of pixels (adeyblue)
- github #323: gas64: When the target variable is const variable, code cannot be generated for variable assignment of different length. (Skyfish)
- github #324: fbc: When converting a wide character escape sequence to an internal format, the escaped value is incorrect. (Skyfish)
- fbc: remove warning on function suffix in '-lang qb'
- github #325, #326: fbc: constant folding ASC() on constant strings with embedded NUL characters - previously ASC returned 0 for anything past the first embedded NUL char, for example ASC(!"A\000B",3) incorrectly returned 0 and should return 66
- rtlib: define fb_AtomicSetThreadFlags() even in the non-multithreaded version of run time library - it is needed by thread_core.c:threadproc() - unusual but not impossible to link the non-multithreaded rtlib and call thread functions
- darwin: a variety of improvements to allow compiling and linking (TeeEmCee)
- gfxlib2: fix d2d scaling issues for high dpi (adeyblue)
- gfxlib2: conditional for cygwin builds (#if => #ifdef)
- fbc: fix regression - fbc.stripsymbols (-strip/-nostrip) check clobbered by emscripten merge
- fbc: improve error message on statement between SELECT and first CASE inside a subroutine and don't allow CONST/ENUM between any SELECT & first CASE.
- fbc: don't allow labels or EXIT statements between SELECT and first CASE statement
- sf.net #843: Implicit casting of argument to string works for Instr() and Mid() but not for Left() and Right()
- sf.net #483 fblite: Can't call LEN with nested WITH block string member
- gas64 : fix required size for local variables >2GB
- sf.net #645: don't access locals if explicit namespace is given on identifier
- sf.net #645: don't access locals if explicit global namespace '.' and '..' prefixes are given on identifier
- sf.net #645: throw compile time error if scoped REDIM variable shadows a variable of the same name
- sf.net #939: __FB_ARG_EXTRACT__ causes compiler abort; was NULL pointer use on empty argument list.
- sf.net #581: Locals break/override THIS access to inherited members
- sf.net #871: Inherited methods without this shadowed by global functions
- sf.net #730: Using quirk keywords as identifier leads to parsing problems later
- sf.net #942: string to wstring conversions causing a run-time crash if the string contained invalid multi-byte characters due to unhandled error result in the runtime library
- sf.net #941: dim/redim of extern array causes compiler fail - add error recovery in rtlArrayRedim() for bad integer conversions of bounds
- sf.net #935: bad code causes fbc to fail internal assert - adjust the internal assert to allow for actual generated code in IIF() expressions
- sf.net #515: fbc: show a warning if a public sub or a shared variable have the same name as global asm keywords (x86 and x86_64 only)
- sf.net #944: Array descriptors are defined more than once (gcc backend)
- sf.net #947: enum declaration in a namespace incorrectly checks for parent
- sf.net #950: REDIM PRESERVE does not destroy the correct array elements of a multidimensional array -> memory leak
- sf.net #945: regression: Scoping rules have changed inside methods - allow globals to shadow non-explicit enums implicitly imported in to the current namespace
- sf.net #892: Bug when default calling via a pointer to a 'Sub' defined with the only 'Any Ptr' - fbc now differentiates between function pointers that have different numbers and positions of optional parameters
- sf.net #948: Overriding class members doesn't work inside methods of further-extended subclasses
- sf.net #948: Duplicated class members inherit from the base class instead of incorrectly from the namespace
- compiler fault when accessing this.member, where member is incorrectly inherited from a namespace (i.e. not derived from UDT) and report 'Element not defined' instead
Version 1.08.0
[changed]
- array descriptor contains new 'flags' field. Careful, breaks binary compatibility plus chicken-egg problem to build fbc.
- fbc '-version' reports build date in yyyy-mm-dd format (aka build date iso)
- updated SQLite headers for binding to SQLite 3.34.0
- updated BASS headers for binding to BASS 2.4.15
- updated PostgreSQL headers for binding to PostgreSQL 12.0
- updated curl headers for binding to curl 7.73.0
- updated SDL1.2 bindings to SDL_gfx 2.0.26
- updated SDL2 bindings to SDL2 2.0.14, SDL2_image 2.0.5, SDL2_mixer 2.0.4, SDL2_ttf 2.0.15
- updated LLVM and Clang bindings to 5.0.0git-fb0acea
- updated Chipmunk2D binding to 7.0.3
- updated cryptlib binding to 3.4.5
- updated DevIL binding to 1.8.0
- updated fastcgi to fcgi-2.4.1-SNAP-0910052249 binding (no changes from fcgi-2.4.1-SNAP-031111212
- updated libffi binding to 3.3 (used by threadcall)
- updated libjit binding to 0.1.4
- updated bzip2 binding to 1.0.8 (no change from 1.0.6)
- refreshed ncurses-5.9 binding
- refreshed mediainfo_0.7.77 binding
- warning level for all warnings is increased by 1. Default warning level is 1. Previously, default warning level was 0 and some warnings had level of -1.
- reverted changes due sf.net #893: invalid suffixes due to '-lang fb'
- reverted changes due sf.net #832: Fix bug allowing QB style suffixes on all keywords, regardless of -lang
- suffixes in '-lang fb' reverted to fbc-1.05.0 behaviours
- sf.net #908: check visibility for overloaded operators FOR, NEXT, and STEP
- sf.net #909, #832, #866 reverted error on suffix in lang fb dialect
- sf.net #832: warn on suffixes for all built-in keywords.
- 'Suffix ignored' warning in -lang fb instead of errors
- macros with parameters can now be invoked without using parentheses around the arguments using '#macro name ? (arg)' definition syntax
- rtlib: internal fb_MemCopyClear() argument types changed to expect unsigned lengths (UINTEGER => size_t)
- rtlib: internal changes to API: fb_ArrayErase(), fb_ArrayClear(), fb_ArrayClearObj()
- rtlib: internal removal of unused / legacy functions: fb_ArrayRedim(), fb_ArrayRedimPresv()
- rtlib: internal removal of unused / legacy functions: fb_ArraySetDesc(), temporay descriptor functions and structs
- github #256: gfxlib2: enable frame buffer on linux-arm targets
- gfxlib2: X11 driver - set the window title for both the frame window and the client window
- rtlib: RANDOMIZE RND_REAL for real random number generator now fills a buffer (624 ulongs) and RND iterates the buffer
- rtlib: refactor math_rnd.c internals for readability
- fbcunit: update to version 1.0
- sf.net #924: fbc: built-in for RGB() and RGBA() return ulong
- gfxlib2: POINT returns ULONG
- sf.net #927: PUT custom method expects function(ulong,ulong,any pr) as ulong callback function
- fbc: double the minimum and default stacksize on 64-bit to 64Kb and 2048Kb respectively.
- fbc: internal changes to optimize away unused call results
- github #203: allow casts of addresses on static initializers
- only write debug line information for statements and don't write comments / empty lines / directives for top level source code in assembly debug output
- optimize byref 'm += s' string concatenations to fb_StrConcatByref() which will check for same string descriptor at run-time which can't be determined at compile time for byref parameters.
- github #298: allow command line options passed to as, gcc, ld to be longer than 128 characters by using string types internally
- sf.net #923: implicitly emit the deleting destructor for extern "c++" mangling for better g++ ABI compatibility
- Add new gfxlib2 API's fb_GfxScreenInfo32() and fb_GfxScreenInfo64()
- Change overload to SCREENINFO( byref as long = 0, byref as long = 0, byref as long = 0, byref as long = 0, byref as long = 0, byref as long = 0, byref as string = "" )
- Add overload for SCREENINFO( byref as longint, byref as longint, byref as longint = 0, byref as longint = 0, byref as longint = 0, byref as longint = 0, byref as string = "" )
- Add new gflib2 API's fb_GfxImageInfo32() and fb_GfxImageInfo64()
- Change overload to IMAGEINFO( byval as const any ptr, byref as long = 0, byref as long = 0, byref as long = 0, byref as long = 0, byref as any ptr = 0, byref as longint = 0 ) as long
- Add overload for IMAGEINFO( byval as const any ptr, byref as longint, byref as longint, byref as longint = 0, byref as longint = 0, byref as any ptr = 0, byref as longint = 0 ) as long
- Add new gfxlib2 API's fb_GfxControl_i32() and fb_GfxControl_i64()
- Change overload for SCREENCONTROL( byval as const long, byref as long = -2147483648, byref as long = -2147483648, byref as long = -2147483648, byref as long = -2147483648 )
- Add overload for SCREENCONTROL( byval as const long, byref as longint, byref as longint = -2147483648, byref as longint = -2147483648, byref as longint = -2147483648 )
- github #311: index argument in __FB_ARG_EXTRACT__( index, args... ) is evaluated as constant (Skyfish)
[added]
- extern "rtlib": respects the parent namespace, uses default fb calling convention and C style name mangling
- array descriptor 'flags' field to track fixed length, fixed dimension, dimTb() size.
- __FB_BUILD_DATE_ISO__ intrinsic define to return fbc build date in 'yyyy-mm-dd' format
- __FB_BUILD_SHA1__ intrinsic define to return the compiler's source code commit sha-1, (if known)
- '-print sha-1' to print the compiler's source code commit sha-1, (if known)
- makefile: 'FBSHA1=1' makefile configuration option to determine the current repo commit sha-1 from git
- makefile: 'FBSHA1=some-sha-1' makefile configuration option to explicit set the repo commit sha-1
- makefile: '-d FBSHA1="some-sha-1"' compiler option to set the value of '__FB_BUILD_SHA1__' when building fbc
- rtlib: inc/file.bi:FileFlush() function, usable for file, PIPE, CONS, and ERR streams opened for BINARY, RANDOM, OUTPUT, APPEND.
- rtlib: inc/file.bi;FileSetEof() function, to adjust size of open file
- sf.net feature request #293: allow len/sizeof/typeof for UDT members without expression
- gfxlib: added Direct2D driver, preferred driver on newer systems. DirectX driver is still fallback for older systems (adeyblue)
- fbc: add builtin function fb_MemMove() alias "memmove"
- fbc: add builtin function fb_MemCopy() alias "memcpy" (was previously removed in an older version of fbc)
- ./inc/fbc-int/memory.bi - fbc API for low level memory operations allocate, callocate, reallocate, deallocate, clear, memcopy, memmove, copyclear
- '-w suffix' or '-w pedantic' command line option enabled 'Suffix ignored' warning for built-in in string functions
- __FB_UNIQUEID_PUSH__(), __FB_UNIQUEID__(), __FB_UNIQUEID_POP__(), __FB_ARG_LEFTOF__(), __FB_ARG_RIGHTOF__(), __FB_JOIN__() builtin macros
- __FB_ARG_COUNT__() builtin macro
- __thiscall keyword to specify the 'thiscall' calling convention (-gen gcc only)
- __FB_QUOTE__(), __FB_UNQUOTE__(), __FB_EVAL__() builtin macros
- rtlib: REDIM [PRESERVE] will generate run time error if attempting to resize static (fixed length) arrays.
- gas64 emitter for x86_64 (SARG), added '-gen gas64' command line option to select
- github #256: gfxlib2: add vga16_blitter for linux-arm targets to pack 2 pixels per byte and write to linear frame buffer
- ./inc/fbc-int/math.bi - fbc API for rnd, rnd32, randomize, expose some random number generator internals
- ./inc/fbmath.bi - add random number generators fb.rndfast32, fb.rndmsws32, fb.rndsquares32, fb.rndpcg32, fb.rndxoroshiro128
- add THREADSELF in ./inc/fbthread.bi to return the thread id of the current thread (adeyblue)
- makefile: add arm and aarch64 targets to the bootstrap package
- release: add arm and aarch64 targets as an option to the contrib/release.build.sh script
- emscripten port (WIP, v1ctor & angros47)
- bindings to SoLoud audio library (soloud_c.bi: C API only)
- bindings to raylib-3.0.0 library (raylib.bi and raymath.bi)
- gas64: add debugging information for -g -gen gas64 for user code for FBdebugger only (SARG)
- __FB_ARG_EXTRACT__( index, args... ) builtin macro (adeyblue)
- __FB_X86__ intrinsic define on x86 and x86_64
- added warning 'FOR counter variable is unable to exceed limit value' on constant end value for loops to help avoid infinite loops, e.g. for i as ubyte = 0 to 255
- internal rtlib function fb_LEFTSELF( string, n ) to reduce the size of a string without reallocating the buffer
- added GFX_SCREEN_EXIT = &h80000000l constant to fbgfx.bi - used with Screen 0 (closing any graphics window and preserving the console window content)
- github #309: In macro/define's use '##_' to escape line continuation character '_' to allow multiple lines of macro expanded code to be combined into a single statement.(Skyfish)
[fixed]
- makefile: under MSYS2 (and friends), TARGET_ARCH is now identified from shell's default target architecture instead of shell's host architecture
- sf.net #904; gcc backend: pass '-Wno-format' to prevent format string errors in gcc 9.x (enabled by default with -Wall)
- sf.net #910: cast(string, variable) can cause fbc to segfault (infinite recursion), due to misplaced const & non-const casting
- sf.net #898: fbc win gfxlib DirectX driver failed to initialize on 64-bit, due to incorrect construction of DIDATAFORMAT for keyboard device (macko17)
- rtlib: potential buffer overflow in sys_getshortpath.c (macko17)
- sf.net #404: len/sizeof type parsing eats namespace prefix (namespace prefix is now preserved)
- sf.net #718: len/sizeof type parsing disambiguates between type and variable having same name
- github #205: fix rtlib realloc memory leaks in 'redim preserve' and 'fb_hGetLocaleInfo' (adeyblue)
- github #205: fix rtlib realloc memory leaks and malloc null ptrs in utf_conv.bi CharToUTF, 'WCharToUTF, UTFToChar, UTFToWChar, and related functions
- github #205: fix rtlib potential malloc null ptr access in dev file read/write methods
- default new, new[] operator (allocate) after #undef allocate caused compiler crash
- default delete, delete[] operator (deallocate) after #undef deallocate caused compiler crash
- windows GDI gfxlib driver now displays double scanline screen modes correctly (screen 2 & 8), rather than half screen (adeyblue)
- sf.net #921: gfxlib: horizontal line drawing on 8-bit image was using wrong bpp
- oGLfbGFX: opengl driver was leaking thread handle under 'screencontrol fb.SET_GL_2D_MODE, fb.OGL_2D_AUTO_SYNC'
- oGLfbGFX: prevent opengl mode and scale from changing until next mode is set
- sf.net #908: visibility / access rights of overload For/Next/Step operators not taken into account by for...next statement
- sf.net #906: #error on line 2 not reported if immediately following #error on line 1
- rtlib: ERASE - check for static (fixed length) plain, string, and object arrays passed to ERASE; clear only if array is static, and free memory if dynamic
- rtlib: allow reading/writing data larger than 2GB with GET # / PUT # [WIP]
- sf.net #882: error on REDIM udt.field(expr) if default constructor has no access
- github #246: rtlib leaks thread local data, fixed by adding TLS destructors (adeyblue)
- sf.net #918: pcopy (console) bug when copying large console buffers, windows only (adeyblue)
- github #216: function getMouse() seems broken on Win10 when using the Console Mode (screen 0), fixed by turn off the QuickEdit console mode during GetMouse (adeyblue)
- github #258: on windows directx and gdi drivers, only show window after initialisation is complete (adeyblue)
- sf.net #925: CSIGN/CUNSG preserve size when converting pointers on 64-bit and implicit conversion of STEP value in FOR...NEXT statement
- github #122: gfxlib2: linux GFX_NO_FRAME + GFX_OPENGL freezing at exit due to a dead lock between exit routines
- sf.net #914: threadsafe RND() and RANDOMIZE() by adding a mutex
- use the multi-byte & wide character functions wctombs() & mbtowcs() when converting between string and wstring (Skyfish)
- sf.net #568: asm error assigning 16-bit constant to 32-bit var, invalid use of movsx instruction on immediate (short => long)
- fbc: internal cThreadCallFunc() was using wrong function to get the procedures return type
- fbc: read objinfo for elf format files on arm32 and arm64 (aarch64) to allow automatic options and linking of libraries
- fbc: name mangling for cva_list name mangling with arm32 and arm64 (aarch64) targets
- rtlib: FORMAT() should always use all the fix digits in exponential form, e.g. format(1234, "###e+#") = "123e+1"
- github #92: FORMAT() should always have an exponent of 0 for zero.
- sf.net #928: Wrong sign / type when printing BYTE values on arm/aarch64
- various HANDLE_WM_*, FORWARD_WM_* macros in win/windowsx.bi were broken
- gcc backend was trying to pass single types to double typed built-ins
- gfxlib2: character data was incorrectly stored for values >= 128 causing incorrect values returned from SCREEN() function
- LLVM backend: escape procedure names on win32 targets to avoid having llvm mangle the names also
- sf.net #572: don't call vectorize operations for anything but gas+x86+sse backend / options
- sf.net #572: gas+x86+SSE faulty optimisations with '-vec 2' for intra-expression vectorisation of horizontal add optimisation was generating bad AST resulting in bad assembly
- gcc backend: inline asm for float to integer calculations was generating bad code with gcc optimizations due to x87 stack clobbered but not reported to gcc
- gcc backend: fix GOSUB causing crash/exception on win64 - setjmp/longjmp failed on mingw-w64 64-bit and needed to be passed 2 parameters instead of 1
- fix __FB_EVAL__() incorrectly reading past the end of the expression, and report errors in expressions
- C backend: switch to .text section after writing the exports to the C file in the explicit asm block. gcc can move sections around with optimizations and there is a change between 7.x and 8.x that causes issue with where the directive section is located
- sf.net #917: optimize 'm += s' string concatenations to fix the long compile times in the gcc backend (which makes heavy use of string building).
- github #217: C backend, fix gcc array out of bounds warning when compiled with -O2 or higher optimizations and accessing non-zero lower bound fixed length string arrays
- C backend: inline asm - don't add rsp/esp to the clobber list, it's deprecated in newer gcc versions and silently ignored in older versions
- github #309: token pasting operator '##' allows pasting of single '_' characters
- fbc: re-add __FB_GUI__ intrinsic define - the change was clobbered for a time during fbc 1.08.0 development after basic-macros were added
Version 1.07.0
[changed]
- SADD/STRPTR(wstring) returns WSTRING PTR
- '-v' be verbose command line option affects '-help' output
- fbc aarch64 target by default maps to '-march=armv8-a' when passing options to gcc/LLVM (czsgaba)
[added]
- CVA_LIST type, CVA_START(), CVA_COPY() CVA_END(), CVA_ARG() macros will map to gcc's __builtin_va_list and __builtin_va_* macros in gcc backend
- github #133: fbc makefile supports bootstrap-minimal target to build a bootstrap fbc with only the minimal features necessary to build another fbc. (William Breathitt Gray)
- github #141: introduced '-strip'/'-nostrip' options to control symbol stripping of output files (William Breathitt Gray)
- github #141: fbc will default to stripping symbols if '-d ENABLE_STRIPALL' is passed in FBCFLAGS (William Breathitt Gray)
- github #141: makefile option 'ENABLE_STRIPALL=1' introduced to pass '-d ENABLE_STRIPALL' via FBCFLAGS (William Breathitt Gray)
- makefile: 'ENABLE_STRIPALL=1' passes '-d ENABLE_STRIPALL' via FBCFLAGS on all targets
- makefile: 'ENABLE_STRIPALL=0' disables passing '-d ENABLE_STRIPALL' via FBCFLAGS on all targets
- makefile: '-d ENABLE_STRIPALL' passed by default for dos/win32 targets when 'ENABLE_STRIPALL=0' not explicitly given
- 'TYPE udt EXTENDS Z|WSTRING' allowed to specify that UDT is a kind of Z|WSTRING
- LTRIM/RTRIM/TRIM will accept UDT as Z|WSTRING
- LCASE/UCASE will accept UDT as Z|WSTRING
- Cxxx() conversion functions will accept UDT as Z|WSTRING
- INSTR/INSTRREV will accept UDT as Z|WSTRING
- MID function will accept UDT as Z|WSTRING
- SADD/STRPTR will accept UDT as Z|WSTRING to return Z|WSTRING ptr
- LSET/RSET statements will accept UDT as Z|WSTRING
- MID statement will accept UDT as Z|WSTRING
- ASC function will accept UDT as Z|WSTRING
- STR/WSTR function will accept UDT as Z|WSTRING to return a Z|WSTRING
- SELECT statement will accept UDT as Z|WSTRING to return a Z|WSTRING
- SWAP statement will accept UDT as Z|WSTRING
- IIF function will accept UDT as Z|WSTRING
- PRINT/LPRINT/WRITE will accept UDT as Z|WSTRING
- '-earray' command line option to enable array bounds checking
- '-enullptr' command line option to enable null pointer checking
- '-eassert' command line option to enable assert() and assertwarn() checking
- '-edebug' command line option to enable __FB_DEBUG__
- '-edebuginfo' command line option to enable debug symbols
- '-elocation' command line option to enable reporting error location
- ./inc/fbc-int/array.bi - fbc internal API for array descriptor
[fixed]
- sf.net #881: C backend: support for varadic function parameters in gcc using __builtin_va_list type and related macros
- push/pop correct GL_PROJECTION matrix and GL_MODELVIEW matrix when setting up graphics screen (gothon)
- fix char & wchar concatentation. For char double byte characters (such as Chinese characters), the "wstr = char & wchar" would become "wstr = char & chrw(0) & wchar" (SkyFish)
- github #131: Fix fbc makefile bootstrap recipe race condition (William Breathitt Gray)
- sf.net #794: literal tabs in string literals miscompiled if followed by 0-9 numeric chars
- sf.net #897: length of literal wstring is miscalculated at compile time. Compile time evaluation of len(!"\u1234") was using the internal escaped string length instead of the actual codepoint length
- github #137: Final -Wl flag takes precedence over previous. fbc now passes down all options from all -Wa, -Wc, and -Wl flags (William Breathitt Gray)
- github #138: rtlib: freebsd: Fix deprecated use of VM_METER to use VM_TOTAL (William Breathitt Gray)
- sf.net #899: TRIM( wstring ) causes crash if string is single space
- sf.net #900: LTRIM( wstring, filter ) and TRIM( wstring, filter ) truncate result if filter is zero length string
- github #116: Fix optimizations in [L/R]TrimAny rtlib functions (SkyFish)
- github #145: WSTRING concat and assign buffer (&=) overrun
- sf.net #893: 'Suffixes are only valid in -lang' error message showing incorrect -lang options allowed
- fbc uses '-march=armv8-a' instead of invalid option '-march=aarch64' when passing options to gcc/LLVM (czsgaba)
- rtlib: sys/io.h incorrectly included on systems that do not provide it. It is used only for x86, x86_64 and is unnecessary for all other linux targets (armhf ,arm64, mips ....)
- SELECT CASE AS CONST checks for ranges that would produce unreasonably large jump tables (greater than 8192 entries)
- sf.net #907: global overloaded operator procs need "_Z" mangling prefix
Version 1.06.0
[changed]
- Name mangling of Integer/Long parameters was reversed on 32bit to match 64bit, so the same FB and C++ code will be compatible on both 32bit and 64bit. Integer is mangled as C++ long (except on Win64), Long is mangled as C++ int.
- Adjusted warning text for "mixed bool/nonbool operands" warning
- test-suite uses libfbcunit for unit testing framework
- SELECT CASE AS CONST respects data type and will show overflow warnings on out-of-range constants
- boolean: don't allow NEG unary op '-' on boolean data types
- All fb RTL functions are checked for CONSTness, CONST qualifiers added to fb rtlib built-in prototypes (sf.net #727)
- WSTRING can be a return type, but only for prototypes (DECLARE) and function pointers, this allows getting PROCPTR() of all fb built-in run time functions
- multiline comments are parsed in -lang fblite|qb|deprecated as in -lang fb for consistency
[added]
- Name mangling of Long parameters on Win64 are mangled to C++ int by default and to C++ long with a modifier in the form 'as [u]long alias "long"'. The data type size is still 32bit but allows calling external C++ library expecting a C++ long.
- -noobjinfo option to disable the writing/reading of compile-time library and other linking options from/to .o and .a files. This also disables the use of fbextra.x (the supplemental linker script) for discarding the .fbctinf sections, which is useful when using the gold linker that doesn't support this kind of linker script.
- Linux console Inkey() now recognizes F11 and F12
- 2D render through OpenGL on Windows and Linux via screencontrol (angros47)
- Windows API binding updated to additionally support _WIN32_WINNT &h0501, &h0600, &h0601
- Under X11, ScreenControl GET_WINDOW_HANDLE places the Display ptr in param2
- Updated bindings: SDL2 2.0.6, SDL2_image 2.0.1, SDL2_mixer 2.0.1, SDL2_net 2.0.1, SDL2_ttf 2.0.14
- allow overload operator SQR()
- allow [static] shared byref variables to be initialized with byref variable
- warning '-w constness' to enable 'CONST qualifier discarded' warning on command line
- #pragma constness to enable/disable 'CONST qualifier discarded' warning in source code
- Add "-arch armv5te" cpu type option, and several arch aliases: x86 (for 686), armeabi and armv5 (for armv5te), armv7 and armv7a (for armv7-a)
- Android support. Commandline executables and shared/static libraries only; gfxlib (graphical/audio commands) and also console commands like "color" are not supported, nor does the android libc support locales for string<->wstring conversion. THREADCALL is also not enabled. The default target abi is armeabi; use arch=x86, arch=armv7a, or arch=aarch64 to target a different abi.
- "-fpu neon" option for ARM archs (passed through to gcc).
- __FB_X86__ is defined on x86 and x86_64. Previously it was necessary to check __FB_ASM__ or __FB_ARM__ to detect x86. Use __FB_64BIT__ to check for x86_64.
- -pic option (position-independent code) is now allowed on x86 (where it forces -gen gcc) and when building executables (in which case it passes -pie option to ld to produce position independent executables)
[fixed]
- win/d3dx9.bi no longer has a hard-coded #inclib "d3dx9d". d3dx9d.dll is apparently not a generally valid choice. In practice programs have to be linked against d3dx9_33.dll or d3dx9_39.dll, etc.
- #816: The ASM backend contained a bad assert() which could be triggered in debug builds of the compiler, when generating code for certain array accesses
- C backend: undefined behaviour (inherited from C) in case of signed integer overflow
- C backend: undefined behaviour (inherited from C) in case of SHL/SHR operations with a shift amount >= the bitsize of the shifted operand in bits (if the shift amount wasn't a compile-time constant)
- utf_conv.bi: When given a NULL destination buffer, no-op conversions (UTF16 => UTF16 or UTF32 => UTF32) didn't allocate a new buffer, but just returned the source buffer, violating the contract used for proper conversions (which allocate a new buffer if a NULL destination is passed).
- utf_conv.bi: In UTF8 => UTF16/32 and UTF32 => UTF16 conversions, strings longer than 8 chars could be truncated
- #797: False-positive warnings when mixing booleans with comparisons in logic operations
- TRE binding: Didn't compile with TRE_USE_SYSTEM_REGEX_H
- LLVM backend: Emit the new (LLVM 3.7+) load-syntax
- When compiling .rc files with windres instead of GoRC (happens with non-standalone fbc), the current directory is now an include search directory, to match the GoRC behaviour.
- #659: Keep the stack 16-byte aligned on linux-x86, android-x86 and darwin-x86 to comply with ABI; fixes crashes when external libraries use SSE
- On Windows, FB console input treated multiple repeated keypresses that were merged into one event by the system as a single keypress
- Accesses to 64bit bitfields could be miscompiled or trigger a compiler crash
- #732: Virtual destructors couldn't be called on const objects
- #790: Windows API and X11 bindings: Fixed some macros where macro parameters conflicted with other identifiers or FB keywords used in the macro body
- boolean initializer values for global or static variables were not emitted properly
- Compiler crash after reporting error about REDIM on a fixed-size array field
- #827: Using the GNU gold linker (instead of ld.bfd) resulted in broken binaries due to fbextra.x, which fbc uses with ld.bfd to discard the objinfo .fbctinf sections, but is not supported by gold. Now when gold is detected, fbextra.x won't be used anymore, in order to get working binaries.
- exec() on Linux & co was broken with regards to spaces in the executable path. Spaces were converted to "\ " and then to "/ ", resulting in a different path than given.
- ASM backend: Fixed a compiler crash or potentially bad code generation in complex floating point expressions (which had enough operands to use up the x86 FPU stack, and trigger spilling of st() registers to stack)
- C backend: Pointer arithmetic on the address of variables with any pointer type gave wrong results due to bad code generation in -gen gcc for this case.
- LLVM backend: Self-BOP emitting, byref var/param accesses
- #837: Compiler hang (or assertion triggered, if enabled) for Select Case As Const with Case -1
- ASM backend: Invalid code generated for Select Case As Const jump table index when 64bit fbc cross-compiles to 32bit
- #836: The MyUdt() syntax for creating temporary objects allowed creating objects of Abstract types (with unimplemented Abstract methods)
- WString conversions from UTF32 to UTF16 produced incorrect high surrogate values (affected conversion from UTF32 to Windows WString, and from Linux WString to UTF16)
- Conversion from UTF32 to Windows WString behaved differently from other UTF32 to UTF16 conversions in FB with regards to truncating surrogate pairs when the destination buffer is full
- #839: Wstring constants could be allocated with the wrong size when cross-compiling, leading to compiler errors and/or incorrect code generation
- WCHR would produce garbage if evaluated with constant values above &h3ffff (any value up to &hffffffffU is allowed)
- WCHR would give the wrong result if given large number of arguments which were large constants
- #846: Fix compiler crash on global variable initializer with type<T>(...) expression where T isn't a UDT
- #847: Windows API binding: Fixed winnt.bi SECURITY_*_AUTHORITY initializers
- #851: '#LINE line filename' only changed the source filename in error messages, not in debug info
- #857: PAINT used in a VIEWport and without delimitation border induces segmentation violation when ending code
- #832: Fix bug allowing QB style suffixes on all keywords, regardless of -lang
- #841: The unary negation operator gave different result signedness when used on constant instead of non-constant expression. Now the result is always signed.
- Incorrect C++ mangling for BYREF parameters using built-in types
- #844: Fix bug in -gen gcc due to duplicated type (struct) names in the main module and global namespace
- #875: Fix bug where boolean variable to single/double conversion gives wrong sign on -gen gas -fpu x87 & sse
- #872: Fix broken boolean bitfield runtime assignments from unsigned values
- #876: ThreadCall does not support subroutine with [U]Long type parameter
- #877: fix SLEEP behaviour in linux console and wait for key presses, and do not affect input buffer. Match linux SLEEP to behaviour on Windows.
- Fixed inline asm procedure name mangling bug (missing underscore prefix) with -gen gcc -asm intel on dos/win32
- #878: Fix fbc-64bit hangs on 'Case True' + 'Case False' inside 'Select Case As const'
- Fix SELECT CASE AS CONST to allow both signed & unsigned case range values
- #822, #814, #842: Compiler crash when initializing static/shared reference (DIM SHARED/STATIC BYREF) with non-constant initializer (e.g. another reference, or dynamic array element)
- ASM backend: Fix bad code generated for comparisons such as IF @globalvar = 0 THEN
- #884: FORMATing dates can deadlock under Unix
- #890: Fix Bad @N stdcall suffix for non-trivial byval type parameters with -gen gcc
- #642, #886: CASTs involving CONST qualifiers solved out too early allowing invalid statements to be compiled
- #801: *@(expr) solved to (expr) did not cleanly remove null ptr checks allowing invalid datatype assignment with -exx. *PTRCHK(@expr) solves to (expr).
- #880: Overload binary operators now support covariant arguments, overloaded procedure resolution changed especially with respect to CONST and non-CONST parameters
- Fix for debugging lines in include files but not in procedures. Filename debugging information added for module level statements in included files.
- #699: fix new[0] causing infinite loop when calling constructor/destructor list
- #883: when mapping 32 & 64 bit functions for PALETTE [GET] USING, check the data type pointed to and choose one of LONG PTR, LONGINT PTR, INTEGER PTR
- #866: fbc was throwing lexer errors in comments stating with $. Comments are lexed for directives; allow suffixes in comments
- #858: C backend: fix internal structure size mismatch due to wrong padding when nesting packed structures
- C backend: fix array descriptor mangling to avoid naming conflicts where array data types differ only by const
- #823: Function overload resolution for [const] array() and passing non-const array argument to const array parameter
- Github #113: When a WINDOW was active, the top/right edges (bottom/right for WINDOW SCREEN) were transformed out of the viewport.
Version 1.05.0
[changed]
[fixed]
- 0.90.0 regression: Self-op optimizations stopped handling some cases and should now work again, for example: optimizing A=A+1 => A+=1 where A is a Long, should give nice ASM code with -gen gas again
- When Dim'ing an Extern variable, the Byref attribute was not checked - neither required nor disallowed - now the Dim must match the Extern with regards to Byref too.
- Type<Foo>(...) expressions couldn't be used at the begin of a statement (because the Type keyword was treated as begin of a Type declaration)
- FileAttr() was still broken for 64bit - the result value was truncated to 32bit
- 1.04.0 regression: Under -gen gcc -asm att, support for gcc-style inline asm was broken
- ld was warning about unsupported linker options on OS X
- BYREF fixed-length strings (e.g. BYREF myParameter AS ZSTRING * 10) now trigger a compiler error since they are unsupported
- #print typeof() output now differentiates between ZSTRING and ZSTRING * N (ZSTRING without size is produced by dereferencing a ZSTRING PTR, or BYREF AS ZSTRING)
- Context-specific keywords, e.g. graphics PUT modes, must now be given as keywords (e.g. PSET), string literals (e.g. "PSET") are no longer accepted.
- Wstring-to-Zstring conversions didn't use the system's Unicode <-> codepage conversion function, and only converted ASCII characters. Now it will try to convert the Unicode chars to codepage chars.
- Compiler crash during error recovery when there was an error when parsing the argument expression for a BYREF AS ANY parameter
- 1.04.0 regression: Get# for WStrings was incorrectly changed to convert the loaded bytes to wstring characters, like Input# would do. Now it's changed back to just loading the raw bytes into the wstring, which is also how Get# works for other datatypes.
- 1.04.0 regression: Due to the Get# wstring breakage, the compiler failed to read source files encoded in UTF16LE with BOM on Windows, and UTF32LE with BOM on Linux.
- Eof() could incorrectly return TRUE too early on Windows, when reading a big text file with LF line endings, OPENed FOR INPUT (text mode)
- Line's styled/pattern drawing support was broken on non-x86 systems
Version 1.04.0
[changed]
- FileAttr() now returns an Integer instead of a Long, and now supports returning OS handles on 64bit
- #750: The gfxlib is now cleaned-up by END (which also happens automatically at the end of the implicit main function), instead of the FB runtime's global destructor. This should fix the "hang on exit on Windows 10" issues. The reason is that the gfxlib clean-up needs to wait for the background thread to exit, which cannot safely be done in a global destructor on Windows, due to the loader lock. This means it is definitely not safe anymore to use FB graphics commands during global variable destructors or module-level destructors.
- Windows API binding: The BOOLEAN typedef has been renamed to WINBOOLEAN due to the addition of built-in Boolean type to FB. You can #undef Boolean before #including windows.bi to get the Windows API BOOLEAN typedef again.
- Many bindings now declare CTRUE (1) instead of TRUE (1), to avoid conflicting with the new built-in True (-1) keyword. You can #undef True before #including them to get their old TRUE (1) again.
- On 64bit, but not -lang qb, integer number literals > 32bit now default to being Integers instead of LongInts, since 64bit Integers are the default type on 64bit. This only makes a difference for overload resolution and typeof(). No changes on 32bit or -lang qb.
- #738: Operator overloading: The overload resolution is now a bit more permissive with regards to CONSTness; for example non-const UDT objects can be passed to Byref As Const UDT parameters, regardless of the other argument/parameter (if it's a binary operator). Previously this was disallowed (though only sometimes, due to a separate issue).
- #756: Val() no longer recognizes 0x or 0X prefixes for hexadecimal values. &h or &H should be used instead. Previously it was only "supported" accidentally, and could produce wrong values (all d's turned into e's in the string before the conversion).
[added]
- BOOLEAN data type (compatible to GCC C++). Logic operations involving boolean operands also return a boolean.
- TRUE/FALSE built-in constants (programs may still declare them manually, but a warning will be shown)
- CBOOL()
- Boolean support for PRINT, INPUT, DATA, WRITE etc. Booleans are represented as "true"/"false" strings (case-insensitive).
- DIM|VAR BYREF id AS datatype, for creating local references to other objects, similar to BYREF parameters
- exepath() now works on FreeBSD, NetBSD, Darwin and Solaris
- The FB gfxlib can now be built on OS X using XQuartz by passing ENABLE_XQUARTZ=1 to make
- Redundant float constant declarations are now also allowed
- Updated Mesa OpenGL binding to 10.6.4
- Updated Windows API binding to MinGW-w64 4.0.4
- Updated IUP binding to 3.15
- Updated CD binding to 5.8.2
- Updated FreeType binding to 2.6
- Updated Lua binding to 5.3.1
- Updated LLVM/clang bindings to 3.6.2
- Updated some CRT/glibc bindings to glibc 2.22
- Updated curl binding to 7.44.0
- Updated libffi binding to 3.2.1
- Updated libpng bindings to 1.5.23 and 1.6.18
- Updated libzip binding to 1.0.1
- New binding for libxcb 1.11
- crt/limits.bi now declares FLT_MIN and DBL_MIN
- Updated cgi-util binding to 2.2.1, with 64bit support
- New binding for Chipmunk 7.0.1, with 64bit support
- New binding for cryptlib (cl343_beta), with 64bit support
- New binding for DevIL 1.7.8, with 64bit support
- New disphelper binding
- New binding for Expat 2.1.0, with 64bit support
- New binding for FLite 2.0.0, with 64bit support
- New binding for FreeImage 3.17.0, with 64bit support
- New binding for GD 2.1.1, with 64bit support
- New binding for GDBM 1.11, with 64bit support
- New binding for GDSL 1.8, with 64bit support
- New binding for gif_lib 4.2.3 and 5.1.1, with 64bit support
- New binding for GMP 6.0.0, with 64bit support
- New binding for GRX 2.4.9, with 64bit support
- New binding for GSL 1.16, with 64bit support
- New binding for IM 3.9.1, with 64bit support
- Updated glib binding to 2.44.1
- Updated GTK+ binding to 2.24.28 and 3.16.6
- Updated ATK binding to 2.16.0
- New binding for jpeglib 6b, 7, 8, 9a, with 64bit support
- New binding for json-c 0.12, with 64bit support
- New binding for libxml2 2.9.2 and libxslt 1.1.28, with 64bit support
- New binding for liblzma from xz 5.2.1, with 64bit support
- New binding for LZO 2.09, with 64bit support
- New binding for MediaInfo 0.7.77, with 64bit support
- New binding for libmodplug 0.8.8.5, with 64bit support
- New binding for libmpg123 1.22.4, with 64bit support
- New binding for Mini-XML 2.9, with 64bit support
- New bindings for SQLite 2.8.17 and 3.8.11.1, with 64bit support
- New bindings for PCRE 8.37 and PCRE2 10.20, with 64bit support
- New binding for PostgreSQL 9.4.4, with 64bit support
- New binding for libogg 1.3.2, with 64bit support
- New binding for libvorbis 1.3.5, with 64bit support
- New binding for Newton 3.13, with 64bit support
- New binding for ODE 0.13.1, with 64bit support
- New binding for PortAudio (pa_stable_v19_20140130), with 64bit support
- New binding for libsndfile 1.0.25, with 64bit support
- New binding for libuuid (e2fsprogs-libs-1.42.13), with 64bit support
- New binding for libxmp 4.3.9, with 64bit support
- New binding for ZeroMQ 4.1.3, with 64bit support
- New binding for libVLC 2.2.1, with 64bit support
- Select Case As Const maximum allowed Cases (jump table slots) increased from 4097 to 8192
[fixed]
- False-positive "ambigious sizeof" warnings if the identifier could refer only to a type or procedure (in that case it should already be fairly clear that the type will be chosen, not the procedure, because sizeof() can't be applied to procedures at all), or if an expression such as "array(0)" is given to sizeof() (i.e. something that starts with an identifier but is followed by further tokens that clarify that it's not refering to a type)
- Adjusted "ambigious sizeof" warning message for the case when it could refer to a forward reference or a variable
- 1.03.0 regression: Compiler crash during error recovery in case a CONST declaration was a duplicate definition
- 1.02.0 regression: zlib.bi couldn't be #included behind crt.bi due to the declarations for SEEK_SET & co
- Typedefs allowed the data type or forward reference identifier to be omitted (e.g. "type T as")
- Typedefs allowed forward references named after keywords, even though no such type alias or UDT can be declared (only quirk keywords are allowed as type names, not "core" keywords though)
- #747: SPC(n) only allowed skipping into the next line, and truncated bigger values of n. Now it can skip multiple lines if n is big enough.
- IUP binding: added various missing #inclibs
- #782: C backend: inline ASM keywords were turned into references to previously declared FB variables/procedures/labels, if those were named after ASM keywords. Inline ASM keywords will now be left untouched (using the same heuristic, a list of ASM keywords, as used by the ASM backend).
- __FB_ASM__ wasn't #defined for x86_64 even though the -asm option can be used on x86_64 too
- C backend: UDTs using Field=N were emitted incorrectly (causing gcc errors), if they contained a field of type of another UDT that didn't use Field=N.
- False-positive "ambigious sizeof" warnings if the identifier could refer to a type or variable of that type (in this case the size is obviously the same, and it doesn't matter which one is used)
- C backend: Procedure pointers having a circular dependency on themselves could result in duplicate typedefs being emitted, causing gcc errors with older gcc versions.
- rtlib & gfxlib compilation was broken on NetBSD, Darwin and Solaris (header & include-path issues)
- On Darwin, linking with rtlib failed due to __fb_errmsg being discarded
- Correctly implemented fb_hGetExeName for FreeBSD, NetBSD, Darwin and Solaris (needed by gfxlib2)
- The FB makefile can now detect the OS when building on Solaris
- fbc will now pass the proper parameters to "as" on OS X
- 1.02.0 regression: NULL was declared with pointer type in updated bindings (Windows API, SDL, etc.), and is now just an integer constant again, so it can be passed to things like WPARAM/LPARAM without triggering a compiler warning.
- Open Com on Windows didn't invoke GetCommState() properly, meaning it could "randomly" fail. Also, the port was not always opened for exclusive access, even though MSDN says that is the only possibility.
- 1.03.0 regression: OpenAL binding: The ALboolean and ALCboolean typedefs were incorrectly expanded and translated as zstring in some places
- format(now(), "ttttt") now works as expected under unix-like systems
- -profile now works on win64; the compiler generated calls to "mcount" which doesn't exist on win64; it's named "_mcount" instead. (with MinGW-w64's libgmon at least)
- 1.02.0 regression: CHAR/WCHAR typedefs (and others) in the Windows API bindings were translated as zstring/wstring; they're now translated as byte/wchar_t again (and accordingly in some cases where fields/parameters use them as type and clearly don't want a zero-terminated string), to allow them to refer to a single char again.
- 1.01.0 regression: CGUI binding: InitCgui*() macros were all broken, not just InitCgui() (that was fixed before)
- GdiPlus binding: Fixed GdipMeasureCharacterRanges() declaration (wrong parameter type)
- RETURN in BYREF-result functions could erronously try to construct a result object, if the result UDT had constructor overloads taking a pointer
- LLVM backend: Accesses to fixed-length strings now use the proper types
- LLVM backend: Structs using FIELD=1 are now emitted as packed structs
- Many bindings and especially the Windows API binding now use more proper Const/Type/Extern/Sub/Function declarations instead of #defines, allowing many identifiers (such as "LoadImage" which is also a Windows API function) to be used for custom functions in namespaces, even if the file #includes windows.bi or others.
- 1.02.0 regression: Windows API binding: COM interfaces in win/shlobj.bi were missing vtable entries
- #761: crt/string.bi and win/shlwapi.bi can now be used together - they use #undefs to override each-other (e.g. strcpy() vs StrCpy()), whichever is #included last wins.
- Windows API binding: The NM_* constants from win/commctrl.bi are now adjusted to work on 64bit.
- X11 binding: X11's boolean typedef was errornously translated as string type in some places - it is now preserved, named "XBoolean", and translated as byte as intended.
- GTK+ 2 binding: GtkCurve structure was translated incorrectly (i.e. wrong sizeof())
- 1.02.0 regression: Windows API binding: The LPRGLPVOID typedef and related ones were omitted from win/dplay.bi due to a translation bug
- Windows API binding: win/GdiPlus.bi now uses the Gdiplus namespace and #inclib on 64bit too.
- The @N stdcall suffix was calculated incorrectly (i.e. it was incompatible with gcc and MSVC) for procedures with Byval non-trivial UDT or Byval String parameters.
- Static member variables using the parent UDT as their data type could be allocated incorrectly (not enough memory reserved, possible even zero memory), if they were declared above some or all fields (related to bug #649)
- C backend: References to procedures and labels are now emitted as-is, instead of using gcc's inline asm place-holders with memory reference constraints (the latter only makes sense for variables, not functions/labels)
- C backend: Inline ASM using labels (i.e. jumps) should now work, using gcc's "asm goto()" syntax
- C backend: The register clobber lists produced for inline ASM are now adjusted to the target - now x86_64 and ARM is supported (though ARM/AArch64 support is probably incomplete), no longer x86 only.
- GET# didn't work with wstrings
- Integer-only operations like AND, OR, \ and MOD converted non-integer operands to Integer, even if the other was a LongInt or UInteger. Now the conversion will use an integer type matching the integer operand (if any), to avoid truncating floating point values, and give more expected results.
- ASM backend: Cross-compiling could give different results than native compilation with regards to the choice of whether to place string literals into .data or const (e.g. .rodata) sections
- Compiling a Select Case As Const block containing a Case with a huge range of values such as <case 0 to 4294967295u> won't cause the compiler to "hang" anymore
- Select Case As Const: <CASE a TO b> now triggers a compile-time error if a > b, instead of silently doing nothing
- #784: C backend: String literals in inline ASM (containing double quotes, backslashes, etc.) were emitted into the .c code without escaping
- #777: -lang qb: Suffixed identifiers on the left-hand side of assignments were resolved by prefering global variables instead of local ones. Now local ones take priority, as in other places (e.g. expressions) and as in QB.
- #783: C backend: Run-time float-to-uint64 conversions truncated the value to int64
- #745 part 1: PRINT comma-padding could wrap into the next line too early (if the padding would move the caret beyond column width-FB_TAB_WIDTH). This happened in both console and graphics modes.
- #745 part 2: FB runtime cached the console/graphics window width but didn't update it when it got resized, this should now be fixed at least for the graphics window and Linux console window.
- #743: 1.00.0 regression: len() used on UDT with overloaded cast() operators returned the result type and value of one of these cast operators, instead of the sizeof()
- #738: Operator overloading: The overload resolution gave different results for b+a compared to a+b, if one argument/parameter differed only in CONSTness, and the other didn't.
- #746: -lang qb's Open "Pipe:<shell command>" wasn't working. Only Open "Pipe:" was accepted (but that's useless); anything else was treated as normal Open file command.
- #414: ASM backend: Bad code generated for comparisons such as IF @globalvar = @stackvar THEN ...
- C backend: Extern Import variables were not emitted and accessed correctly
Version 1.03.0
[changed]
- -print now only prints the information, and then stops the compiler
- non-standalone builds: -target <gcctarget> no longer searches libs in lib/freebasic/<gcctarget>, but rather in the normal lib/freebasic/<fbtarget> directory. I.e. the directory layout for native or cross compiling is the same, making packaging and distribution easier.
[added]
- IUP binding updated to 3.13
- #742: fbc can now use lib64/freebasic/... instead of lib/freebasic/ if built with ENABLE_LIB64=1
- -print fblibdir option
- All the recently updated bindings now have copyright/license information
- New libbzip2 binding (64bit-capable)
- New libcaca binding (64bit-capable), libcaca-0.99.beta19
- New BASS 2.4 & BASSMOD 2.0 bindings (64bit-capable)
- New OpenAL (openal-soft-1.16.0) and freealut (1.1.0) bindings (64bit-capable)
- New ASpell 0.60.6.1 binding (64bit-capable)
- New libbfd binding (64bit-capable), supporting all binutils versions from 2.16 to 2.25
- New CanvasDraw 5.8.1 binding (64bit-capable)
- Updated CGUI binding to 2.0.4 (from CGUI project's CVS)
- Redundant constant declarations (CONST A = 1 : CONST A = 1) are now allowed, just like redundant #defines
- logic operation optimization: x <> 0 => x if x is a comparison operation already, and <comparison> = 0 => <inverted-comparison>, and NOT <comparison> => <inverted-comparison>
- ASM backend: slightly better code generation: Integer operand register will be re-used as Long result registers now (and vice-versa), which is ok since this is 32bit-only
- len/sizeof/typeof will now warn if the given identifier is ambigious (i.e. if it could refer to both a type or a procedure/variable symbol), because currently the type will be preferred, which is typically unexpected, at least for len() on strings.
- crt/longdouble.bi: ARM support
- LLVM backend: global variable initializers
- LLVM backend: fixed-size array variables/fields
[fixed]
- Windows API binding: win/ntddndis.bi and win/olectlid.bi headers were missing their content (and thus, the dependencies of ntddndis were missing too)
- LLVM backend: local vars were emitted twice
- LLVM backend: the signature emitted for calls will now use the same param dtypes as in the declaration, as required by LLVM
- LLVM backend: self-BOPs, and the self negation UOP, weren't working
- LLVM backend: field accesses, pointer derefs, global var accesses, with or without offsets, were mostly broken
- LLVM backend: procedure pointers weren't implemented properly
- 1.00.0 regression: compiler crash on assignments with a dereferenced constant on the left side
- 1.00.0 regression: C backend: bad code for pointer array parameter accesses (resulting in gcc error reports)
- Better error recovery after byref function result assignment type mismatch errors
- 1.01.0/1.02.0 regression: Various bindings: some macros using sizeof() were badly translated (doing sizeof((T)), which doesn't compile, instead of sizeof(T))
- Various bindings: macros whose body is a scope block with just one statement are now translated as single-line statements, so that they can be used with single-line IF blocks
- 1.01.0 regression: CGUI binding: InitCgui() macro was broken
- 1.01.0 regression: GLib binding: G_N_ELEMENTS() macro was broken
- Windows API binding: added #inclib "msimg32" to wingdi.bi, for using functions like GradientFill()
- C backend: Bitfields in nested anonymous Types/Unions should no longer cause __fb_struct_size errors - fbc now uses the same work-around for them as for Types with bitfields at the toplevel, i.e. such Types are emitted as byte arrays, because fbc's/gcc's bitfield layout rules differ.
- 1.02.0 regression: Windows API binding: The select() function from winsock headers is now renamed to select_() again, as before
- 1.02.0 regression: Windows API binding: opensocket/selectsocket aliases for the socket_/select_ functions were missing
- 1.02.0 regression: Windows API binding: can be used with MinGW.org again, for the most part, although some individual functions still won't work as they use MinGW-w64-specific helper functions
- Various bindings: Some trivial "inline" functions are now turned into macros; fixed some cases of missing information about renamed symbols (e.g. in SDL2 binding)
- Some built-in functions with wstring parameters (e.g. Val(), Left(), Right()) accepted integers and pointers in place of the wstring (e.g. Val(0)). This triggers an error now.
- #772: Types with the same name but in different namespaces compared as equal in #if typeof(...) = typeof(...) checks and #print typeof(...) output, because the namespace prefix was not included in textual typeof()'s result string.
- For dynamic array parameters with specified number of dimensions (e.g. <(any) as integer> instead of <() as integer>), the number of dimensions in accesses and REDIMs is now checked at compile-time, like dynamic array variables
- 1.00.0 regression: Arrays declared with unknown dimensions ("()") could no longer be accessed with inconsistent dimension counts. This is now allowed again. If precise dimension count checking is wanted, the array should be declared using the "myArray(any, any, ...)" syntax.
- 1.02.0 regression: GL/glext.bi on Windows no longer automatically #included GL/gl.bi
Version 1.02.1
[changed]
[added]
- Package name + version to all the new/updated bindings
- Windows API binding: strsafe.bi and windowsx.bi; COBJMACROS declarations (COM helper macros)
- Windows API binding updated to mingw-w64 4.0.1
- 1.01.0 regression: Allegro 4 binding didn't have #inclibs for Win32 static linking or Linux X11 libs
[fixed]
- 1.02.0 regression: win/winuser.bi: Renamed INPUT typedef to INPUT_ to avoid conflicts with the quirk keyword (due to bug #730)
- 1.02.0 regression: OpenGL binding: glGetString() and some others use ZString Ptr instead of GLubyte Ptr again
- 1.02.0 regression: Windows API binding: REFIID and some other REF* types were missing; wsprintf/wvsprintf declarations were missing; ole2.bi couldn't be included directly/alone anymore.
- bindings: Various previously untranslated (or wrongly translated) #defines in SDL2, X11, crt/pthread, Windows API
- Windows API binding: DirectX headers missed some declarations and some didn't compile, win/commdlg.bi couldn't be #included behind windows.bi without WIN_INCLUDEALL because of missing #includes; re-added the undocumented ENUMWINDOWSPROC type; shlwapi.bi #includes shlobj.bi again (for backwards compatibility), some #defines were missing (e.g. lstrcpy/lstrcat).
- crt/string.bi, crt/mem.bi: Added CONSTs to function declarations
- #767: Illegal byref result assignments will now cause a proper error message, not just a warning
- Using the -asm att|intel option for non-x86[_64] targets now triggers an error
- C backend: -masm=... will now only be passed to gcc for x86[_64] targets
- Screen didn't return an error code if it failed
- Bad code generated for temporary variable destruction in static variable initialization: temporary strings or UDTs with destructors could be destroyed before even being initialized
- "BASE.field" accesses in expressions (not at the start of a line) allowed any token behind "BASE" instead of the ".", for example "BASE : field", or even EOL.
Version 1.02.0
[changed]
- Redims with explicit type will now redim existing dynamic array fields, if one of the same name exists, instead of creating a new local array. This makes Redims with explicit type match the behaviour of typeless Redims and Redims for global arrays.
- Relaxed type checking for procedure pointers and virtual method overrides: Procedures with different signatures can now be treated equal if the signatures are compatible. For example: assignments between a function pointer returning an Integer and one returning a Long won't cause a "suspicious pointer assignment" warning on 32bit anymore.
- -asm intel is now the default for all targets/backends (i.e. the C backend no longer defaults to -asm att). This should make switching between backends less trouble-some, especially with regards to inline ASM.
- The temporary .asm/.c files generated by fbc no longer contain time/date strings. This avoids unnecessary noise (the time/date is essentially always different) when comparing .asm/.c files (e.g. to detect changes in fbc's code generation).
[added]
- __FB_ASM__ intrinsic #define on x86, defined to "intel" or "att" (corresponding to the -asm command line option -- useful for -gen gcc/llvm only)
- fbc -showincludes option (shows #include tree) for debugging of #includes
- Address-of followed by pointer-arithmetic on variables (expressions such as @x+N) will now be turned into offsetted variable accesses, resulting in better generated code
- The results of type-casted function calls can now be ignored, even if it's a non-trivial cast
- Covariant parameters and function results (feature request #289)
- Type aliases for forward-reference type aliases (e.g. "type A as A_ : type B as A" -- previously it was only allowed to alias the forward reference directly: "type A as A_ : type B as A_")
- #761: crt/mem.bi for mem*() functions, separated from crt/string.bi, to allow them to be used together with windows.bi without running into conflicts between crt/string.bi and win/shlwapi.bi
- crt/iconv.bi for using glibc's iconv on GNU/Linux
- crt/regex.bi for using glibc's regex support on GNU/Linux
- crt/pthread.bi for using glibc's pthread support on GNU/Linux
- allegro5 binding: Win32-specific #inclibs supporting the lib naming convention used by Allegro5's Win32 builds
- Bindings (new/updated, including 64bit support):
FastCGI 2.4.1-SNAP-0311112127
Windows API, based on MinGW-w64's headers; DDK not updated yet; for GdiPlus only the flat C API is updated, not the C++ part.
libpng 1.2.53, 1.4.16, 1.5.21, 1.6.16
X11, based on current X.org packages
SDL1: SDL 1.2.15, SDL_image 1.2.12, SDL_mixer 1.2.12, SDL_net 1.2.8, SDL_ttf 2.0.11, SDL_gfx 2.0.13
SDL2: SDL2 2.0.3, SDL2_image 2.0.0, SDL2_mixer 2.0.0, SDL2_net 2.0.0, SDL2_ttf 2.0.12, SDL2_gfx 1.0.1
GNU libiconv 1.14
fontconfig 2.11.1
Allegro 5.0.11
TRE 0.8.0 as tre/tre.bi and tre/regex.bi. For backwards-compatibility, the "plain" regex.bi still exists, but now just redirects to tre/regex.bi.
OpenGL, based on Mesa-3D 10.5.1 (GL/mesa/*) and MinGW-w64 3.3.0 (GL/windows/*). GL/gl.bi & co use the Windows OpenGL binding on Win32/Win64, and the Mesa binding elsewhere.
GLUT 3.7
GLFW 2.7.9 (GL/glfw.bi), 3.1.1 (GLFW/glfw3.bi)
freeglut 3.0.0
Cairo 1.14.2
FreeType 2.5.5
GLib 2.42.2
Pango 1.36.8
ATK 2.14.0
gdk-pixbuf 2.30.8
GTK+ 2.24.27, 3.14.10
GtkGLExt 1.2.0
- The FB makefile now supports "make bootstrap-dist" and "make bootstrap" commands. The former allows packaging the FB sources together with precompiled fbc sources, and the latter allows building FB using those precompiled fbc sources, which is useful on systems that don't have a working fbc yet.
[fixed]
- Potential bad code generation for dynamic array field copying
- C backend: Naked functions could end up in the .data section instead of .text
- Returning a dereferenced constant (such as <cptr(UDT ptr, 0)->field>) caused a compiler crash
- 1.00.0 regression: Bad code generation for dynamic array descriptor initialization (and potentially other cases)
- 1.00.0 regression: . member access was allowed on [] pointer indexing expressions even if the type was not an UDT, but a UDT ptr
- Some unsafe pointer assignments between ANY PTRs and non-ANY PTRs with different PTR indirection levels didn't trigger a "suspicious pointer assignment" warning (e.g. ANY PTR PTR = BYTE PTR)
- On 64bit, all number literals with '&' suffix (LONG type) triggered a "too big" warning, even if their value was not really too big.
- #765: insufficient precision on FLT_MAX / DBL_MAX constants in crt/limits.bi
- gfxlib could crash on exit, if Screen[Res] was used in a global/module constructor
- #768: View [Screen] did not clip the given viewport coordinates to the screen properly, if x1/y1 were negative
- 0.90.0 regression: Potential compiler crash with -fpu sse -fpmode fast if the program used sin/cos and contained certain global float constants (such as pi/2)
- 1.00.0 regression: Potential dead-lock in thread-safe runtime library when using file or console I/O functions from multiple threads
- binding: allegro5: Fixed compilation on win32/win64
- Compiler directory layout: The non-standalone (Linux-style) DOS build now uses include/freebas/ and lib/freebas/ if running on DOS, instead of when compiling for DOS. This allows cross-compiling from Linux (or others) to DOS to work again: If on Linux, fbc -target dos will now use the normal include/freebasic/ and lib/freebasic/ directories of the Linux compiler, instead of requiring the 8.3-compatible directories.
- Extern variables were allowed to have mismatching fixed-length string lengths in declaration and definition
- 0.90.0 regression: In -lang qb, using __offsetof() caused a compiler error
- -lang qb's __offsetof() won't truncate the offset to 16 bit anymore
- Unix rtlib: division-by-zero crash on console I/O commands such as Input, if the terminal size couldn't be queried
- Unix rtlib: memory leak in X11 keyboard input handling initialization
- rtlib/gfxlib2: memory leaks of internal thread-specific data (gfxlib's TLS data when using the thread-safe (mt) FB runtime, and all TLS data of the main thread when using the normal (non-mt) FB runtime)
- rtlib: When using Open Scrn, there could be a dangling pointer bug in the internal screen file handle
Version 1.01.0
[changed]
- On Linux/*BSD, the FB runtime will now delay using VT100 terminal escape sequences to query terminal window size and cursor position until the first use of a console I/O command (previously it was immediately done at startup, always, even if the FB program didn't use any of FB's console I/O commands)
- WITH ... END WITH blocks now have an implicit scope, like SELECT, DO ... LOOP, etc. Variables declared inside will no longer be visible outside.
- Identifier length limit increased from 64 to 128 (due to Windows API headers which contain at least one identifier with 68 chars)
[added]
- On Linux/*BSD, the FB runtime will now respect the __fb_enable_vt100_escapes global variable (also see examples/console/disable-vt100-escapes.bas). FB programs can set it to 0 (FALSE) in order to manually disable the use of hard-coded VT100-specific escape sequences by FB's console I/O commands. This can help getting FB programs to run on older terminals which don't accept these escape sequences. However, it may also cause FB's console I/O commands and functions to behave differently. For example, if the use of the escape sequence for querying cursor position is disabled, then the FB runtime will assume that the cursor starts out at position 1,1 even if that is not actually true.
- WITH compounds now also accept type<UDT>(...) and UDT(...) expressions
- Constant 0 integers can now be assigned to pointers no matter what integer type it is. Previously it didn't work with [U]LongInts on 32bit and [U]Longs on 64bit.
- Constant 0 pointers can now be assigned to any integer type. Previously this was only allowed with integer types matching the pointer size (32bit or 64bit).
- #757: It's now possible to do UDT().field instead of (UDT()).field (field accesses on anonymous UDTs with constructors)
- On 64bit, bitfields can now use the [U]LongInt type
- Bindings (new/updated, including 64bit support):
Allegro 4.4.2 (allegro.bi)
algif 1.3 (allegro/algif.bi)
alpng 1.3 (allegro/alpng.bi)
Allegro 5.0.10 (allegro5/allegro.bi, plus the addons such as allegro5/allegro_font.bi)
CGUI 2.0.3
CUnit 2.1-3
fmod.bi for the old FMOD 3.75
IUP 3.11.2
libclang 3.5.0
libcurl 7.39.0
libffi 3.1
libjit a8293e141b79c28734a3633a81a43f92f29fc2d7
libpng 1.2.51, 1.4.13, 1.5.19, 1.6.14 (#define __LIBPNG_VERSION to 12/14/15/16 to select version, default = 16)
libzip 0.11.2
LLVM-C 3.5.0
Lua 5.2.3
ncurses 5.9
PDCurses 3.4
zlib 1.2.8
crt/sys/types.bi now provides off_t on Windows, like MinGW.org and MinGW-w64
[fixed]
- 1.00.0 regression: DRAW x/y pen position was reset during X<address> subcommands, instead of being preserved and passed to/from the subcommands
- 1.00.0 regression: C backend: Bad code generated when taking the address of __FB_ARGV__, resulting in a gcc error.
- Linux/*BSD: FB programs run in the background (CTRL+Z + bg) could hang on exit due to the FB runtime triggering a SIGTTOU
- -gen gcc: Single-precision constants were being emitted with precision less than 24 bits
- 1.00.0 regression: When compiling on DOS, \ backslashes were passed to the linker as \\ causing it to fail opening the passed files
- An fixed-size array variable declared behind a dynamic array variable in the same statement (for example <DIM AS INTEGER a(), b(0 to 1)>) was accidentally made dynamic too
- 1.00.0 regression: "REDIM Foo.array()" created a new local array called "array" (ignoring the "Foo." namespace prefix) if Foo.array was an existing variable and not a declared-but-not-yet-defined EXTERN (or static member variable). This will trigger an error again now. In FB 0.90.1 the error was "duplicate definition". Now it will be "declaration outside the original namespace or class", to match the behaviour for non-array variables.
- Type-less (and dimension-less) REDIM was allowed to define EXTERN dynamic arrays, even though DIM is not allowed to be type-less for defining EXTERN variables
- 1.00.0 regression: Compiler crash after showing an error when defining a non-array EXTERN using an array declaration
- 1.00.0 regression: lhsint &= rhsint self-assignments, where the lhsint expression included a function call, didn't result in a "type mismatch" error anymore, even though the string result of the & concatenation operation couldn't be assigned back to the lhsint.
- Self-assignments will now be parsed correctly when the lhs is a call to a function with byref result and one argument, for example: f(0) += 1
- Partial fix for #740 (unsafe FB runtime signal handling code): Fixed a potential dead lock and unnecessary terminal size query in the Unix rtlib.
- 0.90.0 + 1.00.0 regressions: SELECT CASE [AS CONST], FOR, and WITH were broken if the given expression(s) contained temporary variables, for example a function call with dynamic string parameters where the passed arguments were string literals. The temporary strings or UDT objects were destructed too early, before even being initialized, causing undefined behaviour. Temporary dynamic strings were affected by the problem since FB 1.00.0. Temporary UDT objects were affected by the problem since FB 0.90.0.
- #522 (part 1): WITH destroyed temp vars before entering the block. Now they will be kept alive until END WITH (or any EXIT/RETURN/GOTO out of the WITH block).
- #522 (part 2): WITH produced bad code on Win32 when used on function call returning a small UDT (i.e. where the UDT is returned in registers)
- Win32 gfxlib2 did not process thread messages, causing problems with response to system hotkeys and potentially more
- Hiword() on 64bit didn't filter out the upper dword when given a 64bit value
- The compiler incorrectly added leading underscores to ASM symbols on Win64 and 64bit Cygwin. Leading underscores are only used by Win32, not by Win64 though.
- #744: False-positive "recursive define" error messages in some situations with multiple/consecutive/nested (but non-recursive) macro expansions in the same line
- #478: DRAW "Mx,y" was offsetting subpixel precision by 0.5, leading to rounding errors e.g. in "Pp,b"
- DRAW now draws U/E/R/F/D/G/L/H using line-drawing routines rather than pixel-by-pixel, resulting in steadier lines and much better speed
- DRAW was not unsetting the B/N qualifiers after 0-length directional commands, e.g. "R0", resulting in them being applied to the following command, e.g. DRAW "B U0D0L0R0 R10" would not draw "R10"
- Bad code was generated when initializing integer variables with a wstring-indexing expressions
- #723: LINE clipping now doesn't affect which (unclipped) pixels are plotted, eliminating rounding differences and correctly preserving the position of the style bits
- BLOAD now gives an error if it encounters a BMP file with an unknown header size
- BLOAD was misreading bitfields in BMP files with undocumented BITMAPV3HEADER format (56-byte headers)
- PRINT now disallows commas/newlines after SPC/TAB, instead of silently ignoring them
- 0.90.0 regression: Compiler crash during error recovery for expressions like 'type<UDT>().field' where initializer values are missing
- When passing a constant zero of some integer to an overloaded procedure, overloads with integer parameters will now be preferred over overloads with pointers (literal 0 can still be passed to pointer parameters in this case though, by casting it to the pointer type)
- Literal zeroes with [U]Byte or [U]Short type (or the 16bit Integer in -lang qb) can now be passed to pointer parameters of overloaded procedures (now it's possible to call Bsave() with 0 source buffer in -lang qb again -- it also was affected by this bug since FB 0.90)
- #760: RETURN and FUNCTION= couldn't be used together in byref functions returning an UDT with constructor. This check is now only applied to functions returning byval.
- #755: If no result is set in byref functions, the compiler will now show an error instead of a warning (because a byref function defaults to returning a null reference, most likely causing a crash at runtime)
- Better error message for function result assignments outside of the function (#754), and for illegal use of Exit Sub|Function|...
- #748: Static member variables in UDTs inside procedures or scope blocks were allowed without error message (but didn't and cannot fully work in this situation, like methods). The compiler will now show an error in this case.
Version 1.00.0 (former 0.91.0):
[changed]
- Platform naming conventions have changed for Linux/BSD due to 64bit/ARM support. dos/win32/xbox stay the same, win64 is added, and we use the <os>-<cpufamily> format for other systems (Linux/*BSD/Cygwin): linux-x86, linux-x86_64, linux-arm, etc. This affects the compiler's -target option, installation directory layout, release packages, compiler -v output, etc. but not any FB code.
- The normal (non-standalone) compiler now uses target-specific sub-directories in lib/freebasic/ again, for example lib/freebasic/linux-x86/, to allow libs for other targets to be installed into the same directory, for example lib/freebasic/linux-x86_64/, instead of having to use a separate directory like lib/freebasic-linux-x86_64/. Same goes for the FB makefile: the *.o files go into target-specific subdirs in src/{compiler,rtlib,gfxlib2}/obj/, to avoid trashing the source dirs with tons of separate obj-<target>/ subdirs.
- More predictable overload resolution for primitive types, preferring: the same dataclass >> a type that's at least as large >> the closest in size >> the same signedness >> the same kind >> the [U]INTEGER type
- Bin/Oct/Hex(x, digits) functions now prepend zeroes, even if it's more than the data type size, if needed to fill the result string up to the requested amount of digits
- Number literal suffixes are now followed more strictly. For example, a number with L suffix will now always be a 32bit LONG (previously it could be 32bit or 64bit, signed or unsigned, depending on the value), and the % integer suffix will always produce the FB dialect mode's default INTEGER type (INTEGER, or SHORT in -lang qb), but never a [U]LONGINT anymore.
- CONST isn't allowed/needed on constructors/destructors anymore, the non-CONST versions now work even with CONST objects. (A CONST constructor couldn't initialize the object, so it's not useful. And after a destructor runs, the object is "dead", so it doesn't matter whether the destructor modified it or not.)
- DOS rtlib no longer uses setlocale(), as FB-dos doesn't support Unicode anyways, and thus the setlocale() reference here only served to unnecessarily increase .exe size.
- #if expressions allow quirk function names to be used as literals again, so for example <#IF TYPEOF(x) = STRING> works again, instead of complaining about missing arguments in a call to the String() function.
- For dynamic arrays where the dimension count is known at the point of the declaration, fbc will now allocate array descriptors with room for only the amount of required dimensions. Descriptors with room for all of FB_MAXARRAYDIMS will only be used for dynamic arrays declared with '()' (unknown dimension count) now.
- The C++-compatible name mangling for procedures with BYDESC parameters has been adjusted to match the implementation of BYDESC parameters, and to support the new '(any[, ...])' syntax.
- #699: The default global New/New[]/Delete/Delete[] operators now simply use allocate()/deallocate() internally, instead of the functions from GCC's libsupc++. This avoids platform-dependant behaviour of the GCC functions (exception throwing, aborting) in case of allocation failure (instead, NULL will be returned as with allocate()).
- FB no longer uses libsupc++ (from GCC's libstdc++) by default
- The implicitly generated copy constructors and LET overloads will now have "BYREF AS CONST MyUdt" parameters (previously they didn't use CONST), to allow copying from CONST objects to work at least for the built-in data types or with nested UDTs. For backwards compatibility, if there is a user-defined "UDT.let(byref as UDT)" LET overload, FB will still add the non-const "UDT.constructor(byref as UDT)" copy-constructor. It's still the programmer's responsibility to write proper "byref as const UDT" versions of the copy-constructor or LET overload if the UDT needs deep-copying and CONST instances of the UDT are being used.
- Function pointer types that differ only in function result CONSTness will now be seen as different, as in C++. Function pointer types that differ only in BYVAL parameter CONSTness will now be seen as being the same, as in C++.
- Some internal data structures and fields ($fb_RTTI, $fb_Object, $base, $vptr) have been renamed from $foo to foo$ to prevent gdb/STABS debugging data confusion, because a leading $ has special meaning there.
- user32 is now linked in by default when compiling for Windows (and Cygwin) as it's sometimes needed by MinGW-w64's libmingwex
[added]
- 64bit support (currently x86_64 and aarch64, based on -gen gcc): INTEGER/POINTER = 64bit, LONG = 32bit DWORD. Compiler #define: __FB_64BIT__
- -arch 32|64 options to support easy switching between 32bit and 64bit, by selecting a default arch that supports 32/64 bits respectively.
- ARM support (currently armv6|armv7-a|aarch64) based on -gen gcc. Compiler #define: __FB_ARM__
- To support non-x86 Unix shared libraries, there will now be PIC (position-independent code) versions of the FB libs for such systems: fbrt0pic.o, libfbpic.a, etc. The compiler will automatically use them when making a non-x86 Unix shared library.
- -pic option for generating position-independent code for non-x86 Unix shared libraries (automatically enabled by -dll, but must be given manually when compiling code via -c or -lib, if it will later be linked into a shared library)
- fbc -v now prints out the target system and architecture
- BYVAL AS STRING is now working properly: it now has BYVAL semantics and no longer behaves like BYREF AS ZSTRING. Modifications made by the callee are not visible to the caller, as for other BYVAL parameters. (BYVAL AS STRING is implemented by copying the string argument into a temporary STRING, whose descriptor is then passed BYREF to the procedure)
- New syntax for declaring dynamic arrays with certain amount of dimensions (but no initial bounds): DIM array(ANY) AS INTEGER (1 dimension), DIM array(ANY, ANY) AS INTEGER (2 dimensions), etc. This allows for better compile-time checking of dynamic array parameters, and also allows the compiler to allocate smaller array descriptors which is especially useful for dynamic array fields.
- Dynamic array fields are now supported in UDTs (for example: array(ANY) AS INTEGER). Similar rules as for dynamic string fields apply: Just the array descriptor is included in the UDT, not the actual array data. The UDT will become a class, and is given an implicit constructor and destructor to initialize the array descriptor, or free the data it contains. This code will also automatically be added to user-defined constructors/destructors.
- REDIM now also accepts expressions to access dynamic arrays, instead of just plain identifiers, which is needed to redim dynamic array fields, or dynamic arrays that are static member variables. For example: REDIM (this.array)(0 to 1)
- Improved multiplication/division/modulus to bitwise shift/and optimizations to handle operations with 64bit and unsigned right hand operand better