updated dependencies
Some checks reported errors
continuous-integration/drone/push Build encountered an error
Some checks reported errors
continuous-integration/drone/push Build encountered an error
This commit is contained in:
parent
ea09905151
commit
40185c4abb
13
go.mod
13
go.mod
@ -3,15 +3,14 @@ module git.paulbsd.com/paulbsd/ipbl
|
|||||||
go 1.17
|
go 1.17
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/labstack/echo/v4 v4.6.1
|
github.com/labstack/echo/v4 v4.6.3
|
||||||
github.com/lib/pq v1.10.4
|
github.com/lib/pq v1.10.4
|
||||||
github.com/robfig/cron v1.2.0
|
gopkg.in/ini.v1 v1.66.4
|
||||||
gopkg.in/ini.v1 v1.66.2
|
|
||||||
xorm.io/xorm v1.2.5
|
xorm.io/xorm v1.2.5
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/goccy/go-json v0.8.1 // indirect
|
github.com/goccy/go-json v0.9.4 // indirect
|
||||||
github.com/golang/snappy v0.0.4 // indirect
|
github.com/golang/snappy v0.0.4 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/labstack/gommon v0.3.1 // indirect
|
github.com/labstack/gommon v0.3.1 // indirect
|
||||||
@ -24,9 +23,9 @@ require (
|
|||||||
github.com/syndtr/goleveldb v1.0.0 // indirect
|
github.com/syndtr/goleveldb v1.0.0 // indirect
|
||||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||||
github.com/valyala/fasttemplate v1.2.1 // indirect
|
github.com/valyala/fasttemplate v1.2.1 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b // indirect
|
golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect
|
||||||
golang.org/x/net v0.0.0-20211209124913-491a49abca63 // indirect
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
||||||
golang.org/x/sys v0.0.0-20211210111614-af8b64212486 // indirect
|
golang.org/x/sys v0.0.0-20220209214540-3681064d5158 // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
xorm.io/builder v0.3.9 // indirect
|
xorm.io/builder v0.3.9 // indirect
|
||||||
)
|
)
|
||||||
|
32
go.sum
32
go.sum
@ -75,8 +75,8 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB
|
|||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||||
github.com/goccy/go-json v0.7.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
github.com/goccy/go-json v0.7.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||||
github.com/goccy/go-json v0.8.1 h1:4/Wjm0JIJaTDm8K1KcGrLHJoa8EsJ13YWeX+6Kfq6uI=
|
github.com/goccy/go-json v0.9.4 h1:L8MLKG2mvVXiQu07qB6hmfqeSYQdOnqPot2GhsIwIaI=
|
||||||
github.com/goccy/go-json v0.8.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
github.com/goccy/go-json v0.9.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||||
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
|
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
|
||||||
@ -214,9 +214,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
|
|||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/labstack/echo/v4 v4.6.1 h1:OMVsrnNFzYlGSdaiYGHbgWQnr+JM7NG+B9suCPie14M=
|
github.com/labstack/echo/v4 v4.6.3 h1:VhPuIZYxsbPmo4m9KAkMU/el2442eB7EBFFhNTTT9ac=
|
||||||
github.com/labstack/echo/v4 v4.6.1/go.mod h1:RnjgMWNDB9g/HucVWhQYNQP9PvbYf6adqftqryo7s9k=
|
github.com/labstack/echo/v4 v4.6.3/go.mod h1:Hk5OiHj0kDqmFq7aHe7eDqI7CUhuCrfpupQtLGGLm7A=
|
||||||
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
|
|
||||||
github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o=
|
github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o=
|
||||||
github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
|
github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
|
||||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
@ -233,7 +232,6 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO
|
|||||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
|
||||||
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||||
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
|
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
|
||||||
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||||
@ -330,8 +328,6 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
|
|||||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
|
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
||||||
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
|
|
||||||
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
|
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||||
@ -374,7 +370,6 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb
|
|||||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||||
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
|
|
||||||
github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
|
github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
|
||||||
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
@ -413,8 +408,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP
|
|||||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4=
|
golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=
|
||||||
golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
@ -447,8 +442,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
|
|||||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||||
golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211209124913-491a49abca63 h1:iocB37TsdFuN6IBRZ+ry36wrkoV51/tl5vOWqkcPGvY=
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
|
||||||
golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@ -491,13 +486,14 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211210111614-af8b64212486 h1:5hpz5aRr+W1erYCL5JRhSUBJRph7l9XkNveoExlrKYk=
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c=
|
||||||
|
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
@ -568,8 +564,8 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
||||||
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
|
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
|
||||||
gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
|
gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4=
|
||||||
gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
|
33
vendor/github.com/goccy/go-json/CHANGELOG.md
generated
vendored
33
vendor/github.com/goccy/go-json/CHANGELOG.md
generated
vendored
@ -1,3 +1,36 @@
|
|||||||
|
# v0.9.4 - 2022/01/21
|
||||||
|
|
||||||
|
* Fix the case where the embedded field is at the end ( #326 )
|
||||||
|
|
||||||
|
# v0.9.3 - 2022/01/14
|
||||||
|
|
||||||
|
* Fix logic of removing struct field for decoder ( #322 )
|
||||||
|
|
||||||
|
# v0.9.2 - 2022/01/14
|
||||||
|
|
||||||
|
* Add invalid decoder to delay type error judgment at decode ( #321 )
|
||||||
|
|
||||||
|
# v0.9.1 - 2022/01/11
|
||||||
|
|
||||||
|
* Fix encoding of MarshalText/MarshalJSON operation with head offset ( #319 )
|
||||||
|
|
||||||
|
# v0.9.0 - 2022/01/05
|
||||||
|
|
||||||
|
### New feature
|
||||||
|
|
||||||
|
* Supports dynamic filtering of struct fields ( #314 )
|
||||||
|
|
||||||
|
### Improve encoding performance
|
||||||
|
|
||||||
|
* Improve map encoding performance ( #310 )
|
||||||
|
* Optimize encoding path for escaped string ( #311 )
|
||||||
|
* Add encoding option for performance ( #312 )
|
||||||
|
|
||||||
|
### Fix bugs
|
||||||
|
|
||||||
|
* Fix panic at encoding map value on 1.18 ( #310 )
|
||||||
|
* Fix MarshalIndent for interface type ( #317 )
|
||||||
|
|
||||||
# v0.8.1 - 2021/12/05
|
# v0.8.1 - 2021/12/05
|
||||||
|
|
||||||
* Fix operation conversion from PtrHead to Head in Recursive type ( #305 )
|
* Fix operation conversion from PtrHead to Head in Recursive type ( #305 )
|
||||||
|
6
vendor/github.com/goccy/go-json/README.md
generated
vendored
6
vendor/github.com/goccy/go-json/README.md
generated
vendored
@ -13,7 +13,7 @@ Fast JSON encoder/decoder compatible with encoding/json for Go
|
|||||||
```
|
```
|
||||||
* version ( expected release date )
|
* version ( expected release date )
|
||||||
|
|
||||||
* v0.8.0
|
* v0.9.0
|
||||||
|
|
|
|
||||||
| while maintaining compatibility with encoding/json, we will add convenient APIs
|
| while maintaining compatibility with encoding/json, we will add convenient APIs
|
||||||
|
|
|
|
||||||
@ -21,9 +21,8 @@ Fast JSON encoder/decoder compatible with encoding/json for Go
|
|||||||
* v1.0.0
|
* v1.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
We are accepting requests for features that will be implemented between v0.8.0 and v.1.0.0.
|
We are accepting requests for features that will be implemented between v0.9.0 and v.1.0.0.
|
||||||
If you have the API you need, please submit your issue [here](https://github.com/goccy/go-json/issues).
|
If you have the API you need, please submit your issue [here](https://github.com/goccy/go-json/issues).
|
||||||
For example, I'm thinking of supporting `context.Context` of `json.Marshaler` and decoding using JSON Path.
|
|
||||||
|
|
||||||
# Features
|
# Features
|
||||||
|
|
||||||
@ -32,6 +31,7 @@ For example, I'm thinking of supporting `context.Context` of `json.Marshaler` an
|
|||||||
- Flexible customization with options
|
- Flexible customization with options
|
||||||
- Coloring the encoded string
|
- Coloring the encoded string
|
||||||
- Can propagate context.Context to `MarshalJSON` or `UnmarshalJSON`
|
- Can propagate context.Context to `MarshalJSON` or `UnmarshalJSON`
|
||||||
|
- Can dynamically filter the fields of the structure type-safely
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
|
15
vendor/github.com/goccy/go-json/encode.go
generated
vendored
15
vendor/github.com/goccy/go-json/encode.go
generated
vendored
@ -61,6 +61,7 @@ func (e *Encoder) encodeWithOption(ctx *encoder.RuntimeContext, v interface{}, o
|
|||||||
if e.enabledHTMLEscape {
|
if e.enabledHTMLEscape {
|
||||||
ctx.Option.Flag |= encoder.HTMLEscapeOption
|
ctx.Option.Flag |= encoder.HTMLEscapeOption
|
||||||
}
|
}
|
||||||
|
ctx.Option.Flag |= encoder.NormalizeUTF8Option
|
||||||
for _, optFunc := range optFuncs {
|
for _, optFunc := range optFuncs {
|
||||||
optFunc(ctx.Option)
|
optFunc(ctx.Option)
|
||||||
}
|
}
|
||||||
@ -111,7 +112,7 @@ func (e *Encoder) SetIndent(prefix, indent string) {
|
|||||||
func marshalContext(ctx context.Context, v interface{}, optFuncs ...EncodeOptionFunc) ([]byte, error) {
|
func marshalContext(ctx context.Context, v interface{}, optFuncs ...EncodeOptionFunc) ([]byte, error) {
|
||||||
rctx := encoder.TakeRuntimeContext()
|
rctx := encoder.TakeRuntimeContext()
|
||||||
rctx.Option.Flag = 0
|
rctx.Option.Flag = 0
|
||||||
rctx.Option.Flag = encoder.HTMLEscapeOption | encoder.ContextOption
|
rctx.Option.Flag = encoder.HTMLEscapeOption | encoder.NormalizeUTF8Option | encoder.ContextOption
|
||||||
rctx.Option.Context = ctx
|
rctx.Option.Context = ctx
|
||||||
for _, optFunc := range optFuncs {
|
for _, optFunc := range optFuncs {
|
||||||
optFunc(rctx.Option)
|
optFunc(rctx.Option)
|
||||||
@ -139,7 +140,7 @@ func marshal(v interface{}, optFuncs ...EncodeOptionFunc) ([]byte, error) {
|
|||||||
ctx := encoder.TakeRuntimeContext()
|
ctx := encoder.TakeRuntimeContext()
|
||||||
|
|
||||||
ctx.Option.Flag = 0
|
ctx.Option.Flag = 0
|
||||||
ctx.Option.Flag |= encoder.HTMLEscapeOption
|
ctx.Option.Flag |= (encoder.HTMLEscapeOption | encoder.NormalizeUTF8Option)
|
||||||
for _, optFunc := range optFuncs {
|
for _, optFunc := range optFuncs {
|
||||||
optFunc(ctx.Option)
|
optFunc(ctx.Option)
|
||||||
}
|
}
|
||||||
@ -166,7 +167,7 @@ func marshalNoEscape(v interface{}) ([]byte, error) {
|
|||||||
ctx := encoder.TakeRuntimeContext()
|
ctx := encoder.TakeRuntimeContext()
|
||||||
|
|
||||||
ctx.Option.Flag = 0
|
ctx.Option.Flag = 0
|
||||||
ctx.Option.Flag |= encoder.HTMLEscapeOption
|
ctx.Option.Flag |= (encoder.HTMLEscapeOption | encoder.NormalizeUTF8Option)
|
||||||
|
|
||||||
buf, err := encodeNoEscape(ctx, v)
|
buf, err := encodeNoEscape(ctx, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -190,7 +191,7 @@ func marshalIndent(v interface{}, prefix, indent string, optFuncs ...EncodeOptio
|
|||||||
ctx := encoder.TakeRuntimeContext()
|
ctx := encoder.TakeRuntimeContext()
|
||||||
|
|
||||||
ctx.Option.Flag = 0
|
ctx.Option.Flag = 0
|
||||||
ctx.Option.Flag |= (encoder.HTMLEscapeOption | encoder.IndentOption)
|
ctx.Option.Flag |= (encoder.HTMLEscapeOption | encoder.NormalizeUTF8Option | encoder.IndentOption)
|
||||||
for _, optFunc := range optFuncs {
|
for _, optFunc := range optFuncs {
|
||||||
optFunc(ctx.Option)
|
optFunc(ctx.Option)
|
||||||
}
|
}
|
||||||
@ -220,7 +221,7 @@ func encode(ctx *encoder.RuntimeContext, v interface{}) ([]byte, error) {
|
|||||||
typ := header.typ
|
typ := header.typ
|
||||||
|
|
||||||
typeptr := uintptr(unsafe.Pointer(typ))
|
typeptr := uintptr(unsafe.Pointer(typ))
|
||||||
codeSet, err := encoder.CompileToGetCodeSet(typeptr)
|
codeSet, err := encoder.CompileToGetCodeSet(ctx, typeptr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -248,7 +249,7 @@ func encodeNoEscape(ctx *encoder.RuntimeContext, v interface{}) ([]byte, error)
|
|||||||
typ := header.typ
|
typ := header.typ
|
||||||
|
|
||||||
typeptr := uintptr(unsafe.Pointer(typ))
|
typeptr := uintptr(unsafe.Pointer(typ))
|
||||||
codeSet, err := encoder.CompileToGetCodeSet(typeptr)
|
codeSet, err := encoder.CompileToGetCodeSet(ctx, typeptr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -275,7 +276,7 @@ func encodeIndent(ctx *encoder.RuntimeContext, v interface{}, prefix, indent str
|
|||||||
typ := header.typ
|
typ := header.typ
|
||||||
|
|
||||||
typeptr := uintptr(unsafe.Pointer(typ))
|
typeptr := uintptr(unsafe.Pointer(typ))
|
||||||
codeSet, err := encoder.CompileToGetCodeSet(typeptr)
|
codeSet, err := encoder.CompileToGetCodeSet(ctx, typeptr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
186
vendor/github.com/goccy/go-json/internal/decoder/compile.go
generated
vendored
186
vendor/github.com/goccy/go-json/internal/decoder/compile.go
generated
vendored
@ -9,7 +9,6 @@ import (
|
|||||||
"unicode"
|
"unicode"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/goccy/go-json/internal/errors"
|
|
||||||
"github.com/goccy/go-json/internal/runtime"
|
"github.com/goccy/go-json/internal/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -126,13 +125,7 @@ func compile(typ *runtime.Type, structName, fieldName string, structTypeToDecode
|
|||||||
case reflect.Func:
|
case reflect.Func:
|
||||||
return compileFunc(typ, structName, fieldName)
|
return compileFunc(typ, structName, fieldName)
|
||||||
}
|
}
|
||||||
return nil, &errors.UnmarshalTypeError{
|
return newInvalidDecoder(typ, structName, fieldName), nil
|
||||||
Value: "object",
|
|
||||||
Type: runtime.RType2Type(typ),
|
|
||||||
Offset: 0,
|
|
||||||
Struct: structName,
|
|
||||||
Field: fieldName,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func isStringTagSupportedType(typ *runtime.Type) bool {
|
func isStringTagSupportedType(typ *runtime.Type) bool {
|
||||||
@ -174,17 +167,9 @@ func compileMapKey(typ *runtime.Type, structName, fieldName string, structTypeTo
|
|||||||
case *ptrDecoder:
|
case *ptrDecoder:
|
||||||
dec = t.dec
|
dec = t.dec
|
||||||
default:
|
default:
|
||||||
goto ERROR
|
return newInvalidDecoder(typ, structName, fieldName), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ERROR:
|
|
||||||
return nil, &errors.UnmarshalTypeError{
|
|
||||||
Value: "object",
|
|
||||||
Type: runtime.RType2Type(typ),
|
|
||||||
Offset: 0,
|
|
||||||
Struct: structName,
|
|
||||||
Field: fieldName,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func compilePtr(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
|
func compilePtr(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
|
||||||
@ -322,64 +307,21 @@ func compileFunc(typ *runtime.Type, strutName, fieldName string) (Decoder, error
|
|||||||
return newFuncDecoder(typ, strutName, fieldName), nil
|
return newFuncDecoder(typ, strutName, fieldName), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func removeConflictFields(fieldMap map[string]*structFieldSet, conflictedMap map[string]struct{}, dec *structDecoder, field reflect.StructField) {
|
func typeToStructTags(typ *runtime.Type) runtime.StructTags {
|
||||||
for k, v := range dec.fieldMap {
|
tags := runtime.StructTags{}
|
||||||
if _, exists := conflictedMap[k]; exists {
|
fieldNum := typ.NumField()
|
||||||
// already conflicted key
|
for i := 0; i < fieldNum; i++ {
|
||||||
|
field := typ.Field(i)
|
||||||
|
if runtime.IsIgnoredStructField(field) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
set, exists := fieldMap[k]
|
tags = append(tags, runtime.StructTagFromField(field))
|
||||||
if !exists {
|
|
||||||
fieldSet := &structFieldSet{
|
|
||||||
dec: v.dec,
|
|
||||||
offset: field.Offset + v.offset,
|
|
||||||
isTaggedKey: v.isTaggedKey,
|
|
||||||
key: k,
|
|
||||||
keyLen: int64(len(k)),
|
|
||||||
}
|
|
||||||
fieldMap[k] = fieldSet
|
|
||||||
lower := strings.ToLower(k)
|
|
||||||
if _, exists := fieldMap[lower]; !exists {
|
|
||||||
fieldMap[lower] = fieldSet
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if set.isTaggedKey {
|
|
||||||
if v.isTaggedKey {
|
|
||||||
// conflict tag key
|
|
||||||
delete(fieldMap, k)
|
|
||||||
delete(fieldMap, strings.ToLower(k))
|
|
||||||
conflictedMap[k] = struct{}{}
|
|
||||||
conflictedMap[strings.ToLower(k)] = struct{}{}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if v.isTaggedKey {
|
|
||||||
fieldSet := &structFieldSet{
|
|
||||||
dec: v.dec,
|
|
||||||
offset: field.Offset + v.offset,
|
|
||||||
isTaggedKey: v.isTaggedKey,
|
|
||||||
key: k,
|
|
||||||
keyLen: int64(len(k)),
|
|
||||||
}
|
|
||||||
fieldMap[k] = fieldSet
|
|
||||||
lower := strings.ToLower(k)
|
|
||||||
if _, exists := fieldMap[lower]; !exists {
|
|
||||||
fieldMap[lower] = fieldSet
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// conflict tag key
|
|
||||||
delete(fieldMap, k)
|
|
||||||
delete(fieldMap, strings.ToLower(k))
|
|
||||||
conflictedMap[k] = struct{}{}
|
|
||||||
conflictedMap[strings.ToLower(k)] = struct{}{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return tags
|
||||||
}
|
}
|
||||||
|
|
||||||
func compileStruct(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
|
func compileStruct(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
|
||||||
fieldNum := typ.NumField()
|
fieldNum := typ.NumField()
|
||||||
conflictedMap := map[string]struct{}{}
|
|
||||||
fieldMap := map[string]*structFieldSet{}
|
fieldMap := map[string]*structFieldSet{}
|
||||||
typeptr := uintptr(unsafe.Pointer(typ))
|
typeptr := uintptr(unsafe.Pointer(typ))
|
||||||
if dec, exists := structTypeToDecoder[typeptr]; exists {
|
if dec, exists := structTypeToDecoder[typeptr]; exists {
|
||||||
@ -388,6 +330,8 @@ func compileStruct(typ *runtime.Type, structName, fieldName string, structTypeTo
|
|||||||
structDec := newStructDecoder(structName, fieldName, fieldMap)
|
structDec := newStructDecoder(structName, fieldName, fieldMap)
|
||||||
structTypeToDecoder[typeptr] = structDec
|
structTypeToDecoder[typeptr] = structDec
|
||||||
structName = typ.Name()
|
structName = typ.Name()
|
||||||
|
tags := typeToStructTags(typ)
|
||||||
|
allFields := []*structFieldSet{}
|
||||||
for i := 0; i < fieldNum; i++ {
|
for i := 0; i < fieldNum; i++ {
|
||||||
field := typ.Field(i)
|
field := typ.Field(i)
|
||||||
if runtime.IsIgnoredStructField(field) {
|
if runtime.IsIgnoredStructField(field) {
|
||||||
@ -405,7 +349,19 @@ func compileStruct(typ *runtime.Type, structName, fieldName string, structTypeTo
|
|||||||
// recursive definition
|
// recursive definition
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
removeConflictFields(fieldMap, conflictedMap, stDec, field)
|
for k, v := range stDec.fieldMap {
|
||||||
|
if tags.ExistsKey(k) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fieldSet := &structFieldSet{
|
||||||
|
dec: v.dec,
|
||||||
|
offset: field.Offset + v.offset,
|
||||||
|
isTaggedKey: v.isTaggedKey,
|
||||||
|
key: k,
|
||||||
|
keyLen: int64(len(k)),
|
||||||
|
}
|
||||||
|
allFields = append(allFields, fieldSet)
|
||||||
|
}
|
||||||
} else if pdec, ok := dec.(*ptrDecoder); ok {
|
} else if pdec, ok := dec.(*ptrDecoder); ok {
|
||||||
contentDec := pdec.contentDecoder()
|
contentDec := pdec.contentDecoder()
|
||||||
if pdec.typ == typ {
|
if pdec.typ == typ {
|
||||||
@ -421,12 +377,9 @@ func compileStruct(typ *runtime.Type, structName, fieldName string, structTypeTo
|
|||||||
}
|
}
|
||||||
if dec, ok := contentDec.(*structDecoder); ok {
|
if dec, ok := contentDec.(*structDecoder); ok {
|
||||||
for k, v := range dec.fieldMap {
|
for k, v := range dec.fieldMap {
|
||||||
if _, exists := conflictedMap[k]; exists {
|
if tags.ExistsKey(k) {
|
||||||
// already conflicted key
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
set, exists := fieldMap[k]
|
|
||||||
if !exists {
|
|
||||||
fieldSet := &structFieldSet{
|
fieldSet := &structFieldSet{
|
||||||
dec: newAnonymousFieldDecoder(pdec.typ, v.offset, v.dec),
|
dec: newAnonymousFieldDecoder(pdec.typ, v.offset, v.dec),
|
||||||
offset: field.Offset,
|
offset: field.Offset,
|
||||||
@ -435,44 +388,7 @@ func compileStruct(typ *runtime.Type, structName, fieldName string, structTypeTo
|
|||||||
keyLen: int64(len(k)),
|
keyLen: int64(len(k)),
|
||||||
err: fieldSetErr,
|
err: fieldSetErr,
|
||||||
}
|
}
|
||||||
fieldMap[k] = fieldSet
|
allFields = append(allFields, fieldSet)
|
||||||
lower := strings.ToLower(k)
|
|
||||||
if _, exists := fieldMap[lower]; !exists {
|
|
||||||
fieldMap[lower] = fieldSet
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if set.isTaggedKey {
|
|
||||||
if v.isTaggedKey {
|
|
||||||
// conflict tag key
|
|
||||||
delete(fieldMap, k)
|
|
||||||
delete(fieldMap, strings.ToLower(k))
|
|
||||||
conflictedMap[k] = struct{}{}
|
|
||||||
conflictedMap[strings.ToLower(k)] = struct{}{}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if v.isTaggedKey {
|
|
||||||
fieldSet := &structFieldSet{
|
|
||||||
dec: newAnonymousFieldDecoder(pdec.typ, v.offset, v.dec),
|
|
||||||
offset: field.Offset,
|
|
||||||
isTaggedKey: v.isTaggedKey,
|
|
||||||
key: k,
|
|
||||||
keyLen: int64(len(k)),
|
|
||||||
err: fieldSetErr,
|
|
||||||
}
|
|
||||||
fieldMap[k] = fieldSet
|
|
||||||
lower := strings.ToLower(k)
|
|
||||||
if _, exists := fieldMap[lower]; !exists {
|
|
||||||
fieldMap[lower] = fieldSet
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// conflict tag key
|
|
||||||
delete(fieldMap, k)
|
|
||||||
delete(fieldMap, strings.ToLower(k))
|
|
||||||
conflictedMap[k] = struct{}{}
|
|
||||||
conflictedMap[strings.ToLower(k)] = struct{}{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -493,18 +409,58 @@ func compileStruct(typ *runtime.Type, structName, fieldName string, structTypeTo
|
|||||||
key: key,
|
key: key,
|
||||||
keyLen: int64(len(key)),
|
keyLen: int64(len(key)),
|
||||||
}
|
}
|
||||||
fieldMap[key] = fieldSet
|
allFields = append(allFields, fieldSet)
|
||||||
lower := strings.ToLower(key)
|
|
||||||
if _, exists := fieldMap[lower]; !exists {
|
|
||||||
fieldMap[lower] = fieldSet
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for _, set := range filterDuplicatedFields(allFields) {
|
||||||
|
fieldMap[set.key] = set
|
||||||
|
lower := strings.ToLower(set.key)
|
||||||
|
if _, exists := fieldMap[lower]; !exists {
|
||||||
|
// first win
|
||||||
|
fieldMap[lower] = set
|
||||||
|
}
|
||||||
}
|
}
|
||||||
delete(structTypeToDecoder, typeptr)
|
delete(structTypeToDecoder, typeptr)
|
||||||
structDec.tryOptimize()
|
structDec.tryOptimize()
|
||||||
return structDec, nil
|
return structDec, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func filterDuplicatedFields(allFields []*structFieldSet) []*structFieldSet {
|
||||||
|
fieldMap := map[string][]*structFieldSet{}
|
||||||
|
for _, field := range allFields {
|
||||||
|
fieldMap[field.key] = append(fieldMap[field.key], field)
|
||||||
|
}
|
||||||
|
duplicatedFieldMap := map[string]struct{}{}
|
||||||
|
for k, sets := range fieldMap {
|
||||||
|
sets = filterFieldSets(sets)
|
||||||
|
if len(sets) != 1 {
|
||||||
|
duplicatedFieldMap[k] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filtered := make([]*structFieldSet, 0, len(allFields))
|
||||||
|
for _, field := range allFields {
|
||||||
|
if _, exists := duplicatedFieldMap[field.key]; exists {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
filtered = append(filtered, field)
|
||||||
|
}
|
||||||
|
return filtered
|
||||||
|
}
|
||||||
|
|
||||||
|
func filterFieldSets(sets []*structFieldSet) []*structFieldSet {
|
||||||
|
if len(sets) == 1 {
|
||||||
|
return sets
|
||||||
|
}
|
||||||
|
filtered := make([]*structFieldSet, 0, len(sets))
|
||||||
|
for _, set := range sets {
|
||||||
|
if set.isTaggedKey {
|
||||||
|
filtered = append(filtered, set)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filtered
|
||||||
|
}
|
||||||
|
|
||||||
func implementsUnmarshalJSONType(typ *runtime.Type) bool {
|
func implementsUnmarshalJSONType(typ *runtime.Type) bool {
|
||||||
return typ.Implements(unmarshalJSONType) || typ.Implements(unmarshalJSONContextType)
|
return typ.Implements(unmarshalJSONType) || typ.Implements(unmarshalJSONContextType)
|
||||||
}
|
}
|
||||||
|
45
vendor/github.com/goccy/go-json/internal/decoder/invalid.go
generated
vendored
Normal file
45
vendor/github.com/goccy/go-json/internal/decoder/invalid.go
generated
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package decoder
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/goccy/go-json/internal/errors"
|
||||||
|
"github.com/goccy/go-json/internal/runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
type invalidDecoder struct {
|
||||||
|
typ *runtime.Type
|
||||||
|
kind reflect.Kind
|
||||||
|
structName string
|
||||||
|
fieldName string
|
||||||
|
}
|
||||||
|
|
||||||
|
func newInvalidDecoder(typ *runtime.Type, structName, fieldName string) *invalidDecoder {
|
||||||
|
return &invalidDecoder{
|
||||||
|
typ: typ,
|
||||||
|
kind: typ.Kind(),
|
||||||
|
structName: structName,
|
||||||
|
fieldName: fieldName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *invalidDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) error {
|
||||||
|
return &errors.UnmarshalTypeError{
|
||||||
|
Value: "object",
|
||||||
|
Type: runtime.RType2Type(d.typ),
|
||||||
|
Offset: s.totalOffset(),
|
||||||
|
Struct: d.structName,
|
||||||
|
Field: d.fieldName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *invalidDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
|
||||||
|
return 0, &errors.UnmarshalTypeError{
|
||||||
|
Value: "object",
|
||||||
|
Type: runtime.RType2Type(d.typ),
|
||||||
|
Offset: cursor,
|
||||||
|
Struct: d.structName,
|
||||||
|
Field: d.fieldName,
|
||||||
|
}
|
||||||
|
}
|
136
vendor/github.com/goccy/go-json/internal/encoder/code.go
generated
vendored
136
vendor/github.com/goccy/go-json/internal/encoder/code.go
generated
vendored
@ -10,6 +10,7 @@ import (
|
|||||||
type Code interface {
|
type Code interface {
|
||||||
Kind() CodeKind
|
Kind() CodeKind
|
||||||
ToOpcode(*compileContext) Opcodes
|
ToOpcode(*compileContext) Opcodes
|
||||||
|
Filter(*FieldQuery) Code
|
||||||
}
|
}
|
||||||
|
|
||||||
type AnonymousCode interface {
|
type AnonymousCode interface {
|
||||||
@ -82,6 +83,10 @@ func (c *IntCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{code}
|
return Opcodes{code}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *IntCode) Filter(_ *FieldQuery) Code {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
type UintCode struct {
|
type UintCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
bitSize uint8
|
bitSize uint8
|
||||||
@ -108,6 +113,10 @@ func (c *UintCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{code}
|
return Opcodes{code}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *UintCode) Filter(_ *FieldQuery) Code {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
type FloatCode struct {
|
type FloatCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
bitSize uint8
|
bitSize uint8
|
||||||
@ -140,6 +149,10 @@ func (c *FloatCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{code}
|
return Opcodes{code}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *FloatCode) Filter(_ *FieldQuery) Code {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
type StringCode struct {
|
type StringCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
isPtr bool
|
isPtr bool
|
||||||
@ -169,6 +182,10 @@ func (c *StringCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{code}
|
return Opcodes{code}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *StringCode) Filter(_ *FieldQuery) Code {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
type BoolCode struct {
|
type BoolCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
isPtr bool
|
isPtr bool
|
||||||
@ -190,6 +207,10 @@ func (c *BoolCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{code}
|
return Opcodes{code}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *BoolCode) Filter(_ *FieldQuery) Code {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
type BytesCode struct {
|
type BytesCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
isPtr bool
|
isPtr bool
|
||||||
@ -211,6 +232,10 @@ func (c *BytesCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{code}
|
return Opcodes{code}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *BytesCode) Filter(_ *FieldQuery) Code {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
type SliceCode struct {
|
type SliceCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
value Code
|
value Code
|
||||||
@ -245,6 +270,10 @@ func (c *SliceCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{header}.Add(codes...).Add(elemCode).Add(end)
|
return Opcodes{header}.Add(codes...).Add(elemCode).Add(end)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *SliceCode) Filter(_ *FieldQuery) Code {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
type ArrayCode struct {
|
type ArrayCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
value Code
|
value Code
|
||||||
@ -286,6 +315,10 @@ func (c *ArrayCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{header}.Add(codes...).Add(elemCode).Add(end)
|
return Opcodes{header}.Add(codes...).Add(elemCode).Add(end)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *ArrayCode) Filter(_ *FieldQuery) Code {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
type MapCode struct {
|
type MapCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
key Code
|
key Code
|
||||||
@ -332,6 +365,10 @@ func (c *MapCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{header}.Add(keyCodes...).Add(value).Add(valueCodes...).Add(key).Add(end)
|
return Opcodes{header}.Add(keyCodes...).Add(value).Add(valueCodes...).Add(key).Add(end)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *MapCode) Filter(_ *FieldQuery) Code {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
type StructCode struct {
|
type StructCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
fields []*StructFieldCode
|
fields []*StructFieldCode
|
||||||
@ -399,12 +436,13 @@ func (c *StructCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
}
|
}
|
||||||
if isEndField {
|
if isEndField {
|
||||||
endField := fieldCodes.Last()
|
endField := fieldCodes.Last()
|
||||||
if len(codes) > 0 {
|
if field.isAnonymous {
|
||||||
codes.First().End = endField
|
|
||||||
} else if field.isAnonymous {
|
|
||||||
firstField.End = endField
|
firstField.End = endField
|
||||||
lastField := c.lastAnonymousFieldCode(firstField)
|
lastField := c.lastAnonymousFieldCode(firstField)
|
||||||
lastField.NextField = endField
|
lastField.NextField = endField
|
||||||
|
}
|
||||||
|
if len(codes) > 0 {
|
||||||
|
codes.First().End = endField
|
||||||
} else {
|
} else {
|
||||||
firstField.End = endField
|
firstField.End = endField
|
||||||
}
|
}
|
||||||
@ -520,6 +558,45 @@ func (c *StructCode) enableIndirect() {
|
|||||||
structCode.enableIndirect()
|
structCode.enableIndirect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *StructCode) Filter(query *FieldQuery) Code {
|
||||||
|
fieldMap := map[string]*FieldQuery{}
|
||||||
|
for _, field := range query.Fields {
|
||||||
|
fieldMap[field.Name] = field
|
||||||
|
}
|
||||||
|
fields := make([]*StructFieldCode, 0, len(c.fields))
|
||||||
|
for _, field := range c.fields {
|
||||||
|
query, exists := fieldMap[field.key]
|
||||||
|
if !exists {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fieldCode := &StructFieldCode{
|
||||||
|
typ: field.typ,
|
||||||
|
key: field.key,
|
||||||
|
tag: field.tag,
|
||||||
|
value: field.value,
|
||||||
|
offset: field.offset,
|
||||||
|
isAnonymous: field.isAnonymous,
|
||||||
|
isTaggedKey: field.isTaggedKey,
|
||||||
|
isNilableType: field.isNilableType,
|
||||||
|
isNilCheck: field.isNilCheck,
|
||||||
|
isAddrForMarshaler: field.isAddrForMarshaler,
|
||||||
|
isNextOpPtrType: field.isNextOpPtrType,
|
||||||
|
}
|
||||||
|
if len(query.Fields) > 0 {
|
||||||
|
fieldCode.value = fieldCode.value.Filter(query)
|
||||||
|
}
|
||||||
|
fields = append(fields, fieldCode)
|
||||||
|
}
|
||||||
|
return &StructCode{
|
||||||
|
typ: c.typ,
|
||||||
|
fields: fields,
|
||||||
|
isPtr: c.isPtr,
|
||||||
|
disableIndirectConversion: c.disableIndirectConversion,
|
||||||
|
isIndirect: c.isIndirect,
|
||||||
|
isRecursive: c.isRecursive,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type StructFieldCode struct {
|
type StructFieldCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
key string
|
key string
|
||||||
@ -532,6 +609,7 @@ type StructFieldCode struct {
|
|||||||
isNilCheck bool
|
isNilCheck bool
|
||||||
isAddrForMarshaler bool
|
isAddrForMarshaler bool
|
||||||
isNextOpPtrType bool
|
isNextOpPtrType bool
|
||||||
|
isMarshalerContext bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StructFieldCode) getStruct() *StructCode {
|
func (c *StructFieldCode) getStruct() *StructCode {
|
||||||
@ -574,8 +652,12 @@ func (c *StructFieldCode) headerOpcodes(ctx *compileContext, field *Opcode, valu
|
|||||||
value := valueCodes.First()
|
value := valueCodes.First()
|
||||||
op := optimizeStructHeader(value, c.tag)
|
op := optimizeStructHeader(value, c.tag)
|
||||||
field.Op = op
|
field.Op = op
|
||||||
|
if value.Flags&MarshalerContextFlags != 0 {
|
||||||
|
field.Flags |= MarshalerContextFlags
|
||||||
|
}
|
||||||
field.NumBitSize = value.NumBitSize
|
field.NumBitSize = value.NumBitSize
|
||||||
field.PtrNum = value.PtrNum
|
field.PtrNum = value.PtrNum
|
||||||
|
field.FieldQuery = value.FieldQuery
|
||||||
fieldCodes := Opcodes{field}
|
fieldCodes := Opcodes{field}
|
||||||
if op.IsMultipleOpHead() {
|
if op.IsMultipleOpHead() {
|
||||||
field.Next = value
|
field.Next = value
|
||||||
@ -590,8 +672,12 @@ func (c *StructFieldCode) fieldOpcodes(ctx *compileContext, field *Opcode, value
|
|||||||
value := valueCodes.First()
|
value := valueCodes.First()
|
||||||
op := optimizeStructField(value, c.tag)
|
op := optimizeStructField(value, c.tag)
|
||||||
field.Op = op
|
field.Op = op
|
||||||
|
if value.Flags&MarshalerContextFlags != 0 {
|
||||||
|
field.Flags |= MarshalerContextFlags
|
||||||
|
}
|
||||||
field.NumBitSize = value.NumBitSize
|
field.NumBitSize = value.NumBitSize
|
||||||
field.PtrNum = value.PtrNum
|
field.PtrNum = value.PtrNum
|
||||||
|
field.FieldQuery = value.FieldQuery
|
||||||
|
|
||||||
fieldCodes := Opcodes{field}
|
fieldCodes := Opcodes{field}
|
||||||
if op.IsMultipleOpField() {
|
if op.IsMultipleOpField() {
|
||||||
@ -645,6 +731,9 @@ func (c *StructFieldCode) flags() OpFlags {
|
|||||||
if c.isAnonymous {
|
if c.isAnonymous {
|
||||||
flags |= AnonymousKeyFlags
|
flags |= AnonymousKeyFlags
|
||||||
}
|
}
|
||||||
|
if c.isMarshalerContext {
|
||||||
|
flags |= MarshalerContextFlags
|
||||||
|
}
|
||||||
return flags
|
return flags
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -726,6 +815,7 @@ func isEnableStructEndOptimization(value Code) bool {
|
|||||||
|
|
||||||
type InterfaceCode struct {
|
type InterfaceCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
|
fieldQuery *FieldQuery
|
||||||
isPtr bool
|
isPtr bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -741,6 +831,7 @@ func (c *InterfaceCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
default:
|
default:
|
||||||
code = newOpCode(ctx, c.typ, OpInterface)
|
code = newOpCode(ctx, c.typ, OpInterface)
|
||||||
}
|
}
|
||||||
|
code.FieldQuery = c.fieldQuery
|
||||||
if c.typ.NumMethod() > 0 {
|
if c.typ.NumMethod() > 0 {
|
||||||
code.Flags |= NonEmptyInterfaceFlags
|
code.Flags |= NonEmptyInterfaceFlags
|
||||||
}
|
}
|
||||||
@ -748,8 +839,17 @@ func (c *InterfaceCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{code}
|
return Opcodes{code}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *InterfaceCode) Filter(query *FieldQuery) Code {
|
||||||
|
return &InterfaceCode{
|
||||||
|
typ: c.typ,
|
||||||
|
fieldQuery: query,
|
||||||
|
isPtr: c.isPtr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type MarshalJSONCode struct {
|
type MarshalJSONCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
|
fieldQuery *FieldQuery
|
||||||
isAddrForMarshaler bool
|
isAddrForMarshaler bool
|
||||||
isNilableType bool
|
isNilableType bool
|
||||||
isMarshalerContext bool
|
isMarshalerContext bool
|
||||||
@ -761,6 +861,7 @@ func (c *MarshalJSONCode) Kind() CodeKind {
|
|||||||
|
|
||||||
func (c *MarshalJSONCode) ToOpcode(ctx *compileContext) Opcodes {
|
func (c *MarshalJSONCode) ToOpcode(ctx *compileContext) Opcodes {
|
||||||
code := newOpCode(ctx, c.typ, OpMarshalJSON)
|
code := newOpCode(ctx, c.typ, OpMarshalJSON)
|
||||||
|
code.FieldQuery = c.fieldQuery
|
||||||
if c.isAddrForMarshaler {
|
if c.isAddrForMarshaler {
|
||||||
code.Flags |= AddrForMarshalerFlags
|
code.Flags |= AddrForMarshalerFlags
|
||||||
}
|
}
|
||||||
@ -776,8 +877,19 @@ func (c *MarshalJSONCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{code}
|
return Opcodes{code}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *MarshalJSONCode) Filter(query *FieldQuery) Code {
|
||||||
|
return &MarshalJSONCode{
|
||||||
|
typ: c.typ,
|
||||||
|
fieldQuery: query,
|
||||||
|
isAddrForMarshaler: c.isAddrForMarshaler,
|
||||||
|
isNilableType: c.isNilableType,
|
||||||
|
isMarshalerContext: c.isMarshalerContext,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type MarshalTextCode struct {
|
type MarshalTextCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
|
fieldQuery *FieldQuery
|
||||||
isAddrForMarshaler bool
|
isAddrForMarshaler bool
|
||||||
isNilableType bool
|
isNilableType bool
|
||||||
}
|
}
|
||||||
@ -788,6 +900,7 @@ func (c *MarshalTextCode) Kind() CodeKind {
|
|||||||
|
|
||||||
func (c *MarshalTextCode) ToOpcode(ctx *compileContext) Opcodes {
|
func (c *MarshalTextCode) ToOpcode(ctx *compileContext) Opcodes {
|
||||||
code := newOpCode(ctx, c.typ, OpMarshalText)
|
code := newOpCode(ctx, c.typ, OpMarshalText)
|
||||||
|
code.FieldQuery = c.fieldQuery
|
||||||
if c.isAddrForMarshaler {
|
if c.isAddrForMarshaler {
|
||||||
code.Flags |= AddrForMarshalerFlags
|
code.Flags |= AddrForMarshalerFlags
|
||||||
}
|
}
|
||||||
@ -800,6 +913,15 @@ func (c *MarshalTextCode) ToOpcode(ctx *compileContext) Opcodes {
|
|||||||
return Opcodes{code}
|
return Opcodes{code}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *MarshalTextCode) Filter(query *FieldQuery) Code {
|
||||||
|
return &MarshalTextCode{
|
||||||
|
typ: c.typ,
|
||||||
|
fieldQuery: query,
|
||||||
|
isAddrForMarshaler: c.isAddrForMarshaler,
|
||||||
|
isNilableType: c.isNilableType,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type PtrCode struct {
|
type PtrCode struct {
|
||||||
typ *runtime.Type
|
typ *runtime.Type
|
||||||
value Code
|
value Code
|
||||||
@ -830,6 +952,14 @@ func (c *PtrCode) ToAnonymousOpcode(ctx *compileContext) Opcodes {
|
|||||||
return codes
|
return codes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *PtrCode) Filter(query *FieldQuery) Code {
|
||||||
|
return &PtrCode{
|
||||||
|
typ: c.typ,
|
||||||
|
value: c.value.Filter(query),
|
||||||
|
ptrNum: c.ptrNum,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func convertPtrOp(code *Opcode) OpType {
|
func convertPtrOp(code *Opcode) OpType {
|
||||||
ptrHeadOp := code.Op.HeadToPtrHead()
|
ptrHeadOp := code.Op.HeadToPtrHead()
|
||||||
if code.Op != ptrHeadOp {
|
if code.Op != ptrHeadOp {
|
||||||
|
27
vendor/github.com/goccy/go-json/internal/encoder/compiler.go
generated
vendored
27
vendor/github.com/goccy/go-json/internal/encoder/compiler.go
generated
vendored
@ -63,6 +63,27 @@ func compileToGetCodeSetSlowPath(typeptr uintptr) (*OpcodeSet, error) {
|
|||||||
return codeSet, nil
|
return codeSet, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getFilteredCodeSetIfNeeded(ctx *RuntimeContext, codeSet *OpcodeSet) (*OpcodeSet, error) {
|
||||||
|
if (ctx.Option.Flag & ContextOption) == 0 {
|
||||||
|
return codeSet, nil
|
||||||
|
}
|
||||||
|
query := FieldQueryFromContext(ctx.Option.Context)
|
||||||
|
if query == nil {
|
||||||
|
return codeSet, nil
|
||||||
|
}
|
||||||
|
ctx.Option.Flag |= FieldQueryOption
|
||||||
|
cacheCodeSet := codeSet.getQueryCache(query.Hash())
|
||||||
|
if cacheCodeSet != nil {
|
||||||
|
return cacheCodeSet, nil
|
||||||
|
}
|
||||||
|
queryCodeSet, err := newCompiler().codeToOpcodeSet(codeSet.Type, codeSet.Code.Filter(query))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
codeSet.setQueryCache(query.Hash(), queryCodeSet)
|
||||||
|
return queryCodeSet, nil
|
||||||
|
}
|
||||||
|
|
||||||
type Compiler struct {
|
type Compiler struct {
|
||||||
structTypeToCode map[uintptr]*StructCode
|
structTypeToCode map[uintptr]*StructCode
|
||||||
}
|
}
|
||||||
@ -80,6 +101,10 @@ func (c *Compiler) compile(typeptr uintptr) (*OpcodeSet, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
return c.codeToOpcodeSet(typ, code)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Compiler) codeToOpcodeSet(typ *runtime.Type, code Code) (*OpcodeSet, error) {
|
||||||
noescapeKeyCode := c.codeToOpcode(&compileContext{
|
noescapeKeyCode := c.codeToOpcode(&compileContext{
|
||||||
structTypeToCodes: map[uintptr]Opcodes{},
|
structTypeToCodes: map[uintptr]Opcodes{},
|
||||||
recursiveCodes: &Opcodes{},
|
recursiveCodes: &Opcodes{},
|
||||||
@ -107,6 +132,8 @@ func (c *Compiler) compile(typeptr uintptr) (*OpcodeSet, error) {
|
|||||||
InterfaceEscapeKeyCode: interfaceEscapeKeyCode,
|
InterfaceEscapeKeyCode: interfaceEscapeKeyCode,
|
||||||
CodeLength: codeLength,
|
CodeLength: codeLength,
|
||||||
EndCode: ToEndCode(interfaceNoescapeKeyCode),
|
EndCode: ToEndCode(interfaceNoescapeKeyCode),
|
||||||
|
Code: code,
|
||||||
|
QueryCache: map[string]*OpcodeSet{},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
16
vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go
generated
vendored
16
vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go
generated
vendored
@ -3,18 +3,26 @@
|
|||||||
|
|
||||||
package encoder
|
package encoder
|
||||||
|
|
||||||
func CompileToGetCodeSet(typeptr uintptr) (*OpcodeSet, error) {
|
func CompileToGetCodeSet(ctx *RuntimeContext, typeptr uintptr) (*OpcodeSet, error) {
|
||||||
if typeptr > typeAddr.MaxTypeAddr {
|
if typeptr > typeAddr.MaxTypeAddr {
|
||||||
return compileToGetCodeSetSlowPath(typeptr)
|
return compileToGetCodeSetSlowPath(typeptr)
|
||||||
}
|
}
|
||||||
index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
|
index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
|
||||||
if codeSet := cachedOpcodeSets[index]; codeSet != nil {
|
if codeSet := cachedOpcodeSets[index]; codeSet != nil {
|
||||||
return codeSet, nil
|
filtered, err := getFilteredCodeSetIfNeeded(ctx, codeSet)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return filtered, nil
|
||||||
}
|
}
|
||||||
codeSet, err := newCompiler().compile(typeptr)
|
codeSet, err := newCompiler().compile(typeptr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
cachedOpcodeSets[index] = codeSet
|
filtered, err := getFilteredCodeSetIfNeeded(ctx, codeSet)
|
||||||
return codeSet, nil
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
cachedOpcodeSets[index] = codeSet
|
||||||
|
return filtered, nil
|
||||||
}
|
}
|
||||||
|
15
vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go
generated
vendored
15
vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go
generated
vendored
@ -9,15 +9,20 @@ import (
|
|||||||
|
|
||||||
var setsMu sync.RWMutex
|
var setsMu sync.RWMutex
|
||||||
|
|
||||||
func CompileToGetCodeSet(typeptr uintptr) (*OpcodeSet, error) {
|
func CompileToGetCodeSet(ctx *RuntimeContext, typeptr uintptr) (*OpcodeSet, error) {
|
||||||
if typeptr > typeAddr.MaxTypeAddr {
|
if typeptr > typeAddr.MaxTypeAddr {
|
||||||
return compileToGetCodeSetSlowPath(typeptr)
|
return compileToGetCodeSetSlowPath(typeptr)
|
||||||
}
|
}
|
||||||
index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
|
index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
|
||||||
setsMu.RLock()
|
setsMu.RLock()
|
||||||
if codeSet := cachedOpcodeSets[index]; codeSet != nil {
|
if codeSet := cachedOpcodeSets[index]; codeSet != nil {
|
||||||
|
filtered, err := getFilteredCodeSetIfNeeded(ctx, codeSet)
|
||||||
|
if err != nil {
|
||||||
setsMu.RUnlock()
|
setsMu.RUnlock()
|
||||||
return codeSet, nil
|
return nil, err
|
||||||
|
}
|
||||||
|
setsMu.RUnlock()
|
||||||
|
return filtered, nil
|
||||||
}
|
}
|
||||||
setsMu.RUnlock()
|
setsMu.RUnlock()
|
||||||
|
|
||||||
@ -25,8 +30,12 @@ func CompileToGetCodeSet(typeptr uintptr) (*OpcodeSet, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
filtered, err := getFilteredCodeSetIfNeeded(ctx, codeSet)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
setsMu.Lock()
|
setsMu.Lock()
|
||||||
cachedOpcodeSets[index] = codeSet
|
cachedOpcodeSets[index] = codeSet
|
||||||
setsMu.Unlock()
|
setsMu.Unlock()
|
||||||
return codeSet, nil
|
return filtered, nil
|
||||||
}
|
}
|
||||||
|
126
vendor/github.com/goccy/go-json/internal/encoder/decode_rune.go
generated
vendored
Normal file
126
vendor/github.com/goccy/go-json/internal/encoder/decode_rune.go
generated
vendored
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
package encoder
|
||||||
|
|
||||||
|
import "unicode/utf8"
|
||||||
|
|
||||||
|
const (
|
||||||
|
// The default lowest and highest continuation byte.
|
||||||
|
locb = 128 //0b10000000
|
||||||
|
hicb = 191 //0b10111111
|
||||||
|
|
||||||
|
// These names of these constants are chosen to give nice alignment in the
|
||||||
|
// table below. The first nibble is an index into acceptRanges or F for
|
||||||
|
// special one-byte cases. The second nibble is the Rune length or the
|
||||||
|
// Status for the special one-byte case.
|
||||||
|
xx = 0xF1 // invalid: size 1
|
||||||
|
as = 0xF0 // ASCII: size 1
|
||||||
|
s1 = 0x02 // accept 0, size 2
|
||||||
|
s2 = 0x13 // accept 1, size 3
|
||||||
|
s3 = 0x03 // accept 0, size 3
|
||||||
|
s4 = 0x23 // accept 2, size 3
|
||||||
|
s5 = 0x34 // accept 3, size 4
|
||||||
|
s6 = 0x04 // accept 0, size 4
|
||||||
|
s7 = 0x44 // accept 4, size 4
|
||||||
|
)
|
||||||
|
|
||||||
|
// first is information about the first byte in a UTF-8 sequence.
|
||||||
|
var first = [256]uint8{
|
||||||
|
// 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x00-0x0F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x10-0x1F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x20-0x2F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x30-0x3F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x40-0x4F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x50-0x5F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x60-0x6F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x70-0x7F
|
||||||
|
// 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||||
|
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x80-0x8F
|
||||||
|
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x90-0x9F
|
||||||
|
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xA0-0xAF
|
||||||
|
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xB0-0xBF
|
||||||
|
xx, xx, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xC0-0xCF
|
||||||
|
s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xD0-0xDF
|
||||||
|
s2, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s4, s3, s3, // 0xE0-0xEF
|
||||||
|
s5, s6, s6, s6, s7, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xF0-0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
lineSep = byte(168) //'\u2028'
|
||||||
|
paragraphSep = byte(169) //'\u2029'
|
||||||
|
)
|
||||||
|
|
||||||
|
type decodeRuneState int
|
||||||
|
|
||||||
|
const (
|
||||||
|
validUTF8State decodeRuneState = iota
|
||||||
|
runeErrorState
|
||||||
|
lineSepState
|
||||||
|
paragraphSepState
|
||||||
|
)
|
||||||
|
|
||||||
|
func decodeRuneInString(s string) (decodeRuneState, int) {
|
||||||
|
n := len(s)
|
||||||
|
s0 := s[0]
|
||||||
|
x := first[s0]
|
||||||
|
if x >= as {
|
||||||
|
// The following code simulates an additional check for x == xx and
|
||||||
|
// handling the ASCII and invalid cases accordingly. This mask-and-or
|
||||||
|
// approach prevents an additional branch.
|
||||||
|
mask := rune(x) << 31 >> 31 // Create 0x0000 or 0xFFFF.
|
||||||
|
if rune(s[0])&^mask|utf8.RuneError&mask == utf8.RuneError {
|
||||||
|
return runeErrorState, 1
|
||||||
|
}
|
||||||
|
return validUTF8State, 1
|
||||||
|
}
|
||||||
|
sz := int(x & 7)
|
||||||
|
if n < sz {
|
||||||
|
return runeErrorState, 1
|
||||||
|
}
|
||||||
|
s1 := s[1]
|
||||||
|
switch x >> 4 {
|
||||||
|
case 0:
|
||||||
|
if s1 < locb || hicb < s1 {
|
||||||
|
return runeErrorState, 1
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
if s1 < 0xA0 || hicb < s1 {
|
||||||
|
return runeErrorState, 1
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
if s1 < locb || 0x9F < s1 {
|
||||||
|
return runeErrorState, 1
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
if s1 < 0x90 || hicb < s1 {
|
||||||
|
return runeErrorState, 1
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
if s1 < locb || 0x8F < s1 {
|
||||||
|
return runeErrorState, 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if sz <= 2 {
|
||||||
|
return validUTF8State, 2
|
||||||
|
}
|
||||||
|
s2 := s[2]
|
||||||
|
if s2 < locb || hicb < s2 {
|
||||||
|
return runeErrorState, 1
|
||||||
|
}
|
||||||
|
if sz <= 3 {
|
||||||
|
// separator character prefixes: [2]byte{226, 128}
|
||||||
|
if s0 == 226 && s1 == 128 {
|
||||||
|
switch s2 {
|
||||||
|
case lineSep:
|
||||||
|
return lineSepState, 3
|
||||||
|
case paragraphSep:
|
||||||
|
return paragraphSepState, 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return validUTF8State, 3
|
||||||
|
}
|
||||||
|
s3 := s[3]
|
||||||
|
if s3 < locb || hicb < s3 {
|
||||||
|
return runeErrorState, 1
|
||||||
|
}
|
||||||
|
return validUTF8State, 4
|
||||||
|
}
|
81
vendor/github.com/goccy/go-json/internal/encoder/encoder.go
generated
vendored
81
vendor/github.com/goccy/go-json/internal/encoder/encoder.go
generated
vendored
@ -101,6 +101,22 @@ type OpcodeSet struct {
|
|||||||
InterfaceEscapeKeyCode *Opcode
|
InterfaceEscapeKeyCode *Opcode
|
||||||
CodeLength int
|
CodeLength int
|
||||||
EndCode *Opcode
|
EndCode *Opcode
|
||||||
|
Code Code
|
||||||
|
QueryCache map[string]*OpcodeSet
|
||||||
|
cacheMu sync.RWMutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *OpcodeSet) getQueryCache(hash string) *OpcodeSet {
|
||||||
|
s.cacheMu.RLock()
|
||||||
|
codeSet := s.QueryCache[hash]
|
||||||
|
s.cacheMu.RUnlock()
|
||||||
|
return codeSet
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *OpcodeSet) setQueryCache(hash string, codeSet *OpcodeSet) {
|
||||||
|
s.cacheMu.Lock()
|
||||||
|
s.QueryCache[hash] = codeSet
|
||||||
|
s.cacheMu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
type CompiledCode struct {
|
type CompiledCode struct {
|
||||||
@ -222,33 +238,56 @@ func (m *Mapslice) Swap(i, j int) {
|
|||||||
m.Items[i], m.Items[j] = m.Items[j], m.Items[i]
|
m.Items[i], m.Items[j] = m.Items[j], m.Items[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//nolint:structcheck,unused
|
||||||
|
type mapIter struct {
|
||||||
|
key unsafe.Pointer
|
||||||
|
elem unsafe.Pointer
|
||||||
|
t unsafe.Pointer
|
||||||
|
h unsafe.Pointer
|
||||||
|
buckets unsafe.Pointer
|
||||||
|
bptr unsafe.Pointer
|
||||||
|
overflow unsafe.Pointer
|
||||||
|
oldoverflow unsafe.Pointer
|
||||||
|
startBucket uintptr
|
||||||
|
offset uint8
|
||||||
|
wrapped bool
|
||||||
|
B uint8
|
||||||
|
i uint8
|
||||||
|
bucket uintptr
|
||||||
|
checkBucket uintptr
|
||||||
|
}
|
||||||
|
|
||||||
type MapContext struct {
|
type MapContext struct {
|
||||||
Pos []int
|
Start int
|
||||||
|
First int
|
||||||
|
Idx int
|
||||||
Slice *Mapslice
|
Slice *Mapslice
|
||||||
Buf []byte
|
Buf []byte
|
||||||
|
Len int
|
||||||
|
Iter mapIter
|
||||||
}
|
}
|
||||||
|
|
||||||
var mapContextPool = sync.Pool{
|
var mapContextPool = sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return &MapContext{}
|
return &MapContext{
|
||||||
|
Slice: &Mapslice{},
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMapContext(mapLen int) *MapContext {
|
func NewMapContext(mapLen int, unorderedMap bool) *MapContext {
|
||||||
ctx := mapContextPool.Get().(*MapContext)
|
ctx := mapContextPool.Get().(*MapContext)
|
||||||
if ctx.Slice == nil {
|
if !unorderedMap {
|
||||||
ctx.Slice = &Mapslice{
|
if len(ctx.Slice.Items) < mapLen {
|
||||||
Items: make([]MapItem, 0, mapLen),
|
ctx.Slice.Items = make([]MapItem, mapLen)
|
||||||
}
|
|
||||||
}
|
|
||||||
if cap(ctx.Pos) < (mapLen*2 + 1) {
|
|
||||||
ctx.Pos = make([]int, 0, mapLen*2+1)
|
|
||||||
ctx.Slice.Items = make([]MapItem, 0, mapLen)
|
|
||||||
} else {
|
} else {
|
||||||
ctx.Pos = ctx.Pos[:0]
|
ctx.Slice.Items = ctx.Slice.Items[:mapLen]
|
||||||
ctx.Slice.Items = ctx.Slice.Items[:0]
|
}
|
||||||
}
|
}
|
||||||
ctx.Buf = ctx.Buf[:0]
|
ctx.Buf = ctx.Buf[:0]
|
||||||
|
ctx.Iter = mapIter{}
|
||||||
|
ctx.Idx = 0
|
||||||
|
ctx.Len = mapLen
|
||||||
return ctx
|
return ctx
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -256,17 +295,17 @@ func ReleaseMapContext(c *MapContext) {
|
|||||||
mapContextPool.Put(c)
|
mapContextPool.Put(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:linkname MapIterInit reflect.mapiterinit
|
//go:linkname MapIterInit runtime.mapiterinit
|
||||||
//go:noescape
|
//go:noescape
|
||||||
func MapIterInit(mapType *runtime.Type, m unsafe.Pointer) unsafe.Pointer
|
func MapIterInit(mapType *runtime.Type, m unsafe.Pointer, it *mapIter)
|
||||||
|
|
||||||
//go:linkname MapIterKey reflect.mapiterkey
|
//go:linkname MapIterKey reflect.mapiterkey
|
||||||
//go:noescape
|
//go:noescape
|
||||||
func MapIterKey(it unsafe.Pointer) unsafe.Pointer
|
func MapIterKey(it *mapIter) unsafe.Pointer
|
||||||
|
|
||||||
//go:linkname MapIterNext reflect.mapiternext
|
//go:linkname MapIterNext reflect.mapiternext
|
||||||
//go:noescape
|
//go:noescape
|
||||||
func MapIterNext(it unsafe.Pointer)
|
func MapIterNext(it *mapIter)
|
||||||
|
|
||||||
//go:linkname MapLen reflect.maplen
|
//go:linkname MapLen reflect.maplen
|
||||||
//go:noescape
|
//go:noescape
|
||||||
@ -374,7 +413,11 @@ func AppendMarshalJSON(ctx *RuntimeContext, code *Opcode, b []byte, v interface{
|
|||||||
if !ok {
|
if !ok {
|
||||||
return AppendNull(ctx, b), nil
|
return AppendNull(ctx, b), nil
|
||||||
}
|
}
|
||||||
b, err := marshaler.MarshalJSON(ctx.Option.Context)
|
stdctx := ctx.Option.Context
|
||||||
|
if ctx.Option.Flag&FieldQueryOption != 0 {
|
||||||
|
stdctx = SetFieldQueryToContext(stdctx, code.FieldQuery)
|
||||||
|
}
|
||||||
|
b, err := marshaler.MarshalJSON(stdctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err}
|
return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err}
|
||||||
}
|
}
|
||||||
@ -546,6 +589,8 @@ func IsNilForMarshaler(v interface{}) bool {
|
|||||||
return rv.IsNil()
|
return rv.IsNil()
|
||||||
case reflect.Slice:
|
case reflect.Slice:
|
||||||
return rv.IsNil() || rv.Len() == 0
|
return rv.IsNil() || rv.Len() == 0
|
||||||
|
case reflect.String:
|
||||||
|
return rv.Len() == 0
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
3
vendor/github.com/goccy/go-json/internal/encoder/map112.go
generated
vendored
3
vendor/github.com/goccy/go-json/internal/encoder/map112.go
generated
vendored
@ -1,3 +1,4 @@
|
|||||||
|
//go:build !go1.13
|
||||||
// +build !go1.13
|
// +build !go1.13
|
||||||
|
|
||||||
package encoder
|
package encoder
|
||||||
@ -5,4 +6,4 @@ package encoder
|
|||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
//go:linkname MapIterValue reflect.mapitervalue
|
//go:linkname MapIterValue reflect.mapitervalue
|
||||||
func MapIterValue(it unsafe.Pointer) unsafe.Pointer
|
func MapIterValue(it *mapIter) unsafe.Pointer
|
||||||
|
3
vendor/github.com/goccy/go-json/internal/encoder/map113.go
generated
vendored
3
vendor/github.com/goccy/go-json/internal/encoder/map113.go
generated
vendored
@ -1,3 +1,4 @@
|
|||||||
|
//go:build go1.13
|
||||||
// +build go1.13
|
// +build go1.13
|
||||||
|
|
||||||
package encoder
|
package encoder
|
||||||
@ -5,4 +6,4 @@ package encoder
|
|||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
//go:linkname MapIterValue reflect.mapiterelem
|
//go:linkname MapIterValue reflect.mapiterelem
|
||||||
func MapIterValue(it unsafe.Pointer) unsafe.Pointer
|
func MapIterValue(it *mapIter) unsafe.Pointer
|
||||||
|
56
vendor/github.com/goccy/go-json/internal/encoder/opcode.go
generated
vendored
56
vendor/github.com/goccy/go-json/internal/encoder/opcode.go
generated
vendored
@ -39,10 +39,9 @@ type Opcode struct {
|
|||||||
|
|
||||||
Type *runtime.Type // go type
|
Type *runtime.Type // go type
|
||||||
Jmp *CompiledCode // for recursive call
|
Jmp *CompiledCode // for recursive call
|
||||||
ElemIdx uint32 // offset to access array/slice/map elem
|
FieldQuery *FieldQuery // field query for Interface / MarshalJSON / MarshalText
|
||||||
Length uint32 // offset to access slice/map length or array length
|
ElemIdx uint32 // offset to access array/slice elem
|
||||||
MapIter uint32 // offset to access map iterator
|
Length uint32 // offset to access slice length or array length
|
||||||
MapPos uint32 // offset to access position list for sorted map
|
|
||||||
Indent uint32 // indent number
|
Indent uint32 // indent number
|
||||||
Size uint32 // array/slice elem size
|
Size uint32 // array/slice elem size
|
||||||
DisplayIdx uint32 // opcode index
|
DisplayIdx uint32 // opcode index
|
||||||
@ -91,8 +90,6 @@ func (c *Opcode) MaxIdx() uint32 {
|
|||||||
c.Idx,
|
c.Idx,
|
||||||
c.ElemIdx,
|
c.ElemIdx,
|
||||||
c.Length,
|
c.Length,
|
||||||
c.MapIter,
|
|
||||||
c.MapPos,
|
|
||||||
c.Size,
|
c.Size,
|
||||||
} {
|
} {
|
||||||
if max < value {
|
if max < value {
|
||||||
@ -337,12 +334,11 @@ func copyOpcode(code *Opcode) *Opcode {
|
|||||||
Idx: c.Idx,
|
Idx: c.Idx,
|
||||||
Offset: c.Offset,
|
Offset: c.Offset,
|
||||||
Type: c.Type,
|
Type: c.Type,
|
||||||
|
FieldQuery: c.FieldQuery,
|
||||||
DisplayIdx: c.DisplayIdx,
|
DisplayIdx: c.DisplayIdx,
|
||||||
DisplayKey: c.DisplayKey,
|
DisplayKey: c.DisplayKey,
|
||||||
ElemIdx: c.ElemIdx,
|
ElemIdx: c.ElemIdx,
|
||||||
Length: c.Length,
|
Length: c.Length,
|
||||||
MapIter: c.MapIter,
|
|
||||||
MapPos: c.MapPos,
|
|
||||||
Size: c.Size,
|
Size: c.Size,
|
||||||
Indent: c.Indent,
|
Indent: c.Indent,
|
||||||
Jmp: c.Jmp,
|
Jmp: c.Jmp,
|
||||||
@ -448,26 +444,21 @@ func (c *Opcode) dumpHead(code *Opcode) string {
|
|||||||
|
|
||||||
func (c *Opcode) dumpMapHead(code *Opcode) string {
|
func (c *Opcode) dumpMapHead(code *Opcode) string {
|
||||||
return fmt.Sprintf(
|
return fmt.Sprintf(
|
||||||
`[%03d]%s%s ([idx:%d][elemIdx:%d][length:%d][mapIter:%d])`,
|
`[%03d]%s%s ([idx:%d])`,
|
||||||
code.DisplayIdx,
|
code.DisplayIdx,
|
||||||
strings.Repeat("-", int(code.Indent)),
|
strings.Repeat("-", int(code.Indent)),
|
||||||
code.Op,
|
code.Op,
|
||||||
code.Idx/uintptrSize,
|
code.Idx/uintptrSize,
|
||||||
code.ElemIdx/uintptrSize,
|
|
||||||
code.Length/uintptrSize,
|
|
||||||
code.MapIter/uintptrSize,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Opcode) dumpMapEnd(code *Opcode) string {
|
func (c *Opcode) dumpMapEnd(code *Opcode) string {
|
||||||
return fmt.Sprintf(
|
return fmt.Sprintf(
|
||||||
`[%03d]%s%s ([idx:%d][mapPos:%d][length:%d])`,
|
`[%03d]%s%s ([idx:%d])`,
|
||||||
code.DisplayIdx,
|
code.DisplayIdx,
|
||||||
strings.Repeat("-", int(code.Indent)),
|
strings.Repeat("-", int(code.Indent)),
|
||||||
code.Op,
|
code.Op,
|
||||||
code.Idx/uintptrSize,
|
code.Idx/uintptrSize,
|
||||||
code.MapPos/uintptrSize,
|
|
||||||
code.Length/uintptrSize,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,25 +495,21 @@ func (c *Opcode) dumpField(code *Opcode) string {
|
|||||||
|
|
||||||
func (c *Opcode) dumpKey(code *Opcode) string {
|
func (c *Opcode) dumpKey(code *Opcode) string {
|
||||||
return fmt.Sprintf(
|
return fmt.Sprintf(
|
||||||
`[%03d]%s%s ([idx:%d][elemIdx:%d][length:%d][mapIter:%d])`,
|
`[%03d]%s%s ([idx:%d])`,
|
||||||
code.DisplayIdx,
|
code.DisplayIdx,
|
||||||
strings.Repeat("-", int(code.Indent)),
|
strings.Repeat("-", int(code.Indent)),
|
||||||
code.Op,
|
code.Op,
|
||||||
code.Idx/uintptrSize,
|
code.Idx/uintptrSize,
|
||||||
code.ElemIdx/uintptrSize,
|
|
||||||
code.Length/uintptrSize,
|
|
||||||
code.MapIter/uintptrSize,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Opcode) dumpValue(code *Opcode) string {
|
func (c *Opcode) dumpValue(code *Opcode) string {
|
||||||
return fmt.Sprintf(
|
return fmt.Sprintf(
|
||||||
`[%03d]%s%s ([idx:%d][mapIter:%d])`,
|
`[%03d]%s%s ([idx:%d])`,
|
||||||
code.DisplayIdx,
|
code.DisplayIdx,
|
||||||
strings.Repeat("-", int(code.Indent)),
|
strings.Repeat("-", int(code.Indent)),
|
||||||
code.Op,
|
code.Op,
|
||||||
code.Idx/uintptrSize,
|
code.Idx/uintptrSize,
|
||||||
code.MapIter/uintptrSize,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -629,19 +616,11 @@ func newArrayElemCode(ctx *compileContext, typ *runtime.Type, head *Opcode, leng
|
|||||||
func newMapHeaderCode(ctx *compileContext, typ *runtime.Type) *Opcode {
|
func newMapHeaderCode(ctx *compileContext, typ *runtime.Type) *Opcode {
|
||||||
idx := opcodeOffset(ctx.ptrIndex)
|
idx := opcodeOffset(ctx.ptrIndex)
|
||||||
ctx.incPtrIndex()
|
ctx.incPtrIndex()
|
||||||
elemIdx := opcodeOffset(ctx.ptrIndex)
|
|
||||||
ctx.incPtrIndex()
|
|
||||||
length := opcodeOffset(ctx.ptrIndex)
|
|
||||||
ctx.incPtrIndex()
|
|
||||||
mapIter := opcodeOffset(ctx.ptrIndex)
|
|
||||||
return &Opcode{
|
return &Opcode{
|
||||||
Op: OpMap,
|
Op: OpMap,
|
||||||
Type: typ,
|
Type: typ,
|
||||||
Idx: idx,
|
Idx: idx,
|
||||||
DisplayIdx: ctx.opcodeIndex,
|
DisplayIdx: ctx.opcodeIndex,
|
||||||
ElemIdx: elemIdx,
|
|
||||||
Length: length,
|
|
||||||
MapIter: mapIter,
|
|
||||||
Indent: ctx.indent,
|
Indent: ctx.indent,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -650,11 +629,8 @@ func newMapKeyCode(ctx *compileContext, typ *runtime.Type, head *Opcode) *Opcode
|
|||||||
return &Opcode{
|
return &Opcode{
|
||||||
Op: OpMapKey,
|
Op: OpMapKey,
|
||||||
Type: typ,
|
Type: typ,
|
||||||
Idx: opcodeOffset(ctx.ptrIndex),
|
Idx: head.Idx,
|
||||||
DisplayIdx: ctx.opcodeIndex,
|
DisplayIdx: ctx.opcodeIndex,
|
||||||
ElemIdx: head.ElemIdx,
|
|
||||||
Length: head.Length,
|
|
||||||
MapIter: head.MapIter,
|
|
||||||
Indent: ctx.indent,
|
Indent: ctx.indent,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -663,28 +639,20 @@ func newMapValueCode(ctx *compileContext, typ *runtime.Type, head *Opcode) *Opco
|
|||||||
return &Opcode{
|
return &Opcode{
|
||||||
Op: OpMapValue,
|
Op: OpMapValue,
|
||||||
Type: typ,
|
Type: typ,
|
||||||
Idx: opcodeOffset(ctx.ptrIndex),
|
Idx: head.Idx,
|
||||||
DisplayIdx: ctx.opcodeIndex,
|
DisplayIdx: ctx.opcodeIndex,
|
||||||
ElemIdx: head.ElemIdx,
|
|
||||||
Length: head.Length,
|
|
||||||
MapIter: head.MapIter,
|
|
||||||
Indent: ctx.indent,
|
Indent: ctx.indent,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMapEndCode(ctx *compileContext, typ *runtime.Type, head *Opcode) *Opcode {
|
func newMapEndCode(ctx *compileContext, typ *runtime.Type, head *Opcode) *Opcode {
|
||||||
mapPos := opcodeOffset(ctx.ptrIndex)
|
|
||||||
ctx.incPtrIndex()
|
|
||||||
idx := opcodeOffset(ctx.ptrIndex)
|
|
||||||
return &Opcode{
|
return &Opcode{
|
||||||
Op: OpMapEnd,
|
Op: OpMapEnd,
|
||||||
Type: typ,
|
Type: typ,
|
||||||
Idx: idx,
|
Idx: head.Idx,
|
||||||
Next: newEndOp(ctx, typ),
|
|
||||||
DisplayIdx: ctx.opcodeIndex,
|
DisplayIdx: ctx.opcodeIndex,
|
||||||
Length: head.Length,
|
|
||||||
MapPos: mapPos,
|
|
||||||
Indent: ctx.indent,
|
Indent: ctx.indent,
|
||||||
|
Next: newEndOp(ctx, typ),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
vendor/github.com/goccy/go-json/internal/encoder/option.go
generated
vendored
2
vendor/github.com/goccy/go-json/internal/encoder/option.go
generated
vendored
@ -11,6 +11,8 @@ const (
|
|||||||
DebugOption
|
DebugOption
|
||||||
ColorizeOption
|
ColorizeOption
|
||||||
ContextOption
|
ContextOption
|
||||||
|
NormalizeUTF8Option
|
||||||
|
FieldQueryOption
|
||||||
)
|
)
|
||||||
|
|
||||||
type Option struct {
|
type Option struct {
|
||||||
|
135
vendor/github.com/goccy/go-json/internal/encoder/query.go
generated
vendored
Normal file
135
vendor/github.com/goccy/go-json/internal/encoder/query.go
generated
vendored
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
package encoder
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
Marshal func(interface{}) ([]byte, error)
|
||||||
|
Unmarshal func([]byte, interface{}) error
|
||||||
|
)
|
||||||
|
|
||||||
|
type FieldQuery struct {
|
||||||
|
Name string
|
||||||
|
Fields []*FieldQuery
|
||||||
|
hash string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *FieldQuery) Hash() string {
|
||||||
|
if q.hash != "" {
|
||||||
|
return q.hash
|
||||||
|
}
|
||||||
|
b, _ := Marshal(q)
|
||||||
|
q.hash = string(b)
|
||||||
|
return q.hash
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *FieldQuery) MarshalJSON() ([]byte, error) {
|
||||||
|
if q.Name != "" {
|
||||||
|
if len(q.Fields) > 0 {
|
||||||
|
return Marshal(map[string][]*FieldQuery{q.Name: q.Fields})
|
||||||
|
}
|
||||||
|
return Marshal(q.Name)
|
||||||
|
}
|
||||||
|
return Marshal(q.Fields)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *FieldQuery) QueryString() (FieldQueryString, error) {
|
||||||
|
b, err := Marshal(q)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return FieldQueryString(b), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type FieldQueryString string
|
||||||
|
|
||||||
|
func (s FieldQueryString) Build() (*FieldQuery, error) {
|
||||||
|
var query interface{}
|
||||||
|
if err := Unmarshal([]byte(s), &query); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return s.build(reflect.ValueOf(query))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s FieldQueryString) build(v reflect.Value) (*FieldQuery, error) {
|
||||||
|
switch v.Type().Kind() {
|
||||||
|
case reflect.String:
|
||||||
|
return s.buildString(v)
|
||||||
|
case reflect.Map:
|
||||||
|
return s.buildMap(v)
|
||||||
|
case reflect.Slice:
|
||||||
|
return s.buildSlice(v)
|
||||||
|
case reflect.Interface:
|
||||||
|
return s.build(reflect.ValueOf(v.Interface()))
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("failed to build field query")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s FieldQueryString) buildString(v reflect.Value) (*FieldQuery, error) {
|
||||||
|
b := []byte(v.String())
|
||||||
|
switch b[0] {
|
||||||
|
case '[', '{':
|
||||||
|
var query interface{}
|
||||||
|
if err := Unmarshal(b, &query); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if str, ok := query.(string); ok {
|
||||||
|
return &FieldQuery{Name: str}, nil
|
||||||
|
}
|
||||||
|
return s.build(reflect.ValueOf(query))
|
||||||
|
}
|
||||||
|
return &FieldQuery{Name: string(b)}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s FieldQueryString) buildSlice(v reflect.Value) (*FieldQuery, error) {
|
||||||
|
fields := make([]*FieldQuery, 0, v.Len())
|
||||||
|
for i := 0; i < v.Len(); i++ {
|
||||||
|
def, err := s.build(v.Index(i))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
fields = append(fields, def)
|
||||||
|
}
|
||||||
|
return &FieldQuery{Fields: fields}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s FieldQueryString) buildMap(v reflect.Value) (*FieldQuery, error) {
|
||||||
|
keys := v.MapKeys()
|
||||||
|
if len(keys) != 1 {
|
||||||
|
return nil, fmt.Errorf("failed to build field query object")
|
||||||
|
}
|
||||||
|
key := keys[0]
|
||||||
|
if key.Type().Kind() != reflect.String {
|
||||||
|
return nil, fmt.Errorf("failed to build field query. invalid object key type")
|
||||||
|
}
|
||||||
|
name := key.String()
|
||||||
|
def, err := s.build(v.MapIndex(key))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &FieldQuery{
|
||||||
|
Name: name,
|
||||||
|
Fields: def.Fields,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type queryKey struct{}
|
||||||
|
|
||||||
|
func FieldQueryFromContext(ctx context.Context) *FieldQuery {
|
||||||
|
query := ctx.Value(queryKey{})
|
||||||
|
if query == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
q, ok := query.(*FieldQuery)
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return q
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetFieldQueryToContext(ctx context.Context, query *FieldQuery) context.Context {
|
||||||
|
return context.WithValue(ctx, queryKey{}, query)
|
||||||
|
}
|
717
vendor/github.com/goccy/go-json/internal/encoder/string.go
generated
vendored
717
vendor/github.com/goccy/go-json/internal/encoder/string.go
generated
vendored
@ -3,7 +3,6 @@ package encoder
|
|||||||
import (
|
import (
|
||||||
"math/bits"
|
"math/bits"
|
||||||
"reflect"
|
"reflect"
|
||||||
"unicode/utf8"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -12,390 +11,8 @@ const (
|
|||||||
msb = 0x8080808080808080
|
msb = 0x8080808080808080
|
||||||
)
|
)
|
||||||
|
|
||||||
var needEscapeWithHTML = [256]bool{
|
|
||||||
'"': true,
|
|
||||||
'&': true,
|
|
||||||
'<': true,
|
|
||||||
'>': true,
|
|
||||||
'\\': true,
|
|
||||||
0x00: true,
|
|
||||||
0x01: true,
|
|
||||||
0x02: true,
|
|
||||||
0x03: true,
|
|
||||||
0x04: true,
|
|
||||||
0x05: true,
|
|
||||||
0x06: true,
|
|
||||||
0x07: true,
|
|
||||||
0x08: true,
|
|
||||||
0x09: true,
|
|
||||||
0x0a: true,
|
|
||||||
0x0b: true,
|
|
||||||
0x0c: true,
|
|
||||||
0x0d: true,
|
|
||||||
0x0e: true,
|
|
||||||
0x0f: true,
|
|
||||||
0x10: true,
|
|
||||||
0x11: true,
|
|
||||||
0x12: true,
|
|
||||||
0x13: true,
|
|
||||||
0x14: true,
|
|
||||||
0x15: true,
|
|
||||||
0x16: true,
|
|
||||||
0x17: true,
|
|
||||||
0x18: true,
|
|
||||||
0x19: true,
|
|
||||||
0x1a: true,
|
|
||||||
0x1b: true,
|
|
||||||
0x1c: true,
|
|
||||||
0x1d: true,
|
|
||||||
0x1e: true,
|
|
||||||
0x1f: true,
|
|
||||||
/* 0x20 - 0x7f */
|
|
||||||
0x80: true,
|
|
||||||
0x81: true,
|
|
||||||
0x82: true,
|
|
||||||
0x83: true,
|
|
||||||
0x84: true,
|
|
||||||
0x85: true,
|
|
||||||
0x86: true,
|
|
||||||
0x87: true,
|
|
||||||
0x88: true,
|
|
||||||
0x89: true,
|
|
||||||
0x8a: true,
|
|
||||||
0x8b: true,
|
|
||||||
0x8c: true,
|
|
||||||
0x8d: true,
|
|
||||||
0x8e: true,
|
|
||||||
0x8f: true,
|
|
||||||
0x90: true,
|
|
||||||
0x91: true,
|
|
||||||
0x92: true,
|
|
||||||
0x93: true,
|
|
||||||
0x94: true,
|
|
||||||
0x95: true,
|
|
||||||
0x96: true,
|
|
||||||
0x97: true,
|
|
||||||
0x98: true,
|
|
||||||
0x99: true,
|
|
||||||
0x9a: true,
|
|
||||||
0x9b: true,
|
|
||||||
0x9c: true,
|
|
||||||
0x9d: true,
|
|
||||||
0x9e: true,
|
|
||||||
0x9f: true,
|
|
||||||
0xa0: true,
|
|
||||||
0xa1: true,
|
|
||||||
0xa2: true,
|
|
||||||
0xa3: true,
|
|
||||||
0xa4: true,
|
|
||||||
0xa5: true,
|
|
||||||
0xa6: true,
|
|
||||||
0xa7: true,
|
|
||||||
0xa8: true,
|
|
||||||
0xa9: true,
|
|
||||||
0xaa: true,
|
|
||||||
0xab: true,
|
|
||||||
0xac: true,
|
|
||||||
0xad: true,
|
|
||||||
0xae: true,
|
|
||||||
0xaf: true,
|
|
||||||
0xb0: true,
|
|
||||||
0xb1: true,
|
|
||||||
0xb2: true,
|
|
||||||
0xb3: true,
|
|
||||||
0xb4: true,
|
|
||||||
0xb5: true,
|
|
||||||
0xb6: true,
|
|
||||||
0xb7: true,
|
|
||||||
0xb8: true,
|
|
||||||
0xb9: true,
|
|
||||||
0xba: true,
|
|
||||||
0xbb: true,
|
|
||||||
0xbc: true,
|
|
||||||
0xbd: true,
|
|
||||||
0xbe: true,
|
|
||||||
0xbf: true,
|
|
||||||
0xc0: true,
|
|
||||||
0xc1: true,
|
|
||||||
0xc2: true,
|
|
||||||
0xc3: true,
|
|
||||||
0xc4: true,
|
|
||||||
0xc5: true,
|
|
||||||
0xc6: true,
|
|
||||||
0xc7: true,
|
|
||||||
0xc8: true,
|
|
||||||
0xc9: true,
|
|
||||||
0xca: true,
|
|
||||||
0xcb: true,
|
|
||||||
0xcc: true,
|
|
||||||
0xcd: true,
|
|
||||||
0xce: true,
|
|
||||||
0xcf: true,
|
|
||||||
0xd0: true,
|
|
||||||
0xd1: true,
|
|
||||||
0xd2: true,
|
|
||||||
0xd3: true,
|
|
||||||
0xd4: true,
|
|
||||||
0xd5: true,
|
|
||||||
0xd6: true,
|
|
||||||
0xd7: true,
|
|
||||||
0xd8: true,
|
|
||||||
0xd9: true,
|
|
||||||
0xda: true,
|
|
||||||
0xdb: true,
|
|
||||||
0xdc: true,
|
|
||||||
0xdd: true,
|
|
||||||
0xde: true,
|
|
||||||
0xdf: true,
|
|
||||||
0xe0: true,
|
|
||||||
0xe1: true,
|
|
||||||
0xe2: true,
|
|
||||||
0xe3: true,
|
|
||||||
0xe4: true,
|
|
||||||
0xe5: true,
|
|
||||||
0xe6: true,
|
|
||||||
0xe7: true,
|
|
||||||
0xe8: true,
|
|
||||||
0xe9: true,
|
|
||||||
0xea: true,
|
|
||||||
0xeb: true,
|
|
||||||
0xec: true,
|
|
||||||
0xed: true,
|
|
||||||
0xee: true,
|
|
||||||
0xef: true,
|
|
||||||
0xf0: true,
|
|
||||||
0xf1: true,
|
|
||||||
0xf2: true,
|
|
||||||
0xf3: true,
|
|
||||||
0xf4: true,
|
|
||||||
0xf5: true,
|
|
||||||
0xf6: true,
|
|
||||||
0xf7: true,
|
|
||||||
0xf8: true,
|
|
||||||
0xf9: true,
|
|
||||||
0xfa: true,
|
|
||||||
0xfb: true,
|
|
||||||
0xfc: true,
|
|
||||||
0xfd: true,
|
|
||||||
0xfe: true,
|
|
||||||
0xff: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
var needEscape = [256]bool{
|
|
||||||
'"': true,
|
|
||||||
'\\': true,
|
|
||||||
0x00: true,
|
|
||||||
0x01: true,
|
|
||||||
0x02: true,
|
|
||||||
0x03: true,
|
|
||||||
0x04: true,
|
|
||||||
0x05: true,
|
|
||||||
0x06: true,
|
|
||||||
0x07: true,
|
|
||||||
0x08: true,
|
|
||||||
0x09: true,
|
|
||||||
0x0a: true,
|
|
||||||
0x0b: true,
|
|
||||||
0x0c: true,
|
|
||||||
0x0d: true,
|
|
||||||
0x0e: true,
|
|
||||||
0x0f: true,
|
|
||||||
0x10: true,
|
|
||||||
0x11: true,
|
|
||||||
0x12: true,
|
|
||||||
0x13: true,
|
|
||||||
0x14: true,
|
|
||||||
0x15: true,
|
|
||||||
0x16: true,
|
|
||||||
0x17: true,
|
|
||||||
0x18: true,
|
|
||||||
0x19: true,
|
|
||||||
0x1a: true,
|
|
||||||
0x1b: true,
|
|
||||||
0x1c: true,
|
|
||||||
0x1d: true,
|
|
||||||
0x1e: true,
|
|
||||||
0x1f: true,
|
|
||||||
/* 0x20 - 0x7f */
|
|
||||||
0x80: true,
|
|
||||||
0x81: true,
|
|
||||||
0x82: true,
|
|
||||||
0x83: true,
|
|
||||||
0x84: true,
|
|
||||||
0x85: true,
|
|
||||||
0x86: true,
|
|
||||||
0x87: true,
|
|
||||||
0x88: true,
|
|
||||||
0x89: true,
|
|
||||||
0x8a: true,
|
|
||||||
0x8b: true,
|
|
||||||
0x8c: true,
|
|
||||||
0x8d: true,
|
|
||||||
0x8e: true,
|
|
||||||
0x8f: true,
|
|
||||||
0x90: true,
|
|
||||||
0x91: true,
|
|
||||||
0x92: true,
|
|
||||||
0x93: true,
|
|
||||||
0x94: true,
|
|
||||||
0x95: true,
|
|
||||||
0x96: true,
|
|
||||||
0x97: true,
|
|
||||||
0x98: true,
|
|
||||||
0x99: true,
|
|
||||||
0x9a: true,
|
|
||||||
0x9b: true,
|
|
||||||
0x9c: true,
|
|
||||||
0x9d: true,
|
|
||||||
0x9e: true,
|
|
||||||
0x9f: true,
|
|
||||||
0xa0: true,
|
|
||||||
0xa1: true,
|
|
||||||
0xa2: true,
|
|
||||||
0xa3: true,
|
|
||||||
0xa4: true,
|
|
||||||
0xa5: true,
|
|
||||||
0xa6: true,
|
|
||||||
0xa7: true,
|
|
||||||
0xa8: true,
|
|
||||||
0xa9: true,
|
|
||||||
0xaa: true,
|
|
||||||
0xab: true,
|
|
||||||
0xac: true,
|
|
||||||
0xad: true,
|
|
||||||
0xae: true,
|
|
||||||
0xaf: true,
|
|
||||||
0xb0: true,
|
|
||||||
0xb1: true,
|
|
||||||
0xb2: true,
|
|
||||||
0xb3: true,
|
|
||||||
0xb4: true,
|
|
||||||
0xb5: true,
|
|
||||||
0xb6: true,
|
|
||||||
0xb7: true,
|
|
||||||
0xb8: true,
|
|
||||||
0xb9: true,
|
|
||||||
0xba: true,
|
|
||||||
0xbb: true,
|
|
||||||
0xbc: true,
|
|
||||||
0xbd: true,
|
|
||||||
0xbe: true,
|
|
||||||
0xbf: true,
|
|
||||||
0xc0: true,
|
|
||||||
0xc1: true,
|
|
||||||
0xc2: true,
|
|
||||||
0xc3: true,
|
|
||||||
0xc4: true,
|
|
||||||
0xc5: true,
|
|
||||||
0xc6: true,
|
|
||||||
0xc7: true,
|
|
||||||
0xc8: true,
|
|
||||||
0xc9: true,
|
|
||||||
0xca: true,
|
|
||||||
0xcb: true,
|
|
||||||
0xcc: true,
|
|
||||||
0xcd: true,
|
|
||||||
0xce: true,
|
|
||||||
0xcf: true,
|
|
||||||
0xd0: true,
|
|
||||||
0xd1: true,
|
|
||||||
0xd2: true,
|
|
||||||
0xd3: true,
|
|
||||||
0xd4: true,
|
|
||||||
0xd5: true,
|
|
||||||
0xd6: true,
|
|
||||||
0xd7: true,
|
|
||||||
0xd8: true,
|
|
||||||
0xd9: true,
|
|
||||||
0xda: true,
|
|
||||||
0xdb: true,
|
|
||||||
0xdc: true,
|
|
||||||
0xdd: true,
|
|
||||||
0xde: true,
|
|
||||||
0xdf: true,
|
|
||||||
0xe0: true,
|
|
||||||
0xe1: true,
|
|
||||||
0xe2: true,
|
|
||||||
0xe3: true,
|
|
||||||
0xe4: true,
|
|
||||||
0xe5: true,
|
|
||||||
0xe6: true,
|
|
||||||
0xe7: true,
|
|
||||||
0xe8: true,
|
|
||||||
0xe9: true,
|
|
||||||
0xea: true,
|
|
||||||
0xeb: true,
|
|
||||||
0xec: true,
|
|
||||||
0xed: true,
|
|
||||||
0xee: true,
|
|
||||||
0xef: true,
|
|
||||||
0xf0: true,
|
|
||||||
0xf1: true,
|
|
||||||
0xf2: true,
|
|
||||||
0xf3: true,
|
|
||||||
0xf4: true,
|
|
||||||
0xf5: true,
|
|
||||||
0xf6: true,
|
|
||||||
0xf7: true,
|
|
||||||
0xf8: true,
|
|
||||||
0xf9: true,
|
|
||||||
0xfa: true,
|
|
||||||
0xfb: true,
|
|
||||||
0xfc: true,
|
|
||||||
0xfd: true,
|
|
||||||
0xfe: true,
|
|
||||||
0xff: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
var hex = "0123456789abcdef"
|
var hex = "0123456789abcdef"
|
||||||
|
|
||||||
// escapeIndex finds the index of the first char in `s` that requires escaping.
|
|
||||||
// A char requires escaping if it's outside of the range of [0x20, 0x7F] or if
|
|
||||||
// it includes a double quote or backslash.
|
|
||||||
// If no chars in `s` require escaping, the return value is -1.
|
|
||||||
func escapeIndex(s string) int {
|
|
||||||
chunks := stringToUint64Slice(s)
|
|
||||||
for _, n := range chunks {
|
|
||||||
// combine masks before checking for the MSB of each byte. We include
|
|
||||||
// `n` in the mask to check whether any of the *input* byte MSBs were
|
|
||||||
// set (i.e. the byte was outside the ASCII range).
|
|
||||||
mask := n | below(n, 0x20) | contains(n, '"') | contains(n, '\\')
|
|
||||||
if (mask & msb) != 0 {
|
|
||||||
return bits.TrailingZeros64(mask&msb) / 8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
valLen := len(s)
|
|
||||||
for i := len(chunks) * 8; i < valLen; i++ {
|
|
||||||
if needEscape[s[i]] {
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
// below return a mask that can be used to determine if any of the bytes
|
|
||||||
// in `n` are below `b`. If a byte's MSB is set in the mask then that byte was
|
|
||||||
// below `b`. The result is only valid if `b`, and each byte in `n`, is below
|
|
||||||
// 0x80.
|
|
||||||
func below(n uint64, b byte) uint64 {
|
|
||||||
return n - expand(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// contains returns a mask that can be used to determine if any of the
|
|
||||||
// bytes in `n` are equal to `b`. If a byte's MSB is set in the mask then
|
|
||||||
// that byte is equal to `b`. The result is only valid if `b`, and each
|
|
||||||
// byte in `n`, is below 0x80.
|
|
||||||
func contains(n uint64, b byte) uint64 {
|
|
||||||
return (n ^ expand(b)) - lsb
|
|
||||||
}
|
|
||||||
|
|
||||||
// expand puts the specified byte into each of the 8 bytes of a uint64.
|
|
||||||
func expand(b byte) uint64 {
|
|
||||||
return lsb * uint64(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
//nolint:govet
|
//nolint:govet
|
||||||
func stringToUint64Slice(s string) []uint64 {
|
func stringToUint64Slice(s string) []uint64 {
|
||||||
return *(*[]uint64)(unsafe.Pointer(&reflect.SliceHeader{
|
return *(*[]uint64)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
@ -406,9 +23,19 @@ func stringToUint64Slice(s string) []uint64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func AppendString(ctx *RuntimeContext, buf []byte, s string) []byte {
|
func AppendString(ctx *RuntimeContext, buf []byte, s string) []byte {
|
||||||
if ctx.Option.Flag&HTMLEscapeOption == 0 {
|
if ctx.Option.Flag&HTMLEscapeOption != 0 {
|
||||||
|
if ctx.Option.Flag&NormalizeUTF8Option != 0 {
|
||||||
|
return appendNormalizedHTMLString(buf, s)
|
||||||
|
}
|
||||||
|
return appendHTMLString(buf, s)
|
||||||
|
}
|
||||||
|
if ctx.Option.Flag&NormalizeUTF8Option != 0 {
|
||||||
|
return appendNormalizedString(buf, s)
|
||||||
|
}
|
||||||
return appendString(buf, s)
|
return appendString(buf, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func appendNormalizedHTMLString(buf []byte, s string) []byte {
|
||||||
valLen := len(s)
|
valLen := len(s)
|
||||||
if valLen == 0 {
|
if valLen == 0 {
|
||||||
return append(buf, `""`...)
|
return append(buf, `""`...)
|
||||||
@ -435,7 +62,7 @@ func AppendString(ctx *RuntimeContext, buf []byte, s string) []byte {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for i := len(chunks) * 8; i < valLen; i++ {
|
for i := len(chunks) * 8; i < valLen; i++ {
|
||||||
if needEscapeWithHTML[s[i]] {
|
if needEscapeHTMLNormalizeUTF8[s[i]] {
|
||||||
j = i
|
j = i
|
||||||
goto ESCAPE_END
|
goto ESCAPE_END
|
||||||
}
|
}
|
||||||
@ -447,7 +74,7 @@ ESCAPE_END:
|
|||||||
for j < valLen {
|
for j < valLen {
|
||||||
c := s[j]
|
c := s[j]
|
||||||
|
|
||||||
if !needEscapeWithHTML[c] {
|
if !needEscapeHTMLNormalizeUTF8[c] {
|
||||||
// fast path: most of the time, printable ascii characters are used
|
// fast path: most of the time, printable ascii characters are used
|
||||||
j++
|
j++
|
||||||
continue
|
continue
|
||||||
@ -489,10 +116,220 @@ ESCAPE_END:
|
|||||||
i = j + 1
|
i = j + 1
|
||||||
j = j + 1
|
j = j + 1
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
case 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B, 0x0C, 0x0E, 0x0F, // 0x00-0x0F
|
||||||
|
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F: // 0x10-0x1F
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, `\u00`...)
|
||||||
|
buf = append(buf, hex[c>>4], hex[c&0xF])
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
state, size := decodeRuneInString(s[j:])
|
||||||
|
switch state {
|
||||||
|
case runeErrorState:
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, `\ufffd`...)
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
// U+2028 is LINE SEPARATOR.
|
||||||
|
// U+2029 is PARAGRAPH SEPARATOR.
|
||||||
|
// They are both technically valid characters in JSON strings,
|
||||||
|
// but don't work in JSONP, which has to be evaluated as JavaScript,
|
||||||
|
// and can lead to security holes there. It is valid JSON to
|
||||||
|
// escape them, so we do so unconditionally.
|
||||||
|
// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.
|
||||||
|
case lineSepState:
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, `\u2028`...)
|
||||||
|
i = j + 3
|
||||||
|
j = j + 3
|
||||||
|
continue
|
||||||
|
case paragraphSepState:
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, `\u2029`...)
|
||||||
|
i = j + 3
|
||||||
|
j = j + 3
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
j += size
|
||||||
}
|
}
|
||||||
|
|
||||||
// This encodes bytes < 0x20 except for \t, \n and \r.
|
return append(append(buf, s[i:]...), '"')
|
||||||
if c < 0x20 {
|
}
|
||||||
|
|
||||||
|
func appendHTMLString(buf []byte, s string) []byte {
|
||||||
|
valLen := len(s)
|
||||||
|
if valLen == 0 {
|
||||||
|
return append(buf, `""`...)
|
||||||
|
}
|
||||||
|
buf = append(buf, '"')
|
||||||
|
var (
|
||||||
|
i, j int
|
||||||
|
)
|
||||||
|
if valLen >= 8 {
|
||||||
|
chunks := stringToUint64Slice(s)
|
||||||
|
for _, n := range chunks {
|
||||||
|
// combine masks before checking for the MSB of each byte. We include
|
||||||
|
// `n` in the mask to check whether any of the *input* byte MSBs were
|
||||||
|
// set (i.e. the byte was outside the ASCII range).
|
||||||
|
mask := n | (n - (lsb * 0x20)) |
|
||||||
|
((n ^ (lsb * '"')) - lsb) |
|
||||||
|
((n ^ (lsb * '\\')) - lsb) |
|
||||||
|
((n ^ (lsb * '<')) - lsb) |
|
||||||
|
((n ^ (lsb * '>')) - lsb) |
|
||||||
|
((n ^ (lsb * '&')) - lsb)
|
||||||
|
if (mask & msb) != 0 {
|
||||||
|
j = bits.TrailingZeros64(mask&msb) / 8
|
||||||
|
goto ESCAPE_END
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i := len(chunks) * 8; i < valLen; i++ {
|
||||||
|
if needEscapeHTML[s[i]] {
|
||||||
|
j = i
|
||||||
|
goto ESCAPE_END
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// no found any escape characters.
|
||||||
|
return append(append(buf, s...), '"')
|
||||||
|
}
|
||||||
|
ESCAPE_END:
|
||||||
|
for j < valLen {
|
||||||
|
c := s[j]
|
||||||
|
|
||||||
|
if !needEscapeHTML[c] {
|
||||||
|
// fast path: most of the time, printable ascii characters are used
|
||||||
|
j++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch c {
|
||||||
|
case '\\', '"':
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, '\\', c)
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '\n':
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, '\\', 'n')
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '\r':
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, '\\', 'r')
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '\t':
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, '\\', 't')
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '<', '>', '&':
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, `\u00`...)
|
||||||
|
buf = append(buf, hex[c>>4], hex[c&0xF])
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
case 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B, 0x0C, 0x0E, 0x0F, // 0x00-0x0F
|
||||||
|
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F: // 0x10-0x1F
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, `\u00`...)
|
||||||
|
buf = append(buf, hex[c>>4], hex[c&0xF])
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
|
||||||
|
return append(append(buf, s[i:]...), '"')
|
||||||
|
}
|
||||||
|
|
||||||
|
func appendNormalizedString(buf []byte, s string) []byte {
|
||||||
|
valLen := len(s)
|
||||||
|
if valLen == 0 {
|
||||||
|
return append(buf, `""`...)
|
||||||
|
}
|
||||||
|
buf = append(buf, '"')
|
||||||
|
var (
|
||||||
|
i, j int
|
||||||
|
)
|
||||||
|
if valLen >= 8 {
|
||||||
|
chunks := stringToUint64Slice(s)
|
||||||
|
for _, n := range chunks {
|
||||||
|
// combine masks before checking for the MSB of each byte. We include
|
||||||
|
// `n` in the mask to check whether any of the *input* byte MSBs were
|
||||||
|
// set (i.e. the byte was outside the ASCII range).
|
||||||
|
mask := n | (n - (lsb * 0x20)) |
|
||||||
|
((n ^ (lsb * '"')) - lsb) |
|
||||||
|
((n ^ (lsb * '\\')) - lsb)
|
||||||
|
if (mask & msb) != 0 {
|
||||||
|
j = bits.TrailingZeros64(mask&msb) / 8
|
||||||
|
goto ESCAPE_END
|
||||||
|
}
|
||||||
|
}
|
||||||
|
valLen := len(s)
|
||||||
|
for i := len(chunks) * 8; i < valLen; i++ {
|
||||||
|
if needEscapeNormalizeUTF8[s[i]] {
|
||||||
|
j = i
|
||||||
|
goto ESCAPE_END
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return append(append(buf, s...), '"')
|
||||||
|
}
|
||||||
|
ESCAPE_END:
|
||||||
|
for j < valLen {
|
||||||
|
c := s[j]
|
||||||
|
|
||||||
|
if !needEscapeNormalizeUTF8[c] {
|
||||||
|
// fast path: most of the time, printable ascii characters are used
|
||||||
|
j++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch c {
|
||||||
|
case '\\', '"':
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, '\\', c)
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '\n':
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, '\\', 'n')
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '\r':
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, '\\', 'r')
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '\t':
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, '\\', 't')
|
||||||
|
i = j + 1
|
||||||
|
j = j + 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
case 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B, 0x0C, 0x0E, 0x0F, // 0x00-0x0F
|
||||||
|
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F: // 0x10-0x1F
|
||||||
buf = append(buf, s[i:j]...)
|
buf = append(buf, s[i:j]...)
|
||||||
buf = append(buf, `\u00`...)
|
buf = append(buf, `\u00`...)
|
||||||
buf = append(buf, hex[c>>4], hex[c&0xF])
|
buf = append(buf, hex[c>>4], hex[c&0xF])
|
||||||
@ -501,18 +338,14 @@ ESCAPE_END:
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
r, size := utf8.DecodeRuneInString(s[j:])
|
state, size := decodeRuneInString(s[j:])
|
||||||
|
switch state {
|
||||||
if r == utf8.RuneError && size == 1 {
|
case runeErrorState:
|
||||||
buf = append(buf, s[i:j]...)
|
buf = append(buf, s[i:j]...)
|
||||||
buf = append(buf, `\ufffd`...)
|
buf = append(buf, `\ufffd`...)
|
||||||
i = j + size
|
i = j + 1
|
||||||
j = j + size
|
j = j + 1
|
||||||
continue
|
continue
|
||||||
}
|
|
||||||
|
|
||||||
switch r {
|
|
||||||
case '\u2028', '\u2029':
|
|
||||||
// U+2028 is LINE SEPARATOR.
|
// U+2028 is LINE SEPARATOR.
|
||||||
// U+2029 is PARAGRAPH SEPARATOR.
|
// U+2029 is PARAGRAPH SEPARATOR.
|
||||||
// They are both technically valid characters in JSON strings,
|
// They are both technically valid characters in JSON strings,
|
||||||
@ -520,14 +353,19 @@ ESCAPE_END:
|
|||||||
// and can lead to security holes there. It is valid JSON to
|
// and can lead to security holes there. It is valid JSON to
|
||||||
// escape them, so we do so unconditionally.
|
// escape them, so we do so unconditionally.
|
||||||
// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.
|
// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.
|
||||||
|
case lineSepState:
|
||||||
buf = append(buf, s[i:j]...)
|
buf = append(buf, s[i:j]...)
|
||||||
buf = append(buf, `\u202`...)
|
buf = append(buf, `\u2028`...)
|
||||||
buf = append(buf, hex[r&0xF])
|
i = j + 3
|
||||||
i = j + size
|
j = j + 3
|
||||||
j = j + size
|
continue
|
||||||
|
case paragraphSepState:
|
||||||
|
buf = append(buf, s[i:j]...)
|
||||||
|
buf = append(buf, `\u2029`...)
|
||||||
|
i = j + 3
|
||||||
|
j = j + 3
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
j += size
|
j += size
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -540,19 +378,37 @@ func appendString(buf []byte, s string) []byte {
|
|||||||
return append(buf, `""`...)
|
return append(buf, `""`...)
|
||||||
}
|
}
|
||||||
buf = append(buf, '"')
|
buf = append(buf, '"')
|
||||||
var escapeIdx int
|
var (
|
||||||
|
i, j int
|
||||||
|
)
|
||||||
if valLen >= 8 {
|
if valLen >= 8 {
|
||||||
if escapeIdx = escapeIndex(s); escapeIdx < 0 {
|
chunks := stringToUint64Slice(s)
|
||||||
|
for _, n := range chunks {
|
||||||
|
// combine masks before checking for the MSB of each byte. We include
|
||||||
|
// `n` in the mask to check whether any of the *input* byte MSBs were
|
||||||
|
// set (i.e. the byte was outside the ASCII range).
|
||||||
|
mask := n | (n - (lsb * 0x20)) |
|
||||||
|
((n ^ (lsb * '"')) - lsb) |
|
||||||
|
((n ^ (lsb * '\\')) - lsb)
|
||||||
|
if (mask & msb) != 0 {
|
||||||
|
j = bits.TrailingZeros64(mask&msb) / 8
|
||||||
|
goto ESCAPE_END
|
||||||
|
}
|
||||||
|
}
|
||||||
|
valLen := len(s)
|
||||||
|
for i := len(chunks) * 8; i < valLen; i++ {
|
||||||
|
if needEscape[s[i]] {
|
||||||
|
j = i
|
||||||
|
goto ESCAPE_END
|
||||||
|
}
|
||||||
|
}
|
||||||
return append(append(buf, s...), '"')
|
return append(append(buf, s...), '"')
|
||||||
}
|
}
|
||||||
}
|
ESCAPE_END:
|
||||||
|
|
||||||
i := 0
|
|
||||||
j := escapeIdx
|
|
||||||
for j < valLen {
|
for j < valLen {
|
||||||
c := s[j]
|
c := s[j]
|
||||||
|
|
||||||
if c >= 0x20 && c <= 0x7f && c != '\\' && c != '"' {
|
if !needEscape[c] {
|
||||||
// fast path: most of the time, printable ascii characters are used
|
// fast path: most of the time, printable ascii characters are used
|
||||||
j++
|
j++
|
||||||
continue
|
continue
|
||||||
@ -587,7 +443,8 @@ func appendString(buf []byte, s string) []byte {
|
|||||||
j = j + 1
|
j = j + 1
|
||||||
continue
|
continue
|
||||||
|
|
||||||
case '<', '>', '&':
|
case 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B, 0x0C, 0x0E, 0x0F, // 0x00-0x0F
|
||||||
|
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F: // 0x10-0x1F
|
||||||
buf = append(buf, s[i:j]...)
|
buf = append(buf, s[i:j]...)
|
||||||
buf = append(buf, `\u00`...)
|
buf = append(buf, `\u00`...)
|
||||||
buf = append(buf, hex[c>>4], hex[c&0xF])
|
buf = append(buf, hex[c>>4], hex[c&0xF])
|
||||||
@ -595,45 +452,7 @@ func appendString(buf []byte, s string) []byte {
|
|||||||
j = j + 1
|
j = j + 1
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
j++
|
||||||
// This encodes bytes < 0x20 except for \t, \n and \r.
|
|
||||||
if c < 0x20 {
|
|
||||||
buf = append(buf, s[i:j]...)
|
|
||||||
buf = append(buf, `\u00`...)
|
|
||||||
buf = append(buf, hex[c>>4], hex[c&0xF])
|
|
||||||
i = j + 1
|
|
||||||
j = j + 1
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
r, size := utf8.DecodeRuneInString(s[j:])
|
|
||||||
|
|
||||||
if r == utf8.RuneError && size == 1 {
|
|
||||||
buf = append(buf, s[i:j]...)
|
|
||||||
buf = append(buf, `\ufffd`...)
|
|
||||||
i = j + size
|
|
||||||
j = j + size
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
switch r {
|
|
||||||
case '\u2028', '\u2029':
|
|
||||||
// U+2028 is LINE SEPARATOR.
|
|
||||||
// U+2029 is PARAGRAPH SEPARATOR.
|
|
||||||
// They are both technically valid characters in JSON strings,
|
|
||||||
// but don't work in JSONP, which has to be evaluated as JavaScript,
|
|
||||||
// and can lead to security holes there. It is valid JSON to
|
|
||||||
// escape them, so we do so unconditionally.
|
|
||||||
// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.
|
|
||||||
buf = append(buf, s[i:j]...)
|
|
||||||
buf = append(buf, `\u202`...)
|
|
||||||
buf = append(buf, hex[r&0xF])
|
|
||||||
i = j + size
|
|
||||||
j = j + size
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
j += size
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return append(append(buf, s[i:]...), '"')
|
return append(append(buf, s[i:]...), '"')
|
||||||
|
415
vendor/github.com/goccy/go-json/internal/encoder/string_table.go
generated
vendored
Normal file
415
vendor/github.com/goccy/go-json/internal/encoder/string_table.go
generated
vendored
Normal file
@ -0,0 +1,415 @@
|
|||||||
|
package encoder
|
||||||
|
|
||||||
|
var needEscapeHTMLNormalizeUTF8 = [256]bool{
|
||||||
|
'"': true,
|
||||||
|
'&': true,
|
||||||
|
'<': true,
|
||||||
|
'>': true,
|
||||||
|
'\\': true,
|
||||||
|
0x00: true,
|
||||||
|
0x01: true,
|
||||||
|
0x02: true,
|
||||||
|
0x03: true,
|
||||||
|
0x04: true,
|
||||||
|
0x05: true,
|
||||||
|
0x06: true,
|
||||||
|
0x07: true,
|
||||||
|
0x08: true,
|
||||||
|
0x09: true,
|
||||||
|
0x0a: true,
|
||||||
|
0x0b: true,
|
||||||
|
0x0c: true,
|
||||||
|
0x0d: true,
|
||||||
|
0x0e: true,
|
||||||
|
0x0f: true,
|
||||||
|
0x10: true,
|
||||||
|
0x11: true,
|
||||||
|
0x12: true,
|
||||||
|
0x13: true,
|
||||||
|
0x14: true,
|
||||||
|
0x15: true,
|
||||||
|
0x16: true,
|
||||||
|
0x17: true,
|
||||||
|
0x18: true,
|
||||||
|
0x19: true,
|
||||||
|
0x1a: true,
|
||||||
|
0x1b: true,
|
||||||
|
0x1c: true,
|
||||||
|
0x1d: true,
|
||||||
|
0x1e: true,
|
||||||
|
0x1f: true,
|
||||||
|
/* 0x20 - 0x7f */
|
||||||
|
0x80: true,
|
||||||
|
0x81: true,
|
||||||
|
0x82: true,
|
||||||
|
0x83: true,
|
||||||
|
0x84: true,
|
||||||
|
0x85: true,
|
||||||
|
0x86: true,
|
||||||
|
0x87: true,
|
||||||
|
0x88: true,
|
||||||
|
0x89: true,
|
||||||
|
0x8a: true,
|
||||||
|
0x8b: true,
|
||||||
|
0x8c: true,
|
||||||
|
0x8d: true,
|
||||||
|
0x8e: true,
|
||||||
|
0x8f: true,
|
||||||
|
0x90: true,
|
||||||
|
0x91: true,
|
||||||
|
0x92: true,
|
||||||
|
0x93: true,
|
||||||
|
0x94: true,
|
||||||
|
0x95: true,
|
||||||
|
0x96: true,
|
||||||
|
0x97: true,
|
||||||
|
0x98: true,
|
||||||
|
0x99: true,
|
||||||
|
0x9a: true,
|
||||||
|
0x9b: true,
|
||||||
|
0x9c: true,
|
||||||
|
0x9d: true,
|
||||||
|
0x9e: true,
|
||||||
|
0x9f: true,
|
||||||
|
0xa0: true,
|
||||||
|
0xa1: true,
|
||||||
|
0xa2: true,
|
||||||
|
0xa3: true,
|
||||||
|
0xa4: true,
|
||||||
|
0xa5: true,
|
||||||
|
0xa6: true,
|
||||||
|
0xa7: true,
|
||||||
|
0xa8: true,
|
||||||
|
0xa9: true,
|
||||||
|
0xaa: true,
|
||||||
|
0xab: true,
|
||||||
|
0xac: true,
|
||||||
|
0xad: true,
|
||||||
|
0xae: true,
|
||||||
|
0xaf: true,
|
||||||
|
0xb0: true,
|
||||||
|
0xb1: true,
|
||||||
|
0xb2: true,
|
||||||
|
0xb3: true,
|
||||||
|
0xb4: true,
|
||||||
|
0xb5: true,
|
||||||
|
0xb6: true,
|
||||||
|
0xb7: true,
|
||||||
|
0xb8: true,
|
||||||
|
0xb9: true,
|
||||||
|
0xba: true,
|
||||||
|
0xbb: true,
|
||||||
|
0xbc: true,
|
||||||
|
0xbd: true,
|
||||||
|
0xbe: true,
|
||||||
|
0xbf: true,
|
||||||
|
0xc0: true,
|
||||||
|
0xc1: true,
|
||||||
|
0xc2: true,
|
||||||
|
0xc3: true,
|
||||||
|
0xc4: true,
|
||||||
|
0xc5: true,
|
||||||
|
0xc6: true,
|
||||||
|
0xc7: true,
|
||||||
|
0xc8: true,
|
||||||
|
0xc9: true,
|
||||||
|
0xca: true,
|
||||||
|
0xcb: true,
|
||||||
|
0xcc: true,
|
||||||
|
0xcd: true,
|
||||||
|
0xce: true,
|
||||||
|
0xcf: true,
|
||||||
|
0xd0: true,
|
||||||
|
0xd1: true,
|
||||||
|
0xd2: true,
|
||||||
|
0xd3: true,
|
||||||
|
0xd4: true,
|
||||||
|
0xd5: true,
|
||||||
|
0xd6: true,
|
||||||
|
0xd7: true,
|
||||||
|
0xd8: true,
|
||||||
|
0xd9: true,
|
||||||
|
0xda: true,
|
||||||
|
0xdb: true,
|
||||||
|
0xdc: true,
|
||||||
|
0xdd: true,
|
||||||
|
0xde: true,
|
||||||
|
0xdf: true,
|
||||||
|
0xe0: true,
|
||||||
|
0xe1: true,
|
||||||
|
0xe2: true,
|
||||||
|
0xe3: true,
|
||||||
|
0xe4: true,
|
||||||
|
0xe5: true,
|
||||||
|
0xe6: true,
|
||||||
|
0xe7: true,
|
||||||
|
0xe8: true,
|
||||||
|
0xe9: true,
|
||||||
|
0xea: true,
|
||||||
|
0xeb: true,
|
||||||
|
0xec: true,
|
||||||
|
0xed: true,
|
||||||
|
0xee: true,
|
||||||
|
0xef: true,
|
||||||
|
0xf0: true,
|
||||||
|
0xf1: true,
|
||||||
|
0xf2: true,
|
||||||
|
0xf3: true,
|
||||||
|
0xf4: true,
|
||||||
|
0xf5: true,
|
||||||
|
0xf6: true,
|
||||||
|
0xf7: true,
|
||||||
|
0xf8: true,
|
||||||
|
0xf9: true,
|
||||||
|
0xfa: true,
|
||||||
|
0xfb: true,
|
||||||
|
0xfc: true,
|
||||||
|
0xfd: true,
|
||||||
|
0xfe: true,
|
||||||
|
0xff: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
var needEscapeNormalizeUTF8 = [256]bool{
|
||||||
|
'"': true,
|
||||||
|
'\\': true,
|
||||||
|
0x00: true,
|
||||||
|
0x01: true,
|
||||||
|
0x02: true,
|
||||||
|
0x03: true,
|
||||||
|
0x04: true,
|
||||||
|
0x05: true,
|
||||||
|
0x06: true,
|
||||||
|
0x07: true,
|
||||||
|
0x08: true,
|
||||||
|
0x09: true,
|
||||||
|
0x0a: true,
|
||||||
|
0x0b: true,
|
||||||
|
0x0c: true,
|
||||||
|
0x0d: true,
|
||||||
|
0x0e: true,
|
||||||
|
0x0f: true,
|
||||||
|
0x10: true,
|
||||||
|
0x11: true,
|
||||||
|
0x12: true,
|
||||||
|
0x13: true,
|
||||||
|
0x14: true,
|
||||||
|
0x15: true,
|
||||||
|
0x16: true,
|
||||||
|
0x17: true,
|
||||||
|
0x18: true,
|
||||||
|
0x19: true,
|
||||||
|
0x1a: true,
|
||||||
|
0x1b: true,
|
||||||
|
0x1c: true,
|
||||||
|
0x1d: true,
|
||||||
|
0x1e: true,
|
||||||
|
0x1f: true,
|
||||||
|
/* 0x20 - 0x7f */
|
||||||
|
0x80: true,
|
||||||
|
0x81: true,
|
||||||
|
0x82: true,
|
||||||
|
0x83: true,
|
||||||
|
0x84: true,
|
||||||
|
0x85: true,
|
||||||
|
0x86: true,
|
||||||
|
0x87: true,
|
||||||
|
0x88: true,
|
||||||
|
0x89: true,
|
||||||
|
0x8a: true,
|
||||||
|
0x8b: true,
|
||||||
|
0x8c: true,
|
||||||
|
0x8d: true,
|
||||||
|
0x8e: true,
|
||||||
|
0x8f: true,
|
||||||
|
0x90: true,
|
||||||
|
0x91: true,
|
||||||
|
0x92: true,
|
||||||
|
0x93: true,
|
||||||
|
0x94: true,
|
||||||
|
0x95: true,
|
||||||
|
0x96: true,
|
||||||
|
0x97: true,
|
||||||
|
0x98: true,
|
||||||
|
0x99: true,
|
||||||
|
0x9a: true,
|
||||||
|
0x9b: true,
|
||||||
|
0x9c: true,
|
||||||
|
0x9d: true,
|
||||||
|
0x9e: true,
|
||||||
|
0x9f: true,
|
||||||
|
0xa0: true,
|
||||||
|
0xa1: true,
|
||||||
|
0xa2: true,
|
||||||
|
0xa3: true,
|
||||||
|
0xa4: true,
|
||||||
|
0xa5: true,
|
||||||
|
0xa6: true,
|
||||||
|
0xa7: true,
|
||||||
|
0xa8: true,
|
||||||
|
0xa9: true,
|
||||||
|
0xaa: true,
|
||||||
|
0xab: true,
|
||||||
|
0xac: true,
|
||||||
|
0xad: true,
|
||||||
|
0xae: true,
|
||||||
|
0xaf: true,
|
||||||
|
0xb0: true,
|
||||||
|
0xb1: true,
|
||||||
|
0xb2: true,
|
||||||
|
0xb3: true,
|
||||||
|
0xb4: true,
|
||||||
|
0xb5: true,
|
||||||
|
0xb6: true,
|
||||||
|
0xb7: true,
|
||||||
|
0xb8: true,
|
||||||
|
0xb9: true,
|
||||||
|
0xba: true,
|
||||||
|
0xbb: true,
|
||||||
|
0xbc: true,
|
||||||
|
0xbd: true,
|
||||||
|
0xbe: true,
|
||||||
|
0xbf: true,
|
||||||
|
0xc0: true,
|
||||||
|
0xc1: true,
|
||||||
|
0xc2: true,
|
||||||
|
0xc3: true,
|
||||||
|
0xc4: true,
|
||||||
|
0xc5: true,
|
||||||
|
0xc6: true,
|
||||||
|
0xc7: true,
|
||||||
|
0xc8: true,
|
||||||
|
0xc9: true,
|
||||||
|
0xca: true,
|
||||||
|
0xcb: true,
|
||||||
|
0xcc: true,
|
||||||
|
0xcd: true,
|
||||||
|
0xce: true,
|
||||||
|
0xcf: true,
|
||||||
|
0xd0: true,
|
||||||
|
0xd1: true,
|
||||||
|
0xd2: true,
|
||||||
|
0xd3: true,
|
||||||
|
0xd4: true,
|
||||||
|
0xd5: true,
|
||||||
|
0xd6: true,
|
||||||
|
0xd7: true,
|
||||||
|
0xd8: true,
|
||||||
|
0xd9: true,
|
||||||
|
0xda: true,
|
||||||
|
0xdb: true,
|
||||||
|
0xdc: true,
|
||||||
|
0xdd: true,
|
||||||
|
0xde: true,
|
||||||
|
0xdf: true,
|
||||||
|
0xe0: true,
|
||||||
|
0xe1: true,
|
||||||
|
0xe2: true,
|
||||||
|
0xe3: true,
|
||||||
|
0xe4: true,
|
||||||
|
0xe5: true,
|
||||||
|
0xe6: true,
|
||||||
|
0xe7: true,
|
||||||
|
0xe8: true,
|
||||||
|
0xe9: true,
|
||||||
|
0xea: true,
|
||||||
|
0xeb: true,
|
||||||
|
0xec: true,
|
||||||
|
0xed: true,
|
||||||
|
0xee: true,
|
||||||
|
0xef: true,
|
||||||
|
0xf0: true,
|
||||||
|
0xf1: true,
|
||||||
|
0xf2: true,
|
||||||
|
0xf3: true,
|
||||||
|
0xf4: true,
|
||||||
|
0xf5: true,
|
||||||
|
0xf6: true,
|
||||||
|
0xf7: true,
|
||||||
|
0xf8: true,
|
||||||
|
0xf9: true,
|
||||||
|
0xfa: true,
|
||||||
|
0xfb: true,
|
||||||
|
0xfc: true,
|
||||||
|
0xfd: true,
|
||||||
|
0xfe: true,
|
||||||
|
0xff: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
var needEscapeHTML = [256]bool{
|
||||||
|
'"': true,
|
||||||
|
'&': true,
|
||||||
|
'<': true,
|
||||||
|
'>': true,
|
||||||
|
'\\': true,
|
||||||
|
0x00: true,
|
||||||
|
0x01: true,
|
||||||
|
0x02: true,
|
||||||
|
0x03: true,
|
||||||
|
0x04: true,
|
||||||
|
0x05: true,
|
||||||
|
0x06: true,
|
||||||
|
0x07: true,
|
||||||
|
0x08: true,
|
||||||
|
0x09: true,
|
||||||
|
0x0a: true,
|
||||||
|
0x0b: true,
|
||||||
|
0x0c: true,
|
||||||
|
0x0d: true,
|
||||||
|
0x0e: true,
|
||||||
|
0x0f: true,
|
||||||
|
0x10: true,
|
||||||
|
0x11: true,
|
||||||
|
0x12: true,
|
||||||
|
0x13: true,
|
||||||
|
0x14: true,
|
||||||
|
0x15: true,
|
||||||
|
0x16: true,
|
||||||
|
0x17: true,
|
||||||
|
0x18: true,
|
||||||
|
0x19: true,
|
||||||
|
0x1a: true,
|
||||||
|
0x1b: true,
|
||||||
|
0x1c: true,
|
||||||
|
0x1d: true,
|
||||||
|
0x1e: true,
|
||||||
|
0x1f: true,
|
||||||
|
/* 0x20 - 0xff */
|
||||||
|
}
|
||||||
|
|
||||||
|
var needEscape = [256]bool{
|
||||||
|
'"': true,
|
||||||
|
'\\': true,
|
||||||
|
0x00: true,
|
||||||
|
0x01: true,
|
||||||
|
0x02: true,
|
||||||
|
0x03: true,
|
||||||
|
0x04: true,
|
||||||
|
0x05: true,
|
||||||
|
0x06: true,
|
||||||
|
0x07: true,
|
||||||
|
0x08: true,
|
||||||
|
0x09: true,
|
||||||
|
0x0a: true,
|
||||||
|
0x0b: true,
|
||||||
|
0x0c: true,
|
||||||
|
0x0d: true,
|
||||||
|
0x0e: true,
|
||||||
|
0x0f: true,
|
||||||
|
0x10: true,
|
||||||
|
0x11: true,
|
||||||
|
0x12: true,
|
||||||
|
0x13: true,
|
||||||
|
0x14: true,
|
||||||
|
0x15: true,
|
||||||
|
0x16: true,
|
||||||
|
0x17: true,
|
||||||
|
0x18: true,
|
||||||
|
0x19: true,
|
||||||
|
0x1a: true,
|
||||||
|
0x1b: true,
|
||||||
|
0x1c: true,
|
||||||
|
0x1d: true,
|
||||||
|
0x1e: true,
|
||||||
|
0x1f: true,
|
||||||
|
/* 0x20 - 0xff */
|
||||||
|
}
|
101
vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go
generated
vendored
101
vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go
generated
vendored
@ -199,7 +199,7 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
||||||
ifaceCodeSet, err := encoder.CompileToGetCodeSet(uintptr(unsafe.Pointer(typ)))
|
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -218,8 +218,7 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
oldOffset := ptrOffset
|
oldOffset := ptrOffset
|
||||||
ptrOffset += totalLength * uintptrSize
|
ptrOffset += totalLength * uintptrSize
|
||||||
oldBaseIndent := ctx.BaseIndent
|
oldBaseIndent := ctx.BaseIndent
|
||||||
indentDiffFromTop := c.Indent - 1
|
ctx.BaseIndent += code.Indent
|
||||||
ctx.BaseIndent += code.Indent - indentDiffFromTop
|
|
||||||
|
|
||||||
newLen := offsetNum + totalLength + nextTotalLength
|
newLen := offsetNum + totalLength + nextTotalLength
|
||||||
if curlen < newLen {
|
if curlen < newLen {
|
||||||
@ -403,48 +402,42 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
iter := mapiterinit(code.Type, uptr)
|
unorderedMap := (ctx.Option.Flag & encoder.UnorderedMapOption) != 0
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, iter)
|
mapCtx := encoder.NewMapContext(mlen, unorderedMap)
|
||||||
store(ctxptr, code.ElemIdx, 0)
|
mapiterinit(code.Type, uptr, &mapCtx.Iter)
|
||||||
store(ctxptr, code.Length, uintptr(mlen))
|
store(ctxptr, code.Idx, uintptr(unsafe.Pointer(mapCtx)))
|
||||||
store(ctxptr, code.MapIter, uintptr(iter))
|
ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if unorderedMap {
|
||||||
b = appendMapKeyIndent(ctx, code.Next, b)
|
b = appendMapKeyIndent(ctx, code.Next, b)
|
||||||
} else {
|
} else {
|
||||||
mapCtx := encoder.NewMapContext(mlen)
|
mapCtx.Start = len(b)
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
mapCtx.First = len(b)
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
|
|
||||||
store(ctxptr, code.End.MapPos, uintptr(unsafe.Pointer(mapCtx)))
|
|
||||||
}
|
}
|
||||||
key := mapiterkey(iter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
case encoder.OpMapKey:
|
case encoder.OpMapKey:
|
||||||
idx := load(ctxptr, code.ElemIdx)
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
length := load(ctxptr, code.Length)
|
idx := mapCtx.Idx
|
||||||
idx++
|
idx++
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
||||||
if idx < length {
|
if idx < mapCtx.Len {
|
||||||
b = appendMapKeyIndent(ctx, code, b)
|
b = appendMapKeyIndent(ctx, code, b)
|
||||||
store(ctxptr, code.ElemIdx, idx)
|
mapCtx.Idx = int(idx)
|
||||||
ptr := load(ctxptr, code.MapIter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
key := mapiterkey(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
} else {
|
} else {
|
||||||
b = appendObjectEnd(ctx, code, b)
|
b = appendObjectEnd(ctx, code, b)
|
||||||
|
encoder.ReleaseMapContext(mapCtx)
|
||||||
code = code.End.Next
|
code = code.End.Next
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ptr := load(ctxptr, code.End.MapPos)
|
mapCtx.Slice.Items[mapCtx.Idx].Value = b[mapCtx.Start:len(b)]
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
if idx < mapCtx.Len {
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
mapCtx.Idx = int(idx)
|
||||||
if idx < length {
|
mapCtx.Start = len(b)
|
||||||
ptr := load(ctxptr, code.MapIter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
store(ctxptr, code.ElemIdx, idx)
|
|
||||||
key := mapiterkey(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
} else {
|
} else {
|
||||||
@ -452,46 +445,27 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case encoder.OpMapValue:
|
case encoder.OpMapValue:
|
||||||
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
||||||
b = appendColon(ctx, b)
|
b = appendColon(ctx, b)
|
||||||
} else {
|
} else {
|
||||||
ptr := load(ctxptr, code.End.MapPos)
|
mapCtx.Slice.Items[mapCtx.Idx].Key = b[mapCtx.Start:len(b)]
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
mapCtx.Start = len(b)
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
|
||||||
}
|
}
|
||||||
ptr := load(ctxptr, code.MapIter)
|
value := mapitervalue(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
value := mapitervalue(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(value))
|
store(ctxptr, code.Next.Idx, uintptr(value))
|
||||||
mapiternext(iter)
|
mapiternext(&mapCtx.Iter)
|
||||||
code = code.Next
|
code = code.Next
|
||||||
case encoder.OpMapEnd:
|
case encoder.OpMapEnd:
|
||||||
// this operation only used by sorted map.
|
// this operation only used by sorted map.
|
||||||
length := int(load(ctxptr, code.Length))
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
ptr := load(ctxptr, code.MapPos)
|
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
|
||||||
pos := mapCtx.Pos
|
|
||||||
for i := 0; i < length; i++ {
|
|
||||||
startKey := pos[i*2]
|
|
||||||
startValue := pos[i*2+1]
|
|
||||||
var endValue int
|
|
||||||
if i+1 < length {
|
|
||||||
endValue = pos[i*2+2]
|
|
||||||
} else {
|
|
||||||
endValue = len(b)
|
|
||||||
}
|
|
||||||
mapCtx.Slice.Items = append(mapCtx.Slice.Items, encoder.MapItem{
|
|
||||||
Key: b[startKey:startValue],
|
|
||||||
Value: b[startValue:endValue],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
sort.Sort(mapCtx.Slice)
|
sort.Sort(mapCtx.Slice)
|
||||||
buf := mapCtx.Buf
|
buf := mapCtx.Buf
|
||||||
for _, item := range mapCtx.Slice.Items {
|
for _, item := range mapCtx.Slice.Items {
|
||||||
buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
|
buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
|
||||||
}
|
}
|
||||||
buf = appendMapEnd(ctx, code, buf)
|
buf = appendMapEnd(ctx, code, buf)
|
||||||
b = b[:pos[0]]
|
b = b[:mapCtx.First]
|
||||||
b = append(b, buf...)
|
b = append(b, buf...)
|
||||||
mapCtx.Buf = buf
|
mapCtx.Buf = buf
|
||||||
encoder.ReleaseMapContext(mapCtx)
|
encoder.ReleaseMapContext(mapCtx)
|
||||||
@ -731,14 +705,15 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
|
p += uintptr(code.Offset)
|
||||||
|
u64 := ptrToUint64(p, code.NumBitSize)
|
||||||
v := u64 & ((1 << code.NumBitSize) - 1)
|
v := u64 & ((1 << code.NumBitSize) - 1)
|
||||||
if v == 0 {
|
if v == 0 {
|
||||||
code = code.NextField
|
code = code.NextField
|
||||||
} else {
|
} else {
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
b = append(b, '"')
|
b = append(b, '"')
|
||||||
b = appendInt(ctx, b, p+uintptr(code.Offset), code)
|
b = appendInt(ctx, b, p, code)
|
||||||
b = append(b, '"')
|
b = append(b, '"')
|
||||||
b = appendComma(ctx, b)
|
b = appendComma(ctx, b)
|
||||||
code = code.Next
|
code = code.Next
|
||||||
@ -2979,9 +2954,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
@ -3020,9 +2996,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iface := ptrToInterface(code, p)
|
iface := ptrToInterface(code, p)
|
||||||
@ -3140,9 +3117,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
@ -3181,9 +3159,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
|
101
vendor/github.com/goccy/go-json/internal/encoder/vm_color/vm.go
generated
vendored
101
vendor/github.com/goccy/go-json/internal/encoder/vm_color/vm.go
generated
vendored
@ -199,7 +199,7 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
||||||
ifaceCodeSet, err := encoder.CompileToGetCodeSet(uintptr(unsafe.Pointer(typ)))
|
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -218,8 +218,7 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
oldOffset := ptrOffset
|
oldOffset := ptrOffset
|
||||||
ptrOffset += totalLength * uintptrSize
|
ptrOffset += totalLength * uintptrSize
|
||||||
oldBaseIndent := ctx.BaseIndent
|
oldBaseIndent := ctx.BaseIndent
|
||||||
indentDiffFromTop := c.Indent - 1
|
ctx.BaseIndent += code.Indent
|
||||||
ctx.BaseIndent += code.Indent - indentDiffFromTop
|
|
||||||
|
|
||||||
newLen := offsetNum + totalLength + nextTotalLength
|
newLen := offsetNum + totalLength + nextTotalLength
|
||||||
if curlen < newLen {
|
if curlen < newLen {
|
||||||
@ -403,48 +402,42 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
iter := mapiterinit(code.Type, uptr)
|
unorderedMap := (ctx.Option.Flag & encoder.UnorderedMapOption) != 0
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, iter)
|
mapCtx := encoder.NewMapContext(mlen, unorderedMap)
|
||||||
store(ctxptr, code.ElemIdx, 0)
|
mapiterinit(code.Type, uptr, &mapCtx.Iter)
|
||||||
store(ctxptr, code.Length, uintptr(mlen))
|
store(ctxptr, code.Idx, uintptr(unsafe.Pointer(mapCtx)))
|
||||||
store(ctxptr, code.MapIter, uintptr(iter))
|
ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if unorderedMap {
|
||||||
b = appendMapKeyIndent(ctx, code.Next, b)
|
b = appendMapKeyIndent(ctx, code.Next, b)
|
||||||
} else {
|
} else {
|
||||||
mapCtx := encoder.NewMapContext(mlen)
|
mapCtx.Start = len(b)
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
mapCtx.First = len(b)
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
|
|
||||||
store(ctxptr, code.End.MapPos, uintptr(unsafe.Pointer(mapCtx)))
|
|
||||||
}
|
}
|
||||||
key := mapiterkey(iter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
case encoder.OpMapKey:
|
case encoder.OpMapKey:
|
||||||
idx := load(ctxptr, code.ElemIdx)
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
length := load(ctxptr, code.Length)
|
idx := mapCtx.Idx
|
||||||
idx++
|
idx++
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
||||||
if idx < length {
|
if idx < mapCtx.Len {
|
||||||
b = appendMapKeyIndent(ctx, code, b)
|
b = appendMapKeyIndent(ctx, code, b)
|
||||||
store(ctxptr, code.ElemIdx, idx)
|
mapCtx.Idx = int(idx)
|
||||||
ptr := load(ctxptr, code.MapIter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
key := mapiterkey(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
} else {
|
} else {
|
||||||
b = appendObjectEnd(ctx, code, b)
|
b = appendObjectEnd(ctx, code, b)
|
||||||
|
encoder.ReleaseMapContext(mapCtx)
|
||||||
code = code.End.Next
|
code = code.End.Next
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ptr := load(ctxptr, code.End.MapPos)
|
mapCtx.Slice.Items[mapCtx.Idx].Value = b[mapCtx.Start:len(b)]
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
if idx < mapCtx.Len {
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
mapCtx.Idx = int(idx)
|
||||||
if idx < length {
|
mapCtx.Start = len(b)
|
||||||
ptr := load(ctxptr, code.MapIter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
store(ctxptr, code.ElemIdx, idx)
|
|
||||||
key := mapiterkey(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
} else {
|
} else {
|
||||||
@ -452,46 +445,27 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case encoder.OpMapValue:
|
case encoder.OpMapValue:
|
||||||
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
||||||
b = appendColon(ctx, b)
|
b = appendColon(ctx, b)
|
||||||
} else {
|
} else {
|
||||||
ptr := load(ctxptr, code.End.MapPos)
|
mapCtx.Slice.Items[mapCtx.Idx].Key = b[mapCtx.Start:len(b)]
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
mapCtx.Start = len(b)
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
|
||||||
}
|
}
|
||||||
ptr := load(ctxptr, code.MapIter)
|
value := mapitervalue(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
value := mapitervalue(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(value))
|
store(ctxptr, code.Next.Idx, uintptr(value))
|
||||||
mapiternext(iter)
|
mapiternext(&mapCtx.Iter)
|
||||||
code = code.Next
|
code = code.Next
|
||||||
case encoder.OpMapEnd:
|
case encoder.OpMapEnd:
|
||||||
// this operation only used by sorted map.
|
// this operation only used by sorted map.
|
||||||
length := int(load(ctxptr, code.Length))
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
ptr := load(ctxptr, code.MapPos)
|
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
|
||||||
pos := mapCtx.Pos
|
|
||||||
for i := 0; i < length; i++ {
|
|
||||||
startKey := pos[i*2]
|
|
||||||
startValue := pos[i*2+1]
|
|
||||||
var endValue int
|
|
||||||
if i+1 < length {
|
|
||||||
endValue = pos[i*2+2]
|
|
||||||
} else {
|
|
||||||
endValue = len(b)
|
|
||||||
}
|
|
||||||
mapCtx.Slice.Items = append(mapCtx.Slice.Items, encoder.MapItem{
|
|
||||||
Key: b[startKey:startValue],
|
|
||||||
Value: b[startValue:endValue],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
sort.Sort(mapCtx.Slice)
|
sort.Sort(mapCtx.Slice)
|
||||||
buf := mapCtx.Buf
|
buf := mapCtx.Buf
|
||||||
for _, item := range mapCtx.Slice.Items {
|
for _, item := range mapCtx.Slice.Items {
|
||||||
buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
|
buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
|
||||||
}
|
}
|
||||||
buf = appendMapEnd(ctx, code, buf)
|
buf = appendMapEnd(ctx, code, buf)
|
||||||
b = b[:pos[0]]
|
b = b[:mapCtx.First]
|
||||||
b = append(b, buf...)
|
b = append(b, buf...)
|
||||||
mapCtx.Buf = buf
|
mapCtx.Buf = buf
|
||||||
encoder.ReleaseMapContext(mapCtx)
|
encoder.ReleaseMapContext(mapCtx)
|
||||||
@ -731,14 +705,15 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
|
p += uintptr(code.Offset)
|
||||||
|
u64 := ptrToUint64(p, code.NumBitSize)
|
||||||
v := u64 & ((1 << code.NumBitSize) - 1)
|
v := u64 & ((1 << code.NumBitSize) - 1)
|
||||||
if v == 0 {
|
if v == 0 {
|
||||||
code = code.NextField
|
code = code.NextField
|
||||||
} else {
|
} else {
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
b = append(b, '"')
|
b = append(b, '"')
|
||||||
b = appendInt(ctx, b, p+uintptr(code.Offset), code)
|
b = appendInt(ctx, b, p, code)
|
||||||
b = append(b, '"')
|
b = append(b, '"')
|
||||||
b = appendComma(ctx, b)
|
b = appendComma(ctx, b)
|
||||||
code = code.Next
|
code = code.Next
|
||||||
@ -2979,9 +2954,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
@ -3020,9 +2996,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iface := ptrToInterface(code, p)
|
iface := ptrToInterface(code, p)
|
||||||
@ -3140,9 +3117,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
@ -3181,9 +3159,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
|
101
vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/vm.go
generated
vendored
101
vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/vm.go
generated
vendored
@ -199,7 +199,7 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
||||||
ifaceCodeSet, err := encoder.CompileToGetCodeSet(uintptr(unsafe.Pointer(typ)))
|
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -218,8 +218,7 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
oldOffset := ptrOffset
|
oldOffset := ptrOffset
|
||||||
ptrOffset += totalLength * uintptrSize
|
ptrOffset += totalLength * uintptrSize
|
||||||
oldBaseIndent := ctx.BaseIndent
|
oldBaseIndent := ctx.BaseIndent
|
||||||
indentDiffFromTop := c.Indent - 1
|
ctx.BaseIndent += code.Indent
|
||||||
ctx.BaseIndent += code.Indent - indentDiffFromTop
|
|
||||||
|
|
||||||
newLen := offsetNum + totalLength + nextTotalLength
|
newLen := offsetNum + totalLength + nextTotalLength
|
||||||
if curlen < newLen {
|
if curlen < newLen {
|
||||||
@ -403,48 +402,42 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
iter := mapiterinit(code.Type, uptr)
|
unorderedMap := (ctx.Option.Flag & encoder.UnorderedMapOption) != 0
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, iter)
|
mapCtx := encoder.NewMapContext(mlen, unorderedMap)
|
||||||
store(ctxptr, code.ElemIdx, 0)
|
mapiterinit(code.Type, uptr, &mapCtx.Iter)
|
||||||
store(ctxptr, code.Length, uintptr(mlen))
|
store(ctxptr, code.Idx, uintptr(unsafe.Pointer(mapCtx)))
|
||||||
store(ctxptr, code.MapIter, uintptr(iter))
|
ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if unorderedMap {
|
||||||
b = appendMapKeyIndent(ctx, code.Next, b)
|
b = appendMapKeyIndent(ctx, code.Next, b)
|
||||||
} else {
|
} else {
|
||||||
mapCtx := encoder.NewMapContext(mlen)
|
mapCtx.Start = len(b)
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
mapCtx.First = len(b)
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
|
|
||||||
store(ctxptr, code.End.MapPos, uintptr(unsafe.Pointer(mapCtx)))
|
|
||||||
}
|
}
|
||||||
key := mapiterkey(iter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
case encoder.OpMapKey:
|
case encoder.OpMapKey:
|
||||||
idx := load(ctxptr, code.ElemIdx)
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
length := load(ctxptr, code.Length)
|
idx := mapCtx.Idx
|
||||||
idx++
|
idx++
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
||||||
if idx < length {
|
if idx < mapCtx.Len {
|
||||||
b = appendMapKeyIndent(ctx, code, b)
|
b = appendMapKeyIndent(ctx, code, b)
|
||||||
store(ctxptr, code.ElemIdx, idx)
|
mapCtx.Idx = int(idx)
|
||||||
ptr := load(ctxptr, code.MapIter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
key := mapiterkey(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
} else {
|
} else {
|
||||||
b = appendObjectEnd(ctx, code, b)
|
b = appendObjectEnd(ctx, code, b)
|
||||||
|
encoder.ReleaseMapContext(mapCtx)
|
||||||
code = code.End.Next
|
code = code.End.Next
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ptr := load(ctxptr, code.End.MapPos)
|
mapCtx.Slice.Items[mapCtx.Idx].Value = b[mapCtx.Start:len(b)]
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
if idx < mapCtx.Len {
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
mapCtx.Idx = int(idx)
|
||||||
if idx < length {
|
mapCtx.Start = len(b)
|
||||||
ptr := load(ctxptr, code.MapIter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
store(ctxptr, code.ElemIdx, idx)
|
|
||||||
key := mapiterkey(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
} else {
|
} else {
|
||||||
@ -452,46 +445,27 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case encoder.OpMapValue:
|
case encoder.OpMapValue:
|
||||||
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
||||||
b = appendColon(ctx, b)
|
b = appendColon(ctx, b)
|
||||||
} else {
|
} else {
|
||||||
ptr := load(ctxptr, code.End.MapPos)
|
mapCtx.Slice.Items[mapCtx.Idx].Key = b[mapCtx.Start:len(b)]
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
mapCtx.Start = len(b)
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
|
||||||
}
|
}
|
||||||
ptr := load(ctxptr, code.MapIter)
|
value := mapitervalue(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
value := mapitervalue(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(value))
|
store(ctxptr, code.Next.Idx, uintptr(value))
|
||||||
mapiternext(iter)
|
mapiternext(&mapCtx.Iter)
|
||||||
code = code.Next
|
code = code.Next
|
||||||
case encoder.OpMapEnd:
|
case encoder.OpMapEnd:
|
||||||
// this operation only used by sorted map.
|
// this operation only used by sorted map.
|
||||||
length := int(load(ctxptr, code.Length))
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
ptr := load(ctxptr, code.MapPos)
|
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
|
||||||
pos := mapCtx.Pos
|
|
||||||
for i := 0; i < length; i++ {
|
|
||||||
startKey := pos[i*2]
|
|
||||||
startValue := pos[i*2+1]
|
|
||||||
var endValue int
|
|
||||||
if i+1 < length {
|
|
||||||
endValue = pos[i*2+2]
|
|
||||||
} else {
|
|
||||||
endValue = len(b)
|
|
||||||
}
|
|
||||||
mapCtx.Slice.Items = append(mapCtx.Slice.Items, encoder.MapItem{
|
|
||||||
Key: b[startKey:startValue],
|
|
||||||
Value: b[startValue:endValue],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
sort.Sort(mapCtx.Slice)
|
sort.Sort(mapCtx.Slice)
|
||||||
buf := mapCtx.Buf
|
buf := mapCtx.Buf
|
||||||
for _, item := range mapCtx.Slice.Items {
|
for _, item := range mapCtx.Slice.Items {
|
||||||
buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
|
buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
|
||||||
}
|
}
|
||||||
buf = appendMapEnd(ctx, code, buf)
|
buf = appendMapEnd(ctx, code, buf)
|
||||||
b = b[:pos[0]]
|
b = b[:mapCtx.First]
|
||||||
b = append(b, buf...)
|
b = append(b, buf...)
|
||||||
mapCtx.Buf = buf
|
mapCtx.Buf = buf
|
||||||
encoder.ReleaseMapContext(mapCtx)
|
encoder.ReleaseMapContext(mapCtx)
|
||||||
@ -731,14 +705,15 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
|
p += uintptr(code.Offset)
|
||||||
|
u64 := ptrToUint64(p, code.NumBitSize)
|
||||||
v := u64 & ((1 << code.NumBitSize) - 1)
|
v := u64 & ((1 << code.NumBitSize) - 1)
|
||||||
if v == 0 {
|
if v == 0 {
|
||||||
code = code.NextField
|
code = code.NextField
|
||||||
} else {
|
} else {
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
b = append(b, '"')
|
b = append(b, '"')
|
||||||
b = appendInt(ctx, b, p+uintptr(code.Offset), code)
|
b = appendInt(ctx, b, p, code)
|
||||||
b = append(b, '"')
|
b = append(b, '"')
|
||||||
b = appendComma(ctx, b)
|
b = appendComma(ctx, b)
|
||||||
code = code.Next
|
code = code.Next
|
||||||
@ -2979,9 +2954,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
@ -3020,9 +2996,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iface := ptrToInterface(code, p)
|
iface := ptrToInterface(code, p)
|
||||||
@ -3140,9 +3117,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
@ -3181,9 +3159,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
|
101
vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go
generated
vendored
101
vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go
generated
vendored
@ -199,7 +199,7 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
||||||
ifaceCodeSet, err := encoder.CompileToGetCodeSet(uintptr(unsafe.Pointer(typ)))
|
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -218,8 +218,7 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
oldOffset := ptrOffset
|
oldOffset := ptrOffset
|
||||||
ptrOffset += totalLength * uintptrSize
|
ptrOffset += totalLength * uintptrSize
|
||||||
oldBaseIndent := ctx.BaseIndent
|
oldBaseIndent := ctx.BaseIndent
|
||||||
indentDiffFromTop := c.Indent - 1
|
ctx.BaseIndent += code.Indent
|
||||||
ctx.BaseIndent += code.Indent - indentDiffFromTop
|
|
||||||
|
|
||||||
newLen := offsetNum + totalLength + nextTotalLength
|
newLen := offsetNum + totalLength + nextTotalLength
|
||||||
if curlen < newLen {
|
if curlen < newLen {
|
||||||
@ -403,48 +402,42 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
iter := mapiterinit(code.Type, uptr)
|
unorderedMap := (ctx.Option.Flag & encoder.UnorderedMapOption) != 0
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, iter)
|
mapCtx := encoder.NewMapContext(mlen, unorderedMap)
|
||||||
store(ctxptr, code.ElemIdx, 0)
|
mapiterinit(code.Type, uptr, &mapCtx.Iter)
|
||||||
store(ctxptr, code.Length, uintptr(mlen))
|
store(ctxptr, code.Idx, uintptr(unsafe.Pointer(mapCtx)))
|
||||||
store(ctxptr, code.MapIter, uintptr(iter))
|
ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if unorderedMap {
|
||||||
b = appendMapKeyIndent(ctx, code.Next, b)
|
b = appendMapKeyIndent(ctx, code.Next, b)
|
||||||
} else {
|
} else {
|
||||||
mapCtx := encoder.NewMapContext(mlen)
|
mapCtx.Start = len(b)
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
mapCtx.First = len(b)
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
|
|
||||||
store(ctxptr, code.End.MapPos, uintptr(unsafe.Pointer(mapCtx)))
|
|
||||||
}
|
}
|
||||||
key := mapiterkey(iter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
case encoder.OpMapKey:
|
case encoder.OpMapKey:
|
||||||
idx := load(ctxptr, code.ElemIdx)
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
length := load(ctxptr, code.Length)
|
idx := mapCtx.Idx
|
||||||
idx++
|
idx++
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
||||||
if idx < length {
|
if idx < mapCtx.Len {
|
||||||
b = appendMapKeyIndent(ctx, code, b)
|
b = appendMapKeyIndent(ctx, code, b)
|
||||||
store(ctxptr, code.ElemIdx, idx)
|
mapCtx.Idx = int(idx)
|
||||||
ptr := load(ctxptr, code.MapIter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
key := mapiterkey(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
} else {
|
} else {
|
||||||
b = appendObjectEnd(ctx, code, b)
|
b = appendObjectEnd(ctx, code, b)
|
||||||
|
encoder.ReleaseMapContext(mapCtx)
|
||||||
code = code.End.Next
|
code = code.End.Next
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ptr := load(ctxptr, code.End.MapPos)
|
mapCtx.Slice.Items[mapCtx.Idx].Value = b[mapCtx.Start:len(b)]
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
if idx < mapCtx.Len {
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
mapCtx.Idx = int(idx)
|
||||||
if idx < length {
|
mapCtx.Start = len(b)
|
||||||
ptr := load(ctxptr, code.MapIter)
|
key := mapiterkey(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
store(ctxptr, code.ElemIdx, idx)
|
|
||||||
key := mapiterkey(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(key))
|
store(ctxptr, code.Next.Idx, uintptr(key))
|
||||||
code = code.Next
|
code = code.Next
|
||||||
} else {
|
} else {
|
||||||
@ -452,46 +445,27 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case encoder.OpMapValue:
|
case encoder.OpMapValue:
|
||||||
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
|
||||||
b = appendColon(ctx, b)
|
b = appendColon(ctx, b)
|
||||||
} else {
|
} else {
|
||||||
ptr := load(ctxptr, code.End.MapPos)
|
mapCtx.Slice.Items[mapCtx.Idx].Key = b[mapCtx.Start:len(b)]
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
mapCtx.Start = len(b)
|
||||||
mapCtx.Pos = append(mapCtx.Pos, len(b))
|
|
||||||
}
|
}
|
||||||
ptr := load(ctxptr, code.MapIter)
|
value := mapitervalue(&mapCtx.Iter)
|
||||||
iter := ptrToUnsafePtr(ptr)
|
|
||||||
value := mapitervalue(iter)
|
|
||||||
store(ctxptr, code.Next.Idx, uintptr(value))
|
store(ctxptr, code.Next.Idx, uintptr(value))
|
||||||
mapiternext(iter)
|
mapiternext(&mapCtx.Iter)
|
||||||
code = code.Next
|
code = code.Next
|
||||||
case encoder.OpMapEnd:
|
case encoder.OpMapEnd:
|
||||||
// this operation only used by sorted map.
|
// this operation only used by sorted map.
|
||||||
length := int(load(ctxptr, code.Length))
|
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
|
||||||
ptr := load(ctxptr, code.MapPos)
|
|
||||||
mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
|
|
||||||
pos := mapCtx.Pos
|
|
||||||
for i := 0; i < length; i++ {
|
|
||||||
startKey := pos[i*2]
|
|
||||||
startValue := pos[i*2+1]
|
|
||||||
var endValue int
|
|
||||||
if i+1 < length {
|
|
||||||
endValue = pos[i*2+2]
|
|
||||||
} else {
|
|
||||||
endValue = len(b)
|
|
||||||
}
|
|
||||||
mapCtx.Slice.Items = append(mapCtx.Slice.Items, encoder.MapItem{
|
|
||||||
Key: b[startKey:startValue],
|
|
||||||
Value: b[startValue:endValue],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
sort.Sort(mapCtx.Slice)
|
sort.Sort(mapCtx.Slice)
|
||||||
buf := mapCtx.Buf
|
buf := mapCtx.Buf
|
||||||
for _, item := range mapCtx.Slice.Items {
|
for _, item := range mapCtx.Slice.Items {
|
||||||
buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
|
buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
|
||||||
}
|
}
|
||||||
buf = appendMapEnd(ctx, code, buf)
|
buf = appendMapEnd(ctx, code, buf)
|
||||||
b = b[:pos[0]]
|
b = b[:mapCtx.First]
|
||||||
b = append(b, buf...)
|
b = append(b, buf...)
|
||||||
mapCtx.Buf = buf
|
mapCtx.Buf = buf
|
||||||
encoder.ReleaseMapContext(mapCtx)
|
encoder.ReleaseMapContext(mapCtx)
|
||||||
@ -731,14 +705,15 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
|
p += uintptr(code.Offset)
|
||||||
|
u64 := ptrToUint64(p, code.NumBitSize)
|
||||||
v := u64 & ((1 << code.NumBitSize) - 1)
|
v := u64 & ((1 << code.NumBitSize) - 1)
|
||||||
if v == 0 {
|
if v == 0 {
|
||||||
code = code.NextField
|
code = code.NextField
|
||||||
} else {
|
} else {
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
b = append(b, '"')
|
b = append(b, '"')
|
||||||
b = appendInt(ctx, b, p+uintptr(code.Offset), code)
|
b = appendInt(ctx, b, p, code)
|
||||||
b = append(b, '"')
|
b = append(b, '"')
|
||||||
b = appendComma(ctx, b)
|
b = appendComma(ctx, b)
|
||||||
code = code.Next
|
code = code.Next
|
||||||
@ -2979,9 +2954,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
@ -3020,9 +2996,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iface := ptrToInterface(code, p)
|
iface := ptrToInterface(code, p)
|
||||||
@ -3140,9 +3117,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
b = appendStructKey(ctx, code, b)
|
b = appendStructKey(ctx, code, b)
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
@ -3181,9 +3159,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||||||
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
if code.Flags&encoder.AnonymousHeadFlags == 0 {
|
||||||
b = appendStructHead(ctx, b)
|
b = appendStructHead(ctx, b)
|
||||||
}
|
}
|
||||||
|
p += uintptr(code.Offset)
|
||||||
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
|
||||||
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
|
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
|
||||||
p = ptrToPtr(p + uintptr(code.Offset))
|
p = ptrToPtr(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
|
||||||
|
5
vendor/github.com/goccy/go-json/json.go
generated
vendored
5
vendor/github.com/goccy/go-json/json.go
generated
vendored
@ -364,3 +364,8 @@ func Valid(data []byte) bool {
|
|||||||
}
|
}
|
||||||
return decoder.InputOffset() >= int64(len(data))
|
return decoder.InputOffset() >= int64(len(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
encoder.Marshal = Marshal
|
||||||
|
encoder.Unmarshal = Unmarshal
|
||||||
|
}
|
||||||
|
17
vendor/github.com/goccy/go-json/option.go
generated
vendored
17
vendor/github.com/goccy/go-json/option.go
generated
vendored
@ -15,6 +15,23 @@ func UnorderedMap() EncodeOptionFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DisableHTMLEscape disables escaping of HTML characters ( '&', '<', '>' ) when encoding string.
|
||||||
|
func DisableHTMLEscape() EncodeOptionFunc {
|
||||||
|
return func(opt *EncodeOption) {
|
||||||
|
opt.Flag &= ^encoder.HTMLEscapeOption
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DisableNormalizeUTF8
|
||||||
|
// By default, when encoding string, UTF8 characters in the range of 0x80 - 0xFF are processed by applying \ufffd for invalid code and escaping for \u2028 and \u2029.
|
||||||
|
// This option disables this behaviour. You can expect faster speeds by applying this option, but be careful.
|
||||||
|
// encoding/json implements here: https://github.com/golang/go/blob/6178d25fc0b28724b1b5aec2b1b74fc06d9294c7/src/encoding/json/encode.go#L1067-L1093.
|
||||||
|
func DisableNormalizeUTF8() EncodeOptionFunc {
|
||||||
|
return func(opt *EncodeOption) {
|
||||||
|
opt.Flag &= ^encoder.NormalizeUTF8Option
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Debug outputs debug information when panic occurs during encoding.
|
// Debug outputs debug information when panic occurs during encoding.
|
||||||
func Debug() EncodeOptionFunc {
|
func Debug() EncodeOptionFunc {
|
||||||
return func(opt *EncodeOption) {
|
return func(opt *EncodeOption) {
|
||||||
|
47
vendor/github.com/goccy/go-json/query.go
generated
vendored
Normal file
47
vendor/github.com/goccy/go-json/query.go
generated
vendored
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package json
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/goccy/go-json/internal/encoder"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
// FieldQuery you can dynamically filter the fields in the structure by creating a FieldQuery,
|
||||||
|
// adding it to context.Context using SetFieldQueryToContext and then passing it to MarshalContext.
|
||||||
|
// This is a type-safe operation, so it is faster than filtering using map[string]interface{}.
|
||||||
|
FieldQuery = encoder.FieldQuery
|
||||||
|
FieldQueryString = encoder.FieldQueryString
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// FieldQueryFromContext get current FieldQuery from context.Context.
|
||||||
|
FieldQueryFromContext = encoder.FieldQueryFromContext
|
||||||
|
// SetFieldQueryToContext set current FieldQuery to context.Context.
|
||||||
|
SetFieldQueryToContext = encoder.SetFieldQueryToContext
|
||||||
|
)
|
||||||
|
|
||||||
|
// BuildFieldQuery builds FieldQuery by fieldName or sub field query.
|
||||||
|
// First, specify the field name that you want to keep in structure type.
|
||||||
|
// If the field you want to keep is a structure type, by creating a sub field query using BuildSubFieldQuery,
|
||||||
|
// you can select the fields you want to keep in the structure.
|
||||||
|
// This description can be written recursively.
|
||||||
|
func BuildFieldQuery(fields ...FieldQueryString) (*FieldQuery, error) {
|
||||||
|
query, err := Marshal(fields)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return FieldQueryString(query).Build()
|
||||||
|
}
|
||||||
|
|
||||||
|
// BuildSubFieldQuery builds sub field query.
|
||||||
|
func BuildSubFieldQuery(name string) *SubFieldQuery {
|
||||||
|
return &SubFieldQuery{name: name}
|
||||||
|
}
|
||||||
|
|
||||||
|
type SubFieldQuery struct {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *SubFieldQuery) Fields(fields ...FieldQueryString) FieldQueryString {
|
||||||
|
query, _ := Marshal(map[string][]FieldQueryString{q.name: fields})
|
||||||
|
return FieldQueryString(query)
|
||||||
|
}
|
23
vendor/github.com/labstack/echo/v4/CHANGELOG.md
generated
vendored
23
vendor/github.com/labstack/echo/v4/CHANGELOG.md
generated
vendored
@ -1,5 +1,28 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v4.6.3 - 2022-01-10
|
||||||
|
|
||||||
|
**Fixes**
|
||||||
|
|
||||||
|
* Fixed Echo version number in greeting message which was not incremented to `4.6.2` [#2066](https://github.com/labstack/echo/issues/2066)
|
||||||
|
|
||||||
|
|
||||||
|
## v4.6.2 - 2022-01-08
|
||||||
|
|
||||||
|
**Fixes**
|
||||||
|
|
||||||
|
* Fixed route containing escaped colon should be matchable but is not matched to request path [#2047](https://github.com/labstack/echo/pull/2047)
|
||||||
|
* Fixed a problem that returned wrong content-encoding when the gzip compressed content was empty. [#1921](https://github.com/labstack/echo/pull/1921)
|
||||||
|
* Update (test) dependencies [#2021](https://github.com/labstack/echo/pull/2021)
|
||||||
|
|
||||||
|
|
||||||
|
**Enhancements**
|
||||||
|
|
||||||
|
* Add support for configurable target header for the request_id middleware [#2040](https://github.com/labstack/echo/pull/2040)
|
||||||
|
* Change decompress middleware to use stream decompression instead of buffering [#2018](https://github.com/labstack/echo/pull/2018)
|
||||||
|
* Documentation updates
|
||||||
|
|
||||||
|
|
||||||
## v4.6.1 - 2021-09-26
|
## v4.6.1 - 2021-09-26
|
||||||
|
|
||||||
**Enhancements**
|
**Enhancements**
|
||||||
|
2
vendor/github.com/labstack/echo/v4/README.md
generated
vendored
2
vendor/github.com/labstack/echo/v4/README.md
generated
vendored
@ -66,9 +66,9 @@ go get github.com/labstack/echo/v4
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"github.com/labstack/echo/v4/middleware"
|
"github.com/labstack/echo/v4/middleware"
|
||||||
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
3
vendor/github.com/labstack/echo/v4/echo.go
generated
vendored
3
vendor/github.com/labstack/echo/v4/echo.go
generated
vendored
@ -214,6 +214,7 @@ const (
|
|||||||
HeaderXHTTPMethodOverride = "X-HTTP-Method-Override"
|
HeaderXHTTPMethodOverride = "X-HTTP-Method-Override"
|
||||||
HeaderXRealIP = "X-Real-IP"
|
HeaderXRealIP = "X-Real-IP"
|
||||||
HeaderXRequestID = "X-Request-ID"
|
HeaderXRequestID = "X-Request-ID"
|
||||||
|
HeaderXCorrelationID = "X-Correlation-ID"
|
||||||
HeaderXRequestedWith = "X-Requested-With"
|
HeaderXRequestedWith = "X-Requested-With"
|
||||||
HeaderServer = "Server"
|
HeaderServer = "Server"
|
||||||
HeaderOrigin = "Origin"
|
HeaderOrigin = "Origin"
|
||||||
@ -241,7 +242,7 @@ const (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// Version of Echo
|
// Version of Echo
|
||||||
Version = "4.6.1"
|
Version = "4.6.3"
|
||||||
website = "https://echo.labstack.com"
|
website = "https://echo.labstack.com"
|
||||||
// http://patorjk.com/software/taag/#p=display&f=Small%20Slant&t=Echo
|
// http://patorjk.com/software/taag/#p=display&f=Small%20Slant&t=Echo
|
||||||
banner = `
|
banner = `
|
||||||
|
3
vendor/github.com/labstack/echo/v4/router.go
generated
vendored
3
vendor/github.com/labstack/echo/v4/router.go
generated
vendored
@ -99,6 +99,9 @@ func (r *Router) Add(method, path string, h HandlerFunc) {
|
|||||||
for i, lcpIndex := 0, len(path); i < lcpIndex; i++ {
|
for i, lcpIndex := 0, len(path); i < lcpIndex; i++ {
|
||||||
if path[i] == ':' {
|
if path[i] == ':' {
|
||||||
if i > 0 && path[i-1] == '\\' {
|
if i > 0 && path[i-1] == '\\' {
|
||||||
|
path = path[:i-1] + path[i:]
|
||||||
|
i--
|
||||||
|
lcpIndex--
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
j := i + 1
|
j := i + 1
|
||||||
|
22
vendor/github.com/robfig/cron/.gitignore
generated
vendored
22
vendor/github.com/robfig/cron/.gitignore
generated
vendored
@ -1,22 +0,0 @@
|
|||||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
|
||||||
*.o
|
|
||||||
*.a
|
|
||||||
*.so
|
|
||||||
|
|
||||||
# Folders
|
|
||||||
_obj
|
|
||||||
_test
|
|
||||||
|
|
||||||
# Architecture specific extensions/prefixes
|
|
||||||
*.[568vq]
|
|
||||||
[568vq].out
|
|
||||||
|
|
||||||
*.cgo1.go
|
|
||||||
*.cgo2.c
|
|
||||||
_cgo_defun.c
|
|
||||||
_cgo_gotypes.go
|
|
||||||
_cgo_export.*
|
|
||||||
|
|
||||||
_testmain.go
|
|
||||||
|
|
||||||
*.exe
|
|
1
vendor/github.com/robfig/cron/.travis.yml
generated
vendored
1
vendor/github.com/robfig/cron/.travis.yml
generated
vendored
@ -1 +0,0 @@
|
|||||||
language: go
|
|
21
vendor/github.com/robfig/cron/LICENSE
generated
vendored
21
vendor/github.com/robfig/cron/LICENSE
generated
vendored
@ -1,21 +0,0 @@
|
|||||||
Copyright (C) 2012 Rob Figueiredo
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
6
vendor/github.com/robfig/cron/README.md
generated
vendored
6
vendor/github.com/robfig/cron/README.md
generated
vendored
@ -1,6 +0,0 @@
|
|||||||
[![GoDoc](http://godoc.org/github.com/robfig/cron?status.png)](http://godoc.org/github.com/robfig/cron)
|
|
||||||
[![Build Status](https://travis-ci.org/robfig/cron.svg?branch=master)](https://travis-ci.org/robfig/cron)
|
|
||||||
|
|
||||||
# cron
|
|
||||||
|
|
||||||
Documentation here: https://godoc.org/github.com/robfig/cron
|
|
27
vendor/github.com/robfig/cron/constantdelay.go
generated
vendored
27
vendor/github.com/robfig/cron/constantdelay.go
generated
vendored
@ -1,27 +0,0 @@
|
|||||||
package cron
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
// ConstantDelaySchedule represents a simple recurring duty cycle, e.g. "Every 5 minutes".
|
|
||||||
// It does not support jobs more frequent than once a second.
|
|
||||||
type ConstantDelaySchedule struct {
|
|
||||||
Delay time.Duration
|
|
||||||
}
|
|
||||||
|
|
||||||
// Every returns a crontab Schedule that activates once every duration.
|
|
||||||
// Delays of less than a second are not supported (will round up to 1 second).
|
|
||||||
// Any fields less than a Second are truncated.
|
|
||||||
func Every(duration time.Duration) ConstantDelaySchedule {
|
|
||||||
if duration < time.Second {
|
|
||||||
duration = time.Second
|
|
||||||
}
|
|
||||||
return ConstantDelaySchedule{
|
|
||||||
Delay: duration - time.Duration(duration.Nanoseconds())%time.Second,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next returns the next time this should be run.
|
|
||||||
// This rounds so that the next activation time will be on the second.
|
|
||||||
func (schedule ConstantDelaySchedule) Next(t time.Time) time.Time {
|
|
||||||
return t.Add(schedule.Delay - time.Duration(t.Nanosecond())*time.Nanosecond)
|
|
||||||
}
|
|
259
vendor/github.com/robfig/cron/cron.go
generated
vendored
259
vendor/github.com/robfig/cron/cron.go
generated
vendored
@ -1,259 +0,0 @@
|
|||||||
package cron
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"runtime"
|
|
||||||
"sort"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Cron keeps track of any number of entries, invoking the associated func as
|
|
||||||
// specified by the schedule. It may be started, stopped, and the entries may
|
|
||||||
// be inspected while running.
|
|
||||||
type Cron struct {
|
|
||||||
entries []*Entry
|
|
||||||
stop chan struct{}
|
|
||||||
add chan *Entry
|
|
||||||
snapshot chan []*Entry
|
|
||||||
running bool
|
|
||||||
ErrorLog *log.Logger
|
|
||||||
location *time.Location
|
|
||||||
}
|
|
||||||
|
|
||||||
// Job is an interface for submitted cron jobs.
|
|
||||||
type Job interface {
|
|
||||||
Run()
|
|
||||||
}
|
|
||||||
|
|
||||||
// The Schedule describes a job's duty cycle.
|
|
||||||
type Schedule interface {
|
|
||||||
// Return the next activation time, later than the given time.
|
|
||||||
// Next is invoked initially, and then each time the job is run.
|
|
||||||
Next(time.Time) time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
// Entry consists of a schedule and the func to execute on that schedule.
|
|
||||||
type Entry struct {
|
|
||||||
// The schedule on which this job should be run.
|
|
||||||
Schedule Schedule
|
|
||||||
|
|
||||||
// The next time the job will run. This is the zero time if Cron has not been
|
|
||||||
// started or this entry's schedule is unsatisfiable
|
|
||||||
Next time.Time
|
|
||||||
|
|
||||||
// The last time this job was run. This is the zero time if the job has never
|
|
||||||
// been run.
|
|
||||||
Prev time.Time
|
|
||||||
|
|
||||||
// The Job to run.
|
|
||||||
Job Job
|
|
||||||
}
|
|
||||||
|
|
||||||
// byTime is a wrapper for sorting the entry array by time
|
|
||||||
// (with zero time at the end).
|
|
||||||
type byTime []*Entry
|
|
||||||
|
|
||||||
func (s byTime) Len() int { return len(s) }
|
|
||||||
func (s byTime) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
|
||||||
func (s byTime) Less(i, j int) bool {
|
|
||||||
// Two zero times should return false.
|
|
||||||
// Otherwise, zero is "greater" than any other time.
|
|
||||||
// (To sort it at the end of the list.)
|
|
||||||
if s[i].Next.IsZero() {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if s[j].Next.IsZero() {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return s[i].Next.Before(s[j].Next)
|
|
||||||
}
|
|
||||||
|
|
||||||
// New returns a new Cron job runner, in the Local time zone.
|
|
||||||
func New() *Cron {
|
|
||||||
return NewWithLocation(time.Now().Location())
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewWithLocation returns a new Cron job runner.
|
|
||||||
func NewWithLocation(location *time.Location) *Cron {
|
|
||||||
return &Cron{
|
|
||||||
entries: nil,
|
|
||||||
add: make(chan *Entry),
|
|
||||||
stop: make(chan struct{}),
|
|
||||||
snapshot: make(chan []*Entry),
|
|
||||||
running: false,
|
|
||||||
ErrorLog: nil,
|
|
||||||
location: location,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A wrapper that turns a func() into a cron.Job
|
|
||||||
type FuncJob func()
|
|
||||||
|
|
||||||
func (f FuncJob) Run() { f() }
|
|
||||||
|
|
||||||
// AddFunc adds a func to the Cron to be run on the given schedule.
|
|
||||||
func (c *Cron) AddFunc(spec string, cmd func()) error {
|
|
||||||
return c.AddJob(spec, FuncJob(cmd))
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddJob adds a Job to the Cron to be run on the given schedule.
|
|
||||||
func (c *Cron) AddJob(spec string, cmd Job) error {
|
|
||||||
schedule, err := Parse(spec)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
c.Schedule(schedule, cmd)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Schedule adds a Job to the Cron to be run on the given schedule.
|
|
||||||
func (c *Cron) Schedule(schedule Schedule, cmd Job) {
|
|
||||||
entry := &Entry{
|
|
||||||
Schedule: schedule,
|
|
||||||
Job: cmd,
|
|
||||||
}
|
|
||||||
if !c.running {
|
|
||||||
c.entries = append(c.entries, entry)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
c.add <- entry
|
|
||||||
}
|
|
||||||
|
|
||||||
// Entries returns a snapshot of the cron entries.
|
|
||||||
func (c *Cron) Entries() []*Entry {
|
|
||||||
if c.running {
|
|
||||||
c.snapshot <- nil
|
|
||||||
x := <-c.snapshot
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
return c.entrySnapshot()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Location gets the time zone location
|
|
||||||
func (c *Cron) Location() *time.Location {
|
|
||||||
return c.location
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the cron scheduler in its own go-routine, or no-op if already started.
|
|
||||||
func (c *Cron) Start() {
|
|
||||||
if c.running {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
c.running = true
|
|
||||||
go c.run()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run the cron scheduler, or no-op if already running.
|
|
||||||
func (c *Cron) Run() {
|
|
||||||
if c.running {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
c.running = true
|
|
||||||
c.run()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Cron) runWithRecovery(j Job) {
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
const size = 64 << 10
|
|
||||||
buf := make([]byte, size)
|
|
||||||
buf = buf[:runtime.Stack(buf, false)]
|
|
||||||
c.logf("cron: panic running job: %v\n%s", r, buf)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
j.Run()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run the scheduler. this is private just due to the need to synchronize
|
|
||||||
// access to the 'running' state variable.
|
|
||||||
func (c *Cron) run() {
|
|
||||||
// Figure out the next activation times for each entry.
|
|
||||||
now := c.now()
|
|
||||||
for _, entry := range c.entries {
|
|
||||||
entry.Next = entry.Schedule.Next(now)
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
// Determine the next entry to run.
|
|
||||||
sort.Sort(byTime(c.entries))
|
|
||||||
|
|
||||||
var timer *time.Timer
|
|
||||||
if len(c.entries) == 0 || c.entries[0].Next.IsZero() {
|
|
||||||
// If there are no entries yet, just sleep - it still handles new entries
|
|
||||||
// and stop requests.
|
|
||||||
timer = time.NewTimer(100000 * time.Hour)
|
|
||||||
} else {
|
|
||||||
timer = time.NewTimer(c.entries[0].Next.Sub(now))
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case now = <-timer.C:
|
|
||||||
now = now.In(c.location)
|
|
||||||
// Run every entry whose next time was less than now
|
|
||||||
for _, e := range c.entries {
|
|
||||||
if e.Next.After(now) || e.Next.IsZero() {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
go c.runWithRecovery(e.Job)
|
|
||||||
e.Prev = e.Next
|
|
||||||
e.Next = e.Schedule.Next(now)
|
|
||||||
}
|
|
||||||
|
|
||||||
case newEntry := <-c.add:
|
|
||||||
timer.Stop()
|
|
||||||
now = c.now()
|
|
||||||
newEntry.Next = newEntry.Schedule.Next(now)
|
|
||||||
c.entries = append(c.entries, newEntry)
|
|
||||||
|
|
||||||
case <-c.snapshot:
|
|
||||||
c.snapshot <- c.entrySnapshot()
|
|
||||||
continue
|
|
||||||
|
|
||||||
case <-c.stop:
|
|
||||||
timer.Stop()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Logs an error to stderr or to the configured error log
|
|
||||||
func (c *Cron) logf(format string, args ...interface{}) {
|
|
||||||
if c.ErrorLog != nil {
|
|
||||||
c.ErrorLog.Printf(format, args...)
|
|
||||||
} else {
|
|
||||||
log.Printf(format, args...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop stops the cron scheduler if it is running; otherwise it does nothing.
|
|
||||||
func (c *Cron) Stop() {
|
|
||||||
if !c.running {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
c.stop <- struct{}{}
|
|
||||||
c.running = false
|
|
||||||
}
|
|
||||||
|
|
||||||
// entrySnapshot returns a copy of the current cron entry list.
|
|
||||||
func (c *Cron) entrySnapshot() []*Entry {
|
|
||||||
entries := []*Entry{}
|
|
||||||
for _, e := range c.entries {
|
|
||||||
entries = append(entries, &Entry{
|
|
||||||
Schedule: e.Schedule,
|
|
||||||
Next: e.Next,
|
|
||||||
Prev: e.Prev,
|
|
||||||
Job: e.Job,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return entries
|
|
||||||
}
|
|
||||||
|
|
||||||
// now returns current time in c location
|
|
||||||
func (c *Cron) now() time.Time {
|
|
||||||
return time.Now().In(c.location)
|
|
||||||
}
|
|
129
vendor/github.com/robfig/cron/doc.go
generated
vendored
129
vendor/github.com/robfig/cron/doc.go
generated
vendored
@ -1,129 +0,0 @@
|
|||||||
/*
|
|
||||||
Package cron implements a cron spec parser and job runner.
|
|
||||||
|
|
||||||
Usage
|
|
||||||
|
|
||||||
Callers may register Funcs to be invoked on a given schedule. Cron will run
|
|
||||||
them in their own goroutines.
|
|
||||||
|
|
||||||
c := cron.New()
|
|
||||||
c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") })
|
|
||||||
c.AddFunc("@hourly", func() { fmt.Println("Every hour") })
|
|
||||||
c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty") })
|
|
||||||
c.Start()
|
|
||||||
..
|
|
||||||
// Funcs are invoked in their own goroutine, asynchronously.
|
|
||||||
...
|
|
||||||
// Funcs may also be added to a running Cron
|
|
||||||
c.AddFunc("@daily", func() { fmt.Println("Every day") })
|
|
||||||
..
|
|
||||||
// Inspect the cron job entries' next and previous run times.
|
|
||||||
inspect(c.Entries())
|
|
||||||
..
|
|
||||||
c.Stop() // Stop the scheduler (does not stop any jobs already running).
|
|
||||||
|
|
||||||
CRON Expression Format
|
|
||||||
|
|
||||||
A cron expression represents a set of times, using 6 space-separated fields.
|
|
||||||
|
|
||||||
Field name | Mandatory? | Allowed values | Allowed special characters
|
|
||||||
---------- | ---------- | -------------- | --------------------------
|
|
||||||
Seconds | Yes | 0-59 | * / , -
|
|
||||||
Minutes | Yes | 0-59 | * / , -
|
|
||||||
Hours | Yes | 0-23 | * / , -
|
|
||||||
Day of month | Yes | 1-31 | * / , - ?
|
|
||||||
Month | Yes | 1-12 or JAN-DEC | * / , -
|
|
||||||
Day of week | Yes | 0-6 or SUN-SAT | * / , - ?
|
|
||||||
|
|
||||||
Note: Month and Day-of-week field values are case insensitive. "SUN", "Sun",
|
|
||||||
and "sun" are equally accepted.
|
|
||||||
|
|
||||||
Special Characters
|
|
||||||
|
|
||||||
Asterisk ( * )
|
|
||||||
|
|
||||||
The asterisk indicates that the cron expression will match for all values of the
|
|
||||||
field; e.g., using an asterisk in the 5th field (month) would indicate every
|
|
||||||
month.
|
|
||||||
|
|
||||||
Slash ( / )
|
|
||||||
|
|
||||||
Slashes are used to describe increments of ranges. For example 3-59/15 in the
|
|
||||||
1st field (minutes) would indicate the 3rd minute of the hour and every 15
|
|
||||||
minutes thereafter. The form "*\/..." is equivalent to the form "first-last/...",
|
|
||||||
that is, an increment over the largest possible range of the field. The form
|
|
||||||
"N/..." is accepted as meaning "N-MAX/...", that is, starting at N, use the
|
|
||||||
increment until the end of that specific range. It does not wrap around.
|
|
||||||
|
|
||||||
Comma ( , )
|
|
||||||
|
|
||||||
Commas are used to separate items of a list. For example, using "MON,WED,FRI" in
|
|
||||||
the 5th field (day of week) would mean Mondays, Wednesdays and Fridays.
|
|
||||||
|
|
||||||
Hyphen ( - )
|
|
||||||
|
|
||||||
Hyphens are used to define ranges. For example, 9-17 would indicate every
|
|
||||||
hour between 9am and 5pm inclusive.
|
|
||||||
|
|
||||||
Question mark ( ? )
|
|
||||||
|
|
||||||
Question mark may be used instead of '*' for leaving either day-of-month or
|
|
||||||
day-of-week blank.
|
|
||||||
|
|
||||||
Predefined schedules
|
|
||||||
|
|
||||||
You may use one of several pre-defined schedules in place of a cron expression.
|
|
||||||
|
|
||||||
Entry | Description | Equivalent To
|
|
||||||
----- | ----------- | -------------
|
|
||||||
@yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 0 1 1 *
|
|
||||||
@monthly | Run once a month, midnight, first of month | 0 0 0 1 * *
|
|
||||||
@weekly | Run once a week, midnight between Sat/Sun | 0 0 0 * * 0
|
|
||||||
@daily (or @midnight) | Run once a day, midnight | 0 0 0 * * *
|
|
||||||
@hourly | Run once an hour, beginning of hour | 0 0 * * * *
|
|
||||||
|
|
||||||
Intervals
|
|
||||||
|
|
||||||
You may also schedule a job to execute at fixed intervals, starting at the time it's added
|
|
||||||
or cron is run. This is supported by formatting the cron spec like this:
|
|
||||||
|
|
||||||
@every <duration>
|
|
||||||
|
|
||||||
where "duration" is a string accepted by time.ParseDuration
|
|
||||||
(http://golang.org/pkg/time/#ParseDuration).
|
|
||||||
|
|
||||||
For example, "@every 1h30m10s" would indicate a schedule that activates after
|
|
||||||
1 hour, 30 minutes, 10 seconds, and then every interval after that.
|
|
||||||
|
|
||||||
Note: The interval does not take the job runtime into account. For example,
|
|
||||||
if a job takes 3 minutes to run, and it is scheduled to run every 5 minutes,
|
|
||||||
it will have only 2 minutes of idle time between each run.
|
|
||||||
|
|
||||||
Time zones
|
|
||||||
|
|
||||||
All interpretation and scheduling is done in the machine's local time zone (as
|
|
||||||
provided by the Go time package (http://www.golang.org/pkg/time).
|
|
||||||
|
|
||||||
Be aware that jobs scheduled during daylight-savings leap-ahead transitions will
|
|
||||||
not be run!
|
|
||||||
|
|
||||||
Thread safety
|
|
||||||
|
|
||||||
Since the Cron service runs concurrently with the calling code, some amount of
|
|
||||||
care must be taken to ensure proper synchronization.
|
|
||||||
|
|
||||||
All cron methods are designed to be correctly synchronized as long as the caller
|
|
||||||
ensures that invocations have a clear happens-before ordering between them.
|
|
||||||
|
|
||||||
Implementation
|
|
||||||
|
|
||||||
Cron entries are stored in an array, sorted by their next activation time. Cron
|
|
||||||
sleeps until the next job is due to be run.
|
|
||||||
|
|
||||||
Upon waking:
|
|
||||||
- it runs each entry that is active on that second
|
|
||||||
- it calculates the next run times for the jobs that were run
|
|
||||||
- it re-sorts the array of entries by next activation time.
|
|
||||||
- it goes to sleep until the soonest job.
|
|
||||||
*/
|
|
||||||
package cron
|
|
380
vendor/github.com/robfig/cron/parser.go
generated
vendored
380
vendor/github.com/robfig/cron/parser.go
generated
vendored
@ -1,380 +0,0 @@
|
|||||||
package cron
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"math"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Configuration options for creating a parser. Most options specify which
|
|
||||||
// fields should be included, while others enable features. If a field is not
|
|
||||||
// included the parser will assume a default value. These options do not change
|
|
||||||
// the order fields are parse in.
|
|
||||||
type ParseOption int
|
|
||||||
|
|
||||||
const (
|
|
||||||
Second ParseOption = 1 << iota // Seconds field, default 0
|
|
||||||
Minute // Minutes field, default 0
|
|
||||||
Hour // Hours field, default 0
|
|
||||||
Dom // Day of month field, default *
|
|
||||||
Month // Month field, default *
|
|
||||||
Dow // Day of week field, default *
|
|
||||||
DowOptional // Optional day of week field, default *
|
|
||||||
Descriptor // Allow descriptors such as @monthly, @weekly, etc.
|
|
||||||
)
|
|
||||||
|
|
||||||
var places = []ParseOption{
|
|
||||||
Second,
|
|
||||||
Minute,
|
|
||||||
Hour,
|
|
||||||
Dom,
|
|
||||||
Month,
|
|
||||||
Dow,
|
|
||||||
}
|
|
||||||
|
|
||||||
var defaults = []string{
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"*",
|
|
||||||
"*",
|
|
||||||
"*",
|
|
||||||
}
|
|
||||||
|
|
||||||
// A custom Parser that can be configured.
|
|
||||||
type Parser struct {
|
|
||||||
options ParseOption
|
|
||||||
optionals int
|
|
||||||
}
|
|
||||||
|
|
||||||
// Creates a custom Parser with custom options.
|
|
||||||
//
|
|
||||||
// // Standard parser without descriptors
|
|
||||||
// specParser := NewParser(Minute | Hour | Dom | Month | Dow)
|
|
||||||
// sched, err := specParser.Parse("0 0 15 */3 *")
|
|
||||||
//
|
|
||||||
// // Same as above, just excludes time fields
|
|
||||||
// subsParser := NewParser(Dom | Month | Dow)
|
|
||||||
// sched, err := specParser.Parse("15 */3 *")
|
|
||||||
//
|
|
||||||
// // Same as above, just makes Dow optional
|
|
||||||
// subsParser := NewParser(Dom | Month | DowOptional)
|
|
||||||
// sched, err := specParser.Parse("15 */3")
|
|
||||||
//
|
|
||||||
func NewParser(options ParseOption) Parser {
|
|
||||||
optionals := 0
|
|
||||||
if options&DowOptional > 0 {
|
|
||||||
options |= Dow
|
|
||||||
optionals++
|
|
||||||
}
|
|
||||||
return Parser{options, optionals}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse returns a new crontab schedule representing the given spec.
|
|
||||||
// It returns a descriptive error if the spec is not valid.
|
|
||||||
// It accepts crontab specs and features configured by NewParser.
|
|
||||||
func (p Parser) Parse(spec string) (Schedule, error) {
|
|
||||||
if len(spec) == 0 {
|
|
||||||
return nil, fmt.Errorf("Empty spec string")
|
|
||||||
}
|
|
||||||
if spec[0] == '@' && p.options&Descriptor > 0 {
|
|
||||||
return parseDescriptor(spec)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Figure out how many fields we need
|
|
||||||
max := 0
|
|
||||||
for _, place := range places {
|
|
||||||
if p.options&place > 0 {
|
|
||||||
max++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
min := max - p.optionals
|
|
||||||
|
|
||||||
// Split fields on whitespace
|
|
||||||
fields := strings.Fields(spec)
|
|
||||||
|
|
||||||
// Validate number of fields
|
|
||||||
if count := len(fields); count < min || count > max {
|
|
||||||
if min == max {
|
|
||||||
return nil, fmt.Errorf("Expected exactly %d fields, found %d: %s", min, count, spec)
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("Expected %d to %d fields, found %d: %s", min, max, count, spec)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill in missing fields
|
|
||||||
fields = expandFields(fields, p.options)
|
|
||||||
|
|
||||||
var err error
|
|
||||||
field := func(field string, r bounds) uint64 {
|
|
||||||
if err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
var bits uint64
|
|
||||||
bits, err = getField(field, r)
|
|
||||||
return bits
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
second = field(fields[0], seconds)
|
|
||||||
minute = field(fields[1], minutes)
|
|
||||||
hour = field(fields[2], hours)
|
|
||||||
dayofmonth = field(fields[3], dom)
|
|
||||||
month = field(fields[4], months)
|
|
||||||
dayofweek = field(fields[5], dow)
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &SpecSchedule{
|
|
||||||
Second: second,
|
|
||||||
Minute: minute,
|
|
||||||
Hour: hour,
|
|
||||||
Dom: dayofmonth,
|
|
||||||
Month: month,
|
|
||||||
Dow: dayofweek,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func expandFields(fields []string, options ParseOption) []string {
|
|
||||||
n := 0
|
|
||||||
count := len(fields)
|
|
||||||
expFields := make([]string, len(places))
|
|
||||||
copy(expFields, defaults)
|
|
||||||
for i, place := range places {
|
|
||||||
if options&place > 0 {
|
|
||||||
expFields[i] = fields[n]
|
|
||||||
n++
|
|
||||||
}
|
|
||||||
if n == count {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return expFields
|
|
||||||
}
|
|
||||||
|
|
||||||
var standardParser = NewParser(
|
|
||||||
Minute | Hour | Dom | Month | Dow | Descriptor,
|
|
||||||
)
|
|
||||||
|
|
||||||
// ParseStandard returns a new crontab schedule representing the given standardSpec
|
|
||||||
// (https://en.wikipedia.org/wiki/Cron). It differs from Parse requiring to always
|
|
||||||
// pass 5 entries representing: minute, hour, day of month, month and day of week,
|
|
||||||
// in that order. It returns a descriptive error if the spec is not valid.
|
|
||||||
//
|
|
||||||
// It accepts
|
|
||||||
// - Standard crontab specs, e.g. "* * * * ?"
|
|
||||||
// - Descriptors, e.g. "@midnight", "@every 1h30m"
|
|
||||||
func ParseStandard(standardSpec string) (Schedule, error) {
|
|
||||||
return standardParser.Parse(standardSpec)
|
|
||||||
}
|
|
||||||
|
|
||||||
var defaultParser = NewParser(
|
|
||||||
Second | Minute | Hour | Dom | Month | DowOptional | Descriptor,
|
|
||||||
)
|
|
||||||
|
|
||||||
// Parse returns a new crontab schedule representing the given spec.
|
|
||||||
// It returns a descriptive error if the spec is not valid.
|
|
||||||
//
|
|
||||||
// It accepts
|
|
||||||
// - Full crontab specs, e.g. "* * * * * ?"
|
|
||||||
// - Descriptors, e.g. "@midnight", "@every 1h30m"
|
|
||||||
func Parse(spec string) (Schedule, error) {
|
|
||||||
return defaultParser.Parse(spec)
|
|
||||||
}
|
|
||||||
|
|
||||||
// getField returns an Int with the bits set representing all of the times that
|
|
||||||
// the field represents or error parsing field value. A "field" is a comma-separated
|
|
||||||
// list of "ranges".
|
|
||||||
func getField(field string, r bounds) (uint64, error) {
|
|
||||||
var bits uint64
|
|
||||||
ranges := strings.FieldsFunc(field, func(r rune) bool { return r == ',' })
|
|
||||||
for _, expr := range ranges {
|
|
||||||
bit, err := getRange(expr, r)
|
|
||||||
if err != nil {
|
|
||||||
return bits, err
|
|
||||||
}
|
|
||||||
bits |= bit
|
|
||||||
}
|
|
||||||
return bits, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// getRange returns the bits indicated by the given expression:
|
|
||||||
// number | number "-" number [ "/" number ]
|
|
||||||
// or error parsing range.
|
|
||||||
func getRange(expr string, r bounds) (uint64, error) {
|
|
||||||
var (
|
|
||||||
start, end, step uint
|
|
||||||
rangeAndStep = strings.Split(expr, "/")
|
|
||||||
lowAndHigh = strings.Split(rangeAndStep[0], "-")
|
|
||||||
singleDigit = len(lowAndHigh) == 1
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
|
|
||||||
var extra uint64
|
|
||||||
if lowAndHigh[0] == "*" || lowAndHigh[0] == "?" {
|
|
||||||
start = r.min
|
|
||||||
end = r.max
|
|
||||||
extra = starBit
|
|
||||||
} else {
|
|
||||||
start, err = parseIntOrName(lowAndHigh[0], r.names)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
switch len(lowAndHigh) {
|
|
||||||
case 1:
|
|
||||||
end = start
|
|
||||||
case 2:
|
|
||||||
end, err = parseIntOrName(lowAndHigh[1], r.names)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return 0, fmt.Errorf("Too many hyphens: %s", expr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch len(rangeAndStep) {
|
|
||||||
case 1:
|
|
||||||
step = 1
|
|
||||||
case 2:
|
|
||||||
step, err = mustParseInt(rangeAndStep[1])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special handling: "N/step" means "N-max/step".
|
|
||||||
if singleDigit {
|
|
||||||
end = r.max
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return 0, fmt.Errorf("Too many slashes: %s", expr)
|
|
||||||
}
|
|
||||||
|
|
||||||
if start < r.min {
|
|
||||||
return 0, fmt.Errorf("Beginning of range (%d) below minimum (%d): %s", start, r.min, expr)
|
|
||||||
}
|
|
||||||
if end > r.max {
|
|
||||||
return 0, fmt.Errorf("End of range (%d) above maximum (%d): %s", end, r.max, expr)
|
|
||||||
}
|
|
||||||
if start > end {
|
|
||||||
return 0, fmt.Errorf("Beginning of range (%d) beyond end of range (%d): %s", start, end, expr)
|
|
||||||
}
|
|
||||||
if step == 0 {
|
|
||||||
return 0, fmt.Errorf("Step of range should be a positive number: %s", expr)
|
|
||||||
}
|
|
||||||
|
|
||||||
return getBits(start, end, step) | extra, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// parseIntOrName returns the (possibly-named) integer contained in expr.
|
|
||||||
func parseIntOrName(expr string, names map[string]uint) (uint, error) {
|
|
||||||
if names != nil {
|
|
||||||
if namedInt, ok := names[strings.ToLower(expr)]; ok {
|
|
||||||
return namedInt, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mustParseInt(expr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// mustParseInt parses the given expression as an int or returns an error.
|
|
||||||
func mustParseInt(expr string) (uint, error) {
|
|
||||||
num, err := strconv.Atoi(expr)
|
|
||||||
if err != nil {
|
|
||||||
return 0, fmt.Errorf("Failed to parse int from %s: %s", expr, err)
|
|
||||||
}
|
|
||||||
if num < 0 {
|
|
||||||
return 0, fmt.Errorf("Negative number (%d) not allowed: %s", num, expr)
|
|
||||||
}
|
|
||||||
|
|
||||||
return uint(num), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// getBits sets all bits in the range [min, max], modulo the given step size.
|
|
||||||
func getBits(min, max, step uint) uint64 {
|
|
||||||
var bits uint64
|
|
||||||
|
|
||||||
// If step is 1, use shifts.
|
|
||||||
if step == 1 {
|
|
||||||
return ^(math.MaxUint64 << (max + 1)) & (math.MaxUint64 << min)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Else, use a simple loop.
|
|
||||||
for i := min; i <= max; i += step {
|
|
||||||
bits |= 1 << i
|
|
||||||
}
|
|
||||||
return bits
|
|
||||||
}
|
|
||||||
|
|
||||||
// all returns all bits within the given bounds. (plus the star bit)
|
|
||||||
func all(r bounds) uint64 {
|
|
||||||
return getBits(r.min, r.max, 1) | starBit
|
|
||||||
}
|
|
||||||
|
|
||||||
// parseDescriptor returns a predefined schedule for the expression, or error if none matches.
|
|
||||||
func parseDescriptor(descriptor string) (Schedule, error) {
|
|
||||||
switch descriptor {
|
|
||||||
case "@yearly", "@annually":
|
|
||||||
return &SpecSchedule{
|
|
||||||
Second: 1 << seconds.min,
|
|
||||||
Minute: 1 << minutes.min,
|
|
||||||
Hour: 1 << hours.min,
|
|
||||||
Dom: 1 << dom.min,
|
|
||||||
Month: 1 << months.min,
|
|
||||||
Dow: all(dow),
|
|
||||||
}, nil
|
|
||||||
|
|
||||||
case "@monthly":
|
|
||||||
return &SpecSchedule{
|
|
||||||
Second: 1 << seconds.min,
|
|
||||||
Minute: 1 << minutes.min,
|
|
||||||
Hour: 1 << hours.min,
|
|
||||||
Dom: 1 << dom.min,
|
|
||||||
Month: all(months),
|
|
||||||
Dow: all(dow),
|
|
||||||
}, nil
|
|
||||||
|
|
||||||
case "@weekly":
|
|
||||||
return &SpecSchedule{
|
|
||||||
Second: 1 << seconds.min,
|
|
||||||
Minute: 1 << minutes.min,
|
|
||||||
Hour: 1 << hours.min,
|
|
||||||
Dom: all(dom),
|
|
||||||
Month: all(months),
|
|
||||||
Dow: 1 << dow.min,
|
|
||||||
}, nil
|
|
||||||
|
|
||||||
case "@daily", "@midnight":
|
|
||||||
return &SpecSchedule{
|
|
||||||
Second: 1 << seconds.min,
|
|
||||||
Minute: 1 << minutes.min,
|
|
||||||
Hour: 1 << hours.min,
|
|
||||||
Dom: all(dom),
|
|
||||||
Month: all(months),
|
|
||||||
Dow: all(dow),
|
|
||||||
}, nil
|
|
||||||
|
|
||||||
case "@hourly":
|
|
||||||
return &SpecSchedule{
|
|
||||||
Second: 1 << seconds.min,
|
|
||||||
Minute: 1 << minutes.min,
|
|
||||||
Hour: all(hours),
|
|
||||||
Dom: all(dom),
|
|
||||||
Month: all(months),
|
|
||||||
Dow: all(dow),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
const every = "@every "
|
|
||||||
if strings.HasPrefix(descriptor, every) {
|
|
||||||
duration, err := time.ParseDuration(descriptor[len(every):])
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("Failed to parse duration %s: %s", descriptor, err)
|
|
||||||
}
|
|
||||||
return Every(duration), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, fmt.Errorf("Unrecognized descriptor: %s", descriptor)
|
|
||||||
}
|
|
158
vendor/github.com/robfig/cron/spec.go
generated
vendored
158
vendor/github.com/robfig/cron/spec.go
generated
vendored
@ -1,158 +0,0 @@
|
|||||||
package cron
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
// SpecSchedule specifies a duty cycle (to the second granularity), based on a
|
|
||||||
// traditional crontab specification. It is computed initially and stored as bit sets.
|
|
||||||
type SpecSchedule struct {
|
|
||||||
Second, Minute, Hour, Dom, Month, Dow uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// bounds provides a range of acceptable values (plus a map of name to value).
|
|
||||||
type bounds struct {
|
|
||||||
min, max uint
|
|
||||||
names map[string]uint
|
|
||||||
}
|
|
||||||
|
|
||||||
// The bounds for each field.
|
|
||||||
var (
|
|
||||||
seconds = bounds{0, 59, nil}
|
|
||||||
minutes = bounds{0, 59, nil}
|
|
||||||
hours = bounds{0, 23, nil}
|
|
||||||
dom = bounds{1, 31, nil}
|
|
||||||
months = bounds{1, 12, map[string]uint{
|
|
||||||
"jan": 1,
|
|
||||||
"feb": 2,
|
|
||||||
"mar": 3,
|
|
||||||
"apr": 4,
|
|
||||||
"may": 5,
|
|
||||||
"jun": 6,
|
|
||||||
"jul": 7,
|
|
||||||
"aug": 8,
|
|
||||||
"sep": 9,
|
|
||||||
"oct": 10,
|
|
||||||
"nov": 11,
|
|
||||||
"dec": 12,
|
|
||||||
}}
|
|
||||||
dow = bounds{0, 6, map[string]uint{
|
|
||||||
"sun": 0,
|
|
||||||
"mon": 1,
|
|
||||||
"tue": 2,
|
|
||||||
"wed": 3,
|
|
||||||
"thu": 4,
|
|
||||||
"fri": 5,
|
|
||||||
"sat": 6,
|
|
||||||
}}
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Set the top bit if a star was included in the expression.
|
|
||||||
starBit = 1 << 63
|
|
||||||
)
|
|
||||||
|
|
||||||
// Next returns the next time this schedule is activated, greater than the given
|
|
||||||
// time. If no time can be found to satisfy the schedule, return the zero time.
|
|
||||||
func (s *SpecSchedule) Next(t time.Time) time.Time {
|
|
||||||
// General approach:
|
|
||||||
// For Month, Day, Hour, Minute, Second:
|
|
||||||
// Check if the time value matches. If yes, continue to the next field.
|
|
||||||
// If the field doesn't match the schedule, then increment the field until it matches.
|
|
||||||
// While incrementing the field, a wrap-around brings it back to the beginning
|
|
||||||
// of the field list (since it is necessary to re-verify previous field
|
|
||||||
// values)
|
|
||||||
|
|
||||||
// Start at the earliest possible time (the upcoming second).
|
|
||||||
t = t.Add(1*time.Second - time.Duration(t.Nanosecond())*time.Nanosecond)
|
|
||||||
|
|
||||||
// This flag indicates whether a field has been incremented.
|
|
||||||
added := false
|
|
||||||
|
|
||||||
// If no time is found within five years, return zero.
|
|
||||||
yearLimit := t.Year() + 5
|
|
||||||
|
|
||||||
WRAP:
|
|
||||||
if t.Year() > yearLimit {
|
|
||||||
return time.Time{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the first applicable month.
|
|
||||||
// If it's this month, then do nothing.
|
|
||||||
for 1<<uint(t.Month())&s.Month == 0 {
|
|
||||||
// If we have to add a month, reset the other parts to 0.
|
|
||||||
if !added {
|
|
||||||
added = true
|
|
||||||
// Otherwise, set the date at the beginning (since the current time is irrelevant).
|
|
||||||
t = time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, t.Location())
|
|
||||||
}
|
|
||||||
t = t.AddDate(0, 1, 0)
|
|
||||||
|
|
||||||
// Wrapped around.
|
|
||||||
if t.Month() == time.January {
|
|
||||||
goto WRAP
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now get a day in that month.
|
|
||||||
for !dayMatches(s, t) {
|
|
||||||
if !added {
|
|
||||||
added = true
|
|
||||||
t = time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
|
|
||||||
}
|
|
||||||
t = t.AddDate(0, 0, 1)
|
|
||||||
|
|
||||||
if t.Day() == 1 {
|
|
||||||
goto WRAP
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for 1<<uint(t.Hour())&s.Hour == 0 {
|
|
||||||
if !added {
|
|
||||||
added = true
|
|
||||||
t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), 0, 0, 0, t.Location())
|
|
||||||
}
|
|
||||||
t = t.Add(1 * time.Hour)
|
|
||||||
|
|
||||||
if t.Hour() == 0 {
|
|
||||||
goto WRAP
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for 1<<uint(t.Minute())&s.Minute == 0 {
|
|
||||||
if !added {
|
|
||||||
added = true
|
|
||||||
t = t.Truncate(time.Minute)
|
|
||||||
}
|
|
||||||
t = t.Add(1 * time.Minute)
|
|
||||||
|
|
||||||
if t.Minute() == 0 {
|
|
||||||
goto WRAP
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for 1<<uint(t.Second())&s.Second == 0 {
|
|
||||||
if !added {
|
|
||||||
added = true
|
|
||||||
t = t.Truncate(time.Second)
|
|
||||||
}
|
|
||||||
t = t.Add(1 * time.Second)
|
|
||||||
|
|
||||||
if t.Second() == 0 {
|
|
||||||
goto WRAP
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
|
|
||||||
// dayMatches returns true if the schedule's day-of-week and day-of-month
|
|
||||||
// restrictions are satisfied by the given time.
|
|
||||||
func dayMatches(s *SpecSchedule, t time.Time) bool {
|
|
||||||
var (
|
|
||||||
domMatch bool = 1<<uint(t.Day())&s.Dom > 0
|
|
||||||
dowMatch bool = 1<<uint(t.Weekday())&s.Dow > 0
|
|
||||||
)
|
|
||||||
if s.Dom&starBit > 0 || s.Dow&starBit > 0 {
|
|
||||||
return domMatch && dowMatch
|
|
||||||
}
|
|
||||||
return domMatch || dowMatch
|
|
||||||
}
|
|
421
vendor/golang.org/x/crypto/acme/acme.go
generated
vendored
421
vendor/golang.org/x/crypto/acme/acme.go
generated
vendored
@ -3,17 +3,20 @@
|
|||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package acme provides an implementation of the
|
// Package acme provides an implementation of the
|
||||||
// Automatic Certificate Management Environment (ACME) spec.
|
// Automatic Certificate Management Environment (ACME) spec,
|
||||||
// The initial implementation was based on ACME draft-02 and
|
// most famously used by Let's Encrypt.
|
||||||
// is now being extended to comply with RFC 8555.
|
//
|
||||||
// See https://tools.ietf.org/html/draft-ietf-acme-acme-02
|
// The initial implementation of this package was based on an early version
|
||||||
// and https://tools.ietf.org/html/rfc8555 for details.
|
// of the spec. The current implementation supports only the modern
|
||||||
|
// RFC 8555 but some of the old API surface remains for compatibility.
|
||||||
|
// While code using the old API will still compile, it will return an error.
|
||||||
|
// Note the deprecation comments to update your code.
|
||||||
|
//
|
||||||
|
// See https://tools.ietf.org/html/rfc8555 for the spec.
|
||||||
//
|
//
|
||||||
// Most common scenarios will want to use autocert subdirectory instead,
|
// Most common scenarios will want to use autocert subdirectory instead,
|
||||||
// which provides automatic access to certificates from Let's Encrypt
|
// which provides automatic access to certificates from Let's Encrypt
|
||||||
// and any other ACME-based CA.
|
// and any other ACME-based CA.
|
||||||
//
|
|
||||||
// This package is a work in progress and makes no API stability promises.
|
|
||||||
package acme
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -33,8 +36,6 @@ import (
|
|||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"math/big"
|
"math/big"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
@ -72,6 +73,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Client is an ACME client.
|
// Client is an ACME client.
|
||||||
|
//
|
||||||
// The only required field is Key. An example of creating a client with a new key
|
// The only required field is Key. An example of creating a client with a new key
|
||||||
// is as follows:
|
// is as follows:
|
||||||
//
|
//
|
||||||
@ -125,7 +127,9 @@ type Client struct {
|
|||||||
|
|
||||||
cacheMu sync.Mutex
|
cacheMu sync.Mutex
|
||||||
dir *Directory // cached result of Client's Discover method
|
dir *Directory // cached result of Client's Discover method
|
||||||
kid keyID // cached Account.URI obtained from registerRFC or getAccountRFC
|
// KID is the key identifier provided by the CA. If not provided it will be
|
||||||
|
// retrieved from the CA by making a call to the registration endpoint.
|
||||||
|
KID KeyID
|
||||||
|
|
||||||
noncesMu sync.Mutex
|
noncesMu sync.Mutex
|
||||||
nonces map[string]struct{} // nonces collected from previous responses
|
nonces map[string]struct{} // nonces collected from previous responses
|
||||||
@ -140,23 +144,22 @@ type Client struct {
|
|||||||
//
|
//
|
||||||
// When in pre-RFC mode or when c.getRegRFC responds with an error, accountKID
|
// When in pre-RFC mode or when c.getRegRFC responds with an error, accountKID
|
||||||
// returns noKeyID.
|
// returns noKeyID.
|
||||||
func (c *Client) accountKID(ctx context.Context) keyID {
|
func (c *Client) accountKID(ctx context.Context) KeyID {
|
||||||
c.cacheMu.Lock()
|
c.cacheMu.Lock()
|
||||||
defer c.cacheMu.Unlock()
|
defer c.cacheMu.Unlock()
|
||||||
if !c.dir.rfcCompliant() {
|
if c.KID != noKeyID {
|
||||||
return noKeyID
|
return c.KID
|
||||||
}
|
|
||||||
if c.kid != noKeyID {
|
|
||||||
return c.kid
|
|
||||||
}
|
}
|
||||||
a, err := c.getRegRFC(ctx)
|
a, err := c.getRegRFC(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return noKeyID
|
return noKeyID
|
||||||
}
|
}
|
||||||
c.kid = keyID(a.URI)
|
c.KID = KeyID(a.URI)
|
||||||
return c.kid
|
return c.KID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var errPreRFC = errors.New("acme: server does not support the RFC 8555 version of ACME")
|
||||||
|
|
||||||
// Discover performs ACME server discovery using c.DirectoryURL.
|
// Discover performs ACME server discovery using c.DirectoryURL.
|
||||||
//
|
//
|
||||||
// It caches successful result. So, subsequent calls will not result in
|
// It caches successful result. So, subsequent calls will not result in
|
||||||
@ -177,53 +180,36 @@ func (c *Client) Discover(ctx context.Context) (Directory, error) {
|
|||||||
c.addNonce(res.Header)
|
c.addNonce(res.Header)
|
||||||
|
|
||||||
var v struct {
|
var v struct {
|
||||||
Reg string `json:"new-reg"`
|
Reg string `json:"newAccount"`
|
||||||
RegRFC string `json:"newAccount"`
|
Authz string `json:"newAuthz"`
|
||||||
Authz string `json:"new-authz"`
|
Order string `json:"newOrder"`
|
||||||
AuthzRFC string `json:"newAuthz"`
|
Revoke string `json:"revokeCert"`
|
||||||
OrderRFC string `json:"newOrder"`
|
Nonce string `json:"newNonce"`
|
||||||
Cert string `json:"new-cert"`
|
KeyChange string `json:"keyChange"`
|
||||||
Revoke string `json:"revoke-cert"`
|
|
||||||
RevokeRFC string `json:"revokeCert"`
|
|
||||||
NonceRFC string `json:"newNonce"`
|
|
||||||
KeyChangeRFC string `json:"keyChange"`
|
|
||||||
Meta struct {
|
Meta struct {
|
||||||
Terms string `json:"terms-of-service"`
|
Terms string `json:"termsOfService"`
|
||||||
TermsRFC string `json:"termsOfService"`
|
Website string `json:"website"`
|
||||||
WebsiteRFC string `json:"website"`
|
CAA []string `json:"caaIdentities"`
|
||||||
CAA []string `json:"caa-identities"`
|
ExternalAcct bool `json:"externalAccountRequired"`
|
||||||
CAARFC []string `json:"caaIdentities"`
|
|
||||||
ExternalAcctRFC bool `json:"externalAccountRequired"`
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
|
if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
|
||||||
return Directory{}, err
|
return Directory{}, err
|
||||||
}
|
}
|
||||||
if v.OrderRFC == "" {
|
if v.Order == "" {
|
||||||
// Non-RFC compliant ACME CA.
|
return Directory{}, errPreRFC
|
||||||
|
}
|
||||||
c.dir = &Directory{
|
c.dir = &Directory{
|
||||||
RegURL: v.Reg,
|
RegURL: v.Reg,
|
||||||
AuthzURL: v.Authz,
|
AuthzURL: v.Authz,
|
||||||
CertURL: v.Cert,
|
OrderURL: v.Order,
|
||||||
RevokeURL: v.Revoke,
|
RevokeURL: v.Revoke,
|
||||||
|
NonceURL: v.Nonce,
|
||||||
|
KeyChangeURL: v.KeyChange,
|
||||||
Terms: v.Meta.Terms,
|
Terms: v.Meta.Terms,
|
||||||
Website: v.Meta.WebsiteRFC,
|
Website: v.Meta.Website,
|
||||||
CAA: v.Meta.CAA,
|
CAA: v.Meta.CAA,
|
||||||
}
|
ExternalAccountRequired: v.Meta.ExternalAcct,
|
||||||
return *c.dir, nil
|
|
||||||
}
|
|
||||||
// RFC compliant ACME CA.
|
|
||||||
c.dir = &Directory{
|
|
||||||
RegURL: v.RegRFC,
|
|
||||||
AuthzURL: v.AuthzRFC,
|
|
||||||
OrderURL: v.OrderRFC,
|
|
||||||
RevokeURL: v.RevokeRFC,
|
|
||||||
NonceURL: v.NonceRFC,
|
|
||||||
KeyChangeURL: v.KeyChangeRFC,
|
|
||||||
Terms: v.Meta.TermsRFC,
|
|
||||||
Website: v.Meta.WebsiteRFC,
|
|
||||||
CAA: v.Meta.CAARFC,
|
|
||||||
ExternalAccountRequired: v.Meta.ExternalAcctRFC,
|
|
||||||
}
|
}
|
||||||
return *c.dir, nil
|
return *c.dir, nil
|
||||||
}
|
}
|
||||||
@ -235,55 +221,11 @@ func (c *Client) directoryURL() string {
|
|||||||
return LetsEncryptURL
|
return LetsEncryptURL
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateCert requests a new certificate using the Certificate Signing Request csr encoded in DER format.
|
// CreateCert was part of the old version of ACME. It is incompatible with RFC 8555.
|
||||||
// It is incompatible with RFC 8555. Callers should use CreateOrderCert when interfacing
|
|
||||||
// with an RFC-compliant CA.
|
|
||||||
//
|
//
|
||||||
// The exp argument indicates the desired certificate validity duration. CA may issue a certificate
|
// Deprecated: this was for the pre-RFC 8555 version of ACME. Callers should use CreateOrderCert.
|
||||||
// with a different duration.
|
|
||||||
// If the bundle argument is true, the returned value will also contain the CA (issuer) certificate chain.
|
|
||||||
//
|
|
||||||
// In the case where CA server does not provide the issued certificate in the response,
|
|
||||||
// CreateCert will poll certURL using c.FetchCert, which will result in additional round-trips.
|
|
||||||
// In such a scenario, the caller can cancel the polling with ctx.
|
|
||||||
//
|
|
||||||
// CreateCert returns an error if the CA's response or chain was unreasonably large.
|
|
||||||
// Callers are encouraged to parse the returned value to ensure the certificate is valid and has the expected features.
|
|
||||||
func (c *Client) CreateCert(ctx context.Context, csr []byte, exp time.Duration, bundle bool) (der [][]byte, certURL string, err error) {
|
func (c *Client) CreateCert(ctx context.Context, csr []byte, exp time.Duration, bundle bool) (der [][]byte, certURL string, err error) {
|
||||||
if _, err := c.Discover(ctx); err != nil {
|
return nil, "", errPreRFC
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
req := struct {
|
|
||||||
Resource string `json:"resource"`
|
|
||||||
CSR string `json:"csr"`
|
|
||||||
NotBefore string `json:"notBefore,omitempty"`
|
|
||||||
NotAfter string `json:"notAfter,omitempty"`
|
|
||||||
}{
|
|
||||||
Resource: "new-cert",
|
|
||||||
CSR: base64.RawURLEncoding.EncodeToString(csr),
|
|
||||||
}
|
|
||||||
now := timeNow()
|
|
||||||
req.NotBefore = now.Format(time.RFC3339)
|
|
||||||
if exp > 0 {
|
|
||||||
req.NotAfter = now.Add(exp).Format(time.RFC3339)
|
|
||||||
}
|
|
||||||
|
|
||||||
res, err := c.post(ctx, nil, c.dir.CertURL, req, wantStatus(http.StatusCreated))
|
|
||||||
if err != nil {
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
curl := res.Header.Get("Location") // cert permanent URL
|
|
||||||
if res.ContentLength == 0 {
|
|
||||||
// no cert in the body; poll until we get it
|
|
||||||
cert, err := c.FetchCert(ctx, curl, bundle)
|
|
||||||
return cert, curl, err
|
|
||||||
}
|
|
||||||
// slurp issued cert and CA chain, if requested
|
|
||||||
cert, err := c.responseCert(ctx, res, bundle)
|
|
||||||
return cert, curl, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FetchCert retrieves already issued certificate from the given url, in DER format.
|
// FetchCert retrieves already issued certificate from the given url, in DER format.
|
||||||
@ -297,22 +239,12 @@ func (c *Client) CreateCert(ctx context.Context, csr []byte, exp time.Duration,
|
|||||||
// Callers are encouraged to parse the returned value to ensure the certificate is valid
|
// Callers are encouraged to parse the returned value to ensure the certificate is valid
|
||||||
// and has expected features.
|
// and has expected features.
|
||||||
func (c *Client) FetchCert(ctx context.Context, url string, bundle bool) ([][]byte, error) {
|
func (c *Client) FetchCert(ctx context.Context, url string, bundle bool) ([][]byte, error) {
|
||||||
dir, err := c.Discover(ctx)
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if dir.rfcCompliant() {
|
|
||||||
return c.fetchCertRFC(ctx, url, bundle)
|
return c.fetchCertRFC(ctx, url, bundle)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Legacy non-authenticated GET request.
|
|
||||||
res, err := c.get(ctx, url, wantStatus(http.StatusOK))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return c.responseCert(ctx, res, bundle)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RevokeCert revokes a previously issued certificate cert, provided in DER format.
|
// RevokeCert revokes a previously issued certificate cert, provided in DER format.
|
||||||
//
|
//
|
||||||
// The key argument, used to sign the request, must be authorized
|
// The key argument, used to sign the request, must be authorized
|
||||||
@ -320,32 +252,12 @@ func (c *Client) FetchCert(ctx context.Context, url string, bundle bool) ([][]by
|
|||||||
// For instance, the key pair of the certificate may be authorized.
|
// For instance, the key pair of the certificate may be authorized.
|
||||||
// If the key is nil, c.Key is used instead.
|
// If the key is nil, c.Key is used instead.
|
||||||
func (c *Client) RevokeCert(ctx context.Context, key crypto.Signer, cert []byte, reason CRLReasonCode) error {
|
func (c *Client) RevokeCert(ctx context.Context, key crypto.Signer, cert []byte, reason CRLReasonCode) error {
|
||||||
dir, err := c.Discover(ctx)
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if dir.rfcCompliant() {
|
|
||||||
return c.revokeCertRFC(ctx, key, cert, reason)
|
return c.revokeCertRFC(ctx, key, cert, reason)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Legacy CA.
|
|
||||||
body := &struct {
|
|
||||||
Resource string `json:"resource"`
|
|
||||||
Cert string `json:"certificate"`
|
|
||||||
Reason int `json:"reason"`
|
|
||||||
}{
|
|
||||||
Resource: "revoke-cert",
|
|
||||||
Cert: base64.RawURLEncoding.EncodeToString(cert),
|
|
||||||
Reason: int(reason),
|
|
||||||
}
|
|
||||||
res, err := c.post(ctx, key, dir.RevokeURL, body, wantStatus(http.StatusOK))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// AcceptTOS always returns true to indicate the acceptance of a CA's Terms of Service
|
// AcceptTOS always returns true to indicate the acceptance of a CA's Terms of Service
|
||||||
// during account registration. See Register method of Client for more details.
|
// during account registration. See Register method of Client for more details.
|
||||||
func AcceptTOS(tosURL string) bool { return true }
|
func AcceptTOS(tosURL string) bool { return true }
|
||||||
@ -366,77 +278,35 @@ func (c *Client) Register(ctx context.Context, acct *Account, prompt func(tosURL
|
|||||||
if c.Key == nil {
|
if c.Key == nil {
|
||||||
return nil, errors.New("acme: client.Key must be set to Register")
|
return nil, errors.New("acme: client.Key must be set to Register")
|
||||||
}
|
}
|
||||||
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
dir, err := c.Discover(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if dir.rfcCompliant() {
|
|
||||||
return c.registerRFC(ctx, acct, prompt)
|
return c.registerRFC(ctx, acct, prompt)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Legacy ACME draft registration flow.
|
|
||||||
a, err := c.doReg(ctx, dir.RegURL, "new-reg", acct)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var accept bool
|
|
||||||
if a.CurrentTerms != "" && a.CurrentTerms != a.AgreedTerms {
|
|
||||||
accept = prompt(a.CurrentTerms)
|
|
||||||
}
|
|
||||||
if accept {
|
|
||||||
a.AgreedTerms = a.CurrentTerms
|
|
||||||
a, err = c.UpdateReg(ctx, a)
|
|
||||||
}
|
|
||||||
return a, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetReg retrieves an existing account associated with c.Key.
|
// GetReg retrieves an existing account associated with c.Key.
|
||||||
//
|
//
|
||||||
// The url argument is an Account URI used with pre-RFC 8555 CAs.
|
// The url argument is a legacy artifact of the pre-RFC 8555 API
|
||||||
// It is ignored when interfacing with an RFC-compliant CA.
|
// and is ignored.
|
||||||
func (c *Client) GetReg(ctx context.Context, url string) (*Account, error) {
|
func (c *Client) GetReg(ctx context.Context, url string) (*Account, error) {
|
||||||
dir, err := c.Discover(ctx)
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if dir.rfcCompliant() {
|
|
||||||
return c.getRegRFC(ctx)
|
return c.getRegRFC(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Legacy CA.
|
|
||||||
a, err := c.doReg(ctx, url, "reg", nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
a.URI = url
|
|
||||||
return a, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateReg updates an existing registration.
|
// UpdateReg updates an existing registration.
|
||||||
// It returns an updated account copy. The provided account is not modified.
|
// It returns an updated account copy. The provided account is not modified.
|
||||||
//
|
//
|
||||||
// When interfacing with RFC-compliant CAs, a.URI is ignored and the account URL
|
// The account's URI is ignored and the account URL associated with
|
||||||
// associated with c.Key is used instead.
|
// c.Key is used instead.
|
||||||
func (c *Client) UpdateReg(ctx context.Context, acct *Account) (*Account, error) {
|
func (c *Client) UpdateReg(ctx context.Context, acct *Account) (*Account, error) {
|
||||||
dir, err := c.Discover(ctx)
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if dir.rfcCompliant() {
|
|
||||||
return c.updateRegRFC(ctx, acct)
|
return c.updateRegRFC(ctx, acct)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Legacy CA.
|
|
||||||
uri := acct.URI
|
|
||||||
a, err := c.doReg(ctx, uri, "reg", acct)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
a.URI = uri
|
|
||||||
return a, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Authorize performs the initial step in the pre-authorization flow,
|
// Authorize performs the initial step in the pre-authorization flow,
|
||||||
// as opposed to order-based flow.
|
// as opposed to order-based flow.
|
||||||
// The caller will then need to choose from and perform a set of returned
|
// The caller will then need to choose from and perform a set of returned
|
||||||
@ -503,17 +373,11 @@ func (c *Client) authorize(ctx context.Context, typ, val string) (*Authorization
|
|||||||
// If a caller needs to poll an authorization until its status is final,
|
// If a caller needs to poll an authorization until its status is final,
|
||||||
// see the WaitAuthorization method.
|
// see the WaitAuthorization method.
|
||||||
func (c *Client) GetAuthorization(ctx context.Context, url string) (*Authorization, error) {
|
func (c *Client) GetAuthorization(ctx context.Context, url string) (*Authorization, error) {
|
||||||
dir, err := c.Discover(ctx)
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var res *http.Response
|
res, err := c.postAsGet(ctx, url, wantStatus(http.StatusOK))
|
||||||
if dir.rfcCompliant() {
|
|
||||||
res, err = c.postAsGet(ctx, url, wantStatus(http.StatusOK))
|
|
||||||
} else {
|
|
||||||
res, err = c.get(ctx, url, wantStatus(http.StatusOK, http.StatusAccepted))
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -535,7 +399,6 @@ func (c *Client) GetAuthorization(ctx context.Context, url string) (*Authorizati
|
|||||||
//
|
//
|
||||||
// It does not revoke existing certificates.
|
// It does not revoke existing certificates.
|
||||||
func (c *Client) RevokeAuthorization(ctx context.Context, url string) error {
|
func (c *Client) RevokeAuthorization(ctx context.Context, url string) error {
|
||||||
// Required for c.accountKID() when in RFC mode.
|
|
||||||
if _, err := c.Discover(ctx); err != nil {
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -565,18 +428,11 @@ func (c *Client) RevokeAuthorization(ctx context.Context, url string) error {
|
|||||||
// In all other cases WaitAuthorization returns an error.
|
// In all other cases WaitAuthorization returns an error.
|
||||||
// If the Status is StatusInvalid, the returned error is of type *AuthorizationError.
|
// If the Status is StatusInvalid, the returned error is of type *AuthorizationError.
|
||||||
func (c *Client) WaitAuthorization(ctx context.Context, url string) (*Authorization, error) {
|
func (c *Client) WaitAuthorization(ctx context.Context, url string) (*Authorization, error) {
|
||||||
// Required for c.accountKID() when in RFC mode.
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
dir, err := c.Discover(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
getfn := c.postAsGet
|
|
||||||
if !dir.rfcCompliant() {
|
|
||||||
getfn = c.get
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
for {
|
||||||
res, err := getfn(ctx, url, wantStatus(http.StatusOK, http.StatusAccepted))
|
res, err := c.postAsGet(ctx, url, wantStatus(http.StatusOK, http.StatusAccepted))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -619,17 +475,11 @@ func (c *Client) WaitAuthorization(ctx context.Context, url string) (*Authorizat
|
|||||||
//
|
//
|
||||||
// A client typically polls a challenge status using this method.
|
// A client typically polls a challenge status using this method.
|
||||||
func (c *Client) GetChallenge(ctx context.Context, url string) (*Challenge, error) {
|
func (c *Client) GetChallenge(ctx context.Context, url string) (*Challenge, error) {
|
||||||
// Required for c.accountKID() when in RFC mode.
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
dir, err := c.Discover(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
getfn := c.postAsGet
|
res, err := c.postAsGet(ctx, url, wantStatus(http.StatusOK, http.StatusAccepted))
|
||||||
if !dir.rfcCompliant() {
|
|
||||||
getfn = c.get
|
|
||||||
}
|
|
||||||
res, err := getfn(ctx, url, wantStatus(http.StatusOK, http.StatusAccepted))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -647,29 +497,11 @@ func (c *Client) GetChallenge(ctx context.Context, url string) (*Challenge, erro
|
|||||||
//
|
//
|
||||||
// The server will then perform the validation asynchronously.
|
// The server will then perform the validation asynchronously.
|
||||||
func (c *Client) Accept(ctx context.Context, chal *Challenge) (*Challenge, error) {
|
func (c *Client) Accept(ctx context.Context, chal *Challenge) (*Challenge, error) {
|
||||||
// Required for c.accountKID() when in RFC mode.
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
dir, err := c.Discover(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var req interface{} = json.RawMessage("{}") // RFC-compliant CA
|
res, err := c.post(ctx, nil, chal.URI, json.RawMessage("{}"), wantStatus(
|
||||||
if !dir.rfcCompliant() {
|
|
||||||
auth, err := keyAuth(c.Key.Public(), chal.Token)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
req = struct {
|
|
||||||
Resource string `json:"resource"`
|
|
||||||
Type string `json:"type"`
|
|
||||||
Auth string `json:"keyAuthorization"`
|
|
||||||
}{
|
|
||||||
Resource: "challenge",
|
|
||||||
Type: chal.Type,
|
|
||||||
Auth: auth,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
res, err := c.post(ctx, nil, chal.URI, req, wantStatus(
|
|
||||||
http.StatusOK, // according to the spec
|
http.StatusOK, // according to the spec
|
||||||
http.StatusAccepted, // Let's Encrypt: see https://goo.gl/WsJ7VT (acme-divergences.md)
|
http.StatusAccepted, // Let's Encrypt: see https://goo.gl/WsJ7VT (acme-divergences.md)
|
||||||
))
|
))
|
||||||
@ -720,7 +552,7 @@ func (c *Client) HTTP01ChallengePath(token string) string {
|
|||||||
|
|
||||||
// TLSSNI01ChallengeCert creates a certificate for TLS-SNI-01 challenge response.
|
// TLSSNI01ChallengeCert creates a certificate for TLS-SNI-01 challenge response.
|
||||||
//
|
//
|
||||||
// Deprecated: This challenge type is unused in both draft-02 and RFC versions of ACME spec.
|
// Deprecated: This challenge type is unused in both draft-02 and RFC versions of the ACME spec.
|
||||||
func (c *Client) TLSSNI01ChallengeCert(token string, opt ...CertOption) (cert tls.Certificate, name string, err error) {
|
func (c *Client) TLSSNI01ChallengeCert(token string, opt ...CertOption) (cert tls.Certificate, name string, err error) {
|
||||||
ka, err := keyAuth(c.Key.Public(), token)
|
ka, err := keyAuth(c.Key.Public(), token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -738,7 +570,7 @@ func (c *Client) TLSSNI01ChallengeCert(token string, opt ...CertOption) (cert tl
|
|||||||
|
|
||||||
// TLSSNI02ChallengeCert creates a certificate for TLS-SNI-02 challenge response.
|
// TLSSNI02ChallengeCert creates a certificate for TLS-SNI-02 challenge response.
|
||||||
//
|
//
|
||||||
// Deprecated: This challenge type is unused in both draft-02 and RFC versions of ACME spec.
|
// Deprecated: This challenge type is unused in both draft-02 and RFC versions of the ACME spec.
|
||||||
func (c *Client) TLSSNI02ChallengeCert(token string, opt ...CertOption) (cert tls.Certificate, name string, err error) {
|
func (c *Client) TLSSNI02ChallengeCert(token string, opt ...CertOption) (cert tls.Certificate, name string, err error) {
|
||||||
b := sha256.Sum256([]byte(token))
|
b := sha256.Sum256([]byte(token))
|
||||||
h := hex.EncodeToString(b[:])
|
h := hex.EncodeToString(b[:])
|
||||||
@ -805,63 +637,6 @@ func (c *Client) TLSALPN01ChallengeCert(token, domain string, opt ...CertOption)
|
|||||||
return tlsChallengeCert([]string{domain}, newOpt)
|
return tlsChallengeCert([]string{domain}, newOpt)
|
||||||
}
|
}
|
||||||
|
|
||||||
// doReg sends all types of registration requests the old way (pre-RFC world).
|
|
||||||
// The type of request is identified by typ argument, which is a "resource"
|
|
||||||
// in the ACME spec terms.
|
|
||||||
//
|
|
||||||
// A non-nil acct argument indicates whether the intention is to mutate data
|
|
||||||
// of the Account. Only Contact and Agreement of its fields are used
|
|
||||||
// in such cases.
|
|
||||||
func (c *Client) doReg(ctx context.Context, url string, typ string, acct *Account) (*Account, error) {
|
|
||||||
req := struct {
|
|
||||||
Resource string `json:"resource"`
|
|
||||||
Contact []string `json:"contact,omitempty"`
|
|
||||||
Agreement string `json:"agreement,omitempty"`
|
|
||||||
}{
|
|
||||||
Resource: typ,
|
|
||||||
}
|
|
||||||
if acct != nil {
|
|
||||||
req.Contact = acct.Contact
|
|
||||||
req.Agreement = acct.AgreedTerms
|
|
||||||
}
|
|
||||||
res, err := c.post(ctx, nil, url, req, wantStatus(
|
|
||||||
http.StatusOK, // updates and deletes
|
|
||||||
http.StatusCreated, // new account creation
|
|
||||||
http.StatusAccepted, // Let's Encrypt divergent implementation
|
|
||||||
))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
var v struct {
|
|
||||||
Contact []string
|
|
||||||
Agreement string
|
|
||||||
Authorizations string
|
|
||||||
Certificates string
|
|
||||||
}
|
|
||||||
if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
|
|
||||||
return nil, fmt.Errorf("acme: invalid response: %v", err)
|
|
||||||
}
|
|
||||||
var tos string
|
|
||||||
if v := linkHeader(res.Header, "terms-of-service"); len(v) > 0 {
|
|
||||||
tos = v[0]
|
|
||||||
}
|
|
||||||
var authz string
|
|
||||||
if v := linkHeader(res.Header, "next"); len(v) > 0 {
|
|
||||||
authz = v[0]
|
|
||||||
}
|
|
||||||
return &Account{
|
|
||||||
URI: res.Header.Get("Location"),
|
|
||||||
Contact: v.Contact,
|
|
||||||
AgreedTerms: v.Agreement,
|
|
||||||
CurrentTerms: tos,
|
|
||||||
Authz: authz,
|
|
||||||
Authorizations: v.Authorizations,
|
|
||||||
Certificates: v.Certificates,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// popNonce returns a nonce value previously stored with c.addNonce
|
// popNonce returns a nonce value previously stored with c.addNonce
|
||||||
// or fetches a fresh one from c.dir.NonceURL.
|
// or fetches a fresh one from c.dir.NonceURL.
|
||||||
// If NonceURL is empty, it first tries c.directoryURL() and, failing that,
|
// If NonceURL is empty, it first tries c.directoryURL() and, failing that,
|
||||||
@ -936,78 +711,6 @@ func nonceFromHeader(h http.Header) string {
|
|||||||
return h.Get("Replay-Nonce")
|
return h.Get("Replay-Nonce")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) responseCert(ctx context.Context, res *http.Response, bundle bool) ([][]byte, error) {
|
|
||||||
b, err := ioutil.ReadAll(io.LimitReader(res.Body, maxCertSize+1))
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("acme: response stream: %v", err)
|
|
||||||
}
|
|
||||||
if len(b) > maxCertSize {
|
|
||||||
return nil, errors.New("acme: certificate is too big")
|
|
||||||
}
|
|
||||||
cert := [][]byte{b}
|
|
||||||
if !bundle {
|
|
||||||
return cert, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append CA chain cert(s).
|
|
||||||
// At least one is required according to the spec:
|
|
||||||
// https://tools.ietf.org/html/draft-ietf-acme-acme-03#section-6.3.1
|
|
||||||
up := linkHeader(res.Header, "up")
|
|
||||||
if len(up) == 0 {
|
|
||||||
return nil, errors.New("acme: rel=up link not found")
|
|
||||||
}
|
|
||||||
if len(up) > maxChainLen {
|
|
||||||
return nil, errors.New("acme: rel=up link is too large")
|
|
||||||
}
|
|
||||||
for _, url := range up {
|
|
||||||
cc, err := c.chainCert(ctx, url, 0)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
cert = append(cert, cc...)
|
|
||||||
}
|
|
||||||
return cert, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// chainCert fetches CA certificate chain recursively by following "up" links.
|
|
||||||
// Each recursive call increments the depth by 1, resulting in an error
|
|
||||||
// if the recursion level reaches maxChainLen.
|
|
||||||
//
|
|
||||||
// First chainCert call starts with depth of 0.
|
|
||||||
func (c *Client) chainCert(ctx context.Context, url string, depth int) ([][]byte, error) {
|
|
||||||
if depth >= maxChainLen {
|
|
||||||
return nil, errors.New("acme: certificate chain is too deep")
|
|
||||||
}
|
|
||||||
|
|
||||||
res, err := c.get(ctx, url, wantStatus(http.StatusOK))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
b, err := ioutil.ReadAll(io.LimitReader(res.Body, maxCertSize+1))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(b) > maxCertSize {
|
|
||||||
return nil, errors.New("acme: certificate is too big")
|
|
||||||
}
|
|
||||||
chain := [][]byte{b}
|
|
||||||
|
|
||||||
uplink := linkHeader(res.Header, "up")
|
|
||||||
if len(uplink) > maxChainLen {
|
|
||||||
return nil, errors.New("acme: certificate chain is too large")
|
|
||||||
}
|
|
||||||
for _, up := range uplink {
|
|
||||||
cc, err := c.chainCert(ctx, up, depth+1)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
chain = append(chain, cc...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return chain, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// linkHeader returns URI-Reference values of all Link headers
|
// linkHeader returns URI-Reference values of all Link headers
|
||||||
// with relation-type rel.
|
// with relation-type rel.
|
||||||
// See https://tools.ietf.org/html/rfc5988#section-5 for details.
|
// See https://tools.ietf.org/html/rfc5988#section-5 for details.
|
||||||
@ -1098,5 +801,5 @@ func encodePEM(typ string, b []byte) []byte {
|
|||||||
return pem.EncodeToMemory(pb)
|
return pem.EncodeToMemory(pb)
|
||||||
}
|
}
|
||||||
|
|
||||||
// timeNow is useful for testing for fixed current time.
|
// timeNow is time.Now, except in tests which can mess with it.
|
||||||
var timeNow = time.Now
|
var timeNow = time.Now
|
||||||
|
114
vendor/golang.org/x/crypto/acme/autocert/autocert.go
generated
vendored
114
vendor/golang.org/x/crypto/acme/autocert/autocert.go
generated
vendored
@ -47,6 +47,8 @@ var createCertRetryAfter = time.Minute
|
|||||||
// pseudoRand is safe for concurrent use.
|
// pseudoRand is safe for concurrent use.
|
||||||
var pseudoRand *lockedMathRand
|
var pseudoRand *lockedMathRand
|
||||||
|
|
||||||
|
var errPreRFC = errors.New("autocert: ACME server doesn't support RFC 8555")
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
src := mathrand.NewSource(time.Now().UnixNano())
|
src := mathrand.NewSource(time.Now().UnixNano())
|
||||||
pseudoRand = &lockedMathRand{rnd: mathrand.New(src)}
|
pseudoRand = &lockedMathRand{rnd: mathrand.New(src)}
|
||||||
@ -456,7 +458,7 @@ func (m *Manager) cert(ctx context.Context, ck certKey) (*tls.Certificate, error
|
|||||||
leaf: cert.Leaf,
|
leaf: cert.Leaf,
|
||||||
}
|
}
|
||||||
m.state[ck] = s
|
m.state[ck] = s
|
||||||
go m.renew(ck, s.key, s.leaf.NotAfter)
|
go m.startRenew(ck, s.key, s.leaf.NotAfter)
|
||||||
return cert, nil
|
return cert, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -582,8 +584,9 @@ func (m *Manager) createCert(ctx context.Context, ck certKey) (*tls.Certificate,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
// Remove the failed state after some time,
|
// Remove the failed state after some time,
|
||||||
// making the manager call createCert again on the following TLS hello.
|
// making the manager call createCert again on the following TLS hello.
|
||||||
|
didRemove := testDidRemoveState // The lifetime of this timer is untracked, so copy mutable local state to avoid races.
|
||||||
time.AfterFunc(createCertRetryAfter, func() {
|
time.AfterFunc(createCertRetryAfter, func() {
|
||||||
defer testDidRemoveState(ck)
|
defer didRemove(ck)
|
||||||
m.stateMu.Lock()
|
m.stateMu.Lock()
|
||||||
defer m.stateMu.Unlock()
|
defer m.stateMu.Unlock()
|
||||||
// Verify the state hasn't changed and it's still invalid
|
// Verify the state hasn't changed and it's still invalid
|
||||||
@ -601,7 +604,7 @@ func (m *Manager) createCert(ctx context.Context, ck certKey) (*tls.Certificate,
|
|||||||
}
|
}
|
||||||
state.cert = der
|
state.cert = der
|
||||||
state.leaf = leaf
|
state.leaf = leaf
|
||||||
go m.renew(ck, state.key, state.leaf.NotAfter)
|
go m.startRenew(ck, state.key, state.leaf.NotAfter)
|
||||||
return state.tlscert()
|
return state.tlscert()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -658,31 +661,19 @@ func (m *Manager) authorizedCert(ctx context.Context, key crypto.Signer, ck cert
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
if dir.OrderURL == "" {
|
||||||
|
return nil, nil, errPreRFC
|
||||||
|
}
|
||||||
|
|
||||||
var chain [][]byte
|
|
||||||
switch {
|
|
||||||
// Pre-RFC legacy CA.
|
|
||||||
case dir.OrderURL == "":
|
|
||||||
if err := m.verify(ctx, client, ck.domain); err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
der, _, err := client.CreateCert(ctx, csr, 0, true)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
chain = der
|
|
||||||
// RFC 8555 compliant CA.
|
|
||||||
default:
|
|
||||||
o, err := m.verifyRFC(ctx, client, ck.domain)
|
o, err := m.verifyRFC(ctx, client, ck.domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
der, _, err := client.CreateOrderCert(ctx, o.FinalizeURL, csr, true)
|
chain, _, err := client.CreateOrderCert(ctx, o.FinalizeURL, csr, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
chain = der
|
|
||||||
}
|
|
||||||
leaf, err = validCert(ck, chain, key, m.now())
|
leaf, err = validCert(ck, chain, key, m.now())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
@ -690,69 +681,6 @@ func (m *Manager) authorizedCert(ctx context.Context, key crypto.Signer, ck cert
|
|||||||
return chain, leaf, nil
|
return chain, leaf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify runs the identifier (domain) pre-authorization flow for legacy CAs
|
|
||||||
// using each applicable ACME challenge type.
|
|
||||||
func (m *Manager) verify(ctx context.Context, client *acme.Client, domain string) error {
|
|
||||||
// Remove all hanging authorizations to reduce rate limit quotas
|
|
||||||
// after we're done.
|
|
||||||
var authzURLs []string
|
|
||||||
defer func() {
|
|
||||||
go m.deactivatePendingAuthz(authzURLs)
|
|
||||||
}()
|
|
||||||
|
|
||||||
// errs accumulates challenge failure errors, printed if all fail
|
|
||||||
errs := make(map[*acme.Challenge]error)
|
|
||||||
challengeTypes := m.supportedChallengeTypes()
|
|
||||||
var nextTyp int // challengeType index of the next challenge type to try
|
|
||||||
for {
|
|
||||||
// Start domain authorization and get the challenge.
|
|
||||||
authz, err := client.Authorize(ctx, domain)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
authzURLs = append(authzURLs, authz.URI)
|
|
||||||
// No point in accepting challenges if the authorization status
|
|
||||||
// is in a final state.
|
|
||||||
switch authz.Status {
|
|
||||||
case acme.StatusValid:
|
|
||||||
return nil // already authorized
|
|
||||||
case acme.StatusInvalid:
|
|
||||||
return fmt.Errorf("acme/autocert: invalid authorization %q", authz.URI)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pick the next preferred challenge.
|
|
||||||
var chal *acme.Challenge
|
|
||||||
for chal == nil && nextTyp < len(challengeTypes) {
|
|
||||||
chal = pickChallenge(challengeTypes[nextTyp], authz.Challenges)
|
|
||||||
nextTyp++
|
|
||||||
}
|
|
||||||
if chal == nil {
|
|
||||||
errorMsg := fmt.Sprintf("acme/autocert: unable to authorize %q", domain)
|
|
||||||
for chal, err := range errs {
|
|
||||||
errorMsg += fmt.Sprintf("; challenge %q failed with error: %v", chal.Type, err)
|
|
||||||
}
|
|
||||||
return errors.New(errorMsg)
|
|
||||||
}
|
|
||||||
cleanup, err := m.fulfill(ctx, client, chal, domain)
|
|
||||||
if err != nil {
|
|
||||||
errs[chal] = err
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
defer cleanup()
|
|
||||||
if _, err := client.Accept(ctx, chal); err != nil {
|
|
||||||
errs[chal] = err
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// A challenge is fulfilled and accepted: wait for the CA to validate.
|
|
||||||
if _, err := client.WaitAuthorization(ctx, authz.URI); err != nil {
|
|
||||||
errs[chal] = err
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// verifyRFC runs the identifier (domain) order-based authorization flow for RFC compliant CAs
|
// verifyRFC runs the identifier (domain) order-based authorization flow for RFC compliant CAs
|
||||||
// using each applicable ACME challenge type.
|
// using each applicable ACME challenge type.
|
||||||
func (m *Manager) verifyRFC(ctx context.Context, client *acme.Client, domain string) (*acme.Order, error) {
|
func (m *Manager) verifyRFC(ctx context.Context, client *acme.Client, domain string) (*acme.Order, error) {
|
||||||
@ -966,7 +894,7 @@ func httpTokenCacheKey(tokenPath string) string {
|
|||||||
return path.Base(tokenPath) + "+http-01"
|
return path.Base(tokenPath) + "+http-01"
|
||||||
}
|
}
|
||||||
|
|
||||||
// renew starts a cert renewal timer loop, one per domain.
|
// startRenew starts a cert renewal timer loop, one per domain.
|
||||||
//
|
//
|
||||||
// The loop is scheduled in two cases:
|
// The loop is scheduled in two cases:
|
||||||
// - a cert was fetched from cache for the first time (wasn't in m.state)
|
// - a cert was fetched from cache for the first time (wasn't in m.state)
|
||||||
@ -974,7 +902,7 @@ func httpTokenCacheKey(tokenPath string) string {
|
|||||||
//
|
//
|
||||||
// The key argument is a certificate private key.
|
// The key argument is a certificate private key.
|
||||||
// The exp argument is the cert expiration time (NotAfter).
|
// The exp argument is the cert expiration time (NotAfter).
|
||||||
func (m *Manager) renew(ck certKey, key crypto.Signer, exp time.Time) {
|
func (m *Manager) startRenew(ck certKey, key crypto.Signer, exp time.Time) {
|
||||||
m.renewalMu.Lock()
|
m.renewalMu.Lock()
|
||||||
defer m.renewalMu.Unlock()
|
defer m.renewalMu.Unlock()
|
||||||
if m.renewal[ck] != nil {
|
if m.renewal[ck] != nil {
|
||||||
@ -1200,6 +1128,10 @@ func validCert(ck certKey, der [][]byte, key crypto.Signer, now time.Time) (leaf
|
|||||||
if err := leaf.VerifyHostname(ck.domain); err != nil {
|
if err := leaf.VerifyHostname(ck.domain); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
// renew certificates revoked by Let's Encrypt in January 2022
|
||||||
|
if isRevokedLetsEncrypt(leaf) {
|
||||||
|
return nil, errors.New("acme/autocert: certificate was probably revoked by Let's Encrypt")
|
||||||
|
}
|
||||||
// ensure the leaf corresponds to the private key and matches the certKey type
|
// ensure the leaf corresponds to the private key and matches the certKey type
|
||||||
switch pub := leaf.PublicKey.(type) {
|
switch pub := leaf.PublicKey.(type) {
|
||||||
case *rsa.PublicKey:
|
case *rsa.PublicKey:
|
||||||
@ -1230,6 +1162,18 @@ func validCert(ck certKey, der [][]byte, key crypto.Signer, now time.Time) (leaf
|
|||||||
return leaf, nil
|
return leaf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://community.letsencrypt.org/t/2022-01-25-issue-with-tls-alpn-01-validation-method/170450
|
||||||
|
var letsEncryptFixDeployTime = time.Date(2022, time.January, 26, 00, 48, 0, 0, time.UTC)
|
||||||
|
|
||||||
|
// isRevokedLetsEncrypt returns whether the certificate is likely to be part of
|
||||||
|
// a batch of certificates revoked by Let's Encrypt in January 2022. This check
|
||||||
|
// can be safely removed from May 2022.
|
||||||
|
func isRevokedLetsEncrypt(cert *x509.Certificate) bool {
|
||||||
|
O := cert.Issuer.Organization
|
||||||
|
return len(O) == 1 && O[0] == "Let's Encrypt" &&
|
||||||
|
cert.NotBefore.Before(letsEncryptFixDeployTime)
|
||||||
|
}
|
||||||
|
|
||||||
type lockedMathRand struct {
|
type lockedMathRand struct {
|
||||||
sync.Mutex
|
sync.Mutex
|
||||||
rnd *mathrand.Rand
|
rnd *mathrand.Rand
|
||||||
|
25
vendor/golang.org/x/crypto/acme/autocert/renewal.go
generated
vendored
25
vendor/golang.org/x/crypto/acme/autocert/renewal.go
generated
vendored
@ -23,6 +23,7 @@ type domainRenewal struct {
|
|||||||
|
|
||||||
timerMu sync.Mutex
|
timerMu sync.Mutex
|
||||||
timer *time.Timer
|
timer *time.Timer
|
||||||
|
timerClose chan struct{} // if non-nil, renew closes this channel (and nils out the timer fields) instead of running
|
||||||
}
|
}
|
||||||
|
|
||||||
// start starts a cert renewal timer at the time
|
// start starts a cert renewal timer at the time
|
||||||
@ -38,16 +39,28 @@ func (dr *domainRenewal) start(exp time.Time) {
|
|||||||
dr.timer = time.AfterFunc(dr.next(exp), dr.renew)
|
dr.timer = time.AfterFunc(dr.next(exp), dr.renew)
|
||||||
}
|
}
|
||||||
|
|
||||||
// stop stops the cert renewal timer.
|
// stop stops the cert renewal timer and waits for any in-flight calls to renew
|
||||||
// If the timer is already stopped, calling stop is a noop.
|
// to complete. If the timer is already stopped, calling stop is a noop.
|
||||||
func (dr *domainRenewal) stop() {
|
func (dr *domainRenewal) stop() {
|
||||||
dr.timerMu.Lock()
|
dr.timerMu.Lock()
|
||||||
defer dr.timerMu.Unlock()
|
defer dr.timerMu.Unlock()
|
||||||
|
for {
|
||||||
if dr.timer == nil {
|
if dr.timer == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
dr.timer.Stop()
|
if dr.timer.Stop() {
|
||||||
dr.timer = nil
|
dr.timer = nil
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
// dr.timer fired, and we acquired dr.timerMu before the renew callback did.
|
||||||
|
// (We know this because otherwise the renew callback would have reset dr.timer!)
|
||||||
|
timerClose := make(chan struct{})
|
||||||
|
dr.timerClose = timerClose
|
||||||
|
dr.timerMu.Unlock()
|
||||||
|
<-timerClose
|
||||||
|
dr.timerMu.Lock()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// renew is called periodically by a timer.
|
// renew is called periodically by a timer.
|
||||||
@ -55,7 +68,9 @@ func (dr *domainRenewal) stop() {
|
|||||||
func (dr *domainRenewal) renew() {
|
func (dr *domainRenewal) renew() {
|
||||||
dr.timerMu.Lock()
|
dr.timerMu.Lock()
|
||||||
defer dr.timerMu.Unlock()
|
defer dr.timerMu.Unlock()
|
||||||
if dr.timer == nil {
|
if dr.timerClose != nil {
|
||||||
|
close(dr.timerClose)
|
||||||
|
dr.timer, dr.timerClose = nil, nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,8 +82,8 @@ func (dr *domainRenewal) renew() {
|
|||||||
next = renewJitter / 2
|
next = renewJitter / 2
|
||||||
next += time.Duration(pseudoRand.int63n(int64(next)))
|
next += time.Duration(pseudoRand.int63n(int64(next)))
|
||||||
}
|
}
|
||||||
dr.timer = time.AfterFunc(next, dr.renew)
|
|
||||||
testDidRenewLoop(next, err)
|
testDidRenewLoop(next, err)
|
||||||
|
dr.timer = time.AfterFunc(next, dr.renew)
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateState locks and replaces the relevant Manager.state item with the given
|
// updateState locks and replaces the relevant Manager.state item with the given
|
||||||
|
13
vendor/golang.org/x/crypto/acme/jws.go
generated
vendored
13
vendor/golang.org/x/crypto/acme/jws.go
generated
vendored
@ -20,12 +20,12 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
)
|
)
|
||||||
|
|
||||||
// keyID is the account identity provided by a CA during registration.
|
// KeyID is the account key identity provided by a CA during registration.
|
||||||
type keyID string
|
type KeyID string
|
||||||
|
|
||||||
// noKeyID indicates that jwsEncodeJSON should compute and use JWK instead of a KID.
|
// noKeyID indicates that jwsEncodeJSON should compute and use JWK instead of a KID.
|
||||||
// See jwsEncodeJSON for details.
|
// See jwsEncodeJSON for details.
|
||||||
const noKeyID = keyID("")
|
const noKeyID = KeyID("")
|
||||||
|
|
||||||
// noPayload indicates jwsEncodeJSON will encode zero-length octet string
|
// noPayload indicates jwsEncodeJSON will encode zero-length octet string
|
||||||
// in a JWS request. This is called POST-as-GET in RFC 8555 and is used to make
|
// in a JWS request. This is called POST-as-GET in RFC 8555 and is used to make
|
||||||
@ -43,14 +43,17 @@ type jsonWebSignature struct {
|
|||||||
|
|
||||||
// jwsEncodeJSON signs claimset using provided key and a nonce.
|
// jwsEncodeJSON signs claimset using provided key and a nonce.
|
||||||
// The result is serialized in JSON format containing either kid or jwk
|
// The result is serialized in JSON format containing either kid or jwk
|
||||||
// fields based on the provided keyID value.
|
// fields based on the provided KeyID value.
|
||||||
//
|
//
|
||||||
// If kid is non-empty, its quoted value is inserted in the protected head
|
// If kid is non-empty, its quoted value is inserted in the protected head
|
||||||
// as "kid" field value. Otherwise, JWK is computed using jwkEncode and inserted
|
// as "kid" field value. Otherwise, JWK is computed using jwkEncode and inserted
|
||||||
// as "jwk" field value. The "jwk" and "kid" fields are mutually exclusive.
|
// as "jwk" field value. The "jwk" and "kid" fields are mutually exclusive.
|
||||||
//
|
//
|
||||||
// See https://tools.ietf.org/html/rfc7515#section-7.
|
// See https://tools.ietf.org/html/rfc7515#section-7.
|
||||||
func jwsEncodeJSON(claimset interface{}, key crypto.Signer, kid keyID, nonce, url string) ([]byte, error) {
|
func jwsEncodeJSON(claimset interface{}, key crypto.Signer, kid KeyID, nonce, url string) ([]byte, error) {
|
||||||
|
if key == nil {
|
||||||
|
return nil, errors.New("nil key")
|
||||||
|
}
|
||||||
alg, sha := jwsHasher(key.Public())
|
alg, sha := jwsHasher(key.Public())
|
||||||
if alg == "" || !sha.Available() {
|
if alg == "" || !sha.Available() {
|
||||||
return nil, ErrUnsupportedKey
|
return nil, ErrUnsupportedKey
|
||||||
|
2
vendor/golang.org/x/crypto/acme/rfc8555.go
generated
vendored
2
vendor/golang.org/x/crypto/acme/rfc8555.go
generated
vendored
@ -78,7 +78,7 @@ func (c *Client) registerRFC(ctx context.Context, acct *Account, prompt func(tos
|
|||||||
}
|
}
|
||||||
// Cache Account URL even if we return an error to the caller.
|
// Cache Account URL even if we return an error to the caller.
|
||||||
// It is by all means a valid and usable "kid" value for future requests.
|
// It is by all means a valid and usable "kid" value for future requests.
|
||||||
c.kid = keyID(a.URI)
|
c.KID = KeyID(a.URI)
|
||||||
if res.StatusCode == http.StatusOK {
|
if res.StatusCode == http.StatusOK {
|
||||||
return nil, ErrAccountAlreadyExists
|
return nil, ErrAccountAlreadyExists
|
||||||
}
|
}
|
||||||
|
8
vendor/golang.org/x/crypto/acme/types.go
generated
vendored
8
vendor/golang.org/x/crypto/acme/types.go
generated
vendored
@ -305,14 +305,6 @@ type Directory struct {
|
|||||||
ExternalAccountRequired bool
|
ExternalAccountRequired bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// rfcCompliant reports whether the ACME server implements RFC 8555.
|
|
||||||
// Note that some servers may have incomplete RFC implementation
|
|
||||||
// even if the returned value is true.
|
|
||||||
// If rfcCompliant reports false, the server most likely implements draft-02.
|
|
||||||
func (d *Directory) rfcCompliant() bool {
|
|
||||||
return d.OrderURL != ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Order represents a client's request for a certificate.
|
// Order represents a client's request for a certificate.
|
||||||
// It tracks the request flow progress through to issuance.
|
// It tracks the request flow progress through to issuance.
|
||||||
type Order struct {
|
type Order struct {
|
||||||
|
2
vendor/golang.org/x/net/http2/server.go
generated
vendored
2
vendor/golang.org/x/net/http2/server.go
generated
vendored
@ -722,7 +722,7 @@ func (sc *serverConn) canonicalHeader(v string) string {
|
|||||||
// maxCachedCanonicalHeaders is an arbitrarily-chosen limit on the number of
|
// maxCachedCanonicalHeaders is an arbitrarily-chosen limit on the number of
|
||||||
// entries in the canonHeader cache. This should be larger than the number
|
// entries in the canonHeader cache. This should be larger than the number
|
||||||
// of unique, uncommon header keys likely to be sent by the peer, while not
|
// of unique, uncommon header keys likely to be sent by the peer, while not
|
||||||
// so high as to permit unreaasonable memory usage if the peer sends an unbounded
|
// so high as to permit unreasonable memory usage if the peer sends an unbounded
|
||||||
// number of unique header keys.
|
// number of unique header keys.
|
||||||
const maxCachedCanonicalHeaders = 32
|
const maxCachedCanonicalHeaders = 32
|
||||||
if len(sc.canonHeader) < maxCachedCanonicalHeaders {
|
if len(sc.canonHeader) < maxCachedCanonicalHeaders {
|
||||||
|
3
vendor/golang.org/x/sys/unix/mkerrors.sh
generated
vendored
3
vendor/golang.org/x/sys/unix/mkerrors.sh
generated
vendored
@ -261,6 +261,7 @@ struct ltchars {
|
|||||||
#include <linux/vm_sockets.h>
|
#include <linux/vm_sockets.h>
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
#include <linux/watchdog.h>
|
#include <linux/watchdog.h>
|
||||||
|
#include <linux/wireguard.h>
|
||||||
|
|
||||||
#include <mtd/ubi-user.h>
|
#include <mtd/ubi-user.h>
|
||||||
#include <mtd/mtd-user.h>
|
#include <mtd/mtd-user.h>
|
||||||
@ -596,6 +597,7 @@ ccflags="$@"
|
|||||||
$2 ~ /^DEVLINK_/ ||
|
$2 ~ /^DEVLINK_/ ||
|
||||||
$2 ~ /^ETHTOOL_/ ||
|
$2 ~ /^ETHTOOL_/ ||
|
||||||
$2 ~ /^LWTUNNEL_IP/ ||
|
$2 ~ /^LWTUNNEL_IP/ ||
|
||||||
|
$2 ~ /^ITIMER_/ ||
|
||||||
$2 !~ "WMESGLEN" &&
|
$2 !~ "WMESGLEN" &&
|
||||||
$2 ~ /^W[A-Z0-9]+$/ ||
|
$2 ~ /^W[A-Z0-9]+$/ ||
|
||||||
$2 ~/^PPPIOC/ ||
|
$2 ~/^PPPIOC/ ||
|
||||||
@ -606,6 +608,7 @@ ccflags="$@"
|
|||||||
$2 ~ /^MTD/ ||
|
$2 ~ /^MTD/ ||
|
||||||
$2 ~ /^OTP/ ||
|
$2 ~ /^OTP/ ||
|
||||||
$2 ~ /^MEM/ ||
|
$2 ~ /^MEM/ ||
|
||||||
|
$2 ~ /^WG/ ||
|
||||||
$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)}
|
$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)}
|
||||||
$2 ~ /^__WCOREFLAG$/ {next}
|
$2 ~ /^__WCOREFLAG$/ {next}
|
||||||
$2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)}
|
$2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)}
|
||||||
|
49
vendor/golang.org/x/sys/unix/syscall_linux.go
generated
vendored
49
vendor/golang.org/x/sys/unix/syscall_linux.go
generated
vendored
@ -14,6 +14,7 @@ package unix
|
|||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"time"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -2314,11 +2315,56 @@ type RemoteIovec struct {
|
|||||||
//sys shmdt(addr uintptr) (err error)
|
//sys shmdt(addr uintptr) (err error)
|
||||||
//sys shmget(key int, size int, flag int) (id int, err error)
|
//sys shmget(key int, size int, flag int) (id int, err error)
|
||||||
|
|
||||||
|
//sys getitimer(which int, currValue *Itimerval) (err error)
|
||||||
|
//sys setitimer(which int, newValue *Itimerval, oldValue *Itimerval) (err error)
|
||||||
|
|
||||||
|
// MakeItimerval creates an Itimerval from interval and value durations.
|
||||||
|
func MakeItimerval(interval, value time.Duration) Itimerval {
|
||||||
|
return Itimerval{
|
||||||
|
Interval: NsecToTimeval(interval.Nanoseconds()),
|
||||||
|
Value: NsecToTimeval(value.Nanoseconds()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A value which may be passed to the which parameter for Getitimer and
|
||||||
|
// Setitimer.
|
||||||
|
type ItimerWhich int
|
||||||
|
|
||||||
|
// Possible which values for Getitimer and Setitimer.
|
||||||
|
const (
|
||||||
|
ItimerReal ItimerWhich = ITIMER_REAL
|
||||||
|
ItimerVirtual ItimerWhich = ITIMER_VIRTUAL
|
||||||
|
ItimerProf ItimerWhich = ITIMER_PROF
|
||||||
|
)
|
||||||
|
|
||||||
|
// Getitimer wraps getitimer(2) to return the current value of the timer
|
||||||
|
// specified by which.
|
||||||
|
func Getitimer(which ItimerWhich) (Itimerval, error) {
|
||||||
|
var it Itimerval
|
||||||
|
if err := getitimer(int(which), &it); err != nil {
|
||||||
|
return Itimerval{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return it, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setitimer wraps setitimer(2) to arm or disarm the timer specified by which.
|
||||||
|
// It returns the previous value of the timer.
|
||||||
|
//
|
||||||
|
// If the Itimerval argument is the zero value, the timer will be disarmed.
|
||||||
|
func Setitimer(which ItimerWhich, it Itimerval) (Itimerval, error) {
|
||||||
|
var prev Itimerval
|
||||||
|
if err := setitimer(int(which), &it, &prev); err != nil {
|
||||||
|
return Itimerval{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return prev, nil
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unimplemented
|
* Unimplemented
|
||||||
*/
|
*/
|
||||||
// AfsSyscall
|
// AfsSyscall
|
||||||
// Alarm
|
|
||||||
// ArchPrctl
|
// ArchPrctl
|
||||||
// Brk
|
// Brk
|
||||||
// ClockNanosleep
|
// ClockNanosleep
|
||||||
@ -2334,7 +2380,6 @@ type RemoteIovec struct {
|
|||||||
// GetMempolicy
|
// GetMempolicy
|
||||||
// GetRobustList
|
// GetRobustList
|
||||||
// GetThreadArea
|
// GetThreadArea
|
||||||
// Getitimer
|
|
||||||
// Getpmsg
|
// Getpmsg
|
||||||
// IoCancel
|
// IoCancel
|
||||||
// IoDestroy
|
// IoDestroy
|
||||||
|
14
vendor/golang.org/x/sys/unix/syscall_linux_alarm.go
generated
vendored
Normal file
14
vendor/golang.org/x/sys/unix/syscall_linux_alarm.go
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Copyright 2022 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build linux && (386 || amd64 || mips || mipsle || mips64 || mipsle || ppc64 || ppc64le || ppc || s390x || sparc64)
|
||||||
|
// +build linux
|
||||||
|
// +build 386 amd64 mips mipsle mips64 mipsle ppc64 ppc64le ppc s390x sparc64
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
// SYS_ALARM is not defined on arm or riscv, but is available for other GOARCH
|
||||||
|
// values.
|
||||||
|
|
||||||
|
//sys Alarm(seconds uint) (remaining uint, err error)
|
36
vendor/golang.org/x/sys/unix/zerrors_linux.go
generated
vendored
36
vendor/golang.org/x/sys/unix/zerrors_linux.go
generated
vendored
@ -38,7 +38,8 @@ const (
|
|||||||
AF_KEY = 0xf
|
AF_KEY = 0xf
|
||||||
AF_LLC = 0x1a
|
AF_LLC = 0x1a
|
||||||
AF_LOCAL = 0x1
|
AF_LOCAL = 0x1
|
||||||
AF_MAX = 0x2d
|
AF_MAX = 0x2e
|
||||||
|
AF_MCTP = 0x2d
|
||||||
AF_MPLS = 0x1c
|
AF_MPLS = 0x1c
|
||||||
AF_NETBEUI = 0xd
|
AF_NETBEUI = 0xd
|
||||||
AF_NETLINK = 0x10
|
AF_NETLINK = 0x10
|
||||||
@ -741,6 +742,7 @@ const (
|
|||||||
ETH_P_QINQ2 = 0x9200
|
ETH_P_QINQ2 = 0x9200
|
||||||
ETH_P_QINQ3 = 0x9300
|
ETH_P_QINQ3 = 0x9300
|
||||||
ETH_P_RARP = 0x8035
|
ETH_P_RARP = 0x8035
|
||||||
|
ETH_P_REALTEK = 0x8899
|
||||||
ETH_P_SCA = 0x6007
|
ETH_P_SCA = 0x6007
|
||||||
ETH_P_SLOW = 0x8809
|
ETH_P_SLOW = 0x8809
|
||||||
ETH_P_SNAP = 0x5
|
ETH_P_SNAP = 0x5
|
||||||
@ -810,10 +812,12 @@ const (
|
|||||||
FAN_EPIDFD = -0x2
|
FAN_EPIDFD = -0x2
|
||||||
FAN_EVENT_INFO_TYPE_DFID = 0x3
|
FAN_EVENT_INFO_TYPE_DFID = 0x3
|
||||||
FAN_EVENT_INFO_TYPE_DFID_NAME = 0x2
|
FAN_EVENT_INFO_TYPE_DFID_NAME = 0x2
|
||||||
|
FAN_EVENT_INFO_TYPE_ERROR = 0x5
|
||||||
FAN_EVENT_INFO_TYPE_FID = 0x1
|
FAN_EVENT_INFO_TYPE_FID = 0x1
|
||||||
FAN_EVENT_INFO_TYPE_PIDFD = 0x4
|
FAN_EVENT_INFO_TYPE_PIDFD = 0x4
|
||||||
FAN_EVENT_METADATA_LEN = 0x18
|
FAN_EVENT_METADATA_LEN = 0x18
|
||||||
FAN_EVENT_ON_CHILD = 0x8000000
|
FAN_EVENT_ON_CHILD = 0x8000000
|
||||||
|
FAN_FS_ERROR = 0x8000
|
||||||
FAN_MARK_ADD = 0x1
|
FAN_MARK_ADD = 0x1
|
||||||
FAN_MARK_DONT_FOLLOW = 0x4
|
FAN_MARK_DONT_FOLLOW = 0x4
|
||||||
FAN_MARK_FILESYSTEM = 0x100
|
FAN_MARK_FILESYSTEM = 0x100
|
||||||
@ -1264,6 +1268,9 @@ const (
|
|||||||
IP_XFRM_POLICY = 0x11
|
IP_XFRM_POLICY = 0x11
|
||||||
ISOFS_SUPER_MAGIC = 0x9660
|
ISOFS_SUPER_MAGIC = 0x9660
|
||||||
ISTRIP = 0x20
|
ISTRIP = 0x20
|
||||||
|
ITIMER_PROF = 0x2
|
||||||
|
ITIMER_REAL = 0x0
|
||||||
|
ITIMER_VIRTUAL = 0x1
|
||||||
IUTF8 = 0x4000
|
IUTF8 = 0x4000
|
||||||
IXANY = 0x800
|
IXANY = 0x800
|
||||||
JFFS2_SUPER_MAGIC = 0x72b6
|
JFFS2_SUPER_MAGIC = 0x72b6
|
||||||
@ -1827,6 +1834,8 @@ const (
|
|||||||
PERF_MEM_BLK_DATA = 0x2
|
PERF_MEM_BLK_DATA = 0x2
|
||||||
PERF_MEM_BLK_NA = 0x1
|
PERF_MEM_BLK_NA = 0x1
|
||||||
PERF_MEM_BLK_SHIFT = 0x28
|
PERF_MEM_BLK_SHIFT = 0x28
|
||||||
|
PERF_MEM_HOPS_0 = 0x1
|
||||||
|
PERF_MEM_HOPS_SHIFT = 0x2b
|
||||||
PERF_MEM_LOCK_LOCKED = 0x2
|
PERF_MEM_LOCK_LOCKED = 0x2
|
||||||
PERF_MEM_LOCK_NA = 0x1
|
PERF_MEM_LOCK_NA = 0x1
|
||||||
PERF_MEM_LOCK_SHIFT = 0x18
|
PERF_MEM_LOCK_SHIFT = 0x18
|
||||||
@ -1986,6 +1995,9 @@ const (
|
|||||||
PR_SCHED_CORE_CREATE = 0x1
|
PR_SCHED_CORE_CREATE = 0x1
|
||||||
PR_SCHED_CORE_GET = 0x0
|
PR_SCHED_CORE_GET = 0x0
|
||||||
PR_SCHED_CORE_MAX = 0x4
|
PR_SCHED_CORE_MAX = 0x4
|
||||||
|
PR_SCHED_CORE_SCOPE_PROCESS_GROUP = 0x2
|
||||||
|
PR_SCHED_CORE_SCOPE_THREAD = 0x0
|
||||||
|
PR_SCHED_CORE_SCOPE_THREAD_GROUP = 0x1
|
||||||
PR_SCHED_CORE_SHARE_FROM = 0x3
|
PR_SCHED_CORE_SHARE_FROM = 0x3
|
||||||
PR_SCHED_CORE_SHARE_TO = 0x2
|
PR_SCHED_CORE_SHARE_TO = 0x2
|
||||||
PR_SET_CHILD_SUBREAPER = 0x24
|
PR_SET_CHILD_SUBREAPER = 0x24
|
||||||
@ -2167,12 +2179,23 @@ const (
|
|||||||
RTCF_NAT = 0x800000
|
RTCF_NAT = 0x800000
|
||||||
RTCF_VALVE = 0x200000
|
RTCF_VALVE = 0x200000
|
||||||
RTC_AF = 0x20
|
RTC_AF = 0x20
|
||||||
|
RTC_BSM_DIRECT = 0x1
|
||||||
|
RTC_BSM_DISABLED = 0x0
|
||||||
|
RTC_BSM_LEVEL = 0x2
|
||||||
|
RTC_BSM_STANDBY = 0x3
|
||||||
RTC_FEATURE_ALARM = 0x0
|
RTC_FEATURE_ALARM = 0x0
|
||||||
|
RTC_FEATURE_ALARM_RES_2S = 0x3
|
||||||
RTC_FEATURE_ALARM_RES_MINUTE = 0x1
|
RTC_FEATURE_ALARM_RES_MINUTE = 0x1
|
||||||
RTC_FEATURE_CNT = 0x3
|
RTC_FEATURE_BACKUP_SWITCH_MODE = 0x6
|
||||||
|
RTC_FEATURE_CNT = 0x7
|
||||||
|
RTC_FEATURE_CORRECTION = 0x5
|
||||||
RTC_FEATURE_NEED_WEEK_DAY = 0x2
|
RTC_FEATURE_NEED_WEEK_DAY = 0x2
|
||||||
|
RTC_FEATURE_UPDATE_INTERRUPT = 0x4
|
||||||
RTC_IRQF = 0x80
|
RTC_IRQF = 0x80
|
||||||
RTC_MAX_FREQ = 0x2000
|
RTC_MAX_FREQ = 0x2000
|
||||||
|
RTC_PARAM_BACKUP_SWITCH_MODE = 0x2
|
||||||
|
RTC_PARAM_CORRECTION = 0x1
|
||||||
|
RTC_PARAM_FEATURES = 0x0
|
||||||
RTC_PF = 0x40
|
RTC_PF = 0x40
|
||||||
RTC_UF = 0x10
|
RTC_UF = 0x10
|
||||||
RTF_ADDRCLASSMASK = 0xf8000000
|
RTF_ADDRCLASSMASK = 0xf8000000
|
||||||
@ -2532,6 +2555,8 @@ const (
|
|||||||
SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1
|
SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1
|
||||||
SO_VM_SOCKETS_BUFFER_SIZE = 0x0
|
SO_VM_SOCKETS_BUFFER_SIZE = 0x0
|
||||||
SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6
|
SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6
|
||||||
|
SO_VM_SOCKETS_CONNECT_TIMEOUT_NEW = 0x8
|
||||||
|
SO_VM_SOCKETS_CONNECT_TIMEOUT_OLD = 0x6
|
||||||
SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7
|
SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7
|
||||||
SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3
|
SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3
|
||||||
SO_VM_SOCKETS_TRUSTED = 0x5
|
SO_VM_SOCKETS_TRUSTED = 0x5
|
||||||
@ -2826,6 +2851,13 @@ const (
|
|||||||
WDIOS_TEMPPANIC = 0x4
|
WDIOS_TEMPPANIC = 0x4
|
||||||
WDIOS_UNKNOWN = -0x1
|
WDIOS_UNKNOWN = -0x1
|
||||||
WEXITED = 0x4
|
WEXITED = 0x4
|
||||||
|
WGALLOWEDIP_A_MAX = 0x3
|
||||||
|
WGDEVICE_A_MAX = 0x8
|
||||||
|
WGPEER_A_MAX = 0xa
|
||||||
|
WG_CMD_MAX = 0x1
|
||||||
|
WG_GENL_NAME = "wireguard"
|
||||||
|
WG_GENL_VERSION = 0x1
|
||||||
|
WG_KEY_LEN = 0x20
|
||||||
WIN_ACKMEDIACHANGE = 0xdb
|
WIN_ACKMEDIACHANGE = 0xdb
|
||||||
WIN_CHECKPOWERMODE1 = 0xe5
|
WIN_CHECKPOWERMODE1 = 0xe5
|
||||||
WIN_CHECKPOWERMODE2 = 0x98
|
WIN_CHECKPOWERMODE2 = 0x98
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_386.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_386.go
generated
vendored
@ -250,6 +250,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x4004700e
|
RTC_EPOCH_SET = 0x4004700e
|
||||||
RTC_IRQP_READ = 0x8004700b
|
RTC_IRQP_READ = 0x8004700b
|
||||||
RTC_IRQP_SET = 0x4004700c
|
RTC_IRQP_SET = 0x4004700c
|
||||||
|
RTC_PARAM_GET = 0x40187013
|
||||||
|
RTC_PARAM_SET = 0x40187014
|
||||||
RTC_PIE_OFF = 0x7006
|
RTC_PIE_OFF = 0x7006
|
||||||
RTC_PIE_ON = 0x7005
|
RTC_PIE_ON = 0x7005
|
||||||
RTC_PLL_GET = 0x801c7011
|
RTC_PLL_GET = 0x801c7011
|
||||||
@ -327,6 +329,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x14
|
SO_RCVTIMEO = 0x14
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x14
|
SO_RCVTIMEO_OLD = 0x14
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x2
|
SO_REUSEADDR = 0x2
|
||||||
SO_REUSEPORT = 0xf
|
SO_REUSEPORT = 0xf
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
generated
vendored
@ -251,6 +251,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x4008700e
|
RTC_EPOCH_SET = 0x4008700e
|
||||||
RTC_IRQP_READ = 0x8008700b
|
RTC_IRQP_READ = 0x8008700b
|
||||||
RTC_IRQP_SET = 0x4008700c
|
RTC_IRQP_SET = 0x4008700c
|
||||||
|
RTC_PARAM_GET = 0x40187013
|
||||||
|
RTC_PARAM_SET = 0x40187014
|
||||||
RTC_PIE_OFF = 0x7006
|
RTC_PIE_OFF = 0x7006
|
||||||
RTC_PIE_ON = 0x7005
|
RTC_PIE_ON = 0x7005
|
||||||
RTC_PLL_GET = 0x80207011
|
RTC_PLL_GET = 0x80207011
|
||||||
@ -328,6 +330,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x14
|
SO_RCVTIMEO = 0x14
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x14
|
SO_RCVTIMEO_OLD = 0x14
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x2
|
SO_REUSEADDR = 0x2
|
||||||
SO_REUSEPORT = 0xf
|
SO_REUSEPORT = 0xf
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
generated
vendored
@ -257,6 +257,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x4004700e
|
RTC_EPOCH_SET = 0x4004700e
|
||||||
RTC_IRQP_READ = 0x8004700b
|
RTC_IRQP_READ = 0x8004700b
|
||||||
RTC_IRQP_SET = 0x4004700c
|
RTC_IRQP_SET = 0x4004700c
|
||||||
|
RTC_PARAM_GET = 0x40187013
|
||||||
|
RTC_PARAM_SET = 0x40187014
|
||||||
RTC_PIE_OFF = 0x7006
|
RTC_PIE_OFF = 0x7006
|
||||||
RTC_PIE_ON = 0x7005
|
RTC_PIE_ON = 0x7005
|
||||||
RTC_PLL_GET = 0x801c7011
|
RTC_PLL_GET = 0x801c7011
|
||||||
@ -334,6 +336,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x14
|
SO_RCVTIMEO = 0x14
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x14
|
SO_RCVTIMEO_OLD = 0x14
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x2
|
SO_REUSEADDR = 0x2
|
||||||
SO_REUSEPORT = 0xf
|
SO_REUSEPORT = 0xf
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
generated
vendored
@ -247,6 +247,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x4008700e
|
RTC_EPOCH_SET = 0x4008700e
|
||||||
RTC_IRQP_READ = 0x8008700b
|
RTC_IRQP_READ = 0x8008700b
|
||||||
RTC_IRQP_SET = 0x4008700c
|
RTC_IRQP_SET = 0x4008700c
|
||||||
|
RTC_PARAM_GET = 0x40187013
|
||||||
|
RTC_PARAM_SET = 0x40187014
|
||||||
RTC_PIE_OFF = 0x7006
|
RTC_PIE_OFF = 0x7006
|
||||||
RTC_PIE_ON = 0x7005
|
RTC_PIE_ON = 0x7005
|
||||||
RTC_PLL_GET = 0x80207011
|
RTC_PLL_GET = 0x80207011
|
||||||
@ -324,6 +326,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x14
|
SO_RCVTIMEO = 0x14
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x14
|
SO_RCVTIMEO_OLD = 0x14
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x2
|
SO_REUSEADDR = 0x2
|
||||||
SO_REUSEPORT = 0xf
|
SO_REUSEPORT = 0xf
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
generated
vendored
@ -250,6 +250,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x8004700e
|
RTC_EPOCH_SET = 0x8004700e
|
||||||
RTC_IRQP_READ = 0x4004700b
|
RTC_IRQP_READ = 0x4004700b
|
||||||
RTC_IRQP_SET = 0x8004700c
|
RTC_IRQP_SET = 0x8004700c
|
||||||
|
RTC_PARAM_GET = 0x80187013
|
||||||
|
RTC_PARAM_SET = 0x80187014
|
||||||
RTC_PIE_OFF = 0x20007006
|
RTC_PIE_OFF = 0x20007006
|
||||||
RTC_PIE_ON = 0x20007005
|
RTC_PIE_ON = 0x20007005
|
||||||
RTC_PLL_GET = 0x401c7011
|
RTC_PLL_GET = 0x401c7011
|
||||||
@ -327,6 +329,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x1006
|
SO_RCVTIMEO = 0x1006
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x1006
|
SO_RCVTIMEO_OLD = 0x1006
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x4
|
SO_REUSEADDR = 0x4
|
||||||
SO_REUSEPORT = 0x200
|
SO_REUSEPORT = 0x200
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
generated
vendored
@ -250,6 +250,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x8008700e
|
RTC_EPOCH_SET = 0x8008700e
|
||||||
RTC_IRQP_READ = 0x4008700b
|
RTC_IRQP_READ = 0x4008700b
|
||||||
RTC_IRQP_SET = 0x8008700c
|
RTC_IRQP_SET = 0x8008700c
|
||||||
|
RTC_PARAM_GET = 0x80187013
|
||||||
|
RTC_PARAM_SET = 0x80187014
|
||||||
RTC_PIE_OFF = 0x20007006
|
RTC_PIE_OFF = 0x20007006
|
||||||
RTC_PIE_ON = 0x20007005
|
RTC_PIE_ON = 0x20007005
|
||||||
RTC_PLL_GET = 0x40207011
|
RTC_PLL_GET = 0x40207011
|
||||||
@ -327,6 +329,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x1006
|
SO_RCVTIMEO = 0x1006
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x1006
|
SO_RCVTIMEO_OLD = 0x1006
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x4
|
SO_REUSEADDR = 0x4
|
||||||
SO_REUSEPORT = 0x200
|
SO_REUSEPORT = 0x200
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
generated
vendored
@ -250,6 +250,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x8008700e
|
RTC_EPOCH_SET = 0x8008700e
|
||||||
RTC_IRQP_READ = 0x4008700b
|
RTC_IRQP_READ = 0x4008700b
|
||||||
RTC_IRQP_SET = 0x8008700c
|
RTC_IRQP_SET = 0x8008700c
|
||||||
|
RTC_PARAM_GET = 0x80187013
|
||||||
|
RTC_PARAM_SET = 0x80187014
|
||||||
RTC_PIE_OFF = 0x20007006
|
RTC_PIE_OFF = 0x20007006
|
||||||
RTC_PIE_ON = 0x20007005
|
RTC_PIE_ON = 0x20007005
|
||||||
RTC_PLL_GET = 0x40207011
|
RTC_PLL_GET = 0x40207011
|
||||||
@ -327,6 +329,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x1006
|
SO_RCVTIMEO = 0x1006
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x1006
|
SO_RCVTIMEO_OLD = 0x1006
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x4
|
SO_REUSEADDR = 0x4
|
||||||
SO_REUSEPORT = 0x200
|
SO_REUSEPORT = 0x200
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
generated
vendored
@ -250,6 +250,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x8004700e
|
RTC_EPOCH_SET = 0x8004700e
|
||||||
RTC_IRQP_READ = 0x4004700b
|
RTC_IRQP_READ = 0x4004700b
|
||||||
RTC_IRQP_SET = 0x8004700c
|
RTC_IRQP_SET = 0x8004700c
|
||||||
|
RTC_PARAM_GET = 0x80187013
|
||||||
|
RTC_PARAM_SET = 0x80187014
|
||||||
RTC_PIE_OFF = 0x20007006
|
RTC_PIE_OFF = 0x20007006
|
||||||
RTC_PIE_ON = 0x20007005
|
RTC_PIE_ON = 0x20007005
|
||||||
RTC_PLL_GET = 0x401c7011
|
RTC_PLL_GET = 0x401c7011
|
||||||
@ -327,6 +329,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x1006
|
SO_RCVTIMEO = 0x1006
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x1006
|
SO_RCVTIMEO_OLD = 0x1006
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x4
|
SO_REUSEADDR = 0x4
|
||||||
SO_REUSEPORT = 0x200
|
SO_REUSEPORT = 0x200
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
generated
vendored
@ -305,6 +305,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x8004700e
|
RTC_EPOCH_SET = 0x8004700e
|
||||||
RTC_IRQP_READ = 0x4004700b
|
RTC_IRQP_READ = 0x4004700b
|
||||||
RTC_IRQP_SET = 0x8004700c
|
RTC_IRQP_SET = 0x8004700c
|
||||||
|
RTC_PARAM_GET = 0x80187013
|
||||||
|
RTC_PARAM_SET = 0x80187014
|
||||||
RTC_PIE_OFF = 0x20007006
|
RTC_PIE_OFF = 0x20007006
|
||||||
RTC_PIE_ON = 0x20007005
|
RTC_PIE_ON = 0x20007005
|
||||||
RTC_PLL_GET = 0x401c7011
|
RTC_PLL_GET = 0x401c7011
|
||||||
@ -382,6 +384,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x12
|
SO_RCVTIMEO = 0x12
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x12
|
SO_RCVTIMEO_OLD = 0x12
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x2
|
SO_REUSEADDR = 0x2
|
||||||
SO_REUSEPORT = 0xf
|
SO_REUSEPORT = 0xf
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
generated
vendored
@ -309,6 +309,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x8008700e
|
RTC_EPOCH_SET = 0x8008700e
|
||||||
RTC_IRQP_READ = 0x4008700b
|
RTC_IRQP_READ = 0x4008700b
|
||||||
RTC_IRQP_SET = 0x8008700c
|
RTC_IRQP_SET = 0x8008700c
|
||||||
|
RTC_PARAM_GET = 0x80187013
|
||||||
|
RTC_PARAM_SET = 0x80187014
|
||||||
RTC_PIE_OFF = 0x20007006
|
RTC_PIE_OFF = 0x20007006
|
||||||
RTC_PIE_ON = 0x20007005
|
RTC_PIE_ON = 0x20007005
|
||||||
RTC_PLL_GET = 0x40207011
|
RTC_PLL_GET = 0x40207011
|
||||||
@ -386,6 +388,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x12
|
SO_RCVTIMEO = 0x12
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x12
|
SO_RCVTIMEO_OLD = 0x12
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x2
|
SO_REUSEADDR = 0x2
|
||||||
SO_REUSEPORT = 0xf
|
SO_REUSEPORT = 0xf
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
generated
vendored
@ -309,6 +309,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x8008700e
|
RTC_EPOCH_SET = 0x8008700e
|
||||||
RTC_IRQP_READ = 0x4008700b
|
RTC_IRQP_READ = 0x4008700b
|
||||||
RTC_IRQP_SET = 0x8008700c
|
RTC_IRQP_SET = 0x8008700c
|
||||||
|
RTC_PARAM_GET = 0x80187013
|
||||||
|
RTC_PARAM_SET = 0x80187014
|
||||||
RTC_PIE_OFF = 0x20007006
|
RTC_PIE_OFF = 0x20007006
|
||||||
RTC_PIE_ON = 0x20007005
|
RTC_PIE_ON = 0x20007005
|
||||||
RTC_PLL_GET = 0x40207011
|
RTC_PLL_GET = 0x40207011
|
||||||
@ -386,6 +388,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x12
|
SO_RCVTIMEO = 0x12
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x12
|
SO_RCVTIMEO_OLD = 0x12
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x2
|
SO_REUSEADDR = 0x2
|
||||||
SO_REUSEPORT = 0xf
|
SO_REUSEPORT = 0xf
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
generated
vendored
@ -238,6 +238,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x4008700e
|
RTC_EPOCH_SET = 0x4008700e
|
||||||
RTC_IRQP_READ = 0x8008700b
|
RTC_IRQP_READ = 0x8008700b
|
||||||
RTC_IRQP_SET = 0x4008700c
|
RTC_IRQP_SET = 0x4008700c
|
||||||
|
RTC_PARAM_GET = 0x40187013
|
||||||
|
RTC_PARAM_SET = 0x40187014
|
||||||
RTC_PIE_OFF = 0x7006
|
RTC_PIE_OFF = 0x7006
|
||||||
RTC_PIE_ON = 0x7005
|
RTC_PIE_ON = 0x7005
|
||||||
RTC_PLL_GET = 0x80207011
|
RTC_PLL_GET = 0x80207011
|
||||||
@ -315,6 +317,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x14
|
SO_RCVTIMEO = 0x14
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x14
|
SO_RCVTIMEO_OLD = 0x14
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x2
|
SO_REUSEADDR = 0x2
|
||||||
SO_REUSEPORT = 0xf
|
SO_REUSEPORT = 0xf
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
generated
vendored
@ -313,6 +313,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x4008700e
|
RTC_EPOCH_SET = 0x4008700e
|
||||||
RTC_IRQP_READ = 0x8008700b
|
RTC_IRQP_READ = 0x8008700b
|
||||||
RTC_IRQP_SET = 0x4008700c
|
RTC_IRQP_SET = 0x4008700c
|
||||||
|
RTC_PARAM_GET = 0x40187013
|
||||||
|
RTC_PARAM_SET = 0x40187014
|
||||||
RTC_PIE_OFF = 0x7006
|
RTC_PIE_OFF = 0x7006
|
||||||
RTC_PIE_ON = 0x7005
|
RTC_PIE_ON = 0x7005
|
||||||
RTC_PLL_GET = 0x80207011
|
RTC_PLL_GET = 0x80207011
|
||||||
@ -390,6 +392,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x14
|
SO_RCVTIMEO = 0x14
|
||||||
SO_RCVTIMEO_NEW = 0x42
|
SO_RCVTIMEO_NEW = 0x42
|
||||||
SO_RCVTIMEO_OLD = 0x14
|
SO_RCVTIMEO_OLD = 0x14
|
||||||
|
SO_RESERVE_MEM = 0x49
|
||||||
SO_REUSEADDR = 0x2
|
SO_REUSEADDR = 0x2
|
||||||
SO_REUSEPORT = 0xf
|
SO_REUSEPORT = 0xf
|
||||||
SO_RXQ_OVFL = 0x28
|
SO_RXQ_OVFL = 0x28
|
||||||
|
3
vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
generated
vendored
3
vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
generated
vendored
@ -304,6 +304,8 @@ const (
|
|||||||
RTC_EPOCH_SET = 0x8008700e
|
RTC_EPOCH_SET = 0x8008700e
|
||||||
RTC_IRQP_READ = 0x4008700b
|
RTC_IRQP_READ = 0x4008700b
|
||||||
RTC_IRQP_SET = 0x8008700c
|
RTC_IRQP_SET = 0x8008700c
|
||||||
|
RTC_PARAM_GET = 0x80187013
|
||||||
|
RTC_PARAM_SET = 0x80187014
|
||||||
RTC_PIE_OFF = 0x20007006
|
RTC_PIE_OFF = 0x20007006
|
||||||
RTC_PIE_ON = 0x20007005
|
RTC_PIE_ON = 0x20007005
|
||||||
RTC_PLL_GET = 0x40207011
|
RTC_PLL_GET = 0x40207011
|
||||||
@ -381,6 +383,7 @@ const (
|
|||||||
SO_RCVTIMEO = 0x2000
|
SO_RCVTIMEO = 0x2000
|
||||||
SO_RCVTIMEO_NEW = 0x44
|
SO_RCVTIMEO_NEW = 0x44
|
||||||
SO_RCVTIMEO_OLD = 0x2000
|
SO_RCVTIMEO_OLD = 0x2000
|
||||||
|
SO_RESERVE_MEM = 0x52
|
||||||
SO_REUSEADDR = 0x4
|
SO_REUSEADDR = 0x4
|
||||||
SO_REUSEPORT = 0x200
|
SO_REUSEPORT = 0x200
|
||||||
SO_RXQ_OVFL = 0x24
|
SO_RXQ_OVFL = 0x24
|
||||||
|
20
vendor/golang.org/x/sys/unix/zsyscall_linux.go
generated
vendored
20
vendor/golang.org/x/sys/unix/zsyscall_linux.go
generated
vendored
@ -2032,3 +2032,23 @@ func shmget(key int, size int, flag int) (id int, err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func getitimer(which int, currValue *Itimerval) (err error) {
|
||||||
|
_, _, e1 := Syscall(SYS_GETITIMER, uintptr(which), uintptr(unsafe.Pointer(currValue)), 0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func setitimer(which int, newValue *Itimerval, oldValue *Itimerval) (err error) {
|
||||||
|
_, _, e1 := Syscall(SYS_SETITIMER, uintptr(which), uintptr(unsafe.Pointer(newValue)), uintptr(unsafe.Pointer(oldValue)))
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
13
vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
generated
vendored
13
vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go
|
// go run mksyscall.go -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && 386
|
//go:build linux && 386
|
||||||
@ -524,3 +524,14 @@ func utimes(path string, times *[2]Timeval) (err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
13
vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
generated
vendored
13
vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go
|
// go run mksyscall.go -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && amd64
|
//go:build linux && amd64
|
||||||
@ -691,3 +691,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
13
vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
generated
vendored
13
vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go
|
// go run mksyscall.go -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && mips
|
//go:build linux && mips
|
||||||
@ -702,3 +702,14 @@ func setrlimit(resource int, rlim *rlimit32) (err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
13
vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
generated
vendored
13
vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go
|
// go run mksyscall.go -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && mips64
|
//go:build linux && mips64
|
||||||
@ -696,3 +696,14 @@ func stat(path string, st *stat_t) (err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
13
vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
generated
vendored
13
vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go
|
// go run mksyscall.go -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && mipsle
|
//go:build linux && mipsle
|
||||||
@ -702,3 +702,14 @@ func setrlimit(resource int, rlim *rlimit32) (err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
13
vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go
generated
vendored
13
vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -b32 -tags linux,ppc syscall_linux.go syscall_linux_ppc.go
|
// go run mksyscall.go -b32 -tags linux,ppc syscall_linux.go syscall_linux_ppc.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && ppc
|
//go:build linux && ppc
|
||||||
@ -707,3 +707,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
13
vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
generated
vendored
13
vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go
|
// go run mksyscall.go -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && ppc64
|
//go:build linux && ppc64
|
||||||
@ -753,3 +753,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
13
vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
generated
vendored
13
vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go
|
// go run mksyscall.go -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && ppc64le
|
//go:build linux && ppc64le
|
||||||
@ -753,3 +753,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
13
vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
generated
vendored
13
vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,s390x syscall_linux.go syscall_linux_s390x.go
|
// go run mksyscall.go -tags linux,s390x syscall_linux.go syscall_linux_s390x.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && s390x
|
//go:build linux && s390x
|
||||||
@ -533,3 +533,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
13
vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go
generated
vendored
13
vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go
|
// go run mksyscall.go -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && sparc64
|
//go:build linux && sparc64
|
||||||
@ -697,3 +697,14 @@ func utimes(path string, times *[2]Timeval) (err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_386.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_386.go
generated
vendored
@ -445,4 +445,5 @@ const (
|
|||||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||||
SYS_MEMFD_SECRET = 447
|
SYS_MEMFD_SECRET = 447
|
||||||
SYS_PROCESS_MRELEASE = 448
|
SYS_PROCESS_MRELEASE = 448
|
||||||
|
SYS_FUTEX_WAITV = 449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go
generated
vendored
@ -367,4 +367,5 @@ const (
|
|||||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||||
SYS_MEMFD_SECRET = 447
|
SYS_MEMFD_SECRET = 447
|
||||||
SYS_PROCESS_MRELEASE = 448
|
SYS_PROCESS_MRELEASE = 448
|
||||||
|
SYS_FUTEX_WAITV = 449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go
generated
vendored
@ -409,4 +409,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 445
|
SYS_LANDLOCK_ADD_RULE = 445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||||
SYS_PROCESS_MRELEASE = 448
|
SYS_PROCESS_MRELEASE = 448
|
||||||
|
SYS_FUTEX_WAITV = 449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go
generated
vendored
@ -312,4 +312,5 @@ const (
|
|||||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||||
SYS_MEMFD_SECRET = 447
|
SYS_MEMFD_SECRET = 447
|
||||||
SYS_PROCESS_MRELEASE = 448
|
SYS_PROCESS_MRELEASE = 448
|
||||||
|
SYS_FUTEX_WAITV = 449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go
generated
vendored
@ -429,4 +429,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 4445
|
SYS_LANDLOCK_ADD_RULE = 4445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 4446
|
SYS_LANDLOCK_RESTRICT_SELF = 4446
|
||||||
SYS_PROCESS_MRELEASE = 4448
|
SYS_PROCESS_MRELEASE = 4448
|
||||||
|
SYS_FUTEX_WAITV = 4449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go
generated
vendored
@ -359,4 +359,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 5445
|
SYS_LANDLOCK_ADD_RULE = 5445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 5446
|
SYS_LANDLOCK_RESTRICT_SELF = 5446
|
||||||
SYS_PROCESS_MRELEASE = 5448
|
SYS_PROCESS_MRELEASE = 5448
|
||||||
|
SYS_FUTEX_WAITV = 5449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go
generated
vendored
@ -359,4 +359,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 5445
|
SYS_LANDLOCK_ADD_RULE = 5445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 5446
|
SYS_LANDLOCK_RESTRICT_SELF = 5446
|
||||||
SYS_PROCESS_MRELEASE = 5448
|
SYS_PROCESS_MRELEASE = 5448
|
||||||
|
SYS_FUTEX_WAITV = 5449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go
generated
vendored
@ -429,4 +429,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 4445
|
SYS_LANDLOCK_ADD_RULE = 4445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 4446
|
SYS_LANDLOCK_RESTRICT_SELF = 4446
|
||||||
SYS_PROCESS_MRELEASE = 4448
|
SYS_PROCESS_MRELEASE = 4448
|
||||||
|
SYS_FUTEX_WAITV = 4449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go
generated
vendored
@ -436,4 +436,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 445
|
SYS_LANDLOCK_ADD_RULE = 445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||||
SYS_PROCESS_MRELEASE = 448
|
SYS_PROCESS_MRELEASE = 448
|
||||||
|
SYS_FUTEX_WAITV = 449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go
generated
vendored
@ -408,4 +408,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 445
|
SYS_LANDLOCK_ADD_RULE = 445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||||
SYS_PROCESS_MRELEASE = 448
|
SYS_PROCESS_MRELEASE = 448
|
||||||
|
SYS_FUTEX_WAITV = 449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go
generated
vendored
@ -408,4 +408,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 445
|
SYS_LANDLOCK_ADD_RULE = 445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||||
SYS_PROCESS_MRELEASE = 448
|
SYS_PROCESS_MRELEASE = 448
|
||||||
|
SYS_FUTEX_WAITV = 449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go
generated
vendored
@ -310,4 +310,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 445
|
SYS_LANDLOCK_ADD_RULE = 445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||||
SYS_PROCESS_MRELEASE = 448
|
SYS_PROCESS_MRELEASE = 448
|
||||||
|
SYS_FUTEX_WAITV = 449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
generated
vendored
@ -373,4 +373,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 445
|
SYS_LANDLOCK_ADD_RULE = 445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||||
SYS_PROCESS_MRELEASE = 448
|
SYS_PROCESS_MRELEASE = 448
|
||||||
|
SYS_FUTEX_WAITV = 449
|
||||||
)
|
)
|
||||||
|
1
vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go
generated
vendored
1
vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go
generated
vendored
@ -387,4 +387,5 @@ const (
|
|||||||
SYS_LANDLOCK_ADD_RULE = 445
|
SYS_LANDLOCK_ADD_RULE = 445
|
||||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||||
SYS_PROCESS_MRELEASE = 448
|
SYS_PROCESS_MRELEASE = 448
|
||||||
|
SYS_FUTEX_WAITV = 449
|
||||||
)
|
)
|
||||||
|
112
vendor/golang.org/x/sys/unix/ztypes_linux.go
generated
vendored
112
vendor/golang.org/x/sys/unix/ztypes_linux.go
generated
vendored
@ -24,6 +24,11 @@ type ItimerSpec struct {
|
|||||||
Value Timespec
|
Value Timespec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Itimerval struct {
|
||||||
|
Interval Timeval
|
||||||
|
Value Timeval
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
TIME_OK = 0x0
|
TIME_OK = 0x0
|
||||||
TIME_INS = 0x1
|
TIME_INS = 0x1
|
||||||
@ -867,6 +872,7 @@ const (
|
|||||||
CTRL_CMD_NEWMCAST_GRP = 0x7
|
CTRL_CMD_NEWMCAST_GRP = 0x7
|
||||||
CTRL_CMD_DELMCAST_GRP = 0x8
|
CTRL_CMD_DELMCAST_GRP = 0x8
|
||||||
CTRL_CMD_GETMCAST_GRP = 0x9
|
CTRL_CMD_GETMCAST_GRP = 0x9
|
||||||
|
CTRL_CMD_GETPOLICY = 0xa
|
||||||
CTRL_ATTR_UNSPEC = 0x0
|
CTRL_ATTR_UNSPEC = 0x0
|
||||||
CTRL_ATTR_FAMILY_ID = 0x1
|
CTRL_ATTR_FAMILY_ID = 0x1
|
||||||
CTRL_ATTR_FAMILY_NAME = 0x2
|
CTRL_ATTR_FAMILY_NAME = 0x2
|
||||||
@ -875,12 +881,19 @@ const (
|
|||||||
CTRL_ATTR_MAXATTR = 0x5
|
CTRL_ATTR_MAXATTR = 0x5
|
||||||
CTRL_ATTR_OPS = 0x6
|
CTRL_ATTR_OPS = 0x6
|
||||||
CTRL_ATTR_MCAST_GROUPS = 0x7
|
CTRL_ATTR_MCAST_GROUPS = 0x7
|
||||||
|
CTRL_ATTR_POLICY = 0x8
|
||||||
|
CTRL_ATTR_OP_POLICY = 0x9
|
||||||
|
CTRL_ATTR_OP = 0xa
|
||||||
CTRL_ATTR_OP_UNSPEC = 0x0
|
CTRL_ATTR_OP_UNSPEC = 0x0
|
||||||
CTRL_ATTR_OP_ID = 0x1
|
CTRL_ATTR_OP_ID = 0x1
|
||||||
CTRL_ATTR_OP_FLAGS = 0x2
|
CTRL_ATTR_OP_FLAGS = 0x2
|
||||||
CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0
|
CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0
|
||||||
CTRL_ATTR_MCAST_GRP_NAME = 0x1
|
CTRL_ATTR_MCAST_GRP_NAME = 0x1
|
||||||
CTRL_ATTR_MCAST_GRP_ID = 0x2
|
CTRL_ATTR_MCAST_GRP_ID = 0x2
|
||||||
|
CTRL_ATTR_POLICY_UNSPEC = 0x0
|
||||||
|
CTRL_ATTR_POLICY_DO = 0x1
|
||||||
|
CTRL_ATTR_POLICY_DUMP = 0x2
|
||||||
|
CTRL_ATTR_POLICY_DUMP_MAX = 0x2
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -1136,7 +1149,8 @@ const (
|
|||||||
PERF_RECORD_BPF_EVENT = 0x12
|
PERF_RECORD_BPF_EVENT = 0x12
|
||||||
PERF_RECORD_CGROUP = 0x13
|
PERF_RECORD_CGROUP = 0x13
|
||||||
PERF_RECORD_TEXT_POKE = 0x14
|
PERF_RECORD_TEXT_POKE = 0x14
|
||||||
PERF_RECORD_MAX = 0x15
|
PERF_RECORD_AUX_OUTPUT_HW_ID = 0x15
|
||||||
|
PERF_RECORD_MAX = 0x16
|
||||||
PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0x0
|
PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0x0
|
||||||
PERF_RECORD_KSYMBOL_TYPE_BPF = 0x1
|
PERF_RECORD_KSYMBOL_TYPE_BPF = 0x1
|
||||||
PERF_RECORD_KSYMBOL_TYPE_OOL = 0x2
|
PERF_RECORD_KSYMBOL_TYPE_OOL = 0x2
|
||||||
@ -1776,7 +1790,8 @@ const (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
NF_NETDEV_INGRESS = 0x0
|
NF_NETDEV_INGRESS = 0x0
|
||||||
NF_NETDEV_NUMHOOKS = 0x1
|
NF_NETDEV_EGRESS = 0x1
|
||||||
|
NF_NETDEV_NUMHOOKS = 0x2
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -3158,7 +3173,13 @@ const (
|
|||||||
DEVLINK_ATTR_RELOAD_ACTION_INFO = 0xa2
|
DEVLINK_ATTR_RELOAD_ACTION_INFO = 0xa2
|
||||||
DEVLINK_ATTR_RELOAD_ACTION_STATS = 0xa3
|
DEVLINK_ATTR_RELOAD_ACTION_STATS = 0xa3
|
||||||
DEVLINK_ATTR_PORT_PCI_SF_NUMBER = 0xa4
|
DEVLINK_ATTR_PORT_PCI_SF_NUMBER = 0xa4
|
||||||
DEVLINK_ATTR_MAX = 0xa9
|
DEVLINK_ATTR_RATE_TYPE = 0xa5
|
||||||
|
DEVLINK_ATTR_RATE_TX_SHARE = 0xa6
|
||||||
|
DEVLINK_ATTR_RATE_TX_MAX = 0xa7
|
||||||
|
DEVLINK_ATTR_RATE_NODE_NAME = 0xa8
|
||||||
|
DEVLINK_ATTR_RATE_PARENT_NODE_NAME = 0xa9
|
||||||
|
DEVLINK_ATTR_REGION_MAX_SNAPSHOTS = 0xaa
|
||||||
|
DEVLINK_ATTR_MAX = 0xaa
|
||||||
DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0
|
DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0
|
||||||
DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1
|
DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1
|
||||||
DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0
|
DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0
|
||||||
@ -3455,7 +3476,14 @@ const (
|
|||||||
ETHTOOL_MSG_CABLE_TEST_ACT = 0x1a
|
ETHTOOL_MSG_CABLE_TEST_ACT = 0x1a
|
||||||
ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 0x1b
|
ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 0x1b
|
||||||
ETHTOOL_MSG_TUNNEL_INFO_GET = 0x1c
|
ETHTOOL_MSG_TUNNEL_INFO_GET = 0x1c
|
||||||
ETHTOOL_MSG_USER_MAX = 0x21
|
ETHTOOL_MSG_FEC_GET = 0x1d
|
||||||
|
ETHTOOL_MSG_FEC_SET = 0x1e
|
||||||
|
ETHTOOL_MSG_MODULE_EEPROM_GET = 0x1f
|
||||||
|
ETHTOOL_MSG_STATS_GET = 0x20
|
||||||
|
ETHTOOL_MSG_PHC_VCLOCKS_GET = 0x21
|
||||||
|
ETHTOOL_MSG_MODULE_GET = 0x22
|
||||||
|
ETHTOOL_MSG_MODULE_SET = 0x23
|
||||||
|
ETHTOOL_MSG_USER_MAX = 0x23
|
||||||
ETHTOOL_MSG_KERNEL_NONE = 0x0
|
ETHTOOL_MSG_KERNEL_NONE = 0x0
|
||||||
ETHTOOL_MSG_STRSET_GET_REPLY = 0x1
|
ETHTOOL_MSG_STRSET_GET_REPLY = 0x1
|
||||||
ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2
|
ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2
|
||||||
@ -3486,7 +3514,14 @@ const (
|
|||||||
ETHTOOL_MSG_CABLE_TEST_NTF = 0x1b
|
ETHTOOL_MSG_CABLE_TEST_NTF = 0x1b
|
||||||
ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 0x1c
|
ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 0x1c
|
||||||
ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 0x1d
|
ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 0x1d
|
||||||
ETHTOOL_MSG_KERNEL_MAX = 0x22
|
ETHTOOL_MSG_FEC_GET_REPLY = 0x1e
|
||||||
|
ETHTOOL_MSG_FEC_NTF = 0x1f
|
||||||
|
ETHTOOL_MSG_MODULE_EEPROM_GET_REPLY = 0x20
|
||||||
|
ETHTOOL_MSG_STATS_GET_REPLY = 0x21
|
||||||
|
ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY = 0x22
|
||||||
|
ETHTOOL_MSG_MODULE_GET_REPLY = 0x23
|
||||||
|
ETHTOOL_MSG_MODULE_NTF = 0x24
|
||||||
|
ETHTOOL_MSG_KERNEL_MAX = 0x24
|
||||||
ETHTOOL_A_HEADER_UNSPEC = 0x0
|
ETHTOOL_A_HEADER_UNSPEC = 0x0
|
||||||
ETHTOOL_A_HEADER_DEV_INDEX = 0x1
|
ETHTOOL_A_HEADER_DEV_INDEX = 0x1
|
||||||
ETHTOOL_A_HEADER_DEV_NAME = 0x2
|
ETHTOOL_A_HEADER_DEV_NAME = 0x2
|
||||||
@ -3968,3 +4003,70 @@ type MountAttr struct {
|
|||||||
Propagation uint64
|
Propagation uint64
|
||||||
Userns_fd uint64
|
Userns_fd uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
WG_CMD_GET_DEVICE = 0x0
|
||||||
|
WG_CMD_SET_DEVICE = 0x1
|
||||||
|
WGDEVICE_F_REPLACE_PEERS = 0x1
|
||||||
|
WGDEVICE_A_UNSPEC = 0x0
|
||||||
|
WGDEVICE_A_IFINDEX = 0x1
|
||||||
|
WGDEVICE_A_IFNAME = 0x2
|
||||||
|
WGDEVICE_A_PRIVATE_KEY = 0x3
|
||||||
|
WGDEVICE_A_PUBLIC_KEY = 0x4
|
||||||
|
WGDEVICE_A_FLAGS = 0x5
|
||||||
|
WGDEVICE_A_LISTEN_PORT = 0x6
|
||||||
|
WGDEVICE_A_FWMARK = 0x7
|
||||||
|
WGDEVICE_A_PEERS = 0x8
|
||||||
|
WGPEER_F_REMOVE_ME = 0x1
|
||||||
|
WGPEER_F_REPLACE_ALLOWEDIPS = 0x2
|
||||||
|
WGPEER_F_UPDATE_ONLY = 0x4
|
||||||
|
WGPEER_A_UNSPEC = 0x0
|
||||||
|
WGPEER_A_PUBLIC_KEY = 0x1
|
||||||
|
WGPEER_A_PRESHARED_KEY = 0x2
|
||||||
|
WGPEER_A_FLAGS = 0x3
|
||||||
|
WGPEER_A_ENDPOINT = 0x4
|
||||||
|
WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL = 0x5
|
||||||
|
WGPEER_A_LAST_HANDSHAKE_TIME = 0x6
|
||||||
|
WGPEER_A_RX_BYTES = 0x7
|
||||||
|
WGPEER_A_TX_BYTES = 0x8
|
||||||
|
WGPEER_A_ALLOWEDIPS = 0x9
|
||||||
|
WGPEER_A_PROTOCOL_VERSION = 0xa
|
||||||
|
WGALLOWEDIP_A_UNSPEC = 0x0
|
||||||
|
WGALLOWEDIP_A_FAMILY = 0x1
|
||||||
|
WGALLOWEDIP_A_IPADDR = 0x2
|
||||||
|
WGALLOWEDIP_A_CIDR_MASK = 0x3
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
NL_ATTR_TYPE_INVALID = 0x0
|
||||||
|
NL_ATTR_TYPE_FLAG = 0x1
|
||||||
|
NL_ATTR_TYPE_U8 = 0x2
|
||||||
|
NL_ATTR_TYPE_U16 = 0x3
|
||||||
|
NL_ATTR_TYPE_U32 = 0x4
|
||||||
|
NL_ATTR_TYPE_U64 = 0x5
|
||||||
|
NL_ATTR_TYPE_S8 = 0x6
|
||||||
|
NL_ATTR_TYPE_S16 = 0x7
|
||||||
|
NL_ATTR_TYPE_S32 = 0x8
|
||||||
|
NL_ATTR_TYPE_S64 = 0x9
|
||||||
|
NL_ATTR_TYPE_BINARY = 0xa
|
||||||
|
NL_ATTR_TYPE_STRING = 0xb
|
||||||
|
NL_ATTR_TYPE_NUL_STRING = 0xc
|
||||||
|
NL_ATTR_TYPE_NESTED = 0xd
|
||||||
|
NL_ATTR_TYPE_NESTED_ARRAY = 0xe
|
||||||
|
NL_ATTR_TYPE_BITFIELD32 = 0xf
|
||||||
|
|
||||||
|
NL_POLICY_TYPE_ATTR_UNSPEC = 0x0
|
||||||
|
NL_POLICY_TYPE_ATTR_TYPE = 0x1
|
||||||
|
NL_POLICY_TYPE_ATTR_MIN_VALUE_S = 0x2
|
||||||
|
NL_POLICY_TYPE_ATTR_MAX_VALUE_S = 0x3
|
||||||
|
NL_POLICY_TYPE_ATTR_MIN_VALUE_U = 0x4
|
||||||
|
NL_POLICY_TYPE_ATTR_MAX_VALUE_U = 0x5
|
||||||
|
NL_POLICY_TYPE_ATTR_MIN_LENGTH = 0x6
|
||||||
|
NL_POLICY_TYPE_ATTR_MAX_LENGTH = 0x7
|
||||||
|
NL_POLICY_TYPE_ATTR_POLICY_IDX = 0x8
|
||||||
|
NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE = 0x9
|
||||||
|
NL_POLICY_TYPE_ATTR_BITFIELD32_MASK = 0xa
|
||||||
|
NL_POLICY_TYPE_ATTR_PAD = 0xb
|
||||||
|
NL_POLICY_TYPE_ATTR_MASK = 0xc
|
||||||
|
NL_POLICY_TYPE_ATTR_MAX = 0xc
|
||||||
|
)
|
||||||
|
12
vendor/gopkg.in/ini.v1/.editorconfig
generated
vendored
Normal file
12
vendor/gopkg.in/ini.v1/.editorconfig
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# http://editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*_test.go]
|
||||||
|
trim_trailing_whitespace = false
|
1
vendor/gopkg.in/ini.v1/.gitignore
generated
vendored
1
vendor/gopkg.in/ini.v1/.gitignore
generated
vendored
@ -4,3 +4,4 @@ ini.sublime-workspace
|
|||||||
testdata/conf_reflect.ini
|
testdata/conf_reflect.ini
|
||||||
.idea
|
.idea
|
||||||
/.vscode
|
/.vscode
|
||||||
|
.DS_Store
|
||||||
|
23
vendor/gopkg.in/ini.v1/file.go
generated
vendored
23
vendor/gopkg.in/ini.v1/file.go
generated
vendored
@ -442,16 +442,16 @@ func (f *File) writeToBuffer(indent string) (*bytes.Buffer, error) {
|
|||||||
kname = `"""` + kname + `"""`
|
kname = `"""` + kname + `"""`
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, val := range key.ValueWithShadows() {
|
writeKeyValue := func(val string) (bool, error) {
|
||||||
if _, err := buf.WriteString(kname); err != nil {
|
if _, err := buf.WriteString(kname); err != nil {
|
||||||
return nil, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if key.isBooleanType {
|
if key.isBooleanType {
|
||||||
if kname != sec.keyList[len(sec.keyList)-1] {
|
if kname != sec.keyList[len(sec.keyList)-1] {
|
||||||
buf.WriteString(LineBreak)
|
buf.WriteString(LineBreak)
|
||||||
}
|
}
|
||||||
continue KeyList
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write out alignment spaces before "=" sign
|
// Write out alignment spaces before "=" sign
|
||||||
@ -468,10 +468,27 @@ func (f *File) writeToBuffer(indent string) (*bytes.Buffer, error) {
|
|||||||
val = `"` + val + `"`
|
val = `"` + val + `"`
|
||||||
}
|
}
|
||||||
if _, err := buf.WriteString(equalSign + val + LineBreak); err != nil {
|
if _, err := buf.WriteString(equalSign + val + LineBreak); err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
shadows := key.ValueWithShadows()
|
||||||
|
if len(shadows) == 0 {
|
||||||
|
if _, err := writeKeyValue(""); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, val := range shadows {
|
||||||
|
exitLoop, err := writeKeyValue(val)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
} else if exitLoop {
|
||||||
|
continue KeyList
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for _, val := range key.nestedValues {
|
for _, val := range key.nestedValues {
|
||||||
if _, err := buf.WriteString(indent + " " + val + LineBreak); err != nil {
|
if _, err := buf.WriteString(indent + " " + val + LineBreak); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
19
vendor/gopkg.in/ini.v1/key.go
generated
vendored
19
vendor/gopkg.in/ini.v1/key.go
generated
vendored
@ -110,15 +110,24 @@ func (k *Key) Value() string {
|
|||||||
return k.value
|
return k.value
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValueWithShadows returns raw values of key and its shadows if any.
|
// ValueWithShadows returns raw values of key and its shadows if any. Shadow
|
||||||
|
// keys with empty values are ignored from the returned list.
|
||||||
func (k *Key) ValueWithShadows() []string {
|
func (k *Key) ValueWithShadows() []string {
|
||||||
if len(k.shadows) == 0 {
|
if len(k.shadows) == 0 {
|
||||||
|
if k.value == "" {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
return []string{k.value}
|
return []string{k.value}
|
||||||
}
|
}
|
||||||
vals := make([]string, len(k.shadows)+1)
|
|
||||||
vals[0] = k.value
|
vals := make([]string, 0, len(k.shadows)+1)
|
||||||
for i := range k.shadows {
|
if k.value != "" {
|
||||||
vals[i+1] = k.shadows[i].value
|
vals = append(vals, k.value)
|
||||||
|
}
|
||||||
|
for _, s := range k.shadows {
|
||||||
|
if s.value != "" {
|
||||||
|
vals = append(vals, s.value)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return vals
|
return vals
|
||||||
}
|
}
|
||||||
|
15
vendor/modules.txt
vendored
15
vendor/modules.txt
vendored
@ -1,4 +1,4 @@
|
|||||||
# github.com/goccy/go-json v0.8.1
|
# github.com/goccy/go-json v0.9.4
|
||||||
## explicit; go 1.12
|
## explicit; go 1.12
|
||||||
github.com/goccy/go-json
|
github.com/goccy/go-json
|
||||||
github.com/goccy/go-json/internal/decoder
|
github.com/goccy/go-json/internal/decoder
|
||||||
@ -15,7 +15,7 @@ github.com/golang/snappy
|
|||||||
# github.com/json-iterator/go v1.1.12
|
# github.com/json-iterator/go v1.1.12
|
||||||
## explicit; go 1.12
|
## explicit; go 1.12
|
||||||
github.com/json-iterator/go
|
github.com/json-iterator/go
|
||||||
# github.com/labstack/echo/v4 v4.6.1
|
# github.com/labstack/echo/v4 v4.6.3
|
||||||
## explicit; go 1.15
|
## explicit; go 1.15
|
||||||
github.com/labstack/echo/v4
|
github.com/labstack/echo/v4
|
||||||
# github.com/labstack/gommon v0.3.1
|
# github.com/labstack/gommon v0.3.1
|
||||||
@ -43,9 +43,6 @@ github.com/modern-go/reflect2
|
|||||||
## explicit; go 1.15
|
## explicit; go 1.15
|
||||||
# github.com/onsi/gomega v1.14.0
|
# github.com/onsi/gomega v1.14.0
|
||||||
## explicit; go 1.14
|
## explicit; go 1.14
|
||||||
# github.com/robfig/cron v1.2.0
|
|
||||||
## explicit
|
|
||||||
github.com/robfig/cron
|
|
||||||
# github.com/syndtr/goleveldb v1.0.0
|
# github.com/syndtr/goleveldb v1.0.0
|
||||||
## explicit
|
## explicit
|
||||||
github.com/syndtr/goleveldb/leveldb
|
github.com/syndtr/goleveldb/leveldb
|
||||||
@ -66,18 +63,18 @@ github.com/valyala/bytebufferpool
|
|||||||
# github.com/valyala/fasttemplate v1.2.1
|
# github.com/valyala/fasttemplate v1.2.1
|
||||||
## explicit; go 1.12
|
## explicit; go 1.12
|
||||||
github.com/valyala/fasttemplate
|
github.com/valyala/fasttemplate
|
||||||
# golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b
|
# golang.org/x/crypto v0.0.0-20220214200702-86341886e292
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
golang.org/x/crypto/acme
|
golang.org/x/crypto/acme
|
||||||
golang.org/x/crypto/acme/autocert
|
golang.org/x/crypto/acme/autocert
|
||||||
# golang.org/x/net v0.0.0-20211209124913-491a49abca63
|
# golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
golang.org/x/net/http/httpguts
|
golang.org/x/net/http/httpguts
|
||||||
golang.org/x/net/http2
|
golang.org/x/net/http2
|
||||||
golang.org/x/net/http2/h2c
|
golang.org/x/net/http2/h2c
|
||||||
golang.org/x/net/http2/hpack
|
golang.org/x/net/http2/hpack
|
||||||
golang.org/x/net/idna
|
golang.org/x/net/idna
|
||||||
# golang.org/x/sys v0.0.0-20211210111614-af8b64212486
|
# golang.org/x/sys v0.0.0-20220209214540-3681064d5158
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
golang.org/x/sys/internal/unsafeheader
|
golang.org/x/sys/internal/unsafeheader
|
||||||
golang.org/x/sys/unix
|
golang.org/x/sys/unix
|
||||||
@ -87,7 +84,7 @@ golang.org/x/text/secure/bidirule
|
|||||||
golang.org/x/text/transform
|
golang.org/x/text/transform
|
||||||
golang.org/x/text/unicode/bidi
|
golang.org/x/text/unicode/bidi
|
||||||
golang.org/x/text/unicode/norm
|
golang.org/x/text/unicode/norm
|
||||||
# gopkg.in/ini.v1 v1.66.2
|
# gopkg.in/ini.v1 v1.66.4
|
||||||
## explicit
|
## explicit
|
||||||
gopkg.in/ini.v1
|
gopkg.in/ini.v1
|
||||||
# xorm.io/builder v0.3.9
|
# xorm.io/builder v0.3.9
|
||||||
|
Loading…
Reference in New Issue
Block a user