@shapeshift-labs/frontier-lang-parser 0.3.71 → 0.3.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/metadata.js +10 -0
- package/dist/resource-graph.js +66 -6
- package/dist/source-syntax-row-config.js +7 -2
- package/package.json +1 -1
package/dist/metadata.js
CHANGED
|
@@ -264,6 +264,11 @@ function mergeResourceGraphBlocks(blocks) {
|
|
|
264
264
|
lifetimeRelationIds: blocks.flatMap((block) => ids(block.graph?.lifetimeRelations)),
|
|
265
265
|
borrowScopeIds: blocks.flatMap((block) => ids(block.graph?.borrowScopes)),
|
|
266
266
|
unsafeBoundaryIds: blocks.flatMap((block) => ids(block.graph?.unsafeBoundaries)),
|
|
267
|
+
memoryRegionIds: blocks.flatMap((block) => ids(block.graph?.memoryRegions)),
|
|
268
|
+
dataLayoutIds: blocks.flatMap((block) => ids(block.graph?.dataLayouts)),
|
|
269
|
+
pointerEdgeIds: blocks.flatMap((block) => ids(block.graph?.pointerEdges)),
|
|
270
|
+
memoryAccessIds: blocks.flatMap((block) => ids(block.graph?.memoryAccesses)),
|
|
271
|
+
abiBoundaryIds: blocks.flatMap((block) => ids(block.graph?.abiBoundaries)),
|
|
267
272
|
conflictIds: blocks.flatMap((block) => ids(block.graph?.conflicts)),
|
|
268
273
|
proofObligationIds: blocks.flatMap((block) => ids(block.graph?.proofObligations)),
|
|
269
274
|
summary: {
|
|
@@ -280,6 +285,11 @@ function mergeResourceGraphBlocks(blocks) {
|
|
|
280
285
|
lifetimeRelationCount: sum(blocks, 'lifetimeRelations'),
|
|
281
286
|
borrowScopeCount: sum(blocks, 'borrowScopes'),
|
|
282
287
|
unsafeBoundaryCount: sum(blocks, 'unsafeBoundaries'),
|
|
288
|
+
memoryRegionCount: sum(blocks, 'memoryRegions'),
|
|
289
|
+
dataLayoutCount: sum(blocks, 'dataLayouts'),
|
|
290
|
+
pointerEdgeCount: sum(blocks, 'pointerEdges'),
|
|
291
|
+
memoryAccessCount: sum(blocks, 'memoryAccesses'),
|
|
292
|
+
abiBoundaryCount: sum(blocks, 'abiBoundaries'),
|
|
283
293
|
conflictCount: sum(blocks, 'conflicts'),
|
|
284
294
|
proofObligationCount: sum(blocks, 'proofObligations'),
|
|
285
295
|
unsafeBoundariesWithoutProof: sum(blocks, 'unsafeBoundariesWithoutProof')
|
package/dist/resource-graph.js
CHANGED
|
@@ -12,6 +12,11 @@ const GROUPS = {
|
|
|
12
12
|
lifetimeRelation: 'lifetimeRelations',
|
|
13
13
|
borrowScope: 'borrowScopes',
|
|
14
14
|
unsafeBoundary: 'unsafeBoundaries',
|
|
15
|
+
memoryRegion: 'memoryRegions',
|
|
16
|
+
dataLayout: 'dataLayouts',
|
|
17
|
+
pointerEdge: 'pointerEdges',
|
|
18
|
+
memoryAccess: 'memoryAccesses',
|
|
19
|
+
abiBoundary: 'abiBoundaries',
|
|
15
20
|
conflict: 'conflicts',
|
|
16
21
|
proofObligation: 'proofObligations'
|
|
17
22
|
};
|
|
@@ -41,6 +46,11 @@ export function parseResourceGraphBlock(block) {
|
|
|
41
46
|
borrowScopes: [],
|
|
42
47
|
borrowScopeRegions: [],
|
|
43
48
|
unsafeBoundaries: [],
|
|
49
|
+
memoryRegions: [],
|
|
50
|
+
dataLayouts: [],
|
|
51
|
+
pointerEdges: [],
|
|
52
|
+
memoryAccesses: [],
|
|
53
|
+
abiBoundaries: [],
|
|
44
54
|
conflicts: [],
|
|
45
55
|
proofObligations: [],
|
|
46
56
|
parser: { status: 'authored', errors: rowIdentity.errors },
|
|
@@ -54,14 +64,14 @@ export function parseResourceGraphBlock(block) {
|
|
|
54
64
|
metadata: { name }
|
|
55
65
|
};
|
|
56
66
|
|
|
57
|
-
for (const
|
|
58
|
-
const line =
|
|
67
|
+
for (const authoredLine of readAuthoredLines(block)) {
|
|
68
|
+
const line = authoredLine.text;
|
|
59
69
|
if (!line || line.startsWith('#') || isGraphPropertyLine(line)) continue;
|
|
60
70
|
const match = /^([A-Za-z_$][\w$-]*)\s+([A-Za-z_$][\w$-]*)(.*)$/.exec(line);
|
|
61
71
|
if (!match) continue;
|
|
62
72
|
const [, rowKind, rowName, rest] = match;
|
|
63
73
|
const normalized = normalizeRowKind(rowKind);
|
|
64
|
-
const record = parseResourceRecord(normalized, rowName, rest, graph);
|
|
74
|
+
const record = parseResourceRecord(normalized, rowName, rest, graph, authoredLine);
|
|
65
75
|
const group = GROUPS[normalized];
|
|
66
76
|
if (record && group) rowIdentity.push(graph[group], record, { rowKind, normalizedRowKind: normalized, name: rowName });
|
|
67
77
|
}
|
|
@@ -73,6 +83,7 @@ export function parseResourceGraphBlock(block) {
|
|
|
73
83
|
resourceIds: ids(graph.resources),
|
|
74
84
|
ownerIds: ids(graph.owners),
|
|
75
85
|
lifetimeRegionIds: ids(graph.lifetimeRegions),
|
|
86
|
+
lowLevelPrimitiveIds: ids([...graph.memoryRegions, ...graph.dataLayouts, ...graph.pointerEdges, ...graph.memoryAccesses, ...graph.abiBoundaries]),
|
|
76
87
|
sourcePaths: unique(allRecords(graph).map((record) => record.sourcePath)),
|
|
77
88
|
evidenceIds: unique([...graph.evidenceIds, ...allRecords(graph).flatMap((record) => record.evidenceIds ?? [])]),
|
|
78
89
|
blockerReasonCodes: unique(graph.conflicts.map((record) => record.reasonCode))
|
|
@@ -90,8 +101,8 @@ export function parseResourceGraphBlock(block) {
|
|
|
90
101
|
};
|
|
91
102
|
}
|
|
92
103
|
|
|
93
|
-
function parseResourceRecord(kind, name, text, graph) {
|
|
94
|
-
const common = commonRecord(kind, name, text, graph);
|
|
104
|
+
function parseResourceRecord(kind, name, text, graph, authoredLine = {}) {
|
|
105
|
+
const common = commonRecord(kind, name, text, graph, authoredLine);
|
|
95
106
|
if (kind === 'resource') return cleanRecord({ ...common, resourceKind: readInlineWord('resourceKind', text) ?? readInlineWord('kind', text) ?? name, ownerId: readInlineWord('owner', text) ?? readInlineWord('ownerId', text), ownerName: readInlineWord('ownerName', text) });
|
|
96
107
|
if (kind === 'owner') return cleanRecord({ ...common, ownerKind: readInlineWord('ownerKind', text) ?? readInlineWord('kind', text) ?? 'owner' });
|
|
97
108
|
if (kind === 'loan') return cleanRecord({ ...common, resourceId: readInlineWord('resource', text) ?? readInlineWord('resourceId', text), ownerId: readInlineWord('owner', text) ?? readInlineWord('ownerId', text), lifetimeRegionId: readInlineWord('lifetime', text) ?? readInlineWord('lifetimeRegion', text) ?? readInlineWord('lifetimeRegionId', text), mode: readInlineWord('mode', text) ?? 'unknown', access: readInlineWord('access', text) });
|
|
@@ -103,18 +114,31 @@ function parseResourceRecord(kind, name, text, graph) {
|
|
|
103
114
|
if (kind === 'lifetimeRelation') return cleanRecord({ ...common, relationKind: readInlineWord('relationKind', text) ?? readInlineWord('kind', text) ?? 'outlives', fromLifetimeId: readInlineWord('fromLifetime', text) ?? readInlineWord('fromLifetimeId', text) ?? readInlineWord('from', text), toLifetimeId: readInlineWord('toLifetime', text) ?? readInlineWord('toLifetimeId', text) ?? readInlineWord('to', text), from: readInlineWord('from', text), to: readInlineWord('to', text) });
|
|
104
115
|
if (kind === 'borrowScope') return cleanRecord({ ...common, scopeKind: readInlineWord('scopeKind', text) ?? readInlineWord('kind', text) ?? 'borrow-scope', constraintKind: readInlineWord('constraintKind', text), constraintKinds: readInlineList(text, 'constraint', 'constraints', 'constraintKind', 'constraintKinds') ?? [], ownershipKind: readInlineWord('ownershipKind', text), lifetimeKind: readInlineWord('lifetimeKind', text), controlFlowKind: readInlineWord('controlFlowKind', text), sourceControlFlowId: readInlineWord('sourceControlFlow', text) ?? readInlineWord('sourceControlFlowId', text), lifetimeRegionId: readInlineWord('lifetime', text) ?? readInlineWord('lifetimeRegion', text) ?? readInlineWord('lifetimeRegionId', text), resourceId: readInlineWord('resource', text) ?? readInlineWord('resourceId', text) });
|
|
105
116
|
if (kind === 'unsafeBoundary') return cleanRecord({ ...common, resourceId: readInlineWord('resource', text) ?? readInlineWord('resourceId', text), unsafeBoundary: true, proofStatus: readInlineWord('proofStatus', text) ?? readInlineWord('status', text) ?? 'missing', kind: readInlineWord('kind', text) });
|
|
117
|
+
if (kind === 'memoryRegion') return cleanRecord({ ...common, resourceId: readInlineWord('resource', text) ?? readInlineWord('resourceId', text), memoryKind: readInlineWord('memoryKind', text) ?? readInlineWord('kind', text) ?? name, regionKind: readInlineWord('regionKind', text), addressSpace: readInlineWord('addressSpace', text) ?? readInlineWord('space', text), address: readInlineWord('address', text) ?? readInlineWord('baseAddress', text), sizeBytes: readInlineNumber('sizeBytes', text) ?? readInlineNumber('size', text), alignmentBytes: readInlineNumber('alignmentBytes', text) ?? readInlineNumber('alignment', text), pointerWidth: readInlineNumber('pointerWidth', text), endian: readInlineWord('endian', text) ?? readInlineWord('endianness', text), volatile: readInlineFlag('volatile', text), atomic: readInlineFlag('atomic', text), shared: readInlineFlag('shared', text) });
|
|
118
|
+
if (kind === 'dataLayout') return cleanRecord({ ...common, resourceId: readInlineWord('resource', text) ?? readInlineWord('resourceId', text), typeId: readInlineWord('type', text) ?? readInlineWord('typeId', text), structId: readInlineWord('struct', text) ?? readInlineWord('structId', text), fieldId: readInlineWord('field', text) ?? readInlineWord('fieldId', text), bitfieldId: readInlineWord('bitfield', text) ?? readInlineWord('bitfieldId', text), layoutKind: readInlineWord('layoutKind', text) ?? readInlineWord('kind', text), repr: readInlineWord('repr', text), abi: readInlineWord('abi', text), endian: readInlineWord('endian', text) ?? readInlineWord('endianness', text), sizeBytes: readInlineNumber('sizeBytes', text) ?? readInlineNumber('size', text), alignmentBytes: readInlineNumber('alignmentBytes', text) ?? readInlineNumber('alignment', text), offsetBytes: readInlineNumber('offsetBytes', text) ?? readInlineNumber('offset', text), bitWidth: readInlineNumber('bitWidth', text) ?? readInlineNumber('width', text), fieldOrder: readInlineList(text, 'fieldOrder', 'fields'), constraintKinds: readInlineList(text, 'constraint', 'constraints', 'constraintKind', 'constraintKinds') });
|
|
119
|
+
if (kind === 'pointerEdge') return cleanRecord({ ...common, resourceId: readInlineWord('resource', text) ?? readInlineWord('resourceId', text), targetResourceId: readInlineWord('targetResource', text) ?? readInlineWord('targetResourceId', text) ?? readInlineWord('target', text), ownerId: readInlineWord('owner', text) ?? readInlineWord('ownerId', text), lifetimeRegionId: readInlineWord('lifetime', text) ?? readInlineWord('lifetimeRegion', text) ?? readInlineWord('lifetimeRegionId', text), pointerKind: readInlineWord('pointerKind', text) ?? readInlineWord('kind', text) ?? 'pointer', addressSpace: readInlineWord('addressSpace', text) ?? readInlineWord('space', text), pointerWidth: readInlineNumber('pointerWidth', text), aliasKind: readInlineWord('aliasKind', text), mode: readInlineWord('mode', text), provenance: readInlineWord('provenance', text), nullable: readInlineFlag('nullable', text), mutable: readInlineFlag('mutable', text) });
|
|
120
|
+
if (kind === 'memoryAccess') return cleanRecord({ ...common, resourceId: readInlineWord('resource', text) ?? readInlineWord('resourceId', text), accessKind: readInlineWord('accessKind', text) ?? readInlineWord('kind', text) ?? name, operationKind: readInlineWord('operation', text) ?? readInlineWord('operationKind', text), memoryOrder: readInlineWord('memoryOrder', text) ?? readInlineWord('ordering', text), lockId: readInlineWord('lock', text) ?? readInlineWord('lockId', text), synchronizationKey: readInlineWord('sync', text) ?? readInlineWord('synchronizationKey', text), reads: readInlineList(text, 'read', 'reads'), writes: readInlineList(text, 'write', 'writes'), volatile: readInlineFlag('volatile', text), atomic: readInlineFlag('atomic', text), proofStatus: readInlineWord('proofStatus', text) ?? readInlineWord('status', text) ?? 'missing' });
|
|
121
|
+
if (kind === 'abiBoundary') return cleanRecord({ ...common, resourceId: readInlineWord('resource', text) ?? readInlineWord('resourceId', text), callableId: readInlineWord('callable', text) ?? readInlineWord('callableId', text), functionId: readInlineWord('function', text) ?? readInlineWord('functionId', text), boundaryKind: readInlineWord('boundaryKind', text) ?? readInlineWord('kind', text) ?? 'abi-boundary', abi: readInlineWord('abi', text), abiKind: readInlineWord('abiKind', text), callingConvention: readInlineWord('callingConvention', text) ?? readInlineWord('convention', text), pointerWidth: readInlineNumber('pointerWidth', text), endian: readInlineWord('endian', text) ?? readInlineWord('endianness', text), ffiBoundary: readInlineWord('ffiBoundary', text), proofStatus: readInlineWord('proofStatus', text) ?? readInlineWord('status', text) ?? 'missing' });
|
|
106
122
|
if (kind === 'conflict') return cleanRecord({ ...common, resourceId: readInlineWord('resource', text) ?? readInlineWord('resourceId', text), ownerId: readInlineWord('owner', text) ?? readInlineWord('ownerId', text), loanId: readInlineWord('loan', text) ?? readInlineWord('loanId', text), aliasId: readInlineWord('alias', text) ?? readInlineWord('aliasId', text), unsafeBoundaryId: readInlineWord('unsafeBoundary', text) ?? readInlineWord('unsafeBoundaryId', text), reasonCode: readInlineWord('reasonCode', text), message: readInlineQuoted('message', text), status: readInlineWord('status', text) ?? 'open', severity: readInlineWord('severity', text) ?? 'error' });
|
|
107
123
|
if (kind === 'proofObligation') return cleanRecord({ ...common, resourceId: readInlineWord('resource', text) ?? readInlineWord('resourceId', text), conflictId: readInlineWord('conflict', text) ?? readInlineWord('conflictId', text), kind: readInlineWord('kind', text), status: readInlineWord('status', text) ?? 'open', statement: readInlineQuoted('statement', text) });
|
|
108
124
|
return undefined;
|
|
109
125
|
}
|
|
110
126
|
|
|
111
|
-
function commonRecord(kind, name, text, graph) {
|
|
127
|
+
function commonRecord(kind, name, text, graph, authoredLine = {}) {
|
|
112
128
|
return cleanRecord({
|
|
113
129
|
recordKind: recordKind(kind),
|
|
114
130
|
id: idFrom(text, `${recordPrefix(kind)}_${name}`),
|
|
115
131
|
name,
|
|
116
132
|
sourcePath: readInlineWord('sourcePath', text) ?? readInlineWord('path', text) ?? graph.sourcePath,
|
|
117
133
|
sourceHash: readInlineWord('sourceHash', text) ?? graph.sourceHash,
|
|
134
|
+
sourceSpan: authoredLine.sourceSpan,
|
|
135
|
+
authoredSourceSpan: authoredLine.sourceSpan,
|
|
136
|
+
sourceMapIds: readInlineList(text, 'sourceMap', 'sourceMaps', 'sourceMapId', 'sourceMapIds'),
|
|
137
|
+
sourceMapMappingIds: readInlineList(text, 'sourceMapMapping', 'sourceMapMappings', 'sourceMapMappingId', 'sourceMapMappingIds'),
|
|
138
|
+
proofEvidenceIds: readInlineList(text, 'proofEvidence', 'proofEvidenceId', 'proofEvidenceIds'),
|
|
139
|
+
proofObligationIds: readInlineList(text, 'proofObligation', 'proofObligations', 'proofObligationId', 'proofObligationIds', 'obligation', 'obligations'),
|
|
140
|
+
missingEvidence: readInlineList(text, 'missingEvidence'),
|
|
141
|
+
failClosed: readInlineFlag('failClosed', text),
|
|
118
142
|
evidenceIds: readInlineList(text, 'evidence', 'evidenceIds') ?? graph.evidenceIds,
|
|
119
143
|
metadata: { authoredName: name }
|
|
120
144
|
});
|
|
@@ -134,6 +158,11 @@ function summarize(graph) {
|
|
|
134
158
|
lifetimeRelations: graph.lifetimeRelations.length,
|
|
135
159
|
borrowScopes: graph.borrowScopes.length,
|
|
136
160
|
unsafeBoundaries: graph.unsafeBoundaries.length,
|
|
161
|
+
memoryRegions: graph.memoryRegions.length,
|
|
162
|
+
dataLayouts: graph.dataLayouts.length,
|
|
163
|
+
pointerEdges: graph.pointerEdges.length,
|
|
164
|
+
memoryAccesses: graph.memoryAccesses.length,
|
|
165
|
+
abiBoundaries: graph.abiBoundaries.length,
|
|
137
166
|
conflicts: graph.conflicts.length,
|
|
138
167
|
proofObligations: graph.proofObligations.length,
|
|
139
168
|
unsafeBoundariesWithoutProof: graph.unsafeBoundaries.filter((record) => record.proofStatus !== 'passed').length,
|
|
@@ -155,6 +184,11 @@ function allRecords(graph) {
|
|
|
155
184
|
...graph.lifetimeRelations,
|
|
156
185
|
...graph.borrowScopes,
|
|
157
186
|
...graph.unsafeBoundaries,
|
|
187
|
+
...graph.memoryRegions,
|
|
188
|
+
...graph.dataLayouts,
|
|
189
|
+
...graph.pointerEdges,
|
|
190
|
+
...graph.memoryAccesses,
|
|
191
|
+
...graph.abiBoundaries,
|
|
158
192
|
...graph.conflicts,
|
|
159
193
|
...graph.proofObligations
|
|
160
194
|
];
|
|
@@ -165,6 +199,11 @@ function normalizeRowKind(kind) {
|
|
|
165
199
|
if (kind === 'outlives' || kind === 'lifetimeRelation' || kind === 'lifeRelation') return 'lifetimeRelation';
|
|
166
200
|
if (kind === 'borrow' || kind === 'borrowScope' || kind === 'borrowRegion') return 'borrowScope';
|
|
167
201
|
if (kind === 'unsafe' || kind === 'unsafeBoundary') return 'unsafeBoundary';
|
|
202
|
+
if (kind === 'memory' || kind === 'memoryRegion' || kind === 'region') return 'memoryRegion';
|
|
203
|
+
if (kind === 'layout' || kind === 'dataLayout') return 'dataLayout';
|
|
204
|
+
if (kind === 'pointer' || kind === 'ptr' || kind === 'address') return 'pointerEdge';
|
|
205
|
+
if (kind === 'access' || kind === 'memoryAccess' || kind === 'atomic' || kind === 'volatile') return 'memoryAccess';
|
|
206
|
+
if (kind === 'abi' || kind === 'abiBoundary' || kind === 'callBoundary') return 'abiBoundary';
|
|
168
207
|
if (kind === 'proof' || kind === 'obligation' || kind === 'proofObligation') return 'proofObligation';
|
|
169
208
|
return kind;
|
|
170
209
|
}
|
|
@@ -174,6 +213,11 @@ function recordKind(kind) {
|
|
|
174
213
|
if (kind === 'lifetimeRelation') return 'lifetime-relation';
|
|
175
214
|
if (kind === 'borrowScope') return 'borrow-scope';
|
|
176
215
|
if (kind === 'unsafeBoundary') return 'unsafe-boundary';
|
|
216
|
+
if (kind === 'memoryRegion') return 'memory-region';
|
|
217
|
+
if (kind === 'dataLayout') return 'data-layout';
|
|
218
|
+
if (kind === 'pointerEdge') return 'pointer-edge';
|
|
219
|
+
if (kind === 'memoryAccess') return 'memory-access';
|
|
220
|
+
if (kind === 'abiBoundary') return 'abi-boundary';
|
|
177
221
|
if (kind === 'proofObligation') return 'proof-obligation';
|
|
178
222
|
return kind;
|
|
179
223
|
}
|
|
@@ -195,6 +239,7 @@ function readListLine(label, body) {
|
|
|
195
239
|
}
|
|
196
240
|
function readInlineWord(label, text) { return new RegExp('(?:^|\\s)' + label + '\\s+([^\\s,]+)').exec(text)?.[1]?.trim(); }
|
|
197
241
|
function readInlineQuoted(label, text) { return new RegExp("(?:^|\\s)" + label + "\\s+[\"']([^\"']+)[\"']").exec(text)?.[1]?.trim(); }
|
|
242
|
+
function readInlineFlag(label, text) { return new RegExp('(?:^|\\s)' + label + '(?:\\s|$)').test(text) || undefined; }
|
|
198
243
|
function readInlineNumber(label, text) {
|
|
199
244
|
const value = readInlineWord(label, text);
|
|
200
245
|
return value === undefined ? undefined : Number(value);
|
|
@@ -208,6 +253,21 @@ function readInlineList(text, ...labels) {
|
|
|
208
253
|
}
|
|
209
254
|
function ids(records = []) { return records.map((record) => record?.id).filter(Boolean); }
|
|
210
255
|
function unique(values = []) { return [...new Set(values.filter(Boolean))]; }
|
|
256
|
+
function readAuthoredLines(block) {
|
|
257
|
+
const lines = block.body.split('\n');
|
|
258
|
+
const records = [];
|
|
259
|
+
let lineStart = block.syntax?.bodyStartOffset ?? 0;
|
|
260
|
+
for (const rawLine of lines) {
|
|
261
|
+
const rawEnd = lineStart + rawLine.length;
|
|
262
|
+
const leading = /^\s*/.exec(rawLine)?.[0].length ?? 0;
|
|
263
|
+
const trailing = /\s*$/.exec(rawLine)?.[0].length ?? 0;
|
|
264
|
+
const startOffset = lineStart + leading;
|
|
265
|
+
const endOffset = Math.max(startOffset, rawEnd - trailing);
|
|
266
|
+
records.push({ text: rawLine.trim(), sourceSpan: typeof block.sourceSpan === 'function' ? block.sourceSpan(startOffset, endOffset) : undefined });
|
|
267
|
+
lineStart = rawEnd + 1;
|
|
268
|
+
}
|
|
269
|
+
return records;
|
|
270
|
+
}
|
|
211
271
|
function cleanRecord(record) {
|
|
212
272
|
return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined && (!Array.isArray(value) || value.length > 0)));
|
|
213
273
|
}
|
|
@@ -16,8 +16,8 @@ export const ROW_SYNTAX_CONFIG = Object.freeze({
|
|
|
16
16
|
runtimeCapabilities: rowConfig('runtimeCapabilityRow', 'runtime_capability_row', runtimeRows, normalizeRuntimeCapabilityRow),
|
|
17
17
|
runtimeCapabilityMatrix: rowConfig('runtimeCapabilityRow', 'runtime_capability_row', runtimeRows, normalizeRuntimeCapabilityRow),
|
|
18
18
|
runtimeHosts: rowConfig('runtimeCapabilityRow', 'runtime_capability_row', runtimeRows, normalizeRuntimeCapabilityRow),
|
|
19
|
-
resourceGraph: rowConfig('resourceGraphRow', 'resource_graph_row', words('resource owner loan alias move drop escape lifetime lifetimeRegion life outlives lifetimeRelation lifeRelation borrow borrowScope borrowRegion unsafe unsafeBoundary conflict proof proofObligation obligation'), normalizeResourceGraphRow),
|
|
20
|
-
semanticResourceGraph: rowConfig('resourceGraphRow', 'resource_graph_row', words('resource owner loan alias move drop escape lifetime lifetimeRegion life outlives lifetimeRelation lifeRelation borrow borrowScope borrowRegion unsafe unsafeBoundary conflict proof proofObligation obligation'), normalizeResourceGraphRow),
|
|
19
|
+
resourceGraph: rowConfig('resourceGraphRow', 'resource_graph_row', words('resource owner loan alias move drop escape lifetime lifetimeRegion life outlives lifetimeRelation lifeRelation borrow borrowScope borrowRegion unsafe unsafeBoundary memory memoryRegion region layout dataLayout pointer ptr address access memoryAccess atomic volatile abi abiBoundary callBoundary conflict proof proofObligation obligation'), normalizeResourceGraphRow),
|
|
20
|
+
semanticResourceGraph: rowConfig('resourceGraphRow', 'resource_graph_row', words('resource owner loan alias move drop escape lifetime lifetimeRegion life outlives lifetimeRelation lifeRelation borrow borrowScope borrowRegion unsafe unsafeBoundary memory memoryRegion region layout dataLayout pointer ptr address access memoryAccess atomic volatile abi abiBoundary callBoundary conflict proof proofObligation obligation'), normalizeResourceGraphRow),
|
|
21
21
|
applicationSurface: rowConfig('applicationSurfaceRow', 'application_surface_row', appRows, normalizeApplicationSurfaceRow),
|
|
22
22
|
appHost: rowConfig('applicationSurfaceRow', 'application_surface_row', appRows, normalizeApplicationSurfaceRow),
|
|
23
23
|
plugin: rowConfig('applicationSurfaceRow', 'application_surface_row', appRows, normalizeApplicationSurfaceRow),
|
|
@@ -79,6 +79,11 @@ function normalizeResourceGraphRow(rowKind) {
|
|
|
79
79
|
if (rowKind === 'lifeRelation') return 'lifetimeRelation';
|
|
80
80
|
if (rowKind === 'borrowRegion') return 'borrowScope';
|
|
81
81
|
if (rowKind === 'unsafe') return 'unsafeBoundary';
|
|
82
|
+
if (rowKind === 'memory' || rowKind === 'region') return 'memoryRegion';
|
|
83
|
+
if (rowKind === 'layout') return 'dataLayout';
|
|
84
|
+
if (rowKind === 'pointer' || rowKind === 'ptr' || rowKind === 'address') return 'pointerEdge';
|
|
85
|
+
if (rowKind === 'access' || rowKind === 'atomic' || rowKind === 'volatile') return 'memoryAccess';
|
|
86
|
+
if (rowKind === 'abi' || rowKind === 'callBoundary') return 'abiBoundary';
|
|
82
87
|
if (rowKind === 'proof' || rowKind === 'proofObligation') return 'obligation';
|
|
83
88
|
return rowKind;
|
|
84
89
|
}
|