Compare commits
301
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0b1f6ed09a | ||
|
|
fa2cb7883b | ||
|
|
2e1d5a50d8 | ||
|
|
9a44b606e8 | ||
|
|
01cdc3483c | ||
|
|
8cb8adf9b7 | ||
|
|
4d029b8f63 | ||
|
|
448e5e0f2e | ||
|
|
140023c551 | ||
|
|
f5df020920 | ||
|
|
22557de7f2 | ||
|
|
ae23664336 | ||
|
|
3d43898853 | ||
|
|
8b26b82863 | ||
|
|
b5a045b670 | ||
|
|
4dd741ab26 | ||
|
|
8d0f9082f2 | ||
|
|
e26fa5de83 | ||
|
|
dff41a451d | ||
|
|
7687170880 | ||
|
|
274f7dbfe0 | ||
|
|
6fc4828aad | ||
|
|
e882b751f3 | ||
|
|
fdf0eab428 | ||
|
|
975416ffc0 | ||
|
|
c3d1d436bc | ||
|
|
a0d2c4332f | ||
|
|
3c6ee745c3 | ||
|
|
9c9b2cacae | ||
|
|
a5048e8dd9 | ||
|
|
a5448b6c8b | ||
|
|
4c3b4b2a2b | ||
|
|
d0288f61d3 | ||
|
|
94b338844e | ||
|
|
c7dbd69076 | ||
|
|
aee8e4fe56 | ||
|
|
45a3da6414 | ||
|
|
d296d56f36 | ||
|
|
f69a86b714 | ||
|
|
5f83d31ece | ||
|
|
58502bda0b | ||
|
|
0a6f1e351d | ||
|
|
774d9c6cf3 | ||
|
|
16105b9833 | ||
|
|
1b1500534d | ||
|
|
36dbbdbb72 | ||
|
|
6118cd549e | ||
|
|
e62d47d725 | ||
|
|
2002b28cbb | ||
|
|
2a56bd9e36 | ||
|
|
f107311e0a | ||
|
|
95e8a2b516 | ||
|
|
8c30acc36f | ||
|
|
6cc9524fbb | ||
|
|
edf67bd765 | ||
|
|
97e8fa6621 | ||
|
|
b1f4ab80a0 | ||
|
|
04619d69b8 | ||
|
|
9804d03e1f | ||
|
|
9b4bad2783 | ||
|
|
f58326fab5 | ||
|
|
c47c440be2 | ||
|
|
1523ce53c1 | ||
|
|
68dc740f26 | ||
|
|
6e3371ad0a | ||
|
|
e5bb3b3829 | ||
|
|
6bdb76c461 | ||
|
|
3d82d5537c | ||
|
|
259220cf73 | ||
|
|
4df980c07b | ||
|
|
f0048561b7 | ||
|
|
7573820525 | ||
|
|
5175765beb | ||
|
|
35315e5c2e | ||
|
|
25a30f2db0 | ||
|
|
a6691785d8 | ||
|
|
458f106fdb | ||
|
|
501954d5aa | ||
|
|
814c9b57aa | ||
|
|
d7d411426d | ||
|
|
76238b9ab7 | ||
|
|
617e57260f | ||
|
|
ad4b60ef7c | ||
|
|
7403235131 | ||
|
|
30db6ce78e | ||
|
|
6f34bcda8f | ||
|
|
cb849ffbeb | ||
|
|
a8e1d5aae3 | ||
|
|
b632599a22 | ||
|
|
3f913d322f | ||
|
|
cdae95cf66 | ||
|
|
f36b113b00 | ||
|
|
954fcc121d | ||
|
|
c60ee515ee | ||
|
|
0008ef8d9b | ||
|
|
7357ee63c3 | ||
|
|
e0456ccfdf | ||
|
|
70c2b0e817 | ||
|
|
55076a6af2 | ||
|
|
ee4adbec91 | ||
|
|
eff036def9 | ||
|
|
d825807d46 | ||
|
|
a444785129 | ||
|
|
9deb1f2b0a | ||
|
|
a8606e7ce9 | ||
|
|
7dd17bbcbf | ||
|
|
8c5e1ee93f | ||
|
|
e809cadb0a | ||
|
|
ce199db516 | ||
|
|
cd814a13ac | ||
|
|
a6a453f3b8 | ||
|
|
8cfc027811 | ||
|
|
06938f94df | ||
|
|
597edf50b5 | ||
|
|
79b57974dc | ||
|
|
acfe572897 | ||
|
|
9b3ea0f675 | ||
|
|
9251a05e68 | ||
|
|
7413757522 | ||
|
|
3fcf24bf05 | ||
|
|
693567f0d8 | ||
|
|
98f26e503e | ||
|
|
1dfd77778e | ||
|
|
4b9ec1f4aa | ||
|
|
bd52e4af47 | ||
|
|
729c97255b | ||
|
|
60abdd9b58 | ||
|
|
5b8c40a4b1 | ||
|
|
21904bcbde | ||
|
|
4427df1ae8 | ||
|
|
19c1bb0cf6 | ||
|
|
b67894a411 | ||
|
|
d1e77398a8 | ||
|
|
179a97b763 | ||
|
|
f271e62139 | ||
|
|
4476f831f5 | ||
|
|
3618ecdad8 | ||
|
|
ac2c528c36 | ||
|
|
751750005b | ||
|
|
5b7381172b | ||
|
|
0d6faa1ccd | ||
|
|
4d31e6c26e | ||
|
|
3b3080a9f6 | ||
|
|
1b914f66bf | ||
|
|
9b86fa3762 | ||
|
|
31de1a727a | ||
|
|
f0316438a9 | ||
|
|
02c12ad919 | ||
|
|
a1f7ab6047 | ||
|
|
6c09446693 | ||
|
|
9882c08b41 | ||
|
|
1fb36494e2 | ||
|
|
cb796d6e08 | ||
|
|
557c437637 | ||
|
|
c0ef486e3d | ||
|
|
7a14d36614 | ||
|
|
7e1bd9ece3 | ||
|
|
4d0c2de9fe | ||
|
|
d2275e354d | ||
|
|
28821a3fc8 | ||
|
|
40e5a934ab | ||
|
|
a5ee3631c3 | ||
|
|
0c51650ae9 | ||
|
|
6d2f85de20 | ||
|
|
dbcca14632 | ||
|
|
9d13d5e64b | ||
|
|
1233589701 | ||
|
|
cd326bf172 | ||
|
|
b6d01a333a | ||
|
|
6ef2d21d52 | ||
|
|
e7ff6cacbc | ||
|
|
08902d8a97 | ||
|
|
a4006968d9 | ||
|
|
d6aac61b03 | ||
|
|
703055871b | ||
|
|
500d59bd30 | ||
|
|
fd0aa4c0fc | ||
|
|
3a1e408464 | ||
|
|
d80a12f061 | ||
|
|
1368d760bc | ||
|
|
9b49520dc2 | ||
|
|
0f48a8bc92 | ||
|
|
93e207f19d | ||
|
|
a201f0f383 | ||
|
|
1c9f5c8741 | ||
|
|
39ef112133 | ||
|
|
f14d3b58cf | ||
|
|
0187ddfaf3 | ||
|
|
9649c9074c | ||
|
|
05b875c564 | ||
|
|
d3e0d5789c | ||
|
|
11b101cd27 | ||
|
|
5bdefd0c25 | ||
|
|
a8516aa629 | ||
|
|
d9bbe48c46 | ||
|
|
12502ae524 | ||
|
|
932e04d6db | ||
|
|
962b2df00b | ||
|
|
d4d8fe187b | ||
|
|
e4e1451d4a | ||
|
|
3634214bbb | ||
|
|
7ee82af4aa | ||
|
|
e7d3979e0a | ||
|
|
1134511a98 | ||
|
|
71008a6aa8 | ||
|
|
0f818acbb7 | ||
|
|
4bd04113a8 | ||
|
|
6a484fdaef | ||
|
|
4c055148da | ||
|
|
2174632a4b | ||
|
|
60a9b8775d | ||
|
|
0d6bc7fc83 | ||
|
|
7d899dfff0 | ||
|
|
2fea9a2bbd | ||
|
|
7987c596f2 | ||
|
|
9fecbcc106 | ||
|
|
ad6b4e6f8f | ||
|
|
737753205d | ||
|
|
7caa74e545 | ||
|
|
f87cb71e7a | ||
|
|
65df3cd9fe | ||
|
|
7cf2f6d102 | ||
|
|
ed61282e22 | ||
|
|
75afeeeffa | ||
|
|
6607e4e824 | ||
|
|
eb45f86b3f | ||
|
|
b72fcddfe2 | ||
|
|
d261590825 | ||
|
|
713ea0845e | ||
|
|
e2a1c2f11c | ||
|
|
6f6229ef6e | ||
|
|
7476029a04 | ||
|
|
471313fea0 | ||
|
|
a3201caebd | ||
|
|
9cf2b1031b | ||
|
|
c5e9409992 | ||
|
|
2e4a20524c | ||
|
|
d4ed243e68 | ||
|
|
4c5c001bc8 | ||
|
|
71dcf14194 | ||
|
|
ce299372a0 | ||
|
|
ef9154f143 | ||
|
|
c7fcbf756c | ||
|
|
81d499ea31 | ||
|
|
4de3a63efd | ||
|
|
b6d1ba3fdb | ||
|
|
28437b46c3 | ||
|
|
4fa09fa5d6 | ||
|
|
f2e08d25db | ||
|
|
42a77f7b4b | ||
|
|
9bf722e8da | ||
|
|
5003483b1d | ||
|
|
c1cc3a7238 | ||
|
|
5a5cb4c044 | ||
|
|
4aa680d80d | ||
|
|
b63d1213ed | ||
|
|
2453c29945 | ||
|
|
8a32e272a4 | ||
|
|
c1a1d841e7 | ||
|
|
ae32db3ffa | ||
|
|
bd778f8dd4 | ||
|
|
103d88f85a | ||
|
|
aa6c33b39d | ||
|
|
52b58d0c7d | ||
|
|
93b4c9bd6b | ||
|
|
cfdc6e47f4 | ||
|
|
bc8789e840 | ||
|
|
14ead72e1a | ||
|
|
a6e0a802ec | ||
|
|
830d7561f9 | ||
|
|
6f8c6e12dd | ||
|
|
6f23bf98b4 | ||
|
|
3bfe6dba24 | ||
|
|
82d0339a65 | ||
|
|
3c9c7e0621 | ||
|
|
e83fde690f | ||
|
|
4ef5cbaad7 | ||
|
|
85469e495c | ||
|
|
05fa595fc5 | ||
|
|
72fd932a99 | ||
|
|
42b705be81 | ||
|
|
aa4f7bcd47 | ||
|
|
1f4a8eb5d1 | ||
|
|
2e7b2436f1 | ||
|
|
c7711541ec | ||
|
|
c6799de46b | ||
|
|
4b405eefc8 | ||
|
|
6b90b986b2 | ||
|
|
3175cb43a5 | ||
|
|
48a57e0116 | ||
|
|
269722c410 | ||
|
|
0b884f11fa | ||
|
|
958892fdd0 | ||
|
|
1806e5755f | ||
|
|
ce82e0c22d | ||
|
|
74f570670c | ||
|
|
9d25ea9cd7 | ||
|
|
b51e777fe9 | ||
|
|
a5a30fa3e2 | ||
|
|
552e9c6542 | ||
|
|
a5f5cc7742 |
@@ -1,3 +1,3 @@
|
||||
Important Note
|
||||
==========
|
||||
Please do not file issues with Tcl on Github. They are unlikely to be noticed in a timely fashion. Tcl issues are hosted in the [tcl fossil repository on core.tcl.tk](https://core.tcl.tk/tcl/tktnew); please post them there.
|
||||
Please do not file issues with Tcl on Github. They are unlikely to be noticed in a timely fashion. Tcl issues are hosted in the [tcl fossil repository on core.tcl-lang.org](https://core.tcl-lang.org/tcl/tktnew); please post them there.
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
Important Note
|
||||
==========
|
||||
Please do not file pull requests with Tcl on Github. They are unlikely to be noticed in a timely fashion. Tcl issues (including patches) are hosted in the [tcl fossil repository on core.tcl.tk](https://core.tcl.tk/tcl/tktnew); please post them there.
|
||||
Please do not file pull requests with Tcl on Github. They are unlikely to be noticed in a timely fashion. Tcl issues (including patches) are hosted in the [tcl fossil repository on core.tcl-lang.org](https://core.tcl-lang.org/tcl/tktnew); please post them there.
|
||||
|
||||
@@ -2,7 +2,7 @@ name: macOS
|
||||
on: [push]
|
||||
jobs:
|
||||
xcode:
|
||||
runs-on: macos-11.0
|
||||
runs-on: macos-11
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
ERROR_ON_FAILURES: 1
|
||||
MAC_CI: 1
|
||||
clang:
|
||||
runs-on: macos-11.0
|
||||
runs-on: macos-11
|
||||
strategy:
|
||||
matrix:
|
||||
cfgopt:
|
||||
|
||||
@@ -3,7 +3,7 @@ on: [push]
|
||||
jobs:
|
||||
linux:
|
||||
name: Linux
|
||||
runs-on: ubuntu-16.04
|
||||
runs-on: ubuntu-18.04
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
@@ -27,18 +27,18 @@ jobs:
|
||||
working-directory: unix
|
||||
- name: Package
|
||||
run: |
|
||||
cp ../unix/tclsh tclsh${TCL_PATCHLEVEL}_unofficial
|
||||
chmod +x tclsh${TCL_PATCHLEVEL}_unofficial
|
||||
tar -cf tclsh${TCL_PATCHLEVEL}_unofficial.tar tclsh${TCL_PATCHLEVEL}_unofficial
|
||||
cp ../unix/tclsh tclsh${TCL_PATCHLEVEL}_snapshot
|
||||
chmod +x tclsh${TCL_PATCHLEVEL}_snapshot
|
||||
tar -cf tclsh${TCL_PATCHLEVEL}_snapshot.tar tclsh${TCL_PATCHLEVEL}_snapshot
|
||||
working-directory: 1dist
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Tclsh ${{ env.TCL_PATCHLEVEL }} Linux single-file build (unofficial)
|
||||
name: Tclsh ${{ env.TCL_PATCHLEVEL }} Linux single-file build (snapshot)
|
||||
path: 1dist/*.tar
|
||||
macos:
|
||||
name: macOS
|
||||
runs-on: macos-11.0
|
||||
runs-on: macos-11
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
@@ -74,8 +74,8 @@ jobs:
|
||||
- name: Package
|
||||
run: |
|
||||
mkdir contents
|
||||
cp $TCL_BIN contents/tclsh${TCL_PATCHLEVEL}_unofficial
|
||||
chmod +x contents/tclsh${TCL_PATCHLEVEL}_unofficial
|
||||
cp $TCL_BIN contents/tclsh${TCL_PATCHLEVEL}_snapshot
|
||||
chmod +x contents/tclsh${TCL_PATCHLEVEL}_snapshot
|
||||
cat > contents/README.txt <<EOF
|
||||
This is a single-file executable developer preview of Tcl $TCL_PATCHLEVEL
|
||||
|
||||
@@ -83,32 +83,38 @@ jobs:
|
||||
Use strictly at your own risk.
|
||||
|
||||
To run it, you need to copy the executable out and run:
|
||||
xattr -d com.apple.quarantine tclsh${TCL_PATCHLEVEL}_unofficial
|
||||
xattr -d com.apple.quarantine tclsh${TCL_PATCHLEVEL}_snapshot
|
||||
to mark the executable as runnable on your machine.
|
||||
EOF
|
||||
$CREATE_DMG \
|
||||
--volname "Tcl $TCL_PATCHLEVEL (unofficial)" \
|
||||
--volname "Tcl $TCL_PATCHLEVEL (snapshot)" \
|
||||
--window-pos 200 120 \
|
||||
--window-size 800 400 \
|
||||
"Tcl-$TCL_PATCHLEVEL-(unofficial).dmg" \
|
||||
"Tcl-$TCL_PATCHLEVEL-(snapshot).dmg" \
|
||||
"contents/"
|
||||
working-directory: 1dist
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Tclsh ${{ env.TCL_PATCHLEVEL }} macOS single-file build (unofficial)
|
||||
name: Tclsh ${{ env.TCL_PATCHLEVEL }} macOS single-file build (snapshot)
|
||||
path: 1dist/*.dmg
|
||||
win:
|
||||
name: Windows
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
shell: msys2 {0}
|
||||
env:
|
||||
CC: gcc
|
||||
CFGOPT: --disable-symbols --disable-shared
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install MSYS2
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: UCRT64
|
||||
install: git mingw-w64-ucrt-x86_64-toolchain make zip
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Prepare
|
||||
run: |
|
||||
touch generic/tclStubInit.c generic/tclOOStubInit.c
|
||||
@@ -116,7 +122,7 @@ jobs:
|
||||
mkdir 1dist
|
||||
working-directory: .
|
||||
- name: Configure
|
||||
run: ./configure --disable-symbols --disable-shared --enable-zipfs
|
||||
run: ./configure $CFGOPT
|
||||
working-directory: win
|
||||
- name: Build
|
||||
run: |
|
||||
@@ -129,10 +135,10 @@ jobs:
|
||||
working-directory: win
|
||||
- name: Set Executable Name
|
||||
run: |
|
||||
cp ../win/tclsh*.exe tclsh${TCL_PATCHLEVEL}_unofficial.exe
|
||||
cp ../win/tclsh*.exe tclsh${TCL_PATCHLEVEL}_snapshot.exe
|
||||
working-directory: 1dist
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Tclsh ${{ env.TCL_PATCHLEVEL }} Windows single-file build (unofficial)
|
||||
path: '1dist/*_unofficial.exe'
|
||||
name: Tclsh ${{ env.TCL_PATCHLEVEL }} Windows single-file build (snapshot)
|
||||
path: '1dist/*_snapshot.exe'
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
name: Windows
|
||||
on: [push]
|
||||
env:
|
||||
ERROR_ON_FAILURES: 1
|
||||
jobs:
|
||||
msvc:
|
||||
runs-on: windows-latest
|
||||
@@ -41,13 +43,12 @@ jobs:
|
||||
throw "nmake exit code: $lastexitcode"
|
||||
}
|
||||
env:
|
||||
ERROR_ON_FAILURES: 1
|
||||
CI_BUILD_WITH_MSVC: 1
|
||||
gcc:
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
shell: msys2 {0}
|
||||
working-directory: win
|
||||
strategy:
|
||||
matrix:
|
||||
@@ -60,10 +61,13 @@ jobs:
|
||||
- "--enable-symbols=mem"
|
||||
# Using powershell means we need to explicitly stop on failure
|
||||
steps:
|
||||
- name: Install MSYS2
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: MINGW64
|
||||
install: git mingw-w64-x86_64-toolchain make
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install MSYS2 and Make
|
||||
run: choco install msys2 make
|
||||
- name: Prepare
|
||||
run: |
|
||||
touch tclStubInit.c tclOOStubInit.c tclOOScript.h
|
||||
@@ -80,8 +84,6 @@ jobs:
|
||||
run: make tcltest
|
||||
- name: Run Tests
|
||||
run: make test
|
||||
env:
|
||||
ERROR_ON_FAILURES: 1
|
||||
|
||||
# If you add builds with Wine, be sure to define the environment variable
|
||||
# CI_USING_WINE when running them so that broken tests know not to run.
|
||||
|
||||
@@ -8096,7 +8096,7 @@ a better first place to look now.
|
||||
2009-03-25 Jan Nijtmans <nijtmans@users.sf.net>
|
||||
|
||||
* doc/tclsh.1: Bring doc and tools in line with
|
||||
* tools/installData.tcl: http://wiki.tcl.tk/812
|
||||
* tools/installData.tcl: https://wiki.tcl-lang.org/page/exec+magic
|
||||
* tools/str2c
|
||||
* tools/tcltk-man2html.tcl
|
||||
|
||||
|
||||
+1
-1
@@ -345,7 +345,7 @@
|
||||
* library/clock.tcl: Corrected the regular expressions that match a
|
||||
time zone to allow for time zones specified as +HH or -HH.
|
||||
* tests/clock.test: Added regression test case for the above issue.
|
||||
Thanks to Rolf Ade for reporting this issue [http://wiki.tcl.tk/13094]
|
||||
Thanks to Rolf Ade for reporting this issue [https://wiki.tcl-lang.org/page/Parsing+ISO8601+dates+and+times]
|
||||
* win/tclWinDde.c (Tcl_DdeObjCmd): Corrected a typo that caused a
|
||||
compilation failure on VC++.
|
||||
|
||||
|
||||
+1
-1
@@ -5262,7 +5262,7 @@
|
||||
* generic/tclStrToD.c: Added code to support the "middle endian"
|
||||
floating point format used in the Nokia N770's software-based floating
|
||||
point. Thanks to Bruce Johnson for reporting this bug, originally on
|
||||
http://wiki.tcl.tk/15408.
|
||||
https://wiki.tcl-lang.org/page/Nokia+770.
|
||||
* library/clock.tcl: Fixed a bug with Daylight Saving Time and Posix
|
||||
time zone specifiers reported by Martin Lemburg in
|
||||
http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/9a8b15a4dfc0b7a0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# README: Tcl
|
||||
|
||||
This is the **Tcl 8.7a4** source distribution.
|
||||
This is the **Tcl 8.7a6** source distribution.
|
||||
|
||||
You can get any source release of Tcl from [our distribution
|
||||
site](https://sourceforge.net/projects/tcl/files/Tcl/).
|
||||
@@ -45,7 +45,7 @@ and selling it either in whole or in part. See the file
|
||||
## <a id="doc">2.</a> Documentation
|
||||
Extensive documentation is available on our website.
|
||||
The home page for this release, including new features, is
|
||||
[here](https://www.tcl.tk/software/tcltk/8.7.html).
|
||||
[here](https://www.tcl-lang.org/software/tcltk/8.7.html).
|
||||
Detailed release notes can be found at the
|
||||
[file distributions page](https://sourceforge.net/projects/tcl/files/Tcl/)
|
||||
by clicking on the relevant version.
|
||||
@@ -96,7 +96,7 @@ Tcl Dev Kit builds on the earlier TclPro toolset and provides a debugger,
|
||||
static code checker, single-file wrapping utility, bytecode compiler, and
|
||||
more. More information can be found at
|
||||
|
||||
http://www.ActiveState.com/Tcl
|
||||
https://www.activestate.com/products/tcl/
|
||||
|
||||
## <a id="complangtcl">5.</a> Tcl newsgroup
|
||||
There is a USENET newsgroup, "`comp.lang.tcl`", intended for the exchange of
|
||||
|
||||
@@ -8843,7 +8843,7 @@ in this changeset (new minor version) rather than bug fixes:
|
||||
|
||||
2017-09-02 (bug)[0e4d88] replace command, delete trace kills namespace (porter)
|
||||
|
||||
--- Released 8.7a1, September 8, 2017 --- http://core.tcl.tk/tcl/ for details
|
||||
--- Released 8.7a1, September 8, 2017 --- https://core.tcl-lang.org/tcl/ for details
|
||||
|
||||
2017-08-10 [array names -regexp] supports backrefs (goth)
|
||||
|
||||
@@ -8942,7 +8942,7 @@ in this changeset (new minor version) rather than bug fixes:
|
||||
|
||||
2018-11-16 (bug)[00d04c] Repair [binary encode base64] (sebres)
|
||||
|
||||
- Released 8.6.9, November 16, 2018 - details at http://core.tcl-lang.org/tcl/ -
|
||||
- Released 8.6.9, November 16, 2018 - details at https://core.tcl-lang.org/tcl/ -
|
||||
|
||||
2018-11-22 (bug)[7a9dc5] [file normalize ~/~foo] segfault (sebres)
|
||||
|
||||
@@ -8990,7 +8990,7 @@ in this changeset (new minor version) rather than bug fixes:
|
||||
|
||||
2019-11-15 (bug)[135804] segfault in [next] after destroy (coulter,sebres)
|
||||
|
||||
- Released 8.6.10, Nov 21, 2019 - details at http://core.tcl-lang.org/tcl/ -
|
||||
- Released 8.6.10, Nov 21, 2019 - details at https://core.tcl-lang.org/tcl/ -
|
||||
|
||||
2019-12-03 (bug)[3cd9be] Corner case in surrogate handling (nijtmans)
|
||||
|
||||
@@ -9119,7 +9119,7 @@ See RFC 2045
|
||||
|
||||
2020-12-23 tzdata updated to Olson's tzdata2020e (jima)
|
||||
|
||||
- Released 8.6.11, Dec 31, 2020 - details at http://core.tcl-lang.org/tcl/ -
|
||||
- Released 8.6.11, Dec 31, 2020 - details at https://core.tcl-lang.org/tcl/ -
|
||||
|
||||
Changes to 8.7a3 include all changes to the 8.6 line through 8.6.10,
|
||||
plus the following, which focuses on the high-level feature changes
|
||||
@@ -9228,6 +9228,9 @@ in this changeset (new minor version) rather than bug fixes:
|
||||
|
||||
2019-04-16 [TIP 342] [dict getwithdefault]
|
||||
|
||||
2019-04-23 (bug)[67a5ea] make [chan postevent] asynchronous
|
||||
*** POTENTIAL INCOMPATIBILITY ***
|
||||
|
||||
2019-05-25 [TIP 431] [file tempdir]
|
||||
|
||||
2019-05-25 [TIP 383] [coroinject], [coroprobe]
|
||||
@@ -9254,4 +9257,76 @@ Changes to 8.7a5 include all changes to the 8.6 line through 8.6.11,
|
||||
plus the following, which focuses on the high-level feature changes
|
||||
in this changeset (new minor version) rather than bug fixes:
|
||||
|
||||
- Released 8.7a5, Jan 21, 2021 --- http://core.tcl-lang.org/tcl/ for details -
|
||||
2019-12-13 [TIP 538] Externalize libtommath
|
||||
|
||||
2020-01-20 [TIP 542] Support for switchable Full Unicode support
|
||||
|
||||
2020-01-21 [TIP 543] Eliminate `TCL_INTERP_DESTROYED` flag value
|
||||
|
||||
2020-01-24 [TIP 559] Eliminate public routine `Tcl_FreeResult
|
||||
|
||||
2020-01-31 (new) Implement 64-bit seek on Zip channels. (nijtmans)
|
||||
|
||||
2020-02-28 [TIP 557] C++ support for Tcl
|
||||
|
||||
2020-02-28 [TIP 562] Deprecate channel types 1-4
|
||||
|
||||
2020-03-11 (bug)[234d6c] Segfault in [set l {}; lpop l] (sebres)
|
||||
|
||||
2020-03-12 (bug) Crash in tests binary-79.[12] (porter)
|
||||
|
||||
2020-03-13 [TIP 569] Eliminate Comments That Serve Lint
|
||||
|
||||
2020-04-06 (bug)[dd010c] [string trim*] on astral characters (porter,nijtmans)
|
||||
|
||||
2020-05-30 [TIP 551] Permit underscore in numerical literals in source code
|
||||
|
||||
2020-07-03 [TIP 578] Death to TCL_DBGX
|
||||
|
||||
2020-08-11 (bug)[e87000] Win32 crash in [fconfigure stdout] (werner,nijtmans)
|
||||
|
||||
2020-09-06 (bug)[c1a376] deletion trace on imported ensemble (coulter)
|
||||
|
||||
2020-09-13 [TIP 585] Promote the INDEX_TEMP_TABLE flag of Tcl_GetIndexFromObj*() to the public interface
|
||||
|
||||
2020-09-15 (bug)[b5777d] crash in [string index abcd 0-0x10000000000000000]
|
||||
|
||||
2020-09-19 [b9ecf3] revised stork mgmt [uplevel [list $cmd ...]] (coulter)
|
||||
|
||||
2020-10-23 [TIP 587] Default utf-8 for source command
|
||||
|
||||
2020-10-27 (bug)[11229b] test string-31.26.* (porter)
|
||||
|
||||
2020-11-08 [TIP 582] Comments in Expressions
|
||||
|
||||
2020-11-16 [TIP 586] C String Parsing Support for binary scan
|
||||
|
||||
2020-12-07 [TIP 590] Recommend lowercase Package Names
|
||||
|
||||
2021-01-06 Bump to tcltest 2.5.4
|
||||
|
||||
2021-01-15 [TIP 481] `Tcl_GetStringFromObj()` with `size_t` length parameter
|
||||
|
||||
2021-01-15 [TIP 592] End support: Windows XP, Server 2003, Vista, Server 2008
|
||||
|
||||
2021-01-25 tzdata updated to Olson's tzdata2021a (nijtmans)
|
||||
|
||||
2021-01-29 (bug)[113be1] zipfs on mac
|
||||
|
||||
2021-03-15 [TIP 575] Switchable Tcl_UtfCharComplete()/Tcl_UtfNext()/Tcl_UtfPrev()
|
||||
|
||||
2021-03-19 (new)[0221b9] Drop TCL_WINDOW_EVENTS from Tcl's [update idletasks]
|
||||
|
||||
2021-03-30 (new)[4b4830] [chan truncate] for reflected channels
|
||||
|
||||
2021-04-30 [TIP 597] "string is unicode" and better utf-8/utf-16/cesu-8 encodings
|
||||
|
||||
2021-04-09 [TIP 598] export TclWinConvertError
|
||||
|
||||
2021-05-15 (bug)[463b7a] segfault from Tcl_Unload (coulter)
|
||||
|
||||
2021-05-15 (bug)[fb2a41] tclZipfs.c free all memory (coulter)
|
||||
|
||||
2021-05-18 (bug)[688fcc,28027d] namespace teardown reform (coulter)
|
||||
|
||||
- Released 8.7a5, Jun 18, 2021 --- http://core.tcl-lang.org/tcl/ for details -
|
||||
|
||||
@@ -1,186 +1,186 @@
|
||||
/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding
|
||||
* version for AMD64 on Windows using Microsoft C compiler
|
||||
*
|
||||
* Copyright (C) 1995-2003 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*
|
||||
* Copyright (C) 2003 Chris Anderson <christop@charm.net>
|
||||
* Please use the copyright conditions above.
|
||||
*
|
||||
* 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant
|
||||
*
|
||||
* inffas8664.c call function inffas8664fnc in inffasx64.asm
|
||||
* inffasx64.asm is automatically convert from AMD64 portion of inffas86.c
|
||||
*
|
||||
* Dec-29-2003 -- I added AMD64 inflate asm support. This version is also
|
||||
* slightly quicker on x86 systems because, instead of using rep movsb to copy
|
||||
* data, it uses rep movsw, which moves data in 2-byte chunks instead of single
|
||||
* bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates
|
||||
* from http://fedora.linux.duke.edu/fc1_x86_64
|
||||
* which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with
|
||||
* 1GB ram. The 64-bit version is about 4% faster than the 32-bit version,
|
||||
* when decompressing mozilla-source-1.3.tar.gz.
|
||||
*
|
||||
* Mar-13-2003 -- Most of this is derived from inffast.S which is derived from
|
||||
* the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at
|
||||
* the moment. I have successfully compiled and tested this code with gcc2.96,
|
||||
* gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S
|
||||
* compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX
|
||||
* enabled. I will attempt to merge the MMX code into this version. Newer
|
||||
* versions of this and inffast.S can be found at
|
||||
* http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "zutil.h"
|
||||
#include "inftrees.h"
|
||||
#include "inflate.h"
|
||||
#include "inffast.h"
|
||||
|
||||
/* Mark Adler's comments from inffast.c: */
|
||||
|
||||
/*
|
||||
Decode literal, length, and distance codes and write out the resulting
|
||||
literal and match bytes until either not enough input or output is
|
||||
available, an end-of-block is encountered, or a data error is encountered.
|
||||
When large enough input and output buffers are supplied to inflate(), for
|
||||
example, a 16K input buffer and a 64K output buffer, more than 95% of the
|
||||
inflate execution time is spent in this routine.
|
||||
|
||||
Entry assumptions:
|
||||
|
||||
state->mode == LEN
|
||||
strm->avail_in >= 6
|
||||
strm->avail_out >= 258
|
||||
start >= strm->avail_out
|
||||
state->bits < 8
|
||||
|
||||
On return, state->mode is one of:
|
||||
|
||||
LEN -- ran out of enough output space or enough available input
|
||||
TYPE -- reached end of block code, inflate() to interpret next block
|
||||
BAD -- error in block data
|
||||
|
||||
Notes:
|
||||
|
||||
- The maximum input bits used by a length/distance pair is 15 bits for the
|
||||
length code, 5 bits for the length extra, 15 bits for the distance code,
|
||||
and 13 bits for the distance extra. This totals 48 bits, or six bytes.
|
||||
Therefore if strm->avail_in >= 6, then there is enough input to avoid
|
||||
checking for available input while decoding.
|
||||
|
||||
- The maximum bytes that a single length/distance pair can output is 258
|
||||
bytes, which is the maximum length that can be coded. inflate_fast()
|
||||
requires strm->avail_out >= 258 for each loop to avoid checking for
|
||||
output space.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
typedef struct inffast_ar {
|
||||
/* 64 32 x86 x86_64 */
|
||||
/* ar offset register */
|
||||
/* 0 0 */ void *esp; /* esp save */
|
||||
/* 8 4 */ void *ebp; /* ebp save */
|
||||
/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */
|
||||
/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */
|
||||
/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */
|
||||
/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */
|
||||
/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */
|
||||
/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */
|
||||
/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */
|
||||
/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */
|
||||
/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */
|
||||
/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */
|
||||
/* 92 48 */ unsigned wsize; /* window size */
|
||||
/* 96 52 */ unsigned write; /* window write index */
|
||||
/*100 56 */ unsigned lmask; /* r12 mask for lcode */
|
||||
/*104 60 */ unsigned dmask; /* r13 mask for dcode */
|
||||
/*108 64 */ unsigned len; /* r14 match length */
|
||||
/*112 68 */ unsigned dist; /* r15 match distance */
|
||||
/*116 72 */ unsigned status; /* set when state chng*/
|
||||
} type_ar;
|
||||
#ifdef ASMINF
|
||||
|
||||
void inflate_fast(strm, start)
|
||||
z_streamp strm;
|
||||
unsigned start; /* inflate()'s starting value for strm->avail_out */
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
type_ar ar;
|
||||
void inffas8664fnc(struct inffast_ar * par);
|
||||
|
||||
|
||||
|
||||
#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64))
|
||||
#define PAD_AVAIL_IN 6
|
||||
#define PAD_AVAIL_OUT 258
|
||||
#else
|
||||
#define PAD_AVAIL_IN 5
|
||||
#define PAD_AVAIL_OUT 257
|
||||
#endif
|
||||
|
||||
/* copy state to local variables */
|
||||
state = (struct inflate_state FAR *)strm->state;
|
||||
|
||||
ar.in = strm->next_in;
|
||||
ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN);
|
||||
ar.out = strm->next_out;
|
||||
ar.beg = ar.out - (start - strm->avail_out);
|
||||
ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT);
|
||||
ar.wsize = state->wsize;
|
||||
ar.write = state->wnext;
|
||||
ar.window = state->window;
|
||||
ar.hold = state->hold;
|
||||
ar.bits = state->bits;
|
||||
ar.lcode = state->lencode;
|
||||
ar.dcode = state->distcode;
|
||||
ar.lmask = (1U << state->lenbits) - 1;
|
||||
ar.dmask = (1U << state->distbits) - 1;
|
||||
|
||||
/* decode literals and length/distances until end-of-block or not enough
|
||||
input data or output space */
|
||||
|
||||
/* align in on 1/2 hold size boundary */
|
||||
while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) {
|
||||
ar.hold += (unsigned long)*ar.in++ << ar.bits;
|
||||
ar.bits += 8;
|
||||
}
|
||||
|
||||
inffas8664fnc(&ar);
|
||||
|
||||
if (ar.status > 1) {
|
||||
if (ar.status == 2)
|
||||
strm->msg = "invalid literal/length code";
|
||||
else if (ar.status == 3)
|
||||
strm->msg = "invalid distance code";
|
||||
else
|
||||
strm->msg = "invalid distance too far back";
|
||||
state->mode = BAD;
|
||||
}
|
||||
else if ( ar.status == 1 ) {
|
||||
state->mode = TYPE;
|
||||
}
|
||||
|
||||
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */
|
||||
ar.len = ar.bits >> 3;
|
||||
ar.in -= ar.len;
|
||||
ar.bits -= ar.len << 3;
|
||||
ar.hold &= (1U << ar.bits) - 1;
|
||||
|
||||
/* update state and return */
|
||||
strm->next_in = ar.in;
|
||||
strm->next_out = ar.out;
|
||||
strm->avail_in = (unsigned)(ar.in < ar.last ?
|
||||
PAD_AVAIL_IN + (ar.last - ar.in) :
|
||||
PAD_AVAIL_IN - (ar.in - ar.last));
|
||||
strm->avail_out = (unsigned)(ar.out < ar.end ?
|
||||
PAD_AVAIL_OUT + (ar.end - ar.out) :
|
||||
PAD_AVAIL_OUT - (ar.out - ar.end));
|
||||
state->hold = (unsigned long)ar.hold;
|
||||
state->bits = ar.bits;
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
||||
/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding
|
||||
* version for AMD64 on Windows using Microsoft C compiler
|
||||
*
|
||||
* Copyright (C) 1995-2003 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*
|
||||
* Copyright (C) 2003 Chris Anderson <christop@charm.net>
|
||||
* Please use the copyright conditions above.
|
||||
*
|
||||
* 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant
|
||||
*
|
||||
* inffas8664.c call function inffas8664fnc in inffasx64.asm
|
||||
* inffasx64.asm is automatically convert from AMD64 portion of inffas86.c
|
||||
*
|
||||
* Dec-29-2003 -- I added AMD64 inflate asm support. This version is also
|
||||
* slightly quicker on x86 systems because, instead of using rep movsb to copy
|
||||
* data, it uses rep movsw, which moves data in 2-byte chunks instead of single
|
||||
* bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates
|
||||
* from http://fedora.linux.duke.edu/fc1_x86_64
|
||||
* which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with
|
||||
* 1GB ram. The 64-bit version is about 4% faster than the 32-bit version,
|
||||
* when decompressing mozilla-source-1.3.tar.gz.
|
||||
*
|
||||
* Mar-13-2003 -- Most of this is derived from inffast.S which is derived from
|
||||
* the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at
|
||||
* the moment. I have successfully compiled and tested this code with gcc2.96,
|
||||
* gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S
|
||||
* compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX
|
||||
* enabled. I will attempt to merge the MMX code into this version. Newer
|
||||
* versions of this and inffast.S can be found at
|
||||
* http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "zutil.h"
|
||||
#include "inftrees.h"
|
||||
#include "inflate.h"
|
||||
#include "inffast.h"
|
||||
|
||||
/* Mark Adler's comments from inffast.c: */
|
||||
|
||||
/*
|
||||
Decode literal, length, and distance codes and write out the resulting
|
||||
literal and match bytes until either not enough input or output is
|
||||
available, an end-of-block is encountered, or a data error is encountered.
|
||||
When large enough input and output buffers are supplied to inflate(), for
|
||||
example, a 16K input buffer and a 64K output buffer, more than 95% of the
|
||||
inflate execution time is spent in this routine.
|
||||
|
||||
Entry assumptions:
|
||||
|
||||
state->mode == LEN
|
||||
strm->avail_in >= 6
|
||||
strm->avail_out >= 258
|
||||
start >= strm->avail_out
|
||||
state->bits < 8
|
||||
|
||||
On return, state->mode is one of:
|
||||
|
||||
LEN -- ran out of enough output space or enough available input
|
||||
TYPE -- reached end of block code, inflate() to interpret next block
|
||||
BAD -- error in block data
|
||||
|
||||
Notes:
|
||||
|
||||
- The maximum input bits used by a length/distance pair is 15 bits for the
|
||||
length code, 5 bits for the length extra, 15 bits for the distance code,
|
||||
and 13 bits for the distance extra. This totals 48 bits, or six bytes.
|
||||
Therefore if strm->avail_in >= 6, then there is enough input to avoid
|
||||
checking for available input while decoding.
|
||||
|
||||
- The maximum bytes that a single length/distance pair can output is 258
|
||||
bytes, which is the maximum length that can be coded. inflate_fast()
|
||||
requires strm->avail_out >= 258 for each loop to avoid checking for
|
||||
output space.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
typedef struct inffast_ar {
|
||||
/* 64 32 x86 x86_64 */
|
||||
/* ar offset register */
|
||||
/* 0 0 */ void *esp; /* esp save */
|
||||
/* 8 4 */ void *ebp; /* ebp save */
|
||||
/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */
|
||||
/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */
|
||||
/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */
|
||||
/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */
|
||||
/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */
|
||||
/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */
|
||||
/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */
|
||||
/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */
|
||||
/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */
|
||||
/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */
|
||||
/* 92 48 */ unsigned wsize; /* window size */
|
||||
/* 96 52 */ unsigned write; /* window write index */
|
||||
/*100 56 */ unsigned lmask; /* r12 mask for lcode */
|
||||
/*104 60 */ unsigned dmask; /* r13 mask for dcode */
|
||||
/*108 64 */ unsigned len; /* r14 match length */
|
||||
/*112 68 */ unsigned dist; /* r15 match distance */
|
||||
/*116 72 */ unsigned status; /* set when state chng*/
|
||||
} type_ar;
|
||||
#ifdef ASMINF
|
||||
|
||||
void inflate_fast(strm, start)
|
||||
z_streamp strm;
|
||||
unsigned start; /* inflate()'s starting value for strm->avail_out */
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
type_ar ar;
|
||||
void inffas8664fnc(struct inffast_ar * par);
|
||||
|
||||
|
||||
|
||||
#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64))
|
||||
#define PAD_AVAIL_IN 6
|
||||
#define PAD_AVAIL_OUT 258
|
||||
#else
|
||||
#define PAD_AVAIL_IN 5
|
||||
#define PAD_AVAIL_OUT 257
|
||||
#endif
|
||||
|
||||
/* copy state to local variables */
|
||||
state = (struct inflate_state FAR *)strm->state;
|
||||
|
||||
ar.in = strm->next_in;
|
||||
ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN);
|
||||
ar.out = strm->next_out;
|
||||
ar.beg = ar.out - (start - strm->avail_out);
|
||||
ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT);
|
||||
ar.wsize = state->wsize;
|
||||
ar.write = state->wnext;
|
||||
ar.window = state->window;
|
||||
ar.hold = state->hold;
|
||||
ar.bits = state->bits;
|
||||
ar.lcode = state->lencode;
|
||||
ar.dcode = state->distcode;
|
||||
ar.lmask = (1U << state->lenbits) - 1;
|
||||
ar.dmask = (1U << state->distbits) - 1;
|
||||
|
||||
/* decode literals and length/distances until end-of-block or not enough
|
||||
input data or output space */
|
||||
|
||||
/* align in on 1/2 hold size boundary */
|
||||
while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) {
|
||||
ar.hold += (unsigned long)*ar.in++ << ar.bits;
|
||||
ar.bits += 8;
|
||||
}
|
||||
|
||||
inffas8664fnc(&ar);
|
||||
|
||||
if (ar.status > 1) {
|
||||
if (ar.status == 2)
|
||||
strm->msg = "invalid literal/length code";
|
||||
else if (ar.status == 3)
|
||||
strm->msg = "invalid distance code";
|
||||
else
|
||||
strm->msg = "invalid distance too far back";
|
||||
state->mode = BAD;
|
||||
}
|
||||
else if ( ar.status == 1 ) {
|
||||
state->mode = TYPE;
|
||||
}
|
||||
|
||||
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */
|
||||
ar.len = ar.bits >> 3;
|
||||
ar.in -= ar.len;
|
||||
ar.bits -= ar.len << 3;
|
||||
ar.hold &= (1U << ar.bits) - 1;
|
||||
|
||||
/* update state and return */
|
||||
strm->next_in = ar.in;
|
||||
strm->next_out = ar.out;
|
||||
strm->avail_in = (unsigned)(ar.in < ar.last ?
|
||||
PAD_AVAIL_IN + (ar.last - ar.in) :
|
||||
PAD_AVAIL_IN - (ar.in - ar.last));
|
||||
strm->avail_out = (unsigned)(ar.out < ar.end ?
|
||||
PAD_AVAIL_OUT + (ar.end - ar.out) :
|
||||
PAD_AVAIL_OUT - (ar.out - ar.end));
|
||||
state->hold = (unsigned long)ar.hold;
|
||||
state->bits = ar.bits;
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,275 +1,275 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
|
||||
void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
|
||||
{
|
||||
R->HighPart = A.HighPart - B.HighPart;
|
||||
if (A.LowPart >= B.LowPart)
|
||||
R->LowPart = A.LowPart - B.LowPart;
|
||||
else
|
||||
{
|
||||
R->LowPart = A.LowPart - B.LowPart;
|
||||
R->HighPart --;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _M_X64
|
||||
// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
|
||||
unsigned __int64 __rdtsc(void);
|
||||
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
// printf("rdtsc = %I64x\n",__rdtsc());
|
||||
pbeginTime64->QuadPart=__rdtsc();
|
||||
}
|
||||
|
||||
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER LIres;
|
||||
unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
|
||||
LIres.QuadPart=res;
|
||||
// printf("rdtsc = %I64x\n",__rdtsc());
|
||||
return LIres;
|
||||
}
|
||||
#else
|
||||
#ifdef _M_IX86
|
||||
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
DWORD dwEdx,dwEax;
|
||||
_asm
|
||||
{
|
||||
rdtsc
|
||||
mov dwEax,eax
|
||||
mov dwEdx,edx
|
||||
}
|
||||
pbeginTime64->LowPart=dwEax;
|
||||
pbeginTime64->HighPart=dwEdx;
|
||||
}
|
||||
|
||||
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
myGetRDTSC32(pbeginTime64);
|
||||
}
|
||||
|
||||
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER LIres,endTime64;
|
||||
myGetRDTSC32(&endTime64);
|
||||
|
||||
LIres.LowPart=LIres.HighPart=0;
|
||||
MyDoMinus64(&LIres,endTime64,beginTime64);
|
||||
return LIres;
|
||||
}
|
||||
#else
|
||||
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
}
|
||||
|
||||
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
}
|
||||
|
||||
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER lr;
|
||||
lr.QuadPart=0;
|
||||
return lr;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
|
||||
{
|
||||
pbeginTime64->LowPart = GetTickCount();
|
||||
pbeginTime64->HighPart = 0;
|
||||
}
|
||||
}
|
||||
|
||||
DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER endTime64,ticksPerSecond,ticks;
|
||||
DWORDLONG ticksShifted,tickSecShifted;
|
||||
DWORD dwLog=16+0;
|
||||
DWORD dwRet;
|
||||
if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
|
||||
dwRet = (GetTickCount() - beginTime64.LowPart)*1;
|
||||
else
|
||||
{
|
||||
MyDoMinus64(&ticks,endTime64,beginTime64);
|
||||
QueryPerformanceFrequency(&ticksPerSecond);
|
||||
|
||||
|
||||
{
|
||||
ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
|
||||
tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
|
||||
|
||||
}
|
||||
|
||||
dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
|
||||
dwRet *=1;
|
||||
}
|
||||
return dwRet;
|
||||
}
|
||||
|
||||
int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
|
||||
{
|
||||
FILE* stream;
|
||||
unsigned char* ptr;
|
||||
int retVal=1;
|
||||
stream=fopen(filename, "rb");
|
||||
if (stream==NULL)
|
||||
return 0;
|
||||
|
||||
fseek(stream,0,SEEK_END);
|
||||
|
||||
*plFileSize=ftell(stream);
|
||||
fseek(stream,0,SEEK_SET);
|
||||
ptr=malloc((*plFileSize)+1);
|
||||
if (ptr==NULL)
|
||||
retVal=0;
|
||||
else
|
||||
{
|
||||
if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
|
||||
retVal=0;
|
||||
}
|
||||
fclose(stream);
|
||||
*pFilePtr=ptr;
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int BlockSizeCompress=0x8000;
|
||||
int BlockSizeUncompress=0x8000;
|
||||
int cprLevel=Z_DEFAULT_COMPRESSION ;
|
||||
long lFileSize;
|
||||
unsigned char* FilePtr;
|
||||
long lBufferSizeCpr;
|
||||
long lBufferSizeUncpr;
|
||||
long lCompressedSize=0;
|
||||
unsigned char* CprPtr;
|
||||
unsigned char* UncprPtr;
|
||||
long lSizeCpr,lSizeUncpr;
|
||||
DWORD dwGetTick,dwMsecQP;
|
||||
LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
|
||||
|
||||
if (argc<=1)
|
||||
{
|
||||
printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
|
||||
{
|
||||
printf("error reading %s\n",argv[1]);
|
||||
return 1;
|
||||
}
|
||||
else printf("file %s read, %u bytes\n",argv[1],lFileSize);
|
||||
|
||||
if (argc>=3)
|
||||
BlockSizeCompress=atol(argv[2]);
|
||||
|
||||
if (argc>=4)
|
||||
BlockSizeUncompress=atol(argv[3]);
|
||||
|
||||
if (argc>=5)
|
||||
cprLevel=(int)atol(argv[4]);
|
||||
|
||||
lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
|
||||
lBufferSizeUncpr = lBufferSizeCpr;
|
||||
|
||||
CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
|
||||
|
||||
BeginCountPerfCounter(&li_qp,TRUE);
|
||||
dwGetTick=GetTickCount();
|
||||
BeginCountRdtsc(&li_rdtsc);
|
||||
{
|
||||
z_stream zcpr;
|
||||
int ret=Z_OK;
|
||||
long lOrigToDo = lFileSize;
|
||||
long lOrigDone = 0;
|
||||
int step=0;
|
||||
memset(&zcpr,0,sizeof(z_stream));
|
||||
deflateInit(&zcpr,cprLevel);
|
||||
|
||||
zcpr.next_in = FilePtr;
|
||||
zcpr.next_out = CprPtr;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
long all_read_before = zcpr.total_in;
|
||||
zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
|
||||
zcpr.avail_out = BlockSizeCompress;
|
||||
ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
|
||||
lOrigDone += (zcpr.total_in-all_read_before);
|
||||
lOrigToDo -= (zcpr.total_in-all_read_before);
|
||||
step++;
|
||||
} while (ret==Z_OK);
|
||||
|
||||
lSizeCpr=zcpr.total_out;
|
||||
deflateEnd(&zcpr);
|
||||
dwGetTick=GetTickCount()-dwGetTick;
|
||||
dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
|
||||
dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
|
||||
printf("total compress size = %u, in %u step\n",lSizeCpr,step);
|
||||
printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
|
||||
printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
|
||||
printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
|
||||
}
|
||||
|
||||
CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
|
||||
UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
|
||||
|
||||
BeginCountPerfCounter(&li_qp,TRUE);
|
||||
dwGetTick=GetTickCount();
|
||||
BeginCountRdtsc(&li_rdtsc);
|
||||
{
|
||||
z_stream zcpr;
|
||||
int ret=Z_OK;
|
||||
long lOrigToDo = lSizeCpr;
|
||||
long lOrigDone = 0;
|
||||
int step=0;
|
||||
memset(&zcpr,0,sizeof(z_stream));
|
||||
inflateInit(&zcpr);
|
||||
|
||||
zcpr.next_in = CprPtr;
|
||||
zcpr.next_out = UncprPtr;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
long all_read_before = zcpr.total_in;
|
||||
zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
|
||||
zcpr.avail_out = BlockSizeUncompress;
|
||||
ret=inflate(&zcpr,Z_SYNC_FLUSH);
|
||||
lOrigDone += (zcpr.total_in-all_read_before);
|
||||
lOrigToDo -= (zcpr.total_in-all_read_before);
|
||||
step++;
|
||||
} while (ret==Z_OK);
|
||||
|
||||
lSizeUncpr=zcpr.total_out;
|
||||
inflateEnd(&zcpr);
|
||||
dwGetTick=GetTickCount()-dwGetTick;
|
||||
dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
|
||||
dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
|
||||
printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
|
||||
printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
|
||||
printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
|
||||
printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
|
||||
}
|
||||
|
||||
if (lSizeUncpr==lFileSize)
|
||||
{
|
||||
if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
|
||||
printf("compare ok\n");
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
|
||||
void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
|
||||
{
|
||||
R->HighPart = A.HighPart - B.HighPart;
|
||||
if (A.LowPart >= B.LowPart)
|
||||
R->LowPart = A.LowPart - B.LowPart;
|
||||
else
|
||||
{
|
||||
R->LowPart = A.LowPart - B.LowPart;
|
||||
R->HighPart --;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _M_X64
|
||||
// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
|
||||
unsigned __int64 __rdtsc(void);
|
||||
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
// printf("rdtsc = %I64x\n",__rdtsc());
|
||||
pbeginTime64->QuadPart=__rdtsc();
|
||||
}
|
||||
|
||||
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER LIres;
|
||||
unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
|
||||
LIres.QuadPart=res;
|
||||
// printf("rdtsc = %I64x\n",__rdtsc());
|
||||
return LIres;
|
||||
}
|
||||
#else
|
||||
#ifdef _M_IX86
|
||||
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
DWORD dwEdx,dwEax;
|
||||
_asm
|
||||
{
|
||||
rdtsc
|
||||
mov dwEax,eax
|
||||
mov dwEdx,edx
|
||||
}
|
||||
pbeginTime64->LowPart=dwEax;
|
||||
pbeginTime64->HighPart=dwEdx;
|
||||
}
|
||||
|
||||
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
myGetRDTSC32(pbeginTime64);
|
||||
}
|
||||
|
||||
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER LIres,endTime64;
|
||||
myGetRDTSC32(&endTime64);
|
||||
|
||||
LIres.LowPart=LIres.HighPart=0;
|
||||
MyDoMinus64(&LIres,endTime64,beginTime64);
|
||||
return LIres;
|
||||
}
|
||||
#else
|
||||
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
}
|
||||
|
||||
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
}
|
||||
|
||||
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER lr;
|
||||
lr.QuadPart=0;
|
||||
return lr;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
|
||||
{
|
||||
pbeginTime64->LowPart = GetTickCount();
|
||||
pbeginTime64->HighPart = 0;
|
||||
}
|
||||
}
|
||||
|
||||
DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER endTime64,ticksPerSecond,ticks;
|
||||
DWORDLONG ticksShifted,tickSecShifted;
|
||||
DWORD dwLog=16+0;
|
||||
DWORD dwRet;
|
||||
if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
|
||||
dwRet = (GetTickCount() - beginTime64.LowPart)*1;
|
||||
else
|
||||
{
|
||||
MyDoMinus64(&ticks,endTime64,beginTime64);
|
||||
QueryPerformanceFrequency(&ticksPerSecond);
|
||||
|
||||
|
||||
{
|
||||
ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
|
||||
tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
|
||||
|
||||
}
|
||||
|
||||
dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
|
||||
dwRet *=1;
|
||||
}
|
||||
return dwRet;
|
||||
}
|
||||
|
||||
int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
|
||||
{
|
||||
FILE* stream;
|
||||
unsigned char* ptr;
|
||||
int retVal=1;
|
||||
stream=fopen(filename, "rb");
|
||||
if (stream==NULL)
|
||||
return 0;
|
||||
|
||||
fseek(stream,0,SEEK_END);
|
||||
|
||||
*plFileSize=ftell(stream);
|
||||
fseek(stream,0,SEEK_SET);
|
||||
ptr=malloc((*plFileSize)+1);
|
||||
if (ptr==NULL)
|
||||
retVal=0;
|
||||
else
|
||||
{
|
||||
if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
|
||||
retVal=0;
|
||||
}
|
||||
fclose(stream);
|
||||
*pFilePtr=ptr;
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int BlockSizeCompress=0x8000;
|
||||
int BlockSizeUncompress=0x8000;
|
||||
int cprLevel=Z_DEFAULT_COMPRESSION ;
|
||||
long lFileSize;
|
||||
unsigned char* FilePtr;
|
||||
long lBufferSizeCpr;
|
||||
long lBufferSizeUncpr;
|
||||
long lCompressedSize=0;
|
||||
unsigned char* CprPtr;
|
||||
unsigned char* UncprPtr;
|
||||
long lSizeCpr,lSizeUncpr;
|
||||
DWORD dwGetTick,dwMsecQP;
|
||||
LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
|
||||
|
||||
if (argc<=1)
|
||||
{
|
||||
printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
|
||||
{
|
||||
printf("error reading %s\n",argv[1]);
|
||||
return 1;
|
||||
}
|
||||
else printf("file %s read, %u bytes\n",argv[1],lFileSize);
|
||||
|
||||
if (argc>=3)
|
||||
BlockSizeCompress=atol(argv[2]);
|
||||
|
||||
if (argc>=4)
|
||||
BlockSizeUncompress=atol(argv[3]);
|
||||
|
||||
if (argc>=5)
|
||||
cprLevel=(int)atol(argv[4]);
|
||||
|
||||
lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
|
||||
lBufferSizeUncpr = lBufferSizeCpr;
|
||||
|
||||
CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
|
||||
|
||||
BeginCountPerfCounter(&li_qp,TRUE);
|
||||
dwGetTick=GetTickCount();
|
||||
BeginCountRdtsc(&li_rdtsc);
|
||||
{
|
||||
z_stream zcpr;
|
||||
int ret=Z_OK;
|
||||
long lOrigToDo = lFileSize;
|
||||
long lOrigDone = 0;
|
||||
int step=0;
|
||||
memset(&zcpr,0,sizeof(z_stream));
|
||||
deflateInit(&zcpr,cprLevel);
|
||||
|
||||
zcpr.next_in = FilePtr;
|
||||
zcpr.next_out = CprPtr;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
long all_read_before = zcpr.total_in;
|
||||
zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
|
||||
zcpr.avail_out = BlockSizeCompress;
|
||||
ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
|
||||
lOrigDone += (zcpr.total_in-all_read_before);
|
||||
lOrigToDo -= (zcpr.total_in-all_read_before);
|
||||
step++;
|
||||
} while (ret==Z_OK);
|
||||
|
||||
lSizeCpr=zcpr.total_out;
|
||||
deflateEnd(&zcpr);
|
||||
dwGetTick=GetTickCount()-dwGetTick;
|
||||
dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
|
||||
dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
|
||||
printf("total compress size = %u, in %u step\n",lSizeCpr,step);
|
||||
printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
|
||||
printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
|
||||
printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
|
||||
}
|
||||
|
||||
CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
|
||||
UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
|
||||
|
||||
BeginCountPerfCounter(&li_qp,TRUE);
|
||||
dwGetTick=GetTickCount();
|
||||
BeginCountRdtsc(&li_rdtsc);
|
||||
{
|
||||
z_stream zcpr;
|
||||
int ret=Z_OK;
|
||||
long lOrigToDo = lSizeCpr;
|
||||
long lOrigDone = 0;
|
||||
int step=0;
|
||||
memset(&zcpr,0,sizeof(z_stream));
|
||||
inflateInit(&zcpr);
|
||||
|
||||
zcpr.next_in = CprPtr;
|
||||
zcpr.next_out = UncprPtr;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
long all_read_before = zcpr.total_in;
|
||||
zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
|
||||
zcpr.avail_out = BlockSizeUncompress;
|
||||
ret=inflate(&zcpr,Z_SYNC_FLUSH);
|
||||
lOrigDone += (zcpr.total_in-all_read_before);
|
||||
lOrigToDo -= (zcpr.total_in-all_read_before);
|
||||
step++;
|
||||
} while (ret==Z_OK);
|
||||
|
||||
lSizeUncpr=zcpr.total_out;
|
||||
inflateEnd(&zcpr);
|
||||
dwGetTick=GetTickCount()-dwGetTick;
|
||||
dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
|
||||
dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
|
||||
printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
|
||||
printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
|
||||
printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
|
||||
printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
|
||||
}
|
||||
|
||||
if (lSizeUncpr==lFileSize)
|
||||
{
|
||||
if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
|
||||
printf("compare ok\n");
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ int
|
||||
\fBTcl_Stat\fR(\fIpath\fR, \fIstatPtr\fR)
|
||||
.SH ARGUMENTS
|
||||
.AS "struct stat" *statPtr out
|
||||
.AP char *path in
|
||||
.AP "const char" *path in
|
||||
Native name of the file to check the attributes of.
|
||||
.AP int mode in
|
||||
Mask consisting of one or more of \fBR_OK\fR, \fBW_OK\fR, \fBX_OK\fR and
|
||||
|
||||
+18
-2
@@ -49,7 +49,7 @@ Interpreter in which to record information.
|
||||
The code returned from script evaluation.
|
||||
.AP Tcl_Obj *options
|
||||
A dictionary of return options.
|
||||
.AP char *message in
|
||||
.AP "const char" *message in
|
||||
For \fBTcl_AddErrorInfo\fR,
|
||||
this is a conventional C string to append to the \fB\-errorinfo\fR return option.
|
||||
For \fBTcl_AddObjErrorInfo\fR,
|
||||
@@ -66,7 +66,7 @@ appending to the \fB\-errorinfo\fR return option.
|
||||
If negative, all bytes up to the first null byte are used.
|
||||
.AP Tcl_Obj *errorObjPtr in
|
||||
The \fB\-errorcode\fR return option will be set to this value.
|
||||
.AP char *element in
|
||||
.AP "const char" *element in
|
||||
String to record as one element of the \fB\-errorcode\fR return option.
|
||||
Last \fIelement\fR argument must be NULL.
|
||||
.AP va_list argList in
|
||||
@@ -308,6 +308,22 @@ The global variables \fBerrorInfo\fR and
|
||||
\fBerrorCode\fR are not modified by \fBTcl_ResetResult\fR
|
||||
so they continue to hold a record of information about the
|
||||
most recent error seen in an interpreter.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The result of \fBTcl_GetReturnOptions\fR will have at least one
|
||||
reference to it from the Tcl interpreter. If not using it immediately,
|
||||
you should use \fBTcl_IncrRefCount\fR to add your own reference.
|
||||
.PP
|
||||
The \fIoptions\fR argument to \fBTcl_SetReturnOptions\fR will have a
|
||||
reference added by the Tcl interpreter; it may safely be called with a
|
||||
zero-reference value.
|
||||
.PP
|
||||
\fBTcl_AppendObjToErrorInfo\fR only reads its \fIobjPtr\fR argument;
|
||||
it does not modify its reference count at all.
|
||||
.PP
|
||||
The \fIerrorObjPtr\fR argument to \fBTcl_SetObjErrorCode\fR will have a
|
||||
reference added by the Tcl interpreter; it may safely be called with a
|
||||
zero-reference value.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_DecrRefCount(3), Tcl_IncrRefCount(3), Tcl_Interp(3), Tcl_ResetResult(3),
|
||||
Tcl_SetErrno(3), errorCode(n), errorInfo(n)
|
||||
|
||||
+23
-12
@@ -9,7 +9,7 @@
|
||||
.so man.macros
|
||||
.BS
|
||||
.SH NAME
|
||||
Tcl_AsyncCreate, Tcl_AsyncMark, Tcl_AsyncInvoke, Tcl_AsyncDelete, Tcl_AsyncReady \- handle asynchronous events
|
||||
Tcl_AsyncCreate, Tcl_AsyncMark, Tcl_AsyncMarkFromSignal, Tcl_AsyncInvoke, Tcl_AsyncDelete, Tcl_AsyncReady \- handle asynchronous events
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
\fB#include <tcl.h>\fR
|
||||
@@ -17,11 +17,16 @@ Tcl_AsyncCreate, Tcl_AsyncMark, Tcl_AsyncInvoke, Tcl_AsyncDelete, Tcl_AsyncReady
|
||||
Tcl_AsyncHandler
|
||||
\fBTcl_AsyncCreate\fR(\fIproc, clientData\fR)
|
||||
.sp
|
||||
void
|
||||
\fBTcl_AsyncMark\fR(\fIasync\fR)
|
||||
.sp
|
||||
int
|
||||
\fBTcl_AsyncMarkFromSignal\fR(\fIasync\fR, \fIsigNumber\fR)
|
||||
.sp
|
||||
int
|
||||
\fBTcl_AsyncInvoke\fR(\fIinterp, code\fR)
|
||||
.sp
|
||||
void
|
||||
\fBTcl_AsyncDelete\fR(\fIasync\fR)
|
||||
.sp
|
||||
int
|
||||
@@ -34,6 +39,8 @@ Procedure to invoke to handle an asynchronous event.
|
||||
One-word value to pass to \fIproc\fR.
|
||||
.AP Tcl_AsyncHandler async in
|
||||
Token for asynchronous event handler.
|
||||
.AP int sigNumber in
|
||||
POSIX signal number, when used in a signal context.
|
||||
.AP Tcl_Interp *interp in
|
||||
Tcl interpreter in which command was being evaluated when handler was
|
||||
invoked, or NULL if handler was invoked when there was no interpreter
|
||||
@@ -60,10 +67,11 @@ to a clean state, such as after the current Tcl command completes.
|
||||
.PP
|
||||
\fBTcl_AsyncCreate\fR, \fBTcl_AsyncDelete\fR, and \fBTcl_AsyncReady\fR
|
||||
are thread sensitive. They access and/or set a thread-specific data
|
||||
structure in the event of a core built with \fI\-\-enable\-threads\fR. The token
|
||||
created by \fBTcl_AsyncCreate\fR contains the needed thread information it
|
||||
was called from so that calling \fBTcl_AsyncMark\fR(\fItoken\fR) will only yield
|
||||
the origin thread into the asynchronous handler.
|
||||
structure in the event of a core built with \fI\-\-enable\-threads\fR.
|
||||
The token created by \fBTcl_AsyncCreate\fR contains the needed thread
|
||||
information it was called from so that calling \fBTcl_AsyncMarkFromSignal\fR
|
||||
or \fBTcl_AsyncMark\fR with this token will only yield the origin
|
||||
thread into the asynchronous handler.
|
||||
.PP
|
||||
\fBTcl_AsyncCreate\fR creates an asynchronous handler and returns
|
||||
a token for it.
|
||||
@@ -72,13 +80,16 @@ any occurrences of the asynchronous event that it is intended
|
||||
to handle (it is not safe to create a handler at the time of
|
||||
an event).
|
||||
When an asynchronous event occurs the code that detects the event
|
||||
(such as a signal handler) should call \fBTcl_AsyncMark\fR with the
|
||||
token for the handler.
|
||||
\fBTcl_AsyncMark\fR will mark the handler as ready to execute, but it
|
||||
will not invoke the handler immediately.
|
||||
Tcl will call the \fIproc\fR associated with the handler later, when
|
||||
the world is in a safe state, and \fIproc\fR can then carry out
|
||||
the actions associated with the asynchronous event.
|
||||
(such as a POSIX signal handler) should call \fBTcl_AsyncMarkFromSignal\fR
|
||||
with the token for the handler and the POSIX signal number. The
|
||||
return value of this function is true, when the handler will be
|
||||
marked, false otherwise.
|
||||
For non-signal contexts, \fBTcl_AsyncMark\fR serves the same purpose.
|
||||
\fBTcl_AsyncMarkFromSignal\fR and \fBTcl_AsyncMark\fR will mark
|
||||
the handler as ready to execute, but will not invoke the handler
|
||||
immediately. Tcl will call the \fIproc\fR associated with the
|
||||
handler later, when the world is in a safe state, and \fIproc\fR
|
||||
can then carry out the actions associated with the asynchronous event.
|
||||
\fIProc\fR should have arguments and result that match the
|
||||
type \fBTcl_AsyncProc\fR:
|
||||
.PP
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ char
|
||||
\fBTcl_Backslash\fR(\fIsrc, countPtr\fR)
|
||||
.SH ARGUMENTS
|
||||
.AS char *countPtr out
|
||||
.AP char *src in
|
||||
.AP "const char" *src in
|
||||
Pointer to a string starting with a backslash.
|
||||
.AP int *countPtr out
|
||||
If \fIcountPtr\fR is not NULL, \fI*countPtr\fR gets filled
|
||||
|
||||
@@ -88,6 +88,18 @@ will lead to a \fBTCL_OK\fR return (and the boolean value 1),
|
||||
while the same value passed to \fBTcl_GetBoolean\fR will lead to
|
||||
a \fBTCL_ERROR\fR return.
|
||||
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_NewBooleanObj\fR always returns a zero-reference object, much
|
||||
like \fBTcl_NewObj\fR.
|
||||
.PP
|
||||
\fBTcl_SetBooleanObj\fR does not modify the reference count of its
|
||||
\fIobjPtr\fR argument, but does require that the object be unshared.
|
||||
.PP
|
||||
\fBTcl_GetBooleanFromObj\fR does not modify the reference count of its
|
||||
\fIobjPtr\fR argument; it only reads. Note however that this function
|
||||
may set the interpreter result; if that is the only place that
|
||||
is holding a reference to the object, it will be deleted.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_NewObj, Tcl_IsShared, Tcl_GetBoolean
|
||||
|
||||
|
||||
@@ -85,6 +85,18 @@ newly allocated bytes at the end of the array have arbitrary values. If
|
||||
the length of array is reduced to the new length. The return value is a
|
||||
pointer to the value's new array of bytes.
|
||||
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_NewByteArrayObj\fR always returns a zero-reference object, much
|
||||
like \fBTcl_NewObj\fR.
|
||||
.PP
|
||||
\fBTcl_SetByteArrayObj\fR and \fBTcl_SetByteArrayLength\fR do not modify the
|
||||
reference count of their \fIobjPtr\fR arguments, but do require that the
|
||||
object be unshared.
|
||||
.PP
|
||||
\fBTcl_GetByteArrayFromObj\fR does not modify the reference count of its
|
||||
\fIobjPtr\fR argument; it only reads.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
Tcl_GetStringFromObj, Tcl_NewObj, Tcl_IncrRefCount, Tcl_DecrRefCount
|
||||
|
||||
|
||||
@@ -67,6 +67,14 @@ other procedures. If an error is returned and this bit is set in
|
||||
result, where it can be retrieved with \fBTcl_GetObjResult\fR or
|
||||
\fBTcl_GetStringResult\fR. If this flag bit is not set then no error
|
||||
message is left and the interpreter's result will not be modified.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_CancelEval\fR always decrements the reference count of its
|
||||
\fIresultObjPtr\fR argument (if that is non-NULL). It is expected to
|
||||
be usually called with an object with zero reference count. If the
|
||||
object is shared with some other location (including the Tcl
|
||||
evaluation stack) it should have its reference count incremented
|
||||
before calling this function.
|
||||
.SH "SEE ALSO"
|
||||
interp(n), Tcl_Eval(3),
|
||||
TIP 285
|
||||
|
||||
+38
@@ -55,6 +55,14 @@ Tcl_ObjectMapMethodNameProc
|
||||
\fBTcl_ObjectGetMethodNameMapper\fR(\fIobject\fR)
|
||||
.sp
|
||||
\fBTcl_ObjectSetMethodNameMapper\fR(\fIobject\fR, \fImethodNameMapper\fR)
|
||||
.sp
|
||||
.VS "TIP 605"
|
||||
Tcl_Class
|
||||
\fBTcl_GetClassOfObject\fR(\fIobject\fR)
|
||||
.sp
|
||||
Tcl_Obj *
|
||||
\fBTcl_GetObjectClassName\fR(\fIinterp\fR, \fIobject\fR)
|
||||
.VE "TIP 605"
|
||||
.SH ARGUMENTS
|
||||
.AS ClientData metadata in/out
|
||||
.AP Tcl_Interp *interp in/out
|
||||
@@ -114,6 +122,13 @@ function. Note that the Tcl_Obj reference returned by \fBTcl_GetObjectName\fR
|
||||
is a shared reference. You can also get whether the object has been marked for
|
||||
deletion with \fBTcl_ObjectDeleted\fR (it returns true if deletion of the
|
||||
object has begun); this can be useful during the processing of methods.
|
||||
.VS "TIP 605"
|
||||
The class of an object can be retrieved with \fBTcl_GetClassOfObject\fR, and
|
||||
the name of the class of an object with \fBTcl_GetObjectClassName\fR; note
|
||||
that these two \fImay\fR return NULL during deletion of an object (this is
|
||||
transient, and only occurs when the object is a long way through being
|
||||
deleted).
|
||||
.VE "TIP 605"
|
||||
.PP
|
||||
Instances of classes are created using \fBTcl_NewObjectInstance\fR, which
|
||||
creates an object from any class (and which is internally called by both
|
||||
@@ -241,6 +256,29 @@ NULL if the whole chain is to be processed (the argument itself is never
|
||||
NULL); this variable may be updated by the callback. The \fImethodNameObj\fR
|
||||
parameter gives an unshared object containing the name of the method being
|
||||
invoked, as provided by the user; this object may be updated by the callback.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The \fIobjPtr\fR argument to \fBTcl_GetObjectFromObj\fR will not have its
|
||||
reference count manipulated, but this function may modify the interpreter
|
||||
result (to report any error) so interpreter results should not be fed into
|
||||
this without an additional reference being used.
|
||||
.PP
|
||||
The result of \fBTcl_GetObjectName\fR is a value that is owned by the object
|
||||
that is regenerated when this function is first called after the object is
|
||||
renamed. If the value is to be retained at all, the caller should increment
|
||||
the reference count.
|
||||
.PP
|
||||
The first \fIobjc\fR values in the \fIobjv\fR argument to
|
||||
\fBTcl_NewObjectInstance\fR are the arguments to pass to the constructor. They
|
||||
must have a reference count of at least 1, and may have their reference counts
|
||||
changed during the running of the constructor. Constructors may modify the
|
||||
interpreter result, which consequently means that interpreter results should
|
||||
not be used as arguments without an additional reference being taken.
|
||||
.PP
|
||||
The \fImethodNameObj\fR argument to a Tcl_ObjectMapMethodNameProc
|
||||
implementation will be a value with a reference count of at least 1 where at
|
||||
least one reference is not held by the interpreter result. It is expected that
|
||||
method name mappers will only read their \fImethodNameObj\fR arguments.
|
||||
.SH "SEE ALSO"
|
||||
Method(3), oo::class(n), oo::copy(n), oo::define(n), oo::object(n)
|
||||
.SH KEYWORDS
|
||||
|
||||
+9
-1
@@ -243,8 +243,16 @@ any script evaluation mechanism will fail.
|
||||
.PP
|
||||
For a description of the Tcl interface to multiple interpreters, see
|
||||
\fIinterp(n)\fR.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_CreateAliasObj\fR increments the reference counts of the values
|
||||
in its \fIobjv\fR argument. (That reference lasts the same length of
|
||||
time as the owning alias.)
|
||||
.PP
|
||||
\fBTcl_GetAliasObj\fR returns (via its \fIobjvPtr\fR argument) a
|
||||
pointer to values that it holds a reference to.
|
||||
.SH "SEE ALSO"
|
||||
interp
|
||||
interp(n)
|
||||
|
||||
.SH KEYWORDS
|
||||
alias, command, exposed commands, hidden commands, interpreter, invoke,
|
||||
|
||||
@@ -156,6 +156,10 @@ pointed to by \fIargTypesPointer\fR.
|
||||
\fBTcl_ListMathFuncs\fR returns a Tcl value containing a list of all
|
||||
the math functions defined in the interpreter whose name matches
|
||||
\fIpattern\fR. The returned value has a reference count of zero.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_ListMathFuncs\fR always returns a zero-reference object, much
|
||||
like \fBTcl_NewObj\fR.
|
||||
.SH "SEE ALSO"
|
||||
expr(n), info(n), Tcl_CreateObjCommand(3), Tcl_Free(3), Tcl_NewListObj(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
+16
-1
@@ -54,7 +54,7 @@ const char *
|
||||
.AS Tcl_CmdDeleteProc *deleteProc in/out
|
||||
.AP Tcl_Interp *interp in
|
||||
Interpreter in which to create a new command or that contains a command.
|
||||
.AP char *cmdName in
|
||||
.AP "const char" *cmdName in
|
||||
Name of command.
|
||||
.AP Tcl_ObjCmdProc *proc in
|
||||
Implementation of the new command: \fIproc\fR will be called whenever
|
||||
@@ -323,6 +323,21 @@ instead. The result from \fBTcl_GetCommandTypeName\fR will be exactly that
|
||||
string which was registered, and not a copy; use of a compile-time constant
|
||||
string is \fIstrongly recommended\fR.
|
||||
.VE "info cmdtype feature"
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
When the \fIproc\fR passed to \fBTcl_CreateObjCommand\fR is called,
|
||||
the values in its \fIobjv\fR argument will have a reference count of
|
||||
at least 1, with that guaranteed reference being from the Tcl
|
||||
evaluation stack. You should not call \fBTcl_DecrRefCount\fR on any of
|
||||
those values unless you call \fBTcl_IncrRefCount\fR on them first.
|
||||
Also, when the \fIproc\fR is called, the interpreter result is
|
||||
guaranteed to be an empty string value with a reference count of 1.
|
||||
.PP
|
||||
\fBTcl_GetCommandFullName\fR does not modify the reference count of its
|
||||
\fIobjPtr\fR argument, but does require that the object be unshared.
|
||||
.PP
|
||||
\fBTcl_GetCommandFromObj\fR does not modify the reference count of its
|
||||
\fIobjPtr\fR argument; it only reads.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_CreateCommand(3), Tcl_ResetResult(3), Tcl_SetObjResult(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -187,5 +187,14 @@ There is no way to be notified when the trace created by
|
||||
\fBTcl_CreateTrace\fR is deleted. There is no way for the \fIproc\fR
|
||||
associated with a call to \fBTcl_CreateTrace\fR to abort execution of
|
||||
\fIcommand\fR.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
When the \fIproc\fR passed to \fBTcl_CreateObjTrace\fR is called,
|
||||
the values in its \fIobjv\fR argument will have a reference count of
|
||||
at least 1, with that guaranteed reference being from the Tcl
|
||||
evaluation stack. You should not call \fBTcl_DecrRefCount\fR on any of
|
||||
those values unless you call \fBTcl_IncrRefCount\fR on them first.
|
||||
.SH "SEE ALSO"
|
||||
trace(n)
|
||||
.SH KEYWORDS
|
||||
command, create, delete, interpreter, trace
|
||||
|
||||
@@ -190,6 +190,73 @@ path as this is easy to construct from repeated use of
|
||||
dictionaries are created for non-terminal keys where they do not
|
||||
already exist. With \fBTcl_DictObjRemoveKeyList\fR, all non-terminal
|
||||
keys must exist and have dictionaries as their values.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_NewDictObj\fR always returns a zero-reference object, much like
|
||||
\fBTcl_NewObj\fR.
|
||||
.PP
|
||||
\fBTcl_DictObjPut\fR does not modify the reference count of its \fIdictPtr\fR
|
||||
argument, but does require that the object be unshared. If
|
||||
\fBTcl_DictObjPut\fR returns \fBTCL_ERROR\fR it does not manipulate any
|
||||
reference counts; but if it returns \fBTCL_OK\fR then it definitely increments
|
||||
the reference count of \fIvaluePtr\fR and may increment the reference count of
|
||||
\fIkeyPtr\fR; the latter case happens exactly when the key did not previously
|
||||
exist in the dictionary. Note however that this function may set the
|
||||
interpreter result; if that is the only place that is holding a reference to
|
||||
an object, it will be deleted.
|
||||
.PP
|
||||
\fBTcl_DictObjGet\fR only reads from its \fIdictPtr\fR and \fIkeyPtr\fR
|
||||
arguments, and does not manipulate their reference counts at all. If the
|
||||
\fIvaluePtrPtr\fR argument is not set to NULL (and the function doesn't return
|
||||
\fBTCL_ERROR\fR), it will be set to a value with a reference count of at least
|
||||
1, with a reference owned by the dictionary. Note however that this function
|
||||
may set the interpreter result; if that is the only place that is holding a
|
||||
reference to an object, it will be deleted.
|
||||
.PP
|
||||
\fBTcl_DictObjRemove\fR does not modify the reference count of its
|
||||
\fIdictPtr\fR argument, but does require that the object be unshared. It does
|
||||
not manipulate the reference count of its \fIkeyPtr\fR argument at all. Note
|
||||
however that this function may set the interpreter result; if that is the only
|
||||
place that is holding a reference to an object, it will be deleted.
|
||||
.PP
|
||||
\fBTcl_DictObjSize\fR does not modify the reference count of its \fIdictPtr\fR
|
||||
argument; it only reads. Note however that this function may set the
|
||||
interpreter result; if that is the only place that is holding a reference to
|
||||
the dictionary object, it will be deleted.
|
||||
.PP
|
||||
\fBTcl_DictObjFirst\fR does not modify the reference count of its
|
||||
\fIdictPtr\fR argument; it only reads. The variables given by the
|
||||
\fIkeyPtrPtr\fR and \fIvaluePtrPtr\fR arguments (if not NULL) will be updated
|
||||
to contain references to the relevant values in the dictionary; their
|
||||
reference counts will be at least 1 (due to the dictionary holding a reference
|
||||
to them). It may also manipulate internal references; these are not exposed to
|
||||
user code, but require a matching \fBTcl_DictObjDone\fR call. Note however
|
||||
that this function may set the interpreter result; if that is the only place
|
||||
that is holding a reference to the dictionary object, it will be deleted.
|
||||
.PP
|
||||
Similarly for \fBTcl_DictObjNext\fR; the variables given by the
|
||||
\fIkeyPtrPtr\fR and \fIvaluePtrPtr\fR arguments (if not NULL) will be updated
|
||||
to contain references to the relevant values in the dictionary; their
|
||||
reference counts will be at least 1 (due to the dictionary holding a reference
|
||||
to them).
|
||||
.PP
|
||||
\fBTcl_DictObjDone\fR does not manipulate (user-visible) reference counts.
|
||||
.PP
|
||||
\fBTcl_DictObjPutKeyList\fR is similar to \fBTcl_DictObjPut\fR; it does not
|
||||
modify the reference count of its \fIdictPtr\fR argument, but does require
|
||||
that the object be unshared. It may increment the reference count of any value
|
||||
passed in the \fIkeyv\fR argument, and will increment the reference count of
|
||||
the \fIvaluePtr\fR argument on success. It is recommended that values passed
|
||||
via \fIkeyv\fR and \fIvaluePtr\fR do not have zero reference counts. Note
|
||||
however that this function may set the interpreter result; if that is the only
|
||||
place that is holding a reference to an object, it will be deleted.
|
||||
.PP
|
||||
\fBTcl_DictObjRemoveKeyList\fR is similar to \fBTcl_DictObjRemove\fR; it does
|
||||
not modify the reference count of its \fIdictPtr\fR argument, but does require
|
||||
that the object be unshared, and does not modify the reference counts of any
|
||||
of the values passed in the \fIkeyv\fR argument. Note however that this
|
||||
function may set the interpreter result; if that is the only place that is
|
||||
holding a reference to an object, it will be deleted.
|
||||
.SH EXAMPLE
|
||||
Using the dictionary iteration interface to search determine if there
|
||||
is a key that maps to itself:
|
||||
|
||||
@@ -58,6 +58,18 @@ and if \fIinterp\fR is non-NULL, an error message is left in \fIinterp\fR.
|
||||
The \fBTcl_ObjType\fR of \fIobjPtr\fR may be changed to make subsequent
|
||||
calls to \fBTcl_GetDoubleFromObj\fR more efficient.
|
||||
'\" TODO: add discussion of treatment of NaN value
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_NewDoubleObj\fR always returns a zero-reference object, much
|
||||
like \fBTcl_NewObj\fR.
|
||||
.PP
|
||||
\fBTcl_SetDoubleObj\fR does not modify the reference count of its
|
||||
\fIobjPtr\fR argument, but does require that the object be unshared.
|
||||
.PP
|
||||
\fBTcl_GetDoubleFromObj\fR does not modify the reference count of its
|
||||
\fIobjPtr\fR argument; it only reads. Note however that this function
|
||||
may set the interpreter result; if that is the only place that
|
||||
is holding a reference to the object, it will be deleted.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_NewObj, Tcl_DecrRefCount, Tcl_IncrRefCount, Tcl_GetObjResult
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -556,5 +556,16 @@ been loaded, it attempts to load an encoding file called \fIname\fB.enc\fR
|
||||
from the \fBencoding\fR subdirectory of each directory that Tcl searches
|
||||
for its script library. If the encoding file exists, but is
|
||||
malformed, an error message will be left in \fIinterp\fR.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_GetEncodingFromObj\fR does not modify the reference count of its
|
||||
\fIobjPtr\fR argument; it only reads. Note however that this function may set
|
||||
the interpreter result; if that is the only place that is holding a reference
|
||||
to the object, it will be deleted.
|
||||
.PP
|
||||
\fBTcl_GetEncodingSearchPath\fR returns an object with a reference count of at
|
||||
least 1.
|
||||
.SH "SEE ALSO"
|
||||
encoding(n)
|
||||
.SH KEYWORDS
|
||||
utf, encoding, convert
|
||||
|
||||
@@ -209,6 +209,27 @@ namespace whose list of exported commands is used if both the mapping
|
||||
dictionary and the subcommand list properties are NULL. May be read
|
||||
using \fBTcl_GetEnsembleNamespace\fR which returns a Tcl result code
|
||||
(\fBTCL_OK\fR, or \fBTCL_ERROR\fR if the token does not refer to an ensemble).
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_FindEnsemble\fR does not modify the reference count of its
|
||||
\fIcmdNameObj\fR argument; it only reads. Note however that this function may
|
||||
set the interpreter result; if that is the only place that is holding a
|
||||
reference to the object, it will be deleted.
|
||||
.PP
|
||||
The ensemble property getters (\fBTcl_GetEnsembleMappingDict\fR,
|
||||
\fBTcl_GetEnsembleParameterList\fR, \fBTcl_GetEnsembleSubcommandList\fR, and
|
||||
\fBTcl_GetEnsembleUnknownHandler\fR) do not manipulate the reference count of
|
||||
the values they provide out; if those are non-NULL, they will have a reference
|
||||
count of at least 1. Note that these functions may set the interpreter
|
||||
result.
|
||||
.PP
|
||||
The ensemble property setters (\fBTcl_SetEnsembleMappingDict\fR,
|
||||
\fBTcl_SetEnsembleParameterList\fR, \fBTcl_SetEnsembleSubcommandList\fR, and
|
||||
\fBTcl_SetEnsembleUnknownHandler\fR) will increment the reference count of the
|
||||
new value of the property they are given if they succeed (and decrement the
|
||||
reference count of the old value of the property, if relevant). If the
|
||||
property setters return \fBTCL_ERROR\fR, the reference count of the Tcl_Obj
|
||||
argument is left unchanged.
|
||||
.SH "SEE ALSO"
|
||||
namespace(n), Tcl_DeleteCommandFromToken(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
+15
-1
@@ -65,7 +65,7 @@ null terminating character. If \-1, then all characters up to the
|
||||
first null byte are used.
|
||||
.AP "const char" *script in
|
||||
Points to first byte of script to execute (null-terminated and UTF-8).
|
||||
.AP char *part in
|
||||
.AP "const char" *part in
|
||||
String forming part of a Tcl script.
|
||||
.AP va_list argList in
|
||||
An argument list which must have been initialized using
|
||||
@@ -207,6 +207,20 @@ the \fBreturn\fR, \fBbreak\fR, or \fBcontinue\fR command was
|
||||
invoked in an inappropriate place.
|
||||
This means that top-level applications should never see a return code
|
||||
from \fBTcl_EvalObjEx\fR other than \fBTCL_OK\fR or \fBTCL_ERROR\fR.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_EvalObjEx\fR and \fBTcl_GlobalEvalObj\fR both increment and
|
||||
decrement the reference count of their \fIobjPtr\fR argument; you must
|
||||
not pass them any value with a reference count of zero. They also
|
||||
manipulate the interpreter result; you must not count on the
|
||||
interpreter result to hold the reference count of any value over
|
||||
these calls.
|
||||
.PP
|
||||
\fBTcl_EvalObjv\fR may increment and decrement the reference count of
|
||||
any value passed via its \fIobjv\fR argument; you must not pass any
|
||||
value with a reference count of zero. This function also manipulates
|
||||
the interpreter result; you must not count on the interpreter result
|
||||
to hold the reference count of any value over this call.
|
||||
|
||||
.SH KEYWORDS
|
||||
execute, file, global, result, script, value
|
||||
|
||||
@@ -98,6 +98,15 @@ containing the expression's value at \fI*resultPtrPtr\fR.
|
||||
In this case, the caller is responsible for calling
|
||||
\fBTcl_DecrRefCount\fR to decrement the value's reference count
|
||||
when it is finished with the value.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_ExprLongObj\fR, \fBTcl_ExprDoubleObj\fR,
|
||||
\fBTcl_ExprBooleanObj\fR, and \fBTcl_ExprObj\fR all increment and
|
||||
decrement the reference count of their \fIobjPtr\fR arguments; you
|
||||
must not pass them any value with a reference count of zero. They also
|
||||
manipulate the interpreter result; you must not count on the
|
||||
interpreter result to hold the reference count of any value over these
|
||||
calls.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
Tcl_ExprLong, Tcl_ExprDouble, Tcl_ExprBoolean, Tcl_ExprString, Tcl_GetObjResult
|
||||
|
||||
+161
-3
@@ -45,7 +45,7 @@ int
|
||||
\fBTcl_FSDeleteFile\fR(\fIpathPtr\fR)
|
||||
.sp
|
||||
int
|
||||
\fBTcl_FSRemoveDirectory\fR(\fIpathPtr, int recursive, errorPtr\fR)
|
||||
\fBTcl_FSRemoveDirectory\fR(\fIpathPtr, recursive, errorPtr\fR)
|
||||
.sp
|
||||
int
|
||||
\fBTcl_FSRenameFile\fR(\fIsrcPathPtr, destPathPtr\fR)
|
||||
@@ -79,10 +79,10 @@ int
|
||||
\fBTcl_FSUtime\fR(\fIpathPtr, tval\fR)
|
||||
.sp
|
||||
int
|
||||
\fBTcl_FSFileAttrsGet\fR(\fIinterp, int index, pathPtr, objPtrRef\fR)
|
||||
\fBTcl_FSFileAttrsGet\fR(\fIinterp, index, pathPtr, objPtrRef\fR)
|
||||
.sp
|
||||
int
|
||||
\fBTcl_FSFileAttrsSet\fR(\fIinterp, int index, pathPtr, Tcl_Obj *objPtr\fR)
|
||||
\fBTcl_FSFileAttrsSet\fR(\fIinterp, index, pathPtr, objPtr\fR)
|
||||
.sp
|
||||
const char *const *
|
||||
\fBTcl_FSFileAttrStrings\fR(\fIpathPtr, objPtrRef\fR)
|
||||
@@ -197,6 +197,8 @@ rename operation.
|
||||
.AP Tcl_Obj *destPathPtr in
|
||||
As for \fIpathPtr\fR, but used for the destination filename for a copy or
|
||||
rename operation.
|
||||
.AP int recursive in
|
||||
Whether to remove subdirectories and their contents as well.
|
||||
.AP "const char" *encodingName in
|
||||
The encoding of the data stored in the
|
||||
file identified by \fIpathPtr\fR and to be evaluated.
|
||||
@@ -224,6 +226,10 @@ be joined together. If negative, then all elements are joined.
|
||||
.AP Tcl_Obj **errorPtr out
|
||||
In the case of an error, filled with a value containing the name of
|
||||
the file which caused an error in the various copy/rename operations.
|
||||
.AP int index in
|
||||
The index of the attribute in question.
|
||||
.AP Tcl_Obj *objPtr in
|
||||
The value to set in the operation.
|
||||
.AP Tcl_Obj **objPtrRef out
|
||||
Filled with a value containing the result of the operation.
|
||||
.AP Tcl_Obj *resultPtr out
|
||||
@@ -1628,6 +1634,158 @@ typedef int \fBTcl_FSChdirProc\fR(
|
||||
The \fBTcl_FSChdirProc\fR changes the applications current working
|
||||
directory to the value specified in \fIpathPtr\fR. The function returns
|
||||
-1 on error or 0 on success.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.SS "PUBLIC API CALLS"
|
||||
.PP
|
||||
For all of these functions, \fIpathPtr\fR (including the \fIsrcPathPtr\fR and
|
||||
\fIdestPathPtr\fR arguments to \fBTcl_FSCopyFile\fR,
|
||||
\fBTcl_FSCopyDirectory\fR, and \fBTcl_FSRenameFile\fR, the \fIfirstPtr\fR and
|
||||
\fIsecondPtr\fR arguments to \fBTcl_FSEqualPaths\fR, and the \fIlinkNamePtr\fR
|
||||
and \fItoPtr\fR arguments to \fBTcl_FSLink\fR) must not be a zero reference
|
||||
count value; references may be retained in internal caches even for
|
||||
theoretically read-only operations. These functions may also manipulate the
|
||||
interpreter result (if they take and are given a non-NULL \fIinterp\fR
|
||||
argument); you must not count on the interpreter result to hold the reference
|
||||
count of any argument value over these calls and should manage your own
|
||||
references there. However, references held by the arguments to a Tcl command
|
||||
\fIare\fR suitable for reference count management purposes for the duration of
|
||||
the implementation of that command.
|
||||
.PP
|
||||
The \fIerrorPtr\fR argument to \fBTcl_FSCopyDirectory\fR and
|
||||
\fBTcl_FSRemoveDirectory\fR is, when an object is set into it at all, set to
|
||||
an object with a non-zero reference count that should be passed to
|
||||
\fBTcl_DecrRefCount\fR when no longer needed.
|
||||
.PP
|
||||
\fBTcl_FSListVolumes\fR always returns a zero-reference object, much
|
||||
like \fBTcl_NewObj\fR.
|
||||
.PP
|
||||
\fBTcl_FSLink\fR always returns a non-zero-reference object when it is
|
||||
asked to read; you must call \fBTcl_DecrRefCount\fR on the object
|
||||
once you no longer need it.
|
||||
.PP
|
||||
\fBTcl_FSGetCwd\fR always returns a non-zero-reference object; you
|
||||
must call \fBTcl_DecrRefCount\fR on the object once you no longer need
|
||||
it.
|
||||
.PP
|
||||
\fBTcl_FSPathSeparator\fR always returns a zero-reference object, much
|
||||
like \fBTcl_NewObj\fR.
|
||||
.PP
|
||||
\fBTcl_FSJoinPath\fR always returns a zero-reference object, much
|
||||
like \fBTcl_NewObj\fR. Its \fIlistObj\fR argument can have any reference
|
||||
count; it is only read by this function.
|
||||
.PP
|
||||
\fBTcl_FSSplitPath\fR always returns a zero-reference object, much
|
||||
like \fBTcl_NewObj\fR.
|
||||
.PP
|
||||
\fBTcl_FSGetNormalizedPath\fR returns an object with a non-zero
|
||||
reference count where Tcl is the owner. You should increment its
|
||||
reference count if you want to retain it, but do not need to if you
|
||||
are just using the value immediately.
|
||||
.PP
|
||||
\fBTcl_FSJoinToPath\fR always returns a zero-reference object, much like
|
||||
\fBTcl_NewObj\fR. Its \fIbasePtr\fR argument follows the rules above for
|
||||
\fIpathPtr\fR, as do the values in the \fIobjv\fR argument.
|
||||
.PP
|
||||
\fBTcl_FSGetTranslatedPath\fR returns a non-zero-reference object (or
|
||||
NULL in the error case); you must call \fBTcl_DecrRefCount\fR on the
|
||||
object once you no longer need it.
|
||||
.PP
|
||||
\fBTcl_FSNewNativePath\fR always returns a zero-reference object (or
|
||||
NULL), much like \fBTcl_NewObj\fR.
|
||||
.PP
|
||||
\fBTcl_FSFileSystemInfo\fR always returns a zero-reference object (or
|
||||
NULL), much like \fBTcl_NewObj\fR.
|
||||
.PP
|
||||
The \fIobjPtr\fR and \fIobjPtrRef\fR arguments to \fBTcl_FSFileAttrsGet\fR,
|
||||
\fBTcl_FSFileAttrsSet\fR and \fBTcl_FSFileAttrStrings\fR are conventional Tcl
|
||||
values; the \fIobjPtr\fR argument will be read but not retained, and the
|
||||
\fIobjPtrRef\fR argument will have (on success) a zero-reference value written
|
||||
into it (as with \fBTcl_NewObj\fR). \fBTcl_FSFileAttrsGet\fR and
|
||||
\fBTcl_FSFileAttrsSet\fR may also manipulate the interpreter result.
|
||||
.PP
|
||||
The \fIresultPtr\fR argument to \fBTcl_FSMatchInDirectory\fR will not have its
|
||||
reference count manipulated, but it should have a reference count of no more
|
||||
than 1, and should not be the current interpreter result (as the function may
|
||||
overwrite that on error).
|
||||
.SS "VIRTUAL FILESYSTEM INTERFACE"
|
||||
.PP
|
||||
For all virtual filesystem implementation functions, any \fIpathPtr\fR
|
||||
arguments should not have their reference counts manipulated. If they take an
|
||||
\fIinterp\fR argument, they may set an error message in that, but must not
|
||||
manipulate the \fIpathPtr\fR afterwards. Aside from that:
|
||||
.TP
|
||||
\fIinternalToNormalizedProc\fR
|
||||
.
|
||||
This should return a zero-reference count value, as if allocated with
|
||||
\fBTcl_NewObj\fR.
|
||||
.TP
|
||||
\fInormalizePathProc\fR
|
||||
.
|
||||
Unlike with other API implementation functions, the \fIpathPtr\fR argument
|
||||
here is guaranteed to be an unshared object that should be updated. Its
|
||||
reference count should not be modified.
|
||||
.TP
|
||||
\fIfilesystemPathTypeProc\fR
|
||||
.
|
||||
The return value (if non-NULL) either has a reference count of zero or needs
|
||||
to be maintained (on a per-thread basis) by the filesystem. Tcl will increment
|
||||
the reference count of the value if it wishes to retain it.
|
||||
.TP
|
||||
\fIfilesystemSeparatorProc\fR
|
||||
.
|
||||
The return value should be a value with reference count of zero.
|
||||
.TP
|
||||
\fImatchInDirectoryProc\fR
|
||||
.
|
||||
The \fIresultPtr\fR argument should be assumed to hold a list that can be
|
||||
appended to (i.e., that has a reference count no greater than 1). No reference
|
||||
to it should be retained.
|
||||
.TP
|
||||
\fIlinkProc\fR
|
||||
.
|
||||
If \fItoPtr\fR is NULL, this should return a value with reference count 1 that
|
||||
has just been allocated and passed to \fBTcl_IncrRefCount\fR. If \fItoPtr\fR
|
||||
is not NULL, it should be returned on success.
|
||||
.TP
|
||||
\fIlistVolumesProc\fR
|
||||
.
|
||||
The result value should be a list (if non-NULL); it will have its reference
|
||||
count decremented once (with \fBTcl_DecrRefCount\fR) by Tcl once done.
|
||||
.TP
|
||||
\fIfileAttrStringsProc\fR
|
||||
.
|
||||
If the result is NULL, the \fIobjPtrRef\fR should have a list value written to
|
||||
it; that list will have its reference count both incremented (with
|
||||
\fBTcl_IncrRefCount\fR) and decremented (with \fBTcl_DecrRefCount\fR).
|
||||
.TP
|
||||
\fIfileAttrsGetProc\fR
|
||||
.
|
||||
The \fIobjPtrRef\fR argument should have (on non-error return) a zero
|
||||
reference count value written to it (allocated as if with \fBTcl_NewObj\fR).
|
||||
.TP
|
||||
\fIfileAttrsSetProc\fR
|
||||
.
|
||||
The \fIobjPtr\fR argument should either just be read or its reference count
|
||||
incremented to retain it.
|
||||
.TP
|
||||
\fIremoveDirectoryProc\fR
|
||||
.
|
||||
If an error is being reported, the problem filename reported via
|
||||
\fIerrorPtr\fR should be newly allocated (as if with \fBTcl_NewObj\fR) and
|
||||
have a reference count of 1 (i.e., have been passed to
|
||||
\fBTcl_IncrRefCount\fR).
|
||||
.TP
|
||||
\fIcopyDirectoryProc\fR
|
||||
.
|
||||
If an error is being reported, the problem filename reported via
|
||||
\fIerrorPtr\fR should be newly allocated (as if with \fBTcl_NewObj\fR) and
|
||||
have a reference count of 1 (i.e., have been passed to
|
||||
\fBTcl_IncrRefCount\fR).
|
||||
.TP
|
||||
\fIgetCwdProc\fR
|
||||
.
|
||||
The result will be passed to \fBTcl_DecrRefCount\fR by the implementation of
|
||||
\fBTcl_FSGetCwd\fR after it has been normalized.
|
||||
.SH "SEE ALSO"
|
||||
cd(n), file(n), filename(n), load(n), open(n), pwd(n), source(n), unload(n)
|
||||
.SH KEYWORDS
|
||||
|
||||
+3
-3
@@ -17,7 +17,7 @@ char *
|
||||
\fBTcl_GetCwd\fR(\fIinterp\fR, \fIbufferPtr\fR)
|
||||
.sp
|
||||
int
|
||||
\fBTcl_Chdir\fR(\fIpath\fR)
|
||||
\fBTcl_Chdir\fR(\fIdirName\fR)
|
||||
.SH ARGUMENTS
|
||||
.AS Tcl_DString *bufferPtr in/out
|
||||
.AP Tcl_Interp *interp in
|
||||
@@ -27,7 +27,7 @@ This dynamic string is used to store the current working directory.
|
||||
At the time of the call it should be uninitialized or free. The
|
||||
caller must eventually call \fBTcl_DStringFree\fR to free up
|
||||
anything stored here.
|
||||
.AP char *path in
|
||||
.AP "const char" *dirName in
|
||||
File path in UTF\-8 format.
|
||||
.BE
|
||||
|
||||
@@ -45,7 +45,7 @@ must call \fBTcl_DStringFree()\fR when the result is no longer needed.
|
||||
The format of the path is UTF\-8.
|
||||
.PP
|
||||
\fBTcl_Chdir\fR changes the applications current working directory to
|
||||
the value specified in \fIpath\fR. The format of the passed in string
|
||||
the value specified in \fIdirName\fR. The format of the passed in string
|
||||
must be UTF\-8. The function returns -1 on error or 0 on success.
|
||||
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -105,6 +105,12 @@ array of characters at \fItablePtr\fR+\fIoffset\fR bytes, etc.)
|
||||
This is particularly useful when processing things like
|
||||
\fBTk_ConfigurationSpec\fR, whose string keys are in the same place in
|
||||
each of several array elements.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_GetIndexFromObj\fR and \fBTcl_GetIndexFromObjStruct\fR do not modify
|
||||
the reference count of their \fIobjPtr\fR arguments; they only read. Note
|
||||
however that these functions may set the interpreter result; if that is the
|
||||
only place that is holding a reference to the object, it will be deleted.
|
||||
.SH "SEE ALSO"
|
||||
prefix(n), Tcl_WrongNumArgs(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
+14
@@ -330,5 +330,19 @@ typedef void \fBTcl_FreeHashEntryProc\fR(
|
||||
If this is NULL then \fBTcl_Free\fR is used to free the space for the entry.
|
||||
Tcl_Obj* keys use this function to decrement the reference count on the
|
||||
value.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
When a hash table is created with \fBTcl_InitCustomHashTable\fR, the
|
||||
\fBTcl_CreateHashEntry\fR function will increment the reference count of its
|
||||
\fIkey\fR argument when it creates a key (but not if there is an existing
|
||||
matching key). The reference count of the key will be decremented when the
|
||||
corresponding hash entry is deleted, whether with \fBTcl_DeleteHashEntry\fR or
|
||||
with \fBTcl_DeleteHashTable\fR. The \fBTcl_GetHashKey\fR function will return
|
||||
the key without further modifying its reference count.
|
||||
.PP
|
||||
Custom hash tables that use a Tcl_Obj* as key will generally need to do
|
||||
something similar in their \fIallocEntryProc\fR.
|
||||
.SH "SEE ALSO"
|
||||
Dict(3)
|
||||
.SH KEYWORDS
|
||||
hash table, key, lookup, search, value
|
||||
|
||||
+13
-1
@@ -2,7 +2,7 @@
|
||||
'\" Copyright (c) 1998-2000 Scriptics Corporation.
|
||||
'\" All rights reserved.
|
||||
'\"
|
||||
.TH Tcl_Init 3 8.0 Tcl "Tcl Library Procedures"
|
||||
.TH Tcl_Init 3 8.7 Tcl "Tcl Library Procedures"
|
||||
.so man.macros
|
||||
.BS
|
||||
.SH NAME
|
||||
@@ -13,10 +13,15 @@ Tcl_Init \- find and source initialization script
|
||||
.sp
|
||||
int
|
||||
\fBTcl_Init\fR(\fIinterp\fR)
|
||||
.sp
|
||||
const char *
|
||||
\fBTcl_SetPreInitScript\fR(\fIscriptPtr\fR)
|
||||
.SH ARGUMENTS
|
||||
.AS Tcl_Interp *interp
|
||||
.AP Tcl_Interp *interp in
|
||||
Interpreter to initialize.
|
||||
.AP "const char" *scriptPtr in
|
||||
Address of the initialization script.
|
||||
.BE
|
||||
|
||||
.SH DESCRIPTION
|
||||
@@ -26,6 +31,13 @@ Interpreter to initialize.
|
||||
path.
|
||||
.PP
|
||||
\fBTcl_Init\fR is typically called from \fBTcl_AppInit\fR procedures.
|
||||
.PP
|
||||
\fBTcl_SetPreInitScript\fR registers the pre-initialization script and
|
||||
returns the former (now replaced) script pointer.
|
||||
A value of \fINULL\fR may be passed to not register any script.
|
||||
The pre-initialization script is executed by \fBTcl_Init\fR before accessing
|
||||
the file system. The purpose is to typically prepare a custom file system
|
||||
(like an embedded zip-file) to be activated before the search.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
Tcl_AppInit, Tcl_Main
|
||||
|
||||
@@ -160,6 +160,27 @@ If anything later in the caller requires
|
||||
The \fBTcl_InitBignumFromDouble\fR routine is a utility procedure
|
||||
that extracts the integer part of \fIdoubleValue\fR and stores that
|
||||
integer value in the \fBmp_int\fR value \fIbigValue\fR.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_NewIntObj\fR, \fBTcl_NewLongObj\fR, \fBTcl_NewWideIntObj\fR, and
|
||||
\fBTcl_NewBignumObj\fR always return a zero-reference object, much like
|
||||
\fBTcl_NewObj\fR.
|
||||
.PP
|
||||
\fBTcl_SetIntObj\fR, \fBTcl_SetLongObj\fR, \fBTcl_SetWideIntObj\fR, and
|
||||
\fBTcl_SetBignumObj\fR do not modify the reference count of their \fIobjPtr\fR
|
||||
arguments, but do require that the object be unshared.
|
||||
.PP
|
||||
\fBTcl_GetIntFromObj\fR, \fBTcl_GetIntForIndex\fR, \fBTcl_GetLongFromObj\fR,
|
||||
\fBTcl_GetWideIntFromObj\fR, \fBTcl_GetBignumFromObj\fR, and
|
||||
\fBTcl_TakeBignumFromObj\fR do not modify the reference count of their
|
||||
\fIobjPtr\fR arguments; they only read. Note however that this function may
|
||||
set the interpreter result; if that is the only place that is holding a
|
||||
reference to the object, it will be deleted. Also note that if
|
||||
\fBTcl_TakeBignumFromObj\fR is given an unshared value, the value of that
|
||||
object may be modified; it is intended to be used when the value is
|
||||
.QW consumed
|
||||
by the operation at this point.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
Tcl_NewObj, Tcl_DecrRefCount, Tcl_IncrRefCount, Tcl_GetObjResult
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -246,6 +246,31 @@ with a NULL \fIobjvPtr\fR:
|
||||
result = \fBTcl_ListObjReplace\fR(interp, listPtr, first, count,
|
||||
0, NULL);
|
||||
.CE
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_NewListObj\fR always returns a zero-reference object, much like
|
||||
\fBTcl_NewObj\fR. If a non-NULL \fIobjv\fR argument is given, the reference
|
||||
counts of the first \fIobjc\fR values in that array are incremented.
|
||||
.PP
|
||||
\fBTcl_SetListObj\fR does not modify the reference count of its \fIobjPtr\fR
|
||||
argument, but does require that the object be unshared. The reference counts
|
||||
of the first \fIobjc\fR values in the \fIobjv\fR array are incremented.
|
||||
.PP
|
||||
\fBTcl_ListObjGetElements\fR, \fBTcl_ListObjIndex\fR, and
|
||||
\fBTcl_ListObjLength\fR do not modify the reference count of their
|
||||
\fIlistPtr\fR arguments; they only read. Note however that these three
|
||||
functions may set the interpreter result; if that is the only place that is
|
||||
holding a reference to the object, it will be deleted.
|
||||
.PP
|
||||
\fBTcl_ListObjAppendList\fR, \fBTcl_ListObjAppendElement\fR, and
|
||||
\fBTcl_ListObjReplace\fR require an unshared \fIlistPtr\fR argument.
|
||||
\fBTcl_ListObjAppendList\fR only reads its \fIelemListPtr\fR argument.
|
||||
\fBTcl_ListObjAppendElement\fR increments the reference count of its
|
||||
\fIobjPtr\fR on success. \fBTcl_ListObjReplace\fR increments the reference
|
||||
count of the first \fIobjc\fR values in the \fIobjv\fR array on success. Note
|
||||
however that all these three functions may set the interpreter result on
|
||||
failure; if that is the only place that is holding a reference to the object,
|
||||
it will be deleted.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_NewObj(3), Tcl_DecrRefCount(3), Tcl_IncrRefCount(3), Tcl_GetObjResult(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -60,6 +60,10 @@ be unloaded with \fBTcl_FSUnloadFile\fR.
|
||||
the symbol cannot be found, it returns NULL and sets an error message in the
|
||||
given \fIinterp\fR (if that is non-NULL). Note that it is unsafe to use this
|
||||
operation on a handle that has been passed to \fBTcl_FSUnloadFile\fR.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The reference count of the \fIpathPtr\fR argument to \fBTcl_LoadFile\fR may be
|
||||
incremented. As such, it should not be given a zero reference count value.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_FSLoadFile(3), Tcl_FSUnloadFile(3), load(n), unload(n)
|
||||
.SH KEYWORDS
|
||||
|
||||
+25
-1
@@ -258,8 +258,32 @@ also return TCL_ERROR; it should return TCL_OK otherwise.
|
||||
The \fIoldClientData\fR field to a Tcl_CloneProc gives the value from the
|
||||
method being copied from, and the \fInewClientDataPtr\fR field will point to
|
||||
a variable in which to write the value for the method being copied to.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The \fInameObj\fR argument to \fBTcl_NewMethod\fR and
|
||||
\fBTcl_NewInstanceMethod\fR (when non-NULL) will have its reference count
|
||||
incremented if there is no existing method with that name in that
|
||||
class/object.
|
||||
.PP
|
||||
The result of \fBTcl_MethodName\fR is a value with a reference count of at
|
||||
least one. It should not be modified without first duplicating it (with
|
||||
\fBTcl_DuplicateObj\fR).
|
||||
.PP
|
||||
The values in the first \fIobjc\fR values of the \fIobjv\fR argument to
|
||||
\fBTcl_ObjectContextInvokeNext\fR are assumed to have a reference count of at
|
||||
least 1; the containing array is assumed to endure until the next method
|
||||
implementation (see \fBnext\fR) returns. Be aware that methods may
|
||||
\fByield\fR; if any post-call actions are desired (e.g., decrementing the
|
||||
reference count of values passed in here), they must be scheduled with
|
||||
\fBTcl_NRAddCallback\fR.
|
||||
.PP
|
||||
The \fIcallProc\fR of the \fBTcl_MethodType\fR structure takes values of at
|
||||
least reference count 1 in its \fIobjv\fR argument. It may add its own
|
||||
references, but must not decrement the reference count below that level; the
|
||||
caller of the method will decrement the reference count once the method
|
||||
returns properly (and the reference will be held if the method \fByield\fRs).
|
||||
.SH "SEE ALSO"
|
||||
Class(3), oo::class(n), oo::define(n), oo::object(n)
|
||||
Class(3), NRE(3), oo::class(n), oo::define(n), oo::object(n)
|
||||
.SH KEYWORDS
|
||||
constructor, method, object
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ void
|
||||
.AS Tcl_CmdDeleteProc *interp in
|
||||
.AP Tcl_Interp *interp in
|
||||
The relevant Interpreter.
|
||||
.AP char *cmdName in
|
||||
.AP "const char" *cmdName in
|
||||
Name of the command to create.
|
||||
.AP Tcl_ObjCmdProc *proc in
|
||||
Called in order to evaluate a command. Is often just a small wrapper that uses
|
||||
@@ -227,6 +227,25 @@ int
|
||||
Any function comprising a routine can push other functions, making it possible
|
||||
implement looping and sequencing constructs using the function stack.
|
||||
.PP
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The first \fIobjc\fR values in the \fIobjv\fR array passed to the functions
|
||||
\fBTcl_NRCallObjProc\fR, \fBTcl_NREvalObjv\fR, and \fBTcl_NRCmdSwap\fR should
|
||||
have a reference count of at least 1; they may have additional references
|
||||
taken during the execution.
|
||||
.PP
|
||||
The \fIobjPtr\fR argument to \fBTcl_NREvalObj\fR and \fBTcl_NRExprObj\fR
|
||||
should have a reference count of at least 1, and may have additional
|
||||
references taken to it during execution.
|
||||
.PP
|
||||
The \fIresultObj\fR argument to \fBTcl_NRExprObj\fR should be an unshared
|
||||
object.
|
||||
.PP
|
||||
Use \fBTcl_NRAddCallback\fR to schedule any required final decrementing of the
|
||||
reference counts of arguments to any of the other functions on this page, as
|
||||
with any other post-processing step in the non-recursive execution engine.
|
||||
.PP
|
||||
The
|
||||
.SH "SEE ALSO"
|
||||
Tcl_CreateCommand(3), Tcl_CreateObjCommand(3), Tcl_EvalObjEx(3), Tcl_GetCommandFromObj(3), Tcl_ExprObj(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
+14
-2
@@ -46,10 +46,10 @@ Tcl_Command
|
||||
\fBTcl_FindCommand\fR(\fIinterp, name, contextNsPtr, flags\fR)
|
||||
.sp
|
||||
Tcl_Obj *
|
||||
\fBTcl_GetNamespaceUnknownHandler(\fIinterp, nsPtr\fR)
|
||||
\fBTcl_GetNamespaceUnknownHandler\fR(\fIinterp, nsPtr\fR)
|
||||
.sp
|
||||
int
|
||||
\fBTcl_SetNamespaceUnknownHandler(\fIinterp, nsPtr, handlerPtr\fR)
|
||||
\fBTcl_SetNamespaceUnknownHandler\fR(\fIinterp, nsPtr, handlerPtr\fR)
|
||||
.SH ARGUMENTS
|
||||
.AS Tcl_NamespaceDeleteProc allowOverwrite in/out
|
||||
.AP Tcl_Interp *interp in/out
|
||||
@@ -159,6 +159,18 @@ for the namespace, or NULL if none is set.
|
||||
\fBTcl_SetNamespaceUnknownHandler\fR sets the unknown command handler for
|
||||
the namespace. If \fIhandlerPtr\fR is NULL, then the handler is reset to
|
||||
its default.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The \fIobjPtr\fR argument to \fBTcl_AppendExportList\fR should be an
|
||||
unshared object, as it will be modified by this function. The
|
||||
reference count of \fIobjPtr\fR will not be altered.
|
||||
.PP
|
||||
\fBTcl_GetNamespaceUnknownHandler\fR returns a possibly shared value.
|
||||
Its reference count should be incremented if the value is to be
|
||||
retained.
|
||||
.PP
|
||||
The \fIhandlerPtr\fR argument to \fBTcl_SetNamespaceUnknownHandler\fR
|
||||
will have its reference count incremented if it is a non-empty list.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_CreateCommand(3), Tcl_ListObjAppendList(3), Tcl_SetVar(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
+6
-1
@@ -283,7 +283,12 @@ to reduce storage requirements.
|
||||
Reference counting is used to determine when a value is
|
||||
no longer needed and can safely be freed.
|
||||
A value just created by \fBTcl_NewObj\fR or \fBTcl_NewStringObj\fR
|
||||
has \fIrefCount\fR 0.
|
||||
has \fIrefCount\fR 0, meaning that the object can often be given to a function
|
||||
like \fBTcl_SetObjResult\fR, \fBTcl_ListObjAppendElement\fR, or
|
||||
\fBTcl_DictObjPut\fR (as a value) without explicit reference management, all
|
||||
of which are common use cases. (The latter two require that the the target
|
||||
list or dictionary be well-formed, but that is often easy to arrange when the
|
||||
value is being initially constructed.)
|
||||
The macro \fBTcl_IncrRefCount\fR increments the reference count
|
||||
when a new reference to the value is created.
|
||||
The macro \fBTcl_DecrRefCount\fR decrements the count
|
||||
|
||||
@@ -248,6 +248,28 @@ The \fIfreeIntRepProc\fR implementation must not access the
|
||||
uses of that field during value deletion. The defined tasks for
|
||||
the \fIfreeIntRepProc\fR have no need to consult the \fIbytes\fR
|
||||
member.
|
||||
.PP
|
||||
Note that if a subsidiary value has its reference count reduced to zero
|
||||
during the running of a \fIfreeIntRepProc\fR, that value may be not freed
|
||||
immediately, in order to limit stack usage. However, the value will be freed
|
||||
before the outermost current \fBTcl_DecrRefCount\fR returns.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The \fIobjPtr\fR argument to \fBTcl_AppendAllObjTypes\fR should be an unshared
|
||||
value; this function will not modify the reference count of that value, but
|
||||
will modify its contents. If \fIobjPtr\fR is not (interpretable as) a list,
|
||||
this function will set the interpreter result and produce an error; using an
|
||||
unshared empty value is strongly recommended.
|
||||
.PP
|
||||
The \fIobjPtr\fR argument to \fBTcl_ConvertToType\fR can have any non-zero
|
||||
reference count; this function will not modify the reference count, but may
|
||||
write to the interpreter result on error so values that originate from there
|
||||
should have an additional reference made before calling this.
|
||||
.PP
|
||||
None of the callback functions in the \fBTcl_ObjType\fR structure should
|
||||
modify the reference count of their arguments, but if the values contain
|
||||
subsidiary values (e.g., the elements of a list or the keys of a dictionary)
|
||||
then those subsidiary values may have their reference counts modified.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_NewObj(3), Tcl_DecrRefCount(3), Tcl_IncrRefCount(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -641,6 +641,24 @@ the channel was created with \fBTcl_OpenFileChannel\fR,
|
||||
\fBTcl_OpenCommandChannel\fR, or \fBTcl_MakeFileChannel\fR. Other
|
||||
channel types may return a different type of handle on Windows
|
||||
platforms.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The \fIreadObjPtr\fR argument to \fBTcl_ReadChars\fR must be an unshared
|
||||
value; it will be modified by this function. Using the interpreter result for
|
||||
this purpose is \fIstrongly\fR not recommended; the preferred pattern is to
|
||||
use a new value from \fBTcl_NewObj\fR to receive the data and only to pass it
|
||||
to \fBTcl_SetObjResult\fR if this function succeeds.
|
||||
.PP
|
||||
The \fIlineObjPtr\fR argument to \fBTcl_GetsObj\fR must be an unshared value;
|
||||
it will be modified by this function. Using the interpreter result for this
|
||||
purpose is \fIstrongly\fR not recommended; the preferred pattern is to use a
|
||||
new value from \fBTcl_NewObj\fR to receive the data and only to pass it to
|
||||
\fBTcl_SetObjResult\fR if this function succeeds.
|
||||
.PP
|
||||
The \fIwriteObjPtr\fR argument to \fBTcl_WriteObj\fR should be a value with
|
||||
any reference count. This function will not modify the reference count. Using
|
||||
the interpreter result without adding an additional reference to it is not
|
||||
recommended.
|
||||
.SH "SEE ALSO"
|
||||
DString(3), fconfigure(n), filename(n), fopen(3), Tcl_CreateChannel(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -189,6 +189,12 @@ will be stored at \fIdstPtr\fR; the string inside will have a lifetime linked
|
||||
to the lifetime of the string representation of the argument value that it
|
||||
came from, and so should be copied if it needs to be retained. The
|
||||
\fIsrcPtr\fR and \fIclientData\fR fields are ignored.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The values in the \fIobjv\fR argument to \fBTcl_ParseArgsObjv\fR will not have
|
||||
their reference counts modified by this function. The interpreter result may
|
||||
be modified on error; the values passed should not be the interpreter result
|
||||
with no further reference added.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_GetIndexFromObj(3), Tcl_Main(3), Tcl_CreateObjCommand(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -191,6 +191,7 @@ code with one of the values \fBTCL_OK\fR, \fBTCL_ERROR\fR,
|
||||
some other integer value originating in an extension.
|
||||
In addition, a result value or error message is left in \fIinterp\fR's
|
||||
result; it can be retrieved using \fBTcl_GetObjResult\fR.
|
||||
.SS "DEPRECATED FUNCTIONS"
|
||||
.PP
|
||||
\fBTcl_EvalTokens\fR differs from \fBTcl_EvalTokensStandard\fR only in
|
||||
the return convention used: it returns the result in a new Tcl_Obj.
|
||||
@@ -463,5 +464,12 @@ There are additional fields in the Tcl_Parse structure after the
|
||||
\fBTcl_ParseCommand\fR, \fBTcl_ParseExpr\fR, \fBTcl_ParseBraces\fR,
|
||||
\fBTcl_ParseQuotedString\fR, and \fBTcl_ParseVarName\fR; they should not be
|
||||
referenced by code outside of these procedures.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The result of \fBTcl_EvalTokens\fR is an unshared value with a reference count
|
||||
of 1; the caller of that function should call \fBTcl_DecrRefCount\fR on the
|
||||
result value to dispose of it. (The equivalent with
|
||||
\fBTcl_EvalTokenStandard\fR is just the interpreter result, which can be
|
||||
retrieved with \fBTcl_GetObjResult\fR.)
|
||||
.SH KEYWORDS
|
||||
backslash substitution, braces, command, expression, parse, token, variable substitution
|
||||
|
||||
@@ -91,6 +91,10 @@ functions.
|
||||
\fBTcl_PkgRequireProc\fR is the form of \fBpackage require\fR handling
|
||||
multiple requirements. The other forms are present for backward
|
||||
compatibility and translate their invocations to this form.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The requirements values given (in the \fIobjv\fR argument) to
|
||||
\fBTcl_PkgRequireProc\fR must have non-zero reference counts.
|
||||
.SH KEYWORDS
|
||||
package, present, provide, require, version
|
||||
.SH "SEE ALSO"
|
||||
|
||||
@@ -44,6 +44,12 @@ allow the user to re-issue recently invoked commands.
|
||||
If the \fIflags\fR argument contains the \fBTCL_NO_EVAL\fR bit then
|
||||
the command is recorded without being evaluated.
|
||||
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The reference count of the \fIcmdPtr\fR argument to \fBTcl_RecordAndEvalObj\fR
|
||||
must be at least 1. This function will modify the interpreter result; do not
|
||||
use an existing result as \fIcmdPtr\fR directly without incrementing its
|
||||
reference count.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_EvalObjEx, Tcl_GetObjResult
|
||||
|
||||
|
||||
+18
-2
@@ -51,14 +51,14 @@ can be efficiently searched.
|
||||
.AP Tcl_Obj *patObj in/out
|
||||
Refers to the value from which to get a regular expression. The
|
||||
compiled regular expression is cached in the value.
|
||||
.AP char *text in
|
||||
.AP "const char" *text in
|
||||
Text to search for a match with a regular expression.
|
||||
.AP "const char" *pattern in
|
||||
String in the form of a regular expression pattern.
|
||||
.AP Tcl_RegExp regexp in
|
||||
Compiled regular expression. Must have been returned previously
|
||||
by \fBTcl_GetRegExpFromObj\fR or \fBTcl_RegExpCompile\fR.
|
||||
.AP char *start in
|
||||
.AP "const char" *start in
|
||||
If \fItext\fR is just a portion of some other string, this argument
|
||||
identifies the beginning of the larger string.
|
||||
If it is not the same as \fItext\fR, then no
|
||||
@@ -377,6 +377,22 @@ If no match was found, then it indicates the earliest point at which a
|
||||
match might occur if additional text is appended to the string. If it
|
||||
is no match is possible even with further text, this field will be set
|
||||
to \-1.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The \fItextObj\fR and \fIpatObj\fR arguments to \fBTcl_RegExpMatchObj\fR must
|
||||
have reference counts of at least 1. Note however that this function may set
|
||||
the interpreter result; neither argument should be the direct interpreter
|
||||
result without an additional reference being taken.
|
||||
.PP
|
||||
The \fIpatObj\fR argument to \fBTcl_GetRegExpFromObj\fR must have a reference
|
||||
count of at least 1. Note however that this function may set the interpreter
|
||||
result; the argument should not be the direct interpreter result without an
|
||||
additional reference being taken.
|
||||
.PP
|
||||
The \fItextObj\fR argument to \fBTcl_RegExpExecObj\fR must have a reference
|
||||
count of at least 1. Note however that this function may set the interpreter
|
||||
result; the argument should not be the direct interpreter result without an
|
||||
additional reference being taken.
|
||||
.SH "SEE ALSO"
|
||||
re_syntax(n)
|
||||
.SH KEYWORDS
|
||||
|
||||
+12
-3
@@ -35,20 +35,20 @@ Refers to the Tcl interpreter whose bypass area is accessed.
|
||||
.AP Tcl_Obj* msg in
|
||||
Error message put into a bypass area. A list of return options and values,
|
||||
followed by a string message. Both message and the option/value information
|
||||
are optional.
|
||||
are optional. This \fImust\fR be a well-formed list.
|
||||
.AP Tcl_Obj** msgPtr out
|
||||
Reference to a place where the message stored in the accessed bypass area can
|
||||
be stored in.
|
||||
.BE
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
The current definition of a Tcl channel driver does not permit the direct
|
||||
The standard definition of a Tcl channel driver does not permit the direct
|
||||
return of arbitrary error messages, except for the setting and retrieval of
|
||||
channel options. All other functions are restricted to POSIX error codes.
|
||||
.PP
|
||||
The functions described here overcome this limitation. Channel drivers are
|
||||
allowed to use \fBTcl_SetChannelError\fR and \fBTcl_SetChannelErrorInterp\fR
|
||||
to place arbitrary error messages in \fBbypass areas\fR defined for channels
|
||||
to place arbitrary error messages in \fIbypass areas\fR defined for channels
|
||||
and interpreters. And the generic I/O layer uses \fBTcl_GetChannelError\fR and
|
||||
\fBTcl_GetChannelErrorInterp\fR to look for messages in the bypass areas and
|
||||
arrange for their return as errors. The POSIX error codes set by a driver are
|
||||
@@ -134,6 +134,15 @@ leave all their error information in the interpreter result.
|
||||
.ta 1.9i 4i
|
||||
\fBTcl_Close\fR \fBTcl_UnstackChannel\fR \fBTcl_UnregisterChannel\fR
|
||||
.DE
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The \fImsg\fR argument to \fBTcl_SetChannelError\fR and
|
||||
\fBTcl_SetChannelErrorInterp\fR, if not NULL, may have any reference count;
|
||||
these functions will copy.
|
||||
.PP
|
||||
\fBTcl_GetChannelError\fR and \fBTcl_GetChannelErrorInterp\fR write a value
|
||||
reference into their \fImsgPtr\fR, but do not manipulate its reference count.
|
||||
The reference count will be at least 1 (unless the reference is NULL).
|
||||
.SH "SEE ALSO"
|
||||
Tcl_Close(3), Tcl_OpenFileChannel(3), Tcl_SetErrno(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -239,6 +239,33 @@ typedef void \fBTcl_FreeProc\fR(
|
||||
.PP
|
||||
When \fIfreeProc\fR is called, its \fIblockPtr\fR will be set to
|
||||
the value of \fIresult\fR passed to \fBTcl_SetResult\fR.
|
||||
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The interpreter result is one of the main places that owns references to
|
||||
values, along with the bytecode execution stack, argument lists, variables,
|
||||
and the list and dictionary collection values.
|
||||
.PP
|
||||
\fBTcl_SetObjResult\fR takes a value with an arbitrary reference count
|
||||
\fI(specifically including zero)\fR and guarantees to increment the reference
|
||||
count. If code wishes to continue using the value after setting it as the
|
||||
result, it should add its own reference to it with \fBTcl_IncrRefCount\fR.
|
||||
.PP
|
||||
\fBTcl_GetObjResult\fR returns the current interpreter result value. This will
|
||||
have a reference count of at least 1. If the caller wishes to keep the
|
||||
interpreter result value, it should increment its reference count.
|
||||
.PP
|
||||
\fBTcl_GetStringResult\fR does not manipulate reference counts, but the string
|
||||
it returns is owned by (and has a lifetime controlled by) the current
|
||||
interpreter result value; it should be copied instead of being relied upon to
|
||||
persist after the next Tcl API call, as most Tcl operations can modify the
|
||||
interpreter result.
|
||||
.PP
|
||||
\fBTcl_SetResult\fR, \fBTcl_AppendResult\fR, \fBTcl_AppendResultVA\fR,
|
||||
\fBTcl_AppendElement\fR, and \fBTcl_ResetResult\fR all modify the interpreter
|
||||
result. They may cause the old interpreter result to have its reference count
|
||||
decremented and a new interpreter result to be allocated. After they have been
|
||||
called, the reference count of the interpreter result is guaranteed to be 1.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_AddErrorInfo, Tcl_CreateObjCommand, Tcl_SetErrorCode, Tcl_Interp,
|
||||
Tcl_GetReturnOptions
|
||||
|
||||
@@ -242,6 +242,27 @@ but the array remains.
|
||||
If an array name is specified without an index, then the entire
|
||||
array is removed.
|
||||
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The result of \fBTcl_SetVar2Ex\fR, \fBTcl_ObjSetVar2\fR, \fBTcl_GetVar2Ex\fR,
|
||||
and \fBTcl_ObjGetVar2\fR is (if non-NULL) a value with a reference of at least
|
||||
1, where that reference is held by the variable that the function has just
|
||||
operated upon.
|
||||
.PP
|
||||
The \fInewValuePtr\fR argument to \fBTcl_SetVar2Ex\fR and \fBTcl_ObjSetVar2\fR
|
||||
may be an arbitrary reference count value; its reference count will be
|
||||
incremented on success. However, it is recommended to not use a zero reference
|
||||
count value, as that makes correct handling of the error case tricky.
|
||||
.PP
|
||||
The \fIpart1\fR argument to \fBTcl_ObjSetVar2\fR and \fBTcl_ObjGetVar2\fR can
|
||||
have any reference count; these functions never modify it. It is recommended
|
||||
to not use a zero reference count for this argument.
|
||||
.PP
|
||||
The \fIpart2\fR argument to \fBTcl_ObjSetVar2\fR and \fBTcl_ObjGetVar2\fR, if
|
||||
non-NULL, should not have a zero reference count as these functions may
|
||||
retain a reference to it (particularly when it is used to create an array
|
||||
element that did not previously exist).
|
||||
|
||||
.SH "SEE ALSO"
|
||||
Tcl_GetObjResult, Tcl_GetStringResult, Tcl_TraceVar
|
||||
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ int
|
||||
.AP Tcl_Interp *interp out
|
||||
Interpreter to use for error reporting. If NULL, then no error message
|
||||
is left.
|
||||
.AP char *list in
|
||||
.AP "const char" *list in
|
||||
Pointer to a string with proper list structure.
|
||||
.AP int *argcPtr out
|
||||
Filled in with number of elements in \fIlist\fR.
|
||||
|
||||
@@ -383,6 +383,33 @@ white space, then that value is ignored entirely. This white-space
|
||||
removal was added to make the output of the \fBconcat\fR command
|
||||
cleaner-looking. \fBTcl_ConcatObj\fR returns a pointer to a
|
||||
newly-created value whose ref count is zero.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_NewStringObj\fR, \fBTcl_NewUnicodeObj\fR, \fBTcl_Format\fR,
|
||||
\fBTcl_ObjPrintf\fR, and \fBTcl_ConcatObj\fR always return a zero-reference
|
||||
object, much like \fBTcl_NewObj\fR.
|
||||
.PP
|
||||
\fBTcl_GetStringFromObj\fR, \fBTcl_GetString\fR, \fBTcl_GetUnicodeFromObj\fR,
|
||||
\fBTcl_GetUnicode\fR, \fBTcl_GetUniChar\fR, \fBTcl_GetCharLength\fR, and
|
||||
\fBTcl_GetRange\fR all only work with an existing value; they do not
|
||||
manipulate its reference count in any way.
|
||||
.PP
|
||||
\fBTcl_SetStringObj\fR, \fBTcl_SetUnicodeObj\fR, \fBTcl_AppendToObj\fR,
|
||||
\fBTcl_AppendUnicodeToObj\fR, \fBTcl_AppendObjToObj\fR,
|
||||
\fBTcl_AppendStringsToObj\fR, \fBTcl_AppendStringsToObjVA\fR,
|
||||
\fBTcl_AppendLimitedToObj\fR, \fBTcl_AppendFormatToObj\fR,
|
||||
\fBTcl_AppendPrintfToObj\fR, \fBTcl_SetObjLength\fR, and
|
||||
\fBTcl_AttemptSetObjLength\fR and require their \fIobjPtr\fR to be an unshared
|
||||
value (i.e, a reference count no more than 1) as they will modify it.
|
||||
.PP
|
||||
Additional arguments to the above functions (the \fIappendObjPtr\fR argument
|
||||
to \fBTcl_AppendObjToObj\fR, values in the \fIobjv\fR argument to
|
||||
\fBTcl_Format\fR, \fBTcl_AppendFormatToObj\fR, and \fBTcl_ConcatObj\fR) can
|
||||
have any reference count, but reference counts of zero are not recommended.
|
||||
.PP
|
||||
\fBTcl_Format\fR and \fBTcl_AppendFormatToObj\fR may modify the interpreter
|
||||
result, which involves changing the reference count of a value.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
Tcl_NewObj(3), Tcl_IncrRefCount(3), Tcl_DecrRefCount(3), format(n), sprintf(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -62,6 +62,13 @@ result of the whole substitution on \fIobjPtr\fR will be truncated at
|
||||
the point immediately before the start of the command substitution,
|
||||
and no characters will be added to the result or substitutions
|
||||
performed after that point.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The \fIobjPtr\fR argument to \fBTcl_SubstObj\fR must not have a reference
|
||||
count of zero. This function modifies the interpreter result, both on success
|
||||
and on failure; the result of this function on success is exactly the current
|
||||
interpreter result. Successful results should have their reference count
|
||||
incremented if they are to be retained.
|
||||
.SH "SEE ALSO"
|
||||
subst(n)
|
||||
.SH KEYWORDS
|
||||
|
||||
@@ -262,6 +262,31 @@ file named by the \fBfilename\fR field was modified. Suitable for use with
|
||||
.
|
||||
The type of the uncompressed data (either \fBbinary\fR or \fBtext\fR) if
|
||||
known.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_ZlibDeflate\fR and \fBTcl_ZlibInflate\fR take a value with arbitrary
|
||||
reference count for their \fIdataObj\fR and \fIdictObj\fR arguments (the
|
||||
latter often being NULL instead), and set the interpreter result with their
|
||||
output value (or an error). The existing interpreter result should not be
|
||||
passed as any argument value unless an additional reference is held.
|
||||
.PP
|
||||
\fBTcl_ZlibStreamInit\fR takes a value with arbitrary reference count for its
|
||||
\fIdictObj\fR argument; it only reads from it. The existing interpreter result
|
||||
should not be passed unless an additional reference is held.
|
||||
.PP
|
||||
\fBTcl_ZlibStreamGetCommandName\fR returns a zero reference count value, much
|
||||
like \fBTcl_NewObj\fR.
|
||||
.PP
|
||||
The \fIdataObj\fR argument to \fBTcl_ZlibStreamPut\fR is a value with
|
||||
arbitrary reference count; it is only ever read from.
|
||||
.PP
|
||||
The \fIdataObj\fR argument to \fBTcl_ZlibStreamGet\fR is an unshared value
|
||||
(see \fBTcl_IsShared\fR) that will be updated by the function.
|
||||
.PP
|
||||
The \fIcompDict\fR argument to \fBTcl_ZlibStreamSetCompressionDictionary\fR,
|
||||
if non-NULL, may be duplicated or may have its reference count incremented.
|
||||
Using a zero reference count value is not recommended.
|
||||
|
||||
.SH "PORTABILITY NOTES"
|
||||
These functions will fail gracefully if Tcl is not linked with the zlib
|
||||
library.
|
||||
|
||||
@@ -201,6 +201,15 @@ procedure (if any) returns, \fBTcl_Main\fR will also evaluate
|
||||
the \fBexit\fR command.
|
||||
.PP
|
||||
\fBTcl_Main\fR can not be used in stub-enabled extensions.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
\fBTcl_SetStartupScript\fR takes a value (or NULL) for its \fIpath\fR
|
||||
argument, and will increment the reference count of it.
|
||||
.PP
|
||||
\fBTcl_GetStartupScript\fR returns a value with reference count at least 1, or
|
||||
NULL. It's \fIencodingPtr\fR is also used (if non-NULL) to return a value with
|
||||
a reference count at least 1, or NULL. In both cases, the owner of the values
|
||||
is the current thread.
|
||||
.SH "SEE ALSO"
|
||||
tclsh(1), Tcl_GetStdChannel(3), Tcl_StandardChannels(3), Tcl_AppInit(3),
|
||||
exit(n), encoding(n)
|
||||
|
||||
@@ -359,6 +359,14 @@ Traces on a variable are always removed whenever the variable
|
||||
is deleted; the only time \fBTCL_TRACE_DESTROYED\fR is not set is for
|
||||
a whole-array trace invoked when only a single element of an
|
||||
array is unset.
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
When a \fIproc\fR callback is invoked, and that callback was installed with
|
||||
the \fBTCL_TRACE_RESULT_OBJECT\fR flag, the result of the callback is a
|
||||
Tcl_Obj reference when there is an error. The result will have its reference
|
||||
count decremented once when no longer needed, or may have additional
|
||||
references made to it (e.g., by setting it as the interpreter result with
|
||||
\fBTcl_SetObjResult\fR).
|
||||
.SH BUGS
|
||||
.PP
|
||||
Array traces are not yet integrated with the Tcl \fBinfo exists\fR command,
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
.so man.macros
|
||||
.BS
|
||||
.SH NAME
|
||||
Tcl_UniCharIsAlnum, Tcl_UniCharIsAlpha, Tcl_UniCharIsControl, Tcl_UniCharIsDigit, Tcl_UniCharIsGraph, Tcl_UniCharIsLower, Tcl_UniCharIsPrint, Tcl_UniCharIsPunct, Tcl_UniCharIsSpace, Tcl_UniCharIsUpper, Tcl_UniCharIsWordChar \- routines for classification of Tcl_UniChar characters
|
||||
Tcl_UniCharIsAlnum, Tcl_UniCharIsAlpha, Tcl_UniCharIsControl, Tcl_UniCharIsDigit, Tcl_UniCharIsGraph, Tcl_UniCharIsLower, Tcl_UniCharIsPrint, Tcl_UniCharIsPunct, Tcl_UniCharIsSpace, Tcl_UniCharIsUpper, Tcl_UniCharIsUnicode, Tcl_UniCharIsWordChar \- routines for classification of Tcl_UniChar characters
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
\fB#include <tcl.h>\fR
|
||||
@@ -44,6 +44,9 @@ int
|
||||
\fBTcl_UniCharIsUpper\fR(\fIch\fR)
|
||||
.sp
|
||||
int
|
||||
\fBTcl_UniCharIsUnicode\fR(\fIch\fR)
|
||||
.sp
|
||||
int
|
||||
\fBTcl_UniCharIsWordChar\fR(\fIch\fR)
|
||||
.SH ARGUMENTS
|
||||
.AS int ch
|
||||
@@ -81,6 +84,9 @@ with the various routines.
|
||||
.PP
|
||||
\fBTcl_UniCharIsUpper\fR tests if the character is an uppercase Unicode character.
|
||||
.PP
|
||||
\fBTcl_UniCharIsUnicode\fR tests if the character is a Unicode character, not being
|
||||
a surrogate or noncharacter.
|
||||
.PP
|
||||
\fBTcl_UniCharIsWordChar\fR tests if the character is alphanumeric or
|
||||
a connector punctuation mark.
|
||||
|
||||
|
||||
@@ -73,6 +73,12 @@ is now an \fIindexObject\fR because it was passed to
|
||||
.CS
|
||||
wrong # args: should be "foo barfly fileName count"
|
||||
.CE
|
||||
.SH "REFERENCE COUNT MANAGEMENT"
|
||||
.PP
|
||||
The \fIobjv\fR argument to \fBTcl_WrongNumArgs\fR should be the exact
|
||||
arguments passed to the command or method implementation function that is
|
||||
calling \fBTcl_WrongNumArgs\fR. As such, all values referenced in it should
|
||||
have reference counts greater than zero; this is usually a non-issue.
|
||||
.SH "SEE ALSO"
|
||||
Tcl_GetIndexFromObj(3)
|
||||
.SH KEYWORDS
|
||||
|
||||
+2
-2
@@ -823,7 +823,7 @@ the minus sign one west of Greenwich.
|
||||
A time zone string conforming to the Posix specification of the \fBTZ\fR
|
||||
environment variable will be recognized. The specification
|
||||
may be found at
|
||||
\fIhttp://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html\fR.
|
||||
\fIhttps://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html\fR.
|
||||
.PP
|
||||
If the Posix time zone string contains a DST (Daylight Savings Time)
|
||||
part, but doesn't contain a rule stating when DST starts or ends,
|
||||
@@ -847,7 +847,7 @@ to use it as a location name, as above.
|
||||
.SH "LOCALIZATION"
|
||||
.PP
|
||||
Developers wishing to localize the date and time formatting and parsing
|
||||
are referred to \fIhttp://tip.tcl.tk/173\fR for a
|
||||
are referred to \fIhttps://tip.tcl-lang.org/173\fR for a
|
||||
specification.
|
||||
.SH "FREE FORM SCAN"
|
||||
.PP
|
||||
|
||||
+2
-2
@@ -182,7 +182,7 @@ set cookiedb ~/.tclcookies.db
|
||||
http::configure -cookiejar [\fBhttp::cookiejar new\fR $cookiedb]
|
||||
|
||||
# No further explicit steps are required to use cookies
|
||||
set tok [http::geturl http://core.tcl.tk/]
|
||||
set tok [http::geturl http://core.tcl-lang.org/]
|
||||
.CE
|
||||
.PP
|
||||
To only allow a particular domain to use cookies, perhaps because you only
|
||||
@@ -205,7 +205,7 @@ set cookiedb ~/.tclcookies.db
|
||||
http::configure -cookiejar [MyCookieJar new $cookiedb]
|
||||
|
||||
# No further explicit steps are required to use cookies
|
||||
set tok [http::geturl http://core.tcl.tk/]
|
||||
set tok [http::geturl http://core.tcl-lang.org/]
|
||||
.CE
|
||||
.SH "SEE ALSO"
|
||||
http(n), oo::class(n), sqlite3(n)
|
||||
|
||||
@@ -172,7 +172,7 @@ particularly important website:
|
||||
.PP
|
||||
.CS
|
||||
package require dde
|
||||
\fBdde execute\fR -async iexplore WWW_OpenURL http://www.tcl.tk/
|
||||
\fBdde execute\fR -async iexplore WWW_OpenURL http://www.tcl-lang.org/
|
||||
.CE
|
||||
.SH "SEE ALSO"
|
||||
tk(n), winfo(n), send(n)
|
||||
|
||||
+2
-18
@@ -81,29 +81,13 @@ omitted then the command returns the current system encoding. The
|
||||
system encoding is used whenever Tcl passes strings to system calls.
|
||||
.SH EXAMPLE
|
||||
.PP
|
||||
It is common practice to write script files using a text editor that
|
||||
produces output in the euc-jp encoding, which represents the ASCII
|
||||
characters as singe bytes and Japanese characters as two bytes. This
|
||||
makes it easy to embed literal strings that correspond to non-ASCII
|
||||
characters by simply typing the strings in place in the script.
|
||||
However, because the \fBsource\fR command always reads files using the
|
||||
current system encoding, Tcl will only source such files correctly
|
||||
when the encoding used to write the file is the same. This tends not
|
||||
to be true in an internationalized setting. For example, if such a
|
||||
file was sourced in North America (where the ISO8859\-1 is normally
|
||||
used), each byte in the file would be treated as a separate character
|
||||
that maps to the 00 page in Unicode. The resulting Tcl strings will
|
||||
not contain the expected Japanese characters. Instead, they will
|
||||
contain a sequence of Latin-1 characters that correspond to the bytes
|
||||
of the original string. The \fBencoding\fR command can be used to
|
||||
convert this string to the expected Japanese Unicode characters. For
|
||||
example,
|
||||
The following example converts a byte sequence in Japanese euc-jp encoding to a TCL string:
|
||||
.PP
|
||||
.CS
|
||||
set s [\fBencoding convertfrom\fR euc-jp "\exA4\exCF"]
|
||||
.CE
|
||||
.PP
|
||||
would return the Unicode string
|
||||
The result is the unicode codepoint:
|
||||
.QW "\eu306F" ,
|
||||
which is the Hiragana letter HA.
|
||||
.SH "SEE ALSO"
|
||||
|
||||
+2
-2
@@ -6,14 +6,14 @@
|
||||
'\" See the file "license.terms" for information on usage and redistribution
|
||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
'\"
|
||||
.TH "http" n 2.9 http "Tcl Bundled Packages"
|
||||
.TH "http" n 2.10 http "Tcl Bundled Packages"
|
||||
.so man.macros
|
||||
.BS
|
||||
'\" Note: do not modify the .SH NAME line immediately below!
|
||||
.SH NAME
|
||||
http \- Client-side implementation of the HTTP/1.1 protocol
|
||||
.SH SYNOPSIS
|
||||
\fBpackage require http\fI ?\fB2.9\fR?
|
||||
\fBpackage require http\fI ?\fB2.10\fR?
|
||||
.\" See Also -useragent option documentation in body!
|
||||
.sp
|
||||
\fB::http::config\fR ?\fI\-option value\fR ...?
|
||||
|
||||
+2
-2
@@ -735,7 +735,7 @@ To register to a callback, use:
|
||||
namespace eval gui {
|
||||
msgcat::mcpackageconfig changecmd updateGUI
|
||||
|
||||
proc updateGui args {
|
||||
proc updateGUI args {
|
||||
puts "New locale is '[lindex $args 0]'."
|
||||
}
|
||||
}
|
||||
@@ -769,7 +769,7 @@ msgcat::mcpackageconfig unknowncmd ""
|
||||
.CE
|
||||
As an example, the user requires the week day in a certain locale as follows:
|
||||
.CS
|
||||
clock format clock seconds -format %A -locale fr
|
||||
clock format [clock seconds] -format %A -locale fr
|
||||
.CE
|
||||
\fBclock\fR sets the package locale to \fBfr\fR and looks for the day name as follows:
|
||||
.CS
|
||||
|
||||
+8
-7
@@ -319,9 +319,10 @@ specified as for the \fBindex\fR method. If \fInewstring\fR is
|
||||
specified, then it is placed in the removed character range. If
|
||||
\fIfirst\fR is less than zero then it is treated as if it were zero,
|
||||
and if \fIlast\fR is greater than or equal to the length of the string
|
||||
then it is treated as if it were \fBend\fR. If \fIfirst\fR is greater
|
||||
than \fIlast\fR or the length of the initial string, or \fIlast\fR is
|
||||
less than 0, then the initial string is returned untouched.
|
||||
then it is treated as if it were \fBend\fR. The initial string is
|
||||
returned untouched, if \fIfirst\fR is greater than \fIlast\fR, or if
|
||||
\fIfirst\fR is equal to or greater than the length of the initial string,
|
||||
or \fIlast\fR is less than 0.
|
||||
.TP
|
||||
\fBstring reverse \fIstring\fR
|
||||
.
|
||||
@@ -413,10 +414,10 @@ store the representation is of very low value (except to C extension
|
||||
code, which has direct access for the purpose of memory management,
|
||||
etc.)
|
||||
.PP
|
||||
\fICompatibility note:\fR it is likely that this subcommand will be
|
||||
withdrawn in a future version of Tcl. It is better to use the
|
||||
\fBencoding convertto\fR command to convert a string to a known
|
||||
encoding and then apply \fBstring length\fR to that.
|
||||
\fICompatibility note:\fR This subcommand is deprecated and will
|
||||
be removed in Tcl 9.0. It is better to use the \fBencoding convertto\fR
|
||||
command to convert a string to a known encoding (e.g. "utf-8" or "cesu-8")
|
||||
and then apply \fBstring length\fR to that.
|
||||
.PP
|
||||
.CS
|
||||
\fBstring length\fR [encoding convertto utf-8 $theString]
|
||||
|
||||
@@ -298,9 +298,9 @@ environment variables:
|
||||
.SH "SEE ALSO"
|
||||
package(n), Tcl Improvement Proposal #189
|
||||
.QW "\fITcl Modules\fR"
|
||||
(online at http://tip.tcl.tk/189.html), Tcl Improvement Proposal #190
|
||||
(online at https://tip.tcl-lang.org/189.html), Tcl Improvement Proposal #190
|
||||
.QW "\fIImplementation Choices for Tcl Modules\fR"
|
||||
(online at http://tip.tcl.tk/190.html)
|
||||
(online at https://tip.tcl-lang.org/190.html)
|
||||
.SH "KEYWORDS"
|
||||
modules, package
|
||||
.\" Local Variables:
|
||||
|
||||
+319
-304
@@ -140,34 +140,34 @@ static const crange alphaRangeTable[] = {
|
||||
{0x3F7, 0x481}, {0x48A, 0x52F}, {0x531, 0x556}, {0x560, 0x588},
|
||||
{0x5D0, 0x5EA}, {0x5EF, 0x5F2}, {0x620, 0x64A}, {0x671, 0x6D3},
|
||||
{0x6FA, 0x6FC}, {0x712, 0x72F}, {0x74D, 0x7A5}, {0x7CA, 0x7EA},
|
||||
{0x800, 0x815}, {0x840, 0x858}, {0x860, 0x86A}, {0x8A0, 0x8B4},
|
||||
{0x8B6, 0x8C7}, {0x904, 0x939}, {0x958, 0x961}, {0x971, 0x980},
|
||||
{0x985, 0x98C}, {0x993, 0x9A8}, {0x9AA, 0x9B0}, {0x9B6, 0x9B9},
|
||||
{0x9DF, 0x9E1}, {0xA05, 0xA0A}, {0xA13, 0xA28}, {0xA2A, 0xA30},
|
||||
{0xA59, 0xA5C}, {0xA72, 0xA74}, {0xA85, 0xA8D}, {0xA8F, 0xA91},
|
||||
{0xA93, 0xAA8}, {0xAAA, 0xAB0}, {0xAB5, 0xAB9}, {0xB05, 0xB0C},
|
||||
{0xB13, 0xB28}, {0xB2A, 0xB30}, {0xB35, 0xB39}, {0xB5F, 0xB61},
|
||||
{0xB85, 0xB8A}, {0xB8E, 0xB90}, {0xB92, 0xB95}, {0xBA8, 0xBAA},
|
||||
{0xBAE, 0xBB9}, {0xC05, 0xC0C}, {0xC0E, 0xC10}, {0xC12, 0xC28},
|
||||
{0xC2A, 0xC39}, {0xC58, 0xC5A}, {0xC85, 0xC8C}, {0xC8E, 0xC90},
|
||||
{0xC92, 0xCA8}, {0xCAA, 0xCB3}, {0xCB5, 0xCB9}, {0xD04, 0xD0C},
|
||||
{0xD0E, 0xD10}, {0xD12, 0xD3A}, {0xD54, 0xD56}, {0xD5F, 0xD61},
|
||||
{0xD7A, 0xD7F}, {0xD85, 0xD96}, {0xD9A, 0xDB1}, {0xDB3, 0xDBB},
|
||||
{0xDC0, 0xDC6}, {0xE01, 0xE30}, {0xE40, 0xE46}, {0xE86, 0xE8A},
|
||||
{0xE8C, 0xEA3}, {0xEA7, 0xEB0}, {0xEC0, 0xEC4}, {0xEDC, 0xEDF},
|
||||
{0xF40, 0xF47}, {0xF49, 0xF6C}, {0xF88, 0xF8C}, {0x1000, 0x102A},
|
||||
{0x1050, 0x1055}, {0x105A, 0x105D}, {0x106E, 0x1070}, {0x1075, 0x1081},
|
||||
{0x10A0, 0x10C5}, {0x10D0, 0x10FA}, {0x10FC, 0x1248}, {0x124A, 0x124D},
|
||||
{0x1250, 0x1256}, {0x125A, 0x125D}, {0x1260, 0x1288}, {0x128A, 0x128D},
|
||||
{0x1290, 0x12B0}, {0x12B2, 0x12B5}, {0x12B8, 0x12BE}, {0x12C2, 0x12C5},
|
||||
{0x12C8, 0x12D6}, {0x12D8, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x135A},
|
||||
{0x1380, 0x138F}, {0x13A0, 0x13F5}, {0x13F8, 0x13FD}, {0x1401, 0x166C},
|
||||
{0x166F, 0x167F}, {0x1681, 0x169A}, {0x16A0, 0x16EA}, {0x16F1, 0x16F8},
|
||||
{0x1700, 0x170C}, {0x170E, 0x1711}, {0x1720, 0x1731}, {0x1740, 0x1751},
|
||||
{0x800, 0x815}, {0x840, 0x858}, {0x860, 0x86A}, {0x870, 0x887},
|
||||
{0x889, 0x88E}, {0x8A0, 0x8C9}, {0x904, 0x939}, {0x958, 0x961},
|
||||
{0x971, 0x980}, {0x985, 0x98C}, {0x993, 0x9A8}, {0x9AA, 0x9B0},
|
||||
{0x9B6, 0x9B9}, {0x9DF, 0x9E1}, {0xA05, 0xA0A}, {0xA13, 0xA28},
|
||||
{0xA2A, 0xA30}, {0xA59, 0xA5C}, {0xA72, 0xA74}, {0xA85, 0xA8D},
|
||||
{0xA8F, 0xA91}, {0xA93, 0xAA8}, {0xAAA, 0xAB0}, {0xAB5, 0xAB9},
|
||||
{0xB05, 0xB0C}, {0xB13, 0xB28}, {0xB2A, 0xB30}, {0xB35, 0xB39},
|
||||
{0xB5F, 0xB61}, {0xB85, 0xB8A}, {0xB8E, 0xB90}, {0xB92, 0xB95},
|
||||
{0xBA8, 0xBAA}, {0xBAE, 0xBB9}, {0xC05, 0xC0C}, {0xC0E, 0xC10},
|
||||
{0xC12, 0xC28}, {0xC2A, 0xC39}, {0xC58, 0xC5A}, {0xC85, 0xC8C},
|
||||
{0xC8E, 0xC90}, {0xC92, 0xCA8}, {0xCAA, 0xCB3}, {0xCB5, 0xCB9},
|
||||
{0xD04, 0xD0C}, {0xD0E, 0xD10}, {0xD12, 0xD3A}, {0xD54, 0xD56},
|
||||
{0xD5F, 0xD61}, {0xD7A, 0xD7F}, {0xD85, 0xD96}, {0xD9A, 0xDB1},
|
||||
{0xDB3, 0xDBB}, {0xDC0, 0xDC6}, {0xE01, 0xE30}, {0xE40, 0xE46},
|
||||
{0xE86, 0xE8A}, {0xE8C, 0xEA3}, {0xEA7, 0xEB0}, {0xEC0, 0xEC4},
|
||||
{0xEDC, 0xEDF}, {0xF40, 0xF47}, {0xF49, 0xF6C}, {0xF88, 0xF8C},
|
||||
{0x1000, 0x102A}, {0x1050, 0x1055}, {0x105A, 0x105D}, {0x106E, 0x1070},
|
||||
{0x1075, 0x1081}, {0x10A0, 0x10C5}, {0x10D0, 0x10FA}, {0x10FC, 0x1248},
|
||||
{0x124A, 0x124D}, {0x1250, 0x1256}, {0x125A, 0x125D}, {0x1260, 0x1288},
|
||||
{0x128A, 0x128D}, {0x1290, 0x12B0}, {0x12B2, 0x12B5}, {0x12B8, 0x12BE},
|
||||
{0x12C2, 0x12C5}, {0x12C8, 0x12D6}, {0x12D8, 0x1310}, {0x1312, 0x1315},
|
||||
{0x1318, 0x135A}, {0x1380, 0x138F}, {0x13A0, 0x13F5}, {0x13F8, 0x13FD},
|
||||
{0x1401, 0x166C}, {0x166F, 0x167F}, {0x1681, 0x169A}, {0x16A0, 0x16EA},
|
||||
{0x16F1, 0x16F8}, {0x1700, 0x1711}, {0x171F, 0x1731}, {0x1740, 0x1751},
|
||||
{0x1760, 0x176C}, {0x176E, 0x1770}, {0x1780, 0x17B3}, {0x1820, 0x1878},
|
||||
{0x1880, 0x1884}, {0x1887, 0x18A8}, {0x18B0, 0x18F5}, {0x1900, 0x191E},
|
||||
{0x1950, 0x196D}, {0x1970, 0x1974}, {0x1980, 0x19AB}, {0x19B0, 0x19C9},
|
||||
{0x1A00, 0x1A16}, {0x1A20, 0x1A54}, {0x1B05, 0x1B33}, {0x1B45, 0x1B4B},
|
||||
{0x1A00, 0x1A16}, {0x1A20, 0x1A54}, {0x1B05, 0x1B33}, {0x1B45, 0x1B4C},
|
||||
{0x1B83, 0x1BA0}, {0x1BBA, 0x1BE5}, {0x1C00, 0x1C23}, {0x1C4D, 0x1C4F},
|
||||
{0x1C5A, 0x1C7D}, {0x1C80, 0x1C88}, {0x1C90, 0x1CBA}, {0x1CBD, 0x1CBF},
|
||||
{0x1CE9, 0x1CEC}, {0x1CEE, 0x1CF3}, {0x1D00, 0x1DBF}, {0x1E00, 0x1F15},
|
||||
@@ -176,74 +176,78 @@ static const crange alphaRangeTable[] = {
|
||||
{0x1FC6, 0x1FCC}, {0x1FD0, 0x1FD3}, {0x1FD6, 0x1FDB}, {0x1FE0, 0x1FEC},
|
||||
{0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFC}, {0x2090, 0x209C}, {0x210A, 0x2113},
|
||||
{0x2119, 0x211D}, {0x212A, 0x212D}, {0x212F, 0x2139}, {0x213C, 0x213F},
|
||||
{0x2145, 0x2149}, {0x2C00, 0x2C2E}, {0x2C30, 0x2C5E}, {0x2C60, 0x2CE4},
|
||||
{0x2CEB, 0x2CEE}, {0x2D00, 0x2D25}, {0x2D30, 0x2D67}, {0x2D80, 0x2D96},
|
||||
{0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, {0x2DB8, 0x2DBE},
|
||||
{0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE}, {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE},
|
||||
{0x3031, 0x3035}, {0x3041, 0x3096}, {0x309D, 0x309F}, {0x30A1, 0x30FA},
|
||||
{0x30FC, 0x30FF}, {0x3105, 0x312F}, {0x3131, 0x318E}, {0x31A0, 0x31BF},
|
||||
{0x31F0, 0x31FF}, {0x3400, 0x4DBF}, {0x4E00, 0x9FFC}, {0xA000, 0xA48C},
|
||||
{0xA4D0, 0xA4FD}, {0xA500, 0xA60C}, {0xA610, 0xA61F}, {0xA640, 0xA66E},
|
||||
{0xA67F, 0xA69D}, {0xA6A0, 0xA6E5}, {0xA717, 0xA71F}, {0xA722, 0xA788},
|
||||
{0xA78B, 0xA7BF}, {0xA7C2, 0xA7CA}, {0xA7F5, 0xA801}, {0xA803, 0xA805},
|
||||
{0xA807, 0xA80A}, {0xA80C, 0xA822}, {0xA840, 0xA873}, {0xA882, 0xA8B3},
|
||||
{0xA8F2, 0xA8F7}, {0xA90A, 0xA925}, {0xA930, 0xA946}, {0xA960, 0xA97C},
|
||||
{0xA984, 0xA9B2}, {0xA9E0, 0xA9E4}, {0xA9E6, 0xA9EF}, {0xA9FA, 0xA9FE},
|
||||
{0xAA00, 0xAA28}, {0xAA40, 0xAA42}, {0xAA44, 0xAA4B}, {0xAA60, 0xAA76},
|
||||
{0xAA7E, 0xAAAF}, {0xAAB9, 0xAABD}, {0xAADB, 0xAADD}, {0xAAE0, 0xAAEA},
|
||||
{0xAAF2, 0xAAF4}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, {0xAB11, 0xAB16},
|
||||
{0xAB20, 0xAB26}, {0xAB28, 0xAB2E}, {0xAB30, 0xAB5A}, {0xAB5C, 0xAB69},
|
||||
{0xAB70, 0xABE2}, {0xAC00, 0xD7A3}, {0xD7B0, 0xD7C6}, {0xD7CB, 0xD7FB},
|
||||
{0xF900, 0xFA6D}, {0xFA70, 0xFAD9}, {0xFB00, 0xFB06}, {0xFB13, 0xFB17},
|
||||
{0xFB1F, 0xFB28}, {0xFB2A, 0xFB36}, {0xFB38, 0xFB3C}, {0xFB46, 0xFBB1},
|
||||
{0xFBD3, 0xFD3D}, {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7}, {0xFDF0, 0xFDFB},
|
||||
{0xFE70, 0xFE74}, {0xFE76, 0xFEFC}, {0xFF21, 0xFF3A}, {0xFF41, 0xFF5A},
|
||||
{0xFF66, 0xFFBE}, {0xFFC2, 0xFFC7}, {0xFFCA, 0xFFCF}, {0xFFD2, 0xFFD7},
|
||||
{0xFFDA, 0xFFDC}
|
||||
{0x2145, 0x2149}, {0x2C00, 0x2CE4}, {0x2CEB, 0x2CEE}, {0x2D00, 0x2D25},
|
||||
{0x2D30, 0x2D67}, {0x2D80, 0x2D96}, {0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE},
|
||||
{0x2DB0, 0x2DB6}, {0x2DB8, 0x2DBE}, {0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE},
|
||||
{0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x3031, 0x3035}, {0x3041, 0x3096},
|
||||
{0x309D, 0x309F}, {0x30A1, 0x30FA}, {0x30FC, 0x30FF}, {0x3105, 0x312F},
|
||||
{0x3131, 0x318E}, {0x31A0, 0x31BF}, {0x31F0, 0x31FF}, {0x3400, 0x4DBF},
|
||||
{0x4E00, 0xA48C}, {0xA4D0, 0xA4FD}, {0xA500, 0xA60C}, {0xA610, 0xA61F},
|
||||
{0xA640, 0xA66E}, {0xA67F, 0xA69D}, {0xA6A0, 0xA6E5}, {0xA717, 0xA71F},
|
||||
{0xA722, 0xA788}, {0xA78B, 0xA7CA}, {0xA7D5, 0xA7D9}, {0xA7F2, 0xA801},
|
||||
{0xA803, 0xA805}, {0xA807, 0xA80A}, {0xA80C, 0xA822}, {0xA840, 0xA873},
|
||||
{0xA882, 0xA8B3}, {0xA8F2, 0xA8F7}, {0xA90A, 0xA925}, {0xA930, 0xA946},
|
||||
{0xA960, 0xA97C}, {0xA984, 0xA9B2}, {0xA9E0, 0xA9E4}, {0xA9E6, 0xA9EF},
|
||||
{0xA9FA, 0xA9FE}, {0xAA00, 0xAA28}, {0xAA40, 0xAA42}, {0xAA44, 0xAA4B},
|
||||
{0xAA60, 0xAA76}, {0xAA7E, 0xAAAF}, {0xAAB9, 0xAABD}, {0xAADB, 0xAADD},
|
||||
{0xAAE0, 0xAAEA}, {0xAAF2, 0xAAF4}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E},
|
||||
{0xAB11, 0xAB16}, {0xAB20, 0xAB26}, {0xAB28, 0xAB2E}, {0xAB30, 0xAB5A},
|
||||
{0xAB5C, 0xAB69}, {0xAB70, 0xABE2}, {0xAC00, 0xD7A3}, {0xD7B0, 0xD7C6},
|
||||
{0xD7CB, 0xD7FB}, {0xF900, 0xFA6D}, {0xFA70, 0xFAD9}, {0xFB00, 0xFB06},
|
||||
{0xFB13, 0xFB17}, {0xFB1F, 0xFB28}, {0xFB2A, 0xFB36}, {0xFB38, 0xFB3C},
|
||||
{0xFB46, 0xFBB1}, {0xFBD3, 0xFD3D}, {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7},
|
||||
{0xFDF0, 0xFDFB}, {0xFE70, 0xFE74}, {0xFE76, 0xFEFC}, {0xFF21, 0xFF3A},
|
||||
{0xFF41, 0xFF5A}, {0xFF66, 0xFFBE}, {0xFFC2, 0xFFC7}, {0xFFCA, 0xFFCF},
|
||||
{0xFFD2, 0xFFD7}, {0xFFDA, 0xFFDC}
|
||||
#if CHRBITS > 16
|
||||
,{0x10000, 0x1000B}, {0x1000D, 0x10026}, {0x10028, 0x1003A}, {0x1003F, 0x1004D},
|
||||
{0x10050, 0x1005D}, {0x10080, 0x100FA}, {0x10280, 0x1029C}, {0x102A0, 0x102D0},
|
||||
{0x10300, 0x1031F}, {0x1032D, 0x10340}, {0x10342, 0x10349}, {0x10350, 0x10375},
|
||||
{0x10380, 0x1039D}, {0x103A0, 0x103C3}, {0x103C8, 0x103CF}, {0x10400, 0x1049D},
|
||||
{0x104B0, 0x104D3}, {0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563},
|
||||
{0x10600, 0x10736}, {0x10740, 0x10755}, {0x10760, 0x10767}, {0x10800, 0x10805},
|
||||
{0x1080A, 0x10835}, {0x1083F, 0x10855}, {0x10860, 0x10876}, {0x10880, 0x1089E},
|
||||
{0x108E0, 0x108F2}, {0x10900, 0x10915}, {0x10920, 0x10939}, {0x10980, 0x109B7},
|
||||
{0x10A10, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A35}, {0x10A60, 0x10A7C},
|
||||
{0x10A80, 0x10A9C}, {0x10AC0, 0x10AC7}, {0x10AC9, 0x10AE4}, {0x10B00, 0x10B35},
|
||||
{0x10B40, 0x10B55}, {0x10B60, 0x10B72}, {0x10B80, 0x10B91}, {0x10C00, 0x10C48},
|
||||
{0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, {0x10D00, 0x10D23}, {0x10E80, 0x10EA9},
|
||||
{0x10F00, 0x10F1C}, {0x10F30, 0x10F45}, {0x10FB0, 0x10FC4}, {0x10FE0, 0x10FF6},
|
||||
{0x11003, 0x11037}, {0x11083, 0x110AF}, {0x110D0, 0x110E8}, {0x11103, 0x11126},
|
||||
{0x11150, 0x11172}, {0x11183, 0x111B2}, {0x111C1, 0x111C4}, {0x11200, 0x11211},
|
||||
{0x11213, 0x1122B}, {0x11280, 0x11286}, {0x1128A, 0x1128D}, {0x1128F, 0x1129D},
|
||||
{0x1129F, 0x112A8}, {0x112B0, 0x112DE}, {0x11305, 0x1130C}, {0x11313, 0x11328},
|
||||
{0x1132A, 0x11330}, {0x11335, 0x11339}, {0x1135D, 0x11361}, {0x11400, 0x11434},
|
||||
{0x11447, 0x1144A}, {0x1145F, 0x11461}, {0x11480, 0x114AF}, {0x11580, 0x115AE},
|
||||
{0x115D8, 0x115DB}, {0x11600, 0x1162F}, {0x11680, 0x116AA}, {0x11700, 0x1171A},
|
||||
{0x11800, 0x1182B}, {0x118A0, 0x118DF}, {0x118FF, 0x11906}, {0x1190C, 0x11913},
|
||||
{0x11918, 0x1192F}, {0x119A0, 0x119A7}, {0x119AA, 0x119D0}, {0x11A0B, 0x11A32},
|
||||
{0x11A5C, 0x11A89}, {0x11AC0, 0x11AF8}, {0x11C00, 0x11C08}, {0x11C0A, 0x11C2E},
|
||||
{0x11C72, 0x11C8F}, {0x11D00, 0x11D06}, {0x11D0B, 0x11D30}, {0x11D60, 0x11D65},
|
||||
{0x11D6A, 0x11D89}, {0x11EE0, 0x11EF2}, {0x12000, 0x12399}, {0x12480, 0x12543},
|
||||
{0x10570, 0x1057A}, {0x1057C, 0x1058A}, {0x1058C, 0x10592}, {0x10597, 0x105A1},
|
||||
{0x105A3, 0x105B1}, {0x105B3, 0x105B9}, {0x10600, 0x10736}, {0x10740, 0x10755},
|
||||
{0x10760, 0x10767}, {0x10780, 0x10785}, {0x10787, 0x107B0}, {0x107B2, 0x107BA},
|
||||
{0x10800, 0x10805}, {0x1080A, 0x10835}, {0x1083F, 0x10855}, {0x10860, 0x10876},
|
||||
{0x10880, 0x1089E}, {0x108E0, 0x108F2}, {0x10900, 0x10915}, {0x10920, 0x10939},
|
||||
{0x10980, 0x109B7}, {0x10A10, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A35},
|
||||
{0x10A60, 0x10A7C}, {0x10A80, 0x10A9C}, {0x10AC0, 0x10AC7}, {0x10AC9, 0x10AE4},
|
||||
{0x10B00, 0x10B35}, {0x10B40, 0x10B55}, {0x10B60, 0x10B72}, {0x10B80, 0x10B91},
|
||||
{0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, {0x10D00, 0x10D23},
|
||||
{0x10E80, 0x10EA9}, {0x10F00, 0x10F1C}, {0x10F30, 0x10F45}, {0x10F70, 0x10F81},
|
||||
{0x10FB0, 0x10FC4}, {0x10FE0, 0x10FF6}, {0x11003, 0x11037}, {0x11083, 0x110AF},
|
||||
{0x110D0, 0x110E8}, {0x11103, 0x11126}, {0x11150, 0x11172}, {0x11183, 0x111B2},
|
||||
{0x111C1, 0x111C4}, {0x11200, 0x11211}, {0x11213, 0x1122B}, {0x11280, 0x11286},
|
||||
{0x1128A, 0x1128D}, {0x1128F, 0x1129D}, {0x1129F, 0x112A8}, {0x112B0, 0x112DE},
|
||||
{0x11305, 0x1130C}, {0x11313, 0x11328}, {0x1132A, 0x11330}, {0x11335, 0x11339},
|
||||
{0x1135D, 0x11361}, {0x11400, 0x11434}, {0x11447, 0x1144A}, {0x1145F, 0x11461},
|
||||
{0x11480, 0x114AF}, {0x11580, 0x115AE}, {0x115D8, 0x115DB}, {0x11600, 0x1162F},
|
||||
{0x11680, 0x116AA}, {0x11700, 0x1171A}, {0x11740, 0x11746}, {0x11800, 0x1182B},
|
||||
{0x118A0, 0x118DF}, {0x118FF, 0x11906}, {0x1190C, 0x11913}, {0x11918, 0x1192F},
|
||||
{0x119A0, 0x119A7}, {0x119AA, 0x119D0}, {0x11A0B, 0x11A32}, {0x11A5C, 0x11A89},
|
||||
{0x11AB0, 0x11AF8}, {0x11C00, 0x11C08}, {0x11C0A, 0x11C2E}, {0x11C72, 0x11C8F},
|
||||
{0x11D00, 0x11D06}, {0x11D0B, 0x11D30}, {0x11D60, 0x11D65}, {0x11D6A, 0x11D89},
|
||||
{0x11EE0, 0x11EF2}, {0x12000, 0x12399}, {0x12480, 0x12543}, {0x12F90, 0x12FF0},
|
||||
{0x13000, 0x1342E}, {0x14400, 0x14646}, {0x16800, 0x16A38}, {0x16A40, 0x16A5E},
|
||||
{0x16AD0, 0x16AED}, {0x16B00, 0x16B2F}, {0x16B40, 0x16B43}, {0x16B63, 0x16B77},
|
||||
{0x16B7D, 0x16B8F}, {0x16E40, 0x16E7F}, {0x16F00, 0x16F4A}, {0x16F93, 0x16F9F},
|
||||
{0x17000, 0x187F7}, {0x18800, 0x18CD5}, {0x18D00, 0x18D08}, {0x1B000, 0x1B11E},
|
||||
{0x1B150, 0x1B152}, {0x1B164, 0x1B167}, {0x1B170, 0x1B2FB}, {0x1BC00, 0x1BC6A},
|
||||
{0x1BC70, 0x1BC7C}, {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1D400, 0x1D454},
|
||||
{0x1D456, 0x1D49C}, {0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B9}, {0x1D4BD, 0x1D4C3},
|
||||
{0x1D4C5, 0x1D505}, {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, {0x1D516, 0x1D51C},
|
||||
{0x1D51E, 0x1D539}, {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, {0x1D54A, 0x1D550},
|
||||
{0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D6C0}, {0x1D6C2, 0x1D6DA}, {0x1D6DC, 0x1D6FA},
|
||||
{0x1D6FC, 0x1D714}, {0x1D716, 0x1D734}, {0x1D736, 0x1D74E}, {0x1D750, 0x1D76E},
|
||||
{0x1D770, 0x1D788}, {0x1D78A, 0x1D7A8}, {0x1D7AA, 0x1D7C2}, {0x1D7C4, 0x1D7CB},
|
||||
{0x1E100, 0x1E12C}, {0x1E137, 0x1E13D}, {0x1E2C0, 0x1E2EB}, {0x1E800, 0x1E8C4},
|
||||
{0x16A70, 0x16ABE}, {0x16AD0, 0x16AED}, {0x16B00, 0x16B2F}, {0x16B40, 0x16B43},
|
||||
{0x16B63, 0x16B77}, {0x16B7D, 0x16B8F}, {0x16E40, 0x16E7F}, {0x16F00, 0x16F4A},
|
||||
{0x16F93, 0x16F9F}, {0x17000, 0x187F7}, {0x18800, 0x18CD5}, {0x18D00, 0x18D08},
|
||||
{0x1AFF0, 0x1AFF3}, {0x1AFF5, 0x1AFFB}, {0x1B000, 0x1B122}, {0x1B150, 0x1B152},
|
||||
{0x1B164, 0x1B167}, {0x1B170, 0x1B2FB}, {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C},
|
||||
{0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1D400, 0x1D454}, {0x1D456, 0x1D49C},
|
||||
{0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B9}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D505},
|
||||
{0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D51E, 0x1D539},
|
||||
{0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, {0x1D54A, 0x1D550}, {0x1D552, 0x1D6A5},
|
||||
{0x1D6A8, 0x1D6C0}, {0x1D6C2, 0x1D6DA}, {0x1D6DC, 0x1D6FA}, {0x1D6FC, 0x1D714},
|
||||
{0x1D716, 0x1D734}, {0x1D736, 0x1D74E}, {0x1D750, 0x1D76E}, {0x1D770, 0x1D788},
|
||||
{0x1D78A, 0x1D7A8}, {0x1D7AA, 0x1D7C2}, {0x1D7C4, 0x1D7CB}, {0x1DF00, 0x1DF1E},
|
||||
{0x1E100, 0x1E12C}, {0x1E137, 0x1E13D}, {0x1E290, 0x1E2AD}, {0x1E2C0, 0x1E2EB},
|
||||
{0x1E7E0, 0x1E7E6}, {0x1E7E8, 0x1E7EB}, {0x1E7F0, 0x1E7FE}, {0x1E800, 0x1E8C4},
|
||||
{0x1E900, 0x1E943}, {0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE29, 0x1EE32},
|
||||
{0x1EE34, 0x1EE37}, {0x1EE4D, 0x1EE4F}, {0x1EE67, 0x1EE6A}, {0x1EE6C, 0x1EE72},
|
||||
{0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B},
|
||||
{0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, {0x20000, 0x2A6DD},
|
||||
{0x2A700, 0x2B734}, {0x2B740, 0x2B81D}, {0x2B820, 0x2CEA1}, {0x2CEB0, 0x2EBE0},
|
||||
{0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, {0x20000, 0x2A6DF},
|
||||
{0x2A700, 0x2B738}, {0x2B740, 0x2B81D}, {0x2B820, 0x2CEA1}, {0x2CEB0, 0x2EBE0},
|
||||
{0x2F800, 0x2FA1D}, {0x30000, 0x3134A}
|
||||
#endif
|
||||
};
|
||||
@@ -259,27 +263,28 @@ static const chr alphaCharTable[] = {
|
||||
0xA38, 0xA39, 0xA5E, 0xAB2, 0xAB3, 0xABD, 0xAD0, 0xAE0, 0xAE1,
|
||||
0xAF9, 0xB0F, 0xB10, 0xB32, 0xB33, 0xB3D, 0xB5C, 0xB5D, 0xB71,
|
||||
0xB83, 0xB99, 0xB9A, 0xB9C, 0xB9E, 0xB9F, 0xBA3, 0xBA4, 0xBD0,
|
||||
0xC3D, 0xC60, 0xC61, 0xC80, 0xCBD, 0xCDE, 0xCE0, 0xCE1, 0xCF1,
|
||||
0xCF2, 0xD3D, 0xD4E, 0xDBD, 0xE32, 0xE33, 0xE81, 0xE82, 0xE84,
|
||||
0xEA5, 0xEB2, 0xEB3, 0xEBD, 0xEC6, 0xF00, 0x103F, 0x1061, 0x1065,
|
||||
0x1066, 0x108E, 0x10C7, 0x10CD, 0x1258, 0x12C0, 0x17D7, 0x17DC, 0x18AA,
|
||||
0x1AA7, 0x1BAE, 0x1BAF, 0x1CF5, 0x1CF6, 0x1CFA, 0x1F59, 0x1F5B, 0x1F5D,
|
||||
0x1FBE, 0x2071, 0x207F, 0x2102, 0x2107, 0x2115, 0x2124, 0x2126, 0x2128,
|
||||
0x214E, 0x2183, 0x2184, 0x2CF2, 0x2CF3, 0x2D27, 0x2D2D, 0x2D6F, 0x2E2F,
|
||||
0x3005, 0x3006, 0x303B, 0x303C, 0xA62A, 0xA62B, 0xA8FB, 0xA8FD, 0xA8FE,
|
||||
0xA9CF, 0xAA7A, 0xAAB1, 0xAAB5, 0xAAB6, 0xAAC0, 0xAAC2, 0xFB1D, 0xFB3E,
|
||||
0xFB40, 0xFB41, 0xFB43, 0xFB44
|
||||
0xC3D, 0xC5D, 0xC60, 0xC61, 0xC80, 0xCBD, 0xCDD, 0xCDE, 0xCE0,
|
||||
0xCE1, 0xCF1, 0xCF2, 0xD3D, 0xD4E, 0xDBD, 0xE32, 0xE33, 0xE81,
|
||||
0xE82, 0xE84, 0xEA5, 0xEB2, 0xEB3, 0xEBD, 0xEC6, 0xF00, 0x103F,
|
||||
0x1061, 0x1065, 0x1066, 0x108E, 0x10C7, 0x10CD, 0x1258, 0x12C0, 0x17D7,
|
||||
0x17DC, 0x18AA, 0x1AA7, 0x1BAE, 0x1BAF, 0x1CF5, 0x1CF6, 0x1CFA, 0x1F59,
|
||||
0x1F5B, 0x1F5D, 0x1FBE, 0x2071, 0x207F, 0x2102, 0x2107, 0x2115, 0x2124,
|
||||
0x2126, 0x2128, 0x214E, 0x2183, 0x2184, 0x2CF2, 0x2CF3, 0x2D27, 0x2D2D,
|
||||
0x2D6F, 0x2E2F, 0x3005, 0x3006, 0x303B, 0x303C, 0xA62A, 0xA62B, 0xA7D0,
|
||||
0xA7D1, 0xA7D3, 0xA8FB, 0xA8FD, 0xA8FE, 0xA9CF, 0xAA7A, 0xAAB1, 0xAAB5,
|
||||
0xAAB6, 0xAAC0, 0xAAC2, 0xFB1D, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44
|
||||
#if CHRBITS > 16
|
||||
,0x1003C, 0x1003D, 0x10808, 0x10837, 0x10838, 0x1083C, 0x108F4, 0x108F5, 0x109BE,
|
||||
0x109BF, 0x10A00, 0x10EB0, 0x10EB1, 0x10F27, 0x11144, 0x11147, 0x11176, 0x111DA,
|
||||
0x111DC, 0x11288, 0x1130F, 0x11310, 0x11332, 0x11333, 0x1133D, 0x11350, 0x114C4,
|
||||
0x114C5, 0x114C7, 0x11644, 0x116B8, 0x11909, 0x11915, 0x11916, 0x1193F, 0x11941,
|
||||
0x119E1, 0x119E3, 0x11A00, 0x11A3A, 0x11A50, 0x11A9D, 0x11C40, 0x11D08, 0x11D09,
|
||||
0x11D46, 0x11D67, 0x11D68, 0x11D98, 0x11FB0, 0x16F50, 0x16FE0, 0x16FE1, 0x16FE3,
|
||||
0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4BB, 0x1D546, 0x1E14E, 0x1E94B,
|
||||
0x1EE21, 0x1EE22, 0x1EE24, 0x1EE27, 0x1EE39, 0x1EE3B, 0x1EE42, 0x1EE47, 0x1EE49,
|
||||
0x1EE4B, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE57, 0x1EE59, 0x1EE5B, 0x1EE5D, 0x1EE5F,
|
||||
0x1EE61, 0x1EE62, 0x1EE64, 0x1EE7E
|
||||
,0x1003C, 0x1003D, 0x10594, 0x10595, 0x105BB, 0x105BC, 0x10808, 0x10837, 0x10838,
|
||||
0x1083C, 0x108F4, 0x108F5, 0x109BE, 0x109BF, 0x10A00, 0x10EB0, 0x10EB1, 0x10F27,
|
||||
0x11071, 0x11072, 0x11075, 0x11144, 0x11147, 0x11176, 0x111DA, 0x111DC, 0x11288,
|
||||
0x1130F, 0x11310, 0x11332, 0x11333, 0x1133D, 0x11350, 0x114C4, 0x114C5, 0x114C7,
|
||||
0x11644, 0x116B8, 0x11909, 0x11915, 0x11916, 0x1193F, 0x11941, 0x119E1, 0x119E3,
|
||||
0x11A00, 0x11A3A, 0x11A50, 0x11A9D, 0x11C40, 0x11D08, 0x11D09, 0x11D46, 0x11D67,
|
||||
0x11D68, 0x11D98, 0x11FB0, 0x16F50, 0x16FE0, 0x16FE1, 0x16FE3, 0x1AFFD, 0x1AFFE,
|
||||
0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4BB, 0x1D546, 0x1E14E, 0x1E7ED,
|
||||
0x1E7EE, 0x1E94B, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE27, 0x1EE39, 0x1EE3B, 0x1EE42,
|
||||
0x1EE47, 0x1EE49, 0x1EE4B, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE57, 0x1EE59, 0x1EE5B,
|
||||
0x1EE5D, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE7E
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -302,7 +307,7 @@ static const crange controlRangeTable[] = {
|
||||
#define NUM_CONTROL_RANGE (sizeof(controlRangeTable)/sizeof(crange))
|
||||
|
||||
static const chr controlCharTable[] = {
|
||||
0xAD, 0x61C, 0x6DD, 0x70F, 0x8E2, 0x180E, 0xFEFF
|
||||
0xAD, 0x61C, 0x6DD, 0x70F, 0x890, 0x891, 0x8E2, 0x180E, 0xFEFF
|
||||
#if CHRBITS > 16
|
||||
,0x110BD, 0x110CD, 0xE0001
|
||||
#endif
|
||||
@@ -330,8 +335,9 @@ static const crange digitRangeTable[] = {
|
||||
{0x11136, 0x1113F}, {0x111D0, 0x111D9}, {0x112F0, 0x112F9}, {0x11450, 0x11459},
|
||||
{0x114D0, 0x114D9}, {0x11650, 0x11659}, {0x116C0, 0x116C9}, {0x11730, 0x11739},
|
||||
{0x118E0, 0x118E9}, {0x11950, 0x11959}, {0x11C50, 0x11C59}, {0x11D50, 0x11D59},
|
||||
{0x11DA0, 0x11DA9}, {0x16A60, 0x16A69}, {0x16B50, 0x16B59}, {0x1D7CE, 0x1D7FF},
|
||||
{0x1E140, 0x1E149}, {0x1E2F0, 0x1E2F9}, {0x1E950, 0x1E959}, {0x1FBF0, 0x1FBF9}
|
||||
{0x11DA0, 0x11DA9}, {0x16A60, 0x16A69}, {0x16AC0, 0x16AC9}, {0x16B50, 0x16B59},
|
||||
{0x1D7CE, 0x1D7FF}, {0x1E140, 0x1E149}, {0x1E2F0, 0x1E2F9}, {0x1E950, 0x1E959},
|
||||
{0x1FBF0, 0x1FBF9}
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -347,27 +353,27 @@ static const crange digitRangeTable[] = {
|
||||
|
||||
static const crange punctRangeTable[] = {
|
||||
{0x21, 0x23}, {0x25, 0x2A}, {0x2C, 0x2F}, {0x5B, 0x5D},
|
||||
{0x55A, 0x55F}, {0x66A, 0x66D}, {0x700, 0x70D}, {0x7F7, 0x7F9},
|
||||
{0x830, 0x83E}, {0xF04, 0xF12}, {0xF3A, 0xF3D}, {0xFD0, 0xFD4},
|
||||
{0x104A, 0x104F}, {0x1360, 0x1368}, {0x16EB, 0x16ED}, {0x17D4, 0x17D6},
|
||||
{0x17D8, 0x17DA}, {0x1800, 0x180A}, {0x1AA0, 0x1AA6}, {0x1AA8, 0x1AAD},
|
||||
{0x1B5A, 0x1B60}, {0x1BFC, 0x1BFF}, {0x1C3B, 0x1C3F}, {0x1CC0, 0x1CC7},
|
||||
{0x2010, 0x2027}, {0x2030, 0x2043}, {0x2045, 0x2051}, {0x2053, 0x205E},
|
||||
{0x2308, 0x230B}, {0x2768, 0x2775}, {0x27E6, 0x27EF}, {0x2983, 0x2998},
|
||||
{0x29D8, 0x29DB}, {0x2CF9, 0x2CFC}, {0x2E00, 0x2E2E}, {0x2E30, 0x2E4F},
|
||||
{0x3001, 0x3003}, {0x3008, 0x3011}, {0x3014, 0x301F}, {0xA60D, 0xA60F},
|
||||
{0xA6F2, 0xA6F7}, {0xA874, 0xA877}, {0xA8F8, 0xA8FA}, {0xA9C1, 0xA9CD},
|
||||
{0xAA5C, 0xAA5F}, {0xFE10, 0xFE19}, {0xFE30, 0xFE52}, {0xFE54, 0xFE61},
|
||||
{0xFF01, 0xFF03}, {0xFF05, 0xFF0A}, {0xFF0C, 0xFF0F}, {0xFF3B, 0xFF3D},
|
||||
{0xFF5F, 0xFF65}
|
||||
{0x55A, 0x55F}, {0x61D, 0x61F}, {0x66A, 0x66D}, {0x700, 0x70D},
|
||||
{0x7F7, 0x7F9}, {0x830, 0x83E}, {0xF04, 0xF12}, {0xF3A, 0xF3D},
|
||||
{0xFD0, 0xFD4}, {0x104A, 0x104F}, {0x1360, 0x1368}, {0x16EB, 0x16ED},
|
||||
{0x17D4, 0x17D6}, {0x17D8, 0x17DA}, {0x1800, 0x180A}, {0x1AA0, 0x1AA6},
|
||||
{0x1AA8, 0x1AAD}, {0x1B5A, 0x1B60}, {0x1BFC, 0x1BFF}, {0x1C3B, 0x1C3F},
|
||||
{0x1CC0, 0x1CC7}, {0x2010, 0x2027}, {0x2030, 0x2043}, {0x2045, 0x2051},
|
||||
{0x2053, 0x205E}, {0x2308, 0x230B}, {0x2768, 0x2775}, {0x27E6, 0x27EF},
|
||||
{0x2983, 0x2998}, {0x29D8, 0x29DB}, {0x2CF9, 0x2CFC}, {0x2E00, 0x2E2E},
|
||||
{0x2E30, 0x2E4F}, {0x2E52, 0x2E5D}, {0x3001, 0x3003}, {0x3008, 0x3011},
|
||||
{0x3014, 0x301F}, {0xA60D, 0xA60F}, {0xA6F2, 0xA6F7}, {0xA874, 0xA877},
|
||||
{0xA8F8, 0xA8FA}, {0xA9C1, 0xA9CD}, {0xAA5C, 0xAA5F}, {0xFE10, 0xFE19},
|
||||
{0xFE30, 0xFE52}, {0xFE54, 0xFE61}, {0xFF01, 0xFF03}, {0xFF05, 0xFF0A},
|
||||
{0xFF0C, 0xFF0F}, {0xFF3B, 0xFF3D}, {0xFF5F, 0xFF65}
|
||||
#if CHRBITS > 16
|
||||
,{0x10100, 0x10102}, {0x10A50, 0x10A58}, {0x10AF0, 0x10AF6}, {0x10B39, 0x10B3F},
|
||||
{0x10B99, 0x10B9C}, {0x10F55, 0x10F59}, {0x11047, 0x1104D}, {0x110BE, 0x110C1},
|
||||
{0x11140, 0x11143}, {0x111C5, 0x111C8}, {0x111DD, 0x111DF}, {0x11238, 0x1123D},
|
||||
{0x1144B, 0x1144F}, {0x115C1, 0x115D7}, {0x11641, 0x11643}, {0x11660, 0x1166C},
|
||||
{0x1173C, 0x1173E}, {0x11944, 0x11946}, {0x11A3F, 0x11A46}, {0x11A9A, 0x11A9C},
|
||||
{0x11A9E, 0x11AA2}, {0x11C41, 0x11C45}, {0x12470, 0x12474}, {0x16B37, 0x16B3B},
|
||||
{0x16E97, 0x16E9A}, {0x1DA87, 0x1DA8B}
|
||||
{0x10B99, 0x10B9C}, {0x10F55, 0x10F59}, {0x10F86, 0x10F89}, {0x11047, 0x1104D},
|
||||
{0x110BE, 0x110C1}, {0x11140, 0x11143}, {0x111C5, 0x111C8}, {0x111DD, 0x111DF},
|
||||
{0x11238, 0x1123D}, {0x1144B, 0x1144F}, {0x115C1, 0x115D7}, {0x11641, 0x11643},
|
||||
{0x11660, 0x1166C}, {0x1173C, 0x1173E}, {0x11944, 0x11946}, {0x11A3F, 0x11A46},
|
||||
{0x11A9A, 0x11A9C}, {0x11A9E, 0x11AA2}, {0x11C41, 0x11C45}, {0x12470, 0x12474},
|
||||
{0x16B37, 0x16B3B}, {0x16E97, 0x16E9A}, {0x1DA87, 0x1DA8B}
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -377,21 +383,22 @@ static const chr punctCharTable[] = {
|
||||
0x3A, 0x3B, 0x3F, 0x40, 0x5F, 0x7B, 0x7D, 0xA1, 0xA7,
|
||||
0xAB, 0xB6, 0xB7, 0xBB, 0xBF, 0x37E, 0x387, 0x589, 0x58A,
|
||||
0x5BE, 0x5C0, 0x5C3, 0x5C6, 0x5F3, 0x5F4, 0x609, 0x60A, 0x60C,
|
||||
0x60D, 0x61B, 0x61E, 0x61F, 0x6D4, 0x85E, 0x964, 0x965, 0x970,
|
||||
0x9FD, 0xA76, 0xAF0, 0xC77, 0xC84, 0xDF4, 0xE4F, 0xE5A, 0xE5B,
|
||||
0xF14, 0xF85, 0xFD9, 0xFDA, 0x10FB, 0x1400, 0x166E, 0x169B, 0x169C,
|
||||
0x1735, 0x1736, 0x1944, 0x1945, 0x1A1E, 0x1A1F, 0x1C7E, 0x1C7F, 0x1CD3,
|
||||
0x60D, 0x61B, 0x6D4, 0x85E, 0x964, 0x965, 0x970, 0x9FD, 0xA76,
|
||||
0xAF0, 0xC77, 0xC84, 0xDF4, 0xE4F, 0xE5A, 0xE5B, 0xF14, 0xF85,
|
||||
0xFD9, 0xFDA, 0x10FB, 0x1400, 0x166E, 0x169B, 0x169C, 0x1735, 0x1736,
|
||||
0x1944, 0x1945, 0x1A1E, 0x1A1F, 0x1B7D, 0x1B7E, 0x1C7E, 0x1C7F, 0x1CD3,
|
||||
0x207D, 0x207E, 0x208D, 0x208E, 0x2329, 0x232A, 0x27C5, 0x27C6, 0x29FC,
|
||||
0x29FD, 0x2CFE, 0x2CFF, 0x2D70, 0x2E52, 0x3030, 0x303D, 0x30A0, 0x30FB,
|
||||
0xA4FE, 0xA4FF, 0xA673, 0xA67E, 0xA8CE, 0xA8CF, 0xA8FC, 0xA92E, 0xA92F,
|
||||
0xA95F, 0xA9DE, 0xA9DF, 0xAADE, 0xAADF, 0xAAF0, 0xAAF1, 0xABEB, 0xFD3E,
|
||||
0xFD3F, 0xFE63, 0xFE68, 0xFE6A, 0xFE6B, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF20,
|
||||
0xFF3F, 0xFF5B, 0xFF5D
|
||||
0x29FD, 0x2CFE, 0x2CFF, 0x2D70, 0x3030, 0x303D, 0x30A0, 0x30FB, 0xA4FE,
|
||||
0xA4FF, 0xA673, 0xA67E, 0xA8CE, 0xA8CF, 0xA8FC, 0xA92E, 0xA92F, 0xA95F,
|
||||
0xA9DE, 0xA9DF, 0xAADE, 0xAADF, 0xAAF0, 0xAAF1, 0xABEB, 0xFD3E, 0xFD3F,
|
||||
0xFE63, 0xFE68, 0xFE6A, 0xFE6B, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF20, 0xFF3F,
|
||||
0xFF5B, 0xFF5D
|
||||
#if CHRBITS > 16
|
||||
,0x1039F, 0x103D0, 0x1056F, 0x10857, 0x1091F, 0x1093F, 0x10A7F, 0x10EAD, 0x110BB,
|
||||
0x110BC, 0x11174, 0x11175, 0x111CD, 0x111DB, 0x112A9, 0x1145A, 0x1145B, 0x1145D,
|
||||
0x114C6, 0x1183B, 0x119E2, 0x11C70, 0x11C71, 0x11EF7, 0x11EF8, 0x11FFF, 0x16A6E,
|
||||
0x16A6F, 0x16AF5, 0x16B44, 0x16FE2, 0x1BC9F, 0x1E95E, 0x1E95F
|
||||
0x114C6, 0x116B9, 0x1183B, 0x119E2, 0x11C70, 0x11C71, 0x11EF7, 0x11EF8, 0x11FFF,
|
||||
0x12FF1, 0x12FF2, 0x16A6E, 0x16A6F, 0x16AF5, 0x16B44, 0x16FE2, 0x1BC9F, 0x1E95E,
|
||||
0x1E95F
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -429,18 +436,20 @@ static const crange lowerRangeTable[] = {
|
||||
{0x1F50, 0x1F57}, {0x1F60, 0x1F67}, {0x1F70, 0x1F7D}, {0x1F80, 0x1F87},
|
||||
{0x1F90, 0x1F97}, {0x1FA0, 0x1FA7}, {0x1FB0, 0x1FB4}, {0x1FC2, 0x1FC4},
|
||||
{0x1FD0, 0x1FD3}, {0x1FE0, 0x1FE7}, {0x1FF2, 0x1FF4}, {0x2146, 0x2149},
|
||||
{0x2C30, 0x2C5E}, {0x2C76, 0x2C7B}, {0x2D00, 0x2D25}, {0xA72F, 0xA731},
|
||||
{0x2C30, 0x2C5F}, {0x2C76, 0x2C7B}, {0x2D00, 0x2D25}, {0xA72F, 0xA731},
|
||||
{0xA771, 0xA778}, {0xA793, 0xA795}, {0xAB30, 0xAB5A}, {0xAB60, 0xAB68},
|
||||
{0xAB70, 0xABBF}, {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFF41, 0xFF5A}
|
||||
#if CHRBITS > 16
|
||||
,{0x10428, 0x1044F}, {0x104D8, 0x104FB}, {0x10CC0, 0x10CF2}, {0x118C0, 0x118DF},
|
||||
{0x16E60, 0x16E7F}, {0x1D41A, 0x1D433}, {0x1D44E, 0x1D454}, {0x1D456, 0x1D467},
|
||||
{0x1D482, 0x1D49B}, {0x1D4B6, 0x1D4B9}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D4CF},
|
||||
{0x1D4EA, 0x1D503}, {0x1D51E, 0x1D537}, {0x1D552, 0x1D56B}, {0x1D586, 0x1D59F},
|
||||
{0x1D5BA, 0x1D5D3}, {0x1D5EE, 0x1D607}, {0x1D622, 0x1D63B}, {0x1D656, 0x1D66F},
|
||||
{0x1D68A, 0x1D6A5}, {0x1D6C2, 0x1D6DA}, {0x1D6DC, 0x1D6E1}, {0x1D6FC, 0x1D714},
|
||||
{0x1D716, 0x1D71B}, {0x1D736, 0x1D74E}, {0x1D750, 0x1D755}, {0x1D770, 0x1D788},
|
||||
{0x1D78A, 0x1D78F}, {0x1D7AA, 0x1D7C2}, {0x1D7C4, 0x1D7C9}, {0x1E922, 0x1E943}
|
||||
,{0x10428, 0x1044F}, {0x104D8, 0x104FB}, {0x10597, 0x105A1}, {0x105A3, 0x105B1},
|
||||
{0x105B3, 0x105B9}, {0x10CC0, 0x10CF2}, {0x118C0, 0x118DF}, {0x16E60, 0x16E7F},
|
||||
{0x1D41A, 0x1D433}, {0x1D44E, 0x1D454}, {0x1D456, 0x1D467}, {0x1D482, 0x1D49B},
|
||||
{0x1D4B6, 0x1D4B9}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D4CF}, {0x1D4EA, 0x1D503},
|
||||
{0x1D51E, 0x1D537}, {0x1D552, 0x1D56B}, {0x1D586, 0x1D59F}, {0x1D5BA, 0x1D5D3},
|
||||
{0x1D5EE, 0x1D607}, {0x1D622, 0x1D63B}, {0x1D656, 0x1D66F}, {0x1D68A, 0x1D6A5},
|
||||
{0x1D6C2, 0x1D6DA}, {0x1D6DC, 0x1D6E1}, {0x1D6FC, 0x1D714}, {0x1D716, 0x1D71B},
|
||||
{0x1D736, 0x1D74E}, {0x1D750, 0x1D755}, {0x1D770, 0x1D788}, {0x1D78A, 0x1D78F},
|
||||
{0x1D7AA, 0x1D7C2}, {0x1D7C4, 0x1D7C9}, {0x1DF00, 0x1DF09}, {0x1DF0B, 0x1DF1E},
|
||||
{0x1E922, 0x1E943}
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -510,10 +519,10 @@ static const chr lowerCharTable[] = {
|
||||
0xA763, 0xA765, 0xA767, 0xA769, 0xA76B, 0xA76D, 0xA76F, 0xA77A, 0xA77C,
|
||||
0xA77F, 0xA781, 0xA783, 0xA785, 0xA787, 0xA78C, 0xA78E, 0xA791, 0xA797,
|
||||
0xA799, 0xA79B, 0xA79D, 0xA79F, 0xA7A1, 0xA7A3, 0xA7A5, 0xA7A7, 0xA7A9,
|
||||
0xA7AF, 0xA7B5, 0xA7B7, 0xA7B9, 0xA7BB, 0xA7BD, 0xA7BF, 0xA7C3, 0xA7C8,
|
||||
0xA7CA, 0xA7F6, 0xA7FA
|
||||
0xA7AF, 0xA7B5, 0xA7B7, 0xA7B9, 0xA7BB, 0xA7BD, 0xA7BF, 0xA7C1, 0xA7C3,
|
||||
0xA7C8, 0xA7CA, 0xA7D1, 0xA7D3, 0xA7D5, 0xA7D7, 0xA7D9, 0xA7F6, 0xA7FA
|
||||
#if CHRBITS > 16
|
||||
,0x1D4BB, 0x1D7CB
|
||||
,0x105BB, 0x105BC, 0x1D4BB, 0x1D7CB
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -532,18 +541,18 @@ static const crange upperRangeTable[] = {
|
||||
{0x1F18, 0x1F1D}, {0x1F28, 0x1F2F}, {0x1F38, 0x1F3F}, {0x1F48, 0x1F4D},
|
||||
{0x1F68, 0x1F6F}, {0x1FB8, 0x1FBB}, {0x1FC8, 0x1FCB}, {0x1FD8, 0x1FDB},
|
||||
{0x1FE8, 0x1FEC}, {0x1FF8, 0x1FFB}, {0x210B, 0x210D}, {0x2110, 0x2112},
|
||||
{0x2119, 0x211D}, {0x212A, 0x212D}, {0x2130, 0x2133}, {0x2C00, 0x2C2E},
|
||||
{0x2119, 0x211D}, {0x212A, 0x212D}, {0x2130, 0x2133}, {0x2C00, 0x2C2F},
|
||||
{0x2C62, 0x2C64}, {0x2C6D, 0x2C70}, {0x2C7E, 0x2C80}, {0xA7AA, 0xA7AE},
|
||||
{0xA7B0, 0xA7B4}, {0xA7C4, 0xA7C7}, {0xFF21, 0xFF3A}
|
||||
#if CHRBITS > 16
|
||||
,{0x10400, 0x10427}, {0x104B0, 0x104D3}, {0x10C80, 0x10CB2}, {0x118A0, 0x118BF},
|
||||
{0x16E40, 0x16E5F}, {0x1D400, 0x1D419}, {0x1D434, 0x1D44D}, {0x1D468, 0x1D481},
|
||||
{0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B5}, {0x1D4D0, 0x1D4E9}, {0x1D507, 0x1D50A},
|
||||
{0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544},
|
||||
{0x1D54A, 0x1D550}, {0x1D56C, 0x1D585}, {0x1D5A0, 0x1D5B9}, {0x1D5D4, 0x1D5ED},
|
||||
{0x1D608, 0x1D621}, {0x1D63C, 0x1D655}, {0x1D670, 0x1D689}, {0x1D6A8, 0x1D6C0},
|
||||
{0x1D6E2, 0x1D6FA}, {0x1D71C, 0x1D734}, {0x1D756, 0x1D76E}, {0x1D790, 0x1D7A8},
|
||||
{0x1E900, 0x1E921}
|
||||
,{0x10400, 0x10427}, {0x104B0, 0x104D3}, {0x10570, 0x1057A}, {0x1057C, 0x1058A},
|
||||
{0x1058C, 0x10592}, {0x10C80, 0x10CB2}, {0x118A0, 0x118BF}, {0x16E40, 0x16E5F},
|
||||
{0x1D400, 0x1D419}, {0x1D434, 0x1D44D}, {0x1D468, 0x1D481}, {0x1D4A9, 0x1D4AC},
|
||||
{0x1D4AE, 0x1D4B5}, {0x1D4D0, 0x1D4E9}, {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514},
|
||||
{0x1D516, 0x1D51C}, {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, {0x1D54A, 0x1D550},
|
||||
{0x1D56C, 0x1D585}, {0x1D5A0, 0x1D5B9}, {0x1D5D4, 0x1D5ED}, {0x1D608, 0x1D621},
|
||||
{0x1D63C, 0x1D655}, {0x1D670, 0x1D689}, {0x1D6A8, 0x1D6C0}, {0x1D6E2, 0x1D6FA},
|
||||
{0x1D71C, 0x1D734}, {0x1D756, 0x1D76E}, {0x1D790, 0x1D7A8}, {0x1E900, 0x1E921}
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -613,10 +622,11 @@ static const chr upperCharTable[] = {
|
||||
0xA768, 0xA76A, 0xA76C, 0xA76E, 0xA779, 0xA77B, 0xA77D, 0xA77E, 0xA780,
|
||||
0xA782, 0xA784, 0xA786, 0xA78B, 0xA78D, 0xA790, 0xA792, 0xA796, 0xA798,
|
||||
0xA79A, 0xA79C, 0xA79E, 0xA7A0, 0xA7A2, 0xA7A4, 0xA7A6, 0xA7A8, 0xA7B6,
|
||||
0xA7B8, 0xA7BA, 0xA7BC, 0xA7BE, 0xA7C2, 0xA7C9, 0xA7F5
|
||||
0xA7B8, 0xA7BA, 0xA7BC, 0xA7BE, 0xA7C0, 0xA7C2, 0xA7C9, 0xA7D0, 0xA7D6,
|
||||
0xA7D8, 0xA7F5
|
||||
#if CHRBITS > 16
|
||||
,0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D504, 0x1D505, 0x1D538,
|
||||
0x1D539, 0x1D546, 0x1D7CA
|
||||
,0x10594, 0x10595, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D504,
|
||||
0x1D505, 0x1D538, 0x1D539, 0x1D546, 0x1D7CA
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -630,74 +640,72 @@ static const crange graphRangeTable[] = {
|
||||
{0x21, 0x7E}, {0xA1, 0xAC}, {0xAE, 0x377}, {0x37A, 0x37F},
|
||||
{0x384, 0x38A}, {0x38E, 0x3A1}, {0x3A3, 0x52F}, {0x531, 0x556},
|
||||
{0x559, 0x58A}, {0x58D, 0x58F}, {0x591, 0x5C7}, {0x5D0, 0x5EA},
|
||||
{0x5EF, 0x5F4}, {0x606, 0x61B}, {0x61E, 0x6DC}, {0x6DE, 0x70D},
|
||||
{0x5EF, 0x5F4}, {0x606, 0x61B}, {0x61D, 0x6DC}, {0x6DE, 0x70D},
|
||||
{0x710, 0x74A}, {0x74D, 0x7B1}, {0x7C0, 0x7FA}, {0x7FD, 0x82D},
|
||||
{0x830, 0x83E}, {0x840, 0x85B}, {0x860, 0x86A}, {0x8A0, 0x8B4},
|
||||
{0x8B6, 0x8C7}, {0x8D3, 0x8E1}, {0x8E3, 0x983}, {0x985, 0x98C},
|
||||
{0x993, 0x9A8}, {0x9AA, 0x9B0}, {0x9B6, 0x9B9}, {0x9BC, 0x9C4},
|
||||
{0x9CB, 0x9CE}, {0x9DF, 0x9E3}, {0x9E6, 0x9FE}, {0xA01, 0xA03},
|
||||
{0xA05, 0xA0A}, {0xA13, 0xA28}, {0xA2A, 0xA30}, {0xA3E, 0xA42},
|
||||
{0xA4B, 0xA4D}, {0xA59, 0xA5C}, {0xA66, 0xA76}, {0xA81, 0xA83},
|
||||
{0xA85, 0xA8D}, {0xA8F, 0xA91}, {0xA93, 0xAA8}, {0xAAA, 0xAB0},
|
||||
{0xAB5, 0xAB9}, {0xABC, 0xAC5}, {0xAC7, 0xAC9}, {0xACB, 0xACD},
|
||||
{0xAE0, 0xAE3}, {0xAE6, 0xAF1}, {0xAF9, 0xAFF}, {0xB01, 0xB03},
|
||||
{0xB05, 0xB0C}, {0xB13, 0xB28}, {0xB2A, 0xB30}, {0xB35, 0xB39},
|
||||
{0xB3C, 0xB44}, {0xB4B, 0xB4D}, {0xB55, 0xB57}, {0xB5F, 0xB63},
|
||||
{0xB66, 0xB77}, {0xB85, 0xB8A}, {0xB8E, 0xB90}, {0xB92, 0xB95},
|
||||
{0xBA8, 0xBAA}, {0xBAE, 0xBB9}, {0xBBE, 0xBC2}, {0xBC6, 0xBC8},
|
||||
{0xBCA, 0xBCD}, {0xBE6, 0xBFA}, {0xC00, 0xC0C}, {0xC0E, 0xC10},
|
||||
{0xC12, 0xC28}, {0xC2A, 0xC39}, {0xC3D, 0xC44}, {0xC46, 0xC48},
|
||||
{0xC4A, 0xC4D}, {0xC58, 0xC5A}, {0xC60, 0xC63}, {0xC66, 0xC6F},
|
||||
{0xC77, 0xC8C}, {0xC8E, 0xC90}, {0xC92, 0xCA8}, {0xCAA, 0xCB3},
|
||||
{0xCB5, 0xCB9}, {0xCBC, 0xCC4}, {0xCC6, 0xCC8}, {0xCCA, 0xCCD},
|
||||
{0xCE0, 0xCE3}, {0xCE6, 0xCEF}, {0xD00, 0xD0C}, {0xD0E, 0xD10},
|
||||
{0xD12, 0xD44}, {0xD46, 0xD48}, {0xD4A, 0xD4F}, {0xD54, 0xD63},
|
||||
{0xD66, 0xD7F}, {0xD81, 0xD83}, {0xD85, 0xD96}, {0xD9A, 0xDB1},
|
||||
{0xDB3, 0xDBB}, {0xDC0, 0xDC6}, {0xDCF, 0xDD4}, {0xDD8, 0xDDF},
|
||||
{0xDE6, 0xDEF}, {0xDF2, 0xDF4}, {0xE01, 0xE3A}, {0xE3F, 0xE5B},
|
||||
{0xE86, 0xE8A}, {0xE8C, 0xEA3}, {0xEA7, 0xEBD}, {0xEC0, 0xEC4},
|
||||
{0xEC8, 0xECD}, {0xED0, 0xED9}, {0xEDC, 0xEDF}, {0xF00, 0xF47},
|
||||
{0xF49, 0xF6C}, {0xF71, 0xF97}, {0xF99, 0xFBC}, {0xFBE, 0xFCC},
|
||||
{0xFCE, 0xFDA}, {0x1000, 0x10C5}, {0x10D0, 0x1248}, {0x124A, 0x124D},
|
||||
{0x1250, 0x1256}, {0x125A, 0x125D}, {0x1260, 0x1288}, {0x128A, 0x128D},
|
||||
{0x1290, 0x12B0}, {0x12B2, 0x12B5}, {0x12B8, 0x12BE}, {0x12C2, 0x12C5},
|
||||
{0x12C8, 0x12D6}, {0x12D8, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x135A},
|
||||
{0x135D, 0x137C}, {0x1380, 0x1399}, {0x13A0, 0x13F5}, {0x13F8, 0x13FD},
|
||||
{0x1400, 0x167F}, {0x1681, 0x169C}, {0x16A0, 0x16F8}, {0x1700, 0x170C},
|
||||
{0x170E, 0x1714}, {0x1720, 0x1736}, {0x1740, 0x1753}, {0x1760, 0x176C},
|
||||
{0x176E, 0x1770}, {0x1780, 0x17DD}, {0x17E0, 0x17E9}, {0x17F0, 0x17F9},
|
||||
{0x1800, 0x180D}, {0x1810, 0x1819}, {0x1820, 0x1878}, {0x1880, 0x18AA},
|
||||
{0x18B0, 0x18F5}, {0x1900, 0x191E}, {0x1920, 0x192B}, {0x1930, 0x193B},
|
||||
{0x1944, 0x196D}, {0x1970, 0x1974}, {0x1980, 0x19AB}, {0x19B0, 0x19C9},
|
||||
{0x19D0, 0x19DA}, {0x19DE, 0x1A1B}, {0x1A1E, 0x1A5E}, {0x1A60, 0x1A7C},
|
||||
{0x1A7F, 0x1A89}, {0x1A90, 0x1A99}, {0x1AA0, 0x1AAD}, {0x1AB0, 0x1AC0},
|
||||
{0x1B00, 0x1B4B}, {0x1B50, 0x1B7C}, {0x1B80, 0x1BF3}, {0x1BFC, 0x1C37},
|
||||
{0x1C3B, 0x1C49}, {0x1C4D, 0x1C88}, {0x1C90, 0x1CBA}, {0x1CBD, 0x1CC7},
|
||||
{0x1CD0, 0x1CFA}, {0x1D00, 0x1DF9}, {0x1DFB, 0x1F15}, {0x1F18, 0x1F1D},
|
||||
{0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, {0x1F50, 0x1F57}, {0x1F5F, 0x1F7D},
|
||||
{0x1F80, 0x1FB4}, {0x1FB6, 0x1FC4}, {0x1FC6, 0x1FD3}, {0x1FD6, 0x1FDB},
|
||||
{0x1FDD, 0x1FEF}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFE}, {0x2010, 0x2027},
|
||||
{0x2030, 0x205E}, {0x2074, 0x208E}, {0x2090, 0x209C}, {0x20A0, 0x20BF},
|
||||
{0x20D0, 0x20F0}, {0x2100, 0x218B}, {0x2190, 0x2426}, {0x2440, 0x244A},
|
||||
{0x2460, 0x2B73}, {0x2B76, 0x2B95}, {0x2B97, 0x2C2E}, {0x2C30, 0x2C5E},
|
||||
{0x2C60, 0x2CF3}, {0x2CF9, 0x2D25}, {0x2D30, 0x2D67}, {0x2D7F, 0x2D96},
|
||||
{0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, {0x2DB8, 0x2DBE},
|
||||
{0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE}, {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE},
|
||||
{0x2DE0, 0x2E52}, {0x2E80, 0x2E99}, {0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5},
|
||||
{0x2FF0, 0x2FFB}, {0x3001, 0x303F}, {0x3041, 0x3096}, {0x3099, 0x30FF},
|
||||
{0x3105, 0x312F}, {0x3131, 0x318E}, {0x3190, 0x31E3}, {0x31F0, 0x321E},
|
||||
{0x3220, 0x9FFC}, {0xA000, 0xA48C}, {0xA490, 0xA4C6}, {0xA4D0, 0xA62B},
|
||||
{0xA640, 0xA6F7}, {0xA700, 0xA7BF}, {0xA7C2, 0xA7CA}, {0xA7F5, 0xA82C},
|
||||
{0xA830, 0xA839}, {0xA840, 0xA877}, {0xA880, 0xA8C5}, {0xA8CE, 0xA8D9},
|
||||
{0xA8E0, 0xA953}, {0xA95F, 0xA97C}, {0xA980, 0xA9CD}, {0xA9CF, 0xA9D9},
|
||||
{0xA9DE, 0xA9FE}, {0xAA00, 0xAA36}, {0xAA40, 0xAA4D}, {0xAA50, 0xAA59},
|
||||
{0xAA5C, 0xAAC2}, {0xAADB, 0xAAF6}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E},
|
||||
{0xAB11, 0xAB16}, {0xAB20, 0xAB26}, {0xAB28, 0xAB2E}, {0xAB30, 0xAB6B},
|
||||
{0xAB70, 0xABED}, {0xABF0, 0xABF9}, {0xAC00, 0xD7A3}, {0xD7B0, 0xD7C6},
|
||||
{0xD7CB, 0xD7FB}, {0xF900, 0xFA6D}, {0xFA70, 0xFAD9}, {0xFB00, 0xFB06},
|
||||
{0xFB13, 0xFB17}, {0xFB1D, 0xFB36}, {0xFB38, 0xFB3C}, {0xFB46, 0xFBC1},
|
||||
{0xFBD3, 0xFD3F}, {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7}, {0xFDF0, 0xFDFD},
|
||||
{0xFE00, 0xFE19}, {0xFE20, 0xFE52}, {0xFE54, 0xFE66}, {0xFE68, 0xFE6B},
|
||||
{0x830, 0x83E}, {0x840, 0x85B}, {0x860, 0x86A}, {0x870, 0x88E},
|
||||
{0x898, 0x8E1}, {0x8E3, 0x983}, {0x985, 0x98C}, {0x993, 0x9A8},
|
||||
{0x9AA, 0x9B0}, {0x9B6, 0x9B9}, {0x9BC, 0x9C4}, {0x9CB, 0x9CE},
|
||||
{0x9DF, 0x9E3}, {0x9E6, 0x9FE}, {0xA01, 0xA03}, {0xA05, 0xA0A},
|
||||
{0xA13, 0xA28}, {0xA2A, 0xA30}, {0xA3E, 0xA42}, {0xA4B, 0xA4D},
|
||||
{0xA59, 0xA5C}, {0xA66, 0xA76}, {0xA81, 0xA83}, {0xA85, 0xA8D},
|
||||
{0xA8F, 0xA91}, {0xA93, 0xAA8}, {0xAAA, 0xAB0}, {0xAB5, 0xAB9},
|
||||
{0xABC, 0xAC5}, {0xAC7, 0xAC9}, {0xACB, 0xACD}, {0xAE0, 0xAE3},
|
||||
{0xAE6, 0xAF1}, {0xAF9, 0xAFF}, {0xB01, 0xB03}, {0xB05, 0xB0C},
|
||||
{0xB13, 0xB28}, {0xB2A, 0xB30}, {0xB35, 0xB39}, {0xB3C, 0xB44},
|
||||
{0xB4B, 0xB4D}, {0xB55, 0xB57}, {0xB5F, 0xB63}, {0xB66, 0xB77},
|
||||
{0xB85, 0xB8A}, {0xB8E, 0xB90}, {0xB92, 0xB95}, {0xBA8, 0xBAA},
|
||||
{0xBAE, 0xBB9}, {0xBBE, 0xBC2}, {0xBC6, 0xBC8}, {0xBCA, 0xBCD},
|
||||
{0xBE6, 0xBFA}, {0xC00, 0xC0C}, {0xC0E, 0xC10}, {0xC12, 0xC28},
|
||||
{0xC2A, 0xC39}, {0xC3C, 0xC44}, {0xC46, 0xC48}, {0xC4A, 0xC4D},
|
||||
{0xC58, 0xC5A}, {0xC60, 0xC63}, {0xC66, 0xC6F}, {0xC77, 0xC8C},
|
||||
{0xC8E, 0xC90}, {0xC92, 0xCA8}, {0xCAA, 0xCB3}, {0xCB5, 0xCB9},
|
||||
{0xCBC, 0xCC4}, {0xCC6, 0xCC8}, {0xCCA, 0xCCD}, {0xCE0, 0xCE3},
|
||||
{0xCE6, 0xCEF}, {0xD00, 0xD0C}, {0xD0E, 0xD10}, {0xD12, 0xD44},
|
||||
{0xD46, 0xD48}, {0xD4A, 0xD4F}, {0xD54, 0xD63}, {0xD66, 0xD7F},
|
||||
{0xD81, 0xD83}, {0xD85, 0xD96}, {0xD9A, 0xDB1}, {0xDB3, 0xDBB},
|
||||
{0xDC0, 0xDC6}, {0xDCF, 0xDD4}, {0xDD8, 0xDDF}, {0xDE6, 0xDEF},
|
||||
{0xDF2, 0xDF4}, {0xE01, 0xE3A}, {0xE3F, 0xE5B}, {0xE86, 0xE8A},
|
||||
{0xE8C, 0xEA3}, {0xEA7, 0xEBD}, {0xEC0, 0xEC4}, {0xEC8, 0xECD},
|
||||
{0xED0, 0xED9}, {0xEDC, 0xEDF}, {0xF00, 0xF47}, {0xF49, 0xF6C},
|
||||
{0xF71, 0xF97}, {0xF99, 0xFBC}, {0xFBE, 0xFCC}, {0xFCE, 0xFDA},
|
||||
{0x1000, 0x10C5}, {0x10D0, 0x1248}, {0x124A, 0x124D}, {0x1250, 0x1256},
|
||||
{0x125A, 0x125D}, {0x1260, 0x1288}, {0x128A, 0x128D}, {0x1290, 0x12B0},
|
||||
{0x12B2, 0x12B5}, {0x12B8, 0x12BE}, {0x12C2, 0x12C5}, {0x12C8, 0x12D6},
|
||||
{0x12D8, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x135A}, {0x135D, 0x137C},
|
||||
{0x1380, 0x1399}, {0x13A0, 0x13F5}, {0x13F8, 0x13FD}, {0x1400, 0x167F},
|
||||
{0x1681, 0x169C}, {0x16A0, 0x16F8}, {0x1700, 0x1715}, {0x171F, 0x1736},
|
||||
{0x1740, 0x1753}, {0x1760, 0x176C}, {0x176E, 0x1770}, {0x1780, 0x17DD},
|
||||
{0x17E0, 0x17E9}, {0x17F0, 0x17F9}, {0x1800, 0x180D}, {0x180F, 0x1819},
|
||||
{0x1820, 0x1878}, {0x1880, 0x18AA}, {0x18B0, 0x18F5}, {0x1900, 0x191E},
|
||||
{0x1920, 0x192B}, {0x1930, 0x193B}, {0x1944, 0x196D}, {0x1970, 0x1974},
|
||||
{0x1980, 0x19AB}, {0x19B0, 0x19C9}, {0x19D0, 0x19DA}, {0x19DE, 0x1A1B},
|
||||
{0x1A1E, 0x1A5E}, {0x1A60, 0x1A7C}, {0x1A7F, 0x1A89}, {0x1A90, 0x1A99},
|
||||
{0x1AA0, 0x1AAD}, {0x1AB0, 0x1ACE}, {0x1B00, 0x1B4C}, {0x1B50, 0x1B7E},
|
||||
{0x1B80, 0x1BF3}, {0x1BFC, 0x1C37}, {0x1C3B, 0x1C49}, {0x1C4D, 0x1C88},
|
||||
{0x1C90, 0x1CBA}, {0x1CBD, 0x1CC7}, {0x1CD0, 0x1CFA}, {0x1D00, 0x1F15},
|
||||
{0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, {0x1F50, 0x1F57},
|
||||
{0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, {0x1FB6, 0x1FC4}, {0x1FC6, 0x1FD3},
|
||||
{0x1FD6, 0x1FDB}, {0x1FDD, 0x1FEF}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFE},
|
||||
{0x2010, 0x2027}, {0x2030, 0x205E}, {0x2074, 0x208E}, {0x2090, 0x209C},
|
||||
{0x20A0, 0x20C0}, {0x20D0, 0x20F0}, {0x2100, 0x218B}, {0x2190, 0x2426},
|
||||
{0x2440, 0x244A}, {0x2460, 0x2B73}, {0x2B76, 0x2B95}, {0x2B97, 0x2CF3},
|
||||
{0x2CF9, 0x2D25}, {0x2D30, 0x2D67}, {0x2D7F, 0x2D96}, {0x2DA0, 0x2DA6},
|
||||
{0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, {0x2DB8, 0x2DBE}, {0x2DC0, 0x2DC6},
|
||||
{0x2DC8, 0x2DCE}, {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x2DE0, 0x2E5D},
|
||||
{0x2E80, 0x2E99}, {0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB},
|
||||
{0x3001, 0x303F}, {0x3041, 0x3096}, {0x3099, 0x30FF}, {0x3105, 0x312F},
|
||||
{0x3131, 0x318E}, {0x3190, 0x31E3}, {0x31F0, 0x321E}, {0x3220, 0xA48C},
|
||||
{0xA490, 0xA4C6}, {0xA4D0, 0xA62B}, {0xA640, 0xA6F7}, {0xA700, 0xA7CA},
|
||||
{0xA7D5, 0xA7D9}, {0xA7F2, 0xA82C}, {0xA830, 0xA839}, {0xA840, 0xA877},
|
||||
{0xA880, 0xA8C5}, {0xA8CE, 0xA8D9}, {0xA8E0, 0xA953}, {0xA95F, 0xA97C},
|
||||
{0xA980, 0xA9CD}, {0xA9CF, 0xA9D9}, {0xA9DE, 0xA9FE}, {0xAA00, 0xAA36},
|
||||
{0xAA40, 0xAA4D}, {0xAA50, 0xAA59}, {0xAA5C, 0xAAC2}, {0xAADB, 0xAAF6},
|
||||
{0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, {0xAB11, 0xAB16}, {0xAB20, 0xAB26},
|
||||
{0xAB28, 0xAB2E}, {0xAB30, 0xAB6B}, {0xAB70, 0xABED}, {0xABF0, 0xABF9},
|
||||
{0xAC00, 0xD7A3}, {0xD7B0, 0xD7C6}, {0xD7CB, 0xD7FB}, {0xF900, 0xFA6D},
|
||||
{0xFA70, 0xFAD9}, {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFB1D, 0xFB36},
|
||||
{0xFB38, 0xFB3C}, {0xFB46, 0xFBC2}, {0xFBD3, 0xFD8F}, {0xFD92, 0xFDC7},
|
||||
{0xFDF0, 0xFE19}, {0xFE20, 0xFE52}, {0xFE54, 0xFE66}, {0xFE68, 0xFE6B},
|
||||
{0xFE70, 0xFE74}, {0xFE76, 0xFEFC}, {0xFF01, 0xFFBE}, {0xFFC2, 0xFFC7},
|
||||
{0xFFCA, 0xFFCF}, {0xFFD2, 0xFFD7}, {0xFFDA, 0xFFDC}, {0xFFE0, 0xFFE6},
|
||||
{0xFFE8, 0xFFEE}
|
||||
@@ -708,68 +716,74 @@ static const crange graphRangeTable[] = {
|
||||
{0x102A0, 0x102D0}, {0x102E0, 0x102FB}, {0x10300, 0x10323}, {0x1032D, 0x1034A},
|
||||
{0x10350, 0x1037A}, {0x10380, 0x1039D}, {0x1039F, 0x103C3}, {0x103C8, 0x103D5},
|
||||
{0x10400, 0x1049D}, {0x104A0, 0x104A9}, {0x104B0, 0x104D3}, {0x104D8, 0x104FB},
|
||||
{0x10500, 0x10527}, {0x10530, 0x10563}, {0x10600, 0x10736}, {0x10740, 0x10755},
|
||||
{0x10760, 0x10767}, {0x10800, 0x10805}, {0x1080A, 0x10835}, {0x1083F, 0x10855},
|
||||
{0x10857, 0x1089E}, {0x108A7, 0x108AF}, {0x108E0, 0x108F2}, {0x108FB, 0x1091B},
|
||||
{0x1091F, 0x10939}, {0x10980, 0x109B7}, {0x109BC, 0x109CF}, {0x109D2, 0x10A03},
|
||||
{0x10A0C, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A35}, {0x10A38, 0x10A3A},
|
||||
{0x10A3F, 0x10A48}, {0x10A50, 0x10A58}, {0x10A60, 0x10A9F}, {0x10AC0, 0x10AE6},
|
||||
{0x10AEB, 0x10AF6}, {0x10B00, 0x10B35}, {0x10B39, 0x10B55}, {0x10B58, 0x10B72},
|
||||
{0x10B78, 0x10B91}, {0x10B99, 0x10B9C}, {0x10BA9, 0x10BAF}, {0x10C00, 0x10C48},
|
||||
{0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, {0x10CFA, 0x10D27}, {0x10D30, 0x10D39},
|
||||
{0x10E60, 0x10E7E}, {0x10E80, 0x10EA9}, {0x10EAB, 0x10EAD}, {0x10F00, 0x10F27},
|
||||
{0x10F30, 0x10F59}, {0x10FB0, 0x10FCB}, {0x10FE0, 0x10FF6}, {0x11000, 0x1104D},
|
||||
{0x11052, 0x1106F}, {0x1107F, 0x110BC}, {0x110BE, 0x110C1}, {0x110D0, 0x110E8},
|
||||
{0x110F0, 0x110F9}, {0x11100, 0x11134}, {0x11136, 0x11147}, {0x11150, 0x11176},
|
||||
{0x11180, 0x111DF}, {0x111E1, 0x111F4}, {0x11200, 0x11211}, {0x11213, 0x1123E},
|
||||
{0x11280, 0x11286}, {0x1128A, 0x1128D}, {0x1128F, 0x1129D}, {0x1129F, 0x112A9},
|
||||
{0x112B0, 0x112EA}, {0x112F0, 0x112F9}, {0x11300, 0x11303}, {0x11305, 0x1130C},
|
||||
{0x11313, 0x11328}, {0x1132A, 0x11330}, {0x11335, 0x11339}, {0x1133B, 0x11344},
|
||||
{0x1134B, 0x1134D}, {0x1135D, 0x11363}, {0x11366, 0x1136C}, {0x11370, 0x11374},
|
||||
{0x11400, 0x1145B}, {0x1145D, 0x11461}, {0x11480, 0x114C7}, {0x114D0, 0x114D9},
|
||||
{0x11580, 0x115B5}, {0x115B8, 0x115DD}, {0x11600, 0x11644}, {0x11650, 0x11659},
|
||||
{0x11660, 0x1166C}, {0x11680, 0x116B8}, {0x116C0, 0x116C9}, {0x11700, 0x1171A},
|
||||
{0x1171D, 0x1172B}, {0x11730, 0x1173F}, {0x11800, 0x1183B}, {0x118A0, 0x118F2},
|
||||
{0x118FF, 0x11906}, {0x1190C, 0x11913}, {0x11918, 0x11935}, {0x1193B, 0x11946},
|
||||
{0x11950, 0x11959}, {0x119A0, 0x119A7}, {0x119AA, 0x119D7}, {0x119DA, 0x119E4},
|
||||
{0x11A00, 0x11A47}, {0x11A50, 0x11AA2}, {0x11AC0, 0x11AF8}, {0x11C00, 0x11C08},
|
||||
{0x11C0A, 0x11C36}, {0x11C38, 0x11C45}, {0x11C50, 0x11C6C}, {0x11C70, 0x11C8F},
|
||||
{0x11C92, 0x11CA7}, {0x11CA9, 0x11CB6}, {0x11D00, 0x11D06}, {0x11D0B, 0x11D36},
|
||||
{0x11D3F, 0x11D47}, {0x11D50, 0x11D59}, {0x11D60, 0x11D65}, {0x11D6A, 0x11D8E},
|
||||
{0x11D93, 0x11D98}, {0x11DA0, 0x11DA9}, {0x11EE0, 0x11EF8}, {0x11FC0, 0x11FF1},
|
||||
{0x11FFF, 0x12399}, {0x12400, 0x1246E}, {0x12470, 0x12474}, {0x12480, 0x12543},
|
||||
{0x13000, 0x1342E}, {0x14400, 0x14646}, {0x16800, 0x16A38}, {0x16A40, 0x16A5E},
|
||||
{0x16A60, 0x16A69}, {0x16AD0, 0x16AED}, {0x16AF0, 0x16AF5}, {0x16B00, 0x16B45},
|
||||
{0x16B50, 0x16B59}, {0x16B5B, 0x16B61}, {0x16B63, 0x16B77}, {0x16B7D, 0x16B8F},
|
||||
{0x16E40, 0x16E9A}, {0x16F00, 0x16F4A}, {0x16F4F, 0x16F87}, {0x16F8F, 0x16F9F},
|
||||
{0x16FE0, 0x16FE4}, {0x17000, 0x187F7}, {0x18800, 0x18CD5}, {0x18D00, 0x18D08},
|
||||
{0x1B000, 0x1B11E}, {0x1B150, 0x1B152}, {0x1B164, 0x1B167}, {0x1B170, 0x1B2FB},
|
||||
{0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C}, {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99},
|
||||
{0x1BC9C, 0x1BC9F}, {0x1D000, 0x1D0F5}, {0x1D100, 0x1D126}, {0x1D129, 0x1D172},
|
||||
{0x1D17B, 0x1D1E8}, {0x1D200, 0x1D245}, {0x1D2E0, 0x1D2F3}, {0x1D300, 0x1D356},
|
||||
{0x1D360, 0x1D378}, {0x1D400, 0x1D454}, {0x1D456, 0x1D49C}, {0x1D4A9, 0x1D4AC},
|
||||
{0x1D4AE, 0x1D4B9}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D505}, {0x1D507, 0x1D50A},
|
||||
{0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D51E, 0x1D539}, {0x1D53B, 0x1D53E},
|
||||
{0x1D540, 0x1D544}, {0x1D54A, 0x1D550}, {0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D7CB},
|
||||
{0x1D7CE, 0x1DA8B}, {0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF}, {0x1E000, 0x1E006},
|
||||
{0x1E008, 0x1E018}, {0x1E01B, 0x1E021}, {0x1E026, 0x1E02A}, {0x1E100, 0x1E12C},
|
||||
{0x1E130, 0x1E13D}, {0x1E140, 0x1E149}, {0x1E2C0, 0x1E2F9}, {0x1E800, 0x1E8C4},
|
||||
{0x1E8C7, 0x1E8D6}, {0x1E900, 0x1E94B}, {0x1E950, 0x1E959}, {0x1EC71, 0x1ECB4},
|
||||
{0x1ED01, 0x1ED3D}, {0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE29, 0x1EE32},
|
||||
{0x1EE34, 0x1EE37}, {0x1EE4D, 0x1EE4F}, {0x1EE67, 0x1EE6A}, {0x1EE6C, 0x1EE72},
|
||||
{0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B},
|
||||
{0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, {0x1F000, 0x1F02B},
|
||||
{0x1F030, 0x1F093}, {0x1F0A0, 0x1F0AE}, {0x1F0B1, 0x1F0BF}, {0x1F0C1, 0x1F0CF},
|
||||
{0x1F0D1, 0x1F0F5}, {0x1F100, 0x1F1AD}, {0x1F1E6, 0x1F202}, {0x1F210, 0x1F23B},
|
||||
{0x1F240, 0x1F248}, {0x1F260, 0x1F265}, {0x1F300, 0x1F6D7}, {0x1F6E0, 0x1F6EC},
|
||||
{0x1F6F0, 0x1F6FC}, {0x1F700, 0x1F773}, {0x1F780, 0x1F7D8}, {0x1F7E0, 0x1F7EB},
|
||||
{0x1F800, 0x1F80B}, {0x1F810, 0x1F847}, {0x1F850, 0x1F859}, {0x1F860, 0x1F887},
|
||||
{0x1F890, 0x1F8AD}, {0x1F900, 0x1F978}, {0x1F97A, 0x1F9CB}, {0x1F9CD, 0x1FA53},
|
||||
{0x1FA60, 0x1FA6D}, {0x1FA70, 0x1FA74}, {0x1FA78, 0x1FA7A}, {0x1FA80, 0x1FA86},
|
||||
{0x1FA90, 0x1FAA8}, {0x1FAB0, 0x1FAB6}, {0x1FAC0, 0x1FAC2}, {0x1FAD0, 0x1FAD6},
|
||||
{0x1FB00, 0x1FB92}, {0x1FB94, 0x1FBCA}, {0x1FBF0, 0x1FBF9}, {0x20000, 0x2A6DD},
|
||||
{0x2A700, 0x2B734}, {0x2B740, 0x2B81D}, {0x2B820, 0x2CEA1}, {0x2CEB0, 0x2EBE0},
|
||||
{0x2F800, 0x2FA1D}, {0x30000, 0x3134A}, {0xE0100, 0xE01EF}
|
||||
{0x10500, 0x10527}, {0x10530, 0x10563}, {0x1056F, 0x1057A}, {0x1057C, 0x1058A},
|
||||
{0x1058C, 0x10592}, {0x10597, 0x105A1}, {0x105A3, 0x105B1}, {0x105B3, 0x105B9},
|
||||
{0x10600, 0x10736}, {0x10740, 0x10755}, {0x10760, 0x10767}, {0x10780, 0x10785},
|
||||
{0x10787, 0x107B0}, {0x107B2, 0x107BA}, {0x10800, 0x10805}, {0x1080A, 0x10835},
|
||||
{0x1083F, 0x10855}, {0x10857, 0x1089E}, {0x108A7, 0x108AF}, {0x108E0, 0x108F2},
|
||||
{0x108FB, 0x1091B}, {0x1091F, 0x10939}, {0x10980, 0x109B7}, {0x109BC, 0x109CF},
|
||||
{0x109D2, 0x10A03}, {0x10A0C, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A35},
|
||||
{0x10A38, 0x10A3A}, {0x10A3F, 0x10A48}, {0x10A50, 0x10A58}, {0x10A60, 0x10A9F},
|
||||
{0x10AC0, 0x10AE6}, {0x10AEB, 0x10AF6}, {0x10B00, 0x10B35}, {0x10B39, 0x10B55},
|
||||
{0x10B58, 0x10B72}, {0x10B78, 0x10B91}, {0x10B99, 0x10B9C}, {0x10BA9, 0x10BAF},
|
||||
{0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, {0x10CFA, 0x10D27},
|
||||
{0x10D30, 0x10D39}, {0x10E60, 0x10E7E}, {0x10E80, 0x10EA9}, {0x10EAB, 0x10EAD},
|
||||
{0x10F00, 0x10F27}, {0x10F30, 0x10F59}, {0x10F70, 0x10F89}, {0x10FB0, 0x10FCB},
|
||||
{0x10FE0, 0x10FF6}, {0x11000, 0x1104D}, {0x11052, 0x11075}, {0x1107F, 0x110BC},
|
||||
{0x110BE, 0x110C2}, {0x110D0, 0x110E8}, {0x110F0, 0x110F9}, {0x11100, 0x11134},
|
||||
{0x11136, 0x11147}, {0x11150, 0x11176}, {0x11180, 0x111DF}, {0x111E1, 0x111F4},
|
||||
{0x11200, 0x11211}, {0x11213, 0x1123E}, {0x11280, 0x11286}, {0x1128A, 0x1128D},
|
||||
{0x1128F, 0x1129D}, {0x1129F, 0x112A9}, {0x112B0, 0x112EA}, {0x112F0, 0x112F9},
|
||||
{0x11300, 0x11303}, {0x11305, 0x1130C}, {0x11313, 0x11328}, {0x1132A, 0x11330},
|
||||
{0x11335, 0x11339}, {0x1133B, 0x11344}, {0x1134B, 0x1134D}, {0x1135D, 0x11363},
|
||||
{0x11366, 0x1136C}, {0x11370, 0x11374}, {0x11400, 0x1145B}, {0x1145D, 0x11461},
|
||||
{0x11480, 0x114C7}, {0x114D0, 0x114D9}, {0x11580, 0x115B5}, {0x115B8, 0x115DD},
|
||||
{0x11600, 0x11644}, {0x11650, 0x11659}, {0x11660, 0x1166C}, {0x11680, 0x116B9},
|
||||
{0x116C0, 0x116C9}, {0x11700, 0x1171A}, {0x1171D, 0x1172B}, {0x11730, 0x11746},
|
||||
{0x11800, 0x1183B}, {0x118A0, 0x118F2}, {0x118FF, 0x11906}, {0x1190C, 0x11913},
|
||||
{0x11918, 0x11935}, {0x1193B, 0x11946}, {0x11950, 0x11959}, {0x119A0, 0x119A7},
|
||||
{0x119AA, 0x119D7}, {0x119DA, 0x119E4}, {0x11A00, 0x11A47}, {0x11A50, 0x11AA2},
|
||||
{0x11AB0, 0x11AF8}, {0x11C00, 0x11C08}, {0x11C0A, 0x11C36}, {0x11C38, 0x11C45},
|
||||
{0x11C50, 0x11C6C}, {0x11C70, 0x11C8F}, {0x11C92, 0x11CA7}, {0x11CA9, 0x11CB6},
|
||||
{0x11D00, 0x11D06}, {0x11D0B, 0x11D36}, {0x11D3F, 0x11D47}, {0x11D50, 0x11D59},
|
||||
{0x11D60, 0x11D65}, {0x11D6A, 0x11D8E}, {0x11D93, 0x11D98}, {0x11DA0, 0x11DA9},
|
||||
{0x11EE0, 0x11EF8}, {0x11FC0, 0x11FF1}, {0x11FFF, 0x12399}, {0x12400, 0x1246E},
|
||||
{0x12470, 0x12474}, {0x12480, 0x12543}, {0x12F90, 0x12FF2}, {0x13000, 0x1342E},
|
||||
{0x14400, 0x14646}, {0x16800, 0x16A38}, {0x16A40, 0x16A5E}, {0x16A60, 0x16A69},
|
||||
{0x16A6E, 0x16ABE}, {0x16AC0, 0x16AC9}, {0x16AD0, 0x16AED}, {0x16AF0, 0x16AF5},
|
||||
{0x16B00, 0x16B45}, {0x16B50, 0x16B59}, {0x16B5B, 0x16B61}, {0x16B63, 0x16B77},
|
||||
{0x16B7D, 0x16B8F}, {0x16E40, 0x16E9A}, {0x16F00, 0x16F4A}, {0x16F4F, 0x16F87},
|
||||
{0x16F8F, 0x16F9F}, {0x16FE0, 0x16FE4}, {0x17000, 0x187F7}, {0x18800, 0x18CD5},
|
||||
{0x18D00, 0x18D08}, {0x1AFF0, 0x1AFF3}, {0x1AFF5, 0x1AFFB}, {0x1B000, 0x1B122},
|
||||
{0x1B150, 0x1B152}, {0x1B164, 0x1B167}, {0x1B170, 0x1B2FB}, {0x1BC00, 0x1BC6A},
|
||||
{0x1BC70, 0x1BC7C}, {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1BC9C, 0x1BC9F},
|
||||
{0x1CF00, 0x1CF2D}, {0x1CF30, 0x1CF46}, {0x1CF50, 0x1CFC3}, {0x1D000, 0x1D0F5},
|
||||
{0x1D100, 0x1D126}, {0x1D129, 0x1D172}, {0x1D17B, 0x1D1EA}, {0x1D200, 0x1D245},
|
||||
{0x1D2E0, 0x1D2F3}, {0x1D300, 0x1D356}, {0x1D360, 0x1D378}, {0x1D400, 0x1D454},
|
||||
{0x1D456, 0x1D49C}, {0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B9}, {0x1D4BD, 0x1D4C3},
|
||||
{0x1D4C5, 0x1D505}, {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, {0x1D516, 0x1D51C},
|
||||
{0x1D51E, 0x1D539}, {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, {0x1D54A, 0x1D550},
|
||||
{0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D7CB}, {0x1D7CE, 0x1DA8B}, {0x1DA9B, 0x1DA9F},
|
||||
{0x1DAA1, 0x1DAAF}, {0x1DF00, 0x1DF1E}, {0x1E000, 0x1E006}, {0x1E008, 0x1E018},
|
||||
{0x1E01B, 0x1E021}, {0x1E026, 0x1E02A}, {0x1E100, 0x1E12C}, {0x1E130, 0x1E13D},
|
||||
{0x1E140, 0x1E149}, {0x1E290, 0x1E2AE}, {0x1E2C0, 0x1E2F9}, {0x1E7E0, 0x1E7E6},
|
||||
{0x1E7E8, 0x1E7EB}, {0x1E7F0, 0x1E7FE}, {0x1E800, 0x1E8C4}, {0x1E8C7, 0x1E8D6},
|
||||
{0x1E900, 0x1E94B}, {0x1E950, 0x1E959}, {0x1EC71, 0x1ECB4}, {0x1ED01, 0x1ED3D},
|
||||
{0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE29, 0x1EE32}, {0x1EE34, 0x1EE37},
|
||||
{0x1EE4D, 0x1EE4F}, {0x1EE67, 0x1EE6A}, {0x1EE6C, 0x1EE72}, {0x1EE74, 0x1EE77},
|
||||
{0x1EE79, 0x1EE7C}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B}, {0x1EEA1, 0x1EEA3},
|
||||
{0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, {0x1F000, 0x1F02B}, {0x1F030, 0x1F093},
|
||||
{0x1F0A0, 0x1F0AE}, {0x1F0B1, 0x1F0BF}, {0x1F0C1, 0x1F0CF}, {0x1F0D1, 0x1F0F5},
|
||||
{0x1F100, 0x1F1AD}, {0x1F1E6, 0x1F202}, {0x1F210, 0x1F23B}, {0x1F240, 0x1F248},
|
||||
{0x1F260, 0x1F265}, {0x1F300, 0x1F6D7}, {0x1F6DD, 0x1F6EC}, {0x1F6F0, 0x1F6FC},
|
||||
{0x1F700, 0x1F773}, {0x1F780, 0x1F7D8}, {0x1F7E0, 0x1F7EB}, {0x1F800, 0x1F80B},
|
||||
{0x1F810, 0x1F847}, {0x1F850, 0x1F859}, {0x1F860, 0x1F887}, {0x1F890, 0x1F8AD},
|
||||
{0x1F900, 0x1FA53}, {0x1FA60, 0x1FA6D}, {0x1FA70, 0x1FA74}, {0x1FA78, 0x1FA7C},
|
||||
{0x1FA80, 0x1FA86}, {0x1FA90, 0x1FAAC}, {0x1FAB0, 0x1FABA}, {0x1FAC0, 0x1FAC5},
|
||||
{0x1FAD0, 0x1FAD9}, {0x1FAE0, 0x1FAE7}, {0x1FAF0, 0x1FAF6}, {0x1FB00, 0x1FB92},
|
||||
{0x1FB94, 0x1FBCA}, {0x1FBF0, 0x1FBF9}, {0x20000, 0x2A6DF}, {0x2A700, 0x2B738},
|
||||
{0x2B740, 0x2B81D}, {0x2B820, 0x2CEA1}, {0x2CEB0, 0x2EBE0}, {0x2F800, 0x2FA1D},
|
||||
{0x30000, 0x3134A}, {0xE0100, 0xE01EF}
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -781,22 +795,23 @@ static const chr graphCharTable[] = {
|
||||
0xA3C, 0xA47, 0xA48, 0xA51, 0xA5E, 0xAB2, 0xAB3, 0xAD0, 0xB0F,
|
||||
0xB10, 0xB32, 0xB33, 0xB47, 0xB48, 0xB5C, 0xB5D, 0xB82, 0xB83,
|
||||
0xB99, 0xB9A, 0xB9C, 0xB9E, 0xB9F, 0xBA3, 0xBA4, 0xBD0, 0xBD7,
|
||||
0xC55, 0xC56, 0xCD5, 0xCD6, 0xCDE, 0xCF1, 0xCF2, 0xDBD, 0xDCA,
|
||||
0xDD6, 0xE81, 0xE82, 0xE84, 0xEA5, 0xEC6, 0x10C7, 0x10CD, 0x1258,
|
||||
0x12C0, 0x1772, 0x1773, 0x1940, 0x1F59, 0x1F5B, 0x1F5D, 0x2070, 0x2071,
|
||||
0x2D27, 0x2D2D, 0x2D6F, 0x2D70, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44,
|
||||
0xFFFC, 0xFFFD
|
||||
0xC55, 0xC56, 0xC5D, 0xCD5, 0xCD6, 0xCDD, 0xCDE, 0xCF1, 0xCF2,
|
||||
0xDBD, 0xDCA, 0xDD6, 0xE81, 0xE82, 0xE84, 0xEA5, 0xEC6, 0x10C7,
|
||||
0x10CD, 0x1258, 0x12C0, 0x1772, 0x1773, 0x1940, 0x1F59, 0x1F5B, 0x1F5D,
|
||||
0x2070, 0x2071, 0x2D27, 0x2D2D, 0x2D6F, 0x2D70, 0xA7D0, 0xA7D1, 0xA7D3,
|
||||
0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, 0xFDCF, 0xFFFC, 0xFFFD
|
||||
#if CHRBITS > 16
|
||||
,0x1003C, 0x1003D, 0x101A0, 0x1056F, 0x10808, 0x10837, 0x10838, 0x1083C, 0x108F4,
|
||||
0x108F5, 0x1093F, 0x10A05, 0x10A06, 0x10EB0, 0x10EB1, 0x11288, 0x1130F, 0x11310,
|
||||
0x11332, 0x11333, 0x11347, 0x11348, 0x11350, 0x11357, 0x11909, 0x11915, 0x11916,
|
||||
0x11937, 0x11938, 0x11D08, 0x11D09, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D67, 0x11D68,
|
||||
0x11D90, 0x11D91, 0x11FB0, 0x16A6E, 0x16A6F, 0x16FF0, 0x16FF1, 0x1D49E, 0x1D49F,
|
||||
0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4BB, 0x1D546, 0x1E023, 0x1E024, 0x1E14E, 0x1E14F,
|
||||
0x1E2FF, 0x1E95E, 0x1E95F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE27, 0x1EE39, 0x1EE3B,
|
||||
0x1EE42, 0x1EE47, 0x1EE49, 0x1EE4B, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE57, 0x1EE59,
|
||||
0x1EE5B, 0x1EE5D, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE7E, 0x1EEF0, 0x1EEF1,
|
||||
0x1F250, 0x1F251, 0x1F8B0, 0x1F8B1
|
||||
,0x1003C, 0x1003D, 0x101A0, 0x10594, 0x10595, 0x105BB, 0x105BC, 0x10808, 0x10837,
|
||||
0x10838, 0x1083C, 0x108F4, 0x108F5, 0x1093F, 0x10A05, 0x10A06, 0x10EB0, 0x10EB1,
|
||||
0x11288, 0x1130F, 0x11310, 0x11332, 0x11333, 0x11347, 0x11348, 0x11350, 0x11357,
|
||||
0x11909, 0x11915, 0x11916, 0x11937, 0x11938, 0x11D08, 0x11D09, 0x11D3A, 0x11D3C,
|
||||
0x11D3D, 0x11D67, 0x11D68, 0x11D90, 0x11D91, 0x11FB0, 0x16FF0, 0x16FF1, 0x1AFFD,
|
||||
0x1AFFE, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4BB, 0x1D546, 0x1E023,
|
||||
0x1E024, 0x1E14E, 0x1E14F, 0x1E2FF, 0x1E7ED, 0x1E7EE, 0x1E95E, 0x1E95F, 0x1EE21,
|
||||
0x1EE22, 0x1EE24, 0x1EE27, 0x1EE39, 0x1EE3B, 0x1EE42, 0x1EE47, 0x1EE49, 0x1EE4B,
|
||||
0x1EE51, 0x1EE52, 0x1EE54, 0x1EE57, 0x1EE59, 0x1EE5B, 0x1EE5D, 0x1EE5F, 0x1EE61,
|
||||
0x1EE62, 0x1EE64, 0x1EE7E, 0x1EEF0, 0x1EEF1, 0x1F250, 0x1F251, 0x1F7F0, 0x1F8B0,
|
||||
0x1F8B1
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
+12
-4
@@ -2348,18 +2348,18 @@ declare 635 {
|
||||
|
||||
# TIP #445
|
||||
declare 636 {
|
||||
void Tcl_FreeIntRep(Tcl_Obj *objPtr)
|
||||
void Tcl_FreeInternalRep(Tcl_Obj *objPtr)
|
||||
}
|
||||
declare 637 {
|
||||
char *Tcl_InitStringRep(Tcl_Obj *objPtr, const char *bytes,
|
||||
unsigned int numBytes)
|
||||
}
|
||||
declare 638 {
|
||||
Tcl_ObjIntRep *Tcl_FetchIntRep(Tcl_Obj *objPtr, const Tcl_ObjType *typePtr)
|
||||
Tcl_ObjInternalRep *Tcl_FetchInternalRep(Tcl_Obj *objPtr, const Tcl_ObjType *typePtr)
|
||||
}
|
||||
declare 639 {
|
||||
void Tcl_StoreIntRep(Tcl_Obj *objPtr, const Tcl_ObjType *typePtr,
|
||||
const Tcl_ObjIntRep *irPtr)
|
||||
void Tcl_StoreInternalRep(Tcl_Obj *objPtr, const Tcl_ObjType *typePtr,
|
||||
const Tcl_ObjInternalRep *irPtr)
|
||||
}
|
||||
declare 640 {
|
||||
int Tcl_HasStringRep(Tcl_Obj *objPtr)
|
||||
@@ -2423,6 +2423,14 @@ declare 655 {
|
||||
declare 656 {
|
||||
const char *Tcl_UtfPrev(const char *src, const char *start)
|
||||
}
|
||||
declare 657 {
|
||||
int Tcl_UniCharIsUnicode(int ch)
|
||||
}
|
||||
|
||||
# TIP #511
|
||||
declare 660 {
|
||||
int Tcl_AsyncMarkFromSignal(Tcl_AsyncHandler async, int sigNumber)
|
||||
}
|
||||
|
||||
# ----- BASELINE -- FOR -- 8.7.0 ----- #
|
||||
|
||||
|
||||
+11
-10
@@ -50,10 +50,10 @@ extern "C" {
|
||||
#define TCL_MAJOR_VERSION 8
|
||||
#define TCL_MINOR_VERSION 7
|
||||
#define TCL_RELEASE_LEVEL TCL_ALPHA_RELEASE
|
||||
#define TCL_RELEASE_SERIAL 4
|
||||
#define TCL_RELEASE_SERIAL 6
|
||||
|
||||
#define TCL_VERSION "8.7"
|
||||
#define TCL_PATCH_LEVEL "8.7a4"
|
||||
#define TCL_PATCH_LEVEL "8.7a6"
|
||||
|
||||
#if !defined(TCL_NO_DEPRECATED) || defined(RC_INVOKED)
|
||||
/*
|
||||
@@ -749,13 +749,13 @@ typedef struct Tcl_ObjType {
|
||||
} Tcl_ObjType;
|
||||
|
||||
/*
|
||||
* The following structure stores an internal representation (intrep) for
|
||||
* a Tcl value. An intrep is associated with an Tcl_ObjType when both
|
||||
* The following structure stores an internal representation (internalrep) for
|
||||
* a Tcl value. An internalrep is associated with an Tcl_ObjType when both
|
||||
* are stored in the same Tcl_Obj. The routines of the Tcl_ObjType govern
|
||||
* the handling of the intrep.
|
||||
* the handling of the internalrep.
|
||||
*/
|
||||
|
||||
typedef union Tcl_ObjIntRep { /* The internal representation: */
|
||||
typedef union Tcl_ObjInternalRep { /* The internal representation: */
|
||||
long longValue; /* - an long integer value. */
|
||||
double doubleValue; /* - a double-precision floating value. */
|
||||
void *otherValuePtr; /* - another, type-specific value, */
|
||||
@@ -769,7 +769,7 @@ typedef union Tcl_ObjIntRep { /* The internal representation: */
|
||||
void *ptr; /* not used internally any more. */
|
||||
unsigned long value;
|
||||
} ptrAndLongRep;
|
||||
} Tcl_ObjIntRep;
|
||||
} Tcl_ObjInternalRep;
|
||||
|
||||
/*
|
||||
* One of the following structures exists for each object in the Tcl system.
|
||||
@@ -796,7 +796,7 @@ typedef struct Tcl_Obj {
|
||||
* corresponds to the type of the object's
|
||||
* internal rep. NULL indicates the object has
|
||||
* no internal rep (has no type). */
|
||||
Tcl_ObjIntRep internalRep; /* The internal representation: */
|
||||
Tcl_ObjInternalRep internalRep; /* The internal representation: */
|
||||
} Tcl_Obj;
|
||||
|
||||
|
||||
@@ -2136,7 +2136,7 @@ typedef struct Tcl_EncodingType {
|
||||
#if TCL_UTF_MAX > 3
|
||||
/*
|
||||
* int isn't 100% accurate as it should be a strict 4-byte value
|
||||
* (perhaps wchar_t). ILP64/SILP64 systems may have troubles. The
|
||||
* (perhaps int32_t). ILP64/SILP64 systems may have troubles. The
|
||||
* size of this value must be reflected correctly in regcustom.h.
|
||||
*/
|
||||
typedef int Tcl_UniChar;
|
||||
@@ -2385,6 +2385,7 @@ EXTERN const char * Tcl_PkgInitStubsCheck(Tcl_Interp *interp,
|
||||
const char *version, int exact);
|
||||
EXTERN void Tcl_InitSubsystems(void);
|
||||
EXTERN void Tcl_GetMemoryInfo(Tcl_DString *dsPtr);
|
||||
EXTERN const char * Tcl_SetPreInitScript(const char *string);
|
||||
#ifndef TCL_NO_DEPRECATED
|
||||
# define Tcl_StaticPackage Tcl_StaticLibrary
|
||||
#endif
|
||||
@@ -2478,7 +2479,7 @@ EXTERN int TclZipfs_AppHook(int *argc, char ***argv);
|
||||
++(objPtr)->refCount
|
||||
/*
|
||||
* Use do/while0 idiom for optimum correctness without compiler warnings.
|
||||
* http://c2.com/cgi/wiki?TrivialDoWhileLoop
|
||||
* https://wiki.c2.com/?TrivialDoWhileLoop
|
||||
*/
|
||||
# undef Tcl_DecrRefCount
|
||||
# define Tcl_DecrRefCount(objPtr) \
|
||||
|
||||
@@ -865,7 +865,7 @@ CompileAssembleObj(
|
||||
* is valid in the current context.
|
||||
*/
|
||||
|
||||
ByteCodeGetIntRep(objPtr, &assembleCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &assembleCodeType, codePtr);
|
||||
|
||||
if (codePtr) {
|
||||
namespacePtr = iPtr->varFramePtr->nsPtr;
|
||||
@@ -882,7 +882,7 @@ CompileAssembleObj(
|
||||
* Not valid, so free it and regenerate.
|
||||
*/
|
||||
|
||||
Tcl_StoreIntRep(objPtr, &assembleCodeType, NULL);
|
||||
Tcl_StoreInternalRep(objPtr, &assembleCodeType, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4289,7 +4289,7 @@ AddBasicBlockRangeToErrorInfo(
|
||||
* DupAssembleCodeInternalRep --
|
||||
*
|
||||
* Part of the Tcl object type implementation for Tcl assembly language
|
||||
* bytecode. We do not copy the bytecode intrep. Instead, we return
|
||||
* bytecode. We do not copy the bytecode internalrep. Instead, we return
|
||||
* without setting copyPtr->typePtr, so the copy is a plain string copy
|
||||
* of the assembly source, and if it is to be used as a compiled
|
||||
* expression, it will need to be reprocessed.
|
||||
@@ -4298,7 +4298,7 @@ AddBasicBlockRangeToErrorInfo(
|
||||
* usual (only?) time Tcl_DuplicateObj() will be called is when the copy
|
||||
* is about to be modified, which would invalidate any copied bytecode
|
||||
* anyway. The only reason it might make sense to copy the bytecode is if
|
||||
* we had some modifying routines that operated directly on the intrep,
|
||||
* we had some modifying routines that operated directly on the internalrep,
|
||||
* as we do for lists and dicts.
|
||||
*
|
||||
* Results:
|
||||
@@ -4342,7 +4342,7 @@ FreeAssembleCodeInternalRep(
|
||||
{
|
||||
ByteCode *codePtr;
|
||||
|
||||
ByteCodeGetIntRep(objPtr, &assembleCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &assembleCodeType, codePtr);
|
||||
assert(codePtr != NULL);
|
||||
|
||||
TclReleaseByteCode(codePtr);
|
||||
|
||||
+153
-57
@@ -25,9 +25,9 @@ typedef struct AsyncHandler {
|
||||
int ready; /* Non-zero means this handler should be
|
||||
* invoked in the next call to
|
||||
* Tcl_AsyncInvoke. */
|
||||
struct AsyncHandler *nextPtr;
|
||||
/* Next in list of all handlers for the
|
||||
* process. */
|
||||
struct AsyncHandler *nextPtr, *prevPtr;
|
||||
/* Next, previous in list of all handlers
|
||||
* for the process. */
|
||||
Tcl_AsyncProc *proc; /* Procedure to call when handler is
|
||||
* invoked. */
|
||||
ClientData clientData; /* Value to pass to handler when it is
|
||||
@@ -38,16 +38,10 @@ typedef struct AsyncHandler {
|
||||
* associated to. */
|
||||
Tcl_ThreadId originThrdId; /* Origin thread where this token was created
|
||||
* and where it will be yielded. */
|
||||
ClientData notifierData; /* Platform notifier data or NULL. */
|
||||
} AsyncHandler;
|
||||
|
||||
typedef struct ThreadSpecificData {
|
||||
/*
|
||||
* The variables below maintain a list of all existing handlers specific
|
||||
* to the calling thread.
|
||||
*/
|
||||
AsyncHandler *firstHandler; /* First handler defined for process, or NULL
|
||||
* if none. */
|
||||
AsyncHandler *lastHandler; /* Last handler or NULL. */
|
||||
int asyncReady; /* This is set to 1 whenever a handler becomes
|
||||
* ready and it is cleared to zero whenever
|
||||
* Tcl_AsyncInvoke is called. It can be
|
||||
@@ -58,24 +52,29 @@ typedef struct ThreadSpecificData {
|
||||
* currently working. If so then we won't set
|
||||
* asyncReady again until Tcl_AsyncInvoke
|
||||
* returns. */
|
||||
Tcl_Mutex asyncMutex; /* Thread-specific AsyncHandler linked-list
|
||||
* lock */
|
||||
} ThreadSpecificData;
|
||||
static Tcl_ThreadDataKey dataKey;
|
||||
|
||||
/* Mutex to protect linked-list of AsyncHandlers in the process. */
|
||||
TCL_DECLARE_MUTEX(asyncMutex)
|
||||
|
||||
/* List of all existing handlers of the process. */
|
||||
static AsyncHandler *firstHandler = NULL;
|
||||
static AsyncHandler *lastHandler = NULL;
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TclFinalizeAsync --
|
||||
*
|
||||
* Finalizes the mutex in the thread local data structure for the async
|
||||
* Finalizes the thread local data structure for the async
|
||||
* subsystem.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* Forgets knowledge of the mutex should it have been created.
|
||||
* Cleans up left-over async handlers for the calling thread.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
@@ -83,10 +82,40 @@ static Tcl_ThreadDataKey dataKey;
|
||||
void
|
||||
TclFinalizeAsync(void)
|
||||
{
|
||||
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
|
||||
AsyncHandler *token, *toDelete = NULL;
|
||||
Tcl_ThreadId self = Tcl_GetCurrentThread();
|
||||
|
||||
if (tsdPtr->asyncMutex != NULL) {
|
||||
Tcl_MutexFinalize(&tsdPtr->asyncMutex);
|
||||
Tcl_MutexLock(&asyncMutex);
|
||||
for (token = firstHandler; token != NULL;) {
|
||||
AsyncHandler *nextToken = token->nextPtr;
|
||||
|
||||
if (token->originThrdId == self) {
|
||||
if (token->prevPtr == NULL) {
|
||||
firstHandler = token->nextPtr;
|
||||
if (firstHandler == NULL) {
|
||||
lastHandler = NULL;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
token->prevPtr->nextPtr = token->nextPtr;
|
||||
if (token == lastHandler) {
|
||||
lastHandler = token->prevPtr;
|
||||
}
|
||||
}
|
||||
if (token->nextPtr != NULL) {
|
||||
token->nextPtr->prevPtr = token->prevPtr;
|
||||
}
|
||||
token->nextPtr = toDelete;
|
||||
token->prevPtr = NULL;
|
||||
toDelete = token;
|
||||
}
|
||||
token = nextToken;
|
||||
}
|
||||
Tcl_MutexUnlock(&asyncMutex);
|
||||
while (toDelete != NULL) {
|
||||
token = toDelete;
|
||||
toDelete = toDelete->nextPtr;
|
||||
ckfree(token);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,19 +150,22 @@ Tcl_AsyncCreate(
|
||||
asyncPtr = (AsyncHandler*)ckalloc(sizeof(AsyncHandler));
|
||||
asyncPtr->ready = 0;
|
||||
asyncPtr->nextPtr = NULL;
|
||||
asyncPtr->prevPtr = NULL;
|
||||
asyncPtr->proc = proc;
|
||||
asyncPtr->clientData = clientData;
|
||||
asyncPtr->originTsd = tsdPtr;
|
||||
asyncPtr->originThrdId = Tcl_GetCurrentThread();
|
||||
asyncPtr->notifierData = TclpNotifierData();
|
||||
|
||||
Tcl_MutexLock(&tsdPtr->asyncMutex);
|
||||
if (tsdPtr->firstHandler == NULL) {
|
||||
tsdPtr->firstHandler = asyncPtr;
|
||||
Tcl_MutexLock(&asyncMutex);
|
||||
if (firstHandler == NULL) {
|
||||
firstHandler = asyncPtr;
|
||||
} else {
|
||||
tsdPtr->lastHandler->nextPtr = asyncPtr;
|
||||
asyncPtr->prevPtr = lastHandler;
|
||||
lastHandler->nextPtr = asyncPtr;
|
||||
}
|
||||
tsdPtr->lastHandler = asyncPtr;
|
||||
Tcl_MutexUnlock(&tsdPtr->asyncMutex);
|
||||
lastHandler = asyncPtr;
|
||||
Tcl_MutexUnlock(&asyncMutex);
|
||||
return (Tcl_AsyncHandler) asyncPtr;
|
||||
}
|
||||
|
||||
@@ -162,13 +194,86 @@ Tcl_AsyncMark(
|
||||
{
|
||||
AsyncHandler *token = (AsyncHandler *) async;
|
||||
|
||||
Tcl_MutexLock(&token->originTsd->asyncMutex);
|
||||
Tcl_MutexLock(&asyncMutex);
|
||||
token->ready = 1;
|
||||
if (!token->originTsd->asyncActive) {
|
||||
token->originTsd->asyncReady = 1;
|
||||
Tcl_ThreadAlert(token->originThrdId);
|
||||
}
|
||||
Tcl_MutexUnlock(&token->originTsd->asyncMutex);
|
||||
Tcl_MutexUnlock(&asyncMutex);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* Tcl_AsyncMarkFromSignal --
|
||||
*
|
||||
* This procedure is similar to Tcl_AsyncMark but must be used
|
||||
* in POSIX signal contexts. In addition to Tcl_AsyncMark the
|
||||
* signal number is passed.
|
||||
*
|
||||
* Results:
|
||||
* True, when the handler will be marked, false otherwise.
|
||||
*
|
||||
* Side effects:
|
||||
* The handler gets marked for invocation later.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
int
|
||||
Tcl_AsyncMarkFromSignal(
|
||||
Tcl_AsyncHandler async, /* Token for handler. */
|
||||
int sigNumber) /* Signal number. */
|
||||
{
|
||||
#if TCL_THREADS
|
||||
AsyncHandler *token = (AsyncHandler *) async;
|
||||
|
||||
return TclAsyncNotifier(sigNumber, token->originThrdId,
|
||||
token->notifierData, &token->ready, -1);
|
||||
#else
|
||||
(void)sigNumber;
|
||||
|
||||
Tcl_AsyncMark(async);
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TclAsyncMarkFromNotifier --
|
||||
*
|
||||
* This procedure is called from the notifier thread and
|
||||
* invokes Tcl_AsyncMark for specifically marked handlers.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* Handlers get marked for invocation later.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
TclAsyncMarkFromNotifier(void)
|
||||
{
|
||||
AsyncHandler *token;
|
||||
|
||||
Tcl_MutexLock(&asyncMutex);
|
||||
for (token = firstHandler; token != NULL;
|
||||
token = token->nextPtr) {
|
||||
if (token->ready == -1) {
|
||||
token->ready = 1;
|
||||
if (!token->originTsd->asyncActive) {
|
||||
token->originTsd->asyncReady = 1;
|
||||
Tcl_ThreadAlert(token->originThrdId);
|
||||
}
|
||||
}
|
||||
}
|
||||
Tcl_MutexUnlock(&asyncMutex);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -200,11 +305,12 @@ Tcl_AsyncInvoke(
|
||||
{
|
||||
AsyncHandler *asyncPtr;
|
||||
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
|
||||
Tcl_ThreadId self = Tcl_GetCurrentThread();
|
||||
|
||||
Tcl_MutexLock(&tsdPtr->asyncMutex);
|
||||
Tcl_MutexLock(&asyncMutex);
|
||||
|
||||
if (tsdPtr->asyncReady == 0) {
|
||||
Tcl_MutexUnlock(&tsdPtr->asyncMutex);
|
||||
Tcl_MutexUnlock(&asyncMutex);
|
||||
return code;
|
||||
}
|
||||
tsdPtr->asyncReady = 0;
|
||||
@@ -224,8 +330,11 @@ Tcl_AsyncInvoke(
|
||||
*/
|
||||
|
||||
while (1) {
|
||||
for (asyncPtr = tsdPtr->firstHandler; asyncPtr != NULL;
|
||||
for (asyncPtr = firstHandler; asyncPtr != NULL;
|
||||
asyncPtr = asyncPtr->nextPtr) {
|
||||
if (asyncPtr->originThrdId != self) {
|
||||
continue;
|
||||
}
|
||||
if (asyncPtr->ready) {
|
||||
break;
|
||||
}
|
||||
@@ -234,12 +343,12 @@ Tcl_AsyncInvoke(
|
||||
break;
|
||||
}
|
||||
asyncPtr->ready = 0;
|
||||
Tcl_MutexUnlock(&tsdPtr->asyncMutex);
|
||||
Tcl_MutexUnlock(&asyncMutex);
|
||||
code = asyncPtr->proc(asyncPtr->clientData, interp, code);
|
||||
Tcl_MutexLock(&tsdPtr->asyncMutex);
|
||||
Tcl_MutexLock(&asyncMutex);
|
||||
}
|
||||
tsdPtr->asyncActive = 0;
|
||||
Tcl_MutexUnlock(&tsdPtr->asyncMutex);
|
||||
Tcl_MutexUnlock(&asyncMutex);
|
||||
return code;
|
||||
}
|
||||
|
||||
@@ -271,9 +380,7 @@ void
|
||||
Tcl_AsyncDelete(
|
||||
Tcl_AsyncHandler async) /* Token for handler to delete. */
|
||||
{
|
||||
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
|
||||
AsyncHandler *asyncPtr = (AsyncHandler *) async;
|
||||
AsyncHandler *prevPtr, *thisPtr;
|
||||
|
||||
/*
|
||||
* Assure early handling of the constraint
|
||||
@@ -283,33 +390,22 @@ Tcl_AsyncDelete(
|
||||
Tcl_Panic("Tcl_AsyncDelete: async handler deleted by the wrong thread");
|
||||
}
|
||||
|
||||
/*
|
||||
* If we come to this point when TSD's for the current
|
||||
* thread have already been garbage-collected, we are
|
||||
* in the _serious_ trouble. OTOH, we tolerate calling
|
||||
* with already cleaned-up handler list (should we?).
|
||||
*/
|
||||
|
||||
Tcl_MutexLock(&tsdPtr->asyncMutex);
|
||||
if (tsdPtr->firstHandler != NULL) {
|
||||
prevPtr = thisPtr = tsdPtr->firstHandler;
|
||||
while (thisPtr != NULL && thisPtr != asyncPtr) {
|
||||
prevPtr = thisPtr;
|
||||
thisPtr = thisPtr->nextPtr;
|
||||
Tcl_MutexLock(&asyncMutex);
|
||||
if (asyncPtr->prevPtr == NULL) {
|
||||
firstHandler = asyncPtr->nextPtr;
|
||||
if (firstHandler == NULL) {
|
||||
lastHandler = NULL;
|
||||
}
|
||||
if (thisPtr == NULL) {
|
||||
Tcl_Panic("Tcl_AsyncDelete: cannot find async handler");
|
||||
}
|
||||
if (asyncPtr == tsdPtr->firstHandler) {
|
||||
tsdPtr->firstHandler = asyncPtr->nextPtr;
|
||||
} else {
|
||||
prevPtr->nextPtr = asyncPtr->nextPtr;
|
||||
}
|
||||
if (asyncPtr == tsdPtr->lastHandler) {
|
||||
tsdPtr->lastHandler = prevPtr;
|
||||
} else {
|
||||
asyncPtr->prevPtr->nextPtr = asyncPtr->nextPtr;
|
||||
if (asyncPtr == lastHandler) {
|
||||
lastHandler = asyncPtr->prevPtr;
|
||||
}
|
||||
}
|
||||
Tcl_MutexUnlock(&tsdPtr->asyncMutex);
|
||||
if (asyncPtr->nextPtr != NULL) {
|
||||
asyncPtr->nextPtr->prevPtr = asyncPtr->prevPtr;
|
||||
}
|
||||
Tcl_MutexUnlock(&asyncMutex);
|
||||
ckfree(asyncPtr);
|
||||
}
|
||||
|
||||
|
||||
+41
-20
@@ -1826,28 +1826,28 @@ DeleteInterpProc(
|
||||
ckfree(hTablePtr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Invoke deletion callbacks; note that a callback can create new
|
||||
* callbacks, so we iterate.
|
||||
*/
|
||||
|
||||
while (iPtr->assocData != NULL) {
|
||||
if (iPtr->assocData != NULL) {
|
||||
AssocData *dPtr;
|
||||
|
||||
hTablePtr = iPtr->assocData;
|
||||
iPtr->assocData = NULL;
|
||||
/*
|
||||
* Invoke deletion callbacks; note that a callback can create new
|
||||
* callbacks, so we iterate.
|
||||
*/
|
||||
for (hPtr = Tcl_FirstHashEntry(hTablePtr, &search);
|
||||
hPtr != NULL;
|
||||
hPtr = Tcl_FirstHashEntry(hTablePtr, &search)) {
|
||||
dPtr = (AssocData *)Tcl_GetHashValue(hPtr);
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
if (dPtr->proc != NULL) {
|
||||
dPtr->proc(dPtr->clientData, interp);
|
||||
}
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
ckfree(dPtr);
|
||||
}
|
||||
Tcl_DeleteHashTable(hTablePtr);
|
||||
ckfree(hTablePtr);
|
||||
iPtr->assocData = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3505,15 +3505,14 @@ Tcl_DeleteCommandFromToken(
|
||||
cmdPtr->flags |= CMD_DYING;
|
||||
|
||||
/*
|
||||
* Call trace functions for the command being deleted. Then delete its
|
||||
* traces.
|
||||
* Call each functions and then delete the trace.
|
||||
*/
|
||||
|
||||
cmdPtr->nsPtr->refCount++;
|
||||
|
||||
if (cmdPtr->tracePtr != NULL) {
|
||||
CommandTrace *tracePtr;
|
||||
/* Note that CallCommandTraces() never frees cmdPtr, that's
|
||||
/* CallCommandTraces() does not cmdPtr, that's
|
||||
* done just before Tcl_DeleteCommandFromToken() returns */
|
||||
CallCommandTraces(iPtr,cmdPtr,NULL,NULL,TCL_TRACE_DELETE);
|
||||
|
||||
@@ -3960,8 +3959,8 @@ OldMathFuncProc(
|
||||
result = Tcl_GetDoubleFromObj(NULL, valuePtr, &d);
|
||||
#ifdef ACCEPT_NAN
|
||||
if (result != TCL_OK) {
|
||||
const Tcl_ObjIntRep *irPtr
|
||||
= TclFetchIntRep(valuePtr, &tclDoubleType);
|
||||
const Tcl_ObjInternalRep *irPtr
|
||||
= TclFetchInternalRep(valuePtr, &tclDoubleType);
|
||||
|
||||
if (irPtr) {
|
||||
d = irPtr->doubleValue;
|
||||
@@ -4867,6 +4866,7 @@ NRCommand(
|
||||
int result)
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Tcl_Obj *listPtr;
|
||||
|
||||
iPtr->numLevels--;
|
||||
|
||||
@@ -4875,7 +4875,10 @@ NRCommand(
|
||||
*/
|
||||
|
||||
if (data[1] && (data[1] != INT2PTR(1))) {
|
||||
TclNRAddCallback(interp, TclNRTailcallEval, data[1], NULL, NULL, NULL);
|
||||
listPtr = (Tcl_Obj *)data[1];
|
||||
data[1] = NULL;
|
||||
|
||||
TclNRAddCallback(interp, TclNRTailcallEval, listPtr, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/* OPT ??
|
||||
@@ -7534,7 +7537,7 @@ ExprCeilFunc(
|
||||
code = Tcl_GetDoubleFromObj(interp, objv[1], &d);
|
||||
#ifdef ACCEPT_NAN
|
||||
if (code != TCL_OK) {
|
||||
const Tcl_ObjIntRep *irPtr = TclFetchIntRep(objv[1], &tclDoubleType);
|
||||
const Tcl_ObjInternalRep *irPtr = TclFetchInternalRep(objv[1], &tclDoubleType);
|
||||
|
||||
if (irPtr) {
|
||||
Tcl_SetObjResult(interp, objv[1]);
|
||||
@@ -7574,7 +7577,7 @@ ExprFloorFunc(
|
||||
code = Tcl_GetDoubleFromObj(interp, objv[1], &d);
|
||||
#ifdef ACCEPT_NAN
|
||||
if (code != TCL_OK) {
|
||||
const Tcl_ObjIntRep *irPtr = TclFetchIntRep(objv[1], &tclDoubleType);
|
||||
const Tcl_ObjInternalRep *irPtr = TclFetchInternalRep(objv[1], &tclDoubleType);
|
||||
|
||||
if (irPtr) {
|
||||
Tcl_SetObjResult(interp, objv[1]);
|
||||
@@ -7720,7 +7723,7 @@ ExprSqrtFunc(
|
||||
code = Tcl_GetDoubleFromObj(interp, objv[1], &d);
|
||||
#ifdef ACCEPT_NAN
|
||||
if (code != TCL_OK) {
|
||||
const Tcl_ObjIntRep *irPtr = TclFetchIntRep(objv[1], &tclDoubleType);
|
||||
const Tcl_ObjInternalRep *irPtr = TclFetchInternalRep(objv[1], &tclDoubleType);
|
||||
|
||||
if (irPtr) {
|
||||
Tcl_SetObjResult(interp, objv[1]);
|
||||
@@ -7774,7 +7777,7 @@ ExprUnaryFunc(
|
||||
code = Tcl_GetDoubleFromObj(interp, objv[1], &d);
|
||||
#ifdef ACCEPT_NAN
|
||||
if (code != TCL_OK) {
|
||||
const Tcl_ObjIntRep *irPtr = TclFetchIntRep(objv[1], &tclDoubleType);
|
||||
const Tcl_ObjInternalRep *irPtr = TclFetchInternalRep(objv[1], &tclDoubleType);
|
||||
|
||||
if (irPtr) {
|
||||
d = irPtr->doubleValue;
|
||||
@@ -7838,7 +7841,7 @@ ExprBinaryFunc(
|
||||
code = Tcl_GetDoubleFromObj(interp, objv[1], &d1);
|
||||
#ifdef ACCEPT_NAN
|
||||
if (code != TCL_OK) {
|
||||
const Tcl_ObjIntRep *irPtr = TclFetchIntRep(objv[1], &tclDoubleType);
|
||||
const Tcl_ObjInternalRep *irPtr = TclFetchInternalRep(objv[1], &tclDoubleType);
|
||||
|
||||
if (irPtr) {
|
||||
d1 = irPtr->doubleValue;
|
||||
@@ -7853,7 +7856,7 @@ ExprBinaryFunc(
|
||||
code = Tcl_GetDoubleFromObj(interp, objv[2], &d2);
|
||||
#ifdef ACCEPT_NAN
|
||||
if (code != TCL_OK) {
|
||||
const Tcl_ObjIntRep *irPtr = TclFetchIntRep(objv[1], &tclDoubleType);
|
||||
const Tcl_ObjInternalRep *irPtr = TclFetchInternalRep(objv[1], &tclDoubleType);
|
||||
|
||||
if (irPtr) {
|
||||
d2 = irPtr->doubleValue;
|
||||
@@ -8014,7 +8017,7 @@ ExprDoubleFunc(
|
||||
}
|
||||
if (Tcl_GetDoubleFromObj(interp, objv[1], &dResult) != TCL_OK) {
|
||||
#ifdef ACCEPT_NAN
|
||||
if (TclHasIntRep(objv[1], &tclDoubleType)) {
|
||||
if (TclHasInternalRep(objv[1], &tclDoubleType)) {
|
||||
Tcl_SetObjResult(interp, objv[1]);
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -9450,6 +9453,7 @@ TclNRYieldToObjCmd(
|
||||
|
||||
iPtr->execEnvPtr = corPtr->callerEEPtr;
|
||||
TclSetTailcall(interp, listPtr);
|
||||
corPtr->yieldPtr = listPtr;
|
||||
iPtr->execEnvPtr = corPtr->eePtr;
|
||||
|
||||
return TclNRYieldObjCmd(INT2PTR(CORO_ACTIVATE_YIELDM), interp, 1, objv);
|
||||
@@ -9647,6 +9651,22 @@ TclNRCoroutineActivateCallback(
|
||||
*/
|
||||
|
||||
if (corPtr->stackLevel != stackLevel) {
|
||||
NRE_callback *runPtr;
|
||||
|
||||
iPtr->execEnvPtr = corPtr->callerEEPtr;
|
||||
if (corPtr->yieldPtr) {
|
||||
for (runPtr = TOP_CB(interp); runPtr; runPtr = runPtr->nextPtr) {
|
||||
if (runPtr->data[1] == corPtr->yieldPtr) {
|
||||
runPtr->data[1] = NULL;
|
||||
Tcl_DecrRefCount(corPtr->yieldPtr);
|
||||
corPtr->yieldPtr = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
iPtr->execEnvPtr = corPtr->eePtr;
|
||||
|
||||
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"cannot yield: C stack busy", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "COROUTINE", "CANT_YIELD",
|
||||
@@ -9662,6 +9682,7 @@ TclNRCoroutineActivateCallback(
|
||||
Tcl_Panic("Yield received an option which is not implemented");
|
||||
}
|
||||
|
||||
corPtr->yieldPtr = NULL;
|
||||
corPtr->stackLevel = NULL;
|
||||
|
||||
numLevels = iPtr->numLevels;
|
||||
|
||||
+40
-43
@@ -226,7 +226,7 @@ static const EnsembleImplMap decodeMap[] = {
|
||||
* implies a side testing burden -- past mistakes will not let us avoid that
|
||||
* immediately, but it is at least a conventional test of type, and can be
|
||||
* implemented entirely by examining the objPtr fields, with no need to query
|
||||
* the intrep, as a canonical flag would require.
|
||||
* the internalrep, as a canonical flag would require.
|
||||
*
|
||||
* Until Tcl_GetByteArrayFromObj() and Tcl_SetByteArrayLength() can be revised
|
||||
* to admit the possibility of returning NULL when the true value is not a
|
||||
@@ -274,25 +274,22 @@ typedef struct ByteArray {
|
||||
* array. */
|
||||
unsigned int allocated; /* The amount of space actually allocated
|
||||
* minus 1 byte. */
|
||||
unsigned char bytes[TCLFLEXARRAY];
|
||||
/* The array of bytes. The actual size of this
|
||||
unsigned char bytes[TCLFLEXARRAY]; /* The array of bytes. The actual size of this
|
||||
* field depends on the 'allocated' field
|
||||
* above. */
|
||||
} ByteArray;
|
||||
|
||||
#define BYTEARRAY_SIZE(len) \
|
||||
(offsetof(ByteArray, bytes) + (len))
|
||||
(offsetof(ByteArray, bytes) + (len))
|
||||
#define GET_BYTEARRAY(irPtr) ((ByteArray *) (irPtr)->twoPtrValue.ptr1)
|
||||
#define SET_BYTEARRAY(irPtr, baPtr) \
|
||||
do { \
|
||||
(irPtr)->twoPtrValue.ptr1 = (void *) (baPtr); \
|
||||
} while (0)
|
||||
(irPtr)->twoPtrValue.ptr1 = (void *) (baPtr)
|
||||
|
||||
int
|
||||
TclIsPureByteArray(
|
||||
Tcl_Obj * objPtr)
|
||||
{
|
||||
return TclHasIntRep(objPtr, &properByteArrayType);
|
||||
return TclHasInternalRep(objPtr, &properByteArrayType);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -417,7 +414,7 @@ Tcl_SetByteArrayObj(
|
||||
* be >= 0. */
|
||||
{
|
||||
ByteArray *byteArrayPtr;
|
||||
Tcl_ObjIntRep ir;
|
||||
Tcl_ObjInternalRep ir;
|
||||
|
||||
if (Tcl_IsShared(objPtr)) {
|
||||
Tcl_Panic("%s called with shared object", "Tcl_SetByteArrayObj");
|
||||
@@ -437,7 +434,7 @@ Tcl_SetByteArrayObj(
|
||||
}
|
||||
SET_BYTEARRAY(&ir, byteArrayPtr);
|
||||
|
||||
Tcl_StoreIntRep(objPtr, &properByteArrayType, &ir);
|
||||
Tcl_StoreInternalRep(objPtr, &properByteArrayType, &ir);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -465,17 +462,17 @@ TclGetBytesFromObj(
|
||||
* array of bytes in the ByteArray object. */
|
||||
{
|
||||
ByteArray *baPtr;
|
||||
const Tcl_ObjIntRep *irPtr = TclFetchIntRep(objPtr, &properByteArrayType);
|
||||
const Tcl_ObjInternalRep *irPtr = TclFetchInternalRep(objPtr, &properByteArrayType);
|
||||
|
||||
if (irPtr == NULL) {
|
||||
SetByteArrayFromAny(NULL, objPtr);
|
||||
irPtr = TclFetchIntRep(objPtr, &properByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &properByteArrayType);
|
||||
if (irPtr == NULL) {
|
||||
if (interp) {
|
||||
const char *nonbyte;
|
||||
int ucs4;
|
||||
|
||||
irPtr = TclFetchIntRep(objPtr, &tclByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &tclByteArrayType);
|
||||
baPtr = GET_BYTEARRAY(irPtr);
|
||||
nonbyte = Tcl_UtfAtIndex(Tcl_GetString(objPtr), baPtr->bad);
|
||||
TclUtfToUCS4(nonbyte, &ucs4);
|
||||
@@ -522,14 +519,14 @@ Tcl_GetByteArrayFromObj(
|
||||
* array of bytes in the ByteArray object. */
|
||||
{
|
||||
ByteArray *baPtr;
|
||||
const Tcl_ObjIntRep *irPtr;
|
||||
const Tcl_ObjInternalRep *irPtr;
|
||||
unsigned char *result = TclGetBytesFromObj(NULL, objPtr, lengthPtr);
|
||||
|
||||
if (result) {
|
||||
return result;
|
||||
}
|
||||
|
||||
irPtr = TclFetchIntRep(objPtr, &tclByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &tclByteArrayType);
|
||||
assert(irPtr != NULL);
|
||||
|
||||
baPtr = GET_BYTEARRAY(irPtr);
|
||||
@@ -547,14 +544,14 @@ TclGetByteArrayFromObj(
|
||||
* array of bytes in the ByteArray object. */
|
||||
{
|
||||
ByteArray *baPtr;
|
||||
const Tcl_ObjIntRep *irPtr;
|
||||
const Tcl_ObjInternalRep *irPtr;
|
||||
unsigned char *result = TclGetBytesFromObj(NULL, objPtr, (int *)NULL);
|
||||
|
||||
if (result) {
|
||||
return result;
|
||||
}
|
||||
|
||||
irPtr = TclFetchIntRep(objPtr, &tclByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &tclByteArrayType);
|
||||
assert(irPtr != NULL);
|
||||
|
||||
baPtr = GET_BYTEARRAY(irPtr);
|
||||
@@ -598,7 +595,7 @@ Tcl_SetByteArrayLength(
|
||||
{
|
||||
ByteArray *byteArrayPtr;
|
||||
unsigned newLength;
|
||||
Tcl_ObjIntRep *irPtr;
|
||||
Tcl_ObjInternalRep *irPtr;
|
||||
|
||||
assert(length >= 0);
|
||||
newLength = (unsigned int)length;
|
||||
@@ -607,14 +604,14 @@ Tcl_SetByteArrayLength(
|
||||
Tcl_Panic("%s called with shared object", "Tcl_SetByteArrayLength");
|
||||
}
|
||||
|
||||
irPtr = TclFetchIntRep(objPtr, &properByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &properByteArrayType);
|
||||
if (irPtr == NULL) {
|
||||
irPtr = TclFetchIntRep(objPtr, &tclByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &tclByteArrayType);
|
||||
if (irPtr == NULL) {
|
||||
SetByteArrayFromAny(NULL, objPtr);
|
||||
irPtr = TclFetchIntRep(objPtr, &properByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &properByteArrayType);
|
||||
if (irPtr == NULL) {
|
||||
irPtr = TclFetchIntRep(objPtr, &tclByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &tclByteArrayType);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -658,12 +655,12 @@ SetByteArrayFromAny(
|
||||
unsigned char *dst;
|
||||
Tcl_UniChar ch = 0;
|
||||
ByteArray *byteArrayPtr;
|
||||
Tcl_ObjIntRep ir;
|
||||
Tcl_ObjInternalRep ir;
|
||||
|
||||
if (TclHasIntRep(objPtr, &properByteArrayType)) {
|
||||
if (TclHasInternalRep(objPtr, &properByteArrayType)) {
|
||||
return TCL_OK;
|
||||
}
|
||||
if (TclHasIntRep(objPtr, &tclByteArrayType)) {
|
||||
if (TclHasInternalRep(objPtr, &tclByteArrayType)) {
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -686,10 +683,10 @@ SetByteArrayFromAny(
|
||||
|
||||
if (bad == length) {
|
||||
byteArrayPtr->bad = byteArrayPtr->used;
|
||||
Tcl_StoreIntRep(objPtr, &properByteArrayType, &ir);
|
||||
Tcl_StoreInternalRep(objPtr, &properByteArrayType, &ir);
|
||||
} else {
|
||||
byteArrayPtr->bad = bad;
|
||||
Tcl_StoreIntRep(objPtr, &tclByteArrayType, &ir);
|
||||
Tcl_StoreInternalRep(objPtr, &tclByteArrayType, &ir);
|
||||
}
|
||||
|
||||
return TCL_OK;
|
||||
@@ -716,14 +713,14 @@ static void
|
||||
FreeByteArrayInternalRep(
|
||||
Tcl_Obj *objPtr) /* Object with internal rep to free. */
|
||||
{
|
||||
ckfree(GET_BYTEARRAY(TclFetchIntRep(objPtr, &tclByteArrayType)));
|
||||
ckfree(GET_BYTEARRAY(TclFetchInternalRep(objPtr, &tclByteArrayType)));
|
||||
}
|
||||
|
||||
static void
|
||||
FreeProperByteArrayInternalRep(
|
||||
Tcl_Obj *objPtr) /* Object with internal rep to free. */
|
||||
{
|
||||
ckfree(GET_BYTEARRAY(TclFetchIntRep(objPtr, &properByteArrayType)));
|
||||
ckfree(GET_BYTEARRAY(TclFetchInternalRep(objPtr, &properByteArrayType)));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -750,9 +747,9 @@ DupByteArrayInternalRep(
|
||||
{
|
||||
unsigned int length;
|
||||
ByteArray *srcArrayPtr, *copyArrayPtr;
|
||||
Tcl_ObjIntRep ir;
|
||||
Tcl_ObjInternalRep ir;
|
||||
|
||||
srcArrayPtr = GET_BYTEARRAY(TclFetchIntRep(srcPtr, &tclByteArrayType));
|
||||
srcArrayPtr = GET_BYTEARRAY(TclFetchInternalRep(srcPtr, &tclByteArrayType));
|
||||
length = srcArrayPtr->used;
|
||||
|
||||
copyArrayPtr = (ByteArray *)ckalloc(BYTEARRAY_SIZE(length));
|
||||
@@ -762,7 +759,7 @@ DupByteArrayInternalRep(
|
||||
memcpy(copyArrayPtr->bytes, srcArrayPtr->bytes, length);
|
||||
|
||||
SET_BYTEARRAY(&ir, copyArrayPtr);
|
||||
Tcl_StoreIntRep(copyPtr, &tclByteArrayType, &ir);
|
||||
Tcl_StoreInternalRep(copyPtr, &tclByteArrayType, &ir);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -772,9 +769,9 @@ DupProperByteArrayInternalRep(
|
||||
{
|
||||
unsigned int length;
|
||||
ByteArray *srcArrayPtr, *copyArrayPtr;
|
||||
Tcl_ObjIntRep ir;
|
||||
Tcl_ObjInternalRep ir;
|
||||
|
||||
srcArrayPtr = GET_BYTEARRAY(TclFetchIntRep(srcPtr, &properByteArrayType));
|
||||
srcArrayPtr = GET_BYTEARRAY(TclFetchInternalRep(srcPtr, &properByteArrayType));
|
||||
length = srcArrayPtr->used;
|
||||
|
||||
copyArrayPtr = (ByteArray *)ckalloc(BYTEARRAY_SIZE(length));
|
||||
@@ -784,7 +781,7 @@ DupProperByteArrayInternalRep(
|
||||
memcpy(copyArrayPtr->bytes, srcArrayPtr->bytes, length);
|
||||
|
||||
SET_BYTEARRAY(&ir, copyArrayPtr);
|
||||
Tcl_StoreIntRep(copyPtr, &properByteArrayType, &ir);
|
||||
Tcl_StoreInternalRep(copyPtr, &properByteArrayType, &ir);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -809,7 +806,7 @@ UpdateStringOfByteArray(
|
||||
Tcl_Obj *objPtr) /* ByteArray object whose string rep to
|
||||
* update. */
|
||||
{
|
||||
const Tcl_ObjIntRep *irPtr = TclFetchIntRep(objPtr, &properByteArrayType);
|
||||
const Tcl_ObjInternalRep *irPtr = TclFetchInternalRep(objPtr, &properByteArrayType);
|
||||
ByteArray *byteArrayPtr = GET_BYTEARRAY(irPtr);
|
||||
unsigned char *src = byteArrayPtr->bytes;
|
||||
unsigned int i, length = byteArrayPtr->used;
|
||||
@@ -870,7 +867,7 @@ TclAppendBytesToByteArray(
|
||||
{
|
||||
ByteArray *byteArrayPtr;
|
||||
unsigned int length, needed;
|
||||
Tcl_ObjIntRep *irPtr;
|
||||
Tcl_ObjInternalRep *irPtr;
|
||||
|
||||
if (Tcl_IsShared(objPtr)) {
|
||||
Tcl_Panic("%s called with shared object","TclAppendBytesToByteArray");
|
||||
@@ -889,14 +886,14 @@ TclAppendBytesToByteArray(
|
||||
|
||||
length = (unsigned int) len;
|
||||
|
||||
irPtr = TclFetchIntRep(objPtr, &properByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &properByteArrayType);
|
||||
if (irPtr == NULL) {
|
||||
irPtr = TclFetchIntRep(objPtr, &tclByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &tclByteArrayType);
|
||||
if (irPtr == NULL) {
|
||||
SetByteArrayFromAny(NULL, objPtr);
|
||||
irPtr = TclFetchIntRep(objPtr, &properByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &properByteArrayType);
|
||||
if (irPtr == NULL) {
|
||||
irPtr = TclFetchIntRep(objPtr, &tclByteArrayType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &tclByteArrayType);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2161,7 +2158,7 @@ FormatNumber(
|
||||
*/
|
||||
|
||||
if (Tcl_GetDoubleFromObj(interp, src, &dvalue) != TCL_OK) {
|
||||
const Tcl_ObjIntRep *irPtr = TclFetchIntRep(src, &tclDoubleType);
|
||||
const Tcl_ObjInternalRep *irPtr = TclFetchInternalRep(src, &tclDoubleType);
|
||||
if (irPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -2181,7 +2178,7 @@ FormatNumber(
|
||||
*/
|
||||
|
||||
if (Tcl_GetDoubleFromObj(interp, src, &dvalue) != TCL_OK) {
|
||||
const Tcl_ObjIntRep *irPtr = TclFetchIntRep(src, &tclDoubleType);
|
||||
const Tcl_ObjInternalRep *irPtr = TclFetchInternalRep(src, &tclDoubleType);
|
||||
|
||||
if (irPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
|
||||
@@ -381,7 +381,7 @@ Tcl_DumpActiveMemory(
|
||||
* Tcl_DbCkalloc - debugging ckalloc
|
||||
*
|
||||
* Allocate the requested amount of space plus some extra for guard bands
|
||||
* at both ends of the request, plus a size, panicing if there isn't
|
||||
* at both ends of the request, plus a size, panicking if there isn't
|
||||
* enough space, then write in the guard bands and return the address of
|
||||
* the space in the middle that the user asked for.
|
||||
*
|
||||
|
||||
+1
-1
@@ -452,7 +452,7 @@ ClockGetdatefieldsObjCmd(
|
||||
* that it isn't.
|
||||
*/
|
||||
|
||||
if (TclHasIntRep(objv[1], &tclBignumType)) {
|
||||
if (TclHasInternalRep(objv[1], &tclBignumType)) {
|
||||
Tcl_SetObjResult(interp, lit[LIT_INTEGER_VALUE_TOO_LARGE]);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -613,8 +613,6 @@ EncodingConverttoObjCmd(
|
||||
int length; /* Length of the string being converted */
|
||||
const char *stringPtr; /* Pointer to the first byte of the string */
|
||||
|
||||
/* TODO - ADJUST OBJ INDICES WHEN ENSEMBLIFYING THIS */
|
||||
|
||||
if (objc == 2) {
|
||||
encoding = Tcl_GetEncoding(interp, NULL);
|
||||
data = objv[1];
|
||||
|
||||
+7
-9
@@ -86,14 +86,12 @@ typedef struct {
|
||||
* following values.
|
||||
*/
|
||||
|
||||
enum {
|
||||
SORTMODE_ASCII = 0,
|
||||
SORTMODE_INTEGER = 1,
|
||||
SORTMODE_REAL = 2,
|
||||
SORTMODE_COMMAND = 3,
|
||||
SORTMODE_DICTIONARY = 4,
|
||||
SORTMODE_ASCII_NC = 8
|
||||
};
|
||||
#define SORTMODE_ASCII 0
|
||||
#define SORTMODE_INTEGER 1
|
||||
#define SORTMODE_REAL 2
|
||||
#define SORTMODE_COMMAND 3
|
||||
#define SORTMODE_DICTIONARY 4
|
||||
#define SORTMODE_ASCII_NC 8
|
||||
|
||||
/*
|
||||
* Forward declarations for procedures defined in this file:
|
||||
@@ -1243,7 +1241,7 @@ TclInfoFrame(
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Tcl_Obj *tmpObj;
|
||||
Tcl_Obj *lv[20]; /* Keep uptodate when more keys are added to
|
||||
Tcl_Obj *lv[20] = {NULL}; /* Keep uptodate when more keys are added to
|
||||
* the dict. */
|
||||
int lc = 0;
|
||||
/*
|
||||
|
||||
+25
-18
@@ -1533,16 +1533,16 @@ StringIsCmd(
|
||||
"boolean", "dict", "digit", "double",
|
||||
"entier", "false", "graph", "integer",
|
||||
"list", "lower", "print", "punct",
|
||||
"space", "true", "upper", "wideinteger",
|
||||
"wordchar", "xdigit", NULL
|
||||
"space", "true", "upper", "unicode",
|
||||
"wideinteger", "wordchar", "xdigit", NULL
|
||||
};
|
||||
enum isClassesEnum {
|
||||
STR_IS_ALNUM, STR_IS_ALPHA, STR_IS_ASCII, STR_IS_CONTROL,
|
||||
STR_IS_BOOL, STR_IS_DICT, STR_IS_DIGIT, STR_IS_DOUBLE,
|
||||
STR_IS_ENTIER, STR_IS_FALSE, STR_IS_GRAPH, STR_IS_INT,
|
||||
STR_IS_LIST, STR_IS_LOWER, STR_IS_PRINT, STR_IS_PUNCT,
|
||||
STR_IS_SPACE, STR_IS_TRUE, STR_IS_UPPER, STR_IS_WIDE,
|
||||
STR_IS_WORD, STR_IS_XDIGIT
|
||||
STR_IS_SPACE, STR_IS_TRUE, STR_IS_UPPER, STR_IS_UNICODE,
|
||||
STR_IS_WIDE, STR_IS_WORD, STR_IS_XDIGIT
|
||||
};
|
||||
static const char *const isOptions[] = {
|
||||
"-strict", "-failindex", NULL
|
||||
@@ -1611,7 +1611,7 @@ StringIsCmd(
|
||||
case STR_IS_BOOL:
|
||||
case STR_IS_TRUE:
|
||||
case STR_IS_FALSE:
|
||||
if (!TclHasIntRep(objPtr, &tclBooleanType)
|
||||
if (!TclHasInternalRep(objPtr, &tclBooleanType)
|
||||
&& (TCL_OK != TclSetBooleanFromAny(NULL, objPtr))) {
|
||||
if (strict) {
|
||||
result = 0;
|
||||
@@ -1681,9 +1681,9 @@ StringIsCmd(
|
||||
chcomp = Tcl_UniCharIsDigit;
|
||||
break;
|
||||
case STR_IS_DOUBLE: {
|
||||
if (TclHasIntRep(objPtr, &tclDoubleType) ||
|
||||
TclHasIntRep(objPtr, &tclIntType) ||
|
||||
TclHasIntRep(objPtr, &tclBignumType)) {
|
||||
if (TclHasInternalRep(objPtr, &tclDoubleType) ||
|
||||
TclHasInternalRep(objPtr, &tclIntType) ||
|
||||
TclHasInternalRep(objPtr, &tclBignumType)) {
|
||||
break;
|
||||
}
|
||||
string1 = TclGetStringFromObj(objPtr, &length1);
|
||||
@@ -1702,7 +1702,7 @@ StringIsCmd(
|
||||
failat = stop - string1;
|
||||
if (stop < end) {
|
||||
result = 0;
|
||||
TclFreeIntRep(objPtr);
|
||||
TclFreeInternalRep(objPtr);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1712,8 +1712,8 @@ StringIsCmd(
|
||||
break;
|
||||
case STR_IS_INT:
|
||||
case STR_IS_ENTIER:
|
||||
if (TclHasIntRep(objPtr, &tclIntType) ||
|
||||
TclHasIntRep(objPtr, &tclBignumType)) {
|
||||
if (TclHasInternalRep(objPtr, &tclIntType) ||
|
||||
TclHasInternalRep(objPtr, &tclBignumType)) {
|
||||
break;
|
||||
}
|
||||
string1 = TclGetStringFromObj(objPtr, &length1);
|
||||
@@ -1742,7 +1742,7 @@ StringIsCmd(
|
||||
|
||||
result = 0;
|
||||
failat = stop - string1;
|
||||
TclFreeIntRep(objPtr);
|
||||
TclFreeInternalRep(objPtr);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
@@ -1795,7 +1795,7 @@ StringIsCmd(
|
||||
*/
|
||||
|
||||
failat = stop - string1;
|
||||
TclFreeIntRep(objPtr);
|
||||
TclFreeInternalRep(objPtr);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
@@ -1872,6 +1872,9 @@ StringIsCmd(
|
||||
case STR_IS_UPPER:
|
||||
chcomp = Tcl_UniCharIsUpper;
|
||||
break;
|
||||
case STR_IS_UNICODE:
|
||||
chcomp = Tcl_UniCharIsUnicode;
|
||||
break;
|
||||
case STR_IS_WORD:
|
||||
chcomp = Tcl_UniCharIsWordChar;
|
||||
break;
|
||||
@@ -1987,7 +1990,7 @@ StringMapCmd(
|
||||
*/
|
||||
|
||||
if (!TclHasStringRep(objv[objc-2])
|
||||
&& TclHasIntRep(objv[objc-2], &tclDictType)) {
|
||||
&& TclHasInternalRep(objv[objc-2], &tclDictType)) {
|
||||
int i, done;
|
||||
Tcl_DictSearch search;
|
||||
|
||||
@@ -2832,6 +2835,7 @@ StringCatCmd(
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
#if TCL_MAJOR_VERSION < 9 && !defined(TCL_NO_DEPRECATED)
|
||||
static int
|
||||
StringBytesCmd(
|
||||
TCL_UNUSED(ClientData),
|
||||
@@ -2850,6 +2854,7 @@ StringBytesCmd(
|
||||
Tcl_SetObjResult(interp, Tcl_NewWideIntObj(length));
|
||||
return TCL_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
@@ -3306,7 +3311,9 @@ TclInitStringCmd(
|
||||
Tcl_Interp *interp) /* Current interpreter. */
|
||||
{
|
||||
static const EnsembleImplMap stringImplMap[] = {
|
||||
#if TCL_MAJOR_VERSION < 9 && !defined(TCL_NO_DEPRECATED)
|
||||
{"bytelength", StringBytesCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0},
|
||||
#endif
|
||||
{"cat", StringCatCmd, TclCompileStringCatCmd, NULL, NULL, 0},
|
||||
{"compare", StringCmpCmd, TclCompileStringCmpCmd, NULL, NULL, 0},
|
||||
{"equal", StringEqualCmd, TclCompileStringEqualCmd, NULL, NULL, 0},
|
||||
@@ -5113,15 +5120,15 @@ TryPostHandler(
|
||||
{
|
||||
Tcl_Obj *resultObj, *cmdObj, *options, *handlerKindObj, **objv;
|
||||
Tcl_Obj *finallyObj;
|
||||
int finally;
|
||||
int finallyIndex;
|
||||
|
||||
objv = (Tcl_Obj **)data[0];
|
||||
options = (Tcl_Obj *)data[1];
|
||||
handlerKindObj = (Tcl_Obj *)data[2];
|
||||
finally = PTR2INT(data[3]);
|
||||
finallyIndex = PTR2INT(data[3]);
|
||||
|
||||
cmdObj = objv[0];
|
||||
finallyObj = finally ? objv[finally] : 0;
|
||||
finallyObj = finallyIndex ? objv[finallyIndex] : 0;
|
||||
|
||||
/*
|
||||
* Check for limits/rewinding, which override normal trapping behaviour.
|
||||
@@ -5165,7 +5172,7 @@ TryPostHandler(
|
||||
|
||||
/* The 'finally' script is always the last argument word. */
|
||||
return TclNREvalObjEx(interp, finallyObj, 0, iPtr->cmdFramePtr,
|
||||
finally);
|
||||
finallyIndex);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+293
-294
File diff suppressed because it is too large
Load Diff
+210
-242
@@ -27,31 +27,6 @@ static void CompileReturnInternal(CompileEnv *envPtr,
|
||||
Tcl_Obj *returnOpts);
|
||||
static int IndexTailVarIfKnown(Tcl_Interp *interp,
|
||||
Tcl_Token *varTokenPtr, CompileEnv *envPtr);
|
||||
|
||||
/*
|
||||
* Shorthand macros for instruction issuing.
|
||||
*/
|
||||
|
||||
#define OP(name) TclEmitOpcode(INST_##name, envPtr)
|
||||
#define OP1(name,val) TclEmitInstInt1(INST_##name,(val),envPtr)
|
||||
#define OP4(name,val) TclEmitInstInt4(INST_##name,(val),envPtr)
|
||||
#define OP11(name,val1,val2) TclEmitInstInt11(INST_##name,(val1),(val2),envPtr)
|
||||
#define OP14(name,val1,val2) TclEmitInstInt14(INST_##name,(val1),(val2),envPtr)
|
||||
#define OP44(name,val1,val2) TclEmitInstInt44(INST_##name,(val1),(val2),envPtr)
|
||||
#define PUSH(str) PushStringLiteral(envPtr, str)
|
||||
#define JUMP4(name,var) \
|
||||
(var) = CurrentOffset(envPtr);TclEmitInstInt4(INST_##name##4,0,envPtr)
|
||||
#define FIXJUMP4(var) \
|
||||
TclStoreInt4AtPtr(CurrentOffset(envPtr)-(var),envPtr->codeStart+(var)+1)
|
||||
#define JUMP1(name,var) \
|
||||
(var) = CurrentOffset(envPtr);TclEmitInstInt1(INST_##name##1,0,envPtr)
|
||||
#define FIXJUMP1(var) \
|
||||
TclStoreInt1AtPtr(CurrentOffset(envPtr)-(var),envPtr->codeStart+(var)+1)
|
||||
#define LOAD(idx) \
|
||||
if ((idx)<256) {OP1(LOAD_SCALAR1,(idx));} else {OP4(LOAD_SCALAR4,(idx));}
|
||||
#define STORE(idx) \
|
||||
if ((idx)<256) {OP1(STORE_SCALAR1,(idx));} else {OP4(STORE_SCALAR4,(idx));}
|
||||
#define INVOKE(name) TclEmitInvoke(envPtr,INST_##name)
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
@@ -137,7 +112,7 @@ TclCompileGlobalCmd(
|
||||
* Push the namespace
|
||||
*/
|
||||
|
||||
PUSH( "::");
|
||||
PushStringLiteral(envPtr, "::");
|
||||
|
||||
/*
|
||||
* Loop over the variables.
|
||||
@@ -158,15 +133,15 @@ TclCompileGlobalCmd(
|
||||
*/
|
||||
|
||||
CompileWord(envPtr, varTokenPtr, interp, i);
|
||||
OP4( NSUPVAR, localIndex);
|
||||
TclEmitInstInt4( INST_NSUPVAR, localIndex, envPtr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Pop the namespace, and set the result to empty
|
||||
*/
|
||||
|
||||
OP( POP);
|
||||
PUSH( "");
|
||||
TclEmitOpcode( INST_POP, envPtr);
|
||||
PushStringLiteral(envPtr, "");
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -188,30 +163,6 @@ TclCompileGlobalCmd(
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static inline int
|
||||
IsElseToken(
|
||||
const Tcl_Token *tokenPtr)
|
||||
{
|
||||
return (tokenPtr->size == 4) &&
|
||||
(strncmp(tokenPtr->start, "else", 4) == 0);
|
||||
}
|
||||
|
||||
static inline int
|
||||
IsElseifToken(
|
||||
const Tcl_Token *tokenPtr)
|
||||
{
|
||||
return (tokenPtr->size == 6) &&
|
||||
(strncmp(tokenPtr->start, "elseif", 6) == 0);
|
||||
}
|
||||
|
||||
static inline int
|
||||
IsThenToken(
|
||||
const Tcl_Token *tokenPtr)
|
||||
{
|
||||
return (tokenPtr->size == 4) &&
|
||||
(strncmp(tokenPtr->start, "then", 4) == 0);
|
||||
}
|
||||
|
||||
int
|
||||
TclCompileIfCmd(
|
||||
Tcl_Interp *interp, /* Used for error reporting. */
|
||||
@@ -230,7 +181,8 @@ TclCompileIfCmd(
|
||||
* determined. */
|
||||
Tcl_Token *tokenPtr, *testTokenPtr;
|
||||
int jumpIndex = 0; /* Avoid compiler warning. */
|
||||
int jumpFalseDist, numWords, wordIdx, j, code;
|
||||
int jumpFalseDist, numWords, wordIdx, numBytes, j, code;
|
||||
const char *word;
|
||||
int realCond = 1; /* Set to 0 for static conditions:
|
||||
* "if 0 {..}" */
|
||||
int boolVal; /* Value of static condition. */
|
||||
@@ -268,7 +220,10 @@ TclCompileIfCmd(
|
||||
* Stop looping if the token isn't "if" or "elseif".
|
||||
*/
|
||||
|
||||
if ((tokenPtr == parsePtr->tokenPtr) || IsElseifToken(&tokenPtr[1])) {
|
||||
word = tokenPtr[1].start;
|
||||
numBytes = tokenPtr[1].size;
|
||||
if ((tokenPtr == parsePtr->tokenPtr)
|
||||
|| ((numBytes == 6) && (strncmp(word, "elseif", 6) == 0))) {
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
wordIdx++;
|
||||
} else {
|
||||
@@ -331,12 +286,16 @@ TclCompileIfCmd(
|
||||
code = TCL_ERROR;
|
||||
goto done;
|
||||
}
|
||||
if (IsThenToken(&tokenPtr[1])) {
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
wordIdx++;
|
||||
if (wordIdx >= numWords) {
|
||||
code = TCL_ERROR;
|
||||
goto done;
|
||||
if (tokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
|
||||
word = tokenPtr[1].start;
|
||||
numBytes = tokenPtr[1].size;
|
||||
if ((numBytes == 4) && (strncmp(word, "then", 4) == 0)) {
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
wordIdx++;
|
||||
if (wordIdx >= numWords) {
|
||||
code = TCL_ERROR;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -404,12 +363,14 @@ TclCompileIfCmd(
|
||||
* an "if 1 {...}" case.
|
||||
*/
|
||||
|
||||
if (wordIdx < numWords) {
|
||||
if ((wordIdx < numWords) && (tokenPtr->type == TCL_TOKEN_SIMPLE_WORD)) {
|
||||
/*
|
||||
* There is an else clause. Skip over the optional "else" word.
|
||||
*/
|
||||
|
||||
if (IsElseToken(&tokenPtr[1])) {
|
||||
word = tokenPtr[1].start;
|
||||
numBytes = tokenPtr[1].size;
|
||||
if ((numBytes == 4) && (strncmp(word, "else", 4) == 0)) {
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
wordIdx++;
|
||||
if (wordIdx >= numWords) {
|
||||
@@ -441,7 +402,7 @@ TclCompileIfCmd(
|
||||
*/
|
||||
|
||||
if (compileScripts) {
|
||||
PUSH("");
|
||||
PushStringLiteral(envPtr, "");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -564,29 +525,31 @@ TclCompileIncrCmd(
|
||||
if (isScalar) { /* Simple scalar variable. */
|
||||
if (localIndex >= 0) {
|
||||
if (haveImmValue) {
|
||||
OP11( INCR_SCALAR1_IMM, localIndex, immValue);
|
||||
TclEmitInstInt1(INST_INCR_SCALAR1_IMM, localIndex, envPtr);
|
||||
TclEmitInt1(immValue, envPtr);
|
||||
} else {
|
||||
OP1( INCR_SCALAR1, localIndex);
|
||||
TclEmitInstInt1(INST_INCR_SCALAR1, localIndex, envPtr);
|
||||
}
|
||||
} else {
|
||||
if (haveImmValue) {
|
||||
OP1( INCR_STK_IMM, immValue);
|
||||
TclEmitInstInt1(INST_INCR_STK_IMM, immValue, envPtr);
|
||||
} else {
|
||||
OP( INCR_STK);
|
||||
TclEmitOpcode( INST_INCR_STK, envPtr);
|
||||
}
|
||||
}
|
||||
} else { /* Simple array variable. */
|
||||
if (localIndex >= 0) {
|
||||
if (haveImmValue) {
|
||||
OP11( INCR_ARRAY1_IMM, localIndex, immValue);
|
||||
TclEmitInstInt1(INST_INCR_ARRAY1_IMM, localIndex, envPtr);
|
||||
TclEmitInt1(immValue, envPtr);
|
||||
} else {
|
||||
OP1( INCR_ARRAY1, localIndex);
|
||||
TclEmitInstInt1(INST_INCR_ARRAY1, localIndex, envPtr);
|
||||
}
|
||||
} else {
|
||||
if (haveImmValue) {
|
||||
OP1( INCR_ARRAY_STK_IMM, immValue);
|
||||
TclEmitInstInt1(INST_INCR_ARRAY_STK_IMM, immValue, envPtr);
|
||||
} else {
|
||||
OP( INCR_ARRAY_STK);
|
||||
TclEmitOpcode( INST_INCR_ARRAY_STK, envPtr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -661,11 +624,11 @@ TclCompileInfoCommandsCmd(
|
||||
|
||||
/* TODO: Just push the known value */
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
OP( RESOLVE_COMMAND);
|
||||
OP( DUP);
|
||||
OP( STR_LEN);
|
||||
OP1( JUMP_FALSE1, 7);
|
||||
OP4( LIST, 1);
|
||||
TclEmitOpcode( INST_RESOLVE_COMMAND, envPtr);
|
||||
TclEmitOpcode( INST_DUP, envPtr);
|
||||
TclEmitOpcode( INST_STR_LEN, envPtr);
|
||||
TclEmitInstInt1( INST_JUMP_FALSE1, 7, envPtr);
|
||||
TclEmitInstInt4( INST_LIST, 1, envPtr);
|
||||
return TCL_OK;
|
||||
|
||||
notCompilable:
|
||||
@@ -693,7 +656,7 @@ TclCompileInfoCoroutineCmd(
|
||||
* Not much to do; we compile to a single instruction...
|
||||
*/
|
||||
|
||||
OP( COROUTINE_NAME);
|
||||
TclEmitOpcode( INST_COROUTINE_NAME, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -730,15 +693,15 @@ TclCompileInfoExistsCmd(
|
||||
|
||||
if (isScalar) {
|
||||
if (localIndex < 0) {
|
||||
OP( EXIST_STK);
|
||||
TclEmitOpcode( INST_EXIST_STK, envPtr);
|
||||
} else {
|
||||
OP4( EXIST_SCALAR, localIndex);
|
||||
TclEmitInstInt4( INST_EXIST_SCALAR, localIndex, envPtr);
|
||||
}
|
||||
} else {
|
||||
if (localIndex < 0) {
|
||||
OP( EXIST_ARRAY_STK);
|
||||
TclEmitOpcode( INST_EXIST_ARRAY_STK, envPtr);
|
||||
} else {
|
||||
OP4( EXIST_ARRAY, localIndex);
|
||||
TclEmitInstInt4( INST_EXIST_ARRAY, localIndex, envPtr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -762,7 +725,7 @@ TclCompileInfoLevelCmd(
|
||||
* Not much to do; we compile to a single instruction...
|
||||
*/
|
||||
|
||||
OP( INFO_LEVEL_NUM);
|
||||
TclEmitOpcode( INST_INFO_LEVEL_NUM, envPtr);
|
||||
} else if (parsePtr->numWords != 2) {
|
||||
return TCL_ERROR;
|
||||
} else {
|
||||
@@ -774,7 +737,7 @@ TclCompileInfoLevelCmd(
|
||||
*/
|
||||
|
||||
CompileWord(envPtr, TokenAfter(parsePtr->tokenPtr), interp, 1);
|
||||
OP( INFO_LEVEL_ARGS);
|
||||
TclEmitOpcode( INST_INFO_LEVEL_ARGS, envPtr);
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -794,7 +757,7 @@ TclCompileInfoObjectClassCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
OP( TCLOO_CLASS);
|
||||
TclEmitOpcode( INST_TCLOO_CLASS, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -829,7 +792,7 @@ TclCompileInfoObjectIsACmd(
|
||||
*/
|
||||
|
||||
CompileWord(envPtr, tokenPtr, interp, 2);
|
||||
OP( TCLOO_IS_OBJECT);
|
||||
TclEmitOpcode( INST_TCLOO_IS_OBJECT, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -848,7 +811,7 @@ TclCompileInfoObjectNamespaceCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
OP( TCLOO_NS);
|
||||
TclEmitOpcode( INST_TCLOO_NS, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -927,15 +890,15 @@ TclCompileLappendCmd(
|
||||
|
||||
if (isScalar) {
|
||||
if (localIndex < 0) {
|
||||
OP( LAPPEND_STK);
|
||||
TclEmitOpcode( INST_LAPPEND_STK, envPtr);
|
||||
} else {
|
||||
Emit14Inst( INST_LAPPEND_SCALAR, localIndex, envPtr);
|
||||
Emit14Inst( INST_LAPPEND_SCALAR, localIndex, envPtr);
|
||||
}
|
||||
} else {
|
||||
if (localIndex < 0) {
|
||||
OP( LAPPEND_ARRAY_STK);
|
||||
TclEmitOpcode( INST_LAPPEND_ARRAY_STK, envPtr);
|
||||
} else {
|
||||
Emit14Inst( INST_LAPPEND_ARRAY, localIndex, envPtr);
|
||||
Emit14Inst( INST_LAPPEND_ARRAY, localIndex, envPtr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -950,18 +913,18 @@ TclCompileLappendCmd(
|
||||
CompileWord(envPtr, valueTokenPtr, interp, i);
|
||||
valueTokenPtr = TokenAfter(valueTokenPtr);
|
||||
}
|
||||
OP4( LIST, numWords - 2);
|
||||
TclEmitInstInt4( INST_LIST, numWords - 2, envPtr);
|
||||
if (isScalar) {
|
||||
if (localIndex < 0) {
|
||||
OP( LAPPEND_LIST_STK);
|
||||
TclEmitOpcode( INST_LAPPEND_LIST_STK, envPtr);
|
||||
} else {
|
||||
OP4( LAPPEND_LIST, localIndex);
|
||||
TclEmitInstInt4(INST_LAPPEND_LIST, localIndex, envPtr);
|
||||
}
|
||||
} else {
|
||||
if (localIndex < 0) {
|
||||
OP( LAPPEND_LIST_ARRAY_STK);
|
||||
TclEmitOpcode( INST_LAPPEND_LIST_ARRAY_STK, envPtr);
|
||||
} else {
|
||||
OP4( LAPPEND_LIST_ARRAY, localIndex);
|
||||
TclEmitInstInt4(INST_LAPPEND_LIST_ARRAY, localIndex,envPtr);
|
||||
}
|
||||
}
|
||||
return TCL_OK;
|
||||
@@ -1035,27 +998,27 @@ TclCompileLassignCmd(
|
||||
|
||||
if (isScalar) {
|
||||
if (localIndex >= 0) {
|
||||
OP( DUP);
|
||||
OP4( LIST_INDEX_IMM, idx);
|
||||
TclEmitOpcode( INST_DUP, envPtr);
|
||||
TclEmitInstInt4(INST_LIST_INDEX_IMM, idx, envPtr);
|
||||
Emit14Inst( INST_STORE_SCALAR, localIndex, envPtr);
|
||||
OP( POP);
|
||||
TclEmitOpcode( INST_POP, envPtr);
|
||||
} else {
|
||||
OP4( OVER, 1);
|
||||
OP4( LIST_INDEX_IMM, idx);
|
||||
OP( STORE_STK);
|
||||
OP( POP);
|
||||
TclEmitInstInt4(INST_OVER, 1, envPtr);
|
||||
TclEmitInstInt4(INST_LIST_INDEX_IMM, idx, envPtr);
|
||||
TclEmitOpcode( INST_STORE_STK, envPtr);
|
||||
TclEmitOpcode( INST_POP, envPtr);
|
||||
}
|
||||
} else {
|
||||
if (localIndex >= 0) {
|
||||
OP4( OVER, 1);
|
||||
OP4( LIST_INDEX_IMM, idx);
|
||||
TclEmitInstInt4(INST_OVER, 1, envPtr);
|
||||
TclEmitInstInt4(INST_LIST_INDEX_IMM, idx, envPtr);
|
||||
Emit14Inst( INST_STORE_ARRAY, localIndex, envPtr);
|
||||
OP( POP);
|
||||
TclEmitOpcode( INST_POP, envPtr);
|
||||
} else {
|
||||
OP4( OVER, 2);
|
||||
OP4( LIST_INDEX_IMM, idx);
|
||||
OP( STORE_ARRAY_STK);
|
||||
OP( POP);
|
||||
TclEmitInstInt4(INST_OVER, 2, envPtr);
|
||||
TclEmitInstInt4(INST_LIST_INDEX_IMM, idx, envPtr);
|
||||
TclEmitOpcode( INST_STORE_ARRAY_STK, envPtr);
|
||||
TclEmitOpcode( INST_POP, envPtr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1064,7 +1027,8 @@ TclCompileLassignCmd(
|
||||
* Generate code to leave the rest of the list on the stack.
|
||||
*/
|
||||
|
||||
OP44( LIST_RANGE_IMM, idx, (int) TCL_INDEX_END);
|
||||
TclEmitInstInt4( INST_LIST_RANGE_IMM, idx, envPtr);
|
||||
TclEmitInt4( (int)TCL_INDEX_END, envPtr);
|
||||
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -1125,7 +1089,7 @@ TclCompileLindexCmd(
|
||||
*/
|
||||
|
||||
CompileWord(envPtr, valTokenPtr, interp, 1);
|
||||
OP4( LIST_INDEX_IMM, idx);
|
||||
TclEmitInstInt4( INST_LIST_INDEX_IMM, idx, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -1151,9 +1115,9 @@ TclCompileLindexCmd(
|
||||
*/
|
||||
|
||||
if (numWords == 3) {
|
||||
OP( LIST_INDEX);
|
||||
TclEmitOpcode( INST_LIST_INDEX, envPtr);
|
||||
} else {
|
||||
OP4( LIST_INDEX_MULTI, numWords - 1);
|
||||
TclEmitInstInt4( INST_LIST_INDEX_MULTI, numWords-1, envPtr);
|
||||
}
|
||||
|
||||
return TCL_OK;
|
||||
@@ -1195,7 +1159,7 @@ TclCompileListCmd(
|
||||
* [list] without arguments just pushes an empty object.
|
||||
*/
|
||||
|
||||
PUSH("");
|
||||
PushStringLiteral(envPtr, "");
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -1232,9 +1196,9 @@ TclCompileListCmd(
|
||||
concat = build = 0;
|
||||
for (i = 1; i < numWords; i++) {
|
||||
if (valueTokenPtr->type == TCL_TOKEN_EXPAND_WORD && build > 0) {
|
||||
OP4( LIST, build);
|
||||
TclEmitInstInt4( INST_LIST, build, envPtr);
|
||||
if (concat) {
|
||||
OP( LIST_CONCAT);
|
||||
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
|
||||
}
|
||||
build = 0;
|
||||
concat = 1;
|
||||
@@ -1242,7 +1206,7 @@ TclCompileListCmd(
|
||||
CompileWord(envPtr, valueTokenPtr, interp, i);
|
||||
if (valueTokenPtr->type == TCL_TOKEN_EXPAND_WORD) {
|
||||
if (concat) {
|
||||
OP( LIST_CONCAT);
|
||||
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
|
||||
} else {
|
||||
concat = 1;
|
||||
}
|
||||
@@ -1252,9 +1216,9 @@ TclCompileListCmd(
|
||||
valueTokenPtr = TokenAfter(valueTokenPtr);
|
||||
}
|
||||
if (build > 0) {
|
||||
OP4( LIST, build);
|
||||
TclEmitInstInt4( INST_LIST, build, envPtr);
|
||||
if (concat) {
|
||||
OP( LIST_CONCAT);
|
||||
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1266,7 +1230,8 @@ TclCompileListCmd(
|
||||
*/
|
||||
|
||||
if (concat && numWords == 2) {
|
||||
OP44( LIST_RANGE_IMM, 0, (int) TCL_INDEX_END);
|
||||
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
|
||||
TclEmitInt4( (int)TCL_INDEX_END, envPtr);
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -1306,7 +1271,7 @@ TclCompileLlengthCmd(
|
||||
varTokenPtr = TokenAfter(parsePtr->tokenPtr);
|
||||
|
||||
CompileWord(envPtr, varTokenPtr, interp, 1);
|
||||
OP( LIST_LENGTH);
|
||||
TclEmitOpcode( INST_LIST_LENGTH, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -1344,8 +1309,8 @@ TclCompileLrangeCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
/*
|
||||
* Token was an index value, and we treat all "first" indices before the
|
||||
* list same as the start of the list.
|
||||
* Token was an index value, and we treat all "first" indices
|
||||
* before the list same as the start of the list.
|
||||
*/
|
||||
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
@@ -1353,10 +1318,9 @@ TclCompileLrangeCmd(
|
||||
&idx2) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Token was an index value, and we treat all "last" indices after the
|
||||
* list same as the end of the list.
|
||||
* Token was an index value, and we treat all "last" indices
|
||||
* after the list same as the end of the list.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -1366,7 +1330,8 @@ TclCompileLrangeCmd(
|
||||
*/
|
||||
|
||||
CompileWord(envPtr, listTokenPtr, interp, 1);
|
||||
OP44( LIST_RANGE_IMM, idx1, idx2);
|
||||
TclEmitInstInt4( INST_LIST_RANGE_IMM, idx1, envPtr);
|
||||
TclEmitInt4( idx2, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -1407,11 +1372,11 @@ TclCompileLinsertCmd(
|
||||
tokenPtr = TokenAfter(listTokenPtr);
|
||||
|
||||
/*
|
||||
* NOTE: This command treats all inserts at indices before the list the
|
||||
* same as inserts at the start of the list, and all inserts after the
|
||||
* list the same as inserts at the end of the list. We make that
|
||||
* transformation here so we can use the optimized bytecode as much as
|
||||
* possible.
|
||||
* NOTE: This command treats all inserts at indices before the list
|
||||
* the same as inserts at the start of the list, and all inserts
|
||||
* after the list the same as inserts at the end of the list. We
|
||||
* make that transformation here so we can use the optimized bytecode
|
||||
* as much as possible.
|
||||
*/
|
||||
if (TclGetIndexFromToken(tokenPtr, TCL_INDEX_START, TCL_INDEX_END,
|
||||
&idx) != TCL_OK) {
|
||||
@@ -1427,7 +1392,8 @@ TclCompileLinsertCmd(
|
||||
|
||||
CompileWord(envPtr, listTokenPtr, interp, 1);
|
||||
if (parsePtr->numWords == 3) {
|
||||
OP44( LIST_RANGE_IMM, 0, (int) TCL_INDEX_END);
|
||||
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
|
||||
TclEmitInt4( (int)TCL_INDEX_END, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -1435,13 +1401,13 @@ TclCompileLinsertCmd(
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, i);
|
||||
}
|
||||
OP4( LIST, i - 3);
|
||||
TclEmitInstInt4( INST_LIST, i - 3, envPtr);
|
||||
|
||||
if (idx == (int) TCL_INDEX_START) {
|
||||
OP4( REVERSE, 2);
|
||||
OP( LIST_CONCAT);
|
||||
} else if (idx == (int) TCL_INDEX_END) {
|
||||
OP( LIST_CONCAT);
|
||||
if (idx == (int)TCL_INDEX_START) {
|
||||
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
|
||||
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
|
||||
} else if (idx == (int)TCL_INDEX_END) {
|
||||
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
|
||||
} else {
|
||||
/*
|
||||
* Here we handle two ranges for idx. First when idx > 0, we
|
||||
@@ -1458,12 +1424,14 @@ TclCompileLinsertCmd(
|
||||
if (idx < (int)TCL_INDEX_END) {
|
||||
idx++;
|
||||
}
|
||||
OP4( OVER, 1);
|
||||
OP44( LIST_RANGE_IMM, 0, idx - 1);
|
||||
OP4( REVERSE, 3);
|
||||
OP44( LIST_RANGE_IMM, idx, (int) TCL_INDEX_END);
|
||||
OP( LIST_CONCAT);
|
||||
OP( LIST_CONCAT);
|
||||
TclEmitInstInt4( INST_OVER, 1, envPtr);
|
||||
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
|
||||
TclEmitInt4( idx - 1, envPtr);
|
||||
TclEmitInstInt4( INST_REVERSE, 3, envPtr);
|
||||
TclEmitInstInt4( INST_LIST_RANGE_IMM, idx, envPtr);
|
||||
TclEmitInt4( (int)TCL_INDEX_END, envPtr);
|
||||
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
|
||||
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
|
||||
}
|
||||
|
||||
return TCL_OK;
|
||||
@@ -1534,17 +1502,13 @@ TclCompileLreplaceCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* All paths start with computing/pushing the original value.
|
||||
*/
|
||||
|
||||
/* All paths start with computing/pushing the original value. */
|
||||
CompileWord(envPtr, listTokenPtr, interp, 1);
|
||||
|
||||
/*
|
||||
* Push all the replacement values next so any errors raised in creating
|
||||
* them get raised first.
|
||||
* Push all the replacement values next so any errors raised in
|
||||
* creating them get raised first.
|
||||
*/
|
||||
|
||||
if (parsePtr->numWords > 4) {
|
||||
/* Push the replacement arguments */
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
@@ -1554,7 +1518,7 @@ TclCompileLreplaceCmd(
|
||||
}
|
||||
|
||||
/* Make a list of them... */
|
||||
OP4( LIST, i - 4);
|
||||
TclEmitInstInt4( INST_LIST, i - 4, envPtr);
|
||||
|
||||
emptyPrefix = 0;
|
||||
}
|
||||
@@ -1562,42 +1526,45 @@ TclCompileLreplaceCmd(
|
||||
if ((idx1 == suffixStart) && (parsePtr->numWords == 4)) {
|
||||
/*
|
||||
* This is a "no-op". Example: [lreplace {a b c} 2 0]
|
||||
* We still do a list operation to get list-verification and
|
||||
* canonicalization side effects.
|
||||
* We still do a list operation to get list-verification
|
||||
* and canonicalization side effects.
|
||||
*/
|
||||
OP44( LIST_RANGE_IMM, 0, (int) TCL_INDEX_END);
|
||||
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
|
||||
TclEmitInt4( (int)TCL_INDEX_END, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
if (idx1 != (int) TCL_INDEX_START) {
|
||||
if (idx1 != (int)TCL_INDEX_START) {
|
||||
/* Prefix may not be empty; generate bytecode to push it */
|
||||
if (emptyPrefix) {
|
||||
OP( DUP);
|
||||
TclEmitOpcode( INST_DUP, envPtr);
|
||||
} else {
|
||||
OP4( OVER, 1);
|
||||
TclEmitInstInt4( INST_OVER, 1, envPtr);
|
||||
}
|
||||
OP44( LIST_RANGE_IMM, 0, idx1 - 1);
|
||||
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
|
||||
TclEmitInt4( idx1 - 1, envPtr);
|
||||
if (!emptyPrefix) {
|
||||
OP4( REVERSE, 2);
|
||||
OP( LIST_CONCAT);
|
||||
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
|
||||
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
|
||||
}
|
||||
emptyPrefix = 0;
|
||||
}
|
||||
|
||||
if (!emptyPrefix) {
|
||||
OP4( REVERSE, 2);
|
||||
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
|
||||
}
|
||||
|
||||
if (suffixStart == (int) TCL_INDEX_NONE) {
|
||||
OP( POP);
|
||||
if (suffixStart == (int)TCL_INDEX_NONE) {
|
||||
TclEmitOpcode( INST_POP, envPtr);
|
||||
if (emptyPrefix) {
|
||||
PUSH( "");
|
||||
PushStringLiteral(envPtr, "");
|
||||
}
|
||||
} else {
|
||||
/* Suffix may not be empty; generate bytecode to push it */
|
||||
OP44( LIST_RANGE_IMM, suffixStart, (int) TCL_INDEX_END);
|
||||
TclEmitInstInt4( INST_LIST_RANGE_IMM, suffixStart, envPtr);
|
||||
TclEmitInt4( (int)TCL_INDEX_END, envPtr);
|
||||
if (!emptyPrefix) {
|
||||
OP( LIST_CONCAT);
|
||||
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1705,7 +1672,7 @@ TclCompileLsetCmd(
|
||||
} else {
|
||||
tempDepth = parsePtr->numWords - 1;
|
||||
}
|
||||
OP4( OVER, tempDepth);
|
||||
TclEmitInstInt4( INST_OVER, tempDepth, envPtr);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1718,7 +1685,7 @@ TclCompileLsetCmd(
|
||||
} else {
|
||||
tempDepth = parsePtr->numWords - 2;
|
||||
}
|
||||
OP4( OVER, tempDepth);
|
||||
TclEmitInstInt4( INST_OVER, tempDepth, envPtr);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1727,13 +1694,13 @@ TclCompileLsetCmd(
|
||||
|
||||
if (isScalar) {
|
||||
if (localIndex < 0) {
|
||||
OP( LOAD_STK);
|
||||
TclEmitOpcode( INST_LOAD_STK, envPtr);
|
||||
} else {
|
||||
LOAD( localIndex);
|
||||
Emit14Inst( INST_LOAD_SCALAR, localIndex, envPtr);
|
||||
}
|
||||
} else {
|
||||
if (localIndex < 0) {
|
||||
OP( LOAD_ARRAY_STK);
|
||||
TclEmitOpcode( INST_LOAD_ARRAY_STK, envPtr);
|
||||
} else {
|
||||
Emit14Inst( INST_LOAD_ARRAY, localIndex, envPtr);
|
||||
}
|
||||
@@ -1744,9 +1711,9 @@ TclCompileLsetCmd(
|
||||
*/
|
||||
|
||||
if (parsePtr->numWords == 4) {
|
||||
OP( LSET_LIST);
|
||||
TclEmitOpcode( INST_LSET_LIST, envPtr);
|
||||
} else {
|
||||
OP4( LSET_FLAT, parsePtr->numWords - 1);
|
||||
TclEmitInstInt4( INST_LSET_FLAT, parsePtr->numWords-1, envPtr);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1755,13 +1722,13 @@ TclCompileLsetCmd(
|
||||
|
||||
if (isScalar) {
|
||||
if (localIndex < 0) {
|
||||
OP( STORE_STK);
|
||||
TclEmitOpcode( INST_STORE_STK, envPtr);
|
||||
} else {
|
||||
STORE( localIndex);
|
||||
Emit14Inst( INST_STORE_SCALAR, localIndex, envPtr);
|
||||
}
|
||||
} else {
|
||||
if (localIndex < 0) {
|
||||
OP( STORE_ARRAY_STK);
|
||||
TclEmitOpcode( INST_STORE_ARRAY_STK, envPtr);
|
||||
} else {
|
||||
Emit14Inst( INST_STORE_ARRAY, localIndex, envPtr);
|
||||
}
|
||||
@@ -1810,7 +1777,7 @@ TclCompileNamespaceCurrentCmd(
|
||||
* Not much to do; we compile to a single instruction...
|
||||
*/
|
||||
|
||||
OP(NS_CURRENT);
|
||||
TclEmitOpcode( INST_NS_CURRENT, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -1855,11 +1822,11 @@ TclCompileNamespaceCodeCmd(
|
||||
* the value needs to be determined at runtime for safety.
|
||||
*/
|
||||
|
||||
PUSH( "::namespace");
|
||||
PUSH( "inscope");
|
||||
OP( NS_CURRENT);
|
||||
PushStringLiteral(envPtr, "::namespace");
|
||||
PushStringLiteral(envPtr, "inscope");
|
||||
TclEmitOpcode( INST_NS_CURRENT, envPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
OP4( LIST, 4);
|
||||
TclEmitInstInt4( INST_LIST, 4, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -1880,7 +1847,7 @@ TclCompileNamespaceOriginCmd(
|
||||
tokenPtr = TokenAfter(parsePtr->tokenPtr);
|
||||
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
OP(ORIGIN_COMMAND);
|
||||
TclEmitOpcode( INST_ORIGIN_COMMAND, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -1901,21 +1868,21 @@ TclCompileNamespaceQualifiersCmd(
|
||||
}
|
||||
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
PUSH( "0");
|
||||
PUSH( "::");
|
||||
OP4( OVER, 2);
|
||||
OP( STR_FIND_LAST);
|
||||
PushStringLiteral(envPtr, "0");
|
||||
PushStringLiteral(envPtr, "::");
|
||||
TclEmitInstInt4( INST_OVER, 2, envPtr);
|
||||
TclEmitOpcode( INST_STR_FIND_LAST, envPtr);
|
||||
off = CurrentOffset(envPtr);
|
||||
PUSH( "1");
|
||||
OP( SUB);
|
||||
OP4( OVER, 2);
|
||||
OP4( OVER, 1);
|
||||
OP( STR_INDEX);
|
||||
PUSH( ":");
|
||||
OP( STR_EQ);
|
||||
PushStringLiteral(envPtr, "1");
|
||||
TclEmitOpcode( INST_SUB, envPtr);
|
||||
TclEmitInstInt4( INST_OVER, 2, envPtr);
|
||||
TclEmitInstInt4( INST_OVER, 1, envPtr);
|
||||
TclEmitOpcode( INST_STR_INDEX, envPtr);
|
||||
PushStringLiteral(envPtr, ":");
|
||||
TclEmitOpcode( INST_STR_EQ, envPtr);
|
||||
off = off - CurrentOffset(envPtr);
|
||||
OP1( JUMP_TRUE1, off);
|
||||
OP( STR_RANGE);
|
||||
TclEmitInstInt1( INST_JUMP_TRUE1, off, envPtr);
|
||||
TclEmitOpcode( INST_STR_RANGE, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -1940,18 +1907,18 @@ TclCompileNamespaceTailCmd(
|
||||
*/
|
||||
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
PUSH( "::");
|
||||
OP4( OVER, 1);
|
||||
OP( STR_FIND_LAST);
|
||||
OP( DUP);
|
||||
PUSH( "0");
|
||||
OP( GE);
|
||||
PushStringLiteral(envPtr, "::");
|
||||
TclEmitInstInt4( INST_OVER, 1, envPtr);
|
||||
TclEmitOpcode( INST_STR_FIND_LAST, envPtr);
|
||||
TclEmitOpcode( INST_DUP, envPtr);
|
||||
PushStringLiteral(envPtr, "0");
|
||||
TclEmitOpcode( INST_GE, envPtr);
|
||||
TclEmitForwardJump(envPtr, TCL_FALSE_JUMP, &jumpFixup);
|
||||
PUSH( "2");
|
||||
OP( ADD);
|
||||
PushStringLiteral(envPtr, "2");
|
||||
TclEmitOpcode( INST_ADD, envPtr);
|
||||
TclFixupForwardJumpToHere(envPtr, &jumpFixup, 127);
|
||||
PUSH( "end");
|
||||
OP( STR_RANGE);
|
||||
PushStringLiteral(envPtr, "end");
|
||||
TclEmitOpcode( INST_STR_RANGE, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -2003,15 +1970,15 @@ TclCompileNamespaceUpvarCmd(
|
||||
if (localIndex < 0) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
OP4( NSUPVAR, localIndex);
|
||||
TclEmitInstInt4( INST_NSUPVAR, localIndex, envPtr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Pop the namespace, and set the result to empty
|
||||
*/
|
||||
|
||||
OP( POP);
|
||||
PUSH( "");
|
||||
TclEmitOpcode( INST_POP, envPtr);
|
||||
PushStringLiteral(envPtr, "");
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -2056,7 +2023,7 @@ TclCompileNamespaceWhichCmd(
|
||||
*/
|
||||
|
||||
CompileWord(envPtr, tokenPtr, interp, idx);
|
||||
OP( RESOLVE_COMMAND);
|
||||
TclEmitOpcode( INST_RESOLVE_COMMAND, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -2175,7 +2142,7 @@ TclCompileRegexpCmd(
|
||||
* The semantics of regexp are always match on re == "".
|
||||
*/
|
||||
|
||||
PUSH( "1");
|
||||
PushStringLiteral(envPtr, "1");
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -2205,9 +2172,9 @@ TclCompileRegexpCmd(
|
||||
|
||||
if (simple) {
|
||||
if (exact && !nocase) {
|
||||
OP( STR_EQ);
|
||||
TclEmitOpcode( INST_STR_EQ, envPtr);
|
||||
} else {
|
||||
OP1( STR_MATCH, nocase);
|
||||
TclEmitInstInt1( INST_STR_MATCH, nocase, envPtr);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
@@ -2218,7 +2185,7 @@ TclCompileRegexpCmd(
|
||||
|
||||
int cflags = TCL_REG_ADVANCED | (nocase ? TCL_REG_NOCASE : 0);
|
||||
|
||||
OP1( REGEXP, cflags);
|
||||
TclEmitInstInt1( INST_REGEXP, cflags, envPtr);
|
||||
}
|
||||
|
||||
return TCL_OK;
|
||||
@@ -2385,7 +2352,7 @@ TclCompileRegsubCmd(
|
||||
bytes = TclGetStringFromObj(replacementObj, &len);
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
CompileWord(envPtr, stringTokenPtr, interp, parsePtr->numWords - 2);
|
||||
OP( STR_MAP);
|
||||
TclEmitOpcode( INST_STR_MAP, envPtr);
|
||||
|
||||
done:
|
||||
Tcl_DStringFree(&pattern);
|
||||
@@ -2518,7 +2485,7 @@ TclCompileReturnCmd(
|
||||
* No explict result argument, so default result is empty string.
|
||||
*/
|
||||
|
||||
PUSH( "");
|
||||
PushStringLiteral(envPtr, "");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2552,7 +2519,7 @@ TclCompileReturnCmd(
|
||||
*/
|
||||
|
||||
Tcl_DecrRefCount(returnOpts);
|
||||
OP( DONE);
|
||||
TclEmitOpcode(INST_DONE, envPtr);
|
||||
TclAdjustStackDepth(1, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -2583,7 +2550,7 @@ TclCompileReturnCmd(
|
||||
CompileWord(envPtr, wordTokenPtr, interp, objc);
|
||||
wordTokenPtr = TokenAfter(wordTokenPtr);
|
||||
}
|
||||
OP4( LIST, numOptionWords);
|
||||
TclEmitInstInt4(INST_LIST, numOptionWords, envPtr);
|
||||
|
||||
/*
|
||||
* Push the result.
|
||||
@@ -2592,14 +2559,14 @@ TclCompileReturnCmd(
|
||||
if (explicitResult) {
|
||||
CompileWord(envPtr, wordTokenPtr, interp, numWords - 1);
|
||||
} else {
|
||||
PUSH( "");
|
||||
PushStringLiteral(envPtr, "");
|
||||
}
|
||||
|
||||
/*
|
||||
* Issue the RETURN itself.
|
||||
*/
|
||||
|
||||
INVOKE( RETURN_STK);
|
||||
TclEmitInvoke(envPtr, INST_RETURN_STK);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -2629,7 +2596,8 @@ CompileReturnInternal(
|
||||
}
|
||||
|
||||
TclEmitPush(TclAddLiteralObj(envPtr, returnOpts, NULL), envPtr);
|
||||
TclEmitInstInt44(op, code, level, envPtr);
|
||||
TclEmitInstInt4(op, code, envPtr);
|
||||
TclEmitInt4(level, envPtr);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2708,7 +2676,7 @@ TclCompileUpvarCmd(
|
||||
Tcl_DecrRefCount(objPtr);
|
||||
|
||||
if (newTypePtr != typePtr) {
|
||||
if (numWords % 2) {
|
||||
if (numWords%2) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
/* TODO: Push the known value instead? */
|
||||
@@ -2716,10 +2684,10 @@ TclCompileUpvarCmd(
|
||||
otherTokenPtr = TokenAfter(tokenPtr);
|
||||
i = 2;
|
||||
} else {
|
||||
if (!(numWords % 2)) {
|
||||
if (!(numWords%2)) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
PUSH("1");
|
||||
PushStringLiteral(envPtr, "1");
|
||||
otherTokenPtr = tokenPtr;
|
||||
i = 1;
|
||||
}
|
||||
@@ -2742,15 +2710,15 @@ TclCompileUpvarCmd(
|
||||
if (localIndex < 0) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
OP4( UPVAR, localIndex);
|
||||
TclEmitInstInt4( INST_UPVAR, localIndex, envPtr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Pop the frame index, and set the result to empty
|
||||
*/
|
||||
|
||||
OP( POP);
|
||||
PUSH( "");
|
||||
TclEmitOpcode( INST_POP, envPtr);
|
||||
PushStringLiteral(envPtr, "");
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -2816,7 +2784,7 @@ TclCompileVariableCmd(
|
||||
* IndexTailVarIfKnown() screen. Full CompileWord()
|
||||
* likely does not apply here. Push known value instead. */
|
||||
CompileWord(envPtr, varTokenPtr, interp, i);
|
||||
OP4( VARIABLE, localIndex);
|
||||
TclEmitInstInt4( INST_VARIABLE, localIndex, envPtr);
|
||||
|
||||
if (i + 1 < numWords) {
|
||||
/*
|
||||
@@ -2824,8 +2792,8 @@ TclCompileVariableCmd(
|
||||
*/
|
||||
|
||||
CompileWord(envPtr, valueTokenPtr, interp, i + 1);
|
||||
STORE( localIndex);
|
||||
OP( POP);
|
||||
Emit14Inst( INST_STORE_SCALAR, localIndex, envPtr);
|
||||
TclEmitOpcode( INST_POP, envPtr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2833,7 +2801,7 @@ TclCompileVariableCmd(
|
||||
* Set the result to empty
|
||||
*/
|
||||
|
||||
PUSH( "");
|
||||
PushStringLiteral(envPtr, "");
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -2965,7 +2933,7 @@ TclCompileObjectNextCmd(
|
||||
CompileWord(envPtr, tokenPtr, interp, i);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
}
|
||||
OP1( TCLOO_NEXT, i);
|
||||
TclEmitInstInt1( INST_TCLOO_NEXT, i, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -2989,7 +2957,7 @@ TclCompileObjectNextToCmd(
|
||||
CompileWord(envPtr, tokenPtr, interp, i);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
}
|
||||
OP1( TCLOO_NEXT_CLASS, i);
|
||||
TclEmitInstInt1( INST_TCLOO_NEXT_CLASS, i, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -3002,9 +2970,9 @@ TclCompileObjectSelfCmd(
|
||||
CompileEnv *envPtr) /* Holds resulting instructions. */
|
||||
{
|
||||
/*
|
||||
* We only handle [self], [self object] (which is the same operation) and
|
||||
* [self namespace]. These are the only very common operations on [self]
|
||||
* for which bytecoding is at all reasonable.
|
||||
* We only handle [self] and [self object] (which is the same operation).
|
||||
* These are the only very common operations on [self] for which
|
||||
* bytecoding is at all reasonable.
|
||||
*/
|
||||
|
||||
if (parsePtr->numWords == 1) {
|
||||
@@ -3036,7 +3004,7 @@ TclCompileObjectSelfCmd(
|
||||
* This delegates the entire problem to a single opcode.
|
||||
*/
|
||||
|
||||
OP( TCLOO_SELF);
|
||||
TclEmitOpcode( INST_TCLOO_SELF, envPtr);
|
||||
return TCL_OK;
|
||||
|
||||
compileSelfNamespace:
|
||||
@@ -3049,9 +3017,9 @@ TclCompileObjectSelfCmd(
|
||||
* avoids creating another opcode, so that's all good!
|
||||
*/
|
||||
|
||||
OP( TCLOO_SELF);
|
||||
OP( POP);
|
||||
OP( NS_CURRENT);
|
||||
TclEmitOpcode( INST_TCLOO_SELF, envPtr);
|
||||
TclEmitOpcode( INST_POP, envPtr);
|
||||
TclEmitOpcode( INST_NS_CURRENT, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
|
||||
+236
-291
@@ -81,9 +81,12 @@ const AuxDataType tclJumptableInfoType = {
|
||||
#define OP(name) TclEmitOpcode(INST_##name, envPtr)
|
||||
#define OP1(name,val) TclEmitInstInt1(INST_##name,(val),envPtr)
|
||||
#define OP4(name,val) TclEmitInstInt4(INST_##name,(val),envPtr)
|
||||
#define OP14(name,val1,val2) TclEmitInstInt14(INST_##name,(val1),(val2),envPtr)
|
||||
#define OP44(name,val1,val2) TclEmitInstInt44(INST_##name,(val1),(val2),envPtr)
|
||||
#define PUSH(str) PushStringLiteral(envPtr, str)
|
||||
#define OP14(name,val1,val2) \
|
||||
TclEmitInstInt1(INST_##name,(val1),envPtr);TclEmitInt4((val2),envPtr)
|
||||
#define OP44(name,val1,val2) \
|
||||
TclEmitInstInt4(INST_##name,(val1),envPtr);TclEmitInt4((val2),envPtr)
|
||||
#define PUSH(str) \
|
||||
PushStringLiteral(envPtr, str)
|
||||
#define JUMP4(name,var) \
|
||||
(var) = CurrentOffset(envPtr);TclEmitInstInt4(INST_##name##4,0,envPtr)
|
||||
#define FIXJUMP4(var) \
|
||||
@@ -96,60 +99,9 @@ const AuxDataType tclJumptableInfoType = {
|
||||
if ((idx)<256) {OP1(LOAD_SCALAR1,(idx));} else {OP4(LOAD_SCALAR4,(idx));}
|
||||
#define STORE(idx) \
|
||||
if ((idx)<256) {OP1(STORE_SCALAR1,(idx));} else {OP4(STORE_SCALAR4,(idx));}
|
||||
#define INVOKE(name) TclEmitInvoke(envPtr,INST_##name)
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* IsContinuationBody, IsDefaultToken, IsFinallyToken, IsOnToken,
|
||||
* IsTrapToken --
|
||||
*
|
||||
* Helpers for TclCompileSwitchCmd and TclCompileTryCmd to compare tokens
|
||||
* to key literals.
|
||||
*
|
||||
* Results:
|
||||
* Returns 1 if they're equal, 0 if not.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
#define INVOKE(name) \
|
||||
TclEmitInvoke(envPtr,INST_##name)
|
||||
|
||||
static inline int
|
||||
IsContinuationBody(
|
||||
const Tcl_Token *tokenPtr)
|
||||
{
|
||||
return tokenPtr->size == 1 && tokenPtr->start[0] == '-';
|
||||
}
|
||||
|
||||
static inline int
|
||||
IsDefaultToken(
|
||||
const Tcl_Token *tokenPtr)
|
||||
{
|
||||
return tokenPtr->size == 7 && memcmp(tokenPtr->start, "default", 7) == 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
IsFinallyToken(
|
||||
const Tcl_Token *tokenPtr)
|
||||
{
|
||||
return tokenPtr->size == 7 && memcmp(tokenPtr->start, "finally", 7) == 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
IsOnToken(
|
||||
const Tcl_Token *tokenPtr)
|
||||
{
|
||||
return tokenPtr->size == 2 && memcmp(tokenPtr->start, "on", 2) == 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
IsTrapToken(
|
||||
const Tcl_Token *tokenPtr)
|
||||
{
|
||||
return tokenPtr->size == 4 && memcmp(tokenPtr->start, "trap", 4) == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
@@ -212,33 +164,33 @@ TclCompileSetCmd(
|
||||
* Emit instructions to set/get the variable.
|
||||
*/
|
||||
|
||||
if (isScalar) {
|
||||
if (localIndex < 0) {
|
||||
TclEmitOpcode((isAssignment?
|
||||
INST_STORE_STK : INST_LOAD_STK), envPtr);
|
||||
} else if (localIndex <= 255) {
|
||||
TclEmitInstInt1((isAssignment?
|
||||
INST_STORE_SCALAR1 : INST_LOAD_SCALAR1),
|
||||
localIndex, envPtr);
|
||||
if (isScalar) {
|
||||
if (localIndex < 0) {
|
||||
TclEmitOpcode((isAssignment?
|
||||
INST_STORE_STK : INST_LOAD_STK), envPtr);
|
||||
} else if (localIndex <= 255) {
|
||||
TclEmitInstInt1((isAssignment?
|
||||
INST_STORE_SCALAR1 : INST_LOAD_SCALAR1),
|
||||
localIndex, envPtr);
|
||||
} else {
|
||||
TclEmitInstInt4((isAssignment?
|
||||
INST_STORE_SCALAR4 : INST_LOAD_SCALAR4),
|
||||
localIndex, envPtr);
|
||||
}
|
||||
} else {
|
||||
TclEmitInstInt4((isAssignment?
|
||||
INST_STORE_SCALAR4 : INST_LOAD_SCALAR4),
|
||||
localIndex, envPtr);
|
||||
if (localIndex < 0) {
|
||||
TclEmitOpcode((isAssignment?
|
||||
INST_STORE_ARRAY_STK : INST_LOAD_ARRAY_STK), envPtr);
|
||||
} else if (localIndex <= 255) {
|
||||
TclEmitInstInt1((isAssignment?
|
||||
INST_STORE_ARRAY1 : INST_LOAD_ARRAY1),
|
||||
localIndex, envPtr);
|
||||
} else {
|
||||
TclEmitInstInt4((isAssignment?
|
||||
INST_STORE_ARRAY4 : INST_LOAD_ARRAY4),
|
||||
localIndex, envPtr);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (localIndex < 0) {
|
||||
TclEmitOpcode((isAssignment?
|
||||
INST_STORE_ARRAY_STK : INST_LOAD_ARRAY_STK), envPtr);
|
||||
} else if (localIndex <= 255) {
|
||||
TclEmitInstInt1((isAssignment?
|
||||
INST_STORE_ARRAY1 : INST_LOAD_ARRAY1),
|
||||
localIndex, envPtr);
|
||||
} else {
|
||||
TclEmitInstInt4((isAssignment?
|
||||
INST_STORE_ARRAY4 : INST_LOAD_ARRAY4),
|
||||
localIndex, envPtr);
|
||||
}
|
||||
}
|
||||
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -277,15 +229,13 @@ TclCompileStringCatCmd(
|
||||
|
||||
/* Trivial case, no arg */
|
||||
|
||||
if (numWords < 2) {
|
||||
PUSH( "");
|
||||
if (numWords<2) {
|
||||
PushStringLiteral(envPtr, "");
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* General case: issue CONCAT1's (by chunks of 254 if needed), folding
|
||||
* contiguous constants along the way.
|
||||
*/
|
||||
/* General case: issue CONCAT1's (by chunks of 254 if needed), folding
|
||||
contiguous constants along the way */
|
||||
|
||||
numArgs = 0;
|
||||
folded = NULL;
|
||||
@@ -313,7 +263,7 @@ TclCompileStringCatCmd(
|
||||
CompileWord(envPtr, wordTokenPtr, interp, i);
|
||||
numArgs ++;
|
||||
if (numArgs >= 254) { /* 254 to take care of the possible +1 of "folded" above */
|
||||
OP1( STR_CONCAT1, numArgs);
|
||||
TclEmitInstInt1(INST_STR_CONCAT1, numArgs, envPtr);
|
||||
numArgs = 1; /* concat pushes 1 obj, the result */
|
||||
}
|
||||
}
|
||||
@@ -329,7 +279,7 @@ TclCompileStringCatCmd(
|
||||
numArgs ++;
|
||||
}
|
||||
if (numArgs > 1) {
|
||||
OP1( STR_CONCAT1, numArgs);
|
||||
TclEmitInstInt1(INST_STR_CONCAT1, numArgs, envPtr);
|
||||
}
|
||||
|
||||
return TCL_OK;
|
||||
@@ -362,7 +312,7 @@ TclCompileStringCmpCmd(
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 2);
|
||||
OP( STR_CMP);
|
||||
TclEmitOpcode(INST_STR_CMP, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -393,7 +343,7 @@ TclCompileStringEqualCmd(
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 2);
|
||||
OP( STR_EQ);
|
||||
TclEmitOpcode(INST_STR_EQ, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -424,7 +374,7 @@ TclCompileStringFirstCmd(
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 2);
|
||||
OP( STR_FIND);
|
||||
OP(STR_FIND);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -455,7 +405,7 @@ TclCompileStringLastCmd(
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 2);
|
||||
OP( STR_FIND_LAST);
|
||||
OP(STR_FIND_LAST);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -482,7 +432,7 @@ TclCompileStringIndexCmd(
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 2);
|
||||
OP( STR_INDEX);
|
||||
TclEmitOpcode(INST_STR_INDEX, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -502,28 +452,20 @@ TclCompileStringInsertCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute and push the string in which to insert.
|
||||
*/
|
||||
|
||||
/* Compute and push the string in which to insert */
|
||||
tokenPtr = TokenAfter(parsePtr->tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 1);
|
||||
|
||||
/*
|
||||
* See what can be discovered about index at compile time.
|
||||
*/
|
||||
|
||||
/* See what can be discovered about index at compile time */
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
if (TCL_OK != TclGetIndexFromToken(tokenPtr, TCL_INDEX_START,
|
||||
TCL_INDEX_END, &idx)) {
|
||||
|
||||
/* Nothing useful knowable - cease compile; let it direct eval */
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute and push the string to be inserted.
|
||||
*/
|
||||
|
||||
/* Compute and push the string to be inserted */
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 3);
|
||||
|
||||
@@ -550,17 +492,6 @@ TclCompileStringInsertCmd(
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
static inline int
|
||||
GotLiteral(
|
||||
const Tcl_Token *tokenPtr,
|
||||
const char *word)
|
||||
{
|
||||
return (tokenPtr->type == TCL_TOKEN_SIMPLE_WORD &&
|
||||
tokenPtr[1].size > 1 &&
|
||||
tokenPtr[1].start[0] == word[0] &&
|
||||
strncmp(tokenPtr[1].start, word, tokenPtr[1].size) == 0);
|
||||
}
|
||||
|
||||
int
|
||||
TclCompileStringIsCmd(
|
||||
Tcl_Interp *interp, /* Used for error reporting. */
|
||||
@@ -574,19 +505,19 @@ TclCompileStringIsCmd(
|
||||
Tcl_Token *tokenPtr = TokenAfter(parsePtr->tokenPtr);
|
||||
static const char *const isClasses[] = {
|
||||
"alnum", "alpha", "ascii", "control",
|
||||
"boolean", "dict", "digit", "double", "entier",
|
||||
"false", "graph", "integer", "list",
|
||||
"lower", "print", "punct", "space",
|
||||
"true", "upper", "wideinteger", "wordchar",
|
||||
"xdigit", NULL
|
||||
"boolean", "dict", "digit", "double",
|
||||
"entier", "false", "graph", "integer",
|
||||
"list", "lower", "print", "punct",
|
||||
"space", "true", "upper", "unicode",
|
||||
"wideinteger", "wordchar", "xdigit", NULL
|
||||
};
|
||||
enum isClassesEnum {
|
||||
STR_IS_ALNUM, STR_IS_ALPHA, STR_IS_ASCII, STR_IS_CONTROL,
|
||||
STR_IS_BOOL, STR_IS_DICT, STR_IS_DIGIT, STR_IS_DOUBLE, STR_IS_ENTIER,
|
||||
STR_IS_FALSE, STR_IS_GRAPH, STR_IS_INT, STR_IS_LIST,
|
||||
STR_IS_LOWER, STR_IS_PRINT, STR_IS_PUNCT, STR_IS_SPACE,
|
||||
STR_IS_TRUE, STR_IS_UPPER, STR_IS_WIDE, STR_IS_WORD,
|
||||
STR_IS_XDIGIT
|
||||
STR_IS_BOOL, STR_IS_DICT, STR_IS_DIGIT, STR_IS_DOUBLE,
|
||||
STR_IS_ENTIER, STR_IS_FALSE, STR_IS_GRAPH, STR_IS_INT,
|
||||
STR_IS_LIST, STR_IS_LOWER, STR_IS_PRINT, STR_IS_PUNCT,
|
||||
STR_IS_SPACE, STR_IS_TRUE, STR_IS_UPPER, STR_IS_UNICODE,
|
||||
STR_IS_WIDE, STR_IS_WORD, STR_IS_XDIGIT
|
||||
};
|
||||
int t, range, allowEmpty = 0, end;
|
||||
InstStringClassType strClassType;
|
||||
@@ -607,6 +538,12 @@ TclCompileStringIsCmd(
|
||||
}
|
||||
Tcl_DecrRefCount(isClass);
|
||||
|
||||
#define GotLiteral(tokenPtr, word) \
|
||||
((tokenPtr)->type == TCL_TOKEN_SIMPLE_WORD && \
|
||||
(tokenPtr)[1].size > 1 && \
|
||||
(tokenPtr)[1].start[0] == word[0] && \
|
||||
strncmp((tokenPtr)[1].start, (word), (tokenPtr)[1].size) == 0)
|
||||
|
||||
/*
|
||||
* Cannot handle the -failindex option at all, and that's the only legal
|
||||
* way to have more than 4 arguments.
|
||||
@@ -625,6 +562,7 @@ TclCompileStringIsCmd(
|
||||
}
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
}
|
||||
#undef GotLiteral
|
||||
|
||||
/*
|
||||
* Compile the code. There are several main classes of check here.
|
||||
@@ -671,6 +609,9 @@ TclCompileStringIsCmd(
|
||||
case STR_IS_UPPER:
|
||||
strClassType = STR_CLASS_UPPER;
|
||||
goto compileStrClass;
|
||||
case STR_IS_UNICODE:
|
||||
strClassType = STR_CLASS_UNICODE;
|
||||
goto compileStrClass;
|
||||
case STR_IS_WORD:
|
||||
strClassType = STR_CLASS_WORD;
|
||||
goto compileStrClass;
|
||||
@@ -866,7 +807,12 @@ TclCompileStringMatchCmd(
|
||||
*/
|
||||
|
||||
if (parsePtr->numWords == 4) {
|
||||
if (!GotLiteral(tokenPtr, "-nocase")) {
|
||||
if (tokenPtr->type != TCL_TOKEN_SIMPLE_WORD) {
|
||||
return TclCompileBasic3ArgCmd(interp, parsePtr, cmdPtr, envPtr);
|
||||
}
|
||||
str = tokenPtr[1].start;
|
||||
length = tokenPtr[1].size;
|
||||
if ((length <= 1) || strncmp(str, "-nocase", length)) {
|
||||
/*
|
||||
* Fail at run time, not in compilation.
|
||||
*/
|
||||
@@ -900,7 +846,7 @@ TclCompileStringMatchCmd(
|
||||
}
|
||||
PushLiteral(envPtr, str, length);
|
||||
} else {
|
||||
SetLineInformation(i + 1 + nocase);
|
||||
SetLineInformation(i+1+nocase);
|
||||
CompileTokens(envPtr, tokenPtr, interp);
|
||||
}
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
@@ -911,9 +857,9 @@ TclCompileStringMatchCmd(
|
||||
*/
|
||||
|
||||
if (exactMatch) {
|
||||
OP( STR_EQ);
|
||||
TclEmitOpcode(INST_STR_EQ, envPtr);
|
||||
} else {
|
||||
OP1( STR_MATCH, nocase);
|
||||
TclEmitInstInt1(INST_STR_MATCH, nocase, envPtr);
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -951,7 +897,7 @@ TclCompileStringLenCmd(
|
||||
} else {
|
||||
SetLineInformation(1);
|
||||
CompileTokens(envPtr, tokenPtr, interp);
|
||||
OP( STR_LEN);
|
||||
TclEmitOpcode(INST_STR_LEN, envPtr);
|
||||
}
|
||||
TclDecrRefCount(objPtr);
|
||||
return TCL_OK;
|
||||
@@ -1050,7 +996,6 @@ TclCompileStringRangeCmd(
|
||||
&idx1) != TCL_OK) {
|
||||
goto nonConstantIndices;
|
||||
}
|
||||
|
||||
/*
|
||||
* Token parsed as an index expression. We treat all indices before
|
||||
* the string the same as the start of the string.
|
||||
@@ -1067,12 +1012,10 @@ TclCompileStringRangeCmd(
|
||||
&idx2) != TCL_OK) {
|
||||
goto nonConstantIndices;
|
||||
}
|
||||
|
||||
/*
|
||||
* Token parsed as an index expression. We treat all indices after
|
||||
* the string the same as the end of the string.
|
||||
*/
|
||||
|
||||
if (idx2 == (int)TCL_INDEX_NONE) {
|
||||
/* [string range $s $first -1] must be empty string */
|
||||
OP( POP);
|
||||
@@ -1121,7 +1064,6 @@ TclCompileStringReplaceCmd(
|
||||
/*
|
||||
* Check for first index known and useful at compile time.
|
||||
*/
|
||||
|
||||
tokenPtr = TokenAfter(valueTokenPtr);
|
||||
if (TclGetIndexFromToken(tokenPtr, TCL_INDEX_START, TCL_INDEX_NONE,
|
||||
&first) != TCL_OK) {
|
||||
@@ -1131,7 +1073,6 @@ TclCompileStringReplaceCmd(
|
||||
/*
|
||||
* Check for last index known and useful at compile time.
|
||||
*/
|
||||
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
if (TclGetIndexFromToken(tokenPtr, TCL_INDEX_NONE, TCL_INDEX_END,
|
||||
&last) != TCL_OK) {
|
||||
@@ -1139,25 +1080,26 @@ TclCompileStringReplaceCmd(
|
||||
}
|
||||
|
||||
/*
|
||||
* [string replace] is an odd bird. For many arguments it is a
|
||||
* conventional substring replacer. However it also goes out of its way
|
||||
* to become a no-op for many cases where it would be replacing an empty
|
||||
* substring. Precisely, it is a no-op when
|
||||
* [string replace] is an odd bird. For many arguments it is
|
||||
* a conventional substring replacer. However it also goes out
|
||||
* of its way to become a no-op for many cases where it would be
|
||||
* replacing an empty substring. Precisely, it is a no-op when
|
||||
*
|
||||
* (last < first) OR
|
||||
* (last < 0) OR
|
||||
* (end < first)
|
||||
*
|
||||
* For some compile-time values we can detect these cases, and compile
|
||||
* direct to bytecode implementing the no-op.
|
||||
* For some compile-time values we can detect these cases, and
|
||||
* compile direct to bytecode implementing the no-op.
|
||||
*/
|
||||
|
||||
if ((last == (int)TCL_INDEX_NONE) /* Know (last < 0) */
|
||||
|| (first == (int)TCL_INDEX_NONE) /* Know (first > end) */
|
||||
|
||||
/*
|
||||
* Tricky to determine when runtime (last < first) can be certainly
|
||||
* known based on the encoded values. Consider the cases...
|
||||
* Tricky to determine when runtime (last < first) can be
|
||||
* certainly known based on the encoded values. Consider the
|
||||
* cases...
|
||||
*
|
||||
* (first <= TCL_INDEX_END) &&
|
||||
* (last <= TCL_INDEX END) && (last < first) => ACCEPT
|
||||
@@ -1186,72 +1128,74 @@ TclCompileStringReplaceCmd(
|
||||
}
|
||||
|
||||
if (parsePtr->numWords == 5) {
|
||||
/*
|
||||
* When we have a string replacement, we have to take care about not
|
||||
* replacing empty substrings that [string replace] promises not to
|
||||
* replace.
|
||||
*
|
||||
* The remaining index values might be suitable for conventional
|
||||
* string replacement, but only if they cannot possibly meet the
|
||||
* conditions described above at runtime. If there's a chance they
|
||||
* might, we would have to emit bytecode to check and at that point
|
||||
* we're paying more in bytecode execution time than would make things
|
||||
* worthwhile. Trouble is we are very limited in how much we can
|
||||
* detect that at compile time. After decoding, we need, first:
|
||||
*
|
||||
* (first <= end)
|
||||
*
|
||||
* The encoded indices (first <= TCL_INDEX END) and (first ==
|
||||
* TCL_INDEX_NONE) always meets this condition, but any other encoded
|
||||
* first index has some list for which it fails.
|
||||
*
|
||||
* We also need, second:
|
||||
*
|
||||
* (last >= 0)
|
||||
*
|
||||
* The encoded index (last >= TCL_INDEX_START) always meet this
|
||||
* condition but any other encoded last index has some list for which
|
||||
* it fails.
|
||||
*
|
||||
* Finally we need, third:
|
||||
*
|
||||
* (first <= last)
|
||||
*
|
||||
* Considered in combination with the constraints we already have, we
|
||||
* see that we can proceed when (first == TCL_INDEX_NONE). These also
|
||||
* permit simplification of the prefix|replace|suffix construction.
|
||||
* The other constraints, though, interfere with getting a guarantee
|
||||
* that first <= last.
|
||||
*/
|
||||
/*
|
||||
* When we have a string replacement, we have to take care about
|
||||
* not replacing empty substrings that [string replace] promises
|
||||
* not to replace
|
||||
*
|
||||
* The remaining index values might be suitable for conventional
|
||||
* string replacement, but only if they cannot possibly meet the
|
||||
* conditions described above at runtime. If there's a chance they
|
||||
* might, we would have to emit bytecode to check and at that point
|
||||
* we're paying more in bytecode execution time than would make
|
||||
* things worthwhile. Trouble is we are very limited in
|
||||
* how much we can detect that at compile time. After decoding,
|
||||
* we need, first:
|
||||
*
|
||||
* (first <= end)
|
||||
*
|
||||
* The encoded indices (first <= TCL_INDEX END) and
|
||||
* (first == TCL_INDEX_NONE) always meets this condition, but
|
||||
* any other encoded first index has some list for which it fails.
|
||||
*
|
||||
* We also need, second:
|
||||
*
|
||||
* (last >= 0)
|
||||
*
|
||||
* The encoded index (last >= TCL_INDEX_START) always meet this
|
||||
* condition but any other encoded last index has some list for
|
||||
* which it fails.
|
||||
*
|
||||
* Finally we need, third:
|
||||
*
|
||||
* (first <= last)
|
||||
*
|
||||
* Considered in combination with the constraints we already have,
|
||||
* we see that we can proceed when (first == TCL_INDEX_NONE).
|
||||
* These also permit simplification of the prefix|replace|suffix
|
||||
* construction. The other constraints, though, interfere with
|
||||
* getting a guarantee that first <= last.
|
||||
*/
|
||||
|
||||
if ((first == (int)TCL_INDEX_START) && (last >= (int)TCL_INDEX_START)) {
|
||||
/* empty prefix */
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 4);
|
||||
OP4( REVERSE, 2);
|
||||
if (last == INT_MAX) {
|
||||
OP( POP); /* Pop original */
|
||||
} else {
|
||||
OP44( STR_RANGE_IMM, last + 1, (int)TCL_INDEX_END);
|
||||
OP1( STR_CONCAT1, 2);
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
if ((last == (int)TCL_INDEX_NONE) && (first <= (int)TCL_INDEX_END)) {
|
||||
OP44( STR_RANGE_IMM, 0, first-1);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 4);
|
||||
if ((first == (int)TCL_INDEX_START) && (last >= (int)TCL_INDEX_START)) {
|
||||
/* empty prefix */
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 4);
|
||||
OP4( REVERSE, 2);
|
||||
if (last == INT_MAX) {
|
||||
OP( POP); /* Pop original */
|
||||
} else {
|
||||
OP44( STR_RANGE_IMM, last + 1, (int)TCL_INDEX_END);
|
||||
OP1( STR_CONCAT1, 2);
|
||||
return TCL_OK;
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
if ((last == (int)TCL_INDEX_NONE) && (first <= (int)TCL_INDEX_END)) {
|
||||
OP44( STR_RANGE_IMM, 0, first-1);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 4);
|
||||
OP1( STR_CONCAT1, 2);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/* FLOW THROUGH TO genericReplace */
|
||||
|
||||
} else {
|
||||
/*
|
||||
* When we have no replacement string to worry about, we may have more
|
||||
* luck, because the forbidden empty string replacements are harmless
|
||||
* when they are replaced by another empty string.
|
||||
* When we have no replacement string to worry about, we may
|
||||
* have more luck, because the forbidden empty string replacements
|
||||
* are harmless when they are replaced by another empty string.
|
||||
*/
|
||||
|
||||
if (first == (int)TCL_INDEX_START) {
|
||||
@@ -1260,7 +1204,7 @@ TclCompileStringReplaceCmd(
|
||||
if (last == (int)TCL_INDEX_END) {
|
||||
/* empty suffix too => empty result */
|
||||
OP( POP); /* Pop original */
|
||||
PUSH( "");
|
||||
PUSH ( "");
|
||||
return TCL_OK;
|
||||
}
|
||||
OP44( STR_RANGE_IMM, last + 1, (int)TCL_INDEX_END);
|
||||
@@ -1280,19 +1224,19 @@ TclCompileStringReplaceCmd(
|
||||
}
|
||||
}
|
||||
|
||||
genericReplace:
|
||||
tokenPtr = TokenAfter(valueTokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 2);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 3);
|
||||
if (parsePtr->numWords == 5) {
|
||||
genericReplace:
|
||||
tokenPtr = TokenAfter(valueTokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 2);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 4);
|
||||
} else {
|
||||
PUSH( "");
|
||||
}
|
||||
OP( STR_REPLACE);
|
||||
return TCL_OK;
|
||||
CompileWord(envPtr, tokenPtr, interp, 3);
|
||||
if (parsePtr->numWords == 5) {
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, 4);
|
||||
} else {
|
||||
PUSH( "");
|
||||
}
|
||||
OP( STR_REPLACE);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -1474,6 +1418,7 @@ StringClassDesc const tclStringClassTable[] = {
|
||||
{"upper", Tcl_UniCharIsUpper},
|
||||
{"word", Tcl_UniCharIsWordChar},
|
||||
{"xdigit", UniCharIsHexDigit},
|
||||
{"unicode", Tcl_UniCharIsUnicode},
|
||||
{"", NULL}
|
||||
};
|
||||
|
||||
@@ -1536,14 +1481,12 @@ TclCompileSubstCmd(
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
* TODO: Figure out expansion to cover WordKnownAtCompileTime. The
|
||||
* difficulty is that WKACT makes a copy, and if TclSubstParse below
|
||||
* parses the copy of the original source string, some deep parts of the
|
||||
* compile machinery get upset. They want all pointers stored in
|
||||
* Tcl_Tokens to point back to the same original string.
|
||||
/* TODO: Figure out expansion to cover WordKnownAtCompileTime
|
||||
* The difficulty is that WKACT makes a copy, and if TclSubstParse
|
||||
* below parses the copy of the original source string, some deep
|
||||
* parts of the compile machinery get upset. They want all pointers
|
||||
* stored in Tcl_Tokens to point back to the same original string.
|
||||
*/
|
||||
|
||||
if (wordTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
|
||||
code = TclSubstOptions(NULL, numOpts, objv, &flags);
|
||||
}
|
||||
@@ -1600,14 +1543,16 @@ TclSubstCompile(
|
||||
|
||||
for (endTokenPtr = tokenPtr + parse.numTokens;
|
||||
tokenPtr < endTokenPtr; tokenPtr = TokenAfter(tokenPtr)) {
|
||||
int length, catchRange, breakJump;
|
||||
int length, literal, catchRange, breakJump;
|
||||
char buf[4] = "";
|
||||
JumpFixup startFixup, okFixup, returnFixup, breakFixup;
|
||||
JumpFixup continueFixup, otherFixup, endFixup;
|
||||
|
||||
switch (tokenPtr->type) {
|
||||
case TCL_TOKEN_TEXT:
|
||||
PushLiteral(envPtr, tokenPtr->start, tokenPtr->size);
|
||||
literal = TclRegisterLiteral(envPtr,
|
||||
tokenPtr->start, tokenPtr->size, 0);
|
||||
TclEmitPush(literal, envPtr);
|
||||
TclAdvanceLines(&bline, tokenPtr->start,
|
||||
tokenPtr->start + tokenPtr->size);
|
||||
count++;
|
||||
@@ -1615,7 +1560,8 @@ TclSubstCompile(
|
||||
case TCL_TOKEN_BS:
|
||||
length = TclParseBackslash(tokenPtr->start, tokenPtr->size,
|
||||
NULL, buf);
|
||||
PushLiteral(envPtr, buf, length);
|
||||
literal = TclRegisterLiteral(envPtr, buf, length, 0);
|
||||
TclEmitPush(literal, envPtr);
|
||||
count++;
|
||||
continue;
|
||||
case TCL_TOKEN_VARIABLE:
|
||||
@@ -1662,7 +1608,8 @@ TclSubstCompile(
|
||||
TclEmitForwardJump(envPtr, TCL_UNCONDITIONAL_JUMP, &startFixup);
|
||||
|
||||
/* Jump to the end (all BREAKs land here) */
|
||||
JUMP4( JUMP, breakOffset);
|
||||
breakOffset = CurrentOffset(envPtr);
|
||||
TclEmitInstInt4(INST_JUMP4, 0, envPtr);
|
||||
|
||||
/* Start */
|
||||
if (TclFixupForwardJumpToHere(envPtr, &startFixup, 127)) {
|
||||
@@ -1673,7 +1620,7 @@ TclSubstCompile(
|
||||
|
||||
envPtr->line = bline;
|
||||
catchRange = TclCreateExceptRange(CATCH_EXCEPTION_RANGE, envPtr);
|
||||
OP4( BEGIN_CATCH4, catchRange);
|
||||
OP4( BEGIN_CATCH4, catchRange);
|
||||
ExceptionRangeStarts(envPtr, catchRange);
|
||||
|
||||
switch (tokenPtr->type) {
|
||||
@@ -1694,21 +1641,21 @@ TclSubstCompile(
|
||||
ExceptionRangeEnds(envPtr, catchRange);
|
||||
|
||||
/* Substitution produced TCL_OK */
|
||||
OP( END_CATCH);
|
||||
OP( END_CATCH);
|
||||
TclEmitForwardJump(envPtr, TCL_UNCONDITIONAL_JUMP, &okFixup);
|
||||
TclAdjustStackDepth(-1, envPtr);
|
||||
|
||||
/* Exceptional return codes processed here */
|
||||
ExceptionRangeTarget(envPtr, catchRange, catchOffset);
|
||||
OP( PUSH_RETURN_OPTIONS);
|
||||
OP( PUSH_RESULT);
|
||||
OP( PUSH_RETURN_CODE);
|
||||
OP( END_CATCH);
|
||||
OP( RETURN_CODE_BRANCH);
|
||||
OP( PUSH_RETURN_OPTIONS);
|
||||
OP( PUSH_RESULT);
|
||||
OP( PUSH_RETURN_CODE);
|
||||
OP( END_CATCH);
|
||||
OP( RETURN_CODE_BRANCH);
|
||||
|
||||
/* ERROR -> reraise it; NB: can't require BREAK/CONTINUE handling */
|
||||
OP( RETURN_STK);
|
||||
OP( NOP);
|
||||
OP( RETURN_STK);
|
||||
OP( NOP);
|
||||
|
||||
/* RETURN */
|
||||
TclEmitForwardJump(envPtr, TCL_UNCONDITIONAL_JUMP, &returnFixup);
|
||||
@@ -1728,14 +1675,14 @@ TclSubstCompile(
|
||||
Tcl_Panic("TclCompileSubstCmd: bad break jump distance %d",
|
||||
(int) (CurrentOffset(envPtr) - breakFixup.codeOffset));
|
||||
}
|
||||
OP( POP);
|
||||
OP( POP);
|
||||
OP( POP);
|
||||
OP( POP);
|
||||
|
||||
breakJump = CurrentOffset(envPtr) - breakOffset;
|
||||
if (breakJump > 127) {
|
||||
OP4( JUMP4, -breakJump);
|
||||
OP4(JUMP4, -breakJump);
|
||||
} else {
|
||||
OP1( JUMP1, -breakJump);
|
||||
OP1(JUMP1, -breakJump);
|
||||
}
|
||||
|
||||
TclAdjustStackDepth(2, envPtr);
|
||||
@@ -1802,7 +1749,8 @@ TclSubstCompile(
|
||||
|
||||
/* Final target of the multi-jump from all BREAKs */
|
||||
if (breakOffset > 0) {
|
||||
FIXJUMP4(breakOffset);
|
||||
TclUpdateInstInt4AtPc(INST_JUMP4, CurrentOffset(envPtr) - breakOffset,
|
||||
envPtr->codeStart + breakOffset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2099,7 +2047,8 @@ TclCompileSwitchCmd(
|
||||
* illegal, but this makes the error happen at the right time).
|
||||
*/
|
||||
|
||||
if (IsContinuationBody(bodyToken[numWords-1])) {
|
||||
if (bodyToken[numWords-1]->size == 1 &&
|
||||
bodyToken[numWords-1]->start[0] == '-') {
|
||||
goto freeTemporaries;
|
||||
}
|
||||
|
||||
@@ -2111,10 +2060,7 @@ TclCompileSwitchCmd(
|
||||
* but it handles the most common case well enough.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Both methods push the value to match against onto the stack.
|
||||
*/
|
||||
|
||||
/* Both methods push the value to match against onto the stack. */
|
||||
CompileWord(envPtr, valueTokenPtr, interp, valueIndex);
|
||||
|
||||
if (mode == Switch_Exact) {
|
||||
@@ -2198,8 +2144,8 @@ IssueSwitchChainedTests(
|
||||
foundDefault = 0;
|
||||
for (i=0 ; i<numBodyTokens ; i+=2) {
|
||||
nextArmFixupIndex = -1;
|
||||
if (i != numBodyTokens - 2 ||
|
||||
!IsDefaultToken(bodyToken[numBodyTokens - 2])) {
|
||||
if (i!=numBodyTokens-2 || bodyToken[numBodyTokens-2]->size != 7 ||
|
||||
memcmp(bodyToken[numBodyTokens-2]->start, "default", 7)) {
|
||||
/*
|
||||
* Generate the test for the arm.
|
||||
*/
|
||||
@@ -2281,7 +2227,7 @@ IssueSwitchChainedTests(
|
||||
* ensured earlier; the final body is never a fall-through).
|
||||
*/
|
||||
|
||||
if (IsContinuationBody(bodyToken[i + 1])) {
|
||||
if (bodyToken[i+1]->size==1 && bodyToken[i+1]->start[0]=='-') {
|
||||
if (contFixIndex == -1) {
|
||||
contFixIndex = fixupCount;
|
||||
contFixCount = 0;
|
||||
@@ -2461,8 +2407,8 @@ IssueSwitchJumpTable(
|
||||
* term.
|
||||
*/
|
||||
|
||||
if (i != numBodyTokens - 2 ||
|
||||
!IsDefaultToken(bodyToken[numBodyTokens - 2])) {
|
||||
if (i!=numBodyTokens-2 || bodyToken[numBodyTokens-2]->size != 7 ||
|
||||
memcmp(bodyToken[numBodyTokens-2]->start, "default", 7)) {
|
||||
/*
|
||||
* This is not a default clause, so insert the current location as
|
||||
* a target in the jump table (assuming it isn't already there,
|
||||
@@ -2481,8 +2427,7 @@ IssueSwitchJumpTable(
|
||||
* point to here.
|
||||
*/
|
||||
|
||||
Tcl_SetHashValue(hPtr, (ptrdiff_t)
|
||||
(CurrentOffset(envPtr) - jumpLocation));
|
||||
Tcl_SetHashValue(hPtr, CurrentOffset(envPtr) - jumpLocation);
|
||||
}
|
||||
Tcl_DStringFree(&buffer);
|
||||
} else {
|
||||
@@ -2493,8 +2438,8 @@ IssueSwitchJumpTable(
|
||||
|
||||
foundDefault = 1;
|
||||
isNew = 1;
|
||||
TclStoreInt4AtPtr(CurrentOffset(envPtr) - jumpToDefault,
|
||||
envPtr->codeStart + jumpToDefault + 1);
|
||||
TclStoreInt4AtPtr(CurrentOffset(envPtr)-jumpToDefault,
|
||||
envPtr->codeStart+jumpToDefault+1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2505,7 +2450,7 @@ IssueSwitchJumpTable(
|
||||
* will also point here, so we advance to the next clause.
|
||||
*/
|
||||
|
||||
if (IsContinuationBody(bodyToken[i + 1])) {
|
||||
if (bodyToken[i+1]->size == 1 && bodyToken[i+1]->start[0] == '-') {
|
||||
mustGenerate = 1;
|
||||
continue;
|
||||
}
|
||||
@@ -2557,7 +2502,7 @@ IssueSwitchJumpTable(
|
||||
*/
|
||||
|
||||
if (!foundDefault) {
|
||||
TclStoreInt4AtPtr(CurrentOffset(envPtr) - jumpToDefault,
|
||||
TclStoreInt4AtPtr(CurrentOffset(envPtr)-jumpToDefault,
|
||||
envPtr->codeStart+jumpToDefault+1);
|
||||
PUSH("");
|
||||
}
|
||||
@@ -2568,8 +2513,8 @@ IssueSwitchJumpTable(
|
||||
*/
|
||||
|
||||
for (i=0 ; i<numRealBodies ; i++) {
|
||||
TclStoreInt4AtPtr(CurrentOffset(envPtr) - finalFixups[i],
|
||||
envPtr->codeStart + finalFixups[i] + 1);
|
||||
TclStoreInt4AtPtr(CurrentOffset(envPtr)-finalFixups[i],
|
||||
envPtr->codeStart+finalFixups[i]+1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2728,7 +2673,7 @@ TclCompileTailcallCmd(
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, i);
|
||||
}
|
||||
OP1( TAILCALL, parsePtr->numWords);
|
||||
TclEmitInstInt1( INST_TAILCALL, parsePtr->numWords, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -2776,10 +2721,9 @@ TclCompileThrowCmd(
|
||||
codeKnown = TclWordKnownAtCompileTime(codeToken, objPtr);
|
||||
|
||||
/*
|
||||
* First we must emit the code to substitute the arguments. This must
|
||||
* come first in case substitution raises errors.
|
||||
* First we must emit the code to substitute the arguments. This
|
||||
* must come first in case substitution raises errors.
|
||||
*/
|
||||
|
||||
if (!codeKnown) {
|
||||
CompileWord(envPtr, codeToken, interp, 1);
|
||||
PUSH( "-errorcode");
|
||||
@@ -2803,7 +2747,6 @@ TclCompileThrowCmd(
|
||||
/*
|
||||
* Simpler bytecodes when we detect invalid arguments at compile time.
|
||||
*/
|
||||
|
||||
if (codeKnown && !codeIsValid) {
|
||||
OP( POP);
|
||||
if (codeIsList) {
|
||||
@@ -2816,9 +2759,9 @@ TclCompileThrowCmd(
|
||||
|
||||
if (!codeKnown) {
|
||||
/*
|
||||
* Argument validity checking has to be done by bytecode at run time.
|
||||
* Argument validity checking has to be done by bytecode at
|
||||
* run time.
|
||||
*/
|
||||
|
||||
OP4( REVERSE, 3);
|
||||
OP( DUP);
|
||||
OP( LIST_LENGTH);
|
||||
@@ -2910,7 +2853,8 @@ TclCompileTryCmd(
|
||||
if (tokenPtr->type != TCL_TOKEN_SIMPLE_WORD) {
|
||||
goto failedToCompile;
|
||||
}
|
||||
if (IsTrapToken(&tokenPtr[1])) {
|
||||
if (tokenPtr[1].size == 4
|
||||
&& !strncmp(tokenPtr[1].start, "trap", 4)) {
|
||||
/*
|
||||
* Parse the list of errorCode words to match against.
|
||||
*/
|
||||
@@ -2927,7 +2871,8 @@ TclCompileTryCmd(
|
||||
}
|
||||
Tcl_ListObjReplace(NULL, tmpObj, 0, 0, 0, NULL);
|
||||
matchClauses[i] = tmpObj;
|
||||
} else if (IsOnToken(&tokenPtr[1])) {
|
||||
} else if (tokenPtr[1].size == 2
|
||||
&& !strncmp(tokenPtr[1].start, "on", 2)) {
|
||||
int code;
|
||||
|
||||
/*
|
||||
@@ -3001,7 +2946,7 @@ TclCompileTryCmd(
|
||||
if (tokenPtr->type != TCL_TOKEN_SIMPLE_WORD) {
|
||||
goto failedToCompile;
|
||||
}
|
||||
if (IsContinuationBody(&tokenPtr[1])) {
|
||||
if (tokenPtr[1].size == 1 && tokenPtr[1].start[0] == '-') {
|
||||
handlerTokens[i] = NULL;
|
||||
} else {
|
||||
handlerTokens[i] = tokenPtr;
|
||||
@@ -3022,8 +2967,8 @@ TclCompileTryCmd(
|
||||
if (numWords == 0) {
|
||||
finallyToken = NULL;
|
||||
} else if (numWords == 2) {
|
||||
if (tokenPtr->type != TCL_TOKEN_SIMPLE_WORD ||
|
||||
!IsFinallyToken(&tokenPtr[1])) {
|
||||
if (tokenPtr->type != TCL_TOKEN_SIMPLE_WORD || tokenPtr[1].size != 7
|
||||
|| strncmp(tokenPtr[1].start, "finally", 7)) {
|
||||
goto failedToCompile;
|
||||
}
|
||||
finallyToken = TokenAfter(tokenPtr);
|
||||
@@ -3928,16 +3873,16 @@ TclCompileWhileCmd(
|
||||
|
||||
jumpDist = CurrentOffset(envPtr) - bodyCodeOffset;
|
||||
if (jumpDist > 127) {
|
||||
OP4(JUMP_TRUE4, -jumpDist);
|
||||
TclEmitInstInt4(INST_JUMP_TRUE4, -jumpDist, envPtr);
|
||||
} else {
|
||||
OP1(JUMP_TRUE1, -jumpDist);
|
||||
TclEmitInstInt1(INST_JUMP_TRUE1, -jumpDist, envPtr);
|
||||
}
|
||||
} else {
|
||||
jumpDist = CurrentOffset(envPtr) - bodyCodeOffset;
|
||||
if (jumpDist > 127) {
|
||||
OP4(JUMP4, -jumpDist);
|
||||
TclEmitInstInt4(INST_JUMP4, -jumpDist, envPtr);
|
||||
} else {
|
||||
OP1(JUMP1, -jumpDist);
|
||||
TclEmitInstInt1(INST_JUMP1, -jumpDist, envPtr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4226,16 +4171,16 @@ CompileComparisonOpCmd(
|
||||
STORE(tmpIndex);
|
||||
TclEmitOpcode(instruction, envPtr);
|
||||
for (words=3 ; words<parsePtr->numWords ;) {
|
||||
LOAD( tmpIndex);
|
||||
LOAD(tmpIndex);
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, words);
|
||||
if (++words < parsePtr->numWords) {
|
||||
STORE( tmpIndex);
|
||||
STORE(tmpIndex);
|
||||
}
|
||||
TclEmitOpcode(instruction, envPtr);
|
||||
}
|
||||
for (; words>3 ; words--) {
|
||||
OP( BITAND);
|
||||
OP( BITAND);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4243,7 +4188,7 @@ CompileComparisonOpCmd(
|
||||
* might be expensive elsewhere.
|
||||
*/
|
||||
|
||||
OP14( UNSET_SCALAR, 0, tmpIndex);
|
||||
OP14( UNSET_SCALAR, 0, tmpIndex);
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -4369,7 +4314,7 @@ TclCompilePowOpCmd(
|
||||
words++;
|
||||
}
|
||||
while (--words > 1) {
|
||||
OP( EXPON);
|
||||
TclEmitOpcode(INST_EXPON, envPtr);
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -4569,11 +4514,11 @@ TclCompileMinusOpCmd(
|
||||
CompileWord(envPtr, tokenPtr, interp, words);
|
||||
}
|
||||
if (words == 2) {
|
||||
OP( UMINUS);
|
||||
TclEmitOpcode(INST_UMINUS, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
if (words == 3) {
|
||||
OP( SUB);
|
||||
TclEmitOpcode(INST_SUB, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -4582,10 +4527,10 @@ TclCompileMinusOpCmd(
|
||||
* calcuations, including roundoff errors.
|
||||
*/
|
||||
|
||||
OP4( REVERSE, words - 1);
|
||||
TclEmitInstInt4(INST_REVERSE, words-1, envPtr);
|
||||
while (--words > 1) {
|
||||
OP4( REVERSE, 2);
|
||||
OP( SUB);
|
||||
TclEmitInstInt4(INST_REVERSE, 2, envPtr);
|
||||
TclEmitOpcode(INST_SUB, envPtr);
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -4610,14 +4555,14 @@ TclCompileDivOpCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (parsePtr->numWords == 2) {
|
||||
PUSH( "1.0");
|
||||
PUSH("1.0");
|
||||
}
|
||||
for (words=1 ; words<parsePtr->numWords ; words++) {
|
||||
tokenPtr = TokenAfter(tokenPtr);
|
||||
CompileWord(envPtr, tokenPtr, interp, words);
|
||||
}
|
||||
if (words <= 3) {
|
||||
OP( DIV);
|
||||
TclEmitOpcode(INST_DIV, envPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -4626,10 +4571,10 @@ TclCompileDivOpCmd(
|
||||
* calcuations, including roundoff errors.
|
||||
*/
|
||||
|
||||
OP4( REVERSE, words - 1);
|
||||
TclEmitInstInt4(INST_REVERSE, words-1, envPtr);
|
||||
while (--words > 1) {
|
||||
OP4( REVERSE, 2);
|
||||
OP( DIV);
|
||||
TclEmitInstInt4(INST_REVERSE, 2, envPtr);
|
||||
TclEmitOpcode(INST_DIV, envPtr);
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
+77
-73
@@ -134,16 +134,15 @@ enum Marks {
|
||||
* need not take the form of a bit array.
|
||||
*/
|
||||
|
||||
enum {
|
||||
BINARY = 0x40, /* This lexeme is a binary operator. An OpNode
|
||||
#define BINARY 0x40 /* This lexeme is a binary operator. An OpNode
|
||||
* representing it should go into the parse
|
||||
* tree, and two operands should be parsed for
|
||||
* it in the expression. */
|
||||
UNARY = 0x80, /* This lexeme is a unary operator. An OpNode
|
||||
#define UNARY 0x80 /* This lexeme is a unary operator. An OpNode
|
||||
* representing it should go into the parse
|
||||
* tree, and one operand should be parsed for
|
||||
* it in the expression. */
|
||||
LEAF = 0xC0 /* This lexeme is a leaf operand in the parse
|
||||
#define LEAF 0xC0 /* This lexeme is a leaf operand in the parse
|
||||
* tree. No OpNode will be placed in the tree
|
||||
* for it. Either a literal value will be
|
||||
* appended to the list of literals in this
|
||||
@@ -151,46 +150,47 @@ enum {
|
||||
* be appended in a Tcl_Parse struct to
|
||||
* represent those leaves that require some
|
||||
* form of substitution. */
|
||||
};
|
||||
|
||||
/* Uncategorized lexemes */
|
||||
|
||||
enum {
|
||||
PLUS = 1, /* Ambiguous. Resolves to UNARY_PLUS or
|
||||
#define PLUS 1 /* Ambiguous. Resolves to UNARY_PLUS or
|
||||
* BINARY_PLUS according to context. */
|
||||
MINUS = 2, /* Ambiguous. Resolves to UNARY_MINUS or
|
||||
#define MINUS 2 /* Ambiguous. Resolves to UNARY_MINUS or
|
||||
* BINARY_MINUS according to context. */
|
||||
BAREWORD = 3, /* Ambigous. Resolves to BOOLEAN or to
|
||||
#define BAREWORD 3 /* Ambigous. Resolves to BOOLEAN or to
|
||||
* FUNCTION or a parse error according to
|
||||
* context and value. */
|
||||
INCOMPLETE = 4, /* A parse error. Used only when the single
|
||||
#define INCOMPLETE 4 /* A parse error. Used only when the single
|
||||
* "=" is encountered. */
|
||||
INVALID = 5, /* A parse error. Used when any punctuation
|
||||
#define INVALID 5 /* A parse error. Used when any punctuation
|
||||
* appears that's not a supported operator. */
|
||||
COMMENT = 6 /* Comment. Lasts to end of line or end of
|
||||
#define COMMENT 6 /* Comment. Lasts to end of line or end of
|
||||
* expression, whichever comes first. */
|
||||
};
|
||||
|
||||
/* Leaf lexemes */
|
||||
|
||||
enum {
|
||||
NUMBER = (LEAF | 1), /* For literal numbers */
|
||||
SCRIPT = (LEAF | 2), /* Script substitution; [foo] */
|
||||
BOOLEAN = (LEAF | BAREWORD),/* For literal booleans */
|
||||
BRACED = (LEAF | 4), /* Braced string; {foo bar} */
|
||||
VARIABLE = (LEAF | 5), /* Variable substitution; $x */
|
||||
QUOTED = (LEAF | 6), /* Quoted string; "foo $bar [soom]" */
|
||||
EMPTY = (LEAF | 7) /* Used only for an empty argument list to a
|
||||
#define NUMBER (LEAF | 1)
|
||||
/* For literal numbers */
|
||||
#define SCRIPT (LEAF | 2)
|
||||
/* Script substitution; [foo] */
|
||||
#define BOOLEAN (LEAF | BAREWORD)
|
||||
/* For literal booleans */
|
||||
#define BRACED (LEAF | 4)
|
||||
/* Braced string; {foo bar} */
|
||||
#define VARIABLE (LEAF | 5)
|
||||
/* Variable substitution; $x */
|
||||
#define QUOTED (LEAF | 6)
|
||||
/* Quoted string; "foo $bar [soom]" */
|
||||
#define EMPTY (LEAF | 7)
|
||||
/* Used only for an empty argument list to a
|
||||
* function. Represents the empty string
|
||||
* within parens in the expression: rand() */
|
||||
};
|
||||
|
||||
/* Unary operator lexemes */
|
||||
|
||||
enum {
|
||||
UNARY_PLUS = (UNARY | PLUS),
|
||||
UNARY_MINUS = (UNARY | MINUS),
|
||||
FUNCTION = (UNARY | BAREWORD),
|
||||
#define UNARY_PLUS (UNARY | PLUS)
|
||||
#define UNARY_MINUS (UNARY | MINUS)
|
||||
#define FUNCTION (UNARY | BAREWORD)
|
||||
/* This is a bit of "creative interpretation"
|
||||
* on the part of the parser. A function call
|
||||
* is parsed into the parse tree according to
|
||||
@@ -206,64 +206,69 @@ enum {
|
||||
* include such exceptional handling in the
|
||||
* code against the need we would otherwise
|
||||
* have for more lexeme categories. */
|
||||
START = (UNARY | 4), /* This lexeme isn't parsed from the
|
||||
#define START (UNARY | 4)
|
||||
/* This lexeme isn't parsed from the
|
||||
* expression text at all. It represents the
|
||||
* start of the expression and sits at the
|
||||
* root of the parse tree where it serves as
|
||||
* the start/end point of traversals. */
|
||||
OPEN_PAREN = (UNARY | 5), /* Another bit of creative interpretation,
|
||||
#define OPEN_PAREN (UNARY | 5)
|
||||
/* Another bit of creative interpretation,
|
||||
* where we treat "(" as a unary operator with
|
||||
* the sub-expression between it and its
|
||||
* matching ")" as its operand. See
|
||||
* CLOSE_PAREN below. */
|
||||
NOT = (UNARY | 6),
|
||||
BIT_NOT = (UNARY | 7)
|
||||
};
|
||||
#define NOT (UNARY | 6)
|
||||
#define BIT_NOT (UNARY | 7)
|
||||
|
||||
/* Binary operator lexemes */
|
||||
|
||||
enum {
|
||||
BINARY_PLUS = (BINARY | PLUS),
|
||||
BINARY_MINUS = (BINARY | MINUS),
|
||||
COMMA = (BINARY | 3), /* The "," operator is a low precedence binary
|
||||
#define BINARY_PLUS (BINARY | PLUS)
|
||||
#define BINARY_MINUS (BINARY | MINUS)
|
||||
#define COMMA (BINARY | 3)
|
||||
/* The "," operator is a low precedence binary
|
||||
* operator that separates the arguments in a
|
||||
* function call. The additional constraint
|
||||
* that this operator can only legally appear
|
||||
* at the right places within a function call
|
||||
* argument list are hard coded within
|
||||
* ParseExpr(). */
|
||||
MULT = (BINARY | 4),
|
||||
DIVIDE = (BINARY | 5),
|
||||
MOD = (BINARY | 6),
|
||||
LESS = (BINARY | 7),
|
||||
GREATER = (BINARY | 8),
|
||||
BIT_AND = (BINARY | 9),
|
||||
BIT_XOR = (BINARY | 10),
|
||||
BIT_OR = (BINARY | 11),
|
||||
QUESTION = (BINARY | 12), /* These two lexemes make up the */
|
||||
COLON = (BINARY | 13), /* ternary conditional operator, $x ? $y : $z.
|
||||
#define MULT (BINARY | 4)
|
||||
#define DIVIDE (BINARY | 5)
|
||||
#define MOD (BINARY | 6)
|
||||
#define LESS (BINARY | 7)
|
||||
#define GREATER (BINARY | 8)
|
||||
#define BIT_AND (BINARY | 9)
|
||||
#define BIT_XOR (BINARY | 10)
|
||||
#define BIT_OR (BINARY | 11)
|
||||
#define QUESTION (BINARY | 12)
|
||||
/* These two lexemes make up the */
|
||||
#define COLON (BINARY | 13)
|
||||
/* ternary conditional operator, $x ? $y : $z.
|
||||
* We treat them as two binary operators to
|
||||
* avoid another lexeme category, and code the
|
||||
* additional constraints directly in
|
||||
* ParseExpr(). For instance, the right
|
||||
* operand of a "?" operator must be a ":"
|
||||
* operator. */
|
||||
LEFT_SHIFT = (BINARY | 14),
|
||||
RIGHT_SHIFT = (BINARY | 15),
|
||||
LEQ = (BINARY | 16),
|
||||
GEQ = (BINARY | 17),
|
||||
EQUAL = (BINARY | 18),
|
||||
NEQ = (BINARY | 19),
|
||||
AND = (BINARY | 20),
|
||||
OR = (BINARY | 21),
|
||||
STREQ = (BINARY | 22),
|
||||
STRNEQ = (BINARY | 23),
|
||||
EXPON = (BINARY | 24), /* Unlike the other binary operators, EXPON is
|
||||
#define LEFT_SHIFT (BINARY | 14)
|
||||
#define RIGHT_SHIFT (BINARY | 15)
|
||||
#define LEQ (BINARY | 16)
|
||||
#define GEQ (BINARY | 17)
|
||||
#define EQUAL (BINARY | 18)
|
||||
#define NEQ (BINARY | 19)
|
||||
#define AND (BINARY | 20)
|
||||
#define OR (BINARY | 21)
|
||||
#define STREQ (BINARY | 22)
|
||||
#define STRNEQ (BINARY | 23)
|
||||
#define EXPON (BINARY | 24)
|
||||
/* Unlike the other binary operators, EXPON is
|
||||
* right associative and this distinction is
|
||||
* coded directly in ParseExpr(). */
|
||||
IN_LIST = (BINARY | 25),
|
||||
NOT_IN_LIST = (BINARY | 26),
|
||||
CLOSE_PAREN = (BINARY | 27),/* By categorizing the CLOSE_PAREN lexeme as a
|
||||
#define IN_LIST (BINARY | 25)
|
||||
#define NOT_IN_LIST (BINARY | 26)
|
||||
#define CLOSE_PAREN (BINARY | 27)
|
||||
/* By categorizing the CLOSE_PAREN lexeme as a
|
||||
* BINARY operator, the normal parsing rules
|
||||
* for binary operators assure that a close
|
||||
* paren will not directly follow another
|
||||
@@ -278,17 +283,17 @@ enum {
|
||||
* parse tree. The sub-expression between
|
||||
* parens becomes the single argument of the
|
||||
* matching OPEN_PAREN unary operator. */
|
||||
STR_LT = (BINARY | 28),
|
||||
STR_GT = (BINARY | 29),
|
||||
STR_LEQ = (BINARY | 30),
|
||||
STR_GEQ = (BINARY | 31),
|
||||
END = (BINARY | 32) /* This lexeme represents the end of the
|
||||
#define STR_LT (BINARY | 28)
|
||||
#define STR_GT (BINARY | 29)
|
||||
#define STR_LEQ (BINARY | 30)
|
||||
#define STR_GEQ (BINARY | 31)
|
||||
#define END (BINARY | 32)
|
||||
/* This lexeme represents the end of the
|
||||
* string being parsed. Treating it as a
|
||||
* binary operator follows the same logic as
|
||||
* the CLOSE_PAREN lexeme and END pairs with
|
||||
* START, in the same way that CLOSE_PAREN
|
||||
* pairs with OPEN_PAREN. */
|
||||
};
|
||||
|
||||
/*
|
||||
* When ParseExpr() builds the parse tree it must choose which operands to
|
||||
@@ -2104,7 +2109,7 @@ ParseLexeme(
|
||||
* Example: Inf + luence + () becomes a valid function call.
|
||||
* [Bug 3401704]
|
||||
*/
|
||||
if (TclHasIntRep(literal, &tclDoubleType)) {
|
||||
if (TclHasInternalRep(literal, &tclDoubleType)) {
|
||||
const char *p = start;
|
||||
|
||||
while (p < end) {
|
||||
@@ -2515,7 +2520,7 @@ CompileExprTree(
|
||||
* However, the design of the "global" and "local"
|
||||
* LiteralTable does not permit the value of lePtr->objPtr
|
||||
* to change. So rather than replace lePtr->objPtr, we do
|
||||
* surgery to transfer our desired intrep into it.
|
||||
* surgery to transfer our desired internalrep into it.
|
||||
*/
|
||||
|
||||
objPtr->typePtr = literal->typePtr;
|
||||
@@ -2528,9 +2533,9 @@ CompileExprTree(
|
||||
* When optimize==0, we know the expression is a one-off and
|
||||
* there's nothing to be gained from sharing literals when
|
||||
* they won't live long, and the copies we have already have
|
||||
* an appropriate intrep. In this case, skip literal
|
||||
* an appropriate internalrep. In this case, skip literal
|
||||
* registration that would enable sharing, and use the routine
|
||||
* that preserves intreps.
|
||||
* that preserves internalreps.
|
||||
*/
|
||||
|
||||
TclEmitPush(TclAddLiteralObj(envPtr, literal, NULL), envPtr);
|
||||
@@ -2567,7 +2572,7 @@ CompileExprTree(
|
||||
if ((tableValue->typePtr == NULL) &&
|
||||
(objPtr->typePtr != NULL)) {
|
||||
/*
|
||||
* Same intrep surgery as for OT_LITERAL.
|
||||
* Same internalrep surgery as for OT_LITERAL.
|
||||
*/
|
||||
|
||||
tableValue->typePtr = objPtr->typePtr;
|
||||
@@ -2675,10 +2680,9 @@ TclSortingOpCmd(
|
||||
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1));
|
||||
} else {
|
||||
TclOpCmdClientData *occdPtr = (TclOpCmdClientData *)clientData;
|
||||
Tcl_Obj **litObjv = (Tcl_Obj **) TclStackAlloc(interp,
|
||||
Tcl_Obj **litObjv = (Tcl_Obj **)TclStackAlloc(interp,
|
||||
2 * (objc-2) * sizeof(Tcl_Obj *));
|
||||
OpNode *nodes = (OpNode *)
|
||||
TclStackAlloc(interp, 2 * (objc-2) * sizeof(OpNode));
|
||||
OpNode *nodes = (OpNode *)TclStackAlloc(interp, 2 * (objc-2) * sizeof(OpNode));
|
||||
unsigned char lexeme;
|
||||
int i, lastAnd = 1;
|
||||
Tcl_Obj *const *litObjPtrPtr = litObjv;
|
||||
|
||||
+185
-196
@@ -717,8 +717,8 @@ static void EnterCmdWordData(ExtCmdLoc *eclPtr, int srcOffset,
|
||||
static void ReleaseCmdWordData(ExtCmdLoc *eclPtr);
|
||||
|
||||
/*
|
||||
* The structure below defines the bytecode Tcl object type by means of
|
||||
* procedures that can be invoked by generic object code.
|
||||
* tclByteCodeType provides the standard type management procedures for the
|
||||
* bytecode type.
|
||||
*/
|
||||
|
||||
const Tcl_ObjType tclByteCodeType = {
|
||||
@@ -730,8 +730,8 @@ const Tcl_ObjType tclByteCodeType = {
|
||||
};
|
||||
|
||||
/*
|
||||
* The structure below defines a bytecode Tcl object type to hold the
|
||||
* compiled bytecode for the [subst]itution of Tcl values.
|
||||
* subtCodeType provides the standard type managemnt procedures for the
|
||||
* substcode type, which represents substiution within a Tcl value.
|
||||
*/
|
||||
|
||||
static const Tcl_ObjType substCodeType = {
|
||||
@@ -756,16 +756,14 @@ static const Tcl_ObjType substCodeType = {
|
||||
* TclSetByteCodeFromAny --
|
||||
*
|
||||
* Part of the bytecode Tcl object type implementation. Attempts to
|
||||
* generate an byte code internal form for the Tcl object "objPtr" by
|
||||
* compiling its string representation. This function also takes a hook
|
||||
* procedure that will be invoked to perform any needed post processing
|
||||
* on the compilation results before generating byte codes. interp is
|
||||
* compile the string representation of the objPtr into bytecode. Accepts
|
||||
* a hook routine that is invoked to perform any needed post-processing on
|
||||
* the compilation results before generating byte codes. interp is the
|
||||
* compilation context and may not be NULL.
|
||||
*
|
||||
* Results:
|
||||
* The return value is a standard Tcl object result. If an error occurs
|
||||
* during compilation, an error message is left in the interpreter's
|
||||
* result.
|
||||
* A standard Tcl object result. If an error occurs during compilation, an
|
||||
* error message is left in the interpreter's result.
|
||||
*
|
||||
* Side effects:
|
||||
* Frees the old internal representation. If no error occurs, then the
|
||||
@@ -807,7 +805,7 @@ TclSetByteCodeFromAny(
|
||||
length = objPtr->length;
|
||||
|
||||
/*
|
||||
* TIP #280: Pick up the CmdFrame in which the BC compiler was invoked and
|
||||
* TIP #280: Pick up the CmdFrame in which the BC compiler was invoked, and
|
||||
* use to initialize the tracking in the compiler. This information was
|
||||
* stored by TclCompEvalObj and ProcCompileProc.
|
||||
*/
|
||||
@@ -816,15 +814,14 @@ TclSetByteCodeFromAny(
|
||||
iPtr->invokeCmdFramePtr, iPtr->invokeWord);
|
||||
|
||||
/*
|
||||
* Now we check if we have data about invisible continuation lines for the
|
||||
* script, and make it available to the compile environment, if so.
|
||||
* Make available to the compilation environment any data about invisible
|
||||
* continuation lines for the script.
|
||||
*
|
||||
* It is not clear if the script Tcl_Obj* can be free'd while the compiler
|
||||
* is using it, leading to the release of the associated ContLineLoc
|
||||
* structure as well. To ensure that the latter doesn't happen we set a
|
||||
* lock on it. We release this lock in the function TclFreeCompileEnv(),
|
||||
* found in this file. The "lineCLPtr" hashtable is managed in the file
|
||||
* "tclObj.c".
|
||||
* structure as well. To ensure that the latter doesn't happen set a lock
|
||||
* on it, which is released in TclFreeCompileEnv(). The "lineCLPtr"
|
||||
* hashtable tclObj.c.
|
||||
*/
|
||||
|
||||
clLocPtr = TclContinuationsGet(objPtr);
|
||||
@@ -835,7 +832,7 @@ TclSetByteCodeFromAny(
|
||||
TclCompileScript(interp, stringPtr, length, &compEnv);
|
||||
|
||||
/*
|
||||
* Successful compilation. Add a "done" instruction at the end.
|
||||
* Compilation succeeded. Add a "done" instruction at the end.
|
||||
*/
|
||||
|
||||
TclEmitOpcode(INST_DONE, &compEnv);
|
||||
@@ -843,9 +840,9 @@ TclSetByteCodeFromAny(
|
||||
/*
|
||||
* Check for optimizations!
|
||||
*
|
||||
* Test if the generated code is free of most hazards; if so, recompile
|
||||
* but with generation of INST_START_CMD disabled. This produces somewhat
|
||||
* faster code in some cases, and more compact code in more.
|
||||
* If the generated code is free of most hazards, recompile with generation
|
||||
* of INST_START_CMD disabled to produce code that more compact in many
|
||||
* cases, and also sometimes more performant.
|
||||
*/
|
||||
|
||||
if (Tcl_GetParent(interp) == NULL &&
|
||||
@@ -875,7 +872,7 @@ TclSetByteCodeFromAny(
|
||||
}
|
||||
|
||||
/*
|
||||
* Invoke the compilation hook procedure if one exists.
|
||||
* Invoke the compilation hook procedure if there is one.
|
||||
*/
|
||||
|
||||
if (hookProc) {
|
||||
@@ -884,7 +881,7 @@ TclSetByteCodeFromAny(
|
||||
|
||||
/*
|
||||
* Change the object into a ByteCode object. Ownership of the literal
|
||||
* objects and aux data items is given to the ByteCode object.
|
||||
* objects and aux data items passes to the ByteCode object.
|
||||
*/
|
||||
|
||||
#ifdef TCL_COMPILE_DEBUG
|
||||
@@ -915,12 +912,12 @@ TclSetByteCodeFromAny(
|
||||
* compiling its string representation.
|
||||
*
|
||||
* Results:
|
||||
* The return value is a standard Tcl object result. If an error occurs
|
||||
* during compilation, an error message is left in the interpreter's
|
||||
* result unless "interp" is NULL.
|
||||
* A standard Tcl object result. If an error occurs during compilation and
|
||||
* "interp" is not null, an error message is left in the interpreter's
|
||||
* result.
|
||||
*
|
||||
* Side effects:
|
||||
* Frees the old internal representation. If no error occurs, then the
|
||||
* Frees the old internal representation. If no error occurs then the
|
||||
* compiled code is stored as "objPtr"s bytecode representation. Also, if
|
||||
* debugging, initializes the "tcl_traceCompile" Tcl variable used to
|
||||
* trace compilations.
|
||||
@@ -932,7 +929,7 @@ static int
|
||||
SetByteCodeFromAny(
|
||||
Tcl_Interp *interp, /* The interpreter for which the code is being
|
||||
* compiled. Must not be NULL. */
|
||||
Tcl_Obj *objPtr) /* The object to make a ByteCode object. */
|
||||
Tcl_Obj *objPtr) /* The object to compile to bytecode */
|
||||
{
|
||||
if (interp == NULL) {
|
||||
return TCL_ERROR;
|
||||
@@ -946,9 +943,9 @@ SetByteCodeFromAny(
|
||||
* DupByteCodeInternalRep --
|
||||
*
|
||||
* Part of the bytecode Tcl object type implementation. However, it does
|
||||
* not copy the internal representation of a bytecode Tcl_Obj, but
|
||||
* instead leaves the new object untyped (with a NULL type pointer).
|
||||
* Code will be compiled for the new object only if necessary.
|
||||
* not copy the internal representation of a bytecode Tcl_Obj, instead
|
||||
* assigning NULL to the type pointer of the new object. Code is compiled
|
||||
* for the new object only if necessary.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
@@ -980,9 +977,9 @@ DupByteCodeInternalRep(
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* The bytecode object's internal rep is marked invalid and its code gets
|
||||
* freed unless the code is actively being executed. In that case the
|
||||
* cleanup is delayed until the last execution of the code completes.
|
||||
* The bytecode object's internal rep is invalidated and its code is freed
|
||||
* unless the code is actively being executed, in which case cleanup is
|
||||
* delayed until the last execution of the code completes.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
@@ -993,7 +990,7 @@ FreeByteCodeInternalRep(
|
||||
{
|
||||
ByteCode *codePtr;
|
||||
|
||||
ByteCodeGetIntRep(objPtr, &tclByteCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &tclByteCodeType, codePtr);
|
||||
assert(codePtr != NULL);
|
||||
|
||||
TclReleaseByteCode(codePtr);
|
||||
@@ -1004,16 +1001,16 @@ FreeByteCodeInternalRep(
|
||||
*
|
||||
* TclReleaseByteCode --
|
||||
*
|
||||
* This procedure does all the real work of freeing up a bytecode
|
||||
* object's ByteCode structure. It's called only when the structure's
|
||||
* reference count becomes zero.
|
||||
* Does all the real work of freeing up a bytecode object's ByteCode
|
||||
* structure. Called only when the structure's reference count
|
||||
* is zero.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* Frees objPtr's bytecode internal representation and sets its type NULL
|
||||
* Also releases its literals and frees its auxiliary data items.
|
||||
* Frees objPtr's bytecode internal representation and sets its type to
|
||||
* NULL. Also releases its literals and frees its auxiliary data items.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
@@ -1089,8 +1086,8 @@ CleanupByteCode(
|
||||
/*
|
||||
* A single heap object holds the ByteCode structure and its code, object,
|
||||
* command location, and auxiliary data arrays. This means we only need to
|
||||
* 1) decrement the ref counts of the LiteralEntry's in its literal array,
|
||||
* 2) call the free procs for the auxiliary data items, 3) free the
|
||||
* 1) decrement the ref counts of each LiteralEntry in the literal array,
|
||||
* 2) call the free procedures for the auxiliary data items, 3) free the
|
||||
* localCache if it is unused, and finally 4) free the ByteCode
|
||||
* structure's heap object.
|
||||
*
|
||||
@@ -1099,11 +1096,11 @@ CleanupByteCode(
|
||||
* the global literal table. They instead maintain private references to
|
||||
* their literals which must be decremented.
|
||||
*
|
||||
* In order to insure a proper and efficient cleanup of the literal array
|
||||
* when it contains non-shared literals [Bug 983660], we also distinguish
|
||||
* the case of an interpreter being deleted (signaled by interp == NULL).
|
||||
* In order to ensure proper and efficient cleanup of the literal array
|
||||
* when it contains non-shared literals [Bug 983660], distinguish the case
|
||||
* of an interpreter being deleted, which is signaled by interp == NULL.
|
||||
* Also, as the interp deletion will remove the global literal table
|
||||
* anyway, we avoid the extra cost of updating it for each literal being
|
||||
* anyway, avoid the extra cost of updating it for each literal being
|
||||
* released.
|
||||
*/
|
||||
|
||||
@@ -1135,9 +1132,9 @@ CleanupByteCode(
|
||||
}
|
||||
|
||||
/*
|
||||
* TIP #280. Release the location data associated with this byte code
|
||||
* structure, if any. NOTE: The interp we belong to may be gone already,
|
||||
* and the data with it.
|
||||
* TIP #280. Release the location data associated with this bytecode
|
||||
* structure, if any. The associated interp may be gone already, and the
|
||||
* data with it.
|
||||
*
|
||||
* See also tclBasic.c, DeleteInterpProc
|
||||
*/
|
||||
@@ -1165,8 +1162,8 @@ CleanupByteCode(
|
||||
*
|
||||
* IsCompactibleCompileEnv --
|
||||
*
|
||||
* Checks to see if we may apply some basic compaction optimizations to a
|
||||
* piece of bytecode. Idempotent.
|
||||
* Determines whether some basic compaction optimizations may be applied
|
||||
* to a piece of bytecode. Idempotent.
|
||||
*
|
||||
* ---------------------------------------------------------------------
|
||||
*/
|
||||
@@ -1180,7 +1177,7 @@ IsCompactibleCompileEnv(
|
||||
|
||||
/*
|
||||
* Special: procedures in the '::tcl' namespace (or its children) are
|
||||
* considered to be well-behaved and so can have compaction applied even
|
||||
* considered to be well-behaved, so compaction can be applied to them even
|
||||
* if it would otherwise be invalid.
|
||||
*/
|
||||
|
||||
@@ -1196,10 +1193,10 @@ IsCompactibleCompileEnv(
|
||||
|
||||
/*
|
||||
* Go through and ensure that no operation involved can cause a desired
|
||||
* change of bytecode sequence during running. This comes down to ensuring
|
||||
* that there are no mapped variables (due to traces) or calls to external
|
||||
* commands (traces, [uplevel] trickery). This is actually a very
|
||||
* conservative check; it turns down a lot of code that is OK in practice.
|
||||
* change of bytecode sequence during its execution. This comes down to
|
||||
* ensuring that there are no mapped variables (due to traces) or calls to
|
||||
* external commands (traces, [uplevel] trickery). This is actually a very
|
||||
* conservative check. It turns down a lot of code that is OK in practice.
|
||||
*/
|
||||
|
||||
for (pc = envPtr->codeStart ; pc < envPtr->codeNext ; pc += size) {
|
||||
@@ -1235,8 +1232,8 @@ IsCompactibleCompileEnv(
|
||||
*
|
||||
* Tcl_SubstObj --
|
||||
*
|
||||
* This function performs the substitutions specified on the given string
|
||||
* as described in the user documentation for the "subst" Tcl command.
|
||||
* Performs substitutions on the given string as described in the user
|
||||
* documentation for "subst".
|
||||
*
|
||||
* Results:
|
||||
* A Tcl_Obj* containing the substituted string, or NULL to indicate that
|
||||
@@ -1268,14 +1265,14 @@ Tcl_SubstObj(
|
||||
*
|
||||
* Tcl_NRSubstObj --
|
||||
*
|
||||
* Request substitution of a Tcl value by the NR stack.
|
||||
* Adds substitution within the value of objPtr to the NR execution stack.
|
||||
*
|
||||
* Results:
|
||||
* Returns TCL_OK.
|
||||
* TCL_OK.
|
||||
*
|
||||
* Side effects:
|
||||
* Compiles objPtr into bytecode that performs the substitutions as
|
||||
* governed by flags and places callbacks on the NR stack to execute
|
||||
* governed by flags, adds a callback to the NR execution stack to execute
|
||||
* the bytecode and store the result in the interp.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
@@ -1299,11 +1296,11 @@ Tcl_NRSubstObj(
|
||||
*
|
||||
* CompileSubstObj --
|
||||
*
|
||||
* Compile a Tcl value into ByteCode implementing its substitution, as
|
||||
* governed by flags.
|
||||
* Compiles a value into bytecode that performs substitution within the
|
||||
* value, as governed by flags.
|
||||
*
|
||||
* Results:
|
||||
* A (ByteCode *) is returned pointing to the resulting ByteCode.
|
||||
* A (ByteCode *) is pointing to the resulting ByteCode.
|
||||
*
|
||||
* Side effects:
|
||||
* The Tcl_ObjType of objPtr is changed to the "substcode" type, and the
|
||||
@@ -1323,7 +1320,7 @@ CompileSubstObj(
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
ByteCode *codePtr = NULL;
|
||||
|
||||
ByteCodeGetIntRep(objPtr, &substCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &substCodeType, codePtr);
|
||||
|
||||
if (codePtr != NULL) {
|
||||
Namespace *nsPtr = iPtr->varFramePtr->nsPtr;
|
||||
@@ -1335,7 +1332,7 @@ CompileSubstObj(
|
||||
|| (codePtr->nsEpoch != nsPtr->resolverEpoch)
|
||||
|| (codePtr->localCachePtr !=
|
||||
iPtr->varFramePtr->localCachePtr)) {
|
||||
Tcl_StoreIntRep(objPtr, &substCodeType, NULL);
|
||||
Tcl_StoreInternalRep(objPtr, &substCodeType, NULL);
|
||||
codePtr = NULL;
|
||||
}
|
||||
}
|
||||
@@ -1373,9 +1370,9 @@ CompileSubstObj(
|
||||
*
|
||||
* FreeSubstCodeInternalRep --
|
||||
*
|
||||
* Part of the substcode Tcl object type implementation. Frees the
|
||||
* storage associated with a substcode object's internal representation
|
||||
* unless its code is actively being executed.
|
||||
* Part of the "substcode" Tcl object type implementation. Frees the
|
||||
* storage associated with the substcode internal representation of a
|
||||
* Tcl_Obj unless its code is actively being executed.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
@@ -1394,7 +1391,7 @@ FreeSubstCodeInternalRep(
|
||||
{
|
||||
ByteCode *codePtr;
|
||||
|
||||
ByteCodeGetIntRep(objPtr, &substCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &substCodeType, codePtr);
|
||||
assert(codePtr != NULL);
|
||||
|
||||
TclReleaseByteCode(codePtr);
|
||||
@@ -1629,14 +1626,14 @@ TclInitCompileEnv(
|
||||
*
|
||||
* TclFreeCompileEnv --
|
||||
*
|
||||
* Free the storage allocated in a CompileEnv compilation environment
|
||||
* Frees the storage allocated in a CompileEnv compilation environment
|
||||
* structure.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* Allocated storage in the CompileEnv structure is freed. Note that its
|
||||
* Allocated storage in the CompileEnv structure is freed, although its
|
||||
* local literal table is not deleted and its literal objects are not
|
||||
* released. In addition, storage referenced by its auxiliary data items
|
||||
* is not freed. This is done so that, when compilation is successful,
|
||||
@@ -1707,10 +1704,11 @@ TclFreeCompileEnv(
|
||||
*
|
||||
* TclWordKnownAtCompileTime --
|
||||
*
|
||||
* Test whether the value of a token is completely known at compile time.
|
||||
* Determines whether the value of a token is completely known at compile
|
||||
* time.
|
||||
*
|
||||
* Results:
|
||||
* Returns true if the tokenPtr argument points to a word value that is
|
||||
* True if the tokenPtr argument points to a word value that is
|
||||
* completely known at compile time. Generally, values that are known at
|
||||
* compile time can be compiled to their values, while values that cannot
|
||||
* be known until substitution at runtime must be compiled to bytecode
|
||||
@@ -1787,12 +1785,12 @@ TclWordKnownAtCompileTime(
|
||||
*
|
||||
* TclCompileScript --
|
||||
*
|
||||
* Compile a Tcl script in a string.
|
||||
* Compiles a Tcl script in a string.
|
||||
*
|
||||
* Results:
|
||||
* The return value is TCL_OK on a successful compilation and TCL_ERROR
|
||||
* on failure. If TCL_ERROR is returned, then the interpreter's result
|
||||
* contains an error message.
|
||||
*
|
||||
* A standard Tcl result. If an error occurs, an
|
||||
* error message is left in the interpreter's result.
|
||||
*
|
||||
* Side effects:
|
||||
* Adds instructions to envPtr to evaluate the script at runtime.
|
||||
@@ -1929,14 +1927,14 @@ CompileExpanded(
|
||||
/*
|
||||
* The stack depth during argument expansion can only be managed at
|
||||
* runtime, as the number of elements in the expanded lists is not known
|
||||
* at compile time. We adjust here the stack depth estimate so that it is
|
||||
* at compile time. Adjust the stack depth estimate here so that it is
|
||||
* correct after the command with expanded arguments returns.
|
||||
*
|
||||
* The end effect of this command's invocation is that all the words of
|
||||
* the command are popped from the stack, and the result is pushed: the
|
||||
* the command are popped from the stack and the result is pushed: The
|
||||
* stack top changes by (1-wordIdx).
|
||||
*
|
||||
* Note that the estimates are not correct while the command is being
|
||||
* The estimates are not correct while the command is being
|
||||
* prepared and run, INST_EXPAND_STKTOP is not stack-neutral in general.
|
||||
*/
|
||||
|
||||
@@ -1956,16 +1954,16 @@ CompileCmdCompileProc(
|
||||
int depth = TclGetStackDepth(envPtr);
|
||||
|
||||
/*
|
||||
* Emit of the INST_START_CMD instruction is controlled by the value of
|
||||
* Emission of the INST_START_CMD instruction is controlled by the value of
|
||||
* envPtr->atCmdStart:
|
||||
*
|
||||
* atCmdStart == 2 : We are not using the INST_START_CMD instruction.
|
||||
* atCmdStart == 1 : INST_START_CMD was the last instruction emitted.
|
||||
* : We do not need to emit another. Instead we
|
||||
* : increment the number of cmds started at it (except
|
||||
* : for the special case at the start of a script.)
|
||||
* atCmdStart == 0 : The last instruction was something else. We need
|
||||
* : to emit INST_START_CMD here.
|
||||
* atCmdStart == 2 : Don't use the INST_START_CMD instruction.
|
||||
* atCmdStart == 1 : INST_START_CMD was the last instruction emitted,
|
||||
* : so no need to emit another. Instead
|
||||
* : increment the number of cmds started at it, except
|
||||
* : for the special case at the start of a script.
|
||||
* atCmdStart == 0 : The last instruction was something else.
|
||||
* : Emit INST_START_CMD here.
|
||||
*/
|
||||
|
||||
switch (envPtr->atCmdStart) {
|
||||
@@ -1988,7 +1986,7 @@ CompileCmdCompileProc(
|
||||
if (TCL_OK == TclAttemptCompileProc(interp, parsePtr, 1, cmdPtr, envPtr)) {
|
||||
if (incrOffset >= 0) {
|
||||
/*
|
||||
* We successfully compiled a command. Increment the number of
|
||||
* Command compiled succesfully. Increment the number of
|
||||
* commands that start at the currently active INST_START_CMD.
|
||||
*/
|
||||
|
||||
@@ -2057,7 +2055,7 @@ CompileCommandTokens(
|
||||
|
||||
/*
|
||||
* TIP #280. Scan the words and compute the extended location information.
|
||||
* The map first contain full per-word line information for use by the
|
||||
* At first the map first contains full per-word line information for use by the
|
||||
* compiler. This is later replaced by a reduced form which signals
|
||||
* non-literal words, stored in 'wlines'.
|
||||
*/
|
||||
@@ -2099,7 +2097,7 @@ CompileCommandTokens(
|
||||
}
|
||||
}
|
||||
|
||||
/* If cmdPtr != NULL, we will try to call cmdPtr->compileProc */
|
||||
/* If cmdPtr != NULL, try to call cmdPtr->compileProc */
|
||||
if (cmdPtr) {
|
||||
code = CompileCmdCompileProc(interp, parsePtr, cmdPtr, envPtr);
|
||||
}
|
||||
@@ -2126,8 +2124,8 @@ CompileCommandTokens(
|
||||
(envPtr->codeNext-envPtr->codeStart) - startCodeOffset);
|
||||
|
||||
/*
|
||||
* TIP #280: Free full form of per-word line data and insert the reduced
|
||||
* form now
|
||||
* TIP #280: Free the full form of per-word line data and insert the
|
||||
* reduced form now.
|
||||
*/
|
||||
|
||||
envPtr->line = cmdLine;
|
||||
@@ -2165,10 +2163,10 @@ TclCompileScript(
|
||||
}
|
||||
/*
|
||||
* Check depth to avoid overflow of the C execution stack by too many
|
||||
* nested calls of TclCompileScript (considering interp recursionlimit).
|
||||
* Factor 5/4 (1.25) is used to avoid too mistaken limit recognition
|
||||
* during "mixed" evaluation and compilation process (nested eval+compile)
|
||||
* and is good enough for default recursionlimit (1000).
|
||||
* nested calls of TclCompileScript, considering interp recursionlimit.
|
||||
* Use factor 5/4 (1.25) to avoid being too mistaken when recognizing the
|
||||
* limit during "mixed" evaluation and compilation process (nested
|
||||
* eval+compile) and is good enough for default recursionlimit (1000).
|
||||
*/
|
||||
if (iPtr->numLevels / 5 > iPtr->maxNestingDepth / 4) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
@@ -2311,8 +2309,8 @@ TclCompileScript(
|
||||
*
|
||||
* TclCompileTokens --
|
||||
*
|
||||
* Given an array of tokens parsed from a Tcl command (e.g., the tokens
|
||||
* that make up a word) this procedure emits instructions to evaluate the
|
||||
* Given an array of tokens parsed from a Tcl command, e.g. the tokens
|
||||
* that make up a word, emits instructions to evaluate the
|
||||
* tokens and concatenate their values to form a single result value on
|
||||
* the interpreter's runtime evaluation stack.
|
||||
*
|
||||
@@ -2417,18 +2415,16 @@ TclCompileTokens(
|
||||
int depth = TclGetStackDepth(envPtr);
|
||||
|
||||
/*
|
||||
* For the handling of continuation lines in literals we first check if
|
||||
* this is actually a literal. For if not we can forego the additional
|
||||
* processing. Otherwise we pre-allocate a small table to store the
|
||||
* locations of all continuation lines we find in this literal, if any.
|
||||
* The table is extended if needed.
|
||||
* if this is actually a literal, handle continuation lines by
|
||||
* preallocating a small table to store the locations of any continuation
|
||||
* lines we find in this literal. The table is extended if needed.
|
||||
*
|
||||
* Note: Different to the equivalent code in function 'TclSubstTokens()'
|
||||
* (see file "tclParse.c") we do not seem to need the 'adjust' variable.
|
||||
* We also do not seem to need code which merges continuation line
|
||||
* information of multiple words which concat'd at runtime. Either that or
|
||||
* I have not managed to find a test case for these two possibilities yet.
|
||||
* It might be a difference between compile- versus run-time processing.
|
||||
* Note: In contrast with the analagous code in 'TclSubstTokens()' the
|
||||
* 'adjust' variable seems unneeded here. The code which merges
|
||||
* continuation line information of multiple words which concat'd at
|
||||
* runtime also seems unneeded. Either that or I have not managed to find a
|
||||
* test case for these two possibilities yet. It might be a difference
|
||||
* between compile- versus run-time processing.
|
||||
*/
|
||||
|
||||
numCL = 0;
|
||||
@@ -2464,18 +2460,17 @@ TclCompileTokens(
|
||||
Tcl_DStringAppend(&textBuffer, buffer, length);
|
||||
|
||||
/*
|
||||
* If the backslash sequence we found is in a literal, and
|
||||
* represented a continuation line, we compute and store its
|
||||
* If the identified backslash sequence is in a literal and
|
||||
* represented a continuation line, compute and store its
|
||||
* location (as char offset to the beginning of the _result_
|
||||
* script). We may have to extend the table of locations.
|
||||
*
|
||||
* Note that the continuation line information is relevant even if
|
||||
* the word we are processing is not a literal, as it can affect
|
||||
* nested commands. See the branch for TCL_TOKEN_COMMAND below,
|
||||
* where the adjustment we are tracking here is taken into
|
||||
* account. The good thing is that we do not need a table of
|
||||
* everything, just the number of lines we have to add as
|
||||
* correction.
|
||||
* The continuation line information is relevant even if the word
|
||||
* being processed is not a literal, as it can affect nested
|
||||
* commands. See the branch below for TCL_TOKEN_COMMAND, where the
|
||||
* adjustment being tracked here is taken into account. The good
|
||||
* thing is a table of everything is not needed, just the number of
|
||||
* lines to to add as correction.
|
||||
*/
|
||||
|
||||
if ((length == 1) && (buffer[0] == ' ') &&
|
||||
@@ -2601,13 +2596,13 @@ TclCompileTokens(
|
||||
* TclCompileCmdWord --
|
||||
*
|
||||
* Given an array of parse tokens for a word containing one or more Tcl
|
||||
* commands, emit inline instructions to execute them. This procedure
|
||||
* differs from TclCompileTokens in that a simple word such as a loop
|
||||
* body enclosed in braces is not just pushed as a string, but is itself
|
||||
* parsed into tokens and compiled.
|
||||
* commands, emits inline instructions to execute them. In contrast with
|
||||
* TclCompileTokens, a simple word such as a loop body enclosed in braces
|
||||
* is not just pushed as a string, but is itself parsed into tokens and
|
||||
* compiled.
|
||||
*
|
||||
* Results:
|
||||
* The return value is a standard Tcl result. If an error occurs, an
|
||||
* A standard Tcl result. If an error occurs, an
|
||||
* error message is left in the interpreter's result.
|
||||
*
|
||||
* Side effects:
|
||||
@@ -2627,16 +2622,16 @@ TclCompileCmdWord(
|
||||
{
|
||||
if ((count == 1) && (tokenPtr->type == TCL_TOKEN_TEXT)) {
|
||||
/*
|
||||
* Handle the common case: if there is a single text token, compile it
|
||||
* The common case that there is a single text token. Compile it
|
||||
* into an inline sequence of instructions.
|
||||
*/
|
||||
|
||||
TclCompileScript(interp, tokenPtr->start, tokenPtr->size, envPtr);
|
||||
} else {
|
||||
/*
|
||||
* Multiple tokens or the single token involves substitutions. Emit
|
||||
* instructions to invoke the eval command procedure at runtime on the
|
||||
* result of evaluating the tokens.
|
||||
* Either there are multiple tokens, or the single token involves
|
||||
* substitutions. Emit instructions to invoke the eval command
|
||||
* procedure at runtime on the result of evaluating the tokens.
|
||||
*/
|
||||
|
||||
TclCompileTokens(interp, tokenPtr, count, envPtr);
|
||||
@@ -2650,13 +2645,12 @@ TclCompileCmdWord(
|
||||
* TclCompileExprWords --
|
||||
*
|
||||
* Given an array of parse tokens representing one or more words that
|
||||
* contain a Tcl expression, emit inline instructions to execute the
|
||||
* expression. This procedure differs from TclCompileExpr in that it
|
||||
* supports Tcl's two-level substitution semantics for expressions that
|
||||
* appear as command words.
|
||||
* contain a Tcl expression, emits inline instructions to execute the
|
||||
* expression. In contrast with TclCompileExpr, supports Tcl's two-level
|
||||
* substitution semantics for an expression that appears as command words.
|
||||
*
|
||||
* Results:
|
||||
* The return value is a standard Tcl result. If an error occurs, an
|
||||
* A standard Tcl result. If an error occurs, an
|
||||
* error message is left in the interpreter's result.
|
||||
*
|
||||
* Side effects:
|
||||
@@ -2718,10 +2712,10 @@ TclCompileExprWords(
|
||||
*
|
||||
* TclCompileNoOp --
|
||||
*
|
||||
* Function called to compile no-op's
|
||||
* Compiles no-op's
|
||||
*
|
||||
* Results:
|
||||
* The return value is TCL_OK, indicating successful compilation.
|
||||
* TCL_OK if completion was successful.
|
||||
*
|
||||
* Side effects:
|
||||
* Instructions are added to envPtr to execute a no-op at runtime. No
|
||||
@@ -2760,14 +2754,14 @@ TclCompileNoOp(
|
||||
*
|
||||
* TclInitByteCodeObj --
|
||||
*
|
||||
* Create a ByteCode structure and initialize it from a CompileEnv
|
||||
* Creates a ByteCode structure and initializes it from a CompileEnv
|
||||
* compilation environment structure. The ByteCode structure is smaller
|
||||
* and contains just that information needed to execute the bytecode
|
||||
* instructions resulting from compiling a Tcl script. The resulting
|
||||
* structure is placed in the specified object.
|
||||
*
|
||||
* Results:
|
||||
* A newly constructed ByteCode object is stored in the internal
|
||||
* A newly-constructed ByteCode object is stored in the internal
|
||||
* representation of the objPtr.
|
||||
*
|
||||
* Side effects:
|
||||
@@ -2790,7 +2784,7 @@ PreventCycle(
|
||||
for (i = 0; i < envPtr->literalArrayNext; i++) {
|
||||
if (objPtr == TclFetchLiteral(envPtr, i)) {
|
||||
/*
|
||||
* Prevent circular reference where the bytecode intrep of
|
||||
* Prevent circular reference where the bytecode internalrep of
|
||||
* a value contains a literal which is that same value.
|
||||
* If this is allowed to happen, refcount decrements may not
|
||||
* reach zero, and memory may leak. Bugs 467523, 3357771
|
||||
@@ -2798,7 +2792,7 @@ PreventCycle(
|
||||
* NOTE: [Bugs 3392070, 3389764] We make a copy based completely
|
||||
* on the string value, and do not call Tcl_DuplicateObj() so we
|
||||
* can be sure we do not have any lingering cycles hiding in
|
||||
* the intrep.
|
||||
* the internalrep.
|
||||
*/
|
||||
int numBytes;
|
||||
const char *bytes = TclGetStringFromObj(objPtr, &numBytes);
|
||||
@@ -2969,7 +2963,7 @@ TclInitByteCodeObj(
|
||||
* by making its internal rep point to the just compiled ByteCode.
|
||||
*/
|
||||
|
||||
ByteCodeSetIntRep(objPtr, typePtr, codePtr);
|
||||
ByteCodeSetInternalRep(objPtr, typePtr, codePtr);
|
||||
return codePtr;
|
||||
}
|
||||
|
||||
@@ -3102,16 +3096,15 @@ TclFindCompiledLocal(
|
||||
*
|
||||
* TclExpandCodeArray --
|
||||
*
|
||||
* Procedure that uses malloc to allocate more storage for a CompileEnv's
|
||||
* code array.
|
||||
* Uses malloc to allocate more storage for a CompileEnv's code array.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* The byte code array in *envPtr is reallocated to a new array of double
|
||||
* the size, and if envPtr->mallocedCodeArray is non-zero the old array
|
||||
* is freed. Byte codes are copied from the old array to the new one.
|
||||
* The size of the bytecode array is doubled. If envPtr->mallocedCodeArray
|
||||
* is non-zero the old array is freed. Byte codes are copied from the old
|
||||
* array to the new one.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
@@ -3138,8 +3131,8 @@ TclExpandCodeArray(
|
||||
envPtr->codeStart = (unsigned char *)ckrealloc(envPtr->codeStart, newBytes);
|
||||
} else {
|
||||
/*
|
||||
* envPtr->codeStart isn't a ckalloc'd pointer, so we must code a
|
||||
* ckrealloc equivalent for ourselves.
|
||||
* envPtr->exceptArrayPtr isn't a Tcl_Alloc'd pointer, so
|
||||
* perform the equivalent of Tcl_Realloc directly.
|
||||
*/
|
||||
|
||||
unsigned char *newPtr = (unsigned char *)ckalloc(newBytes);
|
||||
@@ -3455,7 +3448,7 @@ TclCreateExceptRange(
|
||||
* TclGetInnermostExceptionRange --
|
||||
*
|
||||
* Returns the innermost exception range that covers the current code
|
||||
* creation point, and (optionally) the stack depth that is expected at
|
||||
* creation point, and optionally the stack depth that is expected at
|
||||
* that point. Relies on the fact that the range has a numCodeBytes = -1
|
||||
* when it is being populated and that inner ranges come after outer
|
||||
* ranges.
|
||||
@@ -3497,7 +3490,7 @@ TclGetInnermostExceptionRange(
|
||||
*
|
||||
* Adds a place that wants to break/continue to the loop exception range
|
||||
* tracking that will be fixed up once the loop can be finalized. These
|
||||
* functions will generate an INST_JUMP4 that will be fixed up during the
|
||||
* functions generate an INST_JUMP4 that is fixed up during the
|
||||
* loop finalization.
|
||||
*
|
||||
* ---------------------------------------------------------------------
|
||||
@@ -3561,8 +3554,8 @@ TclAddLoopContinueFixup(
|
||||
*
|
||||
* TclCleanupStackForBreakContinue --
|
||||
*
|
||||
* Ditch the extra elements from the auxiliary stack and the main stack.
|
||||
* How to do this exactly depends on whether there are any elements on
|
||||
* Removes the extra elements from the auxiliary stack and the main stack.
|
||||
* How this is done depends on whether there are any elements on
|
||||
* the auxiliary stack to pop.
|
||||
*
|
||||
* ---------------------------------------------------------------------
|
||||
@@ -3632,7 +3625,7 @@ StartExpanding(
|
||||
}
|
||||
|
||||
/*
|
||||
* Adequate condition: further out loops and further in exceptions
|
||||
* Adequate condition: loops further out and exceptions further in
|
||||
* don't actually need this information.
|
||||
*/
|
||||
|
||||
@@ -3642,7 +3635,7 @@ StartExpanding(
|
||||
}
|
||||
|
||||
/*
|
||||
* There's now one more expansion being processed on the auxiliary stack.
|
||||
* One more expansion is now being processed on the auxiliary stack.
|
||||
*/
|
||||
|
||||
envPtr->expandCount++;
|
||||
@@ -3655,7 +3648,7 @@ StartExpanding(
|
||||
*
|
||||
* Finalizes a loop exception range, binding the registered [break] and
|
||||
* [continue] implementations so that they jump to the correct place.
|
||||
* Note that this must only be called after *all* the exception range
|
||||
* This must be called only after *all* the exception range
|
||||
* target offsets have been set.
|
||||
*
|
||||
* ---------------------------------------------------------------------
|
||||
@@ -3726,21 +3719,17 @@ TclFinalizeLoopExceptionRange(
|
||||
*
|
||||
* TclCreateAuxData --
|
||||
*
|
||||
* Procedure that allocates and initializes a new AuxData structure in a
|
||||
* Allocates and initializes a new AuxData structure in a
|
||||
* CompileEnv's array of compilation auxiliary data records. These
|
||||
* AuxData records hold information created during compilation by
|
||||
* CompileProcs and used by instructions during execution.
|
||||
*
|
||||
* Results:
|
||||
* Returns the index for the newly created AuxData structure.
|
||||
* The index of the newly-created AuxData structure in the array.
|
||||
*
|
||||
* Side effects:
|
||||
* If there is not enough room in the CompileEnv's AuxData array, the
|
||||
* AuxData array in expanded: a new array of double the size is
|
||||
* allocated, if envPtr->mallocedAuxDataArray is non-zero the old array
|
||||
* is freed, and AuxData entries are copied from the old array to the new
|
||||
* one.
|
||||
*
|
||||
* If there is not enough room in the CompileEnv's AuxData array, its size
|
||||
* is doubled.
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@@ -3828,8 +3817,7 @@ TclInitJumpFixupArray(
|
||||
*
|
||||
* TclExpandJumpFixupArray --
|
||||
*
|
||||
* Procedure that uses malloc to allocate more storage for a jump fixup
|
||||
* array.
|
||||
* Uses malloc to allocate more storage for a jump fixup array.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
@@ -3908,10 +3896,11 @@ TclFreeJumpFixupArray(
|
||||
*
|
||||
* TclEmitForwardJump --
|
||||
*
|
||||
* Procedure to emit a two-byte forward jump of kind "jumpType". Since
|
||||
* the jump may later have to be grown to five bytes if the jump target
|
||||
* is more than, say, 127 bytes away, this procedure also initializes a
|
||||
* JumpFixup record with information about the jump.
|
||||
* Emits a two-byte forward jump of kind "jumpType". Also initializes a
|
||||
* JumpFixup record with information about the jump. Since may later be
|
||||
* necessary to increase the size of the jump instruction to five bytes if
|
||||
* the jump target is more than, say, 127 bytes away.
|
||||
*
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
@@ -3966,16 +3955,17 @@ TclEmitForwardJump(
|
||||
*
|
||||
* TclFixupForwardJump --
|
||||
*
|
||||
* Procedure that updates a previously-emitted forward jump to jump a
|
||||
* specified number of bytes, "jumpDist". If necessary, the jump is grown
|
||||
* from two to five bytes; this is done if the jump distance is greater
|
||||
* than "distThreshold" (normally 127 bytes). The jump is described by a
|
||||
* JumpFixup record previously initialized by TclEmitForwardJump.
|
||||
* Modifies a previously-emitted forward jump to jump a specified number
|
||||
* of bytes, "jumpDist". If necessary, the size of the jump instruction is
|
||||
* increased from two to five bytes. This is done if the jump distance is
|
||||
* greater than "distThreshold" (normally 127 bytes). The jump is
|
||||
* described by a JumpFixup record previously initialized by
|
||||
* TclEmitForwardJump.
|
||||
*
|
||||
* Results:
|
||||
* 1 if the jump was grown and subsequent instructions had to be moved;
|
||||
* otherwise 0. This result is returned to allow callers to update any
|
||||
* additional code offsets they may hold.
|
||||
* 1 if the jump was grown and subsequent instructions had to be moved, or
|
||||
* 0 otherwsie. This allows callers to update any additional code offsets
|
||||
* they may hold.
|
||||
*
|
||||
* Side effects:
|
||||
* The jump may be grown and subsequent instructions moved. If this
|
||||
@@ -4018,10 +4008,10 @@ TclFixupForwardJump(
|
||||
}
|
||||
|
||||
/*
|
||||
* We must grow the jump then move subsequent instructions down. Note that
|
||||
* if we expand the space for generated instructions, code addresses might
|
||||
* change; be careful about updating any of these addresses held in
|
||||
* variables.
|
||||
* Increase the size of the jump instruction, and then move subsequent
|
||||
* instructions down. Expanding the space for generated instructions means
|
||||
* that code addresses might change. Be careful about updating any of
|
||||
* these addresses held in variables.
|
||||
*/
|
||||
|
||||
if ((envPtr->codeNext + 3) > envPtr->codeEnd) {
|
||||
@@ -4105,7 +4095,7 @@ TclFixupForwardJump(
|
||||
*
|
||||
* TclEmitInvoke --
|
||||
*
|
||||
* Emit one of the invoke-related instructions, wrapping it if necessary
|
||||
* Emits one of the invoke-related instructions, wrapping it if necessary
|
||||
* in code that ensures that any break or continue operation passing
|
||||
* through it gets the stack unwinding correct, converting it into an
|
||||
* internal jump if in an appropriate context.
|
||||
@@ -4115,7 +4105,7 @@ TclFixupForwardJump(
|
||||
*
|
||||
* Side effects:
|
||||
* Issues the jump with all correct stack management. May create another
|
||||
* loop exception range; pointers to ExceptionRange and ExceptionAux
|
||||
* loop exception range. Pointers to ExceptionRange and ExceptionAux
|
||||
* structures should not be held across this call.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
@@ -4173,12 +4163,11 @@ TclEmitInvoke(
|
||||
va_end(argList);
|
||||
|
||||
/*
|
||||
* Determine if we need to handle break and continue exceptions with a
|
||||
* special handling exception range (so that we can correctly unwind the
|
||||
* stack).
|
||||
* If the exceptions is for break or continue handle it with special
|
||||
* handling exception range so the stack may be correctly unwound.
|
||||
*
|
||||
* These must be done separately; they can be different (especially for
|
||||
* calls from inside a [for] increment clause).
|
||||
* These must be done separately since they can be different, especially
|
||||
* for calls from inside a [for] increment clause.
|
||||
*/
|
||||
|
||||
rangePtr = TclGetInnermostExceptionRange(envPtr, TCL_CONTINUE,
|
||||
@@ -4398,16 +4387,16 @@ GetCmdLocEncodingSize(
|
||||
*
|
||||
* EncodeCmdLocMap --
|
||||
*
|
||||
* Encode the command location information for some compiled code into a
|
||||
* Encodes the command location information for some compiled code into a
|
||||
* ByteCode structure. The encoded command location map is stored as
|
||||
* three adjacent byte sequences.
|
||||
* three-adjacent-byte sequences.
|
||||
*
|
||||
* Results:
|
||||
* Pointer to the first byte after the encoded command location
|
||||
* A pointer to the first byte after the encoded command location
|
||||
* information.
|
||||
*
|
||||
* Side effects:
|
||||
* The encoded information is stored into the block of memory headed by
|
||||
* Stores encoded information into the block of memory headed by
|
||||
* codePtr. Also records pointers to the start of the four byte sequences
|
||||
* in fields in codePtr's ByteCode header structure.
|
||||
*
|
||||
@@ -4522,9 +4511,9 @@ EncodeCmdLocMap(
|
||||
*
|
||||
* RecordByteCodeStats --
|
||||
*
|
||||
* Accumulates various compilation-related statistics for each newly
|
||||
* compiled ByteCode. Called by the TclInitByteCodeObj when Tcl is
|
||||
* compiled with the -DTCL_COMPILE_STATS flag
|
||||
* Accumulates compilation-related statistics for each newly-compiled
|
||||
* ByteCode. Called by the TclInitByteCodeObj when Tcl is compiled with
|
||||
* the -DTCL_COMPILE_STATS flag
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
|
||||
+625
-833
File diff suppressed because it is too large
Load Diff
+30
-13
@@ -1886,17 +1886,17 @@ EXTERN int TclZipfs_MountBuffer(Tcl_Interp *interp,
|
||||
const char *mountPoint, unsigned char *data,
|
||||
size_t datalen, int copy);
|
||||
/* 636 */
|
||||
EXTERN void Tcl_FreeIntRep(Tcl_Obj *objPtr);
|
||||
EXTERN void Tcl_FreeInternalRep(Tcl_Obj *objPtr);
|
||||
/* 637 */
|
||||
EXTERN char * Tcl_InitStringRep(Tcl_Obj *objPtr, const char *bytes,
|
||||
unsigned int numBytes);
|
||||
/* 638 */
|
||||
EXTERN Tcl_ObjIntRep * Tcl_FetchIntRep(Tcl_Obj *objPtr,
|
||||
EXTERN Tcl_ObjInternalRep * Tcl_FetchInternalRep(Tcl_Obj *objPtr,
|
||||
const Tcl_ObjType *typePtr);
|
||||
/* 639 */
|
||||
EXTERN void Tcl_StoreIntRep(Tcl_Obj *objPtr,
|
||||
EXTERN void Tcl_StoreInternalRep(Tcl_Obj *objPtr,
|
||||
const Tcl_ObjType *typePtr,
|
||||
const Tcl_ObjIntRep *irPtr);
|
||||
const Tcl_ObjInternalRep *irPtr);
|
||||
/* 640 */
|
||||
EXTERN int Tcl_HasStringRep(Tcl_Obj *objPtr);
|
||||
/* 641 */
|
||||
@@ -1937,6 +1937,13 @@ EXTERN int Tcl_UtfCharComplete(const char *src, int length);
|
||||
EXTERN const char * Tcl_UtfNext(const char *src);
|
||||
/* 656 */
|
||||
EXTERN const char * Tcl_UtfPrev(const char *src, const char *start);
|
||||
/* 657 */
|
||||
EXTERN int Tcl_UniCharIsUnicode(int ch);
|
||||
/* Slot 658 is reserved */
|
||||
/* Slot 659 is reserved */
|
||||
/* 660 */
|
||||
EXTERN int Tcl_AsyncMarkFromSignal(Tcl_AsyncHandler async,
|
||||
int sigNumber);
|
||||
|
||||
typedef struct {
|
||||
const struct TclPlatStubs *tclPlatStubs;
|
||||
@@ -2608,10 +2615,10 @@ typedef struct TclStubs {
|
||||
int (*tclZipfs_Unmount) (Tcl_Interp *interp, const char *mountPoint); /* 633 */
|
||||
Tcl_Obj * (*tclZipfs_TclLibrary) (void); /* 634 */
|
||||
int (*tclZipfs_MountBuffer) (Tcl_Interp *interp, const char *mountPoint, unsigned char *data, size_t datalen, int copy); /* 635 */
|
||||
void (*tcl_FreeIntRep) (Tcl_Obj *objPtr); /* 636 */
|
||||
void (*tcl_FreeInternalRep) (Tcl_Obj *objPtr); /* 636 */
|
||||
char * (*tcl_InitStringRep) (Tcl_Obj *objPtr, const char *bytes, unsigned int numBytes); /* 637 */
|
||||
Tcl_ObjIntRep * (*tcl_FetchIntRep) (Tcl_Obj *objPtr, const Tcl_ObjType *typePtr); /* 638 */
|
||||
void (*tcl_StoreIntRep) (Tcl_Obj *objPtr, const Tcl_ObjType *typePtr, const Tcl_ObjIntRep *irPtr); /* 639 */
|
||||
Tcl_ObjInternalRep * (*tcl_FetchInternalRep) (Tcl_Obj *objPtr, const Tcl_ObjType *typePtr); /* 638 */
|
||||
void (*tcl_StoreInternalRep) (Tcl_Obj *objPtr, const Tcl_ObjType *typePtr, const Tcl_ObjInternalRep *irPtr); /* 639 */
|
||||
int (*tcl_HasStringRep) (Tcl_Obj *objPtr); /* 640 */
|
||||
void (*tcl_IncrRefCount) (Tcl_Obj *objPtr); /* 641 */
|
||||
void (*tcl_DecrRefCount) (Tcl_Obj *objPtr); /* 642 */
|
||||
@@ -2629,6 +2636,10 @@ typedef struct TclStubs {
|
||||
int (*tcl_UtfCharComplete) (const char *src, int length); /* 654 */
|
||||
const char * (*tcl_UtfNext) (const char *src); /* 655 */
|
||||
const char * (*tcl_UtfPrev) (const char *src, const char *start); /* 656 */
|
||||
int (*tcl_UniCharIsUnicode) (int ch); /* 657 */
|
||||
void (*reserved658)(void);
|
||||
void (*reserved659)(void);
|
||||
int (*tcl_AsyncMarkFromSignal) (Tcl_AsyncHandler async, int sigNumber); /* 660 */
|
||||
} TclStubs;
|
||||
|
||||
extern const TclStubs *tclStubsPtr;
|
||||
@@ -3931,14 +3942,14 @@ extern const TclStubs *tclStubsPtr;
|
||||
(tclStubsPtr->tclZipfs_TclLibrary) /* 634 */
|
||||
#define TclZipfs_MountBuffer \
|
||||
(tclStubsPtr->tclZipfs_MountBuffer) /* 635 */
|
||||
#define Tcl_FreeIntRep \
|
||||
(tclStubsPtr->tcl_FreeIntRep) /* 636 */
|
||||
#define Tcl_FreeInternalRep \
|
||||
(tclStubsPtr->tcl_FreeInternalRep) /* 636 */
|
||||
#define Tcl_InitStringRep \
|
||||
(tclStubsPtr->tcl_InitStringRep) /* 637 */
|
||||
#define Tcl_FetchIntRep \
|
||||
(tclStubsPtr->tcl_FetchIntRep) /* 638 */
|
||||
#define Tcl_StoreIntRep \
|
||||
(tclStubsPtr->tcl_StoreIntRep) /* 639 */
|
||||
#define Tcl_FetchInternalRep \
|
||||
(tclStubsPtr->tcl_FetchInternalRep) /* 638 */
|
||||
#define Tcl_StoreInternalRep \
|
||||
(tclStubsPtr->tcl_StoreInternalRep) /* 639 */
|
||||
#define Tcl_HasStringRep \
|
||||
(tclStubsPtr->tcl_HasStringRep) /* 640 */
|
||||
#define Tcl_IncrRefCount \
|
||||
@@ -3971,6 +3982,12 @@ extern const TclStubs *tclStubsPtr;
|
||||
(tclStubsPtr->tcl_UtfNext) /* 655 */
|
||||
#define Tcl_UtfPrev \
|
||||
(tclStubsPtr->tcl_UtfPrev) /* 656 */
|
||||
#define Tcl_UniCharIsUnicode \
|
||||
(tclStubsPtr->tcl_UniCharIsUnicode) /* 657 */
|
||||
/* Slot 658 is reserved */
|
||||
/* Slot 659 is reserved */
|
||||
#define Tcl_AsyncMarkFromSignal \
|
||||
(tclStubsPtr->tcl_AsyncMarkFromSignal) /* 660 */
|
||||
|
||||
#endif /* defined(USE_TCL_STUBS) */
|
||||
|
||||
|
||||
+29
-29
@@ -149,18 +149,18 @@ const Tcl_ObjType tclDictType = {
|
||||
SetDictFromAny /* setFromAnyProc */
|
||||
};
|
||||
|
||||
#define DictSetIntRep(objPtr, dictRepPtr) \
|
||||
#define DictSetInternalRep(objPtr, dictRepPtr) \
|
||||
do { \
|
||||
Tcl_ObjIntRep ir; \
|
||||
Tcl_ObjInternalRep ir; \
|
||||
ir.twoPtrValue.ptr1 = (dictRepPtr); \
|
||||
ir.twoPtrValue.ptr2 = NULL; \
|
||||
Tcl_StoreIntRep((objPtr), &tclDictType, &ir); \
|
||||
Tcl_StoreInternalRep((objPtr), &tclDictType, &ir); \
|
||||
} while (0)
|
||||
|
||||
#define DictGetIntRep(objPtr, dictRepPtr) \
|
||||
#define DictGetInternalRep(objPtr, dictRepPtr) \
|
||||
do { \
|
||||
const Tcl_ObjIntRep *irPtr; \
|
||||
irPtr = TclFetchIntRep((objPtr), &tclDictType); \
|
||||
const Tcl_ObjInternalRep *irPtr; \
|
||||
irPtr = TclFetchInternalRep((objPtr), &tclDictType); \
|
||||
(dictRepPtr) = irPtr ? (Dict *)irPtr->twoPtrValue.ptr1 : NULL; \
|
||||
} while (0)
|
||||
|
||||
@@ -362,7 +362,7 @@ DupDictInternalRep(
|
||||
Dict *oldDict, *newDict = (Dict *)ckalloc(sizeof(Dict));
|
||||
ChainEntry *cPtr;
|
||||
|
||||
DictGetIntRep(srcPtr, oldDict);
|
||||
DictGetInternalRep(srcPtr, oldDict);
|
||||
|
||||
/*
|
||||
* Copy values across from the old hash table.
|
||||
@@ -395,7 +395,7 @@ DupDictInternalRep(
|
||||
* Store in the object.
|
||||
*/
|
||||
|
||||
DictSetIntRep(copyPtr, newDict);
|
||||
DictSetInternalRep(copyPtr, newDict);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -422,7 +422,7 @@ FreeDictInternalRep(
|
||||
{
|
||||
Dict *dict;
|
||||
|
||||
DictGetIntRep(dictPtr, dict);
|
||||
DictGetInternalRep(dictPtr, dict);
|
||||
|
||||
if (dict->refCount-- <= 1) {
|
||||
DeleteDict(dict);
|
||||
@@ -499,7 +499,7 @@ UpdateStringOfDict(
|
||||
|
||||
int numElems;
|
||||
|
||||
DictGetIntRep(dictPtr, dict);
|
||||
DictGetInternalRep(dictPtr, dict);
|
||||
|
||||
assert (dict != NULL);
|
||||
|
||||
@@ -610,7 +610,7 @@ SetDictFromAny(
|
||||
* the conversion from lists to dictionaries.
|
||||
*/
|
||||
|
||||
if (TclHasIntRep(objPtr, &tclListType)) {
|
||||
if (TclHasInternalRep(objPtr, &tclListType)) {
|
||||
int objc, i;
|
||||
Tcl_Obj **objv;
|
||||
|
||||
@@ -717,7 +717,7 @@ SetDictFromAny(
|
||||
dict->epoch = 1;
|
||||
dict->chain = NULL;
|
||||
dict->refCount = 1;
|
||||
DictSetIntRep(objPtr, dict);
|
||||
DictSetInternalRep(objPtr, dict);
|
||||
return TCL_OK;
|
||||
|
||||
missingValue:
|
||||
@@ -739,12 +739,12 @@ GetDictFromObj(
|
||||
{
|
||||
Dict *dict;
|
||||
|
||||
DictGetIntRep(dictPtr, dict);
|
||||
DictGetInternalRep(dictPtr, dict);
|
||||
if (dict == NULL) {
|
||||
if (SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return NULL;
|
||||
}
|
||||
DictGetIntRep(dictPtr, dict);
|
||||
DictGetInternalRep(dictPtr, dict);
|
||||
}
|
||||
return dict;
|
||||
}
|
||||
@@ -792,12 +792,12 @@ TclTraceDictPath(
|
||||
Dict *dict, *newDict;
|
||||
int i;
|
||||
|
||||
DictGetIntRep(dictPtr, dict);
|
||||
DictGetInternalRep(dictPtr, dict);
|
||||
if (dict == NULL) {
|
||||
if (SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return NULL;
|
||||
}
|
||||
DictGetIntRep(dictPtr, dict);
|
||||
DictGetInternalRep(dictPtr, dict);
|
||||
}
|
||||
if (flags & DICT_PATH_UPDATE) {
|
||||
dict->chain = NULL;
|
||||
@@ -835,7 +835,7 @@ TclTraceDictPath(
|
||||
} else {
|
||||
tmpObj = (Tcl_Obj *)Tcl_GetHashValue(hPtr);
|
||||
|
||||
DictGetIntRep(tmpObj, newDict);
|
||||
DictGetInternalRep(tmpObj, newDict);
|
||||
|
||||
if (newDict == NULL) {
|
||||
if (SetDictFromAny(interp, tmpObj) != TCL_OK) {
|
||||
@@ -844,7 +844,7 @@ TclTraceDictPath(
|
||||
}
|
||||
}
|
||||
|
||||
DictGetIntRep(tmpObj, newDict);
|
||||
DictGetInternalRep(tmpObj, newDict);
|
||||
if (flags & DICT_PATH_UPDATE) {
|
||||
if (Tcl_IsShared(tmpObj)) {
|
||||
TclDecrRefCount(tmpObj);
|
||||
@@ -852,7 +852,7 @@ TclTraceDictPath(
|
||||
Tcl_IncrRefCount(tmpObj);
|
||||
Tcl_SetHashValue(hPtr, tmpObj);
|
||||
dict->epoch++;
|
||||
DictGetIntRep(tmpObj, newDict);
|
||||
DictGetInternalRep(tmpObj, newDict);
|
||||
}
|
||||
|
||||
newDict->chain = dictPtr;
|
||||
@@ -889,14 +889,14 @@ InvalidateDictChain(
|
||||
{
|
||||
Dict *dict;
|
||||
|
||||
DictGetIntRep(dictObj, dict);
|
||||
DictGetInternalRep(dictObj, dict);
|
||||
assert( dict != NULL);
|
||||
|
||||
do {
|
||||
dict->refCount++;
|
||||
TclInvalidateStringRep(dictObj);
|
||||
TclFreeIntRep(dictObj);
|
||||
DictSetIntRep(dictObj, dict);
|
||||
TclFreeInternalRep(dictObj);
|
||||
DictSetInternalRep(dictObj, dict);
|
||||
|
||||
dict->epoch++;
|
||||
dictObj = dict->chain;
|
||||
@@ -904,7 +904,7 @@ InvalidateDictChain(
|
||||
break;
|
||||
}
|
||||
dict->chain = NULL;
|
||||
DictGetIntRep(dictObj, dict);
|
||||
DictGetInternalRep(dictObj, dict);
|
||||
} while (dict != NULL);
|
||||
}
|
||||
|
||||
@@ -950,8 +950,8 @@ Tcl_DictObjPut(
|
||||
TclInvalidateStringRep(dictPtr);
|
||||
hPtr = CreateChainEntry(dict, keyPtr, &isNew);
|
||||
dict->refCount++;
|
||||
TclFreeIntRep(dictPtr);
|
||||
DictSetIntRep(dictPtr, dict);
|
||||
TclFreeInternalRep(dictPtr)
|
||||
DictSetInternalRep(dictPtr, dict);
|
||||
Tcl_IncrRefCount(valuePtr);
|
||||
if (!isNew) {
|
||||
Tcl_Obj *oldValuePtr = (Tcl_Obj *)Tcl_GetHashValue(hPtr);
|
||||
@@ -1306,7 +1306,7 @@ Tcl_DictObjPutKeyList(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
DictGetIntRep(dictPtr, dict);
|
||||
DictGetInternalRep(dictPtr, dict);
|
||||
assert(dict != NULL);
|
||||
hPtr = CreateChainEntry(dict, keyv[keyc-1], &isNew);
|
||||
Tcl_IncrRefCount(valuePtr);
|
||||
@@ -1364,7 +1364,7 @@ Tcl_DictObjRemoveKeyList(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
DictGetIntRep(dictPtr, dict);
|
||||
DictGetInternalRep(dictPtr, dict);
|
||||
assert(dict != NULL);
|
||||
DeleteChainEntry(dict, keyv[keyc-1]);
|
||||
InvalidateDictChain(dictPtr);
|
||||
@@ -1411,7 +1411,7 @@ Tcl_NewDictObj(void)
|
||||
dict->epoch = 1;
|
||||
dict->chain = NULL;
|
||||
dict->refCount = 1;
|
||||
DictSetIntRep(dictPtr, dict);
|
||||
DictSetInternalRep(dictPtr, dict);
|
||||
return dictPtr;
|
||||
#endif
|
||||
}
|
||||
@@ -1459,7 +1459,7 @@ Tcl_DbNewDictObj(
|
||||
dict->epoch = 1;
|
||||
dict->chain = NULL;
|
||||
dict->refCount = 1;
|
||||
DictSetIntRep(dictPtr, dict);
|
||||
DictSetInternalRep(dictPtr, dict);
|
||||
return dictPtr;
|
||||
}
|
||||
#else /* !TCL_MEM_DEBUG */
|
||||
|
||||
+18
-17
@@ -44,20 +44,21 @@ static const Tcl_ObjType instNameType = {
|
||||
NULL, /* setFromAnyProc */
|
||||
};
|
||||
|
||||
#define InstNameSetIntRep(objPtr, inst) \
|
||||
#define InstNameSetInternalRep(objPtr, inst) \
|
||||
do { \
|
||||
Tcl_ObjIntRep ir; \
|
||||
Tcl_ObjInternalRep ir; \
|
||||
ir.wideValue = (inst); \
|
||||
Tcl_StoreIntRep((objPtr), &instNameType, &ir); \
|
||||
Tcl_StoreInternalRep((objPtr), &instNameType, &ir); \
|
||||
} while (0)
|
||||
|
||||
#define InstNameGetIntRep(objPtr, inst) \
|
||||
#define InstNameGetInternalRep(objPtr, inst) \
|
||||
do { \
|
||||
const Tcl_ObjIntRep *irPtr = \
|
||||
TclFetchIntRep((objPtr), &instNameType); \
|
||||
const Tcl_ObjInternalRep *irPtr; \
|
||||
irPtr = TclFetchInternalRep((objPtr), &instNameType); \
|
||||
assert(irPtr != NULL); \
|
||||
(inst) = (size_t) irPtr->wideValue; \
|
||||
(inst) = (size_t)irPtr->wideValue; \
|
||||
} while (0)
|
||||
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
@@ -258,7 +259,7 @@ DisassembleByteCodeObj(
|
||||
Interp *iPtr;
|
||||
Tcl_Obj *bufferObj, *fileObj;
|
||||
|
||||
ByteCodeGetIntRep(objPtr, &tclByteCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &tclByteCodeType, codePtr);
|
||||
|
||||
iPtr = (Interp *) *codePtr->interpHandle;
|
||||
|
||||
@@ -760,7 +761,7 @@ TclGetInnerContext(
|
||||
int len;
|
||||
|
||||
/*
|
||||
* Reset while keeping the list intrep as much as possible.
|
||||
* Reset while keeping the list internalrep as much as possible.
|
||||
*/
|
||||
|
||||
Tcl_ListObjLength(interp, result, &len);
|
||||
@@ -807,7 +808,7 @@ TclNewInstNameObj(
|
||||
|
||||
TclNewObj(objPtr);
|
||||
TclInvalidateStringRep(objPtr);
|
||||
InstNameSetIntRep(objPtr, (long) inst);
|
||||
InstNameSetInternalRep(objPtr, (long) inst);
|
||||
|
||||
return objPtr;
|
||||
}
|
||||
@@ -829,7 +830,7 @@ UpdateStringOfInstName(
|
||||
size_t inst; /* NOTE: We know this is really an unsigned char */
|
||||
char *dst;
|
||||
|
||||
InstNameGetIntRep(objPtr, inst);
|
||||
InstNameGetInternalRep(objPtr, inst);
|
||||
|
||||
if (inst > LAST_INST_OPCODE) {
|
||||
dst = Tcl_InitStringRep(objPtr, NULL, TCL_INTEGER_SPACE + 5);
|
||||
@@ -944,7 +945,7 @@ DisassembleByteCodeAsDicts(
|
||||
int codeOffset, codeLength, sourceOffset, sourceLength;
|
||||
int i, val, line;
|
||||
|
||||
ByteCodeGetIntRep(objPtr, &tclByteCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &tclByteCodeType, codePtr);
|
||||
|
||||
/*
|
||||
* Get the literals from the bytecode.
|
||||
@@ -1367,7 +1368,7 @@ Tcl_DisassembleObjCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
if (!TclHasIntRep(objv[2], &tclByteCodeType) && (TCL_OK
|
||||
if (!TclHasInternalRep(objv[2], &tclByteCodeType) && (TCL_OK
|
||||
!= TclSetByteCodeFromAny(interp, objv[2], NULL, NULL))) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -1418,7 +1419,7 @@ Tcl_DisassembleObjCmd(
|
||||
* Compile if necessary.
|
||||
*/
|
||||
|
||||
if (!TclHasIntRep(procPtr->bodyPtr, &tclByteCodeType)) {
|
||||
if (!TclHasInternalRep(procPtr->bodyPtr, &tclByteCodeType)) {
|
||||
Command cmd;
|
||||
|
||||
/*
|
||||
@@ -1483,7 +1484,7 @@ Tcl_DisassembleObjCmd(
|
||||
* Compile if necessary.
|
||||
*/
|
||||
|
||||
if (!TclHasIntRep(procPtr->bodyPtr, &tclByteCodeType)) {
|
||||
if (!TclHasInternalRep(procPtr->bodyPtr, &tclByteCodeType)) {
|
||||
Command cmd;
|
||||
|
||||
/*
|
||||
@@ -1568,7 +1569,7 @@ Tcl_DisassembleObjCmd(
|
||||
"METHODTYPE", NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (!TclHasIntRep(procPtr->bodyPtr, &tclByteCodeType)) {
|
||||
if (!TclHasInternalRep(procPtr->bodyPtr, &tclByteCodeType)) {
|
||||
Command cmd;
|
||||
|
||||
/*
|
||||
@@ -1596,7 +1597,7 @@ Tcl_DisassembleObjCmd(
|
||||
* Do the actual disassembly.
|
||||
*/
|
||||
|
||||
ByteCodeGetIntRep(codeObjPtr, &tclByteCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(codeObjPtr, &tclByteCodeType, codePtr);
|
||||
|
||||
if (codePtr->flags & TCL_BYTECODE_PRECOMPILED) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
|
||||
+77
-45
@@ -116,8 +116,7 @@ typedef struct {
|
||||
* entry in this array is 1, otherwise it is
|
||||
* 0. */
|
||||
int numSubTables; /* Length of following array. */
|
||||
EscapeSubTable subTables[TCLFLEXARRAY];
|
||||
/* Information about each EscapeSubTable used
|
||||
EscapeSubTable subTables[TCLFLEXARRAY];/* Information about each EscapeSubTable used
|
||||
* by this encoding type. The actual size is
|
||||
* as large as necessary to hold all
|
||||
* EscapeSubTables. */
|
||||
@@ -128,12 +127,10 @@ typedef struct {
|
||||
* file.
|
||||
*/
|
||||
|
||||
enum {
|
||||
ENCODING_SINGLEBYTE = 0,
|
||||
ENCODING_DOUBLEBYTE = 1,
|
||||
ENCODING_MULTIBYTE = 2,
|
||||
ENCODING_ESCAPE = 3
|
||||
};
|
||||
#define ENCODING_SINGLEBYTE 0
|
||||
#define ENCODING_DOUBLEBYTE 1
|
||||
#define ENCODING_MULTIBYTE 2
|
||||
#define ENCODING_ESCAPE 3
|
||||
|
||||
/*
|
||||
* A list of directories in which Tcl should look for *.enc files. This list
|
||||
@@ -199,13 +196,13 @@ static unsigned short emptyPage[256];
|
||||
*/
|
||||
|
||||
static Tcl_EncodingConvertProc BinaryProc;
|
||||
static Tcl_DupInternalRepProc DupEncodingIntRep;
|
||||
static Tcl_DupInternalRepProc DupEncodingInternalRep;
|
||||
static Tcl_EncodingFreeProc EscapeFreeProc;
|
||||
static Tcl_EncodingConvertProc EscapeFromUtfProc;
|
||||
static Tcl_EncodingConvertProc EscapeToUtfProc;
|
||||
static void FillEncodingFileMap(void);
|
||||
static void FreeEncoding(Tcl_Encoding encoding);
|
||||
static Tcl_FreeInternalRepProc FreeEncodingIntRep;
|
||||
static Tcl_FreeInternalRepProc FreeEncodingInternalRep;
|
||||
static Encoding * GetTableEncoding(EscapeEncodingData *dataPtr,
|
||||
int state);
|
||||
static Tcl_Encoding LoadEncodingFile(Tcl_Interp *interp,
|
||||
@@ -229,25 +226,25 @@ static Tcl_EncodingConvertProc Iso88591ToUtfProc;
|
||||
|
||||
/*
|
||||
* A Tcl_ObjType for holding a cached Tcl_Encoding in the twoPtrValue.ptr1 field
|
||||
* of the intrep. This should help the lifetime of encodings be more useful.
|
||||
* of the internalrep. This should help the lifetime of encodings be more useful.
|
||||
* See concerns raised in [Bug 1077262].
|
||||
*/
|
||||
|
||||
static const Tcl_ObjType encodingType = {
|
||||
"encoding", FreeEncodingIntRep, DupEncodingIntRep, NULL, NULL
|
||||
"encoding", FreeEncodingInternalRep, DupEncodingInternalRep, NULL, NULL
|
||||
};
|
||||
#define EncodingSetIntRep(objPtr, encoding) \
|
||||
#define EncodingSetInternalRep(objPtr, encoding) \
|
||||
do { \
|
||||
Tcl_ObjIntRep ir; \
|
||||
Tcl_ObjInternalRep ir; \
|
||||
ir.twoPtrValue.ptr1 = (encoding); \
|
||||
ir.twoPtrValue.ptr2 = NULL; \
|
||||
Tcl_StoreIntRep((objPtr), &encodingType, &ir); \
|
||||
Tcl_StoreInternalRep((objPtr), &encodingType, &ir); \
|
||||
} while (0)
|
||||
|
||||
#define EncodingGetIntRep(objPtr, encoding) \
|
||||
#define EncodingGetInternalRep(objPtr, encoding) \
|
||||
do { \
|
||||
const Tcl_ObjIntRep *irPtr; \
|
||||
irPtr = TclFetchIntRep ((objPtr), &encodingType); \
|
||||
const Tcl_ObjInternalRep *irPtr; \
|
||||
irPtr = TclFetchInternalRep ((objPtr), &encodingType); \
|
||||
(encoding) = irPtr ? (Tcl_Encoding)irPtr->twoPtrValue.ptr1 : NULL; \
|
||||
} while (0)
|
||||
|
||||
@@ -280,13 +277,13 @@ Tcl_GetEncodingFromObj(
|
||||
Tcl_Encoding encoding;
|
||||
const char *name = TclGetString(objPtr);
|
||||
|
||||
EncodingGetIntRep(objPtr, encoding);
|
||||
EncodingGetInternalRep(objPtr, encoding);
|
||||
if (encoding == NULL) {
|
||||
encoding = Tcl_GetEncoding(interp, name);
|
||||
if (encoding == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
EncodingSetIntRep(objPtr, encoding);
|
||||
EncodingSetInternalRep(objPtr, encoding);
|
||||
}
|
||||
*encodingPtr = Tcl_GetEncoding(NULL, name);
|
||||
return TCL_OK;
|
||||
@@ -295,7 +292,7 @@ Tcl_GetEncodingFromObj(
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* FreeEncodingIntRep --
|
||||
* FreeEncodingInternalRep --
|
||||
*
|
||||
* The Tcl_FreeInternalRepProc for the "encoding" Tcl_ObjType.
|
||||
*
|
||||
@@ -303,19 +300,19 @@ Tcl_GetEncodingFromObj(
|
||||
*/
|
||||
|
||||
static void
|
||||
FreeEncodingIntRep(
|
||||
FreeEncodingInternalRep(
|
||||
Tcl_Obj *objPtr)
|
||||
{
|
||||
Tcl_Encoding encoding;
|
||||
|
||||
EncodingGetIntRep(objPtr, encoding);
|
||||
EncodingGetInternalRep(objPtr, encoding);
|
||||
Tcl_FreeEncoding(encoding);
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* DupEncodingIntRep --
|
||||
* DupEncodingInternalRep --
|
||||
*
|
||||
* The Tcl_DupInternalRepProc for the "encoding" Tcl_ObjType.
|
||||
*
|
||||
@@ -323,12 +320,12 @@ FreeEncodingIntRep(
|
||||
*/
|
||||
|
||||
static void
|
||||
DupEncodingIntRep(
|
||||
DupEncodingInternalRep(
|
||||
Tcl_Obj *srcPtr,
|
||||
Tcl_Obj *dupPtr)
|
||||
{
|
||||
Tcl_Encoding encoding = Tcl_GetEncoding(NULL, TclGetString(srcPtr));
|
||||
EncodingSetIntRep(dupPtr, encoding);
|
||||
EncodingSetInternalRep(dupPtr, encoding);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -513,17 +510,12 @@ FillEncodingFileMap(void)
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
enum {
|
||||
/* This flags must not conflict with other TCL_ENCODING_* flags in tcl.h */
|
||||
TCL_ENCODING_MODIFIED = 0x20, /* Converting NULL bytes to 0xC0 0x80 */
|
||||
|
||||
/*
|
||||
* Since TCL_ENCODING_MODIFIED is only used for utf-8 and TCL_ENCODING_LE
|
||||
* is only used for utf-16/ucs-2, re-use the same value
|
||||
*/
|
||||
|
||||
TCL_ENCODING_LE = TCL_ENCODING_MODIFIED /* Little-endian encoding */
|
||||
};
|
||||
/* Those flags must not conflict with other TCL_ENCODING_* flags in tcl.h */
|
||||
/* Since TCL_ENCODING_MODIFIED is only used for utf-8/cesu-8 and
|
||||
* TCL_ENCODING_LE is only used for utf-16/ucs-2. re-use the same value */
|
||||
#define TCL_ENCODING_MODIFIED 0x20 /* Converting NULL bytes to 0xC0 0x80 */
|
||||
#define TCL_ENCODING_LE TCL_ENCODING_MODIFIED /* Little-endian encoding */
|
||||
#define TCL_ENCODING_UTF 0x200 /* For UTF-8 encoding, allow 4-byte output sequences */
|
||||
|
||||
void
|
||||
TclInitEncodingSubsystem(void)
|
||||
@@ -565,7 +557,10 @@ TclInitEncodingSubsystem(void)
|
||||
type.fromUtfProc = UtfToUtfProc;
|
||||
type.freeProc = NULL;
|
||||
type.nullSize = 1;
|
||||
type.clientData = NULL;
|
||||
type.clientData = INT2PTR(TCL_ENCODING_UTF);
|
||||
Tcl_CreateEncoding(&type);
|
||||
type.clientData = INT2PTR(0);
|
||||
type.encodingName = "cesu-8";
|
||||
Tcl_CreateEncoding(&type);
|
||||
|
||||
type.toUtfProc = Utf16ToUtfProc;
|
||||
@@ -1150,7 +1145,7 @@ Tcl_ExternalToUtfDString(
|
||||
|
||||
flags = TCL_ENCODING_START | TCL_ENCODING_END;
|
||||
if (encodingPtr->toUtfProc == UtfToUtfProc) {
|
||||
flags |= TCL_ENCODING_MODIFIED;
|
||||
flags |= TCL_ENCODING_MODIFIED | TCL_ENCODING_UTF;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
@@ -1267,7 +1262,7 @@ Tcl_ExternalToUtf(
|
||||
dstLen--;
|
||||
}
|
||||
if (encodingPtr->toUtfProc == UtfToUtfProc) {
|
||||
flags |= TCL_ENCODING_MODIFIED;
|
||||
flags |= TCL_ENCODING_MODIFIED | TCL_ENCODING_UTF;
|
||||
}
|
||||
do {
|
||||
Tcl_EncodingState savedState = *statePtr;
|
||||
@@ -1346,6 +1341,7 @@ Tcl_UtfToExternalDString(
|
||||
&srcRead, &dstWrote, &dstChars);
|
||||
soFar = dst + dstWrote - Tcl_DStringValue(dstPtr);
|
||||
|
||||
src += srcRead;
|
||||
if (result != TCL_CONVERT_NOSPACE) {
|
||||
if (encodingPtr->nullSize == 2) {
|
||||
Tcl_DStringSetLength(dstPtr, soFar + 1);
|
||||
@@ -1355,7 +1351,6 @@ Tcl_UtfToExternalDString(
|
||||
}
|
||||
|
||||
flags &= ~TCL_ENCODING_START;
|
||||
src += srcRead;
|
||||
srcLen -= srcRead;
|
||||
if (Tcl_DStringLength(dstPtr) == 0) {
|
||||
Tcl_DStringSetLength(dstPtr, dstLen);
|
||||
@@ -2224,7 +2219,7 @@ UtfToUtfProc(
|
||||
|
||||
dstStart = dst;
|
||||
flags |= PTR2INT(clientData);
|
||||
dstEnd = dst + dstLen - TCL_UTF_MAX;
|
||||
dstEnd = dst + dstLen - ((flags & TCL_ENCODING_UTF) ? TCL_UTF_MAX : 6);
|
||||
|
||||
for (numChars = 0; src < srcEnd && numChars <= charLimit; numChars++) {
|
||||
if ((src > srcClose) && (!Tcl_UtfCharComplete(src, srcEnd - src))) {
|
||||
@@ -2277,6 +2272,7 @@ UtfToUtfProc(
|
||||
dst += Tcl_UniCharToUtf(ch, dst);
|
||||
} else {
|
||||
int low;
|
||||
const char *saveSrc = src;
|
||||
size_t len = TclUtfToUCS4(src, &ch);
|
||||
if ((len < 2) && (ch != 0) && (flags & TCL_ENCODING_STOPONERROR)
|
||||
&& (flags & TCL_ENCODING_MODIFIED)) {
|
||||
@@ -2284,7 +2280,17 @@ UtfToUtfProc(
|
||||
break;
|
||||
}
|
||||
src += len;
|
||||
if ((ch | 0x7FF) == 0xDFFF) {
|
||||
if (!(flags & TCL_ENCODING_UTF) && (ch > 0x3FF)) {
|
||||
if (ch > 0xFFFF) {
|
||||
/* CESU-8 6-byte sequence for chars > U+FFFF */
|
||||
ch -= 0x10000;
|
||||
*dst++ = 0xED;
|
||||
*dst++ = (char) (((ch >> 16) & 0x0F) | 0xA0);
|
||||
*dst++ = (char) (((ch >> 10) & 0x3F) | 0x80);
|
||||
ch = (ch & 0x0CFF) | 0xDC00;
|
||||
}
|
||||
goto cesu8;
|
||||
} else if ((ch | 0x7FF) == 0xDFFF) {
|
||||
/*
|
||||
* A surrogate character is detected, handle especially.
|
||||
*/
|
||||
@@ -2293,6 +2299,15 @@ UtfToUtfProc(
|
||||
len = (src <= srcEnd-3) ? TclUtfToUCS4(src, &low) : 0;
|
||||
|
||||
if (((low & ~0x3FF) != 0xDC00) || (ch & 0x400)) {
|
||||
if (flags & TCL_ENCODING_STOPONERROR) {
|
||||
result = TCL_CONVERT_UNKNOWN;
|
||||
src = saveSrc;
|
||||
break;
|
||||
}
|
||||
if (!(flags & TCL_ENCODING_MODIFIED)) {
|
||||
ch = 0xFFFD;
|
||||
}
|
||||
cesu8:
|
||||
*dst++ = (char) (((ch >> 12) | 0xE0) & 0xEF);
|
||||
*dst++ = (char) (((ch >> 6) | 0x80) & 0xBF);
|
||||
*dst++ = (char) ((ch | 0x80) & 0xBF);
|
||||
@@ -2301,6 +2316,15 @@ UtfToUtfProc(
|
||||
src += len;
|
||||
dst += Tcl_UniCharToUtf(ch, dst);
|
||||
ch = low;
|
||||
} else if (!Tcl_UniCharIsUnicode(ch)) {
|
||||
if (flags & TCL_ENCODING_STOPONERROR) {
|
||||
result = TCL_CONVERT_UNKNOWN;
|
||||
src = saveSrc;
|
||||
break;
|
||||
}
|
||||
if (!(flags & TCL_ENCODING_MODIFIED)) {
|
||||
ch = 0xFFFD;
|
||||
}
|
||||
}
|
||||
dst += Tcl_UniCharToUtf(ch, dst);
|
||||
}
|
||||
@@ -2459,7 +2483,7 @@ UtfToUtf16Proc(
|
||||
{
|
||||
const char *srcStart, *srcEnd, *srcClose, *dstStart, *dstEnd;
|
||||
int result, numChars;
|
||||
int ch;
|
||||
int ch, len;
|
||||
|
||||
srcStart = src;
|
||||
srcEnd = src + srcLen;
|
||||
@@ -2487,7 +2511,15 @@ UtfToUtf16Proc(
|
||||
result = TCL_CONVERT_NOSPACE;
|
||||
break;
|
||||
}
|
||||
src += TclUtfToUCS4(src, &ch);
|
||||
len = TclUtfToUCS4(src, &ch);
|
||||
if (!Tcl_UniCharIsUnicode(ch)) {
|
||||
if (flags & TCL_ENCODING_STOPONERROR) {
|
||||
result = TCL_CONVERT_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
ch = 0xFFFD;
|
||||
}
|
||||
src += len;
|
||||
if (flags & TCL_ENCODING_LE) {
|
||||
if (ch <= 0xFFFF) {
|
||||
*dst++ = (ch & 0xFF);
|
||||
|
||||
+33
-15
@@ -84,18 +84,18 @@ static const Tcl_ObjType ensembleCmdType = {
|
||||
NULL /* setFromAnyProc */
|
||||
};
|
||||
|
||||
#define ECRSetIntRep(objPtr, ecRepPtr) \
|
||||
#define ECRSetInternalRep(objPtr, ecRepPtr) \
|
||||
do { \
|
||||
Tcl_ObjIntRep ir; \
|
||||
Tcl_ObjInternalRep ir; \
|
||||
ir.twoPtrValue.ptr1 = (ecRepPtr); \
|
||||
ir.twoPtrValue.ptr2 = NULL; \
|
||||
Tcl_StoreIntRep((objPtr), &ensembleCmdType, &ir); \
|
||||
Tcl_StoreInternalRep((objPtr), &ensembleCmdType, &ir); \
|
||||
} while (0)
|
||||
|
||||
#define ECRGetIntRep(objPtr, ecRepPtr) \
|
||||
#define ECRGetInternalRep(objPtr, ecRepPtr) \
|
||||
do { \
|
||||
const Tcl_ObjIntRep *irPtr; \
|
||||
irPtr = TclFetchIntRep((objPtr), &ensembleCmdType); \
|
||||
const Tcl_ObjInternalRep *irPtr; \
|
||||
irPtr = TclFetchInternalRep((objPtr), &ensembleCmdType); \
|
||||
(ecRepPtr) = irPtr ? (EnsembleCmdRep *)irPtr->twoPtrValue.ptr1 : NULL; \
|
||||
} while (0)
|
||||
|
||||
@@ -165,7 +165,7 @@ TclNamespaceEnsembleCmd(
|
||||
const char *simpleName;
|
||||
int index, done;
|
||||
|
||||
if (nsPtr == NULL || nsPtr->flags & NS_DYING) {
|
||||
if (nsPtr == NULL || nsPtr->flags & NS_DEAD) {
|
||||
if (!Tcl_InterpDeleted(interp)) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"tried to manipulate ensemble of deleted namespace",
|
||||
@@ -1730,7 +1730,7 @@ NsEnsembleImplementationCmdNR(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
if (ensemblePtr->nsPtr->flags & NS_DYING) {
|
||||
if (ensemblePtr->nsPtr->flags & NS_DEAD) {
|
||||
/*
|
||||
* Don't know how we got here, but make things give up quickly.
|
||||
*/
|
||||
@@ -1759,7 +1759,7 @@ NsEnsembleImplementationCmdNR(
|
||||
*/
|
||||
EnsembleCmdRep *ensembleCmd;
|
||||
|
||||
ECRGetIntRep(subObj, ensembleCmd);
|
||||
ECRGetInternalRep(subObj, ensembleCmd);
|
||||
if (ensembleCmd) {
|
||||
if (ensembleCmd->epoch == ensemblePtr->epoch &&
|
||||
ensembleCmd->token == (Command *)ensemblePtr->token) {
|
||||
@@ -2201,6 +2201,18 @@ TclSpellFix(
|
||||
TclNRAddCallback(interp, TclNRReleaseValues, fix, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
Tcl_Obj *const *TclEnsembleGetRewriteValues(
|
||||
Tcl_Interp *interp /* Current interpreter. */
|
||||
)
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Tcl_Obj *const *origObjv = iPtr->ensembleRewrite.sourceObjs;
|
||||
if (origObjv[0] == NULL) {
|
||||
origObjv = (Tcl_Obj *const *)origObjv[2];
|
||||
}
|
||||
return origObjv;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
@@ -2225,12 +2237,18 @@ TclFetchEnsembleRoot(
|
||||
int objc,
|
||||
int *objcPtr)
|
||||
{
|
||||
Tcl_Obj *const *sourceObjs;
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
|
||||
if (iPtr->ensembleRewrite.sourceObjs) {
|
||||
*objcPtr = objc + iPtr->ensembleRewrite.numRemovedObjs
|
||||
- iPtr->ensembleRewrite.numInsertedObjs;
|
||||
return iPtr->ensembleRewrite.sourceObjs;
|
||||
if (iPtr->ensembleRewrite.sourceObjs[0] == NULL) {
|
||||
sourceObjs = (Tcl_Obj *const *)iPtr->ensembleRewrite.sourceObjs[1];
|
||||
} else {
|
||||
sourceObjs = iPtr->ensembleRewrite.sourceObjs;
|
||||
}
|
||||
return sourceObjs;
|
||||
}
|
||||
*objcPtr = objc;
|
||||
return objv;
|
||||
@@ -2406,7 +2424,7 @@ MakeCachedEnsembleCommand(
|
||||
{
|
||||
EnsembleCmdRep *ensembleCmd;
|
||||
|
||||
ECRGetIntRep(objPtr, ensembleCmd);
|
||||
ECRGetInternalRep(objPtr, ensembleCmd);
|
||||
if (ensembleCmd) {
|
||||
TclCleanupCommandMacro(ensembleCmd->token);
|
||||
if (ensembleCmd->fix) {
|
||||
@@ -2419,7 +2437,7 @@ MakeCachedEnsembleCommand(
|
||||
*/
|
||||
|
||||
ensembleCmd = (EnsembleCmdRep *)ckalloc(sizeof(EnsembleCmdRep));
|
||||
ECRSetIntRep(objPtr, ensembleCmd);
|
||||
ECRSetInternalRep(objPtr, ensembleCmd);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2829,7 +2847,7 @@ FreeEnsembleCmdRep(
|
||||
{
|
||||
EnsembleCmdRep *ensembleCmd;
|
||||
|
||||
ECRGetIntRep(objPtr, ensembleCmd);
|
||||
ECRGetInternalRep(objPtr, ensembleCmd);
|
||||
TclCleanupCommandMacro(ensembleCmd->token);
|
||||
if (ensembleCmd->fix) {
|
||||
Tcl_DecrRefCount(ensembleCmd->fix);
|
||||
@@ -2863,8 +2881,8 @@ DupEnsembleCmdRep(
|
||||
EnsembleCmdRep *ensembleCmd;
|
||||
EnsembleCmdRep *ensembleCopy = (EnsembleCmdRep *)ckalloc(sizeof(EnsembleCmdRep));
|
||||
|
||||
ECRGetIntRep(objPtr, ensembleCmd);
|
||||
ECRSetIntRep(copyPtr, ensembleCopy);
|
||||
ECRGetInternalRep(objPtr, ensembleCmd);
|
||||
ECRSetInternalRep(copyPtr, ensembleCopy);
|
||||
|
||||
ensembleCopy->epoch = ensembleCmd->epoch;
|
||||
ensembleCopy->token = ensembleCmd->token;
|
||||
|
||||
@@ -420,6 +420,16 @@ Tcl_PutEnv(
|
||||
|
||||
if ((value != NULL) && (value != name)) {
|
||||
value[0] = '\0';
|
||||
#if defined(_WIN32)
|
||||
if (tenviron == NULL) {
|
||||
/*
|
||||
* When we are started from main(), the _wenviron array could
|
||||
* be NULL and will be initialized by the first _wgetenv() call.
|
||||
*/
|
||||
|
||||
(void) _wgetenv(L"WINDIR");
|
||||
}
|
||||
#endif
|
||||
TclSetEnv(name, value+1);
|
||||
}
|
||||
TclEnvEpoch++;
|
||||
|
||||
@@ -1618,6 +1618,12 @@ Tcl_CreateThread(
|
||||
}
|
||||
return result;
|
||||
#else
|
||||
(void)idPtr;
|
||||
(void)proc;
|
||||
(void)clientData;
|
||||
(void)stackSize;
|
||||
(void)flags;
|
||||
|
||||
return TCL_ERROR;
|
||||
#endif /* TCL_THREADS */
|
||||
}
|
||||
|
||||
+42
-52
@@ -15,7 +15,6 @@
|
||||
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
*/
|
||||
|
||||
#define _BUILD_TCL_EXECUTE 1
|
||||
#include "tclInt.h"
|
||||
#include "tclCompile.h"
|
||||
#include "tclOOInt.h"
|
||||
@@ -208,16 +207,11 @@ typedef struct TEBCdata {
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* These variable-access inline functions have to coincide with those in
|
||||
* tclVar.c
|
||||
* These variable-access macros have to coincide with those in tclVar.c
|
||||
*/
|
||||
|
||||
static inline Var *
|
||||
VarHashGetValue(
|
||||
Tcl_HashEntry *hPtr)
|
||||
{
|
||||
return (Var *) ((char *)hPtr - offsetof(VarInHash, entry));
|
||||
}
|
||||
#define VarHashGetValue(hPtr) \
|
||||
((Var *) ((char *)hPtr - offsetof(VarInHash, entry)))
|
||||
|
||||
static inline Var *
|
||||
VarHashCreateVar(
|
||||
@@ -234,13 +228,8 @@ VarHashCreateVar(
|
||||
return VarHashGetValue(hPtr);
|
||||
}
|
||||
|
||||
static inline Var *
|
||||
VarHashFindVar(
|
||||
TclVarHashTable *tablePtr,
|
||||
Tcl_Obj *key)
|
||||
{
|
||||
return VarHashCreateVar((tablePtr), (key), NULL);
|
||||
}
|
||||
#define VarHashFindVar(tablePtr, key) \
|
||||
VarHashCreateVar((tablePtr), (key), NULL)
|
||||
|
||||
/*
|
||||
* The new macro for ending an instruction; note that a reasonable C-optimiser
|
||||
@@ -272,7 +261,7 @@ VarHashFindVar(
|
||||
#define CHECK_STACK()
|
||||
#endif
|
||||
|
||||
#define NEXT_INST_F(pcAdjustment, nCleanup, resultHandling) \
|
||||
#define NEXT_INST_F(pcAdjustment, nCleanup, resultHandling) \
|
||||
do { \
|
||||
TCL_CT_ASSERT((nCleanup >= 0) && (nCleanup <= 2)); \
|
||||
CHECK_STACK(); \
|
||||
@@ -354,16 +343,16 @@ VarHashFindVar(
|
||||
switch (*pc) { \
|
||||
case INST_JUMP_FALSE1: \
|
||||
NEXT_INST_V(((condition)? 2 : TclGetInt1AtPtr(pc+1)), (cleanup), 0); \
|
||||
break; \
|
||||
break; \
|
||||
case INST_JUMP_TRUE1: \
|
||||
NEXT_INST_V(((condition)? TclGetInt1AtPtr(pc+1) : 2), (cleanup), 0); \
|
||||
break; \
|
||||
break; \
|
||||
case INST_JUMP_FALSE4: \
|
||||
NEXT_INST_V(((condition)? 5 : TclGetInt4AtPtr(pc+1)), (cleanup), 0); \
|
||||
break; \
|
||||
break; \
|
||||
case INST_JUMP_TRUE4: \
|
||||
NEXT_INST_V(((condition)? TclGetInt4AtPtr(pc+1) : 5), (cleanup), 0); \
|
||||
break; \
|
||||
break; \
|
||||
default: \
|
||||
if ((condition) < 0) { \
|
||||
TclNewIntObj(objResultPtr, -1); \
|
||||
@@ -371,12 +360,12 @@ VarHashFindVar(
|
||||
objResultPtr = TCONST((condition) > 0); \
|
||||
} \
|
||||
NEXT_INST_V(0, (cleanup), 1); \
|
||||
break; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
#else /* TCL_COMPILE_DEBUG */
|
||||
#define JUMP_PEEPHOLE_F(condition, pcAdjustment, cleanup) \
|
||||
do { \
|
||||
do{ \
|
||||
if ((condition) < 0) { \
|
||||
TclNewIntObj(objResultPtr, -1); \
|
||||
} else { \
|
||||
@@ -385,7 +374,7 @@ VarHashFindVar(
|
||||
NEXT_INST_F((pcAdjustment), (cleanup), 1); \
|
||||
} while (0)
|
||||
#define JUMP_PEEPHOLE_V(condition, pcAdjustment, cleanup) \
|
||||
do { \
|
||||
do{ \
|
||||
if ((condition) < 0) { \
|
||||
TclNewIntObj(objResultPtr, -1); \
|
||||
} else { \
|
||||
@@ -520,11 +509,11 @@ VarHashFindVar(
|
||||
*/
|
||||
|
||||
#define GetNumberFromObj(interp, objPtr, ptrPtr, tPtr) \
|
||||
((TclHasIntRep((objPtr), &tclIntType)) \
|
||||
((TclHasInternalRep((objPtr), &tclIntType)) \
|
||||
? (*(tPtr) = TCL_NUMBER_INT, \
|
||||
*(ptrPtr) = (ClientData) \
|
||||
(&((objPtr)->internalRep.wideValue)), TCL_OK) : \
|
||||
TclHasIntRep((objPtr), &tclDoubleType) \
|
||||
TclHasInternalRep((objPtr), &tclDoubleType) \
|
||||
? (((TclIsNaN((objPtr)->internalRep.doubleValue)) \
|
||||
? (*(tPtr) = TCL_NUMBER_NAN) \
|
||||
: (*(tPtr) = TCL_NUMBER_DOUBLE)), \
|
||||
@@ -770,9 +759,9 @@ ReleaseDictIterator(
|
||||
{
|
||||
Tcl_DictSearch *searchPtr;
|
||||
Tcl_Obj *dictPtr;
|
||||
const Tcl_ObjIntRep *irPtr;
|
||||
const Tcl_ObjInternalRep *irPtr;
|
||||
|
||||
irPtr = TclFetchIntRep(objPtr, &dictIteratorType);
|
||||
irPtr = TclFetchInternalRep(objPtr, &dictIteratorType);
|
||||
assert(irPtr != NULL);
|
||||
|
||||
/*
|
||||
@@ -1009,7 +998,7 @@ static inline int
|
||||
wordSkip(
|
||||
void *ptr)
|
||||
{
|
||||
int mask = TCL_ALLOCALIGN - 1;
|
||||
int mask = TCL_ALLOCALIGN-1;
|
||||
int base = PTR2INT(ptr) & mask;
|
||||
return (TCL_ALLOCALIGN - base)/sizeof(Tcl_Obj *);
|
||||
}
|
||||
@@ -1485,7 +1474,7 @@ CompileExprObj(
|
||||
* is valid in the current context.
|
||||
*/
|
||||
|
||||
ByteCodeGetIntRep(objPtr, &exprCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &exprCodeType, codePtr);
|
||||
|
||||
if (codePtr != NULL) {
|
||||
Namespace *namespacePtr = iPtr->varFramePtr->nsPtr;
|
||||
@@ -1495,7 +1484,7 @@ CompileExprObj(
|
||||
|| (codePtr->nsPtr != namespacePtr)
|
||||
|| (codePtr->nsEpoch != namespacePtr->resolverEpoch)
|
||||
|| (codePtr->localCachePtr != iPtr->varFramePtr->localCachePtr)) {
|
||||
Tcl_StoreIntRep(objPtr, &exprCodeType, NULL);
|
||||
Tcl_StoreInternalRep(objPtr, &exprCodeType, NULL);
|
||||
codePtr = NULL;
|
||||
}
|
||||
}
|
||||
@@ -1549,7 +1538,7 @@ CompileExprObj(
|
||||
* DupExprCodeInternalRep --
|
||||
*
|
||||
* Part of the Tcl object type implementation for Tcl expression
|
||||
* bytecode. We do not copy the bytecode intrep. Instead, we return
|
||||
* bytecode. We do not copy the bytecode internalrep. Instead, we return
|
||||
* without setting copyPtr->typePtr, so the copy is a plain string copy
|
||||
* of the expression value, and if it is to be used as a compiled
|
||||
* expression, it will just need a recompile.
|
||||
@@ -1558,7 +1547,7 @@ CompileExprObj(
|
||||
* usual (only?) time Tcl_DuplicateObj() will be called is when the copy
|
||||
* is about to be modified, which would invalidate any copied bytecode
|
||||
* anyway. The only reason it might make sense to copy the bytecode is if
|
||||
* we had some modifying routines that operated directly on the intrep,
|
||||
* we had some modifying routines that operated directly on the internalrep,
|
||||
* like we do for lists and dicts.
|
||||
*
|
||||
* Results:
|
||||
@@ -1601,7 +1590,7 @@ FreeExprCodeInternalRep(
|
||||
Tcl_Obj *objPtr)
|
||||
{
|
||||
ByteCode *codePtr;
|
||||
ByteCodeGetIntRep(objPtr, &exprCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &exprCodeType, codePtr);
|
||||
assert(codePtr != NULL);
|
||||
|
||||
TclReleaseByteCode(codePtr);
|
||||
@@ -1640,7 +1629,7 @@ TclCompileObj(
|
||||
* compilation). Otherwise, check that it is "fresh" enough.
|
||||
*/
|
||||
|
||||
ByteCodeGetIntRep(objPtr, &tclByteCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &tclByteCodeType, codePtr);
|
||||
if (codePtr != NULL) {
|
||||
/*
|
||||
* Make sure the Bytecode hasn't been invalidated by, e.g., someone
|
||||
@@ -1786,7 +1775,7 @@ TclCompileObj(
|
||||
iPtr->invokeWord = word;
|
||||
TclSetByteCodeFromAny(interp, objPtr, NULL, NULL);
|
||||
iPtr->invokeCmdFramePtr = NULL;
|
||||
ByteCodeGetIntRep(objPtr, &tclByteCodeType, codePtr);
|
||||
ByteCodeGetInternalRep(objPtr, &tclByteCodeType, codePtr);
|
||||
if (iPtr->varFramePtr->localCachePtr) {
|
||||
codePtr->localCachePtr = iPtr->varFramePtr->localCachePtr;
|
||||
codePtr->localCachePtr->refCount++;
|
||||
@@ -2517,6 +2506,7 @@ TEBCresume(
|
||||
Tcl_IncrRefCount(valuePtr);
|
||||
iPtr->execEnvPtr = corPtr->callerEEPtr;
|
||||
TclSetTailcall(interp, valuePtr);
|
||||
corPtr->yieldPtr = valuePtr;
|
||||
iPtr->execEnvPtr = corPtr->eePtr;
|
||||
yieldParameter = (PTR2INT(NULL)+1); /*==CORO_ACTIVATE_YIELDM*/
|
||||
|
||||
@@ -4874,7 +4864,7 @@ TEBCresume(
|
||||
*/
|
||||
|
||||
if ((TclListObjGetElements(interp, valuePtr, &objc, &objv) == TCL_OK)
|
||||
&& !TclHasIntRep(value2Ptr, &tclListType)) {
|
||||
&& !TclHasInternalRep(value2Ptr, &tclListType)) {
|
||||
int code;
|
||||
|
||||
DECACHE_STACK_INFO();
|
||||
@@ -5272,7 +5262,7 @@ TEBCresume(
|
||||
} else {
|
||||
length = Tcl_UtfToUpper(TclGetString(valuePtr));
|
||||
Tcl_SetObjLength(valuePtr, length);
|
||||
TclFreeIntRep(valuePtr);
|
||||
TclFreeInternalRep(valuePtr);
|
||||
TRACE_APPEND(("\"%.20s\"\n", O2S(valuePtr)));
|
||||
NEXT_INST_F(1, 0, 0);
|
||||
}
|
||||
@@ -5289,7 +5279,7 @@ TEBCresume(
|
||||
} else {
|
||||
length = Tcl_UtfToLower(TclGetString(valuePtr));
|
||||
Tcl_SetObjLength(valuePtr, length);
|
||||
TclFreeIntRep(valuePtr);
|
||||
TclFreeInternalRep(valuePtr);
|
||||
TRACE_APPEND(("\"%.20s\"\n", O2S(valuePtr)));
|
||||
NEXT_INST_F(1, 0, 0);
|
||||
}
|
||||
@@ -5306,7 +5296,7 @@ TEBCresume(
|
||||
} else {
|
||||
length = Tcl_UtfToTitle(TclGetString(valuePtr));
|
||||
Tcl_SetObjLength(valuePtr, length);
|
||||
TclFreeIntRep(valuePtr);
|
||||
TclFreeInternalRep(valuePtr);
|
||||
TRACE_APPEND(("\"%.20s\"\n", O2S(valuePtr)));
|
||||
NEXT_INST_F(1, 0, 0);
|
||||
}
|
||||
@@ -5620,8 +5610,8 @@ TEBCresume(
|
||||
* both.
|
||||
*/
|
||||
|
||||
if (TclHasIntRep(valuePtr, &tclStringType)
|
||||
|| TclHasIntRep(value2Ptr, &tclStringType)) {
|
||||
if (TclHasInternalRep(valuePtr, &tclStringType)
|
||||
|| TclHasInternalRep(value2Ptr, &tclStringType)) {
|
||||
Tcl_UniChar *ustring1, *ustring2;
|
||||
|
||||
ustring1 = Tcl_GetUnicodeFromObj(valuePtr, &length);
|
||||
@@ -6410,7 +6400,7 @@ TEBCresume(
|
||||
if (Tcl_IsShared(valuePtr)) {
|
||||
/*
|
||||
* Here we do some surgery within the Tcl_Obj internals. We want
|
||||
* to copy the intrep, but not the string, so we temporarily hide
|
||||
* to copy the internalrep, but not the string, so we temporarily hide
|
||||
* the string so we do not copy it.
|
||||
*/
|
||||
|
||||
@@ -6435,7 +6425,7 @@ TEBCresume(
|
||||
|
||||
case INST_TRY_CVT_TO_BOOLEAN:
|
||||
valuePtr = OBJ_AT_TOS;
|
||||
if (TclHasIntRep(valuePtr, &tclBooleanType)) {
|
||||
if (TclHasInternalRep(valuePtr, &tclBooleanType)) {
|
||||
objResultPtr = TCONST(1);
|
||||
} else {
|
||||
int res = (TclSetBooleanFromAny(NULL, valuePtr) == TCL_OK);
|
||||
@@ -7270,7 +7260,7 @@ TEBCresume(
|
||||
|
||||
/*
|
||||
* dictPtr is no longer on the stack, and we're not
|
||||
* moving it into the intrep of an iterator. We need
|
||||
* moving it into the internalrep of an iterator. We need
|
||||
* to drop the refcount [Tcl Bug 9b352768e6].
|
||||
*/
|
||||
|
||||
@@ -7280,15 +7270,15 @@ TEBCresume(
|
||||
goto gotError;
|
||||
}
|
||||
{
|
||||
Tcl_ObjIntRep ir;
|
||||
Tcl_ObjInternalRep ir;
|
||||
TclNewObj(statePtr);
|
||||
ir.twoPtrValue.ptr1 = searchPtr;
|
||||
ir.twoPtrValue.ptr2 = dictPtr;
|
||||
Tcl_StoreIntRep(statePtr, &dictIteratorType, &ir);
|
||||
Tcl_StoreInternalRep(statePtr, &dictIteratorType, &ir);
|
||||
}
|
||||
varPtr = LOCAL(opnd);
|
||||
if (varPtr->value.objPtr) {
|
||||
if (TclHasIntRep(varPtr->value.objPtr, &dictIteratorType)) {
|
||||
if (TclHasInternalRep(varPtr->value.objPtr, &dictIteratorType)) {
|
||||
Tcl_Panic("mis-issued dictFirst!");
|
||||
}
|
||||
TclDecrRefCount(varPtr->value.objPtr);
|
||||
@@ -7302,10 +7292,10 @@ TEBCresume(
|
||||
TRACE(("%u => ", opnd));
|
||||
statePtr = (*LOCAL(opnd)).value.objPtr;
|
||||
{
|
||||
const Tcl_ObjIntRep *irPtr;
|
||||
const Tcl_ObjInternalRep *irPtr;
|
||||
|
||||
if (statePtr &&
|
||||
(irPtr = TclFetchIntRep(statePtr, &dictIteratorType))) {
|
||||
(irPtr = TclFetchInternalRep(statePtr, &dictIteratorType))) {
|
||||
searchPtr = (Tcl_DictSearch *)irPtr->twoPtrValue.ptr1;
|
||||
Tcl_DictObjNext(searchPtr, &keyPtr, &valuePtr, &done);
|
||||
} else {
|
||||
@@ -8828,7 +8818,7 @@ ExecuteExtendedUnaryMathOp(
|
||||
int opcode, /* What operation to perform. */
|
||||
Tcl_Obj *valuePtr) /* The operand on the stack. */
|
||||
{
|
||||
ClientData ptr;
|
||||
ClientData ptr = NULL;
|
||||
int type;
|
||||
Tcl_WideInt w;
|
||||
mp_int big;
|
||||
@@ -9862,7 +9852,7 @@ EvalStatsCmd(
|
||||
for (i = 0; i < globalTablePtr->numBuckets; i++) {
|
||||
for (entryPtr = globalTablePtr->buckets[i]; entryPtr != NULL;
|
||||
entryPtr = entryPtr->nextPtr) {
|
||||
if (TclHasIntRep(entryPtr->objPtr, &tclByteCodeType)) {
|
||||
if (TclHasInternalRep(entryPtr->objPtr, &tclByteCodeType)) {
|
||||
numByteCodeLits++;
|
||||
}
|
||||
(void) TclGetStringFromObj(entryPtr->objPtr, &length);
|
||||
|
||||
+2
-2
@@ -53,7 +53,7 @@ Tcl_GetInt(
|
||||
if (obj.refCount > 1) {
|
||||
Tcl_Panic("invalid sharing of Tcl_Obj on C stack");
|
||||
}
|
||||
TclFreeIntRep(&obj);
|
||||
TclFreeInternalRep(&obj);
|
||||
return code;
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ Tcl_GetDouble(
|
||||
if (obj.refCount > 1) {
|
||||
Tcl_Panic("invalid sharing of Tcl_Obj on C stack");
|
||||
}
|
||||
TclFreeIntRep(&obj);
|
||||
TclFreeInternalRep(&obj);
|
||||
return code;
|
||||
}
|
||||
|
||||
|
||||
+310
-309
File diff suppressed because it is too large
Load Diff
+6
-9
@@ -40,9 +40,9 @@ static Tcl_ExitProc FinalizeIOCmdTSD;
|
||||
static Tcl_TcpAcceptProc AcceptCallbackProc;
|
||||
static Tcl_ObjCmdProc ChanPendingObjCmd;
|
||||
static Tcl_ObjCmdProc ChanTruncateObjCmd;
|
||||
static void RegisterTcpServerInterpCleanup(
|
||||
Tcl_Interp *interp,
|
||||
AcceptCallback *acceptCallbackPtr);
|
||||
static void RegisterTcpServerInterpCleanup(
|
||||
Tcl_Interp *interp,
|
||||
AcceptCallback *acceptCallbackPtr);
|
||||
static Tcl_InterpDeleteProc TcpAcceptCallbacksDeleteProc;
|
||||
static void TcpServerCloseProc(ClientData callbackData);
|
||||
static void UnregisterTcpServerInterpCleanupProc(
|
||||
@@ -1219,8 +1219,7 @@ TcpAcceptCallbacksDeleteProc(
|
||||
|
||||
for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
|
||||
hPtr != NULL; hPtr = Tcl_NextHashEntry(&hSearch)) {
|
||||
AcceptCallback *acceptCallbackPtr = (AcceptCallback *)
|
||||
Tcl_GetHashValue(hPtr);
|
||||
AcceptCallback *acceptCallbackPtr = (AcceptCallback *)Tcl_GetHashValue(hPtr);
|
||||
|
||||
acceptCallbackPtr->interp = NULL;
|
||||
}
|
||||
@@ -1308,8 +1307,7 @@ UnregisterTcpServerInterpCleanupProc(
|
||||
Tcl_HashTable *hTblPtr;
|
||||
Tcl_HashEntry *hPtr;
|
||||
|
||||
hTblPtr = (Tcl_HashTable *)
|
||||
Tcl_GetAssocData(interp, "tclTCPAcceptCallbacks", NULL);
|
||||
hTblPtr = (Tcl_HashTable *)Tcl_GetAssocData(interp, "tclTCPAcceptCallbacks", NULL);
|
||||
if (hTblPtr == NULL) {
|
||||
return;
|
||||
}
|
||||
@@ -1637,8 +1635,7 @@ Tcl_SocketObjCmd(
|
||||
port = TclGetString(objv[a]);
|
||||
|
||||
if (server) {
|
||||
AcceptCallback *acceptCallbackPtr = (AcceptCallback *)
|
||||
ckalloc(sizeof(AcceptCallback));
|
||||
AcceptCallback *acceptCallbackPtr = (AcceptCallback *)ckalloc(sizeof(AcceptCallback));
|
||||
|
||||
Tcl_IncrRefCount(script);
|
||||
acceptCallbackPtr->script = script;
|
||||
|
||||
+12
-16
@@ -68,22 +68,18 @@ static int ExecuteCallback(TransformChannelData *ctrl,
|
||||
* the procedure what to do with the result of the script it calls.
|
||||
*/
|
||||
|
||||
enum {
|
||||
TRANSMIT_DONT = 0, /* No transfer to do. */
|
||||
TRANSMIT_DOWN = 1, /* Transfer to the underlying channel. */
|
||||
TRANSMIT_SELF = 2, /* Transfer into our channel. */
|
||||
TRANSMIT_IBUF = 3, /* Transfer to internal input buffer. */
|
||||
TRANSMIT_NUM = 4 /* Transfer number to 'maxRead'. */
|
||||
};
|
||||
#define TRANSMIT_DONT 0 /* No transfer to do. */
|
||||
#define TRANSMIT_DOWN 1 /* Transfer to the underlying channel. */
|
||||
#define TRANSMIT_SELF 2 /* Transfer into our channel. */
|
||||
#define TRANSMIT_IBUF 3 /* Transfer to internal input buffer. */
|
||||
#define TRANSMIT_NUM 4 /* Transfer number to 'maxRead'. */
|
||||
|
||||
/*
|
||||
* Codes for 'preserve' of 'ExecuteCallback'.
|
||||
*/
|
||||
|
||||
enum {
|
||||
P_PRESERVE = 1,
|
||||
P_NO_PRESERVE = 0
|
||||
};
|
||||
#define P_PRESERVE 1
|
||||
#define P_NO_PRESERVE 0
|
||||
|
||||
/*
|
||||
* Strings for the action codes delivered to the script implementing a
|
||||
@@ -973,11 +969,11 @@ TransformWideSeekProc(
|
||||
|
||||
if (parentWideSeekProc == NULL) {
|
||||
/*
|
||||
* We're transferring to narrow seeks at this point; this is a bit
|
||||
* complex because we have to check whether the seek is possible first
|
||||
* (i.e. whether we are losing information in truncating the bits of
|
||||
* the offset). Luckily, there's a defined error for what happens when
|
||||
* trying to go out of the representable range.
|
||||
* We're transferring to narrow seeks at this point; this is a bit complex
|
||||
* because we have to check whether the seek is possible first (i.e.
|
||||
* whether we are losing information in truncating the bits of the
|
||||
* offset). Luckily, there's a defined error for what happens when trying
|
||||
* to go out of the representable range.
|
||||
*/
|
||||
|
||||
#ifndef TCL_NO_DEPRECATED
|
||||
|
||||
+34
-30
@@ -43,13 +43,13 @@ static int ReflectBlock(ClientData clientData, int mode);
|
||||
static void ReflectThread(ClientData clientData, int action);
|
||||
static int ReflectEventRun(Tcl_Event *ev, int flags);
|
||||
static int ReflectEventDelete(Tcl_Event *ev, ClientData cd);
|
||||
#endif /* TCL_THREADS */
|
||||
#endif
|
||||
static long long ReflectSeekWide(ClientData clientData,
|
||||
long long offset, int mode, int *errorCodePtr);
|
||||
#ifndef TCL_NO_DEPRECATED
|
||||
static int ReflectSeek(ClientData clientData, long offset,
|
||||
int mode, int *errorCodePtr);
|
||||
#endif /* !TCL_NO_DEPRECATED */
|
||||
#endif
|
||||
static int ReflectGetOption(ClientData clientData,
|
||||
Tcl_Interp *interp, const char *optionName,
|
||||
Tcl_DString *dsPtr);
|
||||
@@ -58,8 +58,8 @@ static int ReflectSetOption(ClientData clientData,
|
||||
const char *newValue);
|
||||
static int ReflectTruncate(ClientData clientData,
|
||||
long long length);
|
||||
static void TimerRunRead(ClientData clientData);
|
||||
static void TimerRunWrite(ClientData clientData);
|
||||
static void TimerRunRead(ClientData clientData);
|
||||
static void TimerRunWrite(ClientData clientData);
|
||||
|
||||
/*
|
||||
* The C layer channel type/driver definition used by the reflection.
|
||||
@@ -80,7 +80,7 @@ static const Tcl_ChannelType tclRChannelType = {
|
||||
ReflectGetOption, /* Get options. NULL'able */
|
||||
ReflectWatch, /* Initialize notifier */
|
||||
NULL, /* Get OS handle from the channel. NULL'able */
|
||||
ReflectClose, /* No close2 support. NULL'able */
|
||||
ReflectClose, /* No close2 support. NULL'able */
|
||||
ReflectBlock, /* Set blocking/nonblocking. NULL'able */
|
||||
NULL, /* Flush channel. Not used by core. NULL'able */
|
||||
NULL, /* Handle events. NULL'able */
|
||||
@@ -104,27 +104,33 @@ typedef struct {
|
||||
* Tcl level part of the channel. NULL here
|
||||
* signals the channel is dead because the
|
||||
* interpreter/thread containing its Tcl
|
||||
* command is gone. */
|
||||
* command is gone.
|
||||
*/
|
||||
#if TCL_THREADS
|
||||
Tcl_ThreadId thread; /* Thread the 'interp' belongs to.
|
||||
* == Handler thread */
|
||||
Tcl_ThreadId owner; /* Thread owning the structure.
|
||||
* == Channel thread */
|
||||
Tcl_ThreadId thread; /* Thread the 'interp' belongs to. == Handler thread */
|
||||
Tcl_ThreadId owner; /* Thread owning the structure. == Channel thread */
|
||||
#endif
|
||||
Tcl_Obj *cmd; /* Callback command prefix */
|
||||
Tcl_Obj *methods; /* Methods to append to command prefix */
|
||||
Tcl_Obj *name; /* Name of the channel as created */
|
||||
|
||||
int mode; /* Mask of R/W mode */
|
||||
int interest; /* Mask of events the channel is interested
|
||||
* in. */
|
||||
|
||||
int dead; /* Boolean signal that some operations
|
||||
* should no longer be attempted. */
|
||||
Tcl_TimerToken readTimer; /* A token for the timer that is scheduled in
|
||||
* order to call Tcl_NotifyChannel when the
|
||||
* channel is readable */
|
||||
Tcl_TimerToken writeTimer; /* A token for the timer that is scheduled in
|
||||
* order to call Tcl_NotifyChannel when the
|
||||
* channel is writable */
|
||||
|
||||
Tcl_TimerToken readTimer; /*
|
||||
A token for the timer that is scheduled in
|
||||
order to call Tcl_NotifyChannel when the
|
||||
channel is readable
|
||||
*/
|
||||
Tcl_TimerToken writeTimer; /*
|
||||
A token for the timer that is scheduled in
|
||||
order to call Tcl_NotifyChannel when the
|
||||
channel is writable
|
||||
*/
|
||||
|
||||
/*
|
||||
* Note regarding the usage of timers.
|
||||
@@ -690,8 +696,7 @@ TclChanCreateObjCmd(
|
||||
* as the actual channel type.
|
||||
*/
|
||||
|
||||
Tcl_ChannelType *clonePtr = (Tcl_ChannelType *)
|
||||
ckalloc(sizeof(Tcl_ChannelType));
|
||||
Tcl_ChannelType *clonePtr = (Tcl_ChannelType *)ckalloc(sizeof(Tcl_ChannelType));
|
||||
|
||||
memcpy(clonePtr, &tclRChannelType, sizeof(Tcl_ChannelType));
|
||||
|
||||
@@ -897,7 +902,7 @@ TclChanPostEventObjCmd(
|
||||
* have gone seriously haywire.
|
||||
*/
|
||||
|
||||
chan = (Tcl_Channel) Tcl_GetHashValue(hPtr);
|
||||
chan = (Tcl_Channel)Tcl_GetHashValue(hPtr);
|
||||
chanTypePtr = Tcl_GetChannelType(chan);
|
||||
|
||||
/*
|
||||
@@ -1151,7 +1156,7 @@ TclChanCaughtErrorBypass(
|
||||
* ReflectClose --
|
||||
*
|
||||
* This function is invoked when the channel is closed, to delete the
|
||||
* driver specific instance data.
|
||||
* driver-specific instance data.
|
||||
*
|
||||
* Results:
|
||||
* A posix error.
|
||||
@@ -1166,7 +1171,7 @@ static int
|
||||
ReflectClose(
|
||||
ClientData clientData,
|
||||
Tcl_Interp *interp,
|
||||
int flags)
|
||||
int flags)
|
||||
{
|
||||
ReflectedChannel *rcPtr = (ReflectedChannel *)clientData;
|
||||
int result; /* Result code for 'close' */
|
||||
@@ -1184,8 +1189,8 @@ ReflectClose(
|
||||
/*
|
||||
* This call comes from TclFinalizeIOSystem. There are no
|
||||
* interpreters, and therefore we cannot call upon the handler command
|
||||
* anymore. Threading is irrelevant as well. We simply clean up all
|
||||
* our C level data structures and leave the Tcl level to the other
|
||||
* anymore. Threading is irrelevant as well. Simply clean up all
|
||||
* the C level data structures and leave the Tcl level to the other
|
||||
* finalization functions.
|
||||
*/
|
||||
|
||||
@@ -2085,7 +2090,7 @@ ReflectTruncate(
|
||||
* Are we in the correct thread?
|
||||
*/
|
||||
|
||||
#ifdef TCL_THREADS
|
||||
#if TCL_THREADS
|
||||
if (rcPtr->thread != Tcl_GetCurrentThread()) {
|
||||
ForwardParam p;
|
||||
|
||||
@@ -2585,8 +2590,7 @@ static ReflectedChannelMap *
|
||||
GetReflectedChannelMap(
|
||||
Tcl_Interp *interp)
|
||||
{
|
||||
ReflectedChannelMap *rcmPtr = (ReflectedChannelMap *)
|
||||
Tcl_GetAssocData(interp, RCMKEY, NULL);
|
||||
ReflectedChannelMap *rcmPtr = (ReflectedChannelMap *)Tcl_GetAssocData(interp, RCMKEY, NULL);
|
||||
|
||||
if (rcmPtr == NULL) {
|
||||
rcmPtr = (ReflectedChannelMap *)ckalloc(sizeof(ReflectedChannelMap));
|
||||
@@ -2762,6 +2766,8 @@ DeleteReflectedChannelMap(
|
||||
MarkDead(rcPtr);
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
}
|
||||
#else
|
||||
(void)interp;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -2789,8 +2795,7 @@ GetThreadReflectedChannelMap(void)
|
||||
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
|
||||
|
||||
if (!tsdPtr->rcmPtr) {
|
||||
tsdPtr->rcmPtr = (ReflectedChannelMap *)
|
||||
ckalloc(sizeof(ReflectedChannelMap));
|
||||
tsdPtr->rcmPtr = (ReflectedChannelMap *)ckalloc(sizeof(ReflectedChannelMap));
|
||||
Tcl_InitHashTable(&tsdPtr->rcmPtr->map, TCL_STRING_KEYS);
|
||||
Tcl_CreateThreadExitHandler(DeleteThreadReflectedChannelMap, NULL);
|
||||
}
|
||||
@@ -2908,8 +2913,7 @@ DeleteThreadReflectedChannelMap(
|
||||
hPtr != NULL;
|
||||
hPtr = Tcl_FirstHashEntry(&rcmPtr->map, &hSearch)) {
|
||||
Tcl_Channel chan = (Tcl_Channel)Tcl_GetHashValue(hPtr);
|
||||
ReflectedChannel *rcPtr = (ReflectedChannel *)
|
||||
Tcl_GetChannelInstanceData(chan);
|
||||
ReflectedChannel *rcPtr = (ReflectedChannel *)Tcl_GetChannelInstanceData(chan);
|
||||
|
||||
MarkDead(rcPtr);
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
|
||||
+43
-41
@@ -476,10 +476,8 @@ static int TransformLimit(ReflectedTransform *rtPtr,
|
||||
* Operation codes for TransformFlush().
|
||||
*/
|
||||
|
||||
enum {
|
||||
FLUSH_WRITE = 1,
|
||||
FLUSH_DISCARD = 0
|
||||
};
|
||||
#define FLUSH_WRITE 1
|
||||
#define FLUSH_DISCARD 0
|
||||
|
||||
/*
|
||||
* Main methods to plug into the 'chan' ensemble'. ==================
|
||||
@@ -1115,6 +1113,7 @@ ReflectInput(
|
||||
goto stop;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* The buffer is exhausted, but the caller wants even more. We now
|
||||
* have to go to the underlying channel, get more bytes and then
|
||||
@@ -1150,6 +1149,7 @@ ReflectInput(
|
||||
goto stop;
|
||||
}
|
||||
|
||||
|
||||
readBytes = Tcl_ReadRaw(rtPtr->parent,
|
||||
(char *) Tcl_SetByteArrayLength(bufObj, toRead), toRead);
|
||||
if (readBytes < 0) {
|
||||
@@ -1165,10 +1165,11 @@ ReflectInput(
|
||||
}
|
||||
|
||||
/*
|
||||
* Either the down channel is not blocked (a real error) or it is
|
||||
* and there are gotBytes==0 byte copied so far. In either case,
|
||||
* pass up the error, so we either report any real error, or do
|
||||
* not mistakenly signal EOF by returning 0 to the caller.
|
||||
* Either the down channel is not blocked (a real error)
|
||||
* or it is and there are gotBytes==0 byte copied so far.
|
||||
* In either case, pass up the error, so we either report
|
||||
* any real error, or do not mistakenly signal EOF by
|
||||
* returning 0 to the caller.
|
||||
*/
|
||||
|
||||
*errorCodePtr = Tcl_GetErrno();
|
||||
@@ -1176,6 +1177,7 @@ ReflectInput(
|
||||
}
|
||||
|
||||
if (readBytes == 0) {
|
||||
|
||||
/*
|
||||
* Zero returned from Tcl_ReadRaw() always indicates EOF
|
||||
* on the down channel.
|
||||
@@ -1183,26 +1185,26 @@ ReflectInput(
|
||||
|
||||
rtPtr->eofPending = 1;
|
||||
|
||||
/*
|
||||
* Now this is a bit different. The partial data waiting is
|
||||
* converted and returned.
|
||||
*/
|
||||
|
||||
if (HAS(rtPtr->methods, METH_DRAIN)) {
|
||||
if (!TransformDrain(rtPtr, errorCodePtr)) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (ResultLength(&rtPtr->result) == 0) {
|
||||
/*
|
||||
* The drain delivered nothing.
|
||||
* Now this is a bit different. The partial data waiting is
|
||||
* converted and returned.
|
||||
*/
|
||||
|
||||
goto stop;
|
||||
}
|
||||
if (HAS(rtPtr->methods, METH_DRAIN)) {
|
||||
if (!TransformDrain(rtPtr, errorCodePtr)) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
continue; /* at: while (toRead > 0) */
|
||||
if (ResultLength(&rtPtr->result) == 0) {
|
||||
/*
|
||||
* The drain delivered nothing.
|
||||
*/
|
||||
|
||||
goto stop;
|
||||
}
|
||||
|
||||
continue; /* at: while (toRead > 0) */
|
||||
} /* readBytes == 0 */
|
||||
|
||||
/*
|
||||
@@ -1259,7 +1261,7 @@ ReflectOutput(
|
||||
int toWrite,
|
||||
int *errorCodePtr)
|
||||
{
|
||||
ReflectedTransform *rtPtr = (ReflectedTransform *) clientData;
|
||||
ReflectedTransform *rtPtr = (ReflectedTransform *)clientData;
|
||||
|
||||
/*
|
||||
* The following check can be done before thread redirection, because we
|
||||
@@ -1386,15 +1388,16 @@ ReflectSeekWide(
|
||||
curPos = -1;
|
||||
} else {
|
||||
curPos = Tcl_ChannelSeekProc(parent->typePtr)(
|
||||
parent->instanceData, offset, seekMode, errorCodePtr);
|
||||
parent->instanceData, offset, seekMode,
|
||||
errorCodePtr);
|
||||
}
|
||||
#else
|
||||
*errorCodePtr = EINVAL;
|
||||
curPos = -1;
|
||||
#endif
|
||||
} else {
|
||||
curPos = Tcl_ChannelWideSeekProc(parent->typePtr)(parent->instanceData,
|
||||
offset, seekMode, errorCodePtr);
|
||||
curPos = Tcl_ChannelWideSeekProc(parent->typePtr)(parent->instanceData, offset,
|
||||
seekMode, errorCodePtr);
|
||||
}
|
||||
if (curPos == -1) {
|
||||
Tcl_SetErrno(*errorCodePtr);
|
||||
@@ -1420,7 +1423,8 @@ ReflectSeek(
|
||||
* routine.
|
||||
*/
|
||||
|
||||
return ReflectSeekWide(clientData, offset, seekMode, errorCodePtr);
|
||||
return ReflectSeekWide(clientData, offset, seekMode,
|
||||
errorCodePtr);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2038,7 +2042,6 @@ InvokeTclMethod(
|
||||
* This is complex and ugly, and would be completely unnecessary
|
||||
* if we only added support for a TCL_FORBID_EXCEPTIONS flag.
|
||||
*/
|
||||
|
||||
if (result != TCL_ERROR) {
|
||||
Tcl_Obj *cmd = Tcl_NewListObj(cmdc, rtPtr->argv);
|
||||
int cmdLen;
|
||||
@@ -2111,12 +2114,10 @@ static ReflectedTransformMap *
|
||||
GetReflectedTransformMap(
|
||||
Tcl_Interp *interp)
|
||||
{
|
||||
ReflectedTransformMap *rtmPtr = (ReflectedTransformMap *)
|
||||
Tcl_GetAssocData(interp, RTMKEY, NULL);
|
||||
ReflectedTransformMap *rtmPtr = (ReflectedTransformMap *)Tcl_GetAssocData(interp, RTMKEY, NULL);
|
||||
|
||||
if (rtmPtr == NULL) {
|
||||
rtmPtr = (ReflectedTransformMap *)
|
||||
ckalloc(sizeof(ReflectedTransformMap));
|
||||
rtmPtr = (ReflectedTransformMap *)ckalloc(sizeof(ReflectedTransformMap));
|
||||
Tcl_InitHashTable(&rtmPtr->map, TCL_STRING_KEYS);
|
||||
Tcl_SetAssocData(interp, RTMKEY,
|
||||
(Tcl_InterpDeleteProc *) DeleteReflectedTransformMap, rtmPtr);
|
||||
@@ -2157,6 +2158,8 @@ DeleteReflectedTransformMap(
|
||||
ForwardingResult *resultPtr;
|
||||
ForwardingEvent *evPtr;
|
||||
ForwardParam *paramPtr;
|
||||
#else
|
||||
(void)interp;
|
||||
#endif /* TCL_THREADS */
|
||||
|
||||
/*
|
||||
@@ -2279,8 +2282,7 @@ GetThreadReflectedTransformMap(void)
|
||||
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
|
||||
|
||||
if (!tsdPtr->rtmPtr) {
|
||||
tsdPtr->rtmPtr = (ReflectedTransformMap *)
|
||||
ckalloc(sizeof(ReflectedTransformMap));
|
||||
tsdPtr->rtmPtr = (ReflectedTransformMap *)ckalloc(sizeof(ReflectedTransformMap));
|
||||
Tcl_InitHashTable(&tsdPtr->rtmPtr->map, TCL_STRING_KEYS);
|
||||
Tcl_CreateThreadExitHandler(DeleteThreadReflectedTransformMap, NULL);
|
||||
}
|
||||
@@ -2415,8 +2417,8 @@ ForwardOpToOwnerThread(
|
||||
* Create and initialize the event and data structures.
|
||||
*/
|
||||
|
||||
evPtr = (ForwardingEvent *) ckalloc(sizeof(ForwardingEvent));
|
||||
resultPtr = (ForwardingResult *) ckalloc(sizeof(ForwardingResult));
|
||||
evPtr = (ForwardingEvent *)ckalloc(sizeof(ForwardingEvent));
|
||||
resultPtr = (ForwardingResult *)ckalloc(sizeof(ForwardingResult));
|
||||
|
||||
evPtr->event.proc = ForwardProc;
|
||||
evPtr->resultPtr = resultPtr;
|
||||
@@ -2759,7 +2761,7 @@ static void
|
||||
SrcExitProc(
|
||||
ClientData clientData)
|
||||
{
|
||||
ForwardingEvent *evPtr = (ForwardingEvent *) clientData;
|
||||
ForwardingEvent *evPtr = (ForwardingEvent *)clientData;
|
||||
ForwardingResult *resultPtr;
|
||||
ForwardParam *paramPtr;
|
||||
|
||||
@@ -3230,7 +3232,7 @@ TransformDrain(
|
||||
} else
|
||||
#endif /* TCL_THREADS */
|
||||
{
|
||||
if (InvokeTclMethod(rtPtr, "drain", NULL, NULL, &resObj) != TCL_OK) {
|
||||
if (InvokeTclMethod(rtPtr, "drain", NULL, NULL, &resObj)!=TCL_OK) {
|
||||
Tcl_SetChannelError(rtPtr->chan, resObj);
|
||||
Tcl_DecrRefCount(resObj); /* Remove reference held from invoke */
|
||||
*errorCodePtr = EINVAL;
|
||||
@@ -3285,7 +3287,7 @@ TransformFlush(
|
||||
} else
|
||||
#endif /* TCL_THREADS */
|
||||
{
|
||||
if (InvokeTclMethod(rtPtr, "flush", NULL, NULL, &resObj) != TCL_OK) {
|
||||
if (InvokeTclMethod(rtPtr, "flush", NULL, NULL, &resObj)!=TCL_OK) {
|
||||
Tcl_SetChannelError(rtPtr->chan, resObj);
|
||||
Tcl_DecrRefCount(resObj); /* Remove reference held from invoke */
|
||||
*errorCodePtr = EINVAL;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user