02. 共通きょうつうデータ契約けいやく
atomic pointerを使つかえるnative/Wasmでは、SourceAdmissionが受入済うけいれずみの不変ふへんsnapshot storageを操作内そうさないだけで所有しょゆうし、索引化さくいんかできる。同おなじstorageの再受入さいうけいれには既存きそんの証明しょうめいを再利用さいりようし、独立どくりつdecodeのstorageにはsource/revision/digest/URIとSourceBytesの検査けんさを行おこなう。所有参照しょゆうさんしょうを保持ほじして、addressの再利用さいりようを防ふせぐ。内部ないぶaddressをwire・identity・出力しゅつりょくへ含ふくめてはならない。索引さくいんのWorkには要素数ようそすうによる探索たんさく・shiftの上界じょうかいを事前計上じぜんけいじょうし、allocatorの配置はいちによるUsageの差さを防ふせぐ。別べつのSourceAdmissionや非ひatomic targetへ、この証明しょうめいを引ひき継つがない。
方針ほうしん
source、種類しゅるい、構造こうぞう、意味いみ、解析結果かいせきけっかの出自しゅつじを、独立どくりつに保持ほじする。エラーやeditor結果けっかを、文字列もじれつから再解析さいかいせきしない。
1. SourceとRange
SourceId はhostが与あたえる、空からでないopaque TextのIDである。Revision は、そのsourceの版はんを表あらわす。SnapshotId = (SourceId, Revision, contentDigest) はnativeとwireで同おなじ同一性どういつせいを持もち、wire record名めいはSourceRefとする。SourceSnapshotはUTF-8の不変ふへんbyte列れつと、locatorとしてのURIを別べつに持もつ。ファイルのほか、メモリ文書ぶんしょや生成文書せいせいぶんしょも許可きょかする。同おなじURIを持もつ独立どくりつした文書ぶんしょも、異ことなるSourceIdで区別くべつする。coreは乱数らんすう・時計とけい・pointerからIDを生成せいせいしない。
SourceContentはid:SourceRef、uri:Text、utf8:Textを持もつ。受信時じゅしんじには元もとのUTF-8 byte列れつのSHA-256をid.digestと照合しょうごうする。SourceBundleはsourcesの列れつを持もつ。同おなじSourceId/revisionに異ことなる内容ないよう・digest・URIを割わり当あてる入力にゅうりょくと、重複じゅうふくするsnapshot宣言せんげんを拒否きょひする。SourceStoreへの同一どういつsnapshotの再参照さいさんしょうは、既存きそんの不変値ふへんちを指さす。文書ぶんしょを新あたらしいrevisionへ自動更新じどうこうしんしてはならない。URIの変更へんこうは、新あたらしいrevisionとして明示めいじする。
Rustのnative SourceSnapshotは、pointer atomicを使つかえるtargetではidentity・URI・本文ほんぶんをまとめた非公開ひこうかいの共有不変きょうゆうふへんstorageclone間かんで内容ないようを変更へんこうせず共有きょうゆうする格納先かくのうさきを使つかう。これらをcloneごとに複製ふくせいしない。同おなじ共有きょうゆうstorageなら、三みっつの値あたいがすべて同おなじであると保証ほしょうできる。別べつstorageのidentity・URI・本文ほんぶんは、値あたいで比較ひかくする。pointer atomicを持もたないalloc-only targetでは所有しょゆうStringを複製ふくせいし、Send/Syncの性質せいしつを不用意ふよういに変更へんこうしない。この内部表現ないぶひょうげんをwireへ露出ろしゅつさせず、NDFの受信じゅしんでは全文ぜんぶんとdigestを改あらためて検査けんさする。編集へんしゅうでは新あたらしいsnapshotを構築こうちくし、共有元きょうゆうもとを変更へんこうしない。
共有きょうゆうstorageの初回確保しょかいかくほと編集へんしゅうによる新規確保しんきかくほは、AllocationUnitsへ計上けいじょうする。共有きょうゆうstorageを使つかうtargetのnative cloneでは、snapshot slotを計上けいじょうする。非ひatomic targetでは、identity・URI・本文ほんぶんの複製費用ふくせいひようも計上けいじょうする。実じつコピーのclone_with_budgetとCopyPurpose::Cloneは、共有きょうゆうstorageの内容ないようを走査そうさしない。一方いっぽう、外部がいぶcontinuationの比較前ひかくまえに使つかうcharge_cloneとCopyPurpose::Compareは、metadataと本文長ほんぶんちょうを含ふくむ保守的ほしゅてきな上限じょうげんを維持いじする。二ふたつのsnapshotを直接照合ちょくせつしょうごうするeq_with_budgetは、同おなじ不変ふへんstorageと確認かくにんできる場合ばあいだけ内容比較ないようひかくを省略しょうりゃくする。別べつdecodeのstorageには、比較前ひかくまえに課金かきんする。SpanのSourceId、診断しんだん、Originなど、snapshot以外いがいの所有値しょゆうちの複製費用ふくせいひようは引ひき続つづき計上けいじょうする。source storeへの挿入そうにゅうは別べつの操作そうさとして、索引比較さくいんひかく・重複照合じゅうふくしょうごう・成長費用せいちょうひようを計上けいじょうする。この最適化さいてきかによって、SourceBytesの入場にゅうじょう、停止理由ていしりゆうの保持ほじ、受信境界じゅしんきょうかいの検査けんさが免除めんじょされるわけではない。
Span = (SnapshotId, start:u64, end:u64) とする。構築時こうちくじに、半開区間はんかいくかん [start,end) が 0 <= start <= end <= source.len を満みたし、UTF-8 scalar境界きょうかいにあることを検査けんさする。挿入位置そうにゅういちには空区間くうくかんを使つかえる。空区間くうくかんの左ひだりまたは右みぎへのaffinityは、必要ひつような操作そうさで別べつに持もつ。行ぎょう・列れつ・画面幅がめんはばをSpanへ保存ほぞんしない。
CRLFは元もとの2byteを維持いじする。LineIndexでは、LF、CRLF、CRをそれぞれ一ひとつの改行かいぎょうとして扱あつかう。BOMは先頭せんとうだけのtriviaとして記録きろくする。勝手かってに除去じょきょして、以後いごのoffsetをずらしてはならない。不正ふせいUTF-8はSourceDecodeFailureとし、文字置換もじちかんで位置いちを捏造ねつぞうしない。診断しんだん・query・編集へんしゅうは、必かならずsnapshotを指定していする。最新さいしんrevision以外いがいの結果けっかを、単たんにoffsetを保たもったまま最新文書さいしんぶんしょへ適用てきようしない。
SourceStore.applyは同おなじ操作そうさのBudgetとSourceAdmissionを受うけ、編集元へんしゅうもとと生成せいせいsnapshotを一度いちどずつSourceBytesへ計上けいじょうする。全削除ぜんさくじょで結果けっかが空からでも、元もとsnapshotの入場にゅうじょうを省略しょうりゃくしない。editの並替ならびかえ、snapshotの探索たんさくと比較ひかく、期待きたいdigestと出力しゅつりょくdigestの計算けいさん、結果けっか・locator・返却へんきゃくIDのコピーには、処理前しょりまえにWork/AllocationUnitsを課かす。並替ならびかえではborrowed参照さんしょうだけを動うごかし、SourceIdをsort keyとして無計上むけいじょうで複製ふくせいしない。
全編集ぜんへんしゅうの前提ぜんていと生成せいせいidentity、全出力ぜんしゅつりょくと返却へんきゃくIDを準備じゅんびしてから、生成せいせいsnapshotのadmissionとSourceStoreを同時どうじに確定かくていする。後半こうはんの検査失敗けんさしっぱいで一部いちぶsourceのrevisionだけを進すすめず、未公開みこうかいの生成せいせいIDも予約状態よやくじょうたいとして残のこさない。既存入力きそんにゅうりょくのadmissionと、消費済しょうひずみのWork/Allocation/SourceBytesは戻もどさない。意味検査いみけんさの失敗後しっぱいごは、同おなじ操作そうさで訂正ていせいして再試行さいしこうできる。予算停止後よさんていしごは同おなじBudgetの停止理由ていしりゆうを保持ほじし、hostが別操作べつそうさのBudget/SourceAdmissionを明示めいじした場合ばあいだけ再試行さいしこうできる。返却へんきゃくIDは、SourceId順じゅんに並ならべる。
2. schemaとkind
SchemaRef = (packageName, revision, digest)、KindRef = (SchemaRef, LocalKindId) とする。LocalKindIdとfieldの並ならびは、package schemaで定義ていぎする。Word/String/Variable/Functionなどを、共通きょうつうの閉とじたTokenKindとして置おかない。
共通きょうつうの型言語かたげんごは、Unit / Bool / Natural / Integer / Rational / Text / Bytes / List<T> / Option<T> / Record / Variant / Referenceである。全ぜんRecord/Variantのfieldとvariantを、登録済とうろくずみschemaで検査けんさする。domain内部ないぶでは、対応たいおうするRustのstruct/enumを使つかう。種類しゅるいと表示ひょうじclassは独立どくりつしている。表示ひょうじclassは、拡張可能かくちょうかのうなIDとfallback roleを持もつ。共通きょうつうfallbackはcontent、marker、delimiter、name、quantity、annotationであり、構文こうぶんの意味分類いみぶんるいではない。
3. Tokenと構文こうぶん
Tokenはkind、head span、payload、内部ないぶview、triviaへの関連かんれんを持もつ。arityは別べつのHeadShapeから取得しゅとくする。SentenceLiteral内部ないぶのviewを、prefix childrenへ追加ついかしない。HeadShape = {arity, arguments, transitionRecipe} とし、argumentsの数かずをarityに一致いっちさせる。引数ひきすうごとのcontext recipeは既読きどくの子こを参照さんしょうできるが、headのarityは変更へんこうできない。
Parsed nodeはkind、head span、enclosing source cover、子こNodeId列れつ、opaque payloadへの参照さんしょう、OriginIdを持もつ。通常つうじょうのsource nodeのchildrenは、同一どういつsource上じょうで重複じゅうふくしない順序じゅんじょを持もつ。生成せいせいnodeはOrigin graphを使つかい、存在そんざいしない連続れんぞくsource範囲はんいを作つくらない。token/trivia/sourceのlossless保存ほぞんにより、元もとのソースを再現さいげんできる。意味正規形いみせいきけいのprinterによるroundtripと、元もとsourceをそのまま出だすlossless roundtripは、異ことなる操作そうさである。
ForeignClosureは、単体たんたいで取とり出だしたForeignSyntaxと、そのfieldのownerから選択せんたくしたEnvironmentEntry、ownerOrigins、ownerSources、ownerSourceMapsを持もつ。ForeignSyntax.environmentはowner環境表かんきょうひょうの局所参照きょくしょさんしょうであり、同おなじIDのguest環境かんきょうへ解決かいけつしない。EnvironmentBinding.originもownerOriginsへ解決かいけつし、guestのOriginRefと同一視どういつししない。ownerの構文こうぶんnode全体ぜんたいを、閉包へいほうへ複製ふくせいしない。
この形式けいしきでは、ownerのOrigin列全体れつぜんたいを元もとの順序じゅんじょ・IDで保持ほじする。環境かんきょうのcanonical digestはOriginRefの数値すうちを含ふくむ。そのため、origin列れつを並ならべ替かえたり、部分列ぶぶんれつへ再番号化さいばんごうかしたままdigestを保存ほぞんしてはならない。ownerとguestは、それぞれが宣言せんげんしたsourcesだけでOrigin/map/Spanを解決かいけつする。相手あいての表ひょうやambient storeで欠損けっそんを補おぎなわない。表ひょうを跨またぐ同一どういつsnapshotの共有きょうゆうは許可きょかするが、同一表どういつひょうの重複じゅうふくやidentity/URIの矛盾むじゅんは拒否きょひする。
環境中かんきょうちゅうの名前空間契約なまえくうかんけいやくは、wireのEnvironmentNamespaceRef(schema,name)である。FactSet中ちゅうのNamespaceRef(value:U64)とは異ことなる型かたとして扱あつかう。Rustでは、前者ぜんしゃをsyntax::NamespaceRef、後者こうしゃをfacts::NamespaceRefとして区別くべつする。旧きゅうEnvironmentBindingのwire参照さんしょうが両者りょうしゃを混同こんどうし、非ひempty bindingをFieldCountで拒否きょひしていた不整合ふせいごうは、この明示めいじしたdescriptorへ訂正ていせいする(R046)。
4. 内部ないぶview
ViewElement = {kind, span, fields, roles, relations} とする。一ひとつのtokenに、複数ふくすうのViewElementが対応たいおうしてよい。子こは親おやの範囲はんいに含ふくめるが、変換後へんかんごのviewはSourceMapを介かいした別べつsnapshot上じょうに置おく。外側そとがわparserはViewElementの木きを歩あるいて構文こうぶんを決きめない。
SyntaxBundleはsourceMapsを所有しょゆうし、その全端点ぜんたんてんを同おなじbundleのsourcesで解決かいけつする。foreignのmapはguest bundleに局所きょくしょであり、hostのtableで不足ふそくを補おぎなわない。map列れつは宣言順せんげんじゅんを保存ほぞんし、nodeの再採番さいさいばんから独立どくりつさせる。Tokenの各かくviewとViewElementの各かく子こには、直接包含ちょくせつほうがんか、検査済けんさずみmapによる包含ほうがんを要求ようきゅうする。childの各かくbyteからすべての逆経路ぎゃくけいろをたどり、parent内ないへ帰着きちゃくすることを検査けんさする。空くうspanでは、挿入そうにゅうanchorを調しらべる。Exactはbyte displacement、Transformedは元範囲もとはんいの全点ぜんてんを対応たいおうさせる。対応たいおうが欠かける場合ばあいや、一部いちぶでもparent外がいの終端しゅうたんがある場合ばあいには、Coverを返かえす。parent内ないへ到達とうたつした後あとの、さらに古ふるい生成元せいせいもとは、今回こんかいのtokenへの帰属判定きぞくはんていに含ふくめない。単たんに一ひとつのmap経路けいろが存在そんざいするだけでは受理じゅりしない。全経路ぜんけいろの検査けんさにも共有きょうゆうWork/Depth/Nodes/Allocation予算よさんを使つかい、超過ちょうかはStoppedとする。
readerが内部ないぶviewを公開こうかいしない場合ばあいにも、token全体ぜんたいの位置いちは必須ひっすである。その場合ばあい、内部ないぶの詳細しょうさいなeditor機能きのうが利用可能りようかのうであると広告こうこくしない。
5. Origin graph
Origin = Direct(Span) | Composite(List<OriginId>) | Generated(operation, callsite, inputs) | Synthetic(reason, anchor) とする。脱出列だっしゅつれつをdecodeした文字列もじれつ、macro生成物せいせいぶつ、回路かいろflatten、数式簡約すうしきかんやくには、多対多たたいたの対応たいおうがあり得うる。SourceMap は区間同士くかんどうしの関係かんけいを表あらわし、単たんなる定数ていすうoffsetに限定げんていしない。mapの循環じゅんかんは拒否きょひする。
診断しんだんのprimary位置いちは、問題もんだいの直接入力ちょくせつにゅうりょくへ正確せいかくに対応たいおうする範囲はんいを優先ゆうせんする。生成物せいせいぶつに対応たいおうがなければ、生成呼出せいせいよびだし箇所かしょをprimary、template/argumentをrelatedとする。sourceがなければ位置いちなしのglobal診断しんだんとし、0行ぎょう0列れつへ仮置かりおきしない。renameの逆変換ぎゃくへんかんには、一意いちいかつ可逆かぎゃくな対応たいおうだけを許ゆるす。1対多たいた・合成ごうせい・正規化せいきかで戻もどせない箇所かしょの編集へんしゅうは、明確めいかくな理由りゆうを付つけて拒否きょひする。
6. 名前なまえ・関係かんけい
EntityId はsnapshot/analysis内ないの宣言同一性せんげんどういつせいであり、綴つづりのhashだけにしない。Occurrence は、定義ていぎ・参照さんしょうなどの役割やくわりとsource上じょうの位置いちを持もつ。ScopeId、名前空間なまえくうかん、親おやscope、export/import edgeは別べつに持もつ。参照結果さんしょうけっかは、Resolved(entity)、Unresolved(name)、Ambiguous(candidates)、Deferred(requirements)のsum typeとする。definition jumpを単語検索たんごけんさくで代用だいようしない。DocのCorrespondsToは翻訳対応ほんやくたいおう、BindingReferenceは名前参照なまえさんしょう、Originは生成元せいせいもとを表あらわす。これらの異ことなる関係かんけいを、一ひとつの「同おなじsymbol」へ統合とうごうしない。
6.1. 共通きょうつうfactsと専用処理せんようしょりの変更範囲へんこうはんい
FactSetは明示めいじanalysisId、namespace、Scope/Entity/Occurrence、typed Relation、scope edge、source/Origin/SourceMapの所有しょゆうtableを持もつ。IDはanalysis内ないで一意いちいなU64であり、別べつanalysisやguestの同おなじ数値すうちを同一視どういつししない。namespaceはschema・name・policyと明示めいじroot scopeを持もつ。同おなじ名前空間契約なまえくうかんけいやくを、別べつarticle/moduleの別べつrootへ割わり当あてられる。EntityとOccurrenceのscopeは、そのrootの配下はいかに置おく。rootの親おやを暗黙あんもくに消けすことはしない。
Entityのdefinition/selectionはOptionであり、sourceのない意味宣言いみせんげんへ仮かりSpanを作つくらない。selectionを持もつときは、definitionの範囲内はんいないとする。Occurrenceはsource上じょうの位置いち、役割やくわり、解決結果かいけつけっかを保持ほじする。Resolved/Unresolved/Ambiguous/Deferredを区別くべつする。Ambiguousは異ことなる複数ふくすうEntityを、Deferredは空からでない型付かたつき要求列ようきゅうれつを持もつ。共通検査きょうつうけんさでは、参照先さんしょうさきの存在そんざい、名前なまえ・名前空間契約なまえくうかんけいやく、source範囲はんい、型かた、scope親おやの非循環ひじゅんかんを調しらべる。lexical探索たんさく・shadowing・importを経由けいゆする可視性かしせいが正ただしく計算けいさんされたことは、別べつのbinding/resolution検査けんさで確認かくにんする。共通きょうつうのCheckedFactSetだけでは、そこまで保証ほしょうしない。
専用せんようfacts処理しょりには、既存きそんFactSetとhostが発行はっこうしたFactAuthorityを渡わたす。authorityはcurrentScope、許可きょかnamespace、明示的めいじてきに書かき込こめる既存きそんdescendant scope、読込よみこみを許ゆるすimport先さきscope、更新こうしんを許ゆるす既存きそんOccurrence、Relationの明示めいじsource endpoint、ID予約範囲よやくはんいを固定こていする。新しんscopeは、currentScopeまたは今回作成こんかいさくせいしたscopeの子こに限かぎる。Entity/Occurrenceの追加ついか、import/export edge、既存きそんresolutionの更新こうしんは、各かく許可きょかscope/namespaceに限定げんていする。別べつarticle/module/guestのscopeを暗黙あんもくに更新こうしんしない。Relationのsourceも、許可きょかscopeの対象たいしょうか、hostが明示めいじしたendpointでなければならない。参照先さんしょうさきを知しっているだけでは、変更権限へんこうけんげんにならない。
FactDeltaは既存きそんIDを上書うわがきせず、予約よやくされた半開区間はんかいくかん[start,end)の内側うちがわへ追加ついかする。resolutionの更新こうしんには、別べつの列れつで既存きそんOccurrenceを指定していする。追加ついかsourceはrequestの宣言せんげんtableへ付加ふかし、追加ついかOriginのoriginBaseを既存きそんOrigin数すうに一致いっちさせる。新旧しんきゅうfactsのOriginRefは、この結合けつごうtableを指さす。namespace列れつや既存きそんscopeの親おやを書かき換かえる操作そうさではない。失敗時しっぱいじにsource/Originをhostのglobal storeへ先行せんこうcommitして、欠損けっそんを隠かくさない。受理前じゅりまえに消費しょうひしたusage/admissionは返却へんきゃくしない。
FactSet/Deltaのtyped wire入口いりぐちは、schema検査後けんさごに同おなじsource・ID・scope・authority検査けんさを行おこなう。FactSetのtable順じゅんを保存ほぞんし、IDを再採番さいさいばんしない。これは共通値きょうつうちの検査けんさ・交換契約こうかんけいやくである。T06の解決かいけつアルゴリズム、Custom binding callbackの実行じっこう、解析操作全体かいせきそうさぜんたいの完了かんりょうを意味いみしない。
7. 診断しんだんとevent
Diagnosticはcode、severity、stage、schema/provider、構造化こうぞうかargs、primaryのOption、related列れつ、fix列れつを持もつ。codeはschema所有しょゆうenumのIDとし、表示言語ひょうじげんごと文章ぶんしょうはrenderer/catalogが決きめる。Fixは、前提ぜんていsnapshotと非重複ひじゅうふくTextEdit列れつを持もつ。古ふるいsnapshotに自動適用じどうてきようせず、expected text/digestを検査けんさする。複数ふくすうsourceのfixは、一ひとつのtransactionとして返かえす。
一ひとつのFix内ないでは、各かくSourceIdの全ぜんeditが同おなじsnapshotを前提ぜんていとする。異ことなるrevisionを、同おなじsourceの編集へんしゅうtransactionへ混まぜない。この制約せいやくは、異ことなるSourceIdへの複数編集ふくすうへんしゅうや、primary/relatedによる履歴りれきsnapshotの参照さんしょうを禁止きんしするものではない。
EventはParseStarted/RuleTried/RuleCommitted/BindingResolved/OperationFinishedなどのschema所有しょゆうkind、operation path、必要ひつような範囲はんい、構造化こうぞうかpayloadを持もつ。domainログをすべて文字列もじれつにする必要ひつようはない。TraceLevelはOff/Summary/Detailedである。Offではeventを作つくらず、予算よさんも消費しょうひしない。上限じょうげんを超こえるevent追加ついかの最初さいしょの試行しこうでStopped(EventLimit)とし、先頭せんとうの許容件数きょようけんすうを保持ほじする。既存きそんeventの上書うわがきや、黙だまったCompleteは行おこなわない。
overflowはevent列れつの外そとにある traceOverflow: Option<TraceOverflow> へ、一度いちどだけ記録きろくする。TraceOverflow.droppedは、実際じっさいに追加ついかを試こころみて受理じゅりされなかった件数けんすうを表あらわし、通常つうじょうの即時停止そくじていしでは1となる。未実行みじっこうの将来しょうらいevent数すうを推定すいていしない。この報告ほうこくfieldにより、events上限じょうげんが0でも停止理由ていしりゆうと切捨きりすてを表あらわせる。既すでにcancelや別べつlimitで停止ていしした処理しょりが終了しゅうりょうeventを記録きろくしようとしても、先さきに確定かくていした停止理由ていしりゆうをEventLimitへ置おき換かえない。
backtrackingで取とり消けしたcandidateの診断しんだんやeditor factsを、成功結果せいこうけっかへ混入こんにゅうさせない。debug traceだけが、試行しこうの記録きろくを保持ほじできる。coreはclockやloggerを呼よばず、hostが時刻じこくと出力先しゅつりょくさきを付つける。
共通きょうつうReport検査けんさでは、登録済とうろくずみschemaと型付かたつきarguments/payload、primary/related/fix/eventの明示めいじsource参照さんしょうとUTF-8範囲はんい、Fix内ないの期待きたいdigest一致いっちと非重複ひじゅうふくを調しらべる。usageが正式件数せいしきけんすうを下回したまわらず、traceOverflow.droppedが正せいであることも検査けんさする。同おなじsnapshotの同一開始位置どういつかいしいちへの編集へんしゅうは、空範囲くうはんいの挿入そうにゅうも含ふくめて競合きょうごうとする。Report単独たんどくのcodecは、診断文面しんだんぶんめんの真偽しんぎ、domain固有こゆうcodeとargumentsの対応たいおう、外部がいぶproviderが申告しんこくした消費量しょうひりょうの真正性しんせいせいを証明しょうめいしない。操作入口そうさいりぐちは、別途保存べっとほぞんしたrequest・権限けんげん・usage履歴りれきへ結むすび付つける。Fixの適用時てきようじには、現在げんざいsnapshotとの一致いっちを再検査さいけんさする。既すでに受理じゅりしたReportを再検査さいけんさ・再掲さいけいしてもDiagnostics/Eventsの件数けんすうを再課金さいかきんしないが、検査けんさWorkと所有しょゆうコピー費用ひようは計上けいじょうする。Report用ようcodecへ渡わたすSourceStoreは、その操作そうさが明示めいじした宣言表せんげんひょうである。環境全体かんきょうぜんたいのstoreを暗黙あんもくに探索たんさくしない。
8. 予算よさんと結果けっか
LimitsはsourceBytes、work、depth、nodes、allocationUnits、outputBytes、diagnostics、eventsを持もつ。全再帰ぜんさいきで共有きょうゆうし、言語げんごを切きり替かえてリセットしない。論理的ろんりてきなlimit検査けんさと、OS allocatorの物理ぶつりOOMは同一どういつではない。trusted native codeの無限むげんloopを、呼出よびだし後ごの検査けんさで停止ていしできるとは主張しゅちょうしない。
Usageは同おなじfield名めいを持もつ別べつrecordであり、許容最大値きょようさいだいちではなく、実際じっさいの累積消費るいせきしょうひを表あらわす。depthだけは最大同時再帰深さいだいどうじさいきふかさとし、現在げんざいの深ふかさは別べつに管理かんりする。解放かいほうや巻戻まきもどしで、消費済しょうひずみのwork/nodes/allocationUnitsなどを返却へんきゃくしない。整数加算せいすうかさんのoverflowは、該当がいとうlimitの超過ちょうかとして拒否きょひする。超過ちょうかした試行しこうを成功せいこうした消費しょうひへ計上けいじょうして、Usageを上限じょうげんより大おおきくしない。停止ていししたbudgetを、再開さいかい・外部操作がいぶそうさ・別言語べつげんごへの切替きりかえで新品しんぴんに取とり替かえない。
sourceBytesは、一ひとつの共有操作きょうゆうそうさcontextへ受うけ入いれる各かくsnapshotの元もとbyte長ちょうを、一度いちどずつ計上けいじょうする。参照さんしょうをたどるたびに、同おなじsnapshotを再計上さいけいじょうしない。ただし、別べつのsnapshot生成せいせい、変更後へんこうごのsource、decode後ごに作つくるsourceは、別入力べつにゅうりょくとして計上けいじょうする。snapshotの構築こうちくだけを繰くり返かえす低水準ていすいじゅんAPIと、受入済うけいれずみbundleの参照さんしょうを区別くべつする。
sourceBytesを超こえる入力にゅうりょくは、文字数もじすうではなく元もとのUTF-8 byte数すうで判定はんていし、Stopped(SourceLimit)を返かえす。元もとbyte列れつを受うけ取とるsnapshot constructorは、この長ながさをUTF-8 decodeより前まえに検査けんさする。NDF受信じゅしんでは、CBOR構造こうぞう・TextのUTF-8・schemaの検査けんさを済すませて初はじめて埋込うめこみsourceを識別しきべつできるため、その段階だんかいの失敗しっぱいが先さきになる。既すでに停止ていししたbudgetの理由りゆうを、後続こうぞくの検査けんさで置おき換かえない。
SourceAdmissionは操作共通そうさきょうつうの資源計上台帳しげんけいじょうだいちょうであり、公開こうかいされたSourceStoreではない。bundleの後半こうはんで失敗しっぱいしても、前半ぜんはんで受うけ入いれたsnapshotの使用量しようりょうとidentity照合情報しょうごうじょうほうを取とり消けさない。同おなじcontextで再試行さいしこうしても同おなじsnapshotを二重計上にじゅうけいじょうせず、locatorや内容ないようの衝突しょうとつは拒否きょひする。typed bundleの返却へんきゃくとSourceStoreへの反映はんえいは、全体ぜんたいの検査成功後けんさせいこうごに行おこなう。取とり消けした候補こうほのsourceを、解析結果かいせきけっかへ混入こんにゅうさせない。
Rust実装じっそうのSourceStoreとSourceAdmissionは、SourceId・revisionをキーとする非公開索引ひこうかいさくいんを使つかう。索引さくいんの一致いっちだけでsnapshotの一致いっちとはせず、digest・locatorと必要ひつような内容比較ないようひかくを維持いじする。sourceの公開列こうかいれつは挿入順そうにゅうじゅんのままとし、索引さくいんの比較ひかく、追加領域ついかりょういき、要素移動ようそいどうを予算よさんへ計上けいじょうする。複数ふくすうsourceの編集へんしゅうでは、source列れつ・入場台帳にゅうじょうだいちょう・両索引りょうさくいんの準備じゅんびをすべて済すませてから反映はんえいする。空からの索引さくいんに対たいする検索けんさくも、取消とりけしを無視むししない。Reportの補助ほじょsource索引さくいんとSourceMapのgraph索引さくいんも内部実装ないぶじっそうであり、wireの順序じゅんじょや位置いち・循環じゅんかんの意味いみを変更へんこうしない。
操作結果そうさけっかは、Complete(value)、Invalid(partial)、Stopped(reason, partial)を区別くべつする。すべての結果けっかに、diagnostics、events、usage、traceOverflowを持もつReportを付つける。nativeでは共通きょうつうReportをまとめ、wireではOperationReplyの定義順ていぎじゅんにfieldを展開てんかいする。providerのAwaitも、同おなじ報告ほうこくと累積予算るいせきよさんを保持ほじする。partialをchecked値ちとして扱あつかわない。diagnostics上限じょうげんの超過ちょうかはStopped(DiagnosticLimit)とし、上限じょうげん0では架空かくうの診断しんだんを追加ついかせず、StopReasonで伝つたえる。入力にゅうりょくの問題もんだい、未解決みかいけつの要求ようきゅう、未対応みたいおうの操作そうさ、上限超過じょうげんちょうか、provider違反いはんは、別べつcodeで返かえす。