Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: pkg/kernel/binary.md

Issue 2665723002: Implement canonical name scheme in kernel. (Closed)
Patch Set: Address Kevin's comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/kernel/bin/dartk.dart ('k') | pkg/kernel/lib/analyzer/ast_from_analyzer.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 This file describes the binary format of Dart Kernel. 1 This file describes the binary format of Dart Kernel.
2 2
3 Notation 3 Notation
4 -------- 4 --------
5 Bitmasks are described with the syntax: 5 Bitmasks are described with the syntax:
6 ```scala 6 ```scala
7 Byte flags (flag1, flag2, ..., flagN) 7 Byte flags (flag1, flag2, ..., flagN)
8 ``` 8 ```
9 where 'flag<N>' is the N-th least significant bit, 9 where 'flag<N>' is the N-th least significant bit,
10 (so flag1 is the least significant bit). 10 (so flag1 is the least significant bit).
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 Byte tag; 84 Byte tag;
85 } 85 }
86 type Nothing extends Option<T> { 86 type Nothing extends Option<T> {
87 Byte tag = 0; 87 Byte tag = 0;
88 } 88 }
89 type Something<T> extends Option<T> { 89 type Something<T> extends Option<T> {
90 Byte tag = 1; 90 Byte tag = 1;
91 T value; 91 T value;
92 } 92 }
93 93
94 type CanonicalNameReference {
95 UInt biasedIndex; // 0 if null, otherwise N+1 where N is index of parent
96 }
97
98 type CanonicalName {
99 CanonicalNameReference parent;
100 StringReference name;
101 }
102
94 type ProgramFile { 103 type ProgramFile {
95 MagicWord magic = 0x90ABCDEF; 104 MagicWord magic = 0x90ABCDEF;
96 StringTable strings; 105 StringTable strings;
97 UriSource sourceMap; 106 UriSource sourceMap;
107 List<CanonicalName> canonicalNames;
98 List<Library> libraries; 108 List<Library> libraries;
99 LibraryProcedureReference mainMethod; 109 ProcedureReference mainMethod;
100 } 110 }
101 111
102 type LibraryReference { 112 type LibraryReference {
103 // Index into the ProgramFile libraries. 113 // Must be populated by a library (possibly later in the file).
104 UInt index; 114 CanonicalNameReference canonicalName;
105 } 115 }
106 116
107 abstract type ClassReference {} 117 type ClassReference {
108 118 // Must be populated by a class (possibly later in the file).
109 type NormalClassReference extends ClassReference { 119 CanonicalNameReference canonicalName;
110 Byte tag = 100;
111 LibraryReference library;
112 UInt classIndex;
113 } 120 }
114 121
115 type MixinClassReference extends ClassReference { 122 type MemberReference {
116 Byte tag = 101; 123 // Must be populated by a member (possibly later in the file).
117 LibraryReference library; 124 CanonicalNameReference canonicalName;
118 UInt classIndex;
119 } 125 }
120 126
121 abstract type MemberReference { 127 type FieldReference {
128 // Must be populated by a field (possibly later in the file).
129 CanonicalNameReference canonicalName;
122 } 130 }
123 131
124 type LibraryFieldReference extends MemberReference { 132 type ConstructorReference {
125 Byte tag = 102; 133 // Must be populated by a constructor (possibly later in the file).
126 LibraryReference library; 134 CanonicalNameReference canonicalName;
127 UInt fieldIndex; // Index in list of fields.
128 } 135 }
129 136
130 type ClassFieldReference extends MemberReference { 137 type ProcedureReference {
131 Byte tag = 103; 138 // Must be populated by a procedure (possibly later in the file).
132 ClassReference class; 139 CanonicalNameReference canonicalName;
133 UInt fieldIndex;
134 }
135
136 type ClassConstructorReference extends MemberReference {
137 Byte tag = 104;
138 ClassReference class;
139 UInt constructorIndex; // Index in list of constructors.
140 }
141
142 type LibraryProcedureReference extends MemberReference {
143 Byte tag = 105;
144 LibraryReference library;
145 UInt procedureIndex; // Index in list of procedures.
146 }
147
148 type ClassProcedureReference extends MemberReference {
149 Byte tag = 106;
150 ClassReference class;
151 UInt procedureIndex;
152 }
153
154 // Can be used as MemberReference or ClassReference *only* if indicated that
155 // the given reference may be a NullReference.
156 type NullReference extends MemberReference, ClassReference {
157 Byte tag = 99;
158 } 140 }
159 141
160 type Name { 142 type Name {
161 StringReference name; 143 StringReference name;
162 if name begins with '_' { 144 if name begins with '_' {
163 LibraryReference library; 145 LibraryReference library;
164 } 146 }
165 } 147 }
166 148
167 type Library { 149 type Library {
168 Byte flags (isExternal); 150 Byte flags (isExternal);
151 CanonicalNameReference canonicalName;
169 StringReference name; 152 StringReference name;
170 // A URI from which the library was created. The URI has the dart, package,
171 // file, or app scheme. For file URIs, the path is an absolute path to the
172 // .dart file from which the library was created. For app URIs, the path is
173 // relative to an application root that was specified when the binary was
174 // generated.
175 StringReference importUri;
176 // An absolute path URI to the .dart file from which the library was created. 153 // An absolute path URI to the .dart file from which the library was created.
177 UriReference fileUri; 154 UriReference fileUri;
178 List<DeferredImport> deferredImports; 155 List<DeferredImport> deferredImports;
179 List<Class> classes; 156 List<Class> classes;
180 List<Field> fields; 157 List<Field> fields;
181 List<Procedure> procedures; 158 List<Procedure> procedures;
182 } 159 }
183 160
184 type DeferredImport { 161 type DeferredImport {
185 LibraryReference importedLibrary; 162 LibraryReference importedLibrary;
(...skipping 12 matching lines...) Expand all
198 enum ClassLevel { Type = 0, Hierarchy = 1, Mixin = 2, Body = 3, } 175 enum ClassLevel { Type = 0, Hierarchy = 1, Mixin = 2, Body = 3, }
199 176
200 // A class can be represented at one of three levels: type, hierarchy, or body. 177 // A class can be represented at one of three levels: type, hierarchy, or body.
201 // 178 //
202 // If the enclosing library is external, a class is either at type or 179 // If the enclosing library is external, a class is either at type or
203 // hierarchy level, depending on its isTypeLevel flag. 180 // hierarchy level, depending on its isTypeLevel flag.
204 // If the enclosing library is not external, a class is always at body level. 181 // If the enclosing library is not external, a class is always at body level.
205 // 182 //
206 // See ClassLevel in ast.dart for the details of each loading level. 183 // See ClassLevel in ast.dart for the details of each loading level.
207 184
208 abstract type Class extends Node {} 185 abstract type Class extends Node {
209
210 type NormalClass extends Class {
211 Byte tag = 2; 186 Byte tag = 2;
187 CanonicalNameReference canonicalName;
212 FileOffset fileOffset; 188 FileOffset fileOffset;
213 Byte flags (isAbstract, xx); // Where xx is index into ClassLevel 189 Byte flags (isAbstract, xx); // Where xx is index into ClassLevel
214 StringReference name; 190 StringReference name;
215 // An absolute path URI to the .dart file from which the class was created. 191 // An absolute path URI to the .dart file from which the class was created.
216 UriReference fileUri; 192 UriReference fileUri;
217 List<Expression> annotations; 193 List<Expression> annotations;
218 List<TypeParameter> typeParameters; 194 List<TypeParameter> typeParameters;
219 Option<InterfaceType> superClass; 195 Option<InterfaceType> superClass;
196 Option<InterfaceType> mixedInType;
220 List<InterfaceType> implementedClasses; 197 List<InterfaceType> implementedClasses;
221 List<Field> fields; 198 List<Field> fields;
222 List<Constructor> constructors; 199 List<Constructor> constructors;
223 List<Procedure> procedures; 200 List<Procedure> procedures;
224 } 201 }
225 202
226 type MixinClass extends Class {
227 Byte tag = 3;
228 FileOffset fileOffset;
229 Byte flags (isAbstract, isTypeLevel);
230 StringReference name;
231 // An absolute path URI to the .dart file from which the class was created.
232 UriReference fileUri;
233 List<Expression> annotations;
234 List<TypeParameter> typeParameters;
235 InterfaceType firstSuperClass;
236 InterfaceType secondSuperClass;
237 List<InterfaceType> implementedClasses;
238 List<Constructor> constructors;
239 }
240
241 abstract type Member extends Node {} 203 abstract type Member extends Node {}
242 204
243 type Field extends Member { 205 type Field extends Member {
244 Byte tag = 4; 206 Byte tag = 4;
207 CanonicalNameReference canonicalName;
245 FileOffset fileOffset; 208 FileOffset fileOffset;
246 FileOffset fileEndOffset; 209 FileOffset fileEndOffset;
247 Byte flags (isFinal, isConst, isStatic); 210 Byte flags (isFinal, isConst, isStatic);
248 Name name; 211 Name name;
249 // An absolute path URI to the .dart file from which the field was created. 212 // An absolute path URI to the .dart file from which the field was created.
250 UriReference fileUri; 213 UriReference fileUri;
251 List<Expression> annotations; 214 List<Expression> annotations;
252 DartType type; 215 DartType type;
253 Option<InferredValue> inferredValue; 216 Option<InferredValue> inferredValue;
254 Option<Expression> initializer; 217 Option<Expression> initializer;
255 } 218 }
256 219
257 type Constructor extends Member { 220 type Constructor extends Member {
258 Byte tag = 5; 221 Byte tag = 5;
222 CanonicalNameReference canonicalName;
259 FileOffset fileOffset; 223 FileOffset fileOffset;
260 FileOffset fileEndOffset; 224 FileOffset fileEndOffset;
261 Byte flags (isConst, isExternal); 225 Byte flags (isConst, isExternal);
262 Name name; 226 Name name;
263 List<Expression> annotations; 227 List<Expression> annotations;
264 FunctionNode function; 228 FunctionNode function;
265 List<Initializer> initializers; 229 List<Initializer> initializers;
266 } 230 }
267 231
268 /* 232 /*
269 enum ProcedureKind { 233 enum ProcedureKind {
270 Method, 234 Method,
271 Getter, 235 Getter,
272 Setter, 236 Setter,
273 Operator, 237 Operator,
274 Factory, 238 Factory,
275 } 239 }
276 */ 240 */
277 241
278 type Procedure extends Member { 242 type Procedure extends Member {
279 Byte tag = 6; 243 Byte tag = 6;
244 CanonicalNameReference canonicalName;
280 FileOffset fileOffset; 245 FileOffset fileOffset;
281 FileOffset fileEndOffset; 246 FileOffset fileEndOffset;
282 Byte kind; // Index into the ProcedureKind enum above. 247 Byte kind; // Index into the ProcedureKind enum above.
283 Byte flags (isStatic, isAbstract, isExternal, isConst); 248 Byte flags (isStatic, isAbstract, isExternal, isConst);
284 Name name; 249 Name name;
285 // An absolute path URI to the .dart file from which the class was created. 250 // An absolute path URI to the .dart file from which the class was created.
286 UriReference fileUri; 251 UriReference fileUri;
287 List<Expression> annotations; 252 List<Expression> annotations;
288 // Can only be absent if abstract, but tag is there anyway. 253 // Can only be absent if abstract, but tag is there anyway.
289 Option<FunctionNode> function; 254 Option<FunctionNode> function;
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 905
941 /* enum BaseClassKind { None, Exact, Subclass, Subtype, } */ 906 /* enum BaseClassKind { None, Exact, Subclass, Subtype, } */
942 907
943 type InferredValue { 908 type InferredValue {
944 ClassReference baseClass; // May be NullReference if kind = None. 909 ClassReference baseClass; // May be NullReference if kind = None.
945 Byte kind; // Index into BaseClassKind. 910 Byte kind; // Index into BaseClassKind.
946 Byte valueBits; // See lib/type_propagation/type_propagation.dart 911 Byte valueBits; // See lib/type_propagation/type_propagation.dart
947 } 912 }
948 913
949 ``` 914 ```
OLDNEW
« no previous file with comments | « pkg/kernel/bin/dartk.dart ('k') | pkg/kernel/lib/analyzer/ast_from_analyzer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698