OLD | NEW |
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 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 // If the enclosing library is external, a class is either at type or | 189 // If the enclosing library is external, a class is either at type or |
190 // hierarchy level, depending on its isTypeLevel flag. | 190 // hierarchy level, depending on its isTypeLevel flag. |
191 // If the enclosing library is not external, a class is always at body level. | 191 // If the enclosing library is not external, a class is always at body level. |
192 // | 192 // |
193 // See ClassLevel in ast.dart for the details of each loading level. | 193 // See ClassLevel in ast.dart for the details of each loading level. |
194 | 194 |
195 abstract type Class extends Node {} | 195 abstract type Class extends Node {} |
196 | 196 |
197 type NormalClass extends Class { | 197 type NormalClass extends Class { |
198 Byte tag = 2; | 198 Byte tag = 2; |
| 199 FileOffset fileOffset; |
199 Byte flags (isAbstract, isTypeLevel); | 200 Byte flags (isAbstract, isTypeLevel); |
200 StringReference name; | 201 StringReference name; |
201 // An absolute path URI to the .dart file from which the class was created. | 202 // An absolute path URI to the .dart file from which the class was created. |
202 UriReference fileUri; | 203 UriReference fileUri; |
203 List<Expression> annotations; | 204 List<Expression> annotations; |
204 List<TypeParameter> typeParameters; | 205 List<TypeParameter> typeParameters; |
205 Option<InterfaceType> superClass; | 206 Option<InterfaceType> superClass; |
206 List<InterfaceType> implementedClasses; | 207 List<InterfaceType> implementedClasses; |
207 List<Field> fields; | 208 List<Field> fields; |
208 List<Constructor> constructors; | 209 List<Constructor> constructors; |
209 List<Procedure> procedures; | 210 List<Procedure> procedures; |
210 } | 211 } |
211 | 212 |
212 type MixinClass extends Class { | 213 type MixinClass extends Class { |
213 Byte tag = 3; | 214 Byte tag = 3; |
| 215 FileOffset fileOffset; |
214 Byte flags (isAbstract, isTypeLevel); | 216 Byte flags (isAbstract, isTypeLevel); |
215 StringReference name; | 217 StringReference name; |
216 // An absolute path URI to the .dart file from which the class was created. | 218 // An absolute path URI to the .dart file from which the class was created. |
217 UriReference fileUri; | 219 UriReference fileUri; |
218 List<Expression> annotations; | 220 List<Expression> annotations; |
219 List<TypeParameter> typeParameters; | 221 List<TypeParameter> typeParameters; |
220 InterfaceType firstSuperClass; | 222 InterfaceType firstSuperClass; |
221 InterfaceType secondSuperClass; | 223 InterfaceType secondSuperClass; |
222 List<InterfaceType> implementedClasses; | 224 List<InterfaceType> implementedClasses; |
223 List<Constructor> constructors; | 225 List<Constructor> constructors; |
224 } | 226 } |
225 | 227 |
226 abstract type Member extends Node {} | 228 abstract type Member extends Node {} |
227 | 229 |
228 type Field extends Member { | 230 type Field extends Member { |
229 Byte tag = 4; | 231 Byte tag = 4; |
230 FileOffset fileOffset; | 232 FileOffset fileOffset; |
| 233 FileOffset fileEndOffset; |
231 Byte flags (isFinal, isConst, isStatic); | 234 Byte flags (isFinal, isConst, isStatic); |
232 Name name; | 235 Name name; |
233 // An absolute path URI to the .dart file from which the field was created. | 236 // An absolute path URI to the .dart file from which the field was created. |
234 UriReference fileUri; | 237 UriReference fileUri; |
235 List<Expression> annotations; | 238 List<Expression> annotations; |
236 DartType type; | 239 DartType type; |
237 Option<InferredValue> inferredValue; | 240 Option<InferredValue> inferredValue; |
238 Option<Expression> initializer; | 241 Option<Expression> initializer; |
239 } | 242 } |
240 | 243 |
241 type Constructor extends Member { | 244 type Constructor extends Member { |
242 Byte tag = 5; | 245 Byte tag = 5; |
| 246 FileOffset fileOffset; |
| 247 FileOffset fileEndOffset; |
243 Byte flags (isConst, isExternal); | 248 Byte flags (isConst, isExternal); |
244 Name name; | 249 Name name; |
245 List<Expression> annotations; | 250 List<Expression> annotations; |
246 FunctionNode function; | 251 FunctionNode function; |
247 List<Initializer> initializers; | 252 List<Initializer> initializers; |
248 } | 253 } |
249 | 254 |
250 /* | 255 /* |
251 enum ProcedureKind { | 256 enum ProcedureKind { |
252 Method, | 257 Method, |
253 Getter, | 258 Getter, |
254 Setter, | 259 Setter, |
255 Operator, | 260 Operator, |
256 Factory, | 261 Factory, |
257 } | 262 } |
258 */ | 263 */ |
259 | 264 |
260 type Procedure extends Member { | 265 type Procedure extends Member { |
261 Byte tag = 6; | 266 Byte tag = 6; |
| 267 FileOffset fileOffset; |
| 268 FileOffset fileEndOffset; |
262 Byte kind; // Index into the ProcedureKind enum above. | 269 Byte kind; // Index into the ProcedureKind enum above. |
263 Byte flags (isStatic, isAbstract, isExternal, isConst); | 270 Byte flags (isStatic, isAbstract, isExternal, isConst); |
264 Name name; | 271 Name name; |
265 // An absolute path URI to the .dart file from which the class was created. | 272 // An absolute path URI to the .dart file from which the class was created. |
266 UriReference fileUri; | 273 UriReference fileUri; |
267 List<Expression> annotations; | 274 List<Expression> annotations; |
268 // Can only be absent if abstract, but tag is there anyway. | 275 // Can only be absent if abstract, but tag is there anyway. |
269 Option<FunctionNode> function; | 276 Option<FunctionNode> function; |
270 } | 277 } |
271 | 278 |
(...skipping 30 matching lines...) Expand all Loading... |
302 enum AsyncMarker { | 309 enum AsyncMarker { |
303 Sync, | 310 Sync, |
304 SyncStar, | 311 SyncStar, |
305 Async, | 312 Async, |
306 AsyncStar | 313 AsyncStar |
307 } | 314 } |
308 */ | 315 */ |
309 | 316 |
310 type FunctionNode { | 317 type FunctionNode { |
311 // Note: there is no tag on FunctionNode. | 318 // Note: there is no tag on FunctionNode. |
| 319 FileOffset fileOffset; |
| 320 FileOffset fileEndOffset; |
312 Byte asyncMarker; // Index into AsyncMarker above. | 321 Byte asyncMarker; // Index into AsyncMarker above. |
| 322 Byte debuggable; // 1 for yes, 0 for no |
313 List<TypeParameter> typeParameters; | 323 List<TypeParameter> typeParameters; |
314 UInt requiredParameterCount; | 324 UInt requiredParameterCount; |
315 List<VariableDeclaration> positionalParameters; | 325 List<VariableDeclaration> positionalParameters; |
316 List<VariableDeclaration> namedParameters; | 326 List<VariableDeclaration> namedParameters; |
317 DartType returnType; | 327 DartType returnType; |
318 Option<InferredValue> inferredReturnValue; | 328 Option<InferredValue> inferredReturnValue; |
319 Option<Statement> body; | 329 Option<Statement> body; |
320 } | 330 } |
321 | 331 |
322 type VariableReference { | 332 type VariableReference { |
(...skipping 20 matching lines...) Expand all Loading... |
343 } | 353 } |
344 | 354 |
345 abstract type Expression extends Node {} | 355 abstract type Expression extends Node {} |
346 | 356 |
347 type InvalidExpression extends Expression { | 357 type InvalidExpression extends Expression { |
348 Byte tag = 19; | 358 Byte tag = 19; |
349 } | 359 } |
350 | 360 |
351 type VariableGet extends Expression { | 361 type VariableGet extends Expression { |
352 Byte tag = 20; | 362 Byte tag = 20; |
| 363 FileOffset fileOffset; |
353 VariableReference variable; | 364 VariableReference variable; |
354 } | 365 } |
355 | 366 |
356 type SpecializedVariableGet extends Expression { | 367 type SpecializedVariableGet extends Expression { |
357 Byte tag = 128 + N; // Where 0 <= N < 8. | 368 Byte tag = 128 + N; // Where 0 <= N < 8. |
358 // Equivalent to a VariableGet with index N. | 369 // Equivalent to a VariableGet with index N. |
| 370 FileOffset fileOffset; |
359 } | 371 } |
360 | 372 |
361 type VariableSet extends Expression { | 373 type VariableSet extends Expression { |
362 Byte tag = 21; | 374 Byte tag = 21; |
| 375 FileOffset fileOffset; |
363 VariableReference variable; | 376 VariableReference variable; |
364 Expression value; | 377 Expression value; |
365 } | 378 } |
366 | 379 |
367 type SpecializedVariableSet extends Expression { | 380 type SpecializedVariableSet extends Expression { |
368 Byte tag = 136 + N; // Where 0 <= N < 8. | 381 Byte tag = 136 + N; // Where 0 <= N < 8. |
| 382 FileOffset fileOffset; |
369 Expression value; | 383 Expression value; |
370 // Equivalent to VariableSet with index N. | 384 // Equivalent to VariableSet with index N. |
371 } | 385 } |
372 | 386 |
373 type PropertyGet extends Expression { | 387 type PropertyGet extends Expression { |
374 Byte tag = 22; | 388 Byte tag = 22; |
375 FileOffset fileOffset; | 389 FileOffset fileOffset; |
376 Expression receiver; | 390 Expression receiver; |
377 Name name; | 391 Name name; |
378 MemberReference interfaceTarget; // May be NullReference. | 392 MemberReference interfaceTarget; // May be NullReference. |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 type ConditionalExpression extends Expression { | 525 type ConditionalExpression extends Expression { |
512 Byte tag = 35; | 526 Byte tag = 35; |
513 Expression condition; | 527 Expression condition; |
514 Expression then; | 528 Expression then; |
515 Expression otherwise; | 529 Expression otherwise; |
516 Option<DartType> staticType; | 530 Option<DartType> staticType; |
517 } | 531 } |
518 | 532 |
519 type StringConcatenation extends Expression { | 533 type StringConcatenation extends Expression { |
520 Byte tag = 36; | 534 Byte tag = 36; |
| 535 FileOffset fileOffset; |
521 List<Expression> expressions; | 536 List<Expression> expressions; |
522 } | 537 } |
523 | 538 |
524 type IsExpression extends Expression { | 539 type IsExpression extends Expression { |
525 Byte tag = 37; | 540 Byte tag = 37; |
| 541 FileOffset fileOffset; |
526 Expression operand; | 542 Expression operand; |
527 DartType type; | 543 DartType type; |
528 } | 544 } |
529 | 545 |
530 type AsExpression extends Expression { | 546 type AsExpression extends Expression { |
531 Byte tag = 38; | 547 Byte tag = 38; |
532 Expression operand; | 548 Expression operand; |
533 DartType type; | 549 DartType type; |
534 } | 550 } |
535 | 551 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 } | 622 } |
607 | 623 |
608 type ConstListLiteral extends Expression { | 624 type ConstListLiteral extends Expression { |
609 Byte tag = 58; // Note: tag is out of order. | 625 Byte tag = 58; // Note: tag is out of order. |
610 DartType typeArgument; | 626 DartType typeArgument; |
611 List<Expression> values; | 627 List<Expression> values; |
612 } | 628 } |
613 | 629 |
614 type MapLiteral extends Expression { | 630 type MapLiteral extends Expression { |
615 Byte tag = 50; | 631 Byte tag = 50; |
| 632 FileOffset fileOffset; |
616 DartType keyType; | 633 DartType keyType; |
617 DartType valueType; | 634 DartType valueType; |
618 List<MapEntry> entries; | 635 List<MapEntry> entries; |
619 } | 636 } |
620 | 637 |
621 type ConstMapLiteral extends Expression { | 638 type ConstMapLiteral extends Expression { |
622 Byte tag = 59; // Note: tag is out of order. | 639 Byte tag = 59; // Note: tag is out of order. |
623 DartType keyType; | 640 DartType keyType; |
624 DartType valueType; | 641 DartType valueType; |
625 List<MapEntry> entries; | 642 List<MapEntry> entries; |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 | 769 |
753 type IfStatement extends Statement { | 770 type IfStatement extends Statement { |
754 Byte tag = 73; | 771 Byte tag = 73; |
755 Expression condition; | 772 Expression condition; |
756 Statement then; | 773 Statement then; |
757 Statement otherwise; // Empty statement if there was no else part. | 774 Statement otherwise; // Empty statement if there was no else part. |
758 } | 775 } |
759 | 776 |
760 type ReturnStatement extends Statement { | 777 type ReturnStatement extends Statement { |
761 Byte tag = 74; | 778 Byte tag = 74; |
| 779 FileOffset fileOffset; |
762 Option<Expression> expression; | 780 Option<Expression> expression; |
763 } | 781 } |
764 | 782 |
765 type TryCatch extends Statement { | 783 type TryCatch extends Statement { |
766 Byte tag = 75; | 784 Byte tag = 75; |
767 Statement body; | 785 Statement body; |
768 List<Catch> catches; | 786 List<Catch> catches; |
769 } | 787 } |
770 | 788 |
771 type Catch { | 789 type Catch { |
772 DartType guard; | 790 DartType guard; |
773 Option<VariableDeclaration> exception; | 791 Option<VariableDeclaration> exception; |
774 Option<VariableDeclaration> stackTrace; | 792 Option<VariableDeclaration> stackTrace; |
775 Statement body; | 793 Statement body; |
776 } | 794 } |
777 | 795 |
778 type TryFinally extends Statement { | 796 type TryFinally extends Statement { |
779 Byte tag = 76; | 797 Byte tag = 76; |
780 Statement body; | 798 Statement body; |
781 Statement finalizer; | 799 Statement finalizer; |
782 } | 800 } |
783 | 801 |
784 type YieldStatement extends Statement { | 802 type YieldStatement extends Statement { |
785 Byte tag = 77; | 803 Byte tag = 77; |
| 804 FileOffset fileOffset; |
786 Byte flags (isYieldStar); | 805 Byte flags (isYieldStar); |
787 Expression expression; | 806 Expression expression; |
788 } | 807 } |
789 | 808 |
790 type VariableDeclarationStatement extends Statement { | 809 type VariableDeclarationStatement extends Statement { |
791 Byte tag = 78; | 810 Byte tag = 78; |
792 VariableDeclaration variable; | 811 VariableDeclaration variable; |
793 } | 812 } |
794 | 813 |
795 type VariableDeclaration { | 814 type VariableDeclaration { |
| 815 FileOffset fileOffset; |
796 Byte flags (isFinal, isConst); | 816 Byte flags (isFinal, isConst); |
797 // For named parameters, this is the parameter name. | 817 // For named parameters, this is the parameter name. |
798 // For other variables, the name is cosmetic, may be empty, | 818 // For other variables, the name is cosmetic, may be empty, |
799 // and is not necessarily unique. | 819 // and is not necessarily unique. |
800 StringReference name; | 820 StringReference name; |
801 DartType type; | 821 DartType type; |
802 Option<InferredValue> inferredValue; | 822 Option<InferredValue> inferredValue; |
803 | 823 |
804 // For statements and for-loops, this is the initial value. | 824 // For statements and for-loops, this is the initial value. |
805 // For optional parameters, this is the default value (if given). | 825 // For optional parameters, this is the default value (if given). |
806 // In all other contexts, it must be Nothing. | 826 // In all other contexts, it must be Nothing. |
807 Option<Expression> initializer; | 827 Option<Expression> initializer; |
808 } | 828 } |
809 | 829 |
810 type FunctionDeclaration extends Statement { | 830 type FunctionDeclaration extends Statement { |
811 Byte tag = 79; | 831 Byte tag = 79; |
| 832 FileOffset fileOffset; |
812 // The variable binding the function. The variable is in scope | 833 // The variable binding the function. The variable is in scope |
813 // within the function for use as a self-reference. | 834 // within the function for use as a self-reference. |
814 // Some of the fields in the variable are redundant, but its presence here | 835 // Some of the fields in the variable are redundant, but its presence here |
815 // simplifies the rule for variable indexing. | 836 // simplifies the rule for variable indexing. |
816 VariableDeclaration variable; | 837 VariableDeclaration variable; |
817 FunctionNode function; | 838 FunctionNode function; |
818 } | 839 } |
819 | 840 |
820 abstract type DartType extends Node {} | 841 abstract type DartType extends Node {} |
821 | 842 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 | 917 |
897 /* enum BaseClassKind { None, Exact, Subclass, Subtype, } */ | 918 /* enum BaseClassKind { None, Exact, Subclass, Subtype, } */ |
898 | 919 |
899 type InferredValue { | 920 type InferredValue { |
900 ClassReference baseClass; // May be NullReference if kind = None. | 921 ClassReference baseClass; // May be NullReference if kind = None. |
901 Byte kind; // Index into BaseClassKind. | 922 Byte kind; // Index into BaseClassKind. |
902 Byte valueBits; // See lib/type_propagation/type_propagation.dart | 923 Byte valueBits; // See lib/type_propagation/type_propagation.dart |
903 } | 924 } |
904 | 925 |
905 ``` | 926 ``` |
OLD | NEW |