From 18 Jan, 2021 0:00 UTC: All services will be temporary unavailable for maintenance
  • R/O
  • SSH

YSLib: Commit

The YSLib project - main repository


Commit MetaInfo

Revisiona285f6f132e8ab5a92ea9fc7e40bf2fcff337d4b (tree)
Time2020-12-24 13:58:49
AuthorFrankHB <frankhb1989@gmai...>
CommiterFrankHB

Log Message

更新主分支版本: build 906 rev 10 。

Change Summary

Incremental Difference

diff -r 2843c4a3d41f -r a285f6f132e8 Tools/SHBuild/Main.cpp
--- a/Tools/SHBuild/Main.cpp Sun Dec 13 03:55:38 2020 +0800
+++ b/Tools/SHBuild/Main.cpp Thu Dec 24 12:58:49 2020 +0800
@@ -11,13 +11,13 @@
1111 /*! \file Main.cpp
1212 \ingroup MaintenanceTools
1313 \brief 宿主构建工具:递归查找源文件并编译和静态链接。
14-\version r4354
14+\version r4357
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 473
1717 \par 创建时间:
1818 2014-02-06 14:33:55 +0800
1919 \par 修改时间:
20- 2020-12-12 02:32 +0800
20+ 2020-12-17 02:10 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -28,7 +28,8 @@
2828 */
2929
3030
31-#include <YSBuild.h>
31+#include <YSLib/Service/YModules.h>
32+#include <NPL/YModules.h>
3233 #include YFM_YSLib_Core_YStorage // for YSLib::size_t, YSLib::RecordLevel,
3334 // YSLib::Notice, YSLib::FetchStaticRef, YSLib::string, YSLib::set, YSLib::map,
3435 // YSLib::vector, YSLib::Logger, YSLib::Warning, YSLib::to_std_string,
@@ -246,7 +247,7 @@
246247 // has effects on the help message, so just make it alphabatical to ease
247248 // users by default, except that there are some more reasons like the
248249 // effects on the execution mode.
249- // XXX: '-cmd,' is just at the front alphabatically now.
250+ // XXX: '-cmd,' is just at the front alphabatically now.
250251 {"-xcmd,", "command", "COMMAND", [](string&& val) ynothrow{
251252 RequestedCommand = std::move(val);
252253 }, {"Specify the name of a command to run.", "If this option is set, all"
@@ -1047,7 +1048,7 @@
10471048 using ms = duration<unsigned long long, std::milli>;
10481049 auto epoch(YSLib::Timers::FetchEpoch<steady_clock>());
10491050 Terminal te, te_err(stderr);
1050-
1051+
10511052 return FilterExceptions([&]{
10521053 string epoch_var;
10531054
diff -r 2843c4a3d41f -r a285f6f132e8 Tools/Scripts/SHBuild-BuildApp.txt
--- a/Tools/Scripts/SHBuild-BuildApp.txt Sun Dec 13 03:55:38 2020 +0800
+++ b/Tools/Scripts/SHBuild-BuildApp.txt Thu Dec 24 12:58:49 2020 +0800
@@ -15,6 +15,7 @@
1515 $env-de!
1616 $redef!
1717 SHBuild_CheckCXX
18+ SHBuild_Extend_CallVariables
1819 SHBuild_GetPlatformStrings
1920 SHBuild_Platform_Detect
2021 build-with-conf-opt
@@ -84,7 +85,6 @@
8485 (string-empty? (safeenv-get "SHBuild_Static"));
8586 $unless (dynamic) puts "Static mode turned on by configuration.";
8687 "XXX", "No extra configuration arguments are supported yet.";
87- safeenv-set "CXXFLAGS_COMMON" "";
8888 $redef! debug
8989 $or? debug (not? (string-empty? (safeenv-get "SHBuild_Debug")));
9090 $if (debug)
@@ -169,13 +169,7 @@
169169 ld-ext-adjust_win32_subsystem_ ($lambda (#ignore CXXFLAGS SHBOPT .)
170170 (
171171 "TODO", "Support precompiled headers?";
172- $env-de! SHBuild_LDFLAGS "";
173- $unless (string-empty? SHBuild_LDFLAGS)
174- (safeenv-set "LDFLAGS"
175- (++ SHBuild_LDFLAGS " " (env-get "LDFLAGS")));
176- $env-de! SHBuild_LIBS "";
177- $unless (string-empty? SHBuild_LIBS)
178- (safeenv-set "LIBS" (++ SHBuild_LIBS " " (env-get "LIBS")));
172+ () SHBuild_Extend_CallVariables;
179173 system-check (++ SHBuild " " (apply cons-cmd (append SHBOPT_BASE
180174 (list SHBOPT) (list (fix-flags CXXFLAGS))
181175 (list SHBuild_YSLib_Flags))))
diff -r 2843c4a3d41f -r a285f6f132e8 Tools/Scripts/SHBuild-YSLib-build.txt
--- a/Tools/Scripts/SHBuild-YSLib-build.txt Sun Dec 13 03:55:38 2020 +0800
+++ b/Tools/Scripts/SHBuild-YSLib-build.txt Thu Dec 24 12:58:49 2020 +0800
@@ -16,6 +16,7 @@
1616 SHBuild_2m
1717 SHBuild_CheckCXX
1818 SHBuild_EchoVar_N
19+ SHBuild_Extend_CallVariables
1920 SHBuild_GetPlatformStrings
2021 SHBuild_GetSystemPrefix
2122 SHBuild_Platform_Detect
@@ -23,6 +24,7 @@
2324 cons-cmd
2425 get_env_SHB_
2526 ld-ext-noadjust_
27+ rmatch?
2628 safeenv-empty?
2729 safeenv-get
2830 safeenv-restore
@@ -141,11 +143,12 @@
141143 "-xid,alternative -xid,data -xid,include -xid,Android" #f
142144 ld-ext-noadjust_ ($lambda (CXX CXXFLAGS SHBOPT LIBPFX)
143145 (
146+ $def! SHBuild_CXXFLAGS safeenv-get "SHBuild_CXXFLAGS";
144147 $if (safeenv-empty? "SHBuild_NoPCH")
145148 (
146149 BuildGCH_ (++ repo-base "/YBase/include/stdinc.h")
147- (++ outdir "/stdinc.h") CXX
148- (cons-cmd "-xc++-header" CXXFLAGS);
150+ (++ outdir "/stdinc.h") CXX (cons-cmd "-xc++-header"
151+ SHBuild_CXXFLAGS CXXFLAGS);
149152 $def! inc-pch list "-include"
150153 (system-quote-m_ (++ outdir "/stdinc.h"))
151154 )
@@ -154,6 +157,7 @@
154157 $def! inc-pch ()
155158 );
156159 $def! DFLAG_B_YB $if dynamic "-DYB_BUILD_DLL" "";
160+ () SHBuild_Extend_CallVariables;
157161 $def! base_LDFLAGS env-get "LDFLAGS";
158162 "NOTE", "The prefix 'lib' is explicit, see %InstLibD.";
159163 $defl! build-lib (lib-name inc-pch .opts)
@@ -183,19 +187,36 @@
183187 "XXX", "Precompiled header is not available as it",
184188 " requires '-D__NO_INLINE__ -U__OPTIMIZE__'.";
185189 "XXX", "See $2020-10 @ doc/Workflow.txt.";
186- $def! mingw64g $and? (eqv? host-platform_ "MinGW64")
187- (eqv? (SHBuild_CheckCXX host-os CXX) "G++");
188- $defl! fix-flags ()
190+ $def! use-g++ eqv? (SHBuild_CheckCXX host-os CXX) "G++";
191+ $def! mingw64g
192+ $and? use-g++ (eqv? host-platform_ "MinGW64");
193+ "XXX", "See $2020-12 @ doc/Workflow.txt.";
194+ $defl! use-asan? (opt) rmatch? opt
195+ "-f(address-sanitizer|sanitize=[a-z,]*address)";
196+ $def! linuxgrd-asan $and? use-g++ (not? debug) dynamic
197+ (eqv? host-platform_ "Linux")
198+ ($or? (use-asan? SHBuild_CXXFLAGS)
199+ (use-asan? (safeenv-get "SHBuild_LDFLAGS")));
200+ $defl! fix-flags-add ()
189201 (
190202 $cond
191203 (mingw64g $if dynamic
192204 "-Og -g -fno-var-tracking-assignments"
193205 "-O1 -g -fno-var-tracking-assignments")
206+ (linuxgrd-asan "-fno-var-tracking-assignments")
194207 (mingw32r "-fno-lto")
195208 (#t "")
196209 );
210+ $defl! fix-flags-add-w ()
211+ (
212+ $def! extra () fix-flags-add;
213+ $unless (string-empty? extra) (puts (++
214+ "WARNING: Additional option are prepended to work"
215+ " around the YFramework build: '" extra "'."));
216+ extra
217+ );
197218 build-lib "YFramework" ($if mingw64g () inc-pch)
198- (() fix-flags) ($if dynamic "-DYB_DLL" "")
219+ (() fix-flags-add-w) ($if dynamic "-DYB_DLL" "")
199220 ($if dynamic "-DYF_BUILD_DLL" "") "-DFREEIMAGE_LIB"
200221 (SHBuild_TrimOptions_ (++ INCLUDES_YFramework " "
201222 CFLAGS_freetype_other))
@@ -321,8 +342,12 @@
321342 "XXX", "Extra options for SHBOPT are always empty now.";
322343 build-with-conf-opt SR_SHBuild_ host-os #f #t "" #t
323344 ld-ext-noadjust_ ($lambda (CXX CXXFLAGS SHBOPT LIBPFX)
345+ (
346+ () SHBuild_Extend_CallVariables;
324347 system-check (apply cons-cmd (append (list e_S1_SHBuild_ src-dir
325- SHBOPT) extra-opts (list CXXFLAGS INCLUDES_))));
348+ SHBOPT) extra-opts (list CXXFLAGS INCLUDES_)))
349+ )
350+ );
326351 putss "Finished building " target-name "."
327352 );
328353 putss "Installing " target-name " ...";
@@ -350,11 +375,14 @@
350375 "XXX", "'SHBuild_BaseDir' is fixed in parallel to these directories of",
351376 " these tools, while 'SHBuild_ToolDir' is expected more portable.";
352377 build-with-conf-opt SR_SHBuild_ host-os #f #t "" #t
353- ld-ext-noadjust_ ($lambda (CXX CXXFLAGS SHBOPT LIBPFX) for-each-ltr
354- ($lambda (name)
378+ ld-ext-noadjust_ ($lambda (CXX CXXFLAGS SHBOPT LIBPFX)
379+ for-each-ltr ($lambda (name) (
380+ () SHBuild_Extend_CallVariables;
355381 system-check (apply cons-cmd (append (list e_S2_SHBuild_
356382 (++ SHBuild_BaseDir "/../" name) SHBOPT) extra-opts
357- (list CXXFLAGS INCLUDES_)))) tools-list);
383+ (list CXXFLAGS INCLUDES_)))
384+ )) tools-list
385+ );
358386 puts "Installing other development tools ...";
359387 $import! env_SHB_ InstHardLinkExe;
360388 for-each-ltr ($lambda (name) (
diff -r 2843c4a3d41f -r a285f6f132e8 Tools/Scripts/SHBuild-YSLib-common.txt
--- a/Tools/Scripts/SHBuild-YSLib-common.txt Sun Dec 13 03:55:38 2020 +0800
+++ b/Tools/Scripts/SHBuild-YSLib-common.txt Thu Dec 24 12:58:49 2020 +0800
@@ -183,8 +183,8 @@
183183 (
184184 $unless (safeenv-empty? "SHELL")
185185 (string<- src (system-quote src));
186- system-ok (cons-cmd "echo" src "|" (system-quote compile) "-xc++" "-o"
187- (system-quote out) opt "- 2>" err-out)
186+ system-ok (cons-cmd "echo" src "|" (system-quote compile) "-pipe" "-xc++"
187+ "-o" (system-quote out) opt "- 2>" err-out)
188188 );
189189 $defl! compile-ok-discard_ (src compile opt err-out)
190190 with-tmp-file_ (() mktmp_exe_)
@@ -225,6 +225,7 @@
225225 );
226226 first (rest& r)
227227 );
228+
228229 $defl! SHBuild_CheckCXX (host-os cxx)
229230 $let ((e SHBuild_CmdCache_GetEnv_ host-os) (sym string->symbol cxx))
230231 (
@@ -236,6 +237,17 @@
236237 );
237238 force (eval% sym e)
238239 );
240+
241+$defl! SHBuild_Extend_CallVariables ()
242+(
243+ $env-de! SHBuild_LDFLAGS "";
244+ $unless (string-empty? SHBuild_LDFLAGS)
245+ (safeenv-set "LDFLAGS" (++ SHBuild_LDFLAGS " " (env-get "LDFLAGS")));
246+ $env-de! SHBuild_LIBS "";
247+ $unless (string-empty? SHBuild_LIBS)
248+ (safeenv-set "LIBS" (++ SHBuild_LIBS " " (env-get "LIBS")));
249+);
250+
239251 $defl! SHBuild_ar_ok_ (ar)
240252 system-ok (cons-cmd (system-quote-m_ ar) "--help" "1>"
241253 (() mktmp_) "2>" nul_dev_);
@@ -396,9 +408,6 @@
396408 $def! prom_CFLAGS_STD $lazy-env-val "CFLAGS_STD" "-std=c11";
397409 $def! prom_CFLAGS_WARNING $lazy-env-val "CFLAGS_WARNING" cons-cmd
398410 (force prom_C_CXXFLAGS_WARNING) (force prom_C_CXXFLAGS_IMPL_WARNING);
399- $def! prom_CFLAGS_COMMON $lazy-env-val "CFLAGS_COMMON" cons-cmd
400- (force prom_C_CXXFLAGS_COMMON) (force prom_CFLAGS_STD)
401- (force prom_CFLAGS_WARNING);
402411 $def! prom_CXXFLAGS_IMPL_COMMON $lazy-env-val "CXXFLAGS_IMPL_COMMON"
403412 cons-cmd (first (force prom_thread-options_))
404413 "-U__GXX_MERGED_TYPEINFO_NAMES" "-D__GXX_MERGED_TYPEINFO_NAMES=1";
@@ -407,9 +416,6 @@
407416 (force prom_CFLAGS_WARNING) "-Wctor-dtor-privacy" "-Wnon-virtual-dtor"
408417 "-Woverloaded-virtual" "-Wsign-promo"
409418 (force prom_CXXFLAGS_IMPL_WARNING);
410- $def! prom_CXXFLAGS_COMMON $lazy-env-val "CXXFLAGS_COMMON" cons-cmd
411- (force prom_CXXFLAGS_STD) (force prom_C_CXXFLAGS_COMMON)
412- (force prom_CXXFLAGS_WARNING) (force prom_CXXFLAGS_IMPL_COMMON);
413419 $def! prom_CXXFLAGS_OPT_DBG $lazy
414420 $if debug ("-O0 -g -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC")
415421 (
@@ -418,12 +424,13 @@
418424 (force prom_CXXFLAGS_IMPL_OPT) "-fomit-frame-pointer"
419425 );
420426 "XXX", "Rename %CXXFLAGS_OPT_DBG -> CFLAGS_OPT_DBG/C_CXXFLAGS_OPT_DBG?";
421- $env-de! CFLAGS cons-cmd (force prom_C_CXXFLAGS_PIC)
422- (force prom_CFLAGS_COMMON) (force prom_C_CXXFLAGS_COMMON_IMPL_)
423- (force prom_CXXFLAGS_OPT_DBG);
424- $env-de! CXXFLAGS cons-cmd (force prom_C_CXXFLAGS_PIC)
425- (force prom_CXXFLAGS_COMMON) (force prom_C_CXXFLAGS_COMMON_IMPL_)
426- (force prom_CXXFLAGS_OPT_DBG);
427+ $env-de! CFLAGS cons-cmd (force prom_CFLAGS_STD) (force prom_C_CXXFLAGS_PIC)
428+ (force prom_C_CXXFLAGS_COMMON) (force prom_CFLAGS_WARNING)
429+ (force prom_C_CXXFLAGS_COMMON_IMPL_) (force prom_CXXFLAGS_OPT_DBG);
430+ $env-de! CXXFLAGS cons-cmd (force prom_CXXFLAGS_STD)
431+ (force prom_C_CXXFLAGS_PIC) (force prom_C_CXXFLAGS_COMMON)
432+ (force prom_CXXFLAGS_WARNING) (force prom_CXXFLAGS_IMPL_COMMON)
433+ (force prom_C_CXXFLAGS_COMMON_IMPL_) (force prom_CXXFLAGS_OPT_DBG);
427434 $redef! CFLAGS SHBuild_TrimOptions_ CFLAGS,
428435 $redef! CXXFLAGS SHBuild_TrimOptions_ CXXFLAGS;
429436 SHB_SetupPlatformVars_ (() get-current-environment) host-os;
diff -r 2843c4a3d41f -r a285f6f132e8 Tools/Scripts/SHBuild-common-options.sh
--- a/Tools/Scripts/SHBuild-common-options.sh Sun Dec 13 03:55:38 2020 +0800
+++ b/Tools/Scripts/SHBuild-common-options.sh Thu Dec 24 12:58:49 2020 +0800
@@ -34,8 +34,9 @@
3434
3535 # NOTE: See %SHBuild_CheckC.
3636 if [[ $SHBuild_CXX_Style_ != '' ]] \
37- && ! echo 'int main(){}' | "$CXX" -xc++ -o"$SHBuild_Env_TempDir/null" \
38- "$C_CXXFLAGS_GC" "$LDFLAGS_GC" - 2> /dev/null; then
37+ && ! echo 'int main(){}' | "$CXX" -pipe -xc++ \
38+ -o"$SHBuild_Env_TempDir/null" "$C_CXXFLAGS_GC" "$LDFLAGS_GC" \
39+ - 2> /dev/null; then
3940 C_CXXFLAGS_GC=''
4041 LDFLAGS_GC=''
4142 fi
@@ -73,9 +74,9 @@
7374 if "$CXX" -dumpspecs 2>& 1 | grep mthreads: > /dev/null; then
7475 CXXFLAGS_IMPL_COMMON_THRD_='-mthreads'
7576 LDFLAGS_IMPL_COMMON_THRD_='-mthreads'
76-elif echo 'int main(){}' | "$CXX" -xc++ \
77+elif echo 'int main(){}' | "$CXX" -pipe -xc++ \
7778 -o"$SHBuild_Env_TempDir/null" -Werror -mthreads - 2> /dev/null; then
78- if echo 'int main(){}' | "$CXX" -xc++ \
79+ if echo 'int main(){}' | "$CXX" -pipe -xc++ \
7980 -o"$SHBuild_Env_TempDir/null" -c -Werror -mthreads - 2> /dev/null; then
8081 CXXFLAGS_IMPL_COMMON_THRD_='-mthreads'
8182 else
@@ -85,7 +86,7 @@
8586 elif "$CXX" -dumpspecs 2>& 1 | grep no-pthread: > /dev/null; then
8687 CXXFLAGS_IMPL_COMMON_THRD_=''
8788 LDFLAGS_IMPL_COMMON_THRD_=''
88-elif echo 'int main(){}' | "$CXX" -xc++ \
89+elif echo 'int main(){}' | "$CXX" -pipe -xc++ \
8990 -o"$SHBuild_Env_TempDir/null" -pthread - 2> /dev/null; then
9091 CXXFLAGS_IMPL_COMMON_THRD_='-pthread'
9192 LDFLAGS_IMPL_COMMON_THRD_='-pthread'
@@ -117,12 +118,12 @@
117118 -Wsuggest-attribute=const \
118119 -Wsuggest-attribute=noreturn \
119120 -Wsuggest-attribute=pure \
120--Wsuggest-final-types \
121--Wsuggest-final-methods \
122121 -Wtrampolines"}"
123122 : "${CXXFLAGS_IMPL_WARNING:="-Wconditionally-supported \
124123 -Wno-noexcept-type \
125124 -Wstrict-null-sentinel \
125+-Wsuggest-final-types \
126+-Wsuggest-final-methods \
126127 -Wzero-as-null-pointer-constant"}"
127128 : "${CXXFLAGS_IMPL_OPT:="-fexpensive-optimizations \
128129 -flto=jobserver \
@@ -142,7 +143,6 @@
142143 : "${CFLAGS_WARNING:=" \
143144 $C_CXXFLAGS_WARNING \
144145 $C_CXXFLAGS_IMPL_WARNING"}"
145-: "${CFLAGS_COMMON:="$C_CXXFLAGS_COMMON $CFLAGS_STD $CFLAGS_WARNING"}"
146146
147147 : "${CXXFLAGS_IMPL_COMMON:="$CXXFLAGS_IMPL_COMMON_THRD_ \
148148 -U__GXX_MERGED_TYPEINFO_NAMES -D__GXX_MERGED_TYPEINFO_NAMES=1"}"
@@ -154,10 +154,6 @@
154154 -Woverloaded-virtual \
155155 -Wsign-promo \
156156 $CXXFLAGS_IMPL_WARNING"}"
157-: "${CXXFLAGS_COMMON:=" $CXXFLAGS_STD \
158-$C_CXXFLAGS_COMMON \
159-$CXXFLAGS_WARNING \
160-$CXXFLAGS_IMPL_COMMON"}"
161157 # XXX: %CXXFLAGS_OPT_UseAssert is external.
162158 # shellcheck disable=2154
163159 if [[ "$CXXFLAGS_OPT_UseAssert" == '' ]]; then
@@ -173,46 +169,17 @@
173169 fi
174170
175171 # XXX: Rename %CXXFLAGS_OPT_DBG to CFLAGS_OPT_DBG or C_CXXFLAGS_OPT_DBG?
176-: "${CFLAGS:="$C_CXXFLAGS_PIC $CFLAGS_COMMON $C_CXXFLAGS_COMMON_IMPL_ \
177-$CXXFLAGS_OPT_DBG"}"
172+: "${CFLAGS:="$CFLAGS_STD $C_CXXFLAGS_PIC $C_CXXFLAGS_COMMON $CFLAGS_WARNING \
173+$C_CXXFLAGS_COMMON_IMPL_ $CXXFLAGS_OPT_DBG"}"
178174 CFLAGS="${CFLAGS// / }"
179175
180-: "${CXXFLAGS:="$C_CXXFLAGS_PIC $CXXFLAGS_COMMON $C_CXXFLAGS_COMMON_IMPL_ \
176+: "${CXXFLAGS:="$CXXFLAGS_STD $C_CXXFLAGS_PIC $C_CXXFLAGS_COMMON \
177+$CXXFLAGS_WARNING $CXXFLAGS_IMPL_COMMON $C_CXXFLAGS_COMMON_IMPL_ \
181178 $CXXFLAGS_OPT_DBG"}"
182179 CXXFLAGS="${CXXFLAGS// / }"
183180
184181 : "${LDFLAGS_OPT_DBG:="$LDFLAGS_STRIP $LDFLAGS_IMPL_OPT $LDFLAGS_GC"}"
185182
186-# XXX: %SHBuild_Host_OS is external.
187-# shellcheck disable=2154
188-if [[ "$SHBuild_Host_OS" == 'Win32' ]]; then
189- : "${LDFLAGS_DYN_BASE:="-shared -Wl,--dll"}"
190- : "${DSOSFX:=.dll}"
191- : "${EXESFX:=.exe}"
192-else
193- : "${LDFLAGS_DYN_BASE:=-shared}"
194- : "${LIBS_RPATH:="-Wl,-rpath,'\$ORIGIN:\$ORIGIN/../lib'"}"
195- : "${LIBPFX:=lib}"
196- : "${DSOSFX:=.so}"
197-fi
198-
199-if [[ "$LDFLAGS_IMPL_USE_LLD_" == '' ]]; then
200- : "${LDFLAGS_DYN_EXTRA:="-Wl,--no-undefined -Wl,--dynamic-list-data, \
201---dynamic-list-cpp-new,--dynamic-list-cpp-typeinfo"}"
202-else
203- if [[ "$SHBuild_Host_OS" == 'Win32' ]]; then
204- : "${LDFLAGS_DYN_EXTRA:="-Wl,-undefined,error"}"
205- else
206- # XXX: Here '-Wl,' options are separated to improve compatibility for
207- # LLVM.
208- : "${LDFLAGS_DYN_EXTRA:="-Wl,-undefined,error \
209--Wl,--export-dynamic-symbol='_ZTS*' \
210--Wl,--export-dynamic-symbol='_ZTI*'"}"
211- fi
212-fi
213-
214-: "${LDFLAGS_DYN:="$LDFLAGS_DYN_BASE $LDFLAGS_DYN_EXTRA"}"
215-
216183 : "${LDFLAGS:="$C_CXXFLAGS_PIC $LDFLAGS_IMPL_COMMON_THRD_ $LDFLAGS_OPT_DBG"}"
217184 if [[ "$LDFLAGS_IMPL_USE_LLD_" != '' ]]; then
218185 LDFLAGS="-fuse-ld=lld $LDFLAGS"
diff -r 2843c4a3d41f -r a285f6f132e8 Tools/Scripts/SHBuild-common-toolchain.sh
--- a/Tools/Scripts/SHBuild-common-toolchain.sh Sun Dec 13 03:55:38 2020 +0800
+++ b/Tools/Scripts/SHBuild-common-toolchain.sh Thu Dec 24 12:58:49 2020 +0800
@@ -14,7 +14,8 @@
1414 SHBuild_CheckCC()
1515 {
1616 # NOTE: The output path cannot be '/dev/null'. See http://sourceforge.net/p/msys2/discussion/general/thread/2d6adff2/?limit=25.
17- if hash "$1" 2> /dev/null; then
17+ if [[ "$1" != */* ]] && (hash "$1" > /dev/null 2>& 1) \
18+ || [[ "$1" == */* && ! -d "$1" && -x "$1" ]]; then
1819 # XXX: %SHBuild_Env_TempDir is external.
1920 # shellcheck disable=2154
2021 if echo 'int main(void){return __clang__;}' | "$1" \
@@ -34,7 +35,8 @@
3435 SHBuild_CheckCXX()
3536 {
3637 # NOTE: As %SHBuild_CheckCC.
37- if hash "$1" 2> /dev/null; then
38+ if [[ "$1" != */* ]] && (hash "$1" > /dev/null 2>& 1) \
39+ || [[ "$1" == */* && ! -d "$1" && -x "$1" ]]; then
3840 if echo 'int main(){return __clang__;}' | "$1" \
3941 -xc++ -o"$SHBuild_Env_TempDir/null" - 2> /dev/null; then
4042 SHBuild_Put "Clang++"
diff -r 2843c4a3d41f -r a285f6f132e8 Tools/Scripts/SHBuild-common.sh
--- a/Tools/Scripts/SHBuild-common.sh Sun Dec 13 03:55:38 2020 +0800
+++ b/Tools/Scripts/SHBuild-common.sh Thu Dec 24 12:58:49 2020 +0800
@@ -55,8 +55,9 @@
5555
5656 SHBuild_CheckedCall()
5757 {
58- if hash "$1" > /dev/null 2>& 1; then
59- "$@" || exit $?
58+ if [[ "$1" != */* ]] && (hash "$1" > /dev/null 2>& 1) \
59+ || [[ "$1" == */* && ! -d "$1" && -x "$1" ]]; then
60+ "$@" || exit
6061 else
6162 SHBuild_Puts "ERROR: \"$1\" should exist. Failed calling \"$*\"." >& 2
6263 exit 1
@@ -66,7 +67,7 @@
6667 SHBuild_CheckedCallSilent()
6768 {
6869 if hash "$1" > /dev/null 2>& 1; then
69- "$@" > /dev/null || exit $?
70+ "$@" > /dev/null || exit
7071 else
7172 SHBuild_Puts "ERROR: \"$1\" should exist. Failed calling \"$*\"." >& 2
7273 exit 1
@@ -273,7 +274,7 @@
273274 {
274275 SHBuild_AssertNonempty SHBuild_Host_Arch
275276 SHBuild_AssertNonempty SHBuild_Host_OS
276- echo "$(SHBuild_Platform_Detect "$SHBuild_Host_OS" "$SHBuild_Host_Arch")"
277+ SHBuild_Platform_Detect "$SHBuild_Host_OS" "$SHBuild_Host_Arch"
277278 }
278279
279280
@@ -390,11 +391,12 @@
390391 : "${SHBuild_SysRoot:="$1"}"
391392 SHBuild_AssertNonempty SHBuild_SysRoot
392393 mkdir -p "$SHBuild_SysRoot"
394+ # shellcheck disable=2164
393395 SHBuild_SysRoot=$(cd "$SHBuild_SysRoot"; pwd)
394396 SHBuild_PrepareBuild
395397 # NOTE: See also %SHBuild-YSLib-build.txt.
396398 : "${SHBuild_SystemPrefix:=\
397-$(SHBuild_GetSystemPrefix $(SHBuild_GetBuildName))}"
399+$(SHBuild_GetSystemPrefix "$(SHBuild_GetBuildName)")}"
398400 SHBuild_InitReadonly SR_Prefix \
399401 SHBuild_Put "$SHBuild_SysRoot$SHBuild_SystemPrefix"
400402 }
diff -r 2843c4a3d41f -r a285f6f132e8 Tools/Scripts/Toolchain.options.mk
--- a/Tools/Scripts/Toolchain.options.mk Sun Dec 13 03:55:38 2020 +0800
+++ b/Tools/Scripts/Toolchain.options.mk Thu Dec 24 12:58:49 2020 +0800
@@ -8,9 +8,9 @@
88 # understand and accept it fully.
99 #
1010 # Makefile specifying common toolchain options
11-# Version = r78
11+# Version = r81
1212 # Created = 2014-12-06 17:24:04 +0800
13-# Updated = 2020-02-25 19:09 +0800
13+# Updated = 2020-12-14 00:44 +0800
1414 # Encoding = ANSI
1515
1616
@@ -35,8 +35,6 @@
3535
3636 CFLAGS_WARNING ?= $(C_CXXFLAGS_WARNING) $(C_CXXFLAGS_IMPL_WARNING)
3737
38-CFLAGS_COMMON ?= $(C_CXXFLAGS_COMMON) $(CFLAGS_STD) $(CFLAGS_WARNING)
39-
4038 CXXFLAGS_IMPL_OPT ?= -s -fexpensive-optimizations -flto=jobserver
4139 LDFLAGS_IMPL_OPT ?= -s -fexpensive-optimizations -flto
4240
@@ -47,8 +45,6 @@
4745
4846 CXXFLAGS_IMPL_COMMON ?= \
4947 -U__GXX_MERGED_TYPEINFO_NAMES -D__GXX_MERGED_TYPEINFO_NAMES=1
50-CXXFLAGS_COMMON ?= $(C_CXXFLAGS_COMMON) $(CXXFLAGS_STD) \
51- $(CXXFLAGS_WARNING) $(CXXFLAGS_IMPL_COMMON)
5248
5349 ifneq ($(CONF),debug)
5450 ASFLAGS_OPT_DBG ?=
diff -r 2843c4a3d41f -r a285f6f132e8 YBase/Android/Makefile
--- a/YBase/Android/Makefile Sun Dec 13 03:55:38 2020 +0800
+++ b/YBase/Android/Makefile Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 #
2-# (C) 2009-2016, 2019 FrankHB.
2+# (C) 2009-2016, 2019-2020 FrankHB.
33 #
44 # This file is part of the YSLib project, and may only be used,
55 # modified, and distributed under the terms of the YSLib project
@@ -8,9 +8,9 @@
88 # understand and accept it fully.
99 #
1010 # Android Makefile for YBase
11-# Version = r272
11+# Version = r303
1212 # Created = 2014-04-07 12:41:43 +0800
13-# Updated = 2019-09-08 00:25 +0800
13+# Updated = 2020-12-14 01:45 +0800
1414 # Encoding = ANSI
1515
1616
@@ -21,7 +21,6 @@
2121 SHBuild_ToolDir := $(dir $(lastword $(MAKEFILE_LIST)))/../../Tools/Scripts
2222 include $(SHBuild_ToolDir)/Toolchain.Android.mk
2323
24-#----
2524 # PROJNAME is the name of the project
2625 # CONF is the configuration name
2726 # RELEASE is the directory name for object files and intermediate files will be placed
@@ -32,7 +31,6 @@
3231 # SOURCES is a list of directories containing source code
3332 # INCLUDES is a list of directories containing extra header files
3433 # DATA is a list of directories containing binary files embedded using bin2o
35-#----
3634
3735 export PROJNAME ?= YBase
3836 export CONF ?= release
@@ -47,12 +45,12 @@
4745 export INCLUDES := include data $(REFDIR)/include
4846 export DATA := data $(REFDIR)/data
4947
50-# options for code generation
51-CFLAGS := $(INCLUDE) $(C_CXXFLAGS) $(CFLAGS_COMMON)
52-CXXFLAGS := $(INCLUDE) $(C_CXXFLAGS) $(CXXFLAGS_COMMON) \
53- -fno-threadsafe-statics -fuse-cxa-atexit -Wctor-dtor-privacy \
54- -Wnon-virtual-dtor -Wold-style-cast -Wsign-promo
55-# -Wnoexcept -Wnon-virtual-dtor -Wold-style-cast -Wsign-promo
48+CFLAGS := $(CFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS) $(C_CXXFLAGS_COMMON) \
49+ $(CFLAGS_WARNING)
50+CXXFLAGS := $(CXXFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS) $(C_CXXFLAGS_COMMON) \
51+ $(CXXFLAGS_WARNING) $(CXXFLAGS_IMPL_COMMON) -fuse-cxa-atexit \
52+ -Wold-style-cast
53+# -Wnoexcept
5654
5755 ifneq ($(CONF),$(notdir $(CURDIR)))
5856
@@ -71,17 +69,14 @@
7169
7270 MAPFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.map))
7371
74-#----
75-# use CXX for linking C++ projects, CC for standard C
76-#----
7772 ifeq ($(strip $(CPPFILES)),)
7873 export LD := $(CC)
7974 else
8075 export LD := $(CXX)
8176 endif
8277
83-export OFILES := $(addsuffix .o,$(MAPFILES)) $(addsuffix .o,$(BINFILES)) \
84- $(addsuffix .o,$(CPPFILES)) $(addsuffix .o,$(CFILES)) $(addsuffix .o,$(SFILES))
78+export OFILES := $(addsuffix .o,$(BINFILES)) $(addsuffix .o,$(CPPFILES)) \
79+ $(addsuffix .o,$(CFILES)) $(addsuffix .o,$(SFILES))
8580
8681 export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
8782 $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
@@ -109,28 +104,15 @@
109104
110105 all: $(CONF) $(OUTPUT)
111106
112-#----
113107 else
114108
115109 DEPENDS := $(OFILES:.o=.d)
116110
117-#----
118-# main targets
119-#----
120-
121-$(OUTPUT): $(OFILES)
111+$(OUTPUT) : $(OFILES)
122112 @rm -f "$(OUTPUT)"
123113 @echo Linking $(notdir $@) ...
124114 @$(AR) rcs "$(OUTPUT)" $(foreach file,$(OFILES),$(DEPSDIR)/$(file))
125115
126-#----
127-# you need a rule like this for each extension you use as binary data
128-#----
129-
130-#----
131-# Compile Targets for C/C++
132-#----
133-
134116 %.cpp.o: %.cpp
135117 @echo $<
136118 @[ -d $(dir $(DEPSDIR)/$@) ] || mkdir -p $(dir $(DEPSDIR)/$@)
@@ -146,7 +128,6 @@
146128 @[ -d $(dir $(DEPSDIR)/$@) ] || mkdir -p $(dir $(DEPSDIR)/$@)
147129 @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.s.d -x assembler-with-cpp $(ASFLAGS) -c $< -o$(DEPSDIR)/$@
148130
149-
150131 define bin2o
151132 @[ -d $(dir $(DEPSDIR)/$@) ] || mkdir -p $(dir $(DEPSDIR)/$@)
152133 cp $(<) $(notdir $(*))
@@ -161,13 +142,7 @@
161142 @echo $<
162143 @$(bin2o)
163144
164-%.map.o: %.map
165- @echo $<
166- @$(bin2o)
167-
168145 -include $(foreach file,$(DEPENDS),$(DEPSDIR)/$(file))
169146
170-#----
171147 endif
172-#----
173148
diff -r 2843c4a3d41f -r a285f6f132e8 YBase/DS/Makefile
--- a/YBase/DS/Makefile Sun Dec 13 03:55:38 2020 +0800
+++ b/YBase/DS/Makefile Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 #
2-# (C) 2009-2016 FrankHB.
2+# (C) 2009-2016, 2020 FrankHB.
33 #
44 # This file is part of the YSLib project, and may only be used,
55 # modified, and distributed under the terms of the YSLib project
@@ -8,9 +8,9 @@
88 # understand and accept it fully.
99 #
1010 # DS Makefile for YBase
11-# Version = r2004
11+# Version = r2040
1212 # Created = 2009-12-18 12:27:40 +0800
13-# Updated = 2016-04-12 22:21 +0800
13+# Updated = 2020-12-14 05:12 +0800
1414 # Encoding = ANSI
1515
1616
@@ -45,21 +45,16 @@
4545 export INCLUDES := include data $(REFDIR)/include
4646 export DATA := data $(REFDIR)/data
4747
48-# options for code generation
4948 ARCH := $(ARCH_ARM9)
5049 ARCH_AS := $(ARCH_AS_ARM9)
5150 ASFLAGS := $(ASFLAGS_ARM9)
52-CFLAGS := $(INCLUDE) $(C_CXXFLAGS_ARM9) $(CFLAGS_COMMON)
53-CXXFLAGS := $(INCLUDE) $(C_CXXFLAGS_ARM9) $(CXXFLAGS_COMMON) \
54- -fno-threadsafe-statics -fuse-cxa-atexit -Wctor-dtor-privacy -Wnoexcept \
55- -Wnon-virtual-dtor -Wold-style-cast -Wsign-promo
51+CFLAGS := $(CFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS_ARM9) $(C_CXXFLAGS_COMMON) \
52+ $(CFLAGS_WARNING)
53+CXXFLAGS := $(CXXFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS_ARM9) $(C_CXXFLAGS_COMMON) \
54+ $(CXXFLAGS_WARNING) $(CXXFLAGS_IMPL_COMMON) \
55+ -fno-threadsafe-statics -fuse-cxa-atexit -Wnoexcept -Wold-style-cast
5656
57-#----
58-# no real need to edit anything past this point unless you need to add additional
59-# rules for different file extensions
60-#----
6157 ifneq ($(CONF),$(notdir $(CURDIR)))
62-#----
6358
6459 export OUTPUT := $(RELEASEDIR)/lib$(TARGET).a
6560
@@ -76,17 +71,14 @@
7671
7772 MAPFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.map))
7873
79-#----
80-# use CXX for linking C++ projects, CC for standard C
81-#----
8274 ifeq ($(strip $(CPPFILES)),)
8375 export LD := $(CC)
8476 else
8577 export LD := $(CXX)
8678 endif
8779
88-export OFILES := $(addsuffix .o,$(MAPFILES)) $(addsuffix .o,$(BINFILES)) \
89- $(addsuffix .o,$(CPPFILES)) $(addsuffix .o,$(CFILES)) $(addsuffix .o,$(SFILES))
80+export OFILES := $(addsuffix .o,$(BINFILES)) $(addsuffix .o,$(CPPFILES)) \
81+ $(addsuffix .o,$(CFILES)) $(addsuffix .o,$(SFILES))
9082
9183 export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
9284 $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
@@ -96,7 +88,6 @@
9688
9789 .PHONY: $(CONF) clean rebuild all
9890
99-#----
10091 $(CONF):
10192 @echo Building configuration: $(notdir $@) ...
10293 @[ -d $(BUILDDIR)/dummy ] || mkdir -p $(BUILDDIR)/dummy
@@ -104,7 +95,6 @@
10495 @$(MAKE) --no-print-directory -C $(BUILDDIR) -f $(CURDIR)/Makefile
10596 @echo Built configuration: $(notdir $@).
10697
107-#----
10898 clean:
10999 @echo Cleaning $(TARGET) of $(PLATFORM) ...
110100 @rm -f $(foreach file,$(OFILES:.o=.d),$(DEPSDIR)/$(file))
@@ -116,28 +106,15 @@
116106
117107 all: $(CONF) $(OUTPUT)
118108
119-#----
120109 else
121110
122111 DEPENDS := $(OFILES:.o=.d)
123112
124-#----
125-# main targets
126-#----
127-
128113 $(OUTPUT) : $(OFILES)
129114 @rm -f "$(OUTPUT)"
130115 @echo Linking $(notdir $@) ...
131116 @$(AR) rcs "$(OUTPUT)" $(foreach file,$(OFILES),$(DEPSDIR)/$(file))
132117
133-#----
134-# you need a rule like this for each extension you use as binary data
135-#----
136-
137-#----
138-# Compile Targets for C/C++
139-#----
140-
141118 %.cpp.o : %.cpp
142119 @echo $<
143120 @[ -d $(dir $(DEPSDIR)/$@) ] || mkdir -p $(dir $(DEPSDIR)/$@)
@@ -153,7 +130,6 @@
153130 @[ -d $(dir $(DEPSDIR)/$@) ] || mkdir -p $(dir $(DEPSDIR)/$@)
154131 @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.s.d -x assembler-with-cpp $(ASFLAGS) -c $< -o$(DEPSDIR)/$@
155132
156-
157133 define bin2o
158134 @[ -d $(dir $(DEPSDIR)/$@) ] || mkdir -p $(dir $(DEPSDIR)/$@)
159135 cp $(<) $(notdir $(*))
@@ -164,17 +140,11 @@
164140 echo "extern const u32" $(notdir $(*))_size";" >> $(DEPSDIR)/$(*).h
165141 endef
166142
167-%.bin.o : %.bin
168- @echo $<
169- @$(bin2o)
170-
171-%.map.o : %.map
143+%.bin.o : %.bin
172144 @echo $<
173145 @$(bin2o)
174146
175147 -include $(foreach file,$(DEPENDS),$(DEPSDIR)/$(file))
176148
177-#----
178149 endif
179-#----
180150
diff -r 2843c4a3d41f -r a285f6f132e8 YBase/include/ystdex/apply.hpp
--- a/YBase/include/ystdex/apply.hpp Sun Dec 13 03:55:38 2020 +0800
+++ b/YBase/include/ystdex/apply.hpp Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2013-2016, 2018 FrankHB.
2+ © 2013-2016, 2018-2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file apply.hpp
1212 \ingroup YStandardEx
1313 \brief 元组应用操作。
14-\version r986
14+\version r989
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 333
1717 \par 创建时间:
1818 2019-01-11 19:43:23 +0800
1919 \par 修改时间:
20- 2019-01-30 10:07 +0800
20+ 2020-12-24 12:01 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -35,7 +35,7 @@
3535 // std::tuple_size, std::make_from_tuple;
3636
3737 /*!
38-\brief \<tuple\> 特性测试宏。
38+\brief \c \<tuple> 特性测试宏。
3939 \see WG21 P0941R2 2.2 。
4040 \see https://docs.microsoft.com/en-us/cpp/visual-cpp-language-conformance 。
4141 \since build 833
@@ -94,6 +94,7 @@
9494 }
9595 //@}
9696
97+ //! \since build 634
9798 template<typename _func>
9899 static yconstfn auto
99100 call(_func&& f, _tParams&&... args) -> yimpl(decltype(
diff -r 2843c4a3d41f -r a285f6f132e8 YBase/include/ystdex/exception.h
--- a/YBase/include/ystdex/exception.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YBase/include/ystdex/exception.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2014-2018 FrankHB.
2+ © 2014-2018, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file exception.h
1212 \ingroup YStandardEx
1313 \brief 标准库异常扩展接口。
14-\version r331
14+\version r336
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 522
1717 \par 创建时间:
1818 2014-07-25 20:14:51 +0800
1919 \par 修改时间:
20- 2018-12-26 19:52 +0800
20+ 2020-12-24 12:02 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -130,7 +130,10 @@
130130 };
131131
132132
133-//! \brief 异常:未实现的操作。
133+/*!
134+\brief 异常:未实现的操作。
135+\note 和 \c std::system_error 中的错误条件不同,一般不表示依赖外部确定支持条件。
136+*/
134137 class YB_API unimplemented : public unsupported
135138 {
136139 public:
diff -r 2843c4a3d41f -r a285f6f132e8 YBase/include/ystdex/iterator_trait.hpp
--- a/YBase/include/ystdex/iterator_trait.hpp Sun Dec 13 03:55:38 2020 +0800
+++ b/YBase/include/ystdex/iterator_trait.hpp Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2014-2016, 2019 FrankHB.
2+ © 2014-2016, 2019-2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file iterator_trait.hpp
1212 \ingroup YStandardEx
1313 \brief 迭代器特征。
14-\version r127
14+\version r129
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 627
1717 \par 创建时间:
1818 2015-08-30 16:29:07 +0800
1919 \par 修改时间:
20- 2019-09-04 11:19 +0800
20+ 2020-12-24 12:04 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -85,6 +85,7 @@
8585 /*!
8686 \ingroup metafunctions
8787 \note 约束的迭代器类型条件仅判断自增、间接操作(解引用)和(可选的)类别。
88+\note 不排除假阳性结果。
8889 \sa enable_if_t
8990 */
9091 //@{
diff -r 2843c4a3d41f -r a285f6f132e8 YBase/include/ytest/test.h
--- a/YBase/include/ytest/test.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YBase/include/ytest/test.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2014, 2019 FrankHB.
2+ © 2014, 2019-2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -16,13 +16,13 @@
1616 /*! \file test.h
1717 \ingroup YTest
1818 \brief 基础测试工具。
19-\version r111
19+\version r125
2020 \author FrankHB <frankhb1989@gmail.com>
2121 \since build 519
2222 \par 创建时间:
2323 2014-07-17 03:56:17 +0800
2424 \par 修改时间:
25- 2019-08-01 18:13 +0800
25+ 2020-12-24 12:02 +0800
2626 \par 文本编码:
2727 UTF-8
2828 \par 模块名称:
@@ -34,8 +34,8 @@
3434 #define YB_INC_ytest_test_h_ 1
3535
3636 #include "../ydef.h"
37-#include <string>
38-#include <functional>
37+#include <ystdex/string.hpp> // for ystdex::string;
38+#include <ystdex/function.hpp> // for ystdex::function;
3939
4040 /*!
4141 \since build 319
@@ -65,16 +65,20 @@
6565 class YB_API group_guard
6666 {
6767 public:
68- std::string subject;
68+ ystdex::string subject;
6969 size_t pass_n = 0;
7070 size_t fail_n = 0;
71- std::function<void(group_guard&)> on_end{};
71+ //! \since build 899
72+ ystdex::function<void(group_guard&)> on_end{};
7273
74+ //! \since build 899
75+ //@{
7376 //! \brief 构造:提供名称。
74- group_guard(const std::string&);
77+ group_guard(const ystdex::string&);
7578 //! \brief 构造:提供名称并注册回调,若起始回调非空时则调用。
76- group_guard(const std::string&, std::function<void(group_guard&)>,
77- std::function<void(group_guard&)>);
79+ group_guard(const ystdex::string&, ystdex::function<void(group_guard&)>,
80+ ystdex::function<void(group_guard&)>);
81+ //@}
7882 group_guard(group_guard&&) = default;
7983 /*!
8084 \brief 析构:调用 on_end 。
@@ -82,8 +86,9 @@
8286 */
8387 ~group_guard();
8488
89+ //! \since build 899
8590 template<typename _fPass, typename _fFail>
86- std::function<void(bool)>
91+ ystdex::function<void(bool)>
8792 get(_fPass pass, _fFail fail)
8893 {
8994 return [this, pass, fail](bool b){
diff -r 2843c4a3d41f -r a285f6f132e8 YBase/source/ytest/test.cpp
--- a/YBase/source/ytest/test.cpp Sun Dec 13 03:55:38 2020 +0800
+++ b/YBase/source/ytest/test.cpp Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2014 FrankHB.
2+ © 2014, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file test.cpp
1212 \ingroup YTest
1313 \brief 基础测试工具。
14-\version r53
14+\version r57
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 519
1717 \par 创建时间:
1818 2014-07-17 03:59:38 +0800
1919 \par 修改时间:
20- 2014-07-17 04:22 +0800
20+ 2020-12-24 12:02 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -30,11 +30,11 @@
3030 namespace ytest
3131 {
3232
33-group_guard::group_guard(const std::string& name)
33+group_guard::group_guard(const ystdex::string& name)
3434 : subject(name)
3535 {}
36-group_guard::group_guard(const std::string& name, std::function<void(
37- group_guard&)> on_b, std::function<void(group_guard&)> on_e)
36+group_guard::group_guard(const ystdex::string& name, ystdex::function<void(
37+ group_guard&)> on_b, ystdex::function<void(group_guard&)> on_e)
3838 : subject(name), on_end(on_e)
3939 {
4040 if(on_b)
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/Android/Makefile
--- a/YFramework/Android/Makefile Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/Android/Makefile Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 #
2-# (C) 2009-2016 FrankHB.
2+# (C) 2009-2016, 2020 FrankHB.
33 #
44 # This file is part of the YSLib project, and may only be used,
55 # modified, and distributed under the terms of the YSLib project
@@ -8,9 +8,9 @@
88 # understand and accept it fully.
99 #
1010 # Android Makefile for YFramework
11-# Version = r360
11+# Version = r459
1212 # Created = 2014-04-07 17:50:08 +0800
13-# Updated = 2016-04-12 22:20 +0800
13+# Updated = 2020-12-14 01:43 +0800
1414 # Encoding = ANSI
1515
1616
@@ -21,10 +21,6 @@
2121 SHBuild_ToolDir := $(dir $(lastword $(MAKEFILE_LIST)))/../../Tools/Scripts
2222 include $(SHBuild_ToolDir)/Toolchain.Android.mk
2323
24-CFLAGS_COMMON := $(CFLAGS_COMMON) -Wno-cast-align
25-CXXFLAGS_COMMON := $(CXXFLAGS_COMMON) -Wno-cast-align
26-
27-#----
2824 # PROJNAME is the name of the project
2925 # CONF is the configuration name
3026 # RELEASE is the directory name for object files and intermediate files will be placed
@@ -35,8 +31,6 @@
3531 # SOURCES is a list of directories containing source code
3632 # INCLUDES is a list of directories containing extra header files
3733 # DATA is a list of directories containing binary files embedded using bin2o
38-# GRAPHICS is a list of directories containing image files to be converted with grit
39-#----
4034
4135 export PROJNAME ?= YFramework
4236 export CONF ?= release
@@ -60,30 +54,18 @@
6054 $(REFDIR)/include ../../3rdparty/include ../../3rdparty/freetype/include
6155 export DATA := #data $(REFDIR)/data
6256
63-# options for code generation
64-CFLAGS := $(INCLUDE) $(C_CXXFLAGS) $(CFLAGS_COMMON)
65-CXXFLAGS := $(INCLUDE) $(C_CXXFLAGS) $(CXXFLAGS_COMMON) \
66- -fno-threadsafe-statics -fuse-cxa-atexit -Wctor-dtor-privacy \
67- -Wnon-virtual-dtor -Wsign-promo
68-# -Wnoexcept -Wnon-virtual-dtor -Wold-style-cast -Wsign-promo
69-
70-#----
71-# any extra libraries we wish to link with the project
72-#----
73-LIBS := #-lfreetype
57+CFLAGS := $(CFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS) $(C_CXXFLAGS_COMMON) \
58+ $(CFLAGS_WARNING) -Wno-cast-align
59+CXXFLAGS := $(CXXFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS) $(C_CXXFLAGS_COMMON) \
60+ $(CXXFLAGS_WARNING) $(CXXFLAGS_IMPL_COMMON) -Wno-cast-align \
61+ -fno-threadsafe-statics -fuse-cxa-atexit
62+# -Wnoexcept -Wold-style-cast
7463
75-#----
76-# list of directories containing libraries, this must be the top level containing
77-# include and lib
78-#----
79-LIBDIRS := $(LIBNDS) #lib
64+LIBS := #-lfreetype
8065
81-#----
82-# no real need to edit anything past this point unless you need to add additional
83-# rules for different file extensions
84-#----
66+LIBDIRS := $(LIBNDS) #lib
67+
8568 ifneq ($(CONF),$(notdir $(CURDIR)))
86-#----
8769
8870 export OUTPUT := $(RELEASEDIR)/lib$(TARGET).a
8971
@@ -96,35 +78,16 @@
9678 CFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.c))
9779 CPPFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.cpp))
9880 SFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.s))
99-PCXFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.pcx))
10081 BINFILES := $(foreach dir,$(DATA),$(wildcard $(dir)/*.bin))
10182
102-PNGFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.png))
103-PALFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.pal))
104-RAWFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.raw))
105-MAPFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.map))
106-JPEGFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.jpg))
107-MODFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.mod))
108-GIFFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.gif))
109-BMPFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.bmp))
110-MP3FILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.mp3))
111-
112-#----
113-# use CXX for linking C++ projects, CC for standard C
114-#----
11583 ifeq ($(strip $(CPPFILES)),)
11684 export LD := $(CC)
11785 else
11886 export LD := $(CXX)
11987 endif
12088
121-export OFILES := $(addsuffix .o,$(MAPFILES)) $(addsuffix .o,$(RAWFILES)) \
122- $(addsuffix .o,$(PALFILES)) $(addsuffix .o,$(BINFILES)) \
123- $(addsuffix .o,$(MODFILES)) $(addsuffix .o,$(BMPFILES)) \
124- $(addsuffix .o,$(JPEGFILES)) $(addsuffix .o,$(GIFFILES)) \
125- $(addsuffix .o,$(PNGFILES)) \
126- $(addsuffix .o,$(PCXFILES)) $(addsuffix .o,$(MP3FILES)) \
127- $(addsuffix .o,$(CPPFILES)) $(addsuffix .o,$(CFILES)) $(addsuffix .o,$(SFILES))
89+export OFILES := $(addsuffix .o,$(BINFILES)) $(addsuffix .o,$(CPPFILES)) \
90+ $(addsuffix .o,$(CFILES)) $(addsuffix .o,$(SFILES))
12891
12992 export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
13093 $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
@@ -158,23 +121,11 @@
158121
159122 DEPENDS := $(OFILES:.o=.d)
160123
161-#----
162-# main targets
163-#----
164-
165124 $(OUTPUT) : $(OFILES)
166125 @rm -f "$(OUTPUT)"
167126 @echo Linking $(notdir $@) ...
168127 @$(AR) rcs "$(OUTPUT)" $(foreach file,$(OFILES),$(DEPSDIR)/$(file))
169128
170-#----
171-# you need a rule like this for each extension you use as binary data
172-#----
173-
174-#----
175-# Compile Targets for C/C++
176-#----
177-
178129 %.cpp.o : %.cpp
179130 @echo $<
180131 @[ -d $(dir $(DEPSDIR)/$@) ] || mkdir -p $(dir $(DEPSDIR)/$@)
@@ -200,66 +151,11 @@
200151 echo "extern const unsigned" $(notdir $(*))_size";" >> $(DEPSDIR)/$(*).h
201152 endef
202153
203-%.mp3.o : %.mp3
204- @echo $<
205- @$(bin2o)
206-
207-%.pcx.o : %.pcx
208- @echo $<
209- @$(bin2o)
210-
211-%.bin.o : %.bin
212- @echo $<
213- @$(bin2o)
214-
215-%.png.o : %.png
216- @echo $<
217- @$(bin2o)
218-
219-%.raw.o : %.raw
220- @echo $<
221- @$(bin2o)
222-
223-%.pal.o : %.pal
224- @echo $<
225- @$(bin2o)
226-
227-%.map.o : %.map
154+%.bin.o : %.bin
228155 @echo $<
229156 @$(bin2o)
230157
231-%.mdl.o : %.mdl
232- @echo $<
233- @$(bin2o)
234-
235-%.jpg.o : %.jpg
236- @echo $<
237- @$(bin2o)
238-
239-%.mod.o : %.mod
240- @echo $<
241- @$(bin2o)
242-
243-%.gif.o : %.gif
244- @echo $<
245- @$(bin2o)
246-
247-%.bmp.o : %.bmp
248- @echo $<
249- @$(bin2o)
250-
251-#----
252-# This rule creates assembly source files using grit
253-# grit takes an image file and a .grit describing how the file is to be processed
254-# add additional rules like this for each image extension
255-# you use in the graphics folders
256-#----
257-%.s %.h : %.png %.grit
258- grit $< -fts -o$*
259-
260158 -include $(foreach file,$(DEPENDS),$(DEPSDIR)/$(file))
261159
262-#----
263160 endif
264-#----
265161
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/DS/Makefile
--- a/YFramework/DS/Makefile Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/DS/Makefile Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 #
2-# (C) 2009-2016 FrankHB.
2+# (C) 2009-2016, 2020 FrankHB.
33 #
44 # This file is part of the YSLib project, and may only be used,
55 # modified, and distributed under the terms of the YSLib project
@@ -8,9 +8,9 @@
88 # understand and accept it fully.
99 #
1010 # DS Makefile for YFramework -> ARM9
11-# Version = r2074
11+# Version = r2186
1212 # Created = 2009-12-18 12:27:40 +0800
13-# Updated = 2016-04-12 22:20 +0800
13+# Updated = 2020-12-14 02:30 +0800
1414 # Encoding = ANSI
1515
1616
@@ -21,10 +21,6 @@
2121 SHBuild_ToolDir := $(dir $(lastword $(MAKEFILE_LIST)))/../../Tools/Scripts
2222 include $(SHBuild_ToolDir)/Toolchain.DS.mk
2323
24-# NOTE: Option '-Wno-redundant-decls' is workaround for libnds.
25-CFLAGS_COMMON := $(CFLAGS_COMMON) -Wno-cast-align -Wno-redundant-decls
26-CXXFLAGS_COMMON := $(CXXFLAGS_COMMON) -Wno-cast-align -Wno-redundant-decls
27-
2824 # PROJNAME is the name of the project
2925 # CONF is the configuration name
3026 # RELEASE is the directory name for object files and intermediate files will be placed
@@ -35,7 +31,6 @@
3531 # SOURCES is a list of directories containing source code
3632 # INCLUDES is a list of directories containing extra header files
3733 # DATA is a list of directories containing binary files embedded using bin2o
38-# GRAPHICS is a list of directories containing image files to be converted with grit
3934
4035 export PROJNAME ?= YFramework
4136 export CONF ?= release
@@ -56,24 +51,24 @@
5651 ../../3rdparty/include ../../3rdparty/freetype/include
5752 export DATA := data $(REFDIR)/data
5853
59-# options for code generation
6054 ARCH := $(ARCH_ARM9)
6155 ARCH_AS := $(ARCH_AS_ARM9)
6256 ASFLAGS := $(ASFLAGS_ARM9)
63-CFLAGS := $(INCLUDE) $(C_CXXFLAGS_ARM9) $(CFLAGS_COMMON)
64-CXXFLAGS := $(INCLUDE) $(C_CXXFLAGS_ARM9) $(CXXFLAGS_COMMON) \
65- -fno-threadsafe-statics -fuse-cxa-atexit -Wsign-promo
66-# -Wnoexcept -Wold-style-cast -Wsign-promo
57+# NOTE: Options '-Wno-redundant-decls' and '-Wno-ignored-qualifiers' are the
58+# workaround for libnds.
59+CFLAGS := $(CFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS_ARM9) $(C_CXXFLAGS_COMMON) \
60+ $(CFLAGS_WARNING) -Wno-cast-align -Wno-redundant-decls \
61+ -Wno-ignored-qualifiers
62+CXXFLAGS := $(CXXFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS_ARM9) $(C_CXXFLAGS_COMMON) \
63+ $(CXXFLAGS_WARNING) $(CXXFLAGS_IMPL_COMMON) -fno-threadsafe-statics \
64+ -fuse-cxa-atexit -Wno-cast-align -Wno-redundant-decls \
65+ -Wno-ignored-qualifiers
66+# -Wnoexcept -Wold-style-cast
6767
68-# any extra libraries we wish to link with the project
69-LIBS := #
68+LIBS := #
7069
71-# list of directories containing libraries, this must be the top level containing
72-# include and lib
73-LIBDIRS := $(LIBNDS) #lib
70+LIBDIRS := $(LIBNDS) #lib
7471
75-# no real need to edit anything past this point unless you need to add additional
76-# rules for different file extensions
7772 ifneq ($(CONF),$(notdir $(CURDIR)))
7873
7974 export OUTPUT := $(RELEASEDIR)/lib$(TARGET).a
@@ -87,50 +82,16 @@
8782 CFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.c))
8883 CPPFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.cpp))
8984 SFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.s))
90-PCXFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.pcx))
9185 BINFILES := $(foreach dir,$(DATA),$(wildcard $(dir)/*.bin))
9286
93-ifeq ($(strip $(AUDIOFILES)),)
94- ifeq ($(strip $(ARM7_SELECTED)), ARM7_MAXMOD_DSWIFI)
95- TEXT_TO_SAY_2 := No MaxMod-compatible files were found in the audio folder.
96- TEXT_TO_SAY_3 := If you are loading the soundbank from FAT or EFS, ignore this message.
97- TEXT_TO_SAY_4 := " "
98- endif
99- DONT_BUILD_MAXMOD_SOUNDBANK = YES
100-endif
101-
102-ifneq ($(strip $(DONT_BUILD_MAXMOD_SOUNDBANK)), YES)
103- ifeq ($(strip $(ARM7_SELECTED)), ARM7_MAXMOD_DSWIFI)
104- BINFILES += soundbank_bin.bin
105- endif
106-endif
107-
108-PNGFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.png))
109-PALFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.pal))
110-RAWFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.raw))
111-MAPFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.map))
112-JPEGFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.jpg))
113-MODFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.mod))
114-GIFFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.gif))
115-BMPFILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.bmp))
116-MP3FILES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.mp3))
117-
118-#----
119-# use CXX for linking C++ projects, CC for standard C
120-#----
12187 ifeq ($(strip $(CPPFILES)),)
12288 export LD := $(CC)
12389 else
12490 export LD := $(CXX)
12591 endif
12692
127-export OFILES := $(addsuffix .o,$(MAPFILES)) $(addsuffix .o,$(RAWFILES)) \
128- $(addsuffix .o,$(PALFILES)) $(addsuffix .o,$(BINFILES)) \
129- $(addsuffix .o,$(MODFILES)) $(addsuffix .o,$(BMPFILES)) \
130- $(addsuffix .o,$(JPEGFILES)) $(addsuffix .o,$(GIFFILES)) \
131- $(addsuffix .o,$(PNGFILES)) \
132- $(addsuffix .o,$(PCXFILES)) $(addsuffix .o,$(MP3FILES)) \
133- $(addsuffix .o,$(CPPFILES)) $(addsuffix .o,$(CFILES)) $(addsuffix .o,$(SFILES))
93+export OFILES := $(addsuffix .o,$(BINFILES)) $(addsuffix .o,$(CPPFILES)) \
94+ $(addsuffix .o,$(CFILES)) $(addsuffix .o,$(SFILES))
13495
13596 export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
13697 $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
@@ -141,7 +102,6 @@
141102
142103 .PHONY: $(CONF) clean rebuild all
143104
144-#----
145105 $(CONF):
146106 @echo Building configuration: $(notdir $@) ...
147107 @[ -d $(BUILDDIR)/dummy ] || mkdir -p $(BUILDDIR)/dummy
@@ -149,7 +109,6 @@
149109 @$(MAKE) --no-print-directory -C $(BUILDDIR) -f $(CURDIR)/Makefile
150110 @echo Built configuration: $(notdir $@).
151111
152-#----
153112 clean:
154113 @echo Cleaning $(TARGET) of $(PLATFORM) ...
155114 @rm -f $(foreach file,$(OFILES:.o=.d),$(DEPSDIR)/$(file))
@@ -161,28 +120,15 @@
161120
162121 all: $(CONF) $(OUTPUT)
163122
164-#----
165123 else
166124
167125 DEPENDS := $(OFILES:.o=.d)
168126
169-#----
170-# main targets
171-#----
172-
173-$(OUTPUT) : $(OFILES)
127+$(OUTPUT) : $(OFILES)
174128 @rm -f "$(OUTPUT)"
175129 @echo Linking $(notdir $@) ...
176130 @$(AR) rcs "$(OUTPUT)" $(foreach file,$(OFILES),$(DEPSDIR)/$(file))
177131
178-#----
179-# you need a rule like this for each extension you use as binary data
180-#----
181-
182-#----
183-# Compile Targets for C/C++
184-#----
185-
186132 %.cpp.o : %.cpp
187133 @echo $<
188134 @[ -d $(dir $(DEPSDIR)/$@) ] || mkdir -p $(dir $(DEPSDIR)/$@)
@@ -208,66 +154,11 @@
208154 echo "extern const u32" $(notdir $(*))_size";" >> $(DEPSDIR)/$(*).h
209155 endef
210156
211-%.mp3.o : %.mp3
212- @echo $<
213- @$(bin2o)
214-
215-%.pcx.o : %.pcx
216- @echo $<
217- @$(bin2o)
218-
219-%.bin.o : %.bin
220- @echo $<
221- @$(bin2o)
222-
223-%.png.o : %.png
224- @echo $<
225- @$(bin2o)
226-
227-%.raw.o : %.raw
228- @echo $<
229- @$(bin2o)
230-
231-%.pal.o : %.pal
232- @echo $<
233- @$(bin2o)
234-
235-%.map.o : %.map
157+%.bin.o : %.bin
236158 @echo $<
237159 @$(bin2o)
238160
239-%.mdl.o : %.mdl
240- @echo $<
241- @$(bin2o)
242-
243-%.jpg.o : %.jpg
244- @echo $<
245- @$(bin2o)
246-
247-%.mod.o : %.mod
248- @echo $<
249- @$(bin2o)
250-
251-%.gif.o : %.gif
252- @echo $<
253- @$(bin2o)
254-
255-%.bmp.o : %.bmp
256- @echo $<
257- @$(bin2o)
258-
259-#----
260-# This rule creates assembly source files using grit
261-# grit takes an image file and a .grit describing how the file is to be processed
262-# add additional rules like this for each image extension
263-# you use in the graphics folders
264-#----
265-%.s %.h : %.png %.grit
266- grit $< -fts -o$*
267-
268161 -include $(foreach file,$(DEPENDS),$(DEPSDIR)/$(file))
269162
270-#----
271163 endif
272-#----
273164
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/DS/source/Helper/DSWindow.h
--- a/YFramework/DS/source/Helper/DSWindow.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/DS/source/Helper/DSWindow.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2013-2016, 2018 FrankHB.
2+ © 2013-2016, 2018, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -12,13 +12,13 @@
1212 \ingroup Helper
1313 \ingroup DS
1414 \brief DS 宿主窗口。
15-\version r136
15+\version r138
1616 \author FrankHB <frankhb1989@gmail.com>
1717 \since build 398
1818 \par 创建时间:
1919 2013-04-11 10:32:56 +0800
2020 \par 修改时间:
21- 2018-11-16 23:25 +0800
21+ 2020-12-24 12:06 +0800
2222 \par 文本编码:
2323 UTF-8
2424 \par 非公开模块名称:
@@ -73,7 +73,7 @@
7373 \sa HostWindow::MapPoint
7474 \since build 518
7575 */
76- YSLib::Drawing::Point
76+ YB_ATTR_nodiscard YB_PURE YSLib::Drawing::Point
7777 MapPoint(const YSLib::Drawing::Point&) const override;
7878
7979 //! \since build 591
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/Win32/include/YCLib/COM.h
--- a/YFramework/Win32/include/YCLib/COM.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/Win32/include/YCLib/COM.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2013-2016 FrankHB.
2+ © 2013-2016, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -12,13 +12,13 @@
1212 \ingroup YCLib
1313 \ingroup Win32
1414 \brief COM 接口。
15-\version r536
15+\version r539
1616 \author FrankHB <frankhb1989@gmail.com>
1717 \since build 412
1818 \par 创建时间:
1919 2012-06-07 10:29:30 +0800
2020 \par 修改时间:
21- 2016-07-14 23:04 +0800
21+ 2020-12-24 12:09 +0800
2222 \par 文本编码:
2323 UTF-8
2424 \par 模块名称:
@@ -26,8 +26,8 @@
2626 */
2727
2828
29-#ifndef YCL_MinGW32_INC_COMPtr_h_
30-#define YCL_MinGW32_INC_COMPtr_h_ 1
29+#ifndef YCL_Win32_INC_COMPtr_h_
30+#define YCL_Win32_INC_COMPtr_h_ 1
3131
3232 #include "YCLib/YModules.h"
3333 #include YFM_Win32_YCLib_MinGW32 // for platform_ex, std::runtime_error,
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/Win32/include/YCLib/Consoles.h
--- a/YFramework/Win32/include/YCLib/Consoles.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/Win32/include/YCLib/Consoles.h Thu Dec 24 12:58:49 2020 +0800
@@ -12,13 +12,13 @@
1212 \ingroup YCLib
1313 \ingroup Win32
1414 \brief 控制台。
15-\version r316
15+\version r327
1616 \author FrankHB <frankhb1989@gmail.com>
1717 \since build 520
1818 \par 创建时间:
1919 2013-05-09 11:01:12 +0800
2020 \par 修改时间:
21- 2020-01-27 02:40 +0800
21+ 2020-12-24 12:09 +0800
2222 \par 文本编码:
2323 UTF-8
2424 \par 模块名称:
@@ -26,8 +26,8 @@
2626 */
2727
2828
29-#ifndef YCL_MinGW32_INC_Consoles_h_
30-#define YCL_MinGW32_INC_Consoles_h_
29+#ifndef YCL_Win32_INC_Consoles_h_
30+#define YCL_Win32_INC_Consoles_h_
3131
3232 #include "YCLib/YModules.h"
3333 #include YFM_Win32_YCLib_MinGW32
@@ -82,8 +82,8 @@
8282 };
8383
8484 private:
85- //! \since build 559
86- ::HANDLE h_std;
85+ //! \since build 906
86+ ::HANDLE h_out;
8787 //! \since build 519
8888 ::WORD saved_attr;
8989
@@ -187,26 +187,31 @@
187187 \brief 输出字符串。
188188 \pre 断言:第一参数的数据指针非空。
189189 \return 输出的字符数。
190+ \note 因为 Windows 控制台的限制,不保证可正确输出 Unicode BMP 外的代码点。
190191 \since build 645
191192 */
192193 //@{
194+ //! \note 使用 UTF-8 字符串。
193195 size_t
194196 WriteString(string_view);
195- //! \note 第二参数为代码页。
197+ //! \note 第二参数为指定第一参数的编码的代码页。
196198 size_t
197199 WriteString(string_view, unsigned);
200+ //! \note 使用 UTF-16LE 字符串。
201+ //@{
198202 size_t
199203 WriteString(wstring_view);
200204 PDefH(size_t, WriteString, u16string_view sv)
201205 ImplRet(WriteString(wstring(sv.cbegin(), sv.cend())))
202206 //@}
203207 //@}
208+ //@}
204209 };
205210
206211 /*!
207212 \ingroup helper_functions
208213 \brief 创建控制台对象。
209-\return 指向新创建的控制台对象的指针,若失败则为空。
214+\return 指向新创建的控制台对象的指针,若构造失败则为空。
210215 \note 不抛出 Win32Exception 。
211216 \relates WConsole
212217 \since build 593
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/Win32/include/YCLib/Registry.h
--- a/YFramework/Win32/include/YCLib/Registry.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/Win32/include/YCLib/Registry.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2013-2016, 2018 FrankHB.
2+ © 2013-2016, 2018, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -12,13 +12,13 @@
1212 \ingroup YCLib
1313 \ingroup Win32
1414 \brief 注册表。
15-\version r145
15+\version r148
1616 \author FrankHB <frankhb1989@gmail.com>
1717 \since build 412
1818 \par 创建时间:
1919 2015-09-12 19:33:37 +0800
2020 \par 修改时间:
21- 2018-08-21 20:44 +0800
21+ 2020-12-24 12:09 +0800
2222 \par 文本编码:
2323 UTF-8
2424 \par 模块名称:
@@ -26,8 +26,8 @@
2626 */
2727
2828
29-#ifndef YCL_MinGW32_INC_Registry_h_
30-#define YCL_MinGW32_INC_Registry_h_ 1
29+#ifndef YCL_Win32_INC_Registry_h_
30+#define YCL_Win32_INC_Registry_h_ 1
3131
3232 #include "YCLib/YModules.h"
3333 #include YFM_Win32_YCLib_MinGW32 // for platform::Nonnull, wstring, vector,
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/Win32/source/YCLib/Consoles.cpp
--- a/YFramework/Win32/source/YCLib/Consoles.cpp Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/Win32/source/YCLib/Consoles.cpp Thu Dec 24 12:58:49 2020 +0800
@@ -12,13 +12,13 @@
1212 \ingroup YCLib
1313 \ingroup Win32
1414 \brief 控制台。
15-\version r340
15+\version r350
1616 \author FrankHB <frankhb1989@gmail.com>
1717 \since build 403
1818 \par 创建时间:
1919 2013-05-09 11:01:35 +0800
2020 \par 修改时间:
21- 2020-01-27 02:31 +0800
21+ 2020-12-24 12:09 +0800
2222 \par 文本编码:
2323 UTF-8
2424 \par 模块名称:
@@ -78,10 +78,10 @@
7878 : WConsole(::GetStdHandle(dev))
7979 {}
8080 WConsole::WConsole(::HANDLE h)
81- : h_std(h), saved_attr(GetScreenBufferInfo().wAttributes),
81+ : h_out(h), saved_attr(GetScreenBufferInfo().wAttributes),
8282 Attributes(saved_attr)
8383 {
84- YAssert(h_std && h_std != INVALID_HANDLE_VALUE, "Invalid handle found.");
84+ YAssert(h_out && h_out != INVALID_HANDLE_VALUE, "Invalid handle found.");
8585 }
8686 WConsole::~WConsole()
8787 {
@@ -93,7 +93,7 @@
9393 {
9494 ::CONSOLE_SCREEN_BUFFER_INFO info;
9595
96- YCL_CallF_Win32(GetConsoleScreenBufferInfo, h_std, &info);
96+ YCL_CallF_Win32(GetConsoleScreenBufferInfo, h_out, &info);
9797 return info;
9898 }
9999
@@ -115,7 +115,7 @@
115115 WConsole::SetCursorPosition(::COORD pos)
116116 {
117117 // NOTE: %::SetConsoleCursorPosition expects 1-based.
118- YCL_CallF_Win32(SetConsoleCursorPosition, h_std,
118+ YCL_CallF_Win32(SetConsoleCursorPosition, h_out,
119119 {short(pos.X + 1), short(pos.Y + 1)});
120120 }
121121 void
@@ -154,9 +154,9 @@
154154 void
155155 WConsole::Fill(::COORD coord, unsigned long n, wchar_t c)
156156 {
157- YCL_CallF_Win32(FillConsoleOutputCharacterW, h_std, c, n, coord, {});
158- YCL_CallF_Win32(FillConsoleOutputAttribute, h_std, Attributes, n, coord, {});
159- YCL_CallF_Win32(SetConsoleCursorPosition, h_std, {coord.X, coord.Y});
157+ YCL_CallF_Win32(FillConsoleOutputCharacterW, h_out, c, n, coord, {});
158+ YCL_CallF_Win32(FillConsoleOutputAttribute, h_out, Attributes, n, coord, {});
159+ YCL_CallF_Win32(SetConsoleCursorPosition, h_out, {coord.X, coord.Y});
160160 }
161161
162162 void
@@ -174,7 +174,7 @@
174174 void
175175 WConsole::Update(::WORD value)
176176 {
177- YCL_CallF_Win32(SetConsoleTextAttribute, h_std, value);
177+ YCL_CallF_Win32(SetConsoleTextAttribute, h_out, value);
178178 }
179179
180180 void
@@ -195,7 +195,6 @@
195195 WConsole::WriteString(string_view sv)
196196 {
197197 YAssertNonnull(sv.data());
198- // FIXME: Support for non-BMP characters.
199198 return WriteString(UTF8ToWCS(sv));
200199 }
201200 size_t
@@ -211,7 +210,7 @@
211210
212211 unsigned long n;
213212
214- YCL_CallF_Win32(WriteConsoleW, h_std, sv.data(),
213+ YCL_CallF_Win32(WriteConsoleW, h_out, sv.data(),
215214 static_cast<unsigned long>(sv.length()), &n, yimpl({}));
216215 return size_t(n);
217216 }
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/include/Helper/Environment.h
--- a/YFramework/include/Helper/Environment.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/include/Helper/Environment.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2013-2016 FrankHB.
2+ © 2013-2016, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file Environment.h
1212 \ingroup Helper
1313 \brief 环境。
14-\version r1068
14+\version r1072
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 521
1717 \par 创建时间:
1818 2013-02-08 01:28:03 +0800
1919 \par 修改时间:
20- 2016-05-16 13:29 +0800
20+ 2020-12-24 12:05 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -66,13 +66,12 @@
6666 \brief 环境根节点。
6767 \since build 688
6868 */
69- ValueNode Root;
69+ ValueNode Root{};
7070
71-public:
7271 /*!
7372 \brief 构造:初始化环境。
7473 \note Win32 平台:尝试无参数调用 FixConsoleHandler ,若失败则跟踪警告。
75- \sa Application::AddExitGuard
74+ \sa Application::AddExit
7675 \since build 693
7776 */
7877 Environment(Application&);
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/include/NPL/NPLA.h
--- a/YFramework/include/NPL/NPLA.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/include/NPL/NPLA.h Thu Dec 24 12:58:49 2020 +0800
@@ -11,13 +11,13 @@
1111 /*! \file NPLA.h
1212 \ingroup NPL
1313 \brief NPLA 公共接口。
14-\version r7993
14+\version r8005
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 663
1717 \par 创建时间:
1818 2016-01-07 10:32:34 +0800
1919 \par 修改时间:
20- 2020-11-18 14:46 +0800
20+ 2020-12-23 19:48 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -895,14 +895,14 @@
895895 TryAccessLeaf(TermNode& term)
896896 {
897897 return term.Value.type() == ystdex::type_id<_type>() ? NPL::make_observer(
898- std::addressof(term.Value.GetObject<_type>())) : nullptr;
898+ std::addressof(term.Value.GetObject<_type>())) : nullptr;
899899 }
900900 template<typename _type>
901901 YB_ATTR_nodiscard YB_PURE inline observer_ptr<const _type>
902902 TryAccessLeaf(const TermNode& term)
903903 {
904904 return term.Value.type() == ystdex::type_id<_type>() ? NPL::make_observer(
905- std::addressof(term.Value.GetObject<_type>())) : nullptr;
905+ std::addressof(term.Value.GetObject<_type>())) : nullptr;
906906 }
907907 //@}
908908
@@ -1228,13 +1228,10 @@
12281228 };
12291229
12301230 /*!
1231-\sa TermNode::Tags
1232-\relates TermReference
1233-*/
1234-//@{
1235-/*!
12361231 \brief 折叠项引用。
12371232 \return 结果引用值及初始化时是否表示引用值。
1233+\relates TermReference
1234+\sa TermNode::Tags
12381235 \since build 857
12391236
12401237 若被参数引用值引用的对象是否是一个引用值,结果为合并标签后的被后者引用的对象和 true ;
@@ -1244,6 +1241,7 @@
12441241 YB_ATTR_nodiscard YF_API pair<TermReference, bool>
12451242 Collapse(TermReference);
12461243
1244+
12471245 /*!
12481246 \brief 准备折叠项引用。
12491247 \pre 间接断言:第一参数不指定引用值时第二参数非空。
@@ -1260,7 +1258,6 @@
12601258 */
12611259 YB_ATTR_nodiscard YF_API TermNode
12621260 PrepareCollapse(TermNode&, const shared_ptr<Environment>&);
1263-//@}
12641261
12651262 /*!
12661263 \brief 访问项并取解析 TermReference 间接值后的引用。
@@ -2282,9 +2279,10 @@
22822279 /*!
22832280 \brief 根据当前状态创建指定项的引用。
22842281 \note 项通常表示当前环境对象所有的被绑定对象。
2285- \since build 871
2282+ \since build 906
22862283 */
2287- PDefH(TermTags, MakeTermTags, const TermNode& term) const
2284+ YB_ATTR_nodiscard YB_PURE
2285+ PDefH(TermTags, MakeTermTags, const TermNode& term) const ynothrow
22882286 ImplRet(Frozen ? term.Tags | TermTags::Nonmodifying : term.Tags)
22892287
22902288 /*!
@@ -2631,7 +2629,7 @@
26312629 */
26322630 ContextNode(pmr::memory_resource&);
26332631 /*!
2634- \brief 构造:使用对象副本和环境指针。
2632+ \brief 构造:使用对象副本和环境指针。
26352633 \throw std::invalid_argument 参数指针为空。
26362634 \sa Environment::ThrowForInvalidValue
26372635 \since build 788
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/include/YCLib/HostedGUI.h
--- a/YFramework/include/YCLib/HostedGUI.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/include/YCLib/HostedGUI.h Thu Dec 24 12:58:49 2020 +0800
@@ -12,13 +12,13 @@
1212 \ingroup YCLib
1313 \ingroup YCLibLimitedPlatforms
1414 \brief 宿主 GUI 接口。
15-\version r1587
15+\version r1596
1616 \author FrankHB <frankhb1989@gmail.com>
1717 \since build 560
1818 \par 创建时间:
1919 2013-07-10 11:29:04 +0800
2020 \par 修改时间:
21- 2020-04-19 03:48 +0800
21+ 2020-12-16 19:02 +0800
2222 \par 文本编码:
2323 UTF-8
2424 \par 模块名称:
@@ -435,7 +435,15 @@
435435 \invariant bool(p_impl) 。
436436 \since build 593
437437 */
438- unique_ptr<ScreenBufferData> p_impl{};
438+ unique_ptr<ScreenBufferData> p_impl
439+# if !YB_IMPL_GNUCPP || YB_IMPL_GNUCPP >= 90200
440+ // NOTE: Workaround for a bug fixed in GCC 9.2. The revision of the fix is
441+ // not checked. It seems like an issue of point of instantiation. It is not
442+ // a regression, since all old versions are effected. It has nothing to do
443+ // with LWG 2801. See also https://stackoverflow.com/questions/58375922.
444+ {}
445+# endif
446+ ;
439447 /*!
440448 \brief 宽:以像素数计量的缓冲区的实际宽度。
441449 \since build 498
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/source/Helper/GUIApplication.cpp
--- a/YFramework/source/Helper/GUIApplication.cpp Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/source/Helper/GUIApplication.cpp Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2012-2016 FrankHB.
2+ © 2012-2016, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file GUIApplication.cpp
1212 \ingroup Helper
1313 \brief GUI 应用程序。
14-\version r578
14+\version r582
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 396
1717 \par 创建时间:
1818 2013-04-06 22:42:54 +0800
1919 \par 修改时间:
20- 2016-08-27 15:38 +0800
20+ 2020-12-24 12:07 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -112,6 +112,9 @@
112112 }
113113
114114 #if YF_Hosted
115+# if !YCL_Win32
116+YB_STATELESS
117+# endif
115118 observer_ptr<Window>
116119 GUIHost::GetForegroundWindow() const ynothrow
117120 {
@@ -235,7 +238,6 @@
235238 YAssert(!ApplicationPtr, "Duplicate instance found.");
236239 ApplicationPtr = this;
237240 }
238-
239241 GUIApplication::~GUIApplication()
240242 {
241243 lock_guard<recursive_mutex> lck(ApplicationMutex);
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/source/Helper/HostedUI.cpp
--- a/YFramework/source/Helper/HostedUI.cpp Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/source/Helper/HostedUI.cpp Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2013-2016 FrankHB.
2+ © 2013-2016, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file HostedUI.cpp
1212 \ingroup Helper
1313 \brief 宿主环境支持的用户界面。
14-\version r546
14+\version r551
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 389
1717 \par 创建时间:
1818 2013-03-17 10:22:36 +0800
1919 \par 修改时间:
20- 2016-05-02 13:51 +0800
20+ 2020-12-24 12:07 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -62,7 +62,7 @@
6262 using ystdex::pvoid;
6363
6464 wnd.MessageMap[WM_DESTROY] += [&]{
65- PostTask([&, prior]{
65+ PostTask([&]{
6666 wgt.SetRenderer({});
6767 }, prior);
6868 };
@@ -101,6 +101,9 @@
101101 }
102102 }
103103
104+# if !YCL_Win32
105+YB_STATELESS
106+# endif
104107 Point
105108 FetchDefaultTopLevelPosition() ynothrow
106109 {
diff -r 2843c4a3d41f -r a285f6f132e8 YFramework/source/YCLib/XCB.cpp
--- a/YFramework/source/YCLib/XCB.cpp Sun Dec 13 03:55:38 2020 +0800
+++ b/YFramework/source/YCLib/XCB.cpp Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2014-2016, 2018 FrankHB.
2+ © 2014-2016, 2018, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -12,13 +12,13 @@
1212 \ingroup YCLib
1313 \ingroup YCLibLimitedPlatforms
1414 \brief XCB GUI 接口。
15-\version r597
15+\version r599
1616 \author FrankHB <frankhb1989@gmail.com>
1717 \since build 427
1818 \par 创建时间:
1919 2014-12-14 14:14:31 +0800
2020 \par 修改时间:
21- 2018-11-27 19:07 +0800
21+ 2020-12-24 12:06 +0800
2222 \par 文本编码:
2323 UTF-8
2424 \par 模块名称:
@@ -358,7 +358,7 @@
358358 return p->atom;
359359 return XCB_ATOM_NONE;
360360 }(::xcb_intern_atom_unchecked(&c_ref, only_if_exists, n.length(),
361- (Nonnull(n.data()), n.data()))))
361+ Nonnull(n.data()))))
362362 {}
363363
364364
diff -r 2843c4a3d41f -r a285f6f132e8 YSTest/Android/Makefile
--- a/YSTest/Android/Makefile Sun Dec 13 03:55:38 2020 +0800
+++ b/YSTest/Android/Makefile Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 #
2-# (C) 2014, 2016, 2019 FrankHB.
2+# (C) 2014, 2016, 2019-2020 FrankHB.
33 #
44 # This file is part of the YSLib project, and may only be used,
55 # modified, and distributed under the terms of the YSLib project
@@ -8,9 +8,9 @@
88 # understand and accept it fully.
99 #
1010 # Android Makefile for YSTest
11-# Version = r350
11+# Version = r364
1212 # Created = 2014-04-17 23:51:27 +0800
13-# Updated = 2019-09-11 20:47 +0800
13+# Updated = 2020-12-14 02:04 +0800
1414 # Encoding = ANSI
1515
1616 .SUFFIXES:
@@ -67,18 +67,16 @@
6767
6868 RESOURCES := $(BUILDDIR)/../../$(PROJNAME)/$(CONF)/resources.ap_
6969
70-# options for code generation
71-CFLAGS := $(INCLUDE) $(C_CXXFLAGS) $(CFLAGS_COMMON)
72-CXXFLAGS := $(INCLUDE) $(C_CXXFLAGS) $(CXXFLAGS_COMMON) \
73- -fno-threadsafe-statics -fuse-cxa-atexit -Wctor-dtor-privacy \
74- -Wnon-virtual-dtor -Wsign-promo
75-# -Wnoexcept -Wnon-virtual-dtor -Wold-style-cast -Wsign-promo
70+CFLAGS := $(CFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS) $(C_CXXFLAGS_COMMON) \
71+ $(CFLAGS_WARNING)
72+CXXFLAGS := $(CXXFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS) $(C_CXXFLAGS_COMMON) \
73+ $(CXXFLAGS_WARNING) $(CXXFLAGS_IMPL_COMMON) -fuse-cxa-atexit
74+# -Wnoexcept -Wold-style-cast
7675
7776 LDFLAGS := $(LDFLAGS_OPT_DBG) $(ARCH) -Wl,--gc-sections \
7877 -Wl,--no-undefined
7978
80-# any extra libraries we wish to link with the project
81-LIBS :=-llog -landroid -lEGL -lGLESv1_CM
79+LIBS := -llog -landroid -lEGL -lGLESv1_CM
8280 LIBCRYSTAX_STATIC ?=
8381 #LIBCRYSTAX_STATIC ?= -u __crystax_on_load -u __crystax_on_unload \
8482 -Wl,-z,muldefs -Wl,--eh-frame-hdr -L$(BUILDDIR) -lstdc++ \
@@ -91,8 +89,6 @@
9189 YBASE_A := $(BUILDDIR)/../../YBase/$(RELEASE)/libYBase.a
9290 YFRAMEWORK_A := $(BUILDDIR)/../../YFramework/$(RELEASE)/libYFramework.a
9391
94-# list of directories containing libraries, this must be the top level
95-# containing include and lib
9692 LIBDIRS :=
9793
9894 ifneq ($(RELEASE),$(notdir $(CURDIR)))
@@ -106,15 +102,14 @@
106102 CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
107103 SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
108104
109-# use CXX for linking C++ projects, CC for standard C
110105 ifeq ($(strip $(CPPFILES)),)
111106 export LD := $(CC)
112107 else
113108 export LD := $(CXX)
114109 endif
115110
116-export OFILES := $(addsuffix .o,$(MAPFILES)) $(addsuffix .o,$(BINFILES)) \
117- $(addsuffix .o,$(CPPFILES)) $(addsuffix .o,$(CFILES)) $(addsuffix .o,$(SFILES))
111+export OFILES := $(addsuffix .o,$(BINFILES)) $(addsuffix .o,$(CPPFILES)) \
112+ $(addsuffix .o,$(CFILES)) $(addsuffix .o,$(SFILES))
118113 export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
119114 $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
120115 -I$(CURDIR)/$(CONF)
@@ -142,7 +137,6 @@
142137
143138 rebuild: all
144139
145-# main targets
146140 all: $(CONF) $(OUTPUT_FINAL)
147141
148142 else
diff -r 2843c4a3d41f -r a285f6f132e8 YSTest/DS_ARM7/Makefile
--- a/YSTest/DS_ARM7/Makefile Sun Dec 13 03:55:38 2020 +0800
+++ b/YSTest/DS_ARM7/Makefile Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 #
2-# (C) 2009-2014, 2016, 2018 FrankHB.
2+# (C) 2009-2014, 2016, 2018, 2020 FrankHB.
33 #
44 # This file is part of the YSLib project, and may only be used,
55 # modified, and distributed under the terms of the YSLib project
@@ -8,9 +8,9 @@
88 # understand and accept it fully.
99 #
1010 # DS Makefile for YShell Test -> ARM7
11-# Version = r1390
11+# Version = r1477
1212 # Created = 2009-12-18 12:27:40 +0800
13-# Updated = 2018-05-22 15:57 +0800
13+# Updated = 2020-12-14 02:38 +0800
1414 # Encoding = ANSI
1515
1616
@@ -21,10 +21,6 @@
2121 SHBuild_ToolDir := $(dir $(lastword $(MAKEFILE_LIST)))/../../Tools/Scripts
2222 include $(SHBuild_ToolDir)/Toolchain.DS.mk
2323
24-# NOTE: Option '-Wno-redundant-decls' is workaround for libnds.
25-CFLAGS_COMMON := $(CFLAGS_COMMON) -Wno-redundant-decls
26-CXXFLAGS_COMMON := $(CXXFLAGS_COMMON) -Wno-redundant-decls
27-
2824 # PROJNAME is the name of the project
2925 # CONF is the configuration name
3026 # RELEASE is the directory name for object files and intermediate files will be placed
@@ -35,7 +31,6 @@
3531 # SOURCES is a list of directories containing source code
3632 # INCLUDES is a list of directories containing extra header files
3733 # DATA is a list of directories containing binary files embedded using bin2o
38-# GRAPHICS is a list of directories containing image files to be converted with grit
3934
4035 export PROJNAME ?= YSTest_ARM7
4136 export CONF ?= release
@@ -47,25 +42,21 @@
4742 export SOURCES := source data
4843 export INCLUDES := include data
4944 export DATA := data
50-#export GRAPHICS := gfx
51-#export MUSIC := music
5245
53-# options for code generation
5446 ARCH := $(ARCH_ARM7)
5547 ARCH_AS := $(ARCH_AS_ARM7)
5648 ASFLAGS := $(ASFLAGS_ARM7)
57-CFLAGS := $(INCLUDE) $(C_CXXFLAGS_ARM7) $(CFLAGS_COMMON)
58-CXXFLAGS := $(INCLUDE) $(C_CXXFLAGS_ARM7) $(CXXFLAGS_COMMON) \
59- -fno-threadsafe-statics -fuse-cxa-atexit \
60- -Wctor-dtor-privacy -Wnoexcept -Wnon-virtual-dtor -Wold-style-cast \
61- -Wsign-promo
49+# NOTE: Option '-Wno-redundant-decls' is the workaround for libnds.
50+CFLAGS := $(CFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS_ARM7) $(C_CXXFLAGS_COMMON) \
51+ $(CFLAGS_WARNING) -Wno-redundant-decls
52+CXXFLAGS := $(CXXFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS_ARM7) $(C_CXXFLAGS_COMMON) \
53+ $(CXXFLAGS_WARNING) $(CXXFLAGS_IMPL_COMMON) -fno-threadsafe-statics \
54+ -fuse-cxa-atexit -Wno-redundant-decls -Wnoexcept -Wold-style-cast
55+
6256 LDFLAGS := $(LDFLAGS_OPT_DBG) -specs=ds_arm7.specs $(ARCH) -Wl,--gc-sections
6357
64-# any extra libraries we wish to link with the project
6558 LIBS := -lnds7 # -ldswifi7 -lmm7
6659
67-# List of directories containing libraries, this must be the top level
68-# containing include and lib.
6960 LIBDIRS := $(LIBNDS)
7061
7162 ifneq ($(CONF),$(notdir $(CURDIR)))
@@ -98,27 +89,14 @@
9889 endif
9990 endif
10091
101-PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png)))
102-PALFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pal)))
103-RAWFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.raw)))
104-MAPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.map)))
105-JPEGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.jpg)))
106-MODFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.mod)))
107-GIFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.gif)))
108-BMPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.bmp)))
109-MP3FILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.mp3)))
110-
111-#----
112-# use CXX for linking C++ projects, CC for standard C
113-#----
11492 ifeq ($(strip $(CPPFILES)),)
11593 export LD := $(CC)
11694 else
11795 export LD := $(CXX)
11896 endif
11997
120-export OFILES := $(MAPFILES:.map=.o) $(RAWFILES:.raw=.o) $(PALFILES:.pal=.o) $(BINFILES:.bin=.o) $(PNGFILES:.png=.o) $(PCXFILES:.pcx=.o) $(JPEGFILES:.jpg=.o) $(MODFILES:.mod=.o) $(GIFFILES:.gif=.o) $(BMPFILES:.bmp=.o) $(MP3FILES:.mp3=.o) \
121- $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
98+export OFILES := $(BINFILES:.bin=.o) $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \
99+ $(SFILES:.s=.o)
122100
123101 export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
124102 $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
@@ -145,28 +123,14 @@
145123
146124 all: $(CONF) $(OUTPUT)
147125
148-#----
149126 else
150127
151128 DEPENDS := $(OFILES:.o=.d)
152129
153-#----
154-# main targets
155-#----
156-
157130 $(ARM7ELF) : $(OFILES)
158131 @echo Linking $(notdir $@) ...
159132 $(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@
160133 @echo Built $(notdir $@) .
161-# IMPORTANT: the order of files is significant.
162-
163-#----
164-# you need a rule like this for each extension you use as binary data
165-#----
166-
167-#----
168-# Compile Targets for C/C++
169-#----
170134
171135 %.o : %.cpp
172136 @echo $(notdir $<)
@@ -183,8 +147,6 @@
183147 @$(CC) -MM $(CFLAGS) -o $*.d $<
184148 @$(CC) $(ASFLAGS) -c $< -o$@
185149
186-
187-# bin2o macro like that from libnds, slightly changed for the PALib naming conventions of resources which doesn't append the file extension to the resource name
188150 define bin2o
189151 cp $(<) $(notdir $(*))
190152 bin2s $(notdir $(*)) | $(AS) $(ARCH_AS) -o $(@)
@@ -194,66 +156,11 @@
194156 echo "extern const u32" $(*)_size";" >> $(*).h
195157 endef
196158
197-%.o : %.mp3
198- @echo $(notdir $<)
199- @$(bin2o)
200-
201-%.o : %.pcx
202- @echo $(notdir $<)
203- @$(bin2o)
204-
205-%.o : %.bin
206- @echo $(notdir $<)
207- @$(bin2o)
208-
209-%.o : %.png
210- @echo $(notdir $<)
211- @$(bin2o)
212-
213-%.o : %.raw
214- @echo $(notdir $<)
215- @$(bin2o)
216-
217-%.o : %.pal
218- @echo $(notdir $<)
219- @$(bin2o)
220-
221-%.o : %.map
159+%.o : %.bin
222160 @echo $(notdir $<)
223161 @$(bin2o)
224162
225-%.o : %.mdl
226- @echo $(notdir $<)
227- @$(bin2o)
228-
229-%.o : %.jpg
230- @echo $(notdir $<)
231- @$(bin2o)
232-
233-%.o : %.mod
234- @echo $(notdir $<)
235- @$(bin2o)
236-
237-%.o : %.gif
238- @echo $(notdir $<)
239- @$(bin2o)
240-
241-%.o : %.bmp
242- @echo $(notdir $<)
243- @$(bin2o)
244-
245-#----
246-# This rule creates assembly source files using grit
247-# grit takes an image file and a .grit describing how the file is to be processed
248-# add additional rules like this for each image extension
249-# you use in the graphics folders
250-#----
251-%.s %.h : %.png %.grit
252- grit $< -fts -o$*
253-
254163 -include $(DEPSDIR)/*.d
255164
256-#----
257165 endif
258-#----
259166
diff -r 2843c4a3d41f -r a285f6f132e8 YSTest/DS_ARM9/Makefile
--- a/YSTest/DS_ARM9/Makefile Sun Dec 13 03:55:38 2020 +0800
+++ b/YSTest/DS_ARM9/Makefile Thu Dec 24 12:58:49 2020 +0800
@@ -8,9 +8,9 @@
88 # understand and accept it fully.
99 #
1010 # DS Makefile for YShell Test -> ARM9
11-# Version = r1407
11+# Version = r1533
1212 # Created = 2009-12-18 12:27:40 +0800
13-# Updated = 2020-10-10 18:42 +0800
13+# Updated = 2020-12-14 02:42 +0800
1414 # Encoding = ANSI
1515
1616
@@ -21,10 +21,6 @@
2121 SHBuild_ToolDir := $(dir $(lastword $(MAKEFILE_LIST)))/../../Tools/Scripts
2222 include $(SHBuild_ToolDir)/Toolchain.DS.mk
2323
24-# NOTE: Workaround for libnds.
25-CFLAGS_COMMON := $(CFLAGS_COMMON) -Wno-redundant-decls
26-CXXFLAGS_COMMON := $(CXXFLAGS_COMMON) -Wno-redundant-decls
27-
2824 # PROJNAME is the name of the project
2925 # CONF is the configuration name
3026 # RELEASE is the directory name for object files and intermediate files will be placed
@@ -35,7 +31,6 @@
3531 # SOURCES is a list of directories containing source code
3632 # INCLUDES is a list of directories containing extra header files
3733 # DATA is a list of directories containing binary files embedded using bin2o
38-# GRAPHICS is a list of directories containing image files to be converted with grit
3934
4035 export PROJNAME ?= YSTest_ARM9
4136 export CONF ?= release
@@ -56,11 +51,15 @@
5651 ARCH := $(ARCH_ARM9)
5752 ARCH_AS := $(ARCH_AS_ARM9)
5853 ASFLAGS := $(ASFLAGS_ARM9)
59-CFLAGS := $(INCLUDE) $(C_CXXFLAGS_ARM9) $(CFLAGS_COMMON)
60-CXXFLAGS := $(INCLUDE) $(C_CXXFLAGS_ARM9) $(CXXFLAGS_COMMON) \
61- -fno-threadsafe-statics -fuse-cxa-atexit \
62- -Wnon-virtual-dtor -Wsign-promo
63-# -Wnoexcept -Wold-style-cast -Wsign-promo
54+# NOTE: Options '-Wno-redundant-decls' and '-Wno-ignored-qualifiers' are the
55+# workaround for libnds.
56+CFLAGS := $(CFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS_ARM9) $(C_CXXFLAGS_COMMON) \
57+ $(CFLAGS_WARNING) -Wno-redundant-decls -Wno-ignored-qualifiers
58+CXXFLAGS := $(CXXFLAGS_STD) $(INCLUDE) $(C_CXXFLAGS_ARM9) $(C_CXXFLAGS_COMMON) \
59+ $(CXXFLAGS_WARNING) $(CXXFLAGS_IMPL_COMMON) -fno-threadsafe-statics \
60+ -fuse-cxa-atexit -Wno-redundant-decls -Wno-ignored-qualifiers
61+# -Wnoexcept -Wold-style-cast
62+
6463 LDFLAGS := $(LDFLAGS_OPT_DBG) -specs=ds_arm9.specs $(ARCH) -Wl,--gc-sections
6564
6665 #CFLAGS := -g -Wformat=2 -Winline -Wall \
@@ -72,10 +71,10 @@
7271 #CXXFLAGS := $(CFLAGS) -fno-threadsafe-statics -fuse-cxa-atexit -std=gnu++0x
7372 # -Weffc++ -Wold-style-cast -Woverloaded-virtual -pedantic
7473 # -Wextra -Winit-self -Wmissing-include-dirs -Wsign-promo
74+
7575 #LDFLAGS= -specs=ds_arm9.specs -g $(ARCH) -L$(PAPATH)/lib \
7676 # -Wl,-Map,$(notdir $*.map)
7777
78-# any extra libraries we wish to link with the project
7978 LIBS := -lnds9
8079
8180 # User defined libraries.
@@ -85,8 +84,6 @@
8584 YBASE_A := $(BUILDDIR)/../../YBase/$(RELEASE)/libYBase.a
8685 YFRAMEWORK_A := $(BUILDDIR)/../../YFramework/$(RELEASE)/libYFramework.a
8786
88-# List of directories containing libraries, this must be the top level
89-# containing include and lib.
9087 LIBDIRS := $(LIBNDS)
9188
9289 ifneq ($(CONF),$(notdir $(CURDIR)))
@@ -101,48 +98,16 @@
10198 CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
10299 CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
103100 SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
104-PCXFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcx)))
105101 BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
106102
107-ifeq ($(strip $(AUDIOFILES)),)
108- ifeq ($(strip $(ARM7_SELECTED)), ARM7_MAXMOD_DSWIFI)
109- TEXT_TO_SAY_2 := No MaxMod-compatible files were found in the audio folder.
110- TEXT_TO_SAY_3 := If you are loading the soundbank from FAT or EFS, ignore this message.
111- TEXT_TO_SAY_4 := " "
112- endif
113- DONT_BUILD_MAXMOD_SOUNDBANK = YES
114-endif
115-
116-ifneq ($(strip $(DONT_BUILD_MAXMOD_SOUNDBANK)), YES)
117- ifeq ($(strip $(ARM7_SELECTED)), ARM7_MAXMOD_DSWIFI)
118- BINFILES += soundbank_bin.bin
119- endif
120-endif
121-
122-PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png)))
123-PALFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pal)))
124-RAWFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.raw)))
125-MAPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.map)))
126-JPEGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.jpg)))
127-MODFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.mod)))
128-GIFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.gif)))
129-BMPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.bmp)))
130-MP3FILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.mp3)))
131-
132-#----
133-# use CXX for linking C++ projects, CC for standard C
134-#----
135103 ifeq ($(strip $(CPPFILES)),)
136104 export LD := $(CC)
137105 else
138106 export LD := $(CXX)
139107 endif
140108
141-#export OFILES := $(addsuffix .o,$(BINFILES)) \
142-# $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
143-
144-export OFILES := $(MAPFILES:.map=.o) $(RAWFILES:.raw=.o) $(PALFILES:.pal=.o) $(BINFILES:.bin=.o) $(PNGFILES:.png=.o) $(PCXFILES:.pcx=.o) $(JPEGFILES:.jpg=.o) $(MODFILES:.mod=.o) $(GIFFILES:.gif=.o) $(BMPFILES:.bmp=.o) $(MP3FILES:.mp3=.o) \
145- $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
109+export OFILES := $(BINFILES:.bin=.o) $(CPPFILES:.cpp=.o) \
110+ $(CFILES:.c=.o) $(SFILES:.s=.o)
146111
147112 #export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
148113 # $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
@@ -156,7 +121,6 @@
156121
157122 .PHONY: $(CONF) rebuild clean
158123
159-#----
160124 $(CONF):
161125 @echo Building configuration: $(notdir $@) ...
162126 @[ -d $(BUILDDIR) ] || mkdir -p $(BUILDDIR)
@@ -164,7 +128,6 @@
164128 @$(MAKE) --no-print-directory -C $(BUILDDIR) -f $(CURDIR)/Makefile
165129 @echo Built configuration: $(notdir $@) .
166130
167-#----
168131 clean:
169132 @echo Cleaning $(TARGET) ...
170133 @rm -f $(BUILDDIR)/*.d
@@ -175,49 +138,30 @@
175138
176139 all: $(CONF) $(OUTPUT)
177140
178-#----
179141 else
180142
181143 DEPENDS := $(OFILES:.o=.d)
182144
183-#----
184-# main targets
185-#----
186-
187145 $(ARM9ELF) : $(OFILES) $(YFRAMEWORK_A) $(YBASE_A)
188146 @echo Linking $(notdir $@) ...
189147 $(LD) $(LDFLAGS) $(OFILES) $(YFRAMEWORK_A) $(YBASE_A) $(LIBPATHS) $(LIBS) $(LIBPATHEX) $(LIBEX) -o $@
190148 @echo Built $(notdir $@) .
191-# IMPORTANT: the order of files is significant.
192149
193-#----
194-# you need a rule like this for each extension you use as binary data
195-#----
196-
197-#----
198-# Compile Targets for C/C++
199-#----
200-
201-#----
202150 %.o : %.cpp
203151 @echo $(notdir $<)
204152 @$(CXX) -MM $(CXXFLAGS) -o $*.d $<
205153 @$(CXX) $(CXXFLAGS) -c $< -o$@
206154
207-#----
208155 %.o : %.c
209156 @echo $(notdir $<)
210157 @$(CC) -MM $(CFLAGS) -o $*.d $<
211158 @$(CC) $(CFLAGS) -c $< -o$@
212159
213-#----
214160 %.o : %.s
215161 @echo $(notdir $<)
216162 @$(CC) -MM $(CFLAGS) -o $*.d $<
217163 @$(CC) $(ASFLAGS) -c $< -o$@
218164
219-
220-# bin2o macro like that from libnds, slightly changed for the PALib naming conventions of resources which doesn't append the file extension to the resource name
221165 define bin2o
222166 cp $(<) $(notdir $(*))
223167 bin2s $(notdir $(*)) | $(AS) $(ARCH_AS) -o $(DEPSDIR)/$(@)
@@ -227,91 +171,11 @@
227171 echo "extern const unsigned" $(*)_size";" >> $(*).h
228172 endef
229173
230-#----
231-%.o : %.mp3
232-#----
233- @echo $(notdir $<)
234- @$(bin2o)
235-
236-#----
237-%.o : %.pcx
238-#----
239- @echo $(notdir $<)
240- @$(bin2o)
241-
242-#----
243-%.o : %.bin
244-#----
245- @echo $(notdir $<)
246- @$(bin2o)
247-
248-#----
249-%.o : %.png
250-#----
251- @echo $(notdir $<)
252- @$(bin2o)
253-
254-#----
255-%.o : %.raw
256-#----
257- @echo $(notdir $<)
258- @$(bin2o)
259-
260-#----
261-%.o : %.pal
262-#----
263- @echo $(notdir $<)
264- @$(bin2o)
265-
266-#----
267-%.o : %.map
268-#----
174+%.o : %.bin
269175 @echo $(notdir $<)
270176 @$(bin2o)
271177
272-#----
273-%.o : %.mdl
274-#----
275- @echo $(notdir $<)
276- @$(bin2o)
277-
278-#----
279-%.o : %.jpg
280-#----
281- @echo $(notdir $<)
282- @$(bin2o)
283-
284-#----
285-%.o : %.mod
286-#----
287- @echo $(notdir $<)
288- @$(bin2o)
289-
290-#----
291-%.o : %.gif
292-#----
293- @echo $(notdir $<)
294- @$(bin2o)
295-
296-#----
297-%.o : %.bmp
298-#----
299- @echo $(notdir $<)
300- @$(bin2o)
301-
302-#----
303-# This rule creates assembly source files using grit
304-# grit takes an image file and a .grit describing how the file is to be processed
305-# add additional rules like this for each image extension
306-# you use in the graphics folders
307-#----
308-%.s %.h : %.png %.grit
309-#----
310- grit $< -fts -o$*
311-
312178 -include $(DEPSDIR)/*.d
313179
314-#----
315180 endif
316-#----
317181
diff -r 2843c4a3d41f -r a285f6f132e8 YSTest/include/About.h
--- a/YSTest/include/About.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YSTest/include/About.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2012-2013, 2015-2016 FrankHB.
2+ © 2012-2013, 2015-2016, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file About.h
1212 \ingroup YReader
1313 \brief 关于界面。
14-\version r92
14+\version r95
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 390
1717 \par 创建时间:
1818 2013-03-20 21:07:32 +0800
1919 \par 修改时间:
20- 2016-06-05 20:07 +0800
20+ 2020-12-24 12:06 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -34,8 +34,8 @@
3434 {
3535
3636 /*!
37-\brief 关于窗体。
38-\since build 363
37+\brief 关于面板。
38+\since build 695
3939 */
4040 class AboutPanel : public DialogPanel
4141 {
diff -r 2843c4a3d41f -r a285f6f132e8 YSTest/include/DSReader.h
--- a/YSTest/include/DSReader.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YSTest/include/DSReader.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2010-2016, 2019 FrankHB.
2+ © 2010-2016, 2019-2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file DSReader.h
1212 \ingroup YReader
1313 \brief 适用于 DS 的双屏阅读器。
14-\version r1892
14+\version r1899
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since 早于 build 132
1717 \par 创建时间:
1818 2010-01-05 14:03:47 +0800
1919 \par 修改时间:
20- 2019-09-05 22:50 +0800
20+ 2020-12-24 12:06 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -29,10 +29,12 @@
2929 #define INC_YReader_DSReader_h_ 1
3030
3131 #include <Helper/YModules.h>
32-#include YFM_YSLib_UI_TextArea
32+#include YFM_YSLib_UI_TextArea // for std::uint16_t, unique_ptr,
33+// YSLib::UI::BufferedTextArea;
34+#include YFM_YSLib_Core_YFunc // for YSLib::function;
3335 #include YFM_YSLib_UI_YWindow
3436 #include YFM_YSLib_Service_TextFile
35-#include YFM_YSLib_Service_TextManager
37+#include YFM_YSLib_Service_TextManager // for Text::TextFileBuffer;
3638 #include YFM_DS_Helper_DSMain
3739 #include YFM_Helper_Initialization
3840
@@ -131,9 +133,9 @@
131133 public:
132134 /*!
133135 \brief 视图变更回调函数。
134- \since build 271
136+ \since build 899
135137 */
136- std::function<void()> ViewChanged;
138+ YSLib::function<void()> ViewChanged;
137139
138140 /*!
139141 \brief 构造。
diff -r 2843c4a3d41f -r a285f6f132e8 YSTest/include/HexBrowser.h
--- a/YSTest/include/HexBrowser.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YSTest/include/HexBrowser.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2011-2015 FrankHB.
2+ © 2011-2015, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file HexBrowser.h
1212 \ingroup YReader
1313 \brief 十六进制浏览器。
14-\version r550
14+\version r556
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 253
1717 \par 创建时间:
1818 2011-10-14 18:13:04 +0800
1919 \par 修改时间:
20- 2015-11-26 14:45 +0800
20+ 2020-12-24 12:06 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -72,7 +72,11 @@
7272 DefPred(const ynothrow, Valid, source.is_open())
7373
7474 public:
75- //! \since build 587
75+ /*!
76+ \brief 取当前读取位置。
77+ \return 若成功为当前缓冲区读取位置相对于开始的字节数,否则为 size_t(-1) 。
78+ \since build 587
79+ */
7680 DefGetter(const, size_t, Position,
7781 size_t(source.pubseekoff(0, std::ios_base::cur, std::ios_base::in)))
7882 DefGetter(const ynothrow, size_t, Size, size)
diff -r 2843c4a3d41f -r a285f6f132e8 YSTest/include/ReadingList.h
--- a/YSTest/include/ReadingList.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YSTest/include/ReadingList.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2012-2015 FrankHB.
2+ © 2012-2015, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file ReadingList.h
1212 \ingroup YReader
1313 \brief 阅读列表。
14-\version r245
14+\version r247
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 328
1717 \par 创建时间:
1818 2012-07-24 22:13:46 +0800
1919 \par 修改时间:
20- 2015-12-27 22:32 +0800
20+ 2020-12-24 12:06 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -96,7 +96,7 @@
9696
9797 public:
9898 /*!
99- \brief 默认构造:阅读迭代器指向阅读记录末尾。
99+ \brief 无参数构造:阅读迭代器指向阅读记录末尾。
100100 \since build 404
101101 */
102102 DefDeCtor(ReadingList)
diff -r 2843c4a3d41f -r a285f6f132e8 YSTest/include/ShlReader.h
--- a/YSTest/include/ShlReader.h Sun Dec 13 03:55:38 2020 +0800
+++ b/YSTest/include/ShlReader.h Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2011-2015, 2018-2019 FrankHB.
2+ © 2011-2015, 2018-2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file ShlReader.h
1212 \ingroup YReader
1313 \brief Shell 阅读器框架。
14-\version r1838
14+\version r1842
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 263
1717 \par 创建时间:
1818 2011-11-24 17:08:33 +0800
1919 \par 修改时间:
20- 2018-11-04 17:05 +0800
20+ 2020-12-24 12:06 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -29,7 +29,7 @@
2929 #define INC_YReader_ShlReader_h_ 1
3030
3131 #include "Shells.h"
32-#include "DSReader.h"
32+#include "DSReader.h" // for YSLib::function;
3333 #include "HexBrowser.h"
3434 #include "ReaderSettingUI.h"
3535 #include "BookmarkUI.h"
@@ -160,9 +160,9 @@
160160 IO::Path CurrentPath;
161161 /*!
162162 \brief 背景任务:用于滚屏。
163- \since build 297
163+ \since build 899
164164 */
165- std::function<void()> fBackgroundTask;
165+ YSLib::function<void()> fBackgroundTask;
166166 /*!
167167 \brief 退出标识。
168168 \since build 302
diff -r 2843c4a3d41f -r a285f6f132e8 YSTest/source/Main.cpp
--- a/YSTest/source/Main.cpp Sun Dec 13 03:55:38 2020 +0800
+++ b/YSTest/source/Main.cpp Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2009-2016, 2018 FrankHB.
2+ © 2009-2016, 2018, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file Main.cpp
1212 \ingroup DS
1313 \brief 主源文件。
14-\version r1976
14+\version r1980
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 1
1717 \par 创建时间:
1818 2009-11-12 21:26:30 +0800
1919 \par 修改时间:
20- 2018-08-19 13:41 +0800
20+ 2020-12-24 12:06 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -62,6 +62,7 @@
6262 YTraceDe(Warning, "%zu %s(s) detected:\n", con.size(), item_name);
6363 #else
6464 // XXX: Size of %std::size is expected.
65+ // XXX: Error from 'std::fprintf' is ignored.
6566 std::fprintf(stderr, "%zu %s(s) detected:\n", con.size(), item_name);
6667 #endif
6768
@@ -99,7 +100,7 @@
99100 OnExit_DebugMemory_print<4>(GetDebugMemoryList().Blocks, "memory leak");
100101 OnExit_DebugMemory_print<4>(GetDebugMemoryList().DuplicateDeletedBlocks,
101102 "duplicate memory deleting");
102-#if 0
103+#if false
103104 DebugMemory.PrintAll(stderr);
104105 DebugMemory.PrintAll(fp);
105106 DebugMemory.PrintAllDuplicate(stderr);
@@ -183,7 +184,7 @@
183184 dsk_m.Background
184185 = SolidBrush(Color(255 - i * 255 / Image_N, 216, 192));
185186 Repaint(dsk_m);
186- YReader::FetchImage(i);
187+ yunused(YReader::FetchImage(i));
187188 }
188189 pb.SetValue(Image_N);
189190 Repaint(dsk_m);
diff -r 2843c4a3d41f -r a285f6f132e8 doc/ChangeLog.PreAlpha1.txt
--- a/doc/ChangeLog.PreAlpha1.txt Sun Dec 13 03:55:38 2020 +0800
+++ b/doc/ChangeLog.PreAlpha1.txt Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2013-2016, 2019 FrankHB.
2+ © 2013-2016, 2019-2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file ChangeLog.PreAlpha1.txt
1212 \ingroup Documentation
1313 \brief 版本更新历史记录 - PreAlpha1 。
14-\version r334
14+\version r350
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 393
1717 \par 创建时间:
1818 2013-03-25 00:01:48 +0800
1919 \par 修改时间:
20- 2019-10-03 20:55 +0800
20+ 2020-12-24 12:01 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -207,14 +207,21 @@
207207
208208 b170_b183
209209 (
210- / "GUI" $=
210+ / %YSLib $=
211211 (
212- + "controls: tracks",
213- + "controls: scroll bars";
214- + "controls: scrollable container",
215- + "controls: listbox"
212+ + "class template %ExpandMemberFirstBinder" @ %Core.YFunc
213+ + %Adaptor.(YNew, YReference),
214+ / %YShellInitialization @ %Service >> %Adaptor,
215+ + "GUI controls" @ %Shell $=
216+ (
217+ + "controls: tracks",
218+ + "controls: scroll bars";
219+ + "controls: scrollable container",
220+ + "controls: listbox"
221+ )
216222 ),
217- + "class template %ExpandMemberFirstBinder"
223+ / $doc ^ "Doxygen",
224+ + %YCLib.(YStandardExtend, YCast),
218225 ),
219226
220227 b159_b169
@@ -228,6 +235,8 @@
228235
229236 b134_b158
230237 (
238+ / "classes %(YFont, YFontFamily, YTypeface, YFontFile)"
239+ @ %YSLib.Adaptor.YFontCache => "%Font, FontFamily, FontFile",
231240 + DLD "core utility templates",
232241 / "smart pointers",
233242 + "GUI focus",
diff -r 2843c4a3d41f -r a285f6f132e8 doc/ChangeLog.PreAlpha2.txt
--- a/doc/ChangeLog.PreAlpha2.txt Sun Dec 13 03:55:38 2020 +0800
+++ b/doc/ChangeLog.PreAlpha2.txt Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2013-2018 FrankHB.
2+ © 2013-2018, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file ChangeLog.PreAlpha2.txt
1212 \ingroup Documentation
1313 \brief 版本更新历史记录 - PreAlpha2 。
14-\version r3805
14+\version r3817
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 393
1717 \par 创建时间:
1818 2013-03-25 00:11:18 +0800
1919 \par 修改时间:
20- 2018-12-30 15:00 +0800
20+ 2020-12-24 12:01 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -1034,8 +1034,8 @@
10341034 ),
10351035 / UI.GUI $=
10361036 (
1037- * "missing painting of background for parent of buffered widgets"
1038- $since b225,
1037+ * "missing painting of background for parent of buffered \
1038+ widgets" $since b225,
10391039 + "forced background painting ignorance state"
10401040 @ "class %BufferedRenderer"
10411041 ),
@@ -1820,8 +1820,11 @@
18201820
18211821 b246
18221822 (
1823+ (
18231824 + "pseudo keyword %(yconstexpr, yconstexprf) to support C++11 generalized \
1824- constant expressions features on conditions",
1825+ constant expressions features on conditions";
1826+ / "applied %yconstexprf" @ %(YCLib, YSLib)
1827+ ),
18251828 / "file classes" $=
18261829 (
18271830 + "mode selecting at opening files",
@@ -2295,8 +2298,12 @@
22952298 - "unnecessary drawing of overlaid windows" @ "windows refreshing",
22962299 + "partial refreshing optimization" @ "class %Widget"
22972300 ),
2301+ (
22982302 * "wrong result when height of arguments are equal"
2299- @ "intersection calculation for class %Rect" $since b225,
2303+ @ "intersection calculation for class %Rect" $since b225;
2304+ / $repo "tagged engineering fault by hg tags ('engineering-defect-b225', \
2305+ 'engineering-fault-b225')"
2306+ ),
23002307 + "child widget intersection confirming"
23012308 ),
23022309
diff -r 2843c4a3d41f -r a285f6f132e8 doc/ChangeLog.PreAlpha3.txt
--- a/doc/ChangeLog.PreAlpha3.txt Sun Dec 13 03:55:38 2020 +0800
+++ b/doc/ChangeLog.PreAlpha3.txt Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2013-2019 FrankHB.
2+ © 2013-2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file ChangeLog.PreAlpha3.txt
1212 \ingroup Documentation
1313 \brief 版本更新历史记录 - PreAlpha3 。
14-\version r5661
14+\version r5675
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 393
1717 \par 创建时间:
1818 2013-03-25 00:14:22 +0800
1919 \par 修改时间:
20- 2019-02-22 14:27 +0800
20+ 2020-12-24 12:01 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -71,7 +71,7 @@
7171 )
7272 )
7373 ),
74- / $dev "updated .vcxproj for VS2012",
74+ / $dev "updated .vcxproj files for VS2012",
7575 / $build "updated to Microsoft VC++ 2012" ~ "Microsoft VC++ 2010"
7676 @ "Microsoft VC++ projects" $effective @ %('YBase*', 'YFramework*',
7777 'YSTest*')
@@ -332,8 +332,8 @@
332332 ),
333333 / $dev $build @ "platform %MinGW32" $=
334334 (
335- ^ DLP $re_ex(b346) $resolve(#8) "MinGW[gcc version 4.8.0 (Built by \
336- MinGW-builds project)] x32-4.8.0-release-posix-sjlj-rev0"
335+ ^ DLP $re_ex(b346) $resolve(#8, #15) "MinGW[gcc version 4.8.0 (Built \
336+ by MinGW-builds project)] x32-4.8.0-release-posix-sjlj-rev0"
337337 ~ "MinGW[gcc version 4.7.2 (Built by MinGW-builds project)] \
338338 x32-4.7.2-release-posix-sjlj-rev0 [release-sjlj]"
339339 @ "platform %MinGW32",
@@ -1882,7 +1882,7 @@
18821882 / %YFramework.YSLib.UI $=
18831883 (
18841884 / $dev "pointer members" @ "class %Widget" @ %YWidget,
1885- + $dev $design "keyword %override for several overriders",
1885+ + DLD "keyword %override for several overriders",
18861886 / $dev "simplified text state member access" @ "class %MTextList"
18871887 @ %Label,
18881888 / @ "class %TextList" @ %TextList $=
@@ -2289,7 +2289,7 @@
22892289 )
22902290 + "header %functional.hpp as %Function" $=
22912291 (
2292- + $lib "including header (<tuple>, <functional>, <string>)";
2292+ + $lib "inclusion (<tuple>, <functional>, <string>)";
22932293 + "function templates %(make_parameter_tuple, return_of, \
22942294 parameter_of, paramlist_size)"
22952295 )
@@ -2313,7 +2313,7 @@
23132313 (
23142314 - "header %TypeOperation",
23152315 * $build "strict ISO C++11 code conformance" $since b331
2316- $= (* "missing including <typeinfo>")
2316+ $= (* "missing inclusion <typeinfo>")
23172317 // The program temporarily is not ill-formed for libstdc++'s \
23182318 <memory> including <typeinfo> under C++11 mode.
23192319 )
@@ -2721,7 +2721,7 @@
27212721 / $impl ("message loop", $design "input dispatching") @ %Helper.DSMain
27222722 // Significantly performance improved.
27232723 ),
2724- * DLB "missing including path Code::Blocks project \
2724+ * DLB "missing inclusion paths" @ "Code::Blocks projects \
27252725 %(YBase_MinGW32, YFramework_MinGW32)" $since b299
27262726 ),
27272727
@@ -2797,10 +2797,10 @@
27972797 - DLB "-Wnoexcept" @ "macro %CXXFLAGS" @ "makefile"
27982798 @ "project %(YFramework_DS, YSTest_ARM9)",
27992799 // ISO C++11 5.1.2/6 doesn't specify conversion function for a closure \
2800- object to a function pointer shall have exception-specification. \
2801- Thus G++ may complain when evaluating %noexcept expression. \
2802- It seems a defect in the standard, but here just turn the warning \
2803- off for convenience.
2800+ object to a function pointer shall have the \
2801+ exception-specification. Thus, G++ may complain when evaluating \
2802+ %noexcept expression. It seems a defect in the standard, but here \
2803+ just turn the warning off for convenience.
28042804 + "total time measuring for images loading" @ %YReader.'shell test example'
28052805 $dep_from "test timing"
28062806 ),
@@ -3021,8 +3021,7 @@
30213021 + "class %CheckButton" @ %YFramework.YSLib.UI.GUI;
30223022 ^ "%CheckButton" ~ "%CheckBox" @ 'shells test example'
30233023 ),
3024- ^ $dev $design "contextual keyword %override"
3025- ~ "keyword %virtual for overriders"
3024+ / DLD "overriders" ^ 'override' ~ 'virtual'
30263025 ),
30273026
30283027 b310
diff -r 2843c4a3d41f -r a285f6f132e8 doc/ChangeLog.V0.9.txt
--- a/doc/ChangeLog.V0.9.txt Sun Dec 13 03:55:38 2020 +0800
+++ b/doc/ChangeLog.V0.9.txt Thu Dec 24 12:58:49 2020 +0800
@@ -11,13 +11,13 @@
1111 /*! \file ChangeLog.V0.9.txt
1212 \ingroup Documentation
1313 \brief 版本更新历史记录 - V0.9 。
14-\version r1602
14+\version r1787
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 800
1717 \par 创建时间:
1818 2020-10-12 17:19:23 +0800
1919 \par 修改时间:
20- 2020-12-13 02:45 +0800
20+ 2020-12-24 12:09 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -32,6 +32,190 @@
3232
3333 $now
3434 (
35+ / %YFramework $=
36+ (
37+ + 'YB_ATTR_nodiscard YB_PURE ynothrow'
38+ @ "member function %Environment::MakeTags" @ %NPL.NPLA,
39+ + DLDI 'YB_ATTR_nodiscard YB_PURE' @ "function %MapPoint"
40+ @ "platform %Win32" @ "class %DSWindow" @ %'Helper_(DS)'.DSWindow,
41+ // Also to eliminate G++ 10.1 warning: [-Wsuggest-attribute=pure].
42+ / %YCLib $=
43+ (
44+ + $lib "workaround of invalid handling of completeness of \
45+ instantiated %unique_ptr with member initializer for G++ < 9.2"
46+ @ 'YCL_HostedUI_XCB || YCL_Android' @ "class %ScreenBuffer"
47+ @ %HostedGUI,
48+ // Actually no relavant G++ versions have been tested against \
49+ the defect because the member initializer was added since \
50+ b888, and either more recent versions of G++ (on Linux) \
51+ or Clang++ (on Android) are used. Thus, this is not an \
52+ engineering defect of missing testing.
53+ / $design $impl "simplified constructor %Atom" @ %XCB
54+ // To eliminate Clang++ warning: [-Wunused-value].
55+ ),
56+ / %Helper $=
57+ (
58+ / @ "class %Environment" @ %Environment $=
59+ (
60+ + DLDI "brace-init-list '{}'" @ "data member %Root",
61+ * DD "wrong name" @ "'\sa' command" @ "Doxygen comment"
62+ @ "constructor" $since b693
63+ ),
64+ / DLDI "avoided redundant lambda capture" @ "function %AttachToHost"
65+ @ "platform %Win32" @ %HostedUI
66+ // To eliminate Clang++ 9.0.1 warning: \
67+ [-Wunused-lambda-capture].
68+ ),
69+ / DLDI %'YCLib_(Win32)' $=
70+ (
71+ / "header guard names" @ %(COM, Registry, Consoles),
72+ / "private data member" @ "class %WConsole" @ %Consoles
73+ )
74+ ),
75+ / @ "%test.sh" @ %Test $=
76+ (
77+ - '$EXESFX' @ "build command line",
78+ - DLDI "%SHBuild_NoAdjustSubsystem setting"
79+ // This is unused without %SHBuild being called.
80+ ),
81+ / %Tools $=
82+ (
83+ / %Scripts $=
84+ (
85+ / @ "%SHBuild-common-options.sh" $=
86+ (
87+ / "cleanup variable not used in stage 1" $=
88+ (
89+ // See $2020-10 @ %Documentation::Workflow.
90+ - "variables %(LDFLAGS_DYN; LDFLAGS_DYN_BASE, \
91+ LDFLAGS_DYN_EXTRA)";
92+ - "variables %(LIBS_RPATH, LIBPFX, DSOSFX)"
93+ - "variable %EXESFX"
94+ $dep_from ("build command line" @ %Test)
95+ ),
96+ * "wrong warning options for %CFLAGS when the C++ compiler is \
97+ G++" $since b880
98+ ),
99+ / DLI "optimized compiler test commands" ^ '-pipe' $effective
100+ @ ("SHBuild-common-options.txt", "SHBuild-YSLib-common.txt"),
101+ (
102+ + "applicative %SHBuild_Extend_CallVariables"
103+ @ "%SHBuild-YSLib-common.txt";
104+ / DLDI "simplified %SHBuild-BuildApp.txt"
105+ ),
106+ / @ "%SHBuild-YSLib-build.txt" $=
107+ (
108+ + "support of %(SHBuild_LDFLAGS, SHBuild_LIBS)"
109+ ^ $dep_from ("%SHBuild_Extend_CallVariables"
110+ @ "%SHBuild-YSLib-common.txt"),
111+ / "library building" $=
112+ (
113+ / "supported %SHBuild_CXXFLAGS"
114+ @ "building the precompiled header",
115+ + "warning to indicate additional flags fix is used",
116+ + "detection of address sanitizer and the workaround for \
117+ building performance with dynamic YFramework build by \
118+ G++"@ "platform %Linux"
119+ )
120+ ),
121+ * "missing check slashes in the 1st argument before call to \
122+ 'hash'" $effective @ ("function %SHBuild_CheckedCall"
123+ @ "%SHBuild-common.sh" $since b562,
124+ "functions %(SHBuild_CheckCC, SHBuild_CheckXX)"
125+ @ "%SHBuild-common-toolchain.sh" $since b897)
126+ / @ "%SHBuild-common.sh" $=
127+ (
128+ / DLDI "simplified 'exit' without '$?'" $effective
129+ @ "functions %(SHBuild_CheckedCall, \
130+ SHBuild_CheckedCallSlient)",
131+ / @ "function %SHBuild_S2_Prepare" $=
132+ (
133+ + DLD "ShellCheck directive for default value from %cd \
134+ command result",
135+ // To eliminate ShellCheck warning: SC2164.
136+ * "missing quotes on the argument of \
137+ %SHBuild_GetSystemPrefix" $since b905
138+ // Also to eliminate ShellCheck warning: SC2046.
139+ ),
140+ / DLDI "simplified function %SHBuild_GetBuildName"
141+ // Also to eliminate ShellCheck issue: SC2005.
142+ )
143+ ),
144+ / $dev $lib "split header inclusions" !^ %YSBuild @ %SHBuild.Main
145+ / $= (/ '<YSBuild.h>' -> %(YSLib.Service, NPL).YModules)
146+ // This should be better for the build performance. And it is bad \
147+ that stage 1 build is effected by failure of building \
148+ unrelated modules (like %YFramework.YCLib.HostedGUI worked \
149+ around above), although the split does not resolve the real \
150+ issue.
151+ ),
152+ / @ "simplified build variable configuration" @ "build scripts"
153+ $effective @ ("%(SHBuild-common-options.sh, \
154+ SHBuild-YSLib-common.txt, Toolchain.options.mk)" @ %Tools.Scripts,
155+ "all project makefiles with %(CFLAGS, CXXFLAGS)") $=
156+ (
157+ - "variables %(CFLAGS_COMMON, CXXFLAGS_COMMON)"
158+ // The value is inlined to the use sites.
159+ / "ensured %CFLAGS_STD at front of the default value" @ "%CFLAGS",
160+ / "ensured %CXXFLAGS_STD at front of the default value"
161+ @ "%CXXFLAGS"
162+ ),
163+ * "wrong '-fno-threadsafe-statics'" @ "%CXXFLAGS" @ "%Makefile"
164+ @ "platform %Android" $since b492 $effective
165+ @ %(YBase, YFramework, YSTest),
166+ - $build "%AUDIOFILES build configuration" @ ("%Makefile" @ %YFramework,
167+ "ARM9 makefile" @ %YSTest) @ "platform %DS",
168+ // ARM7 sources are never built here.
169+ - $build "rule and %OFILES output for unused files except '%.bin'"
170+ $effective ("%Makefile" @ %(YBase, YFramework), "(ARM7, ARM9) makefiles"
171+ @ "platform %DS" @ %YSTest,
172+ "%Makefile" @ "platform %Android" @ %YSTest),
173+ - DLI "redundant warning option '-Wsign-promo'" @ "%CXXFLGAS" $effective
174+ ("%Makefile" @ %(YBase, YFramework), "(ARM7, ARM9) makefiles"
175+ @ "platform %DS" @ %YSTest),
176+ - DLI "redundant warning option '-Wnon-virtual-dtor'" @ "%CXXFLGAS"
177+ $effective ("%Makefile" @ %YBase, "%Makefile" @ "platform %Android"
178+ @ %YFramework, "(ARM7, ARM9) makefiles" @ "platform %DS" @ %YSTest)
179+ - DLI "redundant warning option '-Wctor-dtor-privacy'" @ "%CXXFLGAS"
180+ $effective ("%Makefile" @ %YBase, "%Makefile" @ "platform %Android"
181+ @ %YFramework, "ARM9 makefiles" @ "platform %DS" @ %YSTest),
182+ + '-Wno-ignored-qualifiers' @ "%(CFLAGS, CXXFLAGS)" @ "%Makefile"
183+ @ ("%Makefile" @ "platform %DS" @ %YFramework, "ARM9 makefile"
184+ @ "platform %DS" @ %YSTest),
185+ // To eliminate G++ warning: [-Wignored-qualifiers]
186+ / %YBase $=
187+ (
188+ / %Test $=
189+ (
190+ / $re_add(b860) "all %std::function" -> "%ystdex::function",
191+ / "all %std::string" -> "%ystdex::string"
192+ ),
193+ / DD "Doxygen comments" @ %YStandardEx $=
194+ (
195+ + $design '\c' @ "before header name" @ %Apply,
196+ + "'\note' command" @ "class %unimplemented" @ %Exception,
197+ + "'\note' command" @ "metafunctions %(enable_for_iterator_t, \
198+ enable_for_input_iterator_t)" @ %IteratorTrait
199+ )
200+ ),
201+ / %YReader $=
202+ (
203+ / $re_add(b860) $dev "all %std::function" -> "%YSLib::function"
204+ @ %(DSReader, ShlReader),
205+ + DLDI "%yunused around %YReader::FetchImage call" @ "main function"
206+ @ %Main,
207+ // To eliminate G++ and Clang++ warning: [-Wunused-result].
208+ / DD "Doxygen comments" @ %(About, HexBrowser, ReadingList)
209+ ),
210+ + DLDI 'YB_STATELESS' @ "unimplemented API" @ !"platform %Win32" $effective
211+ @ ("member function %GUIHost::GetForegroundWindow" @ %GUIApplication,
212+ "function %FetchDefaultTopLevelPosition" @ %HostedUI)
213+ @ %YFramework.Helper
214+ // To eliminate G++ 10.1 warning: [-Wsuggest-attribute=const].
215+),
216+
217+b905
218+(
35219 (
36220 * $doc "fixed annotations method of engineering defects"
37221 @ %Documentation.ProjectRules $since b874;
@@ -258,7 +442,7 @@
258442 Some also depend on the input. The old implementation \
259443 (before b901) using %EncodeArg has limitation on the \
260444 active code page despite of input encoding issues, \
261- though.
445+ though.
262446 ),
263447 / $comp "environment encoding converted to UTF-8"
264448 $dep_from ("%SetEnvironmentVariable" @ %YCLib.YCommon,
@@ -834,7 +1018,7 @@
8341018 GetFileModificationAndAccessTimeOf)" $orig (@
8351019 "member %FileDescriptor::GetModificationTime" $since b624)
8361020 ),
837- + "function %StreamGet" @ %FileIO ^ $dep_from
1021+ + "function %StreamGet" @ %FileIO ^ $dep_from
8381022 ("%ystdex::flush_input" @ %YBase.YStandardEx.StreamBuffer)
8391023 ),
8401024 / %YSLib.Adaptor $=
diff -r 2843c4a3d41f -r a285f6f132e8 doc/Meta.txt
--- a/doc/Meta.txt Sun Dec 13 03:55:38 2020 +0800
+++ b/doc/Meta.txt Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2013-2019 FrankHB.
2+ © 2013-2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file Meta.txt
1212 \ingroup Documentation
1313 \brief 项目元标记。
14-\version r1653
14+\version r1657
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 393
1717 \par 创建时间:
1818 2013-03-25 00:01:48 +0800
1919 \par 修改时间:
20- 2019-10-24 20:52 +0800
20+ 2020-12-24 12:01 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -114,9 +114,9 @@
114114 observe no behavior change within every supported configuration \
115115 consistently, as long as the contracts of the code are not violated;
116116 $lib; // issues only concerned with library, without interface modification \
117- (also including deletion, but not addition) potentially requiring user \
118- code modification by providing some backward-compatible replacements as \
119- long as there is no undefined behavior;
117+ or deletion (but not addition) potentially requiring user code \
118+ modification by providing some backward-compatible replacements as long as \
119+ there is no undefined behavior;
120120 $design; // features changing probably only made sense to who needs to \
121121 reference or modify the implementation;
122122 $src; // issues expected to break public ABI in at least one direction of one \
diff -r 2843c4a3d41f -r a285f6f132e8 doc/NPL.txt
--- a/doc/NPL.txt Sun Dec 13 03:55:38 2020 +0800
+++ b/doc/NPL.txt Thu Dec 24 12:58:49 2020 +0800
@@ -11,13 +11,13 @@
1111 /*! \file NPL.txt
1212 \ingroup Documentation
1313 \brief NPL 规范和实现规格说明。
14-\version r17390
14+\version r17543
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 304
1717 \par 创建时间:
1818 2012-04-25 10:34:20 +0800
1919 \par 修改时间:
20- 2020-11-29 20:59 +0800
20+ 2020-12-23 21:12 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -1325,7 +1325,7 @@
13251325 满足本节以下规则的由派生实现定义的匿名函数(anonymous function expression) 表达式,简称匿名函数。
13261326 函数应确定替换重写规则被替换的目标(@4.4.4.4) (称为函数体(function body) )。
13271327 匿名函数可以捕获(capture) 若干变量,并在函数体引入这些变量。
1328-匿名函数可以显式指定(绑定(bind) )若干变量使之成为约束变量(@4.1) ,称为函数的形式参数(formal parameter, parameter) 。
1328+匿名函数可以显式指定(绑定(bind) )包含若干变量使之成为约束变量(@4.1) 的语法构造。这种变量称为函数的形式参数(formal parameter, parameter) 。
13291329 使用词法作用域(@4.6.1.1.2) 时,若匿名函数所在作用域(@4.1) 的存在同名的名称,则被捕获的名称隐藏(@4.1) 。形式参数隐藏被捕获的变量名。
13301330 派生实现的语义规则应满足和 λ 演算语义(@4.5) 的 α-转换(alpha-conversion) 规则不矛盾。注意 vau 演算(@1.3) 在没有限定环境(@4.6.1.1) 时不考虑一般意义上的自由变量(@4.1) 。
13311331 除非派生实现另行指定,函数不需要被进一步规约,此时其求值是值替换规则(@4.4) 的平凡形式。
@@ -1358,18 +1358,25 @@
13581358 @4.5.3 函数合并(function combination) :
13591359 具有至少一个约定位置的子项 E1 的复合表达式(@3.4.2.2) E ,当且仅当 E1 是被求值作为操作符(@4.4.3.1) 的函数时,E 是函数合并表达式,简称函数合并。
13601360 求值函数合并时,子项(@4.1) E1 总是被求值;
1361-除 E1 外表达式的剩余子项 E2 是操作数(@4.4.3.1),在 E 被求值时以操作数决定的值等效替换(substitute) 函数的形式参数。
1361+除 E1 外表达式的剩余子项 E2 是操作数(@4.4.3.1),在 E 被求值时以操作数决定的值等效替换(substitute) 函数的形式参数(@4.5.2) 。
13621362 替换形式参数的值是实际参数(actual argument, argument) 。
13631363 函数合并的求值是替换规则(@4.4) 的非平凡形式。
13641364 若替换操作数 E2 可被求值,函数合并 E 是函数应用表达式,简称函数应用。
13651365 若操作符是 λ 抽象,E2 视为一个整体,则函数应用替换规则对应 λ 演算的 β-规约(beta-reduction) 规则。
13661366 其它函数合并使用的替换规则由派生实现指定。
13671367 派生实现应指定函数合并规约(@4.1) 的结果是规范形式(@4.5.2),它对应的值是函数合并的求值结果(@4.1) ,称为函数值。
1368-函数应用中,替换形式参数(@4.5.2) 为实际参数(@4.5.2) 的过程蕴含对实际参数的值的计算的依赖,即参数的值的计算先序(@4.4.1) 函数应用的求值;但其它求值顺序没有保证。
1368+函数应用匹配实际参数和对应的引入形式参数的构造。这个过程可能失败。确定匹配参数成功的条件是等价关系,称为参数匹配一致性,由参数匹配的等价关系指定。
1369+匹配成功的每个实际参数和被匹配的目标(可能是形式参数)具有一对一或多对一的对应关系。
1370+伴随参数匹配,实现可引入其它必要的操作(如为匹配分配资源和确定上述对应关系)。这些操作可具有和确定参数对应关系的匹配之间非决定性有序(@4.4.1) 的副作用。
1371+仅当上述必要操作及所有实际参数的匹配成功,替换 E1 决定的某个关联表达式中和形式参数(@4.5.2) 结构一致的子表达式为实际参数(@4.5.2) 。替换参数的结构一致性是等价关系。
1372+表达式相等蕴含参数匹配一致性和替换结构一致性。实现可分别定义其它规则扩充这些等价关系的外延。
1373+替换参数的值蕴含对实际参数的值的计算的依赖,即参数的值的计算先序(@4.4.1) 函数应用的求值;但其它求值顺序没有保证。
13691374
13701375 @4.5.3.1 函数调用(call) :
13711376 求值函数合并包含子表达式的求值:总是求值操作符,并可能求值操作数。若这些求值都没有退出,则函数被调用。
1372-若被调用的函数存在形式参数,函数调用首先包含操作数替换以特定规则绑定(@4.5.2) 的形式参数(@4.5.2) 。
1377+若被调用的函数存在形式参数,函数调用首先以操作数的直接子表达式作为实际参数,匹配实际参数和形式参数。
1378+若实际参数匹配的目标可指定一个变量,则伴随参数匹配的操作包括以特定规则绑定(@4.5.2) 的形式参数(@4.5.2) 。
1379+绑定的实际参数和对应的形式参数作为不同的实体时,作为伴随参数匹配的必要操作的一部分,发生参数传递(parameter passing) 。参数传递使形式参数具有作为实际参数值的副本。参数传递可能使和实际参数相关的资源被复制或转移。
13731380 实现在函数合并的求值中应提供函数调用的支持。
13741381 函数调用确定副作用的边界:保证参数表达式在函数应用被求值之前被求值。
13751382 在控制返回(@4.5.2.1) 主调函数(@4.5.2.1) 时,函数调用内部确定的函数值最终替换被求值的函数调用(@4.5.3.1) ,即为返回值(return value) 。
@@ -1643,7 +1650,7 @@
16431650
16441651 @5.2.4.2 求值和对象所有权:
16451652 被求值的表达式的内部表示即项(@5.5) 或环境(@5.4.3) 中的对象具有 NPLA 对象的所有权。
1646-所有权可被前者独占的 NPLA 对象是临时对象(temporary object) 。关于引入临时对象,参见 @5.5.5 。
1653+所有权可被前者独占的 NPLA 对象是临时对象(temporary object) 。关于引入临时对象,参见 @5.5.6 。
16471654 和宿主语言类似,NPLA 临时对象的存储未指定。对名义上被项所有的临时对象,必要时实现可分配内部存储转移项(包括在环境中分配),以满足附加要求(如 @5.2.5 )。
16481655 和宿主语言类似,对象的所有权随可随对象被转移,且被转移对象后的项具有有效但未指定(valid but unspecified) 的状态,参见 @5.5.2.3 和 @5.5.3 。
16491656 环境对绑定具有的所有权是独占的。绑定对其中的对象可具有独占或共享的所有权。因此,环境可对绑定中的对象具有独占或共享的所有权。
@@ -1927,7 +1934,7 @@
19271934 Unique :唯一引用。
19281935 Nonmodifying :不可修改。
19291936 Temporary :临时对象。
1930-默认值外仅用于 NPLA 项引用(参见 @5.6.3 和 @5.6.3.1 )和派生实现。
1937+默认值外仅用于 NPLA 项引用(term reference)(参见 @5.6.3 和 @5.6.3.1 )和派生实现。
19311938 在 TermTagIndices 中的枚举项带有 Index 后缀,和这些枚举项一一对应。
19321939 项的标签指定通过和标签关联的值访问的对象假定允许具有的性质。除非派生实现另行指定,违反这些假定不引起 NPLA 未定义行为(@5.2.2) 。
19331940 唯一引用允许通过通过具有唯一引用的项或项引用(@5.6.3) 访问关联的对象,对象可被假定不被其它引用而仅通过这个途径访问,即便实际存在其它途径的引用时可能引起不同的行为;在假定的基础上程序具有何种可能的行为是未指定的。
@@ -2012,7 +2019,7 @@
20122019 @5.5.1.1 类型系统和表示:
20132020 值类别在 NPLA 中被作为一种内建的类型系统,参见 @4.2.6 。
20142021 但在类型的值的内部表示上,值类别和特定的类型相关:
2015-当前 NPLA 支持的左值都是项引用(@5.6.3) ,这同时表示引用值(@5.6.3) 。
2022+当前 NPLA 支持的左值都是项引用(@5.6.3) ,这同时表示引用值(@5.5.4) 。
20162023 另见 @5.6.3 和 @5.9 。
20172024
20182025 @5.5.1.2 设计原理:
@@ -2027,7 +2034,7 @@
20272034 第四,允许对象的操作保持资源局域性,满足一等对象不依赖引用的抽象(@4.2.3) 同时允许按需区分是否依赖引用的两类一等对象;
20282035 第五,避免需要假设存在外部具有被引用对象(@4.2.3) 的所有权的所有者(@5.2.4.4) 。
20292036 第三条性质保证表达式的作用(@4.1) 是可组合的并允许求值表达为树规约(@5.4.2) ,还保证能总是通过子表达式的值类别决定表达式的值类别。因为被求值的表达式是有限的,判定过程是总是能终止,即便求值不满足强规范化性质(@4.4.3) 。
2030-第四条性质要求提供泛左值总是能作为纯右值使用的机制和通过纯右值引入对象的机制,详见值类别转换(@5.5.4) 。
2037+第四条性质要求提供泛左值总是能作为纯右值使用的机制和通过纯右值引入对象的机制,详见值类别转换(@5.5.5) 。
20312038 第五条性质要求在表达式之外不存在地位相同的对象的存储资源(@5.2.4) 的所有者,限定了被决定同一性的对象的外延;存储由环境提供(@5.2.4) ,其中不需要保存对象的引用。
20322039
20332040 @5.5.2 初始化:
@@ -2039,7 +2046,7 @@
20392046
20402047 @5.5.2.1 复制初始化和直接初始化:
20412048 和宿主语言类似,初始化包括直接初始化(direct initialization) 和复制初始化(copy initialization) 。
2042-函数可能接受引用值(@5.6.3) 参数和返回值,是对函数的形式参数或函数值的复制初始化;其它初始化是直接初始化。
2049+函数可能接受引用值(@5.5.4) 参数和返回值,是对函数的形式参数或函数值的复制初始化;其它初始化是直接初始化。
20432050 复制初始化形式参数和函数值时,函数参数或返回值作为初值符。
20442051
20452052 @5.5.2.2 函数参数和函数值传递(@4.4.4.5) :
@@ -2050,9 +2057,9 @@
20502057 相对地,完美转发也保持引入这些初始化的表达式(通常是被求值取得函数值的函数表达式)时,其求值结果(函数值)的值类别(@5.5.1) 和初值符保持一致。
20512058
20522059 @5.5.2.3 对象的复制和转移:
2053-类似宿主语言中的类类型的值,可使用初值符为参数进行复制或转移操作以复制初始化对象。(其它情形另见 @5.5.5.3 。)
2060+类似宿主语言中的类类型的值,可使用初值符为参数进行复制或转移操作以复制初始化对象。(其它情形另见 @5.5.6.3 。)
20542061 类似 ISO C++11 起选择类的转移构造函数代替复制构造函数,可使用转移操作时,不对项进行复制,因此不要求值数据成员保存的宿主对象可复制(而避免抛出 ystdex::invalid_construction 等实现相关的异常)。
2055-和 ISO C++11 起不同,上述可使用转移操作的条件和语法上下文无关:引起选择转移操作的条件由对初值符的谓词而非类似宿主语言的构造函数判断(详见 @5.5.4.1 )。
2062+和 ISO C++11 起不同,上述可使用转移操作的条件和语法上下文无关:引起选择转移操作的条件由对初值符的谓词而非类似宿主语言的构造函数判断(详见 @5.5.5.1 )。
20562063 同宿主语言,对象的复制和转移不改变被转移后的类型(@4.6.2) 。
20572064
20582065 @5.5.3 项的转移:
@@ -2069,21 +2076,39 @@
20692076 项的转移也类似 YSLib::ValueObject 自身的转移,其实现(当前通过 ValueObject 内部的 ystdex::any 的转移构造函数)保证直接转移对象而不保证转移构造所有的值。
20702077 若需调用宿主对象的转移构造函数,需明确避免宿主对象转移消除的上下文中进行操作。派生实现可提供这些操作。
20712078
2072-@5.5.4 值类别转换:
2079+@5.5.4 引用值(reference value) :
2080+在对象语言中,引用值(reference value) 作为引用的值,可保存在一等对象中,这样的一等对象是引用对象(reference object) 。
2081+引用值和引用对象的值具有引用类型(@5.5.1.2) 。
2082+在特定上下文中引用和其它一等对象(@4.2.1) 的值的相同具有不同的语义。这主要体现在引用值被按值传递和按引用传递时(@4.4.4.5) 。差异和 ISO C++ 的引用类似。
2083+引用值可使用以下方式表示:
2084+引用项(reference term) ;
2085+使用 TermTags::Temporary 标签(@5.4.2.2) 标记的非引用项。
2086+其中,前者是值数据成员为项引用(@5.6.3) 对象的项。
2087+引用项(@5.5.4) 中的项引用对象引用一个(其它的)项,用于在必要时引入可被引用的一个项而不在 TermNode 中直接储存这个项的值。
2088+对实现作为一等对象(@4.1) 的列表(@5.4.2.1) 的引用(@4.2.3) ,支持引用整个项的中间值是必要的;但项引用也支持引用非列表项。
2089+临时对象(@5.5.6) 可初始化引用值。和非临时对象的引用值不同,临时对象初始化的引用值和关联的被引用对象之间不需要区分同一性,因此使用被引用对象添加 TermTags::Temporary(@5.4.2.2) 标签表示。
2090+引用值可能是左值引用(lvalue reference) 或右值引用(rvalue reference) 。
2091+前者是排除引用项表示且不是唯一引用(@5.4.2.2) 的引用值;后者是以引用项表示的唯一引用或临时对象初始化的非引用项的引用值。
2092+左值引用和左值引用与宿主语言中的对象类型的左值引用与右值引用分别类似。
2093+引用值是否作为左值(@5.5.1.1) 使用取决于上下文。除非另行指定,引用值都是左值。其中,在要求右值的上下文发生左值到右值转换(@5.5.5) 。
2094+引用值应引用在存储期(@5.2.4) 内的对象。否则,引用值是悬空引用(dangling reference) 。
2095+注意访问悬空引用不满足内存安全(@5.2.4.3) 而引起未定义行为。
2096+
2097+@5.5.5 值类别转换:
20732098 和宿主语言类似,具有特定值类别的表达式可转换为不同值类别的表达式:
20742099 除非另行指定,泛左值总是允许作为纯右值使用,称为左值到右值转换(lvalue-to-rvalue conversion) ;
2075-从纯右值初始化(@5.5.2) 可被对象语言作为一等对象(@4.1) 使用的临时对象并用消亡值表示,称为临时对象实质化转换(temporary materialization conversion) 。
2100+从纯右值初始化(@5.5.2) 可被对象语言作为一等对象(@4.1) 使用的临时对象作为消亡值(@5.5.1) ,称为临时对象实质化转换(temporary materialization conversion) 。
20762101 左值到右值转换没有副作用(@4.2.2.1) 。临时对象实质化转换没有副作用,当且仅当其中初始化临时对象时没有副作用。
20772102 临时对象实质化转换中,纯右值被实质化(materialized) 。
20782103 在求值子表达式时,按表达式具有的语义,必要时(如按 @5.5.1.1 判断上下文的值类别)进行值类别转换。
2079-为支持引用值(@5.6.3) 作为一等对象,NPLA 在左值到右值转换的基础上提供更精细的引用值提升转换,即以下转换操作:
2104+为支持引用值(@5.5.4) 作为一等对象,NPLA 在左值到右值转换的基础上提供更精细的引用值提升转换,即以下转换操作:
20802105 若操作数是引用值,则结果是操作数引用的被引用对象;
20812106 否则,结果是操作数。
20822107 根据引用值的性质,易知左值到右值转换的规约是引用值转换的规约的传递闭包,即:
20832108 若操作数是已被折叠的引用值,则引用值提升转换等价左值到右值转换;
20842109 否则,有限次的引用值提升转换等价左值到右值转换。
20852110
2086-@5.5.4.1 设计原理:
2111+@5.5.5.1 设计原理:
20872112 值类别和左值到右值转换在一些上下文的行为类似箱和自动拆箱(@4.2.3.5.3) ,不利于维护简单性(@1.4.3.2) :
20882113 特别地,和宿主语言不同,函数不包含充分的信息(参数类型)推断是否接受左值操作数,因此在不提供针对函数的重载(overloading) 一般机制的前提下,本机实现(@5.2.1) 不能预知输入的操作数是否是左值,通常需分别支持左值和右值的操作数;
20892114 即便提供重载,仍然较单一的值类别更复杂。
@@ -2091,44 +2116,44 @@
20912116 由正确性的优先规则(@1.4.3) ,完整性(@1.4.3.1.1) 应先于简单性被满足。
20922117 而考虑统一性(@1.4.5.1) ,对存储和对象模型的设计,用户自行的实现仍要求这些设施(尽管更困难)。
20932118
2094-@5.5.4.2 返回值转换(return value conversion) :
2119+@5.5.5.2 返回值转换(return value conversion) :
20952120 返回值转换是一次引用值提升转换和可选的临时对象实质化转换的复合。
20962121 返回值转换(return value conversion) 用于在对象语言中确定函数调用的返回值(@5.2.1) 可包含函数体(@4.5.2) 的求值结果到返回值的转换。
20972122 返回值转换的应用参见 @7.1.4.2 。
20982123
2099-@5.5.5 临时对象的引入:
2124+@5.5.6 临时对象的引入:
21002125 和宿主语言的临时对象的使用方式类似,NPLA 的临时对象在特定的上下文中被引入。
2101-为简化规约和互操作机制的设计,和 ISO C++17 不同,临时对象仅在转换为消亡值(@5.5.1) 时的临时对象实质化转换(@5.5.4) 引入,而不包括延迟初始化或异常对象的创建。
2126+为简化规约和互操作机制的设计,和 ISO C++17 不同,临时对象仅在转换为消亡值(@5.5.1) 时的临时对象实质化转换(@5.5.5) 引入,而不包括延迟初始化或异常对象的创建。
21022127 临时对象实质化转换引入临时对象的规则和 ISO C++17 不同:
21032128 不论表达式是否作为子表达式使其值被使用(未使用的情形对应 ISO C++ 中的 discarded-value expression ),都允许存在临时对象;
2104-要求复制消除(copy elision) 而避免特定对象的初始化(@5.5.2) ,参见 @5.5.5.3 。
2105-
2106-@5.5.5.1 实质化转换上下文:
2129+要求复制消除(copy elision) 而避免特定对象的初始化(@5.5.2) ,参见 @5.5.6.3 。
2130+
2131+@5.5.6.1 实质化转换上下文:
21072132 可要求临时对象实质化转换的上下文包括:
21082133 使用纯右值初始化按引用绑定的变量(如函数的引用类型的形式参数(@4.5.2) );
21092134 求值函数调用以初始化返回值对象。
21102135 其中,按引用绑定的变量被可选地支持;若被支持,引入引用值的形式参数的具体形式由派生实现指定。
21112136 一般地,按引用绑定的变量在活动调用(@4.5.3.1) 关联的环境分配临时对象(@5.2.4.2) 。此时,对象被调用表达式的项独占所有权,同时被绑定的环境独占资源所有权。
21122137
2113-@5.5.5.2 返回值转换上下文:
2114-返回值转换(@5.5.4.2) 可引入实质化的临时对象,其中可能转移求值的中间结果(@5.5)(条件参见 @5.6.3.4 );否则,对象被复制。
2138+@5.5.6.2 返回值转换上下文:
2139+返回值转换(@5.5.5.2) 可引入实质化的临时对象,其中可能转移求值的中间结果(@5.5)(条件参见 @5.6.3.4 );否则,对象被复制。
21152140 此处被转移对象符合 @5.2.4.2 的临时对象的定义,但除非另行指定,被转移的对象不在对象语言中可被访问。
21162141 此处的转移引起宿主对象转移消除(@5.5.3.1) 。
21172142 仅在对象被复制且复制具有副作用时,返回值转换具有等价复制的副作用。
21182143
2119-@5.5.5.3 复制消除:
2144+@5.5.6.3 复制消除:
21202145 和 ISO C++17 类似,NPLA 要求特定上下文中的复制消除,排除复制或转移操作且保证被消除操作的源和目的对象的同一性(@4.2.1.1) 。
21212146 和 ISO C++17 不同,NPLA 的复制消除限于临时对象的消除,但不限制对象的类型(特定的 C++ 类类型),且除以下约定外的所有表达式求值的上下文对复制消除相同(例如,不区分求值结果是否被作为返回值(@4.5.3.1) 或求值是否为常量表达式)。
21222147 复制消除仅在以下转换上下文中被要求,即直接使用转换的源表达式中被求值项指称的对象(@5.7.3) 作为实质化的对象而不初始化新的临时对象:
2123-实质化转换上下文(@5.5.5.1) ;
2124-引起对象转移的返回值转换上下文(@5.5.5.2) 。
2148+实质化转换上下文(@5.5.6.1) ;
2149+引起对象转移的返回值转换上下文(@5.5.6.2) 。
21252150 非本机实现(@5.2.1) 函数函数体内指定的返回值不属于上述的确定返回值的上下文,但也不要求被复制消除。这和 ISO C++17 要求 return 语句中的特定的表达式被消除不同,而不需要依赖特定上下文的语法性质。
21262151 实现仍可能根据当前环境(@5.4.4) 来判断是否在允许消除对象复制的上下文中(当前未实现),而进行复制消除。
21272152 在完成实质化转换前的不完整的求值规约(@4.4) 中的临时对象在逻辑上不需要作为一等对象(@4.1) 存在,但纯右值作为对象表示中的子项,随纯右值在宿主语言中作为对象存在,以允许互操作。
2128-复制消除不在被初始化对象以外引入新的项。若被消除的对象来自不同的项,则复制消除为宿主对象转移消除(@5.5.3.1) 。这包括所有对象转移的返回值转换上下文的情形(@5.5.5.2) 。
2153+复制消除不在被初始化对象以外引入新的项。若被消除的对象来自不同的项,则复制消除为宿主对象转移消除(@5.5.3.1) 。这包括所有对象转移的返回值转换上下文的情形(@5.5.6.2) 。
21292154 在使用纯右值初始化引用值时,延长源表达式的项指称的对象(@5.7.3) 的生存期(@5.2.5) 。这和初始化非引用值类似,但实现需区分是否初始化的是延长生存期的临时对象,以确保之后能区分是否按引用绑定。
21302155
2131-@5.5.6 表达式的类型:
2156+@5.5.7 表达式的类型:
21322157 NPLA 的类型系统(@4.6.2) 使用隐式类型(@4.6.2.2) ;和 Scheme 及 Kernel 类似,默认使用潜在类型,保证表达式的值具有类型(@5.2) 。
21332158 NPLA 表达式的类型约定为表达式求值结果(@4.1) 的类型。
21342159 空求值(@4.4.2) 的求值结果要求未求值的合式的(@2.5.1) 表达式应具有和语法分析(@5.3.2) 的输出兼容的类型,参见 @5.4.2.1 和 @5.6.1 。
@@ -2165,32 +2190,21 @@
21652190
21662191 @5.6.2 环境引用:
21672192 环境引用是引用 Environment 类型的环境(@5.4.3) 并支持其共享所有权(@5.2.4.2) 的中间值。
2193+环境引用类似引用值(@5.5.4) ,但隐含更复杂的所有权关系,因此不具有相同的类型(@5.5.7) 。
21682194 shared_ptr<Environment> 可引用环境对象,其非空值作为环境强引用(@5.4.3) 。
21692195 NPL::EnvironmentReference 可引用环境对象,封装 weak_ptr<Environment> 和锚对象(anchor object) 指针,其非空值表示可能具有共享所有权的环境弱引用(@5.4.3) 。
21702196 环境对象的弱引用的所有权关系使用其中的 weak_ptr<Environment> 确定。
21712197 因为 weak_ptr<Environment> 不提供可靠的弱引用计数,引用锚对象附加的引用计数用于确定弱引用的数量,详见 @6.9.4 。
2172-默认构造的 shared_ptr<Environment> 是空的引用值。
2173-默认构造的 NPL::EnvironmentReference 具有空的 weak_ptr<Environment> 值,是空的引用值。
2198+默认构造的 shared_ptr<Environment> 是空的环境引用。
2199+默认构造的 NPL::EnvironmentReference 具有空的 weak_ptr<Environment> 值,是空的环境引用。
21742200 非空的 shared_ptr<Environment> 和 NPL::EnvironmentReference 分别可作为对象语言的环境强引用和环境弱引用的宿主值。
21752201
2176-@5.6.3 项引用和引用项:
2177-NPL::TermReference 储存在项的值数据成员中引用一个项,用于在必要时引入可被引用的一个项而不在 TermNode 中直接储存这个项的值。
2178-对实现作为一等对象(@4.1) 的列表(@5.4.2.1) 的引用(@4.2.3) ,支持引用整个项的中间值是必要的;但 NPL::TermReference 也支持引用非列表项。
2179-在对象语言中,引用值(reference value) 作为引用的值,可保存在一等对象中,这样的一等对象是引用对象(reference object) 。
2180-引用值和引用对象的值具有引用类型(@5.5.1.2) 。
2181-在特定上下文中引用和其它一等对象(@4.2.1) 的值的相同具有不同的语义。这主要体现在引用值被按值传递和按引用传递时(@4.4.4.5) 。差异和 ISO C++ 的引用类似。
2182-值数据成员为项引用对象的项是引用项(reference term) 。
2183-引用值可使用以下方式表示:
2184-引用项;
2185-使用 TermTags::Temporary 标签(@5.4.2.2) 标记的非引用项。
2202+@5.6.3 项引用:
2203+宿主语言中的 NPL::TermReference 是项引用。
21862204 NPL::TermReference 和所在的项中可能包含的子对象是引用值的宿主值(@5.5) 类型。
21872205 其中,子项只被 @5.6.3.5 的情形使用。
21882206 子对象引用使用的这种形式的表示通常因为需要更多的操作比其它引用值的类似操作低效,但这种表示可避免依赖宿主语言中的本机对象内部表示(如成员布局)的依赖。
21892207 一般地,在 C++ 的意义上不存在能满足语义的更有效的可移植表示,所以这种表示在和宿主语言的互操作上是必要的。
2190-NPL::TermReference 通过是否使用引用值初始化决定对象语言中的左值引用(lvalue reference) 和右值引用(rvalue reference) 。
2191-引用值是否作为左值(@5.5.1.1) 使用取决于上下文。除非另行指定,引用值都是左值。其中,在要求右值的上下文发生左值到右值转换(@5.5.4) 。
2192-引用值应引用在存储期(@5.2.4) 内的对象。否则,引用值是悬空引用(dangling reference) 。
2193-注意访问悬空引用不满足内存安全(@5.2.4.3) 而引起未定义行为。
21942208 对 NPL::TermReference 相关操作详见 @6.4.4 ;可能使用 NPL::TermReference 访问项的操作详见 @6.4.5 。
21952209
21962210 @5.6.3.1 项引用的元数据(@4.2.3.3.1) :
@@ -2216,11 +2230,12 @@
22162230 @5.6.3.4 可转移条件:
22172231 根据项是否具有特定元数据的引用值可判断使用复制代替对象转移的条件(@5.5.2.3) 。
22182232 可转移条件的判断基于表示表达式的值的项。可转移项(movable term) 通过以下方式确定:
2219-若项是非引用项,总是可转移的;
2233+非引用项(@5.5.4) 总是可转移的(非引用项表示右值);
22202234 否则,若项引用具有的标签(@5.6.3.1) 决定它是被引用对象的唯一引用且非不可修改(@5.4.2.2) ,项是可转移的。
2221-一般地,决定可转移条件有两类:
2222-由一般表达式的值确定可转移:判断表示表达式的值是可转移项使之能作为非引用值的返回值(用例如 @7.1.4.2 );
2223-由被转发(@5.5.2.2) 表达式的值确定可转移:除上述条件外,表示绑定临时对象的引用值(具有临时对象标签(@5.4.2.2) )的项蕴含被引用对象(@4.2.3) ,也是可转移的(用例如 @9.8 )。
2235+一般地,非引用值的对象是可转移的。
2236+确定引用值关联的被引用对象可转移的条件有两类:
2237+由可转移项确定:引用值由可转移项表示,在特定的上下文使被引用对象能转换为右值(用例如 @7.1.4.2 );
2238+由被转发(@5.5.2.2) 表达式的值确定:除上述条件外,表示绑定临时对象的引用值(具有临时对象标签(@5.4.2.2) )的项蕴含被引用对象(@4.2.3) ,也是可转移的(用例如 @9.8 )。
22242239
22252240 @5.6.3.5 子对象引用(subobject reference) :
22262241 特定的引用值是子对象引用,通过一个引用值和它的子对象构造,引用被对象所有的一等对象。
@@ -2301,7 +2316,7 @@
23012316 项对象可能不直接由项自身表示,即可以通过项引用其它途径引入的对象。
23022317 基于 @5.7.2 ,为保证内存安全,避免临时对象被引用,仅在泛左值(@5.5.1) 中允许引入被可能引用的间接值。
23032318 推论:泛左值的项对象不是临时对象,被环境所有。
2304-通常纯右值作为其它项的子项而被独占所有权,求值时可能通过临时对象实质化转换(@5.5.4) 标识创建的临时对象(@5.5.5) 。
2319+通常纯右值作为其它项的子项而被独占所有权,求值时可能通过临时对象实质化转换(@5.5.5) 标识创建的临时对象(@5.5.6) 。
23052320 作为 @5.2.4 的实现,临时对象以项自身作为表示(@5.5) ,被纯右值所有,也间接被其它项所有。
23062321 特定情况下纯右值可能被环境所有,但应只通过复制等方式访问其值而不依赖所有权关系(如仅复制记号值(@5.7.4.2) )。
23072322
@@ -2316,12 +2331,13 @@
23162331 关于被求值的被规约项中的对象的所有权,另见 @5.7.3 。
23172332 派生实现可基于本节约定其它规则。
23182333
2319-@5.7.4.1 引用值(@5.6.3) 作为间接值:
2334+@5.7.4.1 引用值(@5.5.4) 作为间接值:
23202335 由于左值(@5.5.1) 的项对象被环境所有(@5.7.3) ,在项上的求值需要其它项对象作为中间值。
2321-这种中间值通过间接引用左值以确保左值标识的对象可作为一等对象(@4.1) 使用,也是一种间接值,即引用值(@5.6.3) ,是引用(@4.2.3) 的实例。
2322-NPL::TermReference(@5.6.3) 类型作为左值的引用的内部表示。
2323-这类似 ISO C++ 的对象类型的左值引用和右值引用的差异。消亡值(@5.5.1) 使用内部的 TermTags::Unique 标签(@5.4.2.2) 标记。
2324-基于引用的左值到右值转换(@5.5.4) 可通过 NPL::ReferenceTerm(@6.4.4) 实现。
2336+这种中间值通过间接引用左值以确保左值标识的对象可作为一等对象(@4.1) 使用,也是一种间接值,即引用值(@5.5.4) ,是引用(@4.2.3) 的实例。
2337+NPL::TermReference(@5.6.3) 类型是可能需要区分引用与被引用对象的值的内部表示。
2338+这类似宿主语言的对象类型的左值引用和右值引用的差异(@5.5.4) 。
2339+消亡值(@5.5.1) 以作为其表示的引用项(@5.5.4) 内部的 TermTags::Unique 标签(@5.4.2.2) 标记,即唯一引用。
2340+基于引用的左值到右值转换(@5.5.5) 可通过 NPL::ReferenceTerm(@6.4.4) 实现。
23252341 和宿主语言的涉及成员访问的表达式类似,直接使用标识符进行名称查找(@4.3.3) 得到的表达式是左值或消亡值。在此环境总是被视为左值,所以结果由环境中的对象类型确定:当且仅当对象是左值时,结果是左值引用;否则是右值引用。
23262342 和宿主语言类似,右值引用类型的表达式可作为左值使用。
23272343 一般地,并非所有对象需要引用,详见 @4.2.3 。
@@ -2332,21 +2348,21 @@
23322348 否则,引入的间接值引用环境所有的对象。
23332349 应注意存储环境以外的间接值时,不超出持有对象的存储期,避免未定义行为(@5.2.4) 。当前实现不对此附加检查。
23342350 注意不求值而仅替换项时,使用 NPL::LiftOther 或 NPL::LiftTerm(@6.6.1) ,这不引入间接值。
2335-除构造间接值的例程(@6.6) ,当前不直接引入引用持有者。如需要引入间接值,使用引用值(@5.6.3) 而不是其它间接值,以统一处理无法直接持有的列表项和非列表项的引用。
2351+除构造间接值的例程(@6.6) ,当前不直接引入引用持有者。如需要引入间接值,使用引用值(@5.5.4) 而不是其它间接值,以统一处理无法直接持有的列表项和非列表项的引用。
23362352
23372353 @5.7.4.3 间接值的消除:
23382354 访问间接值涉及维护内存安全保证(@5.2.4.3) 时,可能需要提升项(@6.6) 以移除允许非内存安全(@5.2.4.3.1) 访问的间接值。
23392355 引用值作为间接值可被消除(@5.6.3.3) 。
23402356 用于按值传递参数时,一般使用 NPL::LiftTerm(@6.6.2) 和确保创建值副本的 NPL::SetContentWith(@6.2.1) 实现;前者取非引用类型的右值(@5.5.1) ,后者提升间接值确保结果不是中间值。
2341-用于按值传递返回值时(@4.5.3.1) ,除显式分别对是否为引用值的情形进行处理,可使用 NPL::LiftToReturn(@6.6.3)(其中也使用以上方式实现),实现临时对象实质化转换(@5.5.4) ,详见 @5.7.4.4 。
2342-
2343-@5.7.4.4 返回值转换(@5.5.4.2) :
2344-作为提升项的使用用例(@5.7.4.3) ,在返回值转换上下文(@5.5.5.2) 中确定函数返回值的实质化转换上下文(@5.5.5.1) 的部分操作消除引用值(@5.6.3.3) ,即返回值转换。
2357+用于按值传递返回值时(@4.5.3.1) ,除显式分别对是否为引用值的情形进行处理,可使用 NPL::LiftToReturn(@6.6.3)(其中也使用以上方式实现),实现临时对象实质化转换(@5.5.5) ,详见 @5.7.4.4 。
2358+
2359+@5.7.4.4 返回值转换(@5.5.5.2) :
2360+作为提升项的使用用例(@5.7.4.3) ,在返回值转换上下文(@5.5.6.2) 中确定函数返回值的实质化转换上下文(@5.5.6.1) 的部分操作消除引用值(@5.6.3.3) ,即返回值转换。
23452361 这可约束作为间接值的引用值不逃逸(escape)(即使用被引用对象的值时不超出指向对象的生存期),而保证只考虑项的值数据成员(@5.4.2) 可能是引用值时的内存安全。
23462362 返回值转换不保证未折叠的引用值在消除引用值后的结果不逃逸。为确保内存安全,程序仍需要保证被引用的对象的间接引用的对象生存期结束后,不能访问间接引用的对象。
23472363 除非证明不需要临时对象(当前未实现),返回值转换中初始化临时对象作为返回值的项对象(@5.7.3) 。
2348-是否需要返回值转换由实质化转换上下文中的被调用的函数而非上下文是否需要使用右值决定,无关被转换的表达式是否是左值,因此返回值转换不是左值到右值转换(@5.5.4) 。
2349-不论是否存在返回值转换,返回值的项对象来自返回的右值关联的临时对象实质化转换(@5.5.5) 。这可能在 NPL::LiftToReturn 或之前的求值规约的调用中蕴含。
2364+是否需要返回值转换由实质化转换上下文中的被调用的函数而非上下文是否需要使用右值决定,无关被转换的表达式是否是左值,因此返回值转换不是左值到右值转换(@5.5.5) 。
2365+不论是否存在返回值转换,返回值的项对象来自返回的右值关联的临时对象实质化转换(@5.5.6) 。这可能在 NPL::LiftToReturn 或之前的求值规约的调用中蕴含。
23502366
23512367 @5.7.5 被归约项稳定性:
23522368 基于 TermNode 的性质,未被规约修改的项的子项的迭代器、指针和引用保持稳定(@5.4.2) 。
@@ -2364,7 +2380,7 @@
23642380 在无法预知子项是否需要被进一步使用而不会在被调用前另行存储包含这些资源的项时,实现使用的操作应避免删除这里的子项(对实现 WHNF 而言即第一个子项),以免无法使用其中的状态。
23652381
23662382 @5.7.5.2 临时对象资源:
2367-表示临时对象的项的子项的迭代器、指针和引用应保持稳定,以支持子项被绑定到对象语言中的引用值(@5.6.3) 。
2383+表示临时对象的项的子项的迭代器、指针和引用应保持稳定,以支持子项被绑定到对象语言中的引用值(@5.5.4) 。
23682384 表示临时对象的项自身不需被绑定到引用值,不保证稳定,可被直接存储为 TermNode(而不需要保存为指针等间接值)。
23692385 对临时对象分配资源可能转移表示临时对象的项,但不影响其子项的稳定性。
23702386
@@ -2601,7 +2617,8 @@
26012617
26022618 @5.11.1.1 附加规则:
26032619 当前仅支持标识符(@3.3.1) 作为名称。
2604-含有“$$”的名称保留给宿主交互使用;含有“__”的名称保留给 NPLA1 实现。
2620+部分名称是保留名称(reserved name) :含有“$$”的名称保留给宿主交互使用;含有“__”的名称保留给 NPLA1 实现。
2621+若程序的源代码中的保留名称被作为变量名解析,程序的行为未定义。
26052622 在 NPLA 规则(@5.2) 的基础上,具有以下情形的程序引起未定义行为:
26062623 显式使用保留给实现的标识符。
26072624
@@ -2739,7 +2756,7 @@
27392756 NPL::IsBoundLValueTerm
27402757 NPL::IsUncollapsedTerm
27412758 NPL::IsUniqueTerm
2742-NPL::ResolveTerm 解析并间接引用处理可能是引用值(@5.6.3) 的项,其中尝试解析使用 NPL::TryAccessLeaf 。
2759+NPL::ResolveTerm 解析并间接引用处理可能是引用值(@5.5.4) 的项,其中尝试解析使用 NPL::TryAccessLeaf 。
27432760 NPL::CheckRegular 指定函数访问检查项后的指定类型正规值(@5.9) ,即按模板参数指定的类型访问解析后的正规值。
27442761 NPL::AccessRegular
27452762 NPL::ResolveRegular
@@ -2805,7 +2822,7 @@
28052822 规约实现作用在对象语言表达式上通用的求值算法(evaluaton algorithm) ,符合规约性质(@5.5) 。
28062823 主规约函数是提供这种单一规约函数实现的直接规约函数(@6.5.3.1) 。
28072824 间接值(@5.7.2) 对主规约函数透明,不被直接处理。
2808-推论:主规约函数实现的求值算法中,被求值的表达式不发生值类别转换(@5.5.4) 。这简化实现的复杂性,并允许派生实现单独处理需要间接值(如引用值)的情形,并在其它情形避免不需要的开销。
2825+推论:主规约函数实现的求值算法中,被求值的表达式不发生值类别转换(@5.5.5) 。这简化实现的复杂性,并允许派生实现单独处理需要间接值(如引用值)的情形,并在其它情形避免不需要的开销。
28092826
28102827 @6.6 提升项:
28112828 对项的提升(lifting) 指一类对项的替换变换,使用项进行一定的变换后取代其它项或其一部分,并满足下述提升条件。
@@ -2834,7 +2851,7 @@
28342851 以下值操作可能引入间接值:
28352852 函数 NPL::LiftCollapsed
28362853 函数 NPL::MoveCollapsed
2837-函数 NPL::LiftTermRef 提升项引用:提升项的内容为参数指定的项或值的引用值(@5.6.3) 。
2854+函数 NPL::LiftTermRef 提升项引用:提升项的内容为参数指定的项或值的引用值(@5.5.4) 。
28382855 引用值通过参数指定的值对象(@5.4.2) 上创建得到。
28392856 函数 NPL::LiftToReference 提升项对象为引用。
28402857 若项对象表示引用值则提升项,否则对 ValueObject 进行基于所有权的生存期检查并取引用这个项的引用值。
@@ -2847,9 +2864,9 @@
28472864 函数 NPL::MoveRValueToReturn
28482865 函数 NPL::MoveRValueToForward
28492866 函数 NPL::LiftSubtermsToReturn
2850-本节的函数作用在被规约项时,对引用值的操作实现临时对象实质化转换(@5.5.4) 所在的求值规约的最后部分的操作,一般在尾上下文(@4.4.7) 中进行处理。
2867+本节的函数作用在被规约项时,对引用值的操作实现临时对象实质化转换(@5.5.5) 所在的求值规约的最后部分的操作,一般在尾上下文(@4.4.7) 中进行处理。
28512868 提升消除中间值只作用在被提升项,不作用在子项。需要递归复制的操作不在这里提供,以避免抽象泄漏。
2852-为消除中间值需要进行复制消除(@5.5.5.3) ,其中使用不同的可转移条件(@5.6.3.4) 决定使用转移而非复制。
2869+为消除中间值需要进行复制消除(@5.5.6.3) ,其中使用不同的可转移条件(@5.6.3.4) 决定使用转移而非复制。
28532870 当前实现在转移项时使用的宿主转移操作总是使用宿主对象的转移(基于 NPL::SetContentWith(@6.2.1) )而不是 TermNode 的转移。
28542871 另见 @5.7.4.3 。
28552872
@@ -2988,7 +3005,7 @@
29883005 因为绑定参数引入附加的函数调用,一般仅在有必要时使用。
29893006
29903007 @6.9.5 环境、绑定访问和解析操作:
2991-基于环境的名称解析(@4.3.3) 操作可选地处理保留名称(reserved name) 并查找名称(@4.3.3) 。
3008+基于环境的名称解析(@4.3.3) 操作可选地处理保留名称(@5.11.1.1) 并查找名称(@4.3.3) 。
29923009 解析环境只支持要求作为一等对象(@4.1) 的环境引用(@5.4.3) 。
29933010 以下 API 提供解析名称相关的操作:
29943011 函数模板 NPL::EmplaceLeaf
@@ -3048,9 +3065,9 @@
30483065 @7.1.3 NPLA1 间接值使用规则:
30493066 基本规则参见 @5.7.4 。
30503067 除非另行指定,不在求值引入右值引用(@5.7.4.1) 。
3051-特别地,A1::EvaluateIdentifier(@7.6.4) 保证对应表达式求值的结果是左值引用。这使之实现求值符号(@5.2) 时的结果是左值(@5.5.1) 而不立即引入左值到右值转换(@5.5.4) 及复制对象,和宿主语言的行为类似。
3068+特别地,A1::EvaluateIdentifier(@7.6.4) 保证对应表达式求值的结果是左值引用。这使之实现求值符号(@5.2) 时的结果是左值(@5.5.1) 而不立即引入左值到右值转换(@5.5.5) 及复制对象,和宿主语言的行为类似。
30523069 作为替代,可通过 NPLA API(如 NPL::IsBoundLValueTerm(@6.4.5) )间接判断绑定的对象的是否为右值引用。
3053-引入绑定的 API(@7.7.4) 可引入引用值(@5.6.3) 。已有的引用值的引用总是左值引用,否则是右值引用。
3070+引入绑定的 API(@7.7.4) 可引入引用值(@5.5.4) 。已有的引用值的引用总是左值引用,否则是右值引用。
30543071
30553072 @7.1.4 NPLA1 规约内存安全保证(@5.2.4.3) 机制:
30563073 在 @5.7 的基础上,NPLA1 规约附加以下约定以维护内存安全。
@@ -3338,7 +3355,7 @@
33383355 @7.6.4.1 规约合并项:
33393356 规约合并项是具有子项的枝节点(@5.4.2.1) ,满足 IsBranchedList(@6.2.1)(类似 @7.6.1.3 );或符合 @5.9.4.2 的非平凡非正规表示。
33403357 这些条件可使用 A1::IsCombiningTerm 判断。
3341-作为被规约项,规约合并项的第一个子项应能规约到 A1::FormContextHandler(@7.6.1.1) 的值或引用 A1::FormContextHandler 对象的引用值(@5.6.3) 。
3358+作为被规约项,规约合并项的第一个子项应能规约到 A1::FormContextHandler(@7.6.1.1) 的值或引用 A1::FormContextHandler 对象的引用值(@5.5.4) 。
33423359
33433360 @7.6.4.2 规约合并求值:
33443361 函数 A1::ReduceCombined 对规约合并项(@7.6.4.1) 以已规约的第一个子项为上下文处理器(@7.6.1) 并返回调用结果,以节约严格性分析(@4.4.4.2) 开销;并根据处理器返回的规约结果进行正规化操作。
@@ -3346,7 +3363,7 @@
33463363 若存在 A1::ContextHandler 对象的子对象引用(@5.6.3.5) ,先变换子对象引用。这些子对象引用应符合 @5.9.4 约定的表示,否则断言检查失败。
33473364 以上变换中,若子对象引用持有的值不具有 A1::ContextHandler 类型,则抛出异常。
33483365 之后,设置或清空被规约项的 TermTags::Temporary(@5.4.2.2) 位分别表示函数右值和函数左值。被调用的处理器必要时可利用这个标签位作为提示进行优化。
3349-因为被规约项总是非引用项(@5.6.3) ,和 @7.1.2 的其它用法(由 A1::EvaluateIdentifier(@7.6.4) 保证求值结果是引用项)不冲突。(同时,尽管只在管理规约(@4.4) 而不在对象语言的表达式中出现,这仍符合引用值(@5.6.3) 的语义;这实际上是复用 TermTags::Temporary 的主要理由。)
3366+因为被规约项总是非引用项(@5.6.3) ,和 @7.1.2 的其它用法(由 A1::EvaluateIdentifier(@7.6.4) 保证求值结果是引用项)不冲突。(同时,尽管只在管理规约(@4.4) 而不在对象语言的表达式中出现,这仍符合引用值(@5.5.4) 的语义;这实际上是复用 TermTags::Temporary 的主要理由。)
33503367 若存在调用,且不是(表示左值的)引用的情形,则先从第一个子项转移 A1::ContextHandler 对象,以维护生存期。
33513368 规约结果最终通过调用 NPL::RegularizeTerm(@6.5.2) 按纯值规约正规化(@5.9.2) 。
33523369 调用上下文传递时不清理(@5.8.2.1) 参数,即处理器中的第一个子项是已被清理的项,可被实现使用。
@@ -3393,7 +3410,7 @@
33933410 间接调用 A1::RelayForCall 的求值规约操作包括通过过程抽象(@8.4.5) 中的函数引入合并子的调用。
33943411 求值规约操作附带绑定操作匹配被绑定的操作数树(@4.4.3.1) 。
33953412 求值规约操作中可能具有提升操作(@7.1.4) 。
3396-忽略提升操作可允许对象语言的函数调用返回(@4.5.3.1) 引用值(@5.6.3) 。
3413+忽略提升操作可允许对象语言的函数调用返回(@4.5.3.1) 引用值(@5.5.4) 。
33973414
33983415 @7.7.2.1 求值规约提升项:
33993416 关于提升项的基本用例,参见 @5.7.4.3 。
@@ -3411,7 +3428,7 @@
34113428 绑定操作初始化的变量的名称和值分别由形式参数树和操作数树决定。
34123429 绑定操作匹配待绑定的形式参数和操作数或它们的子项。
34133430 成功的匹配决定形式参数对应的操作数或其子项,作为其实际参数(@4.5.3) 。这种对应关系是单射但不一定是满射,即匹配成功后,每个参数总存在对应的操作数或其子项,而操作数和子项允许不对应形式参数而被忽略。
3414-NPLA 操作数树的叶节点为符号(@5.6.1) 或其引用值(@5.6.3) 。
3431+NPLA 操作数树的叶节点为符号(@5.6.1) 或其引用值(@5.5.4) 。
34153432 被绑定的项的操作数是待匹配的项的子项(而不会是此项自身,满足 @6.5.3 )。
34163433 被绑定的参数可以作为函数的形式参数(@4.5.2) ,也可以其它初始化变量的语法构造的基础。
34173434 和 Kernel 类似,形式参数树是 DAG ,但通过真列表(@5.4.2.1) 的性质蕴含而不需要另行限制。形式参数树中的节点在匹配时被视为右值。
@@ -3425,7 +3442,7 @@
34253442 若形式参数可能由求值得到,需在匹配前另行处理。
34263443
34273444 @7.7.3.2 绑定临时对象标签:
3428-绑定临时对象时设置对象上的 TermTags::Temporary 标签(@5.4.2.2) ,以实现区分通过引用绑定延长生存期的临时对象和非引用绑定的对象(@5.5.5.3) 。
3445+绑定临时对象时设置对象上的 TermTags::Temporary 标签(@5.4.2.2) ,以实现区分通过引用绑定延长生存期的临时对象和非引用绑定的对象(@5.5.6.3) 。
34293446 一般地,表达式中的纯右值(非引用值)被绑定为临时对象,被绑定的对象在初始化后具有 TermTags::Temporary 。
34303447 这对应宿主语言中的转发引用(forwarding reference) 参数中的情形:
34313448 若模板参数 P 对应转发引用函数参数 P&& ,其中 P 是右值引用类型,保留从实际参数推断但不是实际参数类型的信息;
@@ -3465,7 +3482,7 @@
34653482 被绑定对象(引用值)的标签由操作数的(引用值)的标签决定:
34663483 当有标记字符 & 时,被绑定对象(引用值)中包含绑定临时对象标签(@7.7.3.2) ,当且仅当引用值的标签包含 TermTags::Unique 。
34673484 否则,被绑定对象的标签和引用值的标签相同。
3468- 否则,若操作数标签(@7.7.3.5) 指定可修改的唯一值或有标记字符 % 时的唯一值,操作数是可转移的非引用值,被绑定的对象是临时对象。
3485+ 否则,若操作数标签(@7.7.3.5) 指定可修改的唯一引用或有标记字符 % 时的唯一引用,操作数是可转移的非引用值,被绑定的对象是临时对象。
34693486 否则,当有标记字符 & 时,被绑定对象是操作数的引用值。
34703487 否则,被绑定对象是复制自操作数的值。
34713488 否则,被绑定的是操作数的引用:
@@ -3475,7 +3492,7 @@
34753492 绑定的默认行为对引用值特殊处理,是为了满足 G1b(@1.4.5.1) ,而不是像某些语言(如 ISO C 和 [Rust] )仅通过内建的机制提供特定左值上下文(lvalue context) 。
34763493 绑定的默认行为不使用析构性转移(@5.5.3) 的操作(类似 [Rust] 的设计),原因是考虑到绑定的副作用影响操作数(即便因为对象被销毁而不一定是修改操作)和破坏幂等性(@4.1) (特别是指定过程调用的形式参数时,参见 @8.4.5 )违反易预测性原则(@1.4.5.2) 。
34773494 当前暂时不支持修改被绑定操作数。使用标记字符而修改操作数的绑定可能在未来支持。
3478-具有引用标记字符的形式参数支持引入引用值并支持绑定引入临时对象的实际参数(@5.5.5) 。
3495+具有引用标记字符的形式参数支持引入引用值并支持绑定引入临时对象的实际参数(@5.5.6) 。
34793496 绑定临时对象时可能设置被绑定对象上的 TermTags::Temporary 标签(@7.7.3.2) 。
34803497
34813498 @7.7.3.5 递归绑定:
@@ -3506,7 +3523,7 @@
35063523 实现引入绑定的绑定操作(@7.7.3) 的 API 包括:
35073524 函数 A1::MatchParameter 匹配操作数树(@7.7.3) 。
35083525 函数 A1::BindParameter 匹配并绑定操作数到参数上。
3509-为允许调用宿主对象的转移构造函数,绑定操作(@7.7.3) 仅在特定的上下文中使用复制消除(@5.5.5.3) 。(实际上,初始化引用之外的参数创建也不是 ISO C++17 约定要求消除复制的上下文。)
3526+为允许调用宿主对象的转移构造函数,绑定操作(@7.7.3) 仅在特定的上下文中使用复制消除(@5.5.6.3) 。(实际上,初始化引用之外的参数创建也不是 ISO C++17 约定要求消除复制的上下文。)
35103527 对实际参数,检查尾部参数是否为省略(@7.7.3.3) 后,匹配前判断是否为 TermNode 以支持引用(@5.7.4.3) 。
35113528 绑定尾部参数列表时,若对应的操作数是右值,直接转移子项,使用复制消除。
35123529 一般地,对操作数树的递归操作应在分配资源失败时,引起(可能派生)std::bad_alloc 的宿主异常而非宿主语言的未定义行为(@5.2.2) 。
@@ -3583,8 +3600,8 @@
35833600 关于 () 的求值规则避免这种简洁有用的语法导致语法错误(syntax error) 。而和 Kernel 不同的函数合并求值规则使这个设计和函数求值字面上没有直接的关联,避免了 Kernel 中为什么 () 不是词法上类似的如 (f x) 这样的表达式的特例的问题。
35843601 注意以 () 作为前缀并不要求要求特定函数的子类型而可能破坏子类型封装性的假设。
35853602 关于区分函数类型的替代设计(使用前缀 $ )的一个例子,参见 https://eighty-twenty.org/2011/09/29/fexprs-remain-inscrutable#comment-422279775 。
3586-由 @7.1.3 和 A1::REPLContext 配置的求值遍,NPLA1 规范求值算法不对引用值(@5.6.3) 特别处理。
3587-因此,引用值在此作为一等对象(@4.1) ,作为表达式时不发生左值到右值转换(@5.5.4) 。
3603+由 @7.1.3 和 A1::REPLContext 配置的求值遍,NPLA1 规范求值算法不对引用值(@5.5.4) 特别处理。
3604+因此,引用值在此作为一等对象(@4.1) ,作为表达式时不发生左值到右值转换(@5.5.5) 。
35883605 符号(@5.6.1) 作为名称表达式(@4.5.1) ,经名称解析(@4.3.3) 求值为左值(@5.5.1) 引用值。
35893606 这允结果保留(@8.1.2) 被求值表达式中的引用值,同时避免实现需要分别检查列表和作为符号求值结果的引用值类型的开销。
35903607 求值符号的实现参见 A1::EvaluateIdentifier(@7.6.4) 。
@@ -3656,7 +3673,7 @@
36563673 排除本机函数(@5.2.1) ,合并子中的求值都通过 A1::RelayForEval(直接求值)或 A1::RelayForCall(合并子调用)实现,转移子项保存临时对象不晚于 A1::RelayForCall(@7.7.2) 的调用。
36573674 宿主语言直接实现的本机函数通常仍使用同步规约以避免转移子项等操作的复杂性;若使用异步规约,也需要保证子项的生存期以满足上述要求。
36583675 实现需自行决定是否使用内部存储保存临时对象以及需要保存临时对象的内部存储的位置。若需支持异步规约,不能使用宿主语言的自动对象。
3659-一般地,因为 TermTags::Temporary(@5.4.2.2) 允许原地标记被绑定的临时对象而非引用其它存储(@5.5.5.3) ,不需要对被绑定的操作数临时对象特别处理。
3676+一般地,因为 TermTags::Temporary(@5.4.2.2) 允许原地标记被绑定的临时对象而非引用其它存储(@5.5.6.3) ,不需要对被绑定的操作数临时对象特别处理。
36603677 当前不提供 API 辅助实现本机函数中的临时对象维护。
36613678 按 @5.7.6 ,本机实现可对表示临时对象的子项分别转移,但转移前不应有非内部对象(@4.2.4.1) 引用被转移的子项。
36623679
@@ -4113,7 +4130,7 @@
41134130 形式参数对象;
41144131 上下文原型;
41154132 捕获的静态环境;
4116-作为过程实现的求值结构(evaluation structure) (对应表达式中可能被求值的函数体(@4.5.2) );
4133+作为过程实现的求值结构(evaluation structure)(对应表达式中可能被求值的函数体(@4.5.2) );
41174134 决定是否在调用后提升返回结果(@8.4.5.4) 的标记。
41184135 这些数据都是可被共享的。复制 vau 抽象的处理器对象共享这些数据。
41194136 其中,作为父环境(@5.4.3) 的静态环境以 NPL::EnvironmentReference 弱引用值保存,并附加 shared_ptr 实例以可选被 vau 抽象所有;其它数据都以 shared_ptr 的值保存,被 vau 抽象所有。
@@ -4140,8 +4157,8 @@
41404157 保存在静态环境以外的对象的引用不受到以上机制保护,需要对形式参数对象可包含的对象进行限制以保证被规约项的所有权要求(@5.7.3) 。
41414158 因此,vau 抽象初始化时对形式参数对象检查,确保其中的非列表项中只存在调用 NPL::LiftTermRef 后也不引入间接值的对象的值,即记号值(@5.6.1) 。
41424159 恢复被切换的环境(@6.9.5) 时,环境内的对象被释放。
4143-若需保证内存安全(@5.2.4.3),返回值(@4.5.3.1) 不能是在调用后生存期结束的对象的引用值(@5.6.3) ,以避免引用被释放或之后被正规化(@5.9.2) 清理的值引入未定义行为。
4144-避免返回(@4.5.3.1) 引用值(@5.6.3) 的通用机制为提升返回结果,即求值后的求值结果(@5.8.1) 进行进行返回值转换(@5.7.4.4) ,同时消除引用值(@7.1.4) ,使返回值总是按值传递。
4160+若需保证内存安全(@5.2.4.3),返回值(@4.5.3.1) 不能是在调用后生存期结束的对象的引用值(@5.5.4) ,以避免引用被释放或之后被正规化(@5.9.2) 清理的值引入未定义行为。
4161+避免返回(@4.5.3.1) 引用值(@5.5.4) 的通用机制为提升返回结果,即求值后的求值结果(@5.8.1) 进行进行返回值转换(@5.7.4.4) ,同时消除引用值(@7.1.4) ,使返回值总是按值传递。
41454162
41464163 @8.4.5.5 相等性:
41474164 相等性作为弱函数应用规约等价谓词(@4.5.3.2) 提供,操作为对所有成员进行相等比较,当且仅当都相当时,结果为真。
@@ -4157,7 +4174,7 @@
41574174
41584175 @8.4.7 错误检查:
41594176 Forms 提供以下可能抛出异常的错误检查函数:
4160-Forms::CheckEnvironment
4177+Forms::CheckEnvironment
41614178 Forms::CheckListReference
41624179
41634180 @8.4.8 封装类型操作:
@@ -4198,7 +4215,7 @@
41984215 A1::ReduceToLoadExternal
41994216 A1::RelayToLoadExternal
42004217
4201-@8.5.2 对象语言加载 API
4218+@8.5.2 对象语言加载 API
42024219 函数 Forms::LoadGroundContext 提供 SHBuild 初始 REPL 环境(包含的上下文称为基础上下文(ground context) ),其中支持:
42034220 字面量初始化,支持 #t 、#f 和整数等字面量;
42044221 使用 A1::SeparatorTransformer(@7.5.2) 启用预处理的分号和逗号转换,分别为有序和无序列表求值的语法糖。
@@ -4333,7 +4350,7 @@
43334350 #false :同 #f 。
43344351 #inert :类似 Kernel 的 #inert 字面量,宿主值为 ValueToken::Unspecified(@7.2.2) 而不具有单独的类型(因此也不需要定义 inert? 谓词)。
43354352 另见 @10.5.1 。
4336-NPLA1 字面量都是纯右值(@5.5.1) ,但总是允许实质化转换(@5.5.4) 为消亡值并引入可互操作的临时对象(@5.5.5.3) 。
4353+NPLA1 字面量都是纯右值(@5.5.1) ,但总是允许实质化转换(@5.5.5) 为消亡值并引入可互操作的临时对象(@5.5.6.3) 。
43374354 这和宿主语言的字符串字面量是左值不同。当前 NPLA1 对象语言不提供能引起互操作差异的接口(字符串字面量不被修改),以后可能改变。
43384355
43394356 @9.3.2 函数合并(@4.5.3) :
@@ -4417,7 +4434,7 @@
44174434 函数操作的语义可单独指定检查,具体形式由具体操作指定。
44184435
44194436 @9.4.3.4.1 类型检查:
4420-基于 @5.5.6 ,对应对象语言表达式的表示实体的元素可用于表示操作中的名义(nominal) 类型检查。
4437+基于 @5.5.7 ,对应对象语言表达式的表示实体的元素可用于表示操作中的名义(nominal) 类型检查。
44214438 类型检查包括:
44224439 对求值得到的操作数(@9.2.2.2) ,若操作的语义需要,则总是进行类型检查;
44234440 根据特定对象状态指定动态类型的检查;
@@ -4543,7 +4560,7 @@
45434560 部分语义不需要通过求值(@4.1) 体现。
45444561
45454562 @9.5.1 值类别和类型:
4546-基本内容参见 @5.5.1 和 @5.5.6 。
4563+基本内容参见 @5.5.1 和 @5.5.7 。
45474564 特定的表达式维护可修改性(@9.4.5.1) 。这类似宿主语言的 const 类型限定,但只适合左值(@5.5.1) 且仅使用隐式类型。
45484565
45494566 @9.5.2 绑定构造(binding construct) :
@@ -4577,7 +4594,7 @@
45774594 NPLA1 基于 NPLA 项的引用(@5.6.3) 支持实体的左值引用(@5.7.4.1) ,和 Kernel 等的引用概念类似。
45784595 NPLA1 语义中对广义实体(@2.3.2) 的构成依赖的使用也被称为引用,这不限被对象语言中的引用值表达。
45794596 和 Kernel 不同,NPLA1 明确允许不通过对象的引用保存对象(参见 @9.6.2 ),但是也允许使用对象引用;即对象和对象的引用都是一等对象(@4.1) 。详见 @4.2 。这也允许子对象直接被所在的对象蕴含。
4580-使用项引用(宿主类型为 NPL::TermReference )表示(使用 TermNode 表示的)其它对象的引用,即引用值(@5.6.3) 。
4597+使用项引用(宿主类型为 NPL::TermReference )表示(使用 TermNode 表示的)其它对象的引用,即引用值(@5.5.4) 。
45814598 按 NPL::TermReference 初始化时保存的引用来源可区分被引用的对象是否是左值。
45824599 左值(@5.5.1) 都通过引用值(参见 @5.7.4.1 ;另见 @4.1 和 @5.2.4 )表示。
45834600 引用值在创建时即引用在生存期内的对象。
@@ -4609,7 +4626,7 @@
46094626
46104627 @9.6.1.3 引用值作为实际参数:
46114628 除非另行指定(如 @9.8.2 和 @10.4.2 ),一般地,函数接受左值引用操作数,使用引用的对象的值和直接使用右值作用相同,但不会修改被左值引用的对象。
4612-这等价隐含无副作用的左值到右值转换(@5.5.4) 。此处的左值引用和宿主语言中的(非 volatile )左值作用类似。
4629+这等价隐含无副作用的左值到右值转换(@5.5.5) 。此处的左值引用和宿主语言中的(非 volatile )左值作用类似。
46134630 另见 @9.8.4 。
46144631
46154632 @9.6.1.4 返回非引用值:
@@ -4716,7 +4733,7 @@
47164733 若满足上述条件的函数不具有错误条件(@9.4.3.3) ,忽略因实现环境引发的错误(如宿主资源耗尽),视为(对象语言中的)全函数。
47174734
47184735 @9.7.1 函数值(@4.5.2) 约定:
4719-除非另行指定,函数值不是引用值(@5.6.3) ,以便通过保证满足间接值生存期规则(@5.7.4) 维护内存安全(@5.2.4.3) 。
4736+除非另行指定,函数值不是引用值(@5.5.4) ,以便通过保证满足间接值生存期规则(@5.7.4) 维护内存安全(@5.2.4.3) 。
47204737 除非另行指定,函数值是经过返回值转换(@5.7.4.4) 的值,不保留引用值(@9.6.1.5) 。注意保留引用值时,函数值仍可能是非引用值。
47214738 除非另行指定,若函数值保留引用值,引用值被折叠。关于引用值是否被折叠的操作分类,详见 @9.9.1 。
47224739
@@ -4739,11 +4756,11 @@
47394756 在复制初始化形式参数和函数值时,部分函数保证被初始化的值和初值符(@5.5.2) 的值类别(@5.5.1) 和可修改性一致。这些初始化是转发(@5.5.2.2) 操作。
47404757
47414758 @9.8.1 传递非引用值参数:
4742-一些函数的参数进行左值到右值转换(@5.5.4) ,实现参数的按值传递(@4.4.4.5) 。
4759+一些函数的参数进行左值到右值转换(@5.5.5) ,实现参数的按值传递(@4.4.4.5) 。
47434760 这类似宿主语言中直接使用对象类型的形式参数。
47444761
47454762 @9.8.2 函数参数转发:
4746-一些函数的部分参数也可不进行左值到右值转换(@5.5.4) 。
4763+一些函数的部分参数也可不进行左值到右值转换(@5.5.5) 。
47474764 这些参数的转发类似绑定构造支持的参数转发(@9.5.2.2) 。
47484765 参数转发的实现可判断值类别(@9.5.2) 后分别对传递非引用值(@9.8.1) 或直接传递引用值提供实现,或直接使用绑定构造。前者支持本机实现。
47494766
@@ -4787,7 +4804,7 @@
47874804 为满足适用性(@1.4.5.2) ,同时考虑维护内存安全、避免误用和允许使用引用避免复制,这些操作需显式使用以 % 或 & 结尾的函数名称以得到特别关注。
47884805 对以求值 <body> 作为尾上下文的操作(@9.4.8.1),以 % 结尾表示 <body> 所在的函数返回时不要求返回非引用值(@9.6.1.4) ,尽管这些操作不返回引用值。
47894806 对其它提供不同引用标记字符的多个版本的操作:
4790-以 % 结尾表示函数可使用不进行左值到右值转换(@5.5.4) 的折叠(@5.6.3.2) 的引用值参数,或可返回折叠的引用值;
4807+以 % 结尾表示函数可使用不进行左值到右值转换(@5.5.5) 的折叠(@5.6.3.2) 的引用值参数,或可返回折叠的引用值;
47914808 以 & 结尾表示函数使用不进行左值到右值转换的折叠的引用值参数,或返回折叠的引用值;
47924809 以 @ 结尾表示函数使用不进行左值到右值转换的未折叠的引用值参数,或返回未折叠的引用值。
47934810 以上函数调用结果中的折叠的引用值对调用时引入的引用值有效。
@@ -4835,6 +4852,7 @@
48354852 作为核心语言特性时,这些环境对象可以不是一等环境(@9.6.2) ,但应能和一等环境在名称解析(@5.4.3) 中的作用一致:作为父环境(@5.4.3) 。
48364853 NPLA1 实现提供的这种由实现初始化的作为核心语言特性的环境对象称为根环境(root environment) 。
48374854 和 Kernel 类似,NPLA1 实现提供基础环境(ground environment) 。
4855+基础环境应包含语言规范要求提供的所有绑定,且不包含名称除保留名称(@5.11.1.1) 外的绑定。
48384856 基础环境是隐藏环境(@9.6.2.2) ,不被直接访问。
48394857 除非另行指定,根环境和作为库特性的一等环境对象初始化后被冻结(@9.6.2.4) 。
48404858 用户程序初始的当前环境(@5.4.4) 是一个包含基础环境作为直接或间接父环境的空环境(@4.6.1.1) 。
@@ -4973,7 +4991,7 @@
49734991 (引入非容器对象的操作另见 @10.4.1.4 。)
49744992 对构造器的转发操作以及部分修改操作区分是否存在引用标记字符结尾可强调一些非预期保留引用值的容易误用情形:
49754993 尽管总是返回非引用值,转发参数保留的引用值不会被返回值转换(@9.6.1.4) 影响,在构造的容器对象作为非引用值返回仍会保留引用值(@9.6.1.5) 。
4976-(对应宿主语言中,可有更显著的差异,如构造器对应的 std::tuple 的 std::make_tuple 和 std::forward_as_tuple 。)
4994+(对应宿主语言中,可有更显著的差异,如构造器对应的 std::tuple 的 std::make_tuple 和 std::forward_as_tuple 。)
49774995 本节内的以下分类不相交,但部分分类中函数名不带有引用标记字符结尾的操作可能和 @10.4.2 中的操作相交。
49784996
49794997 @10.4.1.1 可能使结果包含引用值的容器构造器:
@@ -5128,8 +5146,8 @@
51285146 派生实现可以通过提供不公开不安全操作(@10.1.2) 的根环境,但不符合此处的规格要求(@2.3.1.2) 。
51295147 若派生实现不提供第三类不安全操作(@10.1.2) ,可以简化部分 @10.5.4 中与之关联的操作的实现。
51305148 部分可选的 Kernel 合并子被直接提供。
5131-和 Kernel 不同,一些函数显式地操作引用值(@5.6.3) ,包括未折叠的引用值(@5.6.3) 。
5132-和 Kernel 不同,求值算法不直接处理对象的引用值(@6.5.3.3) 。
5149+和 Kernel 不同,一些函数显式地操作引用值(@5.5.4) ,包括未折叠的引用值(@5.5.4) 。
5150+和 Kernel 不同,求值算法不直接处理对象的引用值(@6.5.3.3) 。
51335151 为简化实现,部分提供 % 等后缀的函数(@10.4.1) 不被派生。
51345152 因为设计原因,不提供以下 Kernel 合并子对应的操作:
51355153 copy-es-immutable
@@ -5208,7 +5226,7 @@
52085226 uncollapsed? <object> :判断操作数是否为未折叠的引用值。
52095227 bound-lvalue? <object> :判断操作数是否为被引用的被绑定对象左值。
52105228 绑定临时对象的引用类型的参数不被视为左值引用。
5211-配合 $resolve-identifier 和 % 引用标记(@7.7.3.4) 绑定的变量,可确定实际参数是否为左值。
5229+配合 $resolve-identifier(@10.5.6) 和 % 引用标记(@7.7.3.4) 绑定的变量,可确定实际参数是否为左值。
52125230 单独使用 bound-lvalue? 和 & 引用标记字符(@7.7.3.4) 绑定的变量,可确定实际参数是否为引用。
52135231 unique? <object> :判断操作数是否为唯一引用(@5.4.2.2) 。
52145232 deshare <object> :取指定对象取消共享的值。
@@ -5218,14 +5236,14 @@
52185236 expire <object> :取指定对象的消亡值(@5.5.1) 。
52195237 同 id(@10.6.1) ,但当参数是引用值时,结果是和参数引用相同对象的唯一引用。
52205238 可用于显式地指定之后被转移的对象(参见 @9.4.5.1.2 ),而不需要直接转移参数,因此这个操作也不是修改操作(@9.4.5.1) ,函数名不以 ! 结尾(@9.9) 。
5221-这个函数类似宿主语言作用在对象类型实际参数的 std::move ,可能减少没有经过复制消除(@5.5.5.3) 的复制或转移(@5.5.2.3) 而改变使用这个函数的结果对象的副作用。
5239+这个函数类似宿主语言作用在对象类型实际参数的 std::move ,可能减少没有经过复制消除(@5.5.6.3) 的复制或转移(@5.5.2.3) 而改变使用这个函数的结果对象的副作用。
52225240 特别地,指定列表的引用值被转移时,不需要立即转移列表的每个元素,而允许之后通过绑定构造(@9.5.2) 等方式选择转移的子对象(@9.6) 。
52235241 可能包含立即转移的操作如 forward!(@10.6.1) 。
5224-move! <object> :转移项。
5225-若对象是不可修改的左值,则以复制代替转移;否则,直接转移对象的项(@5.5.3) 。
5242+move! <object> :转移对象。
5243+若参数是不可修改的左值,则以复制代替转移;否则,直接转移表示参数对象的项(@5.5.3) 。
52265244 结果是不经返回值转换的项。
52275245 被转移对象后的项满足 @5.2.4.2 。
5228-当前实现中项被转移后,表示的值为 () 。这和返回值转换(@5.7.4.4) 等引入实质化临时对象时可能具有的转移(@5.5.5) 的效果(仅在互操作时可见)不保证相同。
5246+当前实现中项被转移后,表示的值为 () 。这和返回值转换(@5.7.4.4) 等引入实质化临时对象时可能具有的转移(@5.5.6) 的效果(仅在互操作时可见)不保证相同。
52295247 transfer! <object> :转移对象。
52305248 同 move! ,但使用对象的转移(@5.5.2.3) ,而不是项的转移(@5.5.3) ,避免宿主对象转移消除而允许调用宿主对象的转移构造函数(@5.5.3.1) 。
52315249 项被转移后,和返回值转换等引入实质化临时对象时可能具有的转移的效果(仅在互操作时可见)相同。
@@ -5366,7 +5384,7 @@
53665384 考虑通常引用操作对符号类型未被求值的左值操作数使用,保留引用值没有意义,因此不提供对应保留引用值的操作。
53675385 这个函数的使用在实现中受限制,参见 @10.2 。
53685386 id <object> :结果为不隐含左值到右值转换的参数,在结果保留引用值。
5369-其作用等价返回值转换,可能引起对象转移(@5.5.5.2) 。
5387+其作用等价返回值转换,可能引起对象转移(@5.5.6.2) 。
53705388 idv <object> :同 id ,但结果为返回值转换(@5.7.4.4) 后的值。
53715389 list <object>... :创建列表(类型为 <list> )对象。
53725390 list% <object>... :同 list ,但每个参数都不隐含左值到右值转换,在结果保留引用值。
@@ -5387,11 +5405,11 @@
53875405 $sequence <expression-sequence> :顺序求值。
53885406 操作数非空时结果是最后的参数,可能是引用值。
53895407 类似 Kernel 的同名操作。
5390-求值每个 <object> 的副作用包括其中临时对象的销毁都被顺序限制,类似宿主语言的语句而不是保证子表达式中的临时对象的生存期延迟到完全表达式求值结束的逗号表达式。这也允许实现和 [RnRK] 同名操作类似的 PTC 要求。
5408+求值每个 <object> 的副作用包括其中临时对象的销毁都被顺序限制,类似宿主语言的语句而不是保证子表达式中的临时对象的生存期延迟到完全表达式求值结束的逗号表达式。这也允许实现和 [RnRK] 同名操作类似的 PTC 要求。
53915409 collapse <object> :折叠可能是引用的值。
53925410 forward <object> :转发(@9.8.4) 可能是引用的值(@10.4.2.4) 。
53935411 按在所在的环境中解析的操作数的类型可选地提升项(@6.6) 作为结果,其作用 id 或 idv 之一。
5394-被转发的值若是作为形式参数树(@7.7.3) 中的变量,一般应以带有标记字符 & 的形式绑定(@7.7.3.4) ;否则,转发的不是对应的操作数,而可能是按值绑定的副本。
5412+被转发的值若是形式参数树(@7.7.3) 中的变量,一般应以带有标记字符 & 的形式绑定(@7.7.3.4) ;否则,转发的不是对应的实际参数,而可能是其按值绑定的副本。
53955413 转移(而不是复制)可修改的右值操作数。注意若右值操作数不可修改(如本机实现引入带有 TermTags::Nonmodifying 标签(@5.4.2.2) 的引用操作数),复制不可复制构造的宿主对象会失败。
53965414 本机实现使用 NPL::MoveRValueToReturn(@6.6.3) 可简化操作。
53975415 forward! <object> :同 forward ,但除转移右值操作数外,也转移(而不是复制)可修改的临时对象操作数。
@@ -5550,7 +5568,7 @@
55505568 对参数列表 (&l &extr) ,结果同求值 accr l null? () ($lambda% (&l) forward-list-first% expire extr l) rest% cons% 。
55515569 list-extract-first <list> :同指定应用子为 first 的 list-extract 。
55525570 对参数列表 (&l &extr) ,结果同求值 list-extract ls first 。
5553-list-extract-first-rest%! <list> :同指定应用子为 rest% 的 list-extract 。
5571+list-extract-first-rest%! <list> :同指定应用子为 rest% 的 list-extract 。
55545572 对参数列表 (&l &extr) ,结果同求值 list-extract ls rest% 。
55555573 list-push-front! <list> <object> :在列表前插入元素。参数被转发。
55565574 map-reverse <applicative> <list>... :映射并反转结果。
@@ -5634,7 +5652,10 @@
56345652 传递给 REPL 的命令行参数通常是宿主程序中主函数的 argv 参数数组中处理后去除特定参数后的程序。
56355653 宿主程序复制 argv 到这个数组作为副本后,作为函数值的列表的来源。
56365654 env-get <string> :取宿主环境的环境变量字符串。
5637-env-set <string> :设置宿主环境的环境变量字符串。
5655+字符串参数指定环境变量的名称。
5656+env-set <string1> <string2>:设置宿主环境的环境变量字符串。
5657+两个字符串参数分别指定环境变量的名称和设置的值。
5658+注意使用 env-get 和 env-set 及对应宿主环境的操作不保证线程安全。
56385659 env-empty? <string> :判断字符串指定名称的环境变量是否为空。
56395660 system <string> :以 std::system 兼容的方式调用外部命令。使用 YSLib::usystem 实现。
56405661 system-get <string> :调用命令,返回命令调用结果。
@@ -5683,10 +5704,31 @@
56835704
56845705 @12.2 派生接口:
56855706 以下 SHBuild 互操作及脚本调用接口可能在 NPLA1 、SHBuild 工具或外部脚本中实现。
5686-因为名称保持稳定,也在此提供文档。
5707+因为相对其它脚本接口,名称保持稳定,也在此提供文档。
5708+
5709+@12.2.1 环境变量缓存:
5710+脚本缓存环境变量并在访问缓存时可能按外部环境的要求以未指定的方式跟踪环境变量的访问操作。缓存的环境变量的值在第一次访问时确定。
5711+对环境变量的直接访问是使用系统模块(@11.5) 的 env-get、 env-set 和 env-empty? 的访问,忽略缓存的环境变量。直接设置环境变量不更新缓存的值。
5712+除非另行指定,访问环境变量使用缓存的环境变量。
5713+带缓存环境变量的访问接口如下:
5714+safeenv-get <string> :同 env-get ,但使用缓存。
5715+初始化缓存的值为第一次调用时的环境变量的值。若环境变量未设置,则值为空。
5716+safeenv-set <string1> <string2> :同 env-set ,但使用缓存。
5717+safeenv-empty? <string> :同 env-empty? ,但使用缓存。
5718+safeenv-restore <string> :重置参数指定名称的环境变量为缓存的值。
5719+
5720+@12.2.2 派生操作:
56875721 () SHBuild_GetPlatformStrings :取操作系统和体系结构字符串列表。
56885722 代替 shell 脚本的 SHBuild_PrepareBuild 初始化的宿主环境变量。
5689-以下 API 的具体功能参见用户文档中脚本的说明;部分参数略不同。
5723+() SHBuild_Extend_CallVariables :扩展特定的环境变量的值为 SHBuild 工具接受的环境变量。
5724+环境变量扩展通过确定名称的被扩展的环境和扩展其的前缀环境变量指定。
5725+若前缀环境变量的当前值非空,被扩展的环境被设置为一个新值。新值是其当前值被添加对应前缀环境变量的值,且在两者之间添加一个空格构成。
5726+取被扩展的环境变量的当前值时直接访问环境变量。
5727+访问环境变量的顺序未指定。
5728+当前扩展的环境变量包括:
5729+使用 SHBuild_LDFLAGS 扩展 LDFLAGS ;
5730+使用 SHBuild_LIBS 扩展 LIBS 。
5731+以下 API 的具体功能参见用户文档中脚本的说明;对函数 shell 脚本中存在的同名函数,参数可能不同。
56905732 SHBuild_2m <string> :以 cygpath -m 转换参数指定的路径作为结果,若失败则结果为参数。
56915733 SHBuild_2u <string> :以 cygpath -au 转换参数指定的路径作为结果,若失败则结果为参数。
56925734 SHBuild_2w <string> :以 cygpath -w 转换参数指定的路径作为结果,若失败则结果为参数。
diff -r 2843c4a3d41f -r a285f6f132e8 doc/Workflow.txt
--- a/doc/Workflow.txt Sun Dec 13 03:55:38 2020 +0800
+++ b/doc/Workflow.txt Thu Dec 24 12:58:49 2020 +0800
@@ -11,13 +11,13 @@
1111 /*! \file Workflow.txt
1212 \ingroup Documentation
1313 \brief 工作流汇总报告。
14-\version r3981
14+\version r4006
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since build 433
1717 \par 创建时间:
1818 2013-07-31 01:27:41 +0800
1919 \par 修改时间:
20- 2020-11-15 14:43 +0800
20+ 2020-12-15 06:00 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -2275,7 +2275,7 @@
22752275 If needed, parallelism can be added by threading and other means in future.
22762276 This design supports mixture of asynchronous and ordinary synchronous handlers of calls once the asynchronous calls are properly guarded by some synchronization mechanism.
22772277 The abstraction of such handlers are called as actions.
2278- In a specific context for reduction, depending on the configuration, an action can be either synchronous, or asynchronous.
2278+ In a specific context for reduction, depending on the configuration, an action can be either synchronous, or asynchronous.
22792279 Sometimes there has to be different implementations for synchronous and asynchronous uses of an action.
22802280 An action can be represented by various data structures.
22812281 A notable example is the data structure used as the handler in TCO, see below.
@@ -2388,7 +2388,7 @@
23882388 When the strong reference count reaches to zero, the object would be automatically destroyed.
23892389 So simply avoid to keep redundant strong reference away would be sufficient to make objects collected.
23902390 Otherwise, if the strong reference shows the object is not uniquely held by the frame record list, the environment reference is removed.
2391- As the environment reference is also held elsewhere, the environment is not collected.
2391+ As the environment reference is also held elsewhere, the environment is not collected.
23922392 Otherwise, if no external objects hold (weak) reference to the environment, the environment reference is needed to be removed.
23932393 The environment is then collected at once.
23942394 The trace is used to maintain the data determining whether objects being traced are held externally.
@@ -2471,12 +2471,12 @@
24712471 So they are further compressed by taking the processed referent as destination and the referent held by guard object as source.
24722472 All duplication of source environment bindings in the destination environment are removed.
24732473 If the resulted parent environment is empty, it is to be collected.
2474- The parent of destination environment is moved to the source
2474+ The parent of destination environment is moved to the source
24752475 The condition is based on size of frame record list.
24762476 If the size changed, there is at least one object in frame record list is collected.
24772477 The try would be continued as there can be new orphaned object not in the list due to the removal of object in the list.
24782478 After the above first try of loop, components of the frame element are processed if necessary.
2479- The environment component holding temporary object is cleaned up if it is uniquely referenced.
2479+ The environment component holding temporary object is cleaned up if it is uniquely referenced.
24802480 The function prvalue component of front element of frame record list is then set to empty.
24812481 This is a hack that avoiding improper tail calls caused by a false positive external reference to the static environment object held in the temporary function object which is or is similar to a vau handler.
24822482 Ideally, multiple temporary objects are allowed coexisted.
@@ -2539,7 +2539,7 @@
25392539 This changes after adoption of C++17 whose 'std::basic_string' having conditionally enabled constructor targetting to 'std::basic_string_view' instances.
25402540 This should ideally be resolved before adapting 'string_view' on the new 'ystdex::basic_string', but nothing is required to be done yet, since new constructors of 'std::basic_string' is still compatible in semantics with substitution failure.
25412541 No use of 'default_init_allocator' in user code is found.
2542- Class name 'path' is safe because due to 'ystdex::sequence_container_adaptor'.
2542+ Class name 'path' is safe because due to 'ystdex::sequence_container_adaptor'.
25432543 All other use are safe except 'using u16string::u16string;' in class 'String' in module YSLib::Core::YString.
25442544 This should also be handled like 'ystdex::basic_string' and 'NPL::TokenValue'.
25452545
@@ -3227,7 +3227,7 @@
32273227 This is also used in some other notable online documents like https://zh.cppreference.com/w/cpp/language/type.
32283228 However, the consisdered replacment is consistent with other sources.
32293229 It is consistent with most mathematical concepts and the usual translations of phrases widely used in computer science like "NP-complete problem".
3230- A second mathematical replacement is '完备'. This is not considered here.
3230+ A second mathematical replacement is '完备'. This is not considered here.
32313231 It is consistent with diagnostic messages in GCC.
32323232 The characters '不完全' for 'incomplete' are also exactly same in locale zh-TW.
32333233 However, some translations in locale zh-CN is considered somewhat in the zh-TW flavor, e.g. '提领' instead of '解引用' for 'dereference'. So, this is considered not quite precisely reflecting the actual popular use in zh-CN.
@@ -3475,7 +3475,7 @@
34753475 The 'list::erase' implementation for range is optimized to the 'clear()' case check (like Microsoft VC++) and have less update to pointers otherwise.
34763476 The necessity for the previous builds is from the fact that 'std::list' implementation in libstdc++ on the Android configurations (with CrystaX) are still not conforming to C++11, and it breaks 'NPL::TermNode' allocator-extended construction in YFramework.NPL.SContext.
34773477 However, since it also needs to fix 'std::stack' (thus, including 'std::deque') if nothing is changed in the client code in YFramework.NPL.SContext, update to the official NDK r20 is planned instead.
3478- The update requires to implemented YCLib::FileIO support for libc++ and a few other fixes, but no need to replace the 'std' types.
3478+ The update requires to implemented YCLib::FileIO support for libc++ and a few other fixes, but no need to replace the 'std' types.
34793479 YFramework still plans to change to 'ystdex::list' now as it is believed to have better performance (at least in x86_64-linux).
34803480 Another bonus is it supports incomplete value types specified in [WG21 N4510], which is adopted as an ISO C++17 feature.
34813481 This is considered to be used in 'ystdex::pmr::memory_resource' implementations when the pool type was not exposed. Is not the case now.
@@ -3536,7 +3536,7 @@
35363536 The macro 'NPL_Impl_NPLA1_Enable_TailRewriting' is removed.
35373537 It is considered outdated for a while.
35383538 Since the temporary objects are now stored in the reduced terms rather than frames for calls, no special allocations are cared.
3539- The only instance of the remaining use is 'A1::ReduceOrdered'. This is however always expected enabled for TCO.
3539+ The only instance of the remaining use is 'A1::ReduceOrdered'. This is however always expected enabled for TCO.
35403540 A new macro 'NPL_Impl_NPLA1_Enable_InlineDirect' is added to tweak implementations on asynchronous calls.
35413541 The macro specifies the outermost asynchronous calls formally composed by function templates like 'NPL::RelayNext' or 'NPL::RelaySwitched' now split and being synchrnized sequentially.
35423542 This also means the inner calls (if any) composed by these function templates now usually ignore the return value 'ReductionStatus::Partial' in asynchronous implementations.
@@ -3605,7 +3605,7 @@
36053605 The old handling in module NPL::Dependency is now moved to NPL::NPLA1 in 'REPLContext::Preprocess'.
36063606 The new handling scan the term recursively, instead one pass.
36073607 Along with non-evaluated expressions, this has some performance overhead.
3608- The overall performance is still slighly better than ond one in general for less evaluation passes, though.
3608+ The overall performance is still slighly better than ond one in general for less evaluation passes, though.
36093609 Supposing 'passes' as a modifiable reference to a passes object (either of 'A1::EvaluationPasses' or of 'A1::TermPasses') and 'a' as the allocator, the old one can still be implemented (in C++) by new API (more efficiently) as:
36103610 passes += ystdex::bind1([](TermNode& term,
36113611 const ValueObject& pfx, const TokenValue& val,
@@ -3674,7 +3674,7 @@
36743674 A unary type trait 'ystdex::has_get_allocator' has been added to simplify the implementation.
36753675 The type trait has a 'value' data member as 'ture' if and only if the type being allocated has a 'get_alocator' satisfying the requirements above.
36763676 However, the code generated by x86_64-pc-linux G++ 9.3 shows this is actually a slightly worse.
3677- As the consequence, this stratagy is not enabled currently.
3677+ As the consequence, this stratagy is not enabled currently.
36783678 Some 'YB_ATTR(always_inline)' has been removed to allow the generated code being actually more efficiently.
36793679 This includes instance in YBase module YStandardEx::Any, for example.
36803680 YBase module YStandardEx::Allocator also has no benefits from additional 'YB_ATTR(always_inline)'.
@@ -3706,7 +3706,7 @@
37063706 The stashed sequence uses 'YSLib::forward_list' for efficiency.
37073707 The action sequence is exposed as a new class 'ReducerSequence' in 'ContextNode' based on 'YSLib::forward_list'.
37083708 The cleanup is specicically handled to ensure the destruction order of the actions, since 'YSLib::forward_list' has no guarantee on the order in the destruction.
3709- Another action sequence is internally handled as the stacked action.
3709+ Another action sequence is internally handled as the stacked action.
37103710 A guard type 'ReductionGuard' is also provided in class 'ContextNode' to be used in the derived code with 'A1::Guard'.
37113711 The guard is basically dyanmic to incoperate with other guards more effeciently.
37123712 The guard uses the stacked action to manage the protected actions in the outer continuations.
@@ -3790,7 +3790,7 @@
37903790 Currently only 'NPL::Reduce' calls guard the continuations.
37913791 They occur in REPL sessions, as well as loads of the external units.
37923792 Note that klisp which only uses explicit run of loop on FFI.
3793- REPL and loading a source file all do not create new barrier in this sense.
3793+ REPL and loading a source file all do not create new barrier in this sense.
37943794 Missing barriers may be simpler and more flexible here, albeit less security in the aspect of the stability of the REPL environment.
37953795 It seems worth a try.
37963796 To make it easily configurable by users, at least the operation to setup continuation barriers is needed to be available in the object language.
@@ -3966,7 +3966,7 @@
39663966 Although the library names can work without any prefix (by having a name of the dynamic library name with a postfix '.a'), now always have the 'lib' prefix.
39673967 This is more consistent to the current practice like Cygwin and MSYS2.
39683968 Note in such platforms dynamic libraries can have prefix other than 'lib' like 'cyg' or 'msys-' in the name of dynamic library files.
3969- Also note libraries may or may have the prefix. For example, Qt libraries in MSYS2's MinGW platforms has no 'lib' prefix in the DLL names, but many others have.
3969+ Also note libraries may or may have the prefix. For example, Qt libraries in MSYS2's MinGW platforms has no 'lib' prefix in the DLL names, but many others have.
39703970
39713971 $2020-11:
39723972
@@ -3994,5 +3994,19 @@
39943994 These include 'SHBuild_BuildApp' and 'SHBuild_BuildPrefix'.
39953995 Now 'SHBuild_BuildDir' is used for all cases (including stage 1).
39963996
3997+$2020-11:
3998+
3999+report.impl:
4000+The YSLib builds are revised.
4001+ 'SHBuild-common-options.sh' is simplified by the removal of stage 2 configurations.
4002+ They are still available in %SHBuild-YSLib-common.txt.
4003+ Unused stage 2 configurations are removed.
4004+ Now all NPLA1 build scripts accept 'SHBuild_LDFLAGS' and 'SHBuild_LIBS'.
4005+ The library building process in the build script 'SHBuild-YSLib-build.txt' has improved the workarounds.
4006+ There is now a warning to indicate the fix of flags is used.
4007+ It now detects sanitizers used with Linux G++.
4008+ As a workaround for performance, dynamic builds with address sanitizer adds '-fno-var-tracking-assignments'.
4009+ It still typically takes more than half an hour, though.
4010+
39974011 ////
39984012
diff -r 2843c4a3d41f -r a285f6f132e8 doc/ex.cpp
--- a/doc/ex.cpp Sun Dec 13 03:55:38 2020 +0800
+++ b/doc/ex.cpp Thu Dec 24 12:58:49 2020 +0800
@@ -1,5 +1,5 @@
11 /*
2- © 2009-2013 FrankHB.
2+ © 2009-2013, 2020 FrankHB.
33
44 This file is part of the YSLib project, and may only be used,
55 modified, and distributed under the terms of the YSLib project
@@ -11,13 +11,13 @@
1111 /*! \file ex.cpp
1212 \ingroup Documentation
1313 \brief 设计规则指定和附加说明 - 存档与临时文件。
14-\version r6434 *build 449 rev *
14+\version r6436
1515 \author FrankHB <frankhb1989@gmail.com>
1616 \since 早于 build 132
1717 \par 创建时间:
1818 2009-12-02 05:14:30 +0800
1919 \par 修改时间:
20- 2013-10-07 13:30 +0800
20+ 2020-12-24 12:01 +0800
2121 \par 文本编码:
2222 UTF-8
2323 \par 模块名称:
@@ -227,7 +227,7 @@
227227 $parser.state.style $= $natral_NPL;
228228 $macro_platform_mapping:
229229 \mac YCL_DS -> DS,
230-\mac YCL_MINGW32 -> MinGW32;
230+\mac YCL_Win32 -> {Win32, MinGW32};
231231
232232
233233 $DONE:
diff -r 2843c4a3d41f -r a285f6f132e8 test/test.sh
--- a/test/test.sh Sun Dec 13 03:55:38 2020 +0800
+++ b/test/test.sh Thu Dec 24 12:58:49 2020 +0800
@@ -14,13 +14,11 @@
1414 CXXFLAGS_OPT_UseAssert=true
1515 # shellcheck disable=2034
1616 SHBuild_Debug=debug
17-# shellcheck disable=2034
18-SHBuild_NoAdjustSubsystem=true
1917
2018 # shellcheck source=../Tools/Scripts/SHBuild-common-options.sh
2119 . "$SHBuild_ToolDir/SHBuild-common-options.sh" # for SHBuild_PrepareBuild,
2220 # SHBuild_GetBuildName, SHBuild_Pushd, SHBuild_Popd, SHBuild_CheckPCH,
23-# SHBuild_Puts;
21+# SHBuild_Puts and build options.
2422
2523 INCLUDE_PCH="$YSLib_BaseDir/YBase/include/stdinc.h"
2624 INCLUDES="-I$YSLib_BaseDir/YFramework/include \
@@ -46,7 +44,7 @@
4644
4745 # XXX: Value of several variables may contain whitespaces.
4846 # shellcheck disable=2086,2154
49-"$CXX" "$TestDir/YBase.cpp" -oYBase$EXESFX $CXXFLAGS $LDFLAGS $SHBuild_IncPCH \
47+"$CXX" "$TestDir/YBase.cpp" -oYBase $CXXFLAGS $LDFLAGS $SHBuild_IncPCH \
5048 $INCLUDES $LIBS "$@"
5149
5250 ./YBase
Show on old repository browser