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 28 matching lines...) Expand all Loading... |
39 Byte byte3(xxxxxxxx); | 39 Byte byte3(xxxxxxxx); |
40 Byte byte4(xxxxxxxx); // least significant byte | 40 Byte byte4(xxxxxxxx); // least significant byte |
41 } | 41 } |
42 | 42 |
43 type MagicWord = big endian 32-bit unsigned integer | 43 type MagicWord = big endian 32-bit unsigned integer |
44 | 44 |
45 type List<T> { | 45 type List<T> { |
46 UInt length; | 46 UInt length; |
47 T[length] items; | 47 T[length] items; |
48 } | 48 } |
| 49 |
| 50 // Untagged pairs. |
| 51 type Pair<T0, T1> { |
| 52 T0 first; |
| 53 T1 second; |
| 54 } |
49 ``` | 55 ``` |
50 | 56 |
51 A string table consists of an array of end offsets and a payload array of | 57 A string table consists of an array of end offsets and a payload array of |
52 strings encoded as UTF-8. The array of end offsets maps a string index to the | 58 strings encoded as UTF-8. The array of end offsets maps a string index to the |
53 offset of the _next_ string in the table or the offset of the end of the array | 59 offset of the _next_ string in the table or the offset of the end of the array |
54 for the last string. These offsets are relative to the string payload array. | 60 for the last string. These offsets are relative to the string payload array. |
55 Thus, string number 0 consists of the UTF-8 encoded string stretching from | 61 Thus, string number 0 consists of the UTF-8 encoded string stretching from |
56 offset 0 (inclusive) to endOffset[0] (exclusive); and string number N for N > 0 | 62 offset 0 (inclusive) to endOffset[0] (exclusive); and string number N for N > 0 |
57 consists of the UTF-8 encoded string stretching from offset endOffset[N-1] | 63 consists of the UTF-8 encoded string stretching from offset endOffset[N-1] |
58 (inclusive) to endOffset[N] (exclusive). | 64 (inclusive) to endOffset[N] (exclusive). |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 | 345 |
340 abstract type Expression extends Node {} | 346 abstract type Expression extends Node {} |
341 | 347 |
342 type InvalidExpression extends Expression { | 348 type InvalidExpression extends Expression { |
343 Byte tag = 19; | 349 Byte tag = 19; |
344 } | 350 } |
345 | 351 |
346 type VariableGet extends Expression { | 352 type VariableGet extends Expression { |
347 Byte tag = 20; | 353 Byte tag = 20; |
348 FileOffset fileOffset; | 354 FileOffset fileOffset; |
| 355 UInt variableDeclarationPosition; // Byte offset in the binary for the variabl
e declaration. |
349 VariableReference variable; | 356 VariableReference variable; |
350 } | 357 } |
351 | 358 |
352 type SpecializedVariableGet extends Expression { | 359 type SpecializedVariableGet extends Expression { |
353 Byte tag = 128 + N; // Where 0 <= N < 8. | 360 Byte tag = 128 + N; // Where 0 <= N < 8. |
354 // Equivalent to a VariableGet with index N. | 361 // Equivalent to a VariableGet with index N. |
355 FileOffset fileOffset; | 362 FileOffset fileOffset; |
| 363 UInt variableDeclarationPosition; // Byte offset in the binary for the variabl
e declaration. |
356 } | 364 } |
357 | 365 |
358 type VariableSet extends Expression { | 366 type VariableSet extends Expression { |
359 Byte tag = 21; | 367 Byte tag = 21; |
360 FileOffset fileOffset; | 368 FileOffset fileOffset; |
| 369 UInt variableDeclarationPosition; // Byte offset in the binary for the variabl
e declaration. |
361 VariableReference variable; | 370 VariableReference variable; |
362 Expression value; | 371 Expression value; |
363 } | 372 } |
364 | 373 |
365 type SpecializedVariableSet extends Expression { | 374 type SpecializedVariableSet extends Expression { |
366 Byte tag = 136 + N; // Where 0 <= N < 8. | 375 Byte tag = 136 + N; // Where 0 <= N < 8. |
367 FileOffset fileOffset; | 376 FileOffset fileOffset; |
| 377 UInt variableDeclarationPosition; // Byte offset in the binary for the variabl
e declaration. |
368 Expression value; | 378 Expression value; |
369 // Equivalent to VariableSet with index N. | 379 // Equivalent to VariableSet with index N. |
370 } | 380 } |
371 | 381 |
372 type PropertyGet extends Expression { | 382 type PropertyGet extends Expression { |
373 Byte tag = 22; | 383 Byte tag = 22; |
374 FileOffset fileOffset; | 384 FileOffset fileOffset; |
375 Expression receiver; | 385 Expression receiver; |
376 Name name; | 386 Name name; |
377 MemberReference interfaceTarget; // May be NullReference. | 387 MemberReference interfaceTarget; // May be NullReference. |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 | 432 |
423 type StaticSet extends Expression { | 433 type StaticSet extends Expression { |
424 Byte tag = 27; | 434 Byte tag = 27; |
425 FileOffset fileOffset; | 435 FileOffset fileOffset; |
426 MemberReference target; | 436 MemberReference target; |
427 Expression value; | 437 Expression value; |
428 } | 438 } |
429 | 439 |
430 type Arguments { | 440 type Arguments { |
431 // Note: there is no tag on Arguments. | 441 // Note: there is no tag on Arguments. |
| 442 UInt numArguments; // equals positional.length + named.length |
432 List<DartType> types; | 443 List<DartType> types; |
433 List<Expression> positional; | 444 List<Expression> positional; |
434 List<NamedExpression> named; | 445 List<NamedExpression> named; |
435 } | 446 } |
436 | 447 |
437 type NamedExpression { | 448 type NamedExpression { |
438 // Note: there is no tag on NamedExpression. | 449 // Note: there is no tag on NamedExpression. |
439 StringReference name; | 450 StringReference name; |
440 Expression value; | 451 Expression value; |
441 } | 452 } |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 } | 786 } |
776 | 787 |
777 type SwitchStatement extends Statement { | 788 type SwitchStatement extends Statement { |
778 Byte tag = 71; | 789 Byte tag = 71; |
779 Expression expression; | 790 Expression expression; |
780 List<SwitchCase> cases; | 791 List<SwitchCase> cases; |
781 } | 792 } |
782 | 793 |
783 type SwitchCase { | 794 type SwitchCase { |
784 // Note: there is no tag on SwitchCase | 795 // Note: there is no tag on SwitchCase |
785 List<Expression> expressions; | 796 List<Pair<FileOffset, Expression>> expressions; |
786 FileOffset[expressions.length] expressionOffsets; // 1-to-1 with expressions. | |
787 Byte isDefault; // 1 if default, 0 is not default. | 797 Byte isDefault; // 1 if default, 0 is not default. |
788 Statement body; | 798 Statement body; |
789 } | 799 } |
790 | 800 |
791 type ContinueSwitchStatement extends Statement { | 801 type ContinueSwitchStatement extends Statement { |
792 Byte tag = 72; | 802 Byte tag = 72; |
793 | 803 |
794 // Reference to the Nth SwitchCase in scope. | 804 // Reference to the Nth SwitchCase in scope. |
795 // | 805 // |
796 // A SwitchCase is in scope everywhere within its enclosing switch, | 806 // A SwitchCase is in scope everywhere within its enclosing switch, |
(...skipping 15 matching lines...) Expand all Loading... |
812 | 822 |
813 type ReturnStatement extends Statement { | 823 type ReturnStatement extends Statement { |
814 Byte tag = 74; | 824 Byte tag = 74; |
815 FileOffset fileOffset; | 825 FileOffset fileOffset; |
816 Option<Expression> expression; | 826 Option<Expression> expression; |
817 } | 827 } |
818 | 828 |
819 type TryCatch extends Statement { | 829 type TryCatch extends Statement { |
820 Byte tag = 75; | 830 Byte tag = 75; |
821 Statement body; | 831 Statement body; |
| 832 Byte anyCatchNeedsStackTrace; // 1 if any catch needs a stacktrace (have a sta
cktrace variable). |
822 List<Catch> catches; | 833 List<Catch> catches; |
823 } | 834 } |
824 | 835 |
825 type Catch { | 836 type Catch { |
826 DartType guard; | 837 DartType guard; |
827 Option<VariableDeclaration> exception; | 838 Option<VariableDeclaration> exception; |
828 Option<VariableDeclaration> stackTrace; | 839 Option<VariableDeclaration> stackTrace; |
829 Statement body; | 840 Statement body; |
830 } | 841 } |
831 | 842 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 type SimpleInterfaceType extends DartType { | 914 type SimpleInterfaceType extends DartType { |
904 Byte tag = 96; // Note: tag is out of order. | 915 Byte tag = 96; // Note: tag is out of order. |
905 ClassReference class; | 916 ClassReference class; |
906 // Equivalent to InterfaceType with empty list of type arguments. | 917 // Equivalent to InterfaceType with empty list of type arguments. |
907 } | 918 } |
908 | 919 |
909 type FunctionType extends DartType { | 920 type FunctionType extends DartType { |
910 Byte tag = 94; | 921 Byte tag = 94; |
911 List<TypeParameter> typeParameters; | 922 List<TypeParameter> typeParameters; |
912 UInt requiredParameterCount; | 923 UInt requiredParameterCount; |
| 924 UInt totalParameterCount; // positionalParameters.length + namedParameters.len
gth |
913 List<DartType> positionalParameters; | 925 List<DartType> positionalParameters; |
914 List<NamedDartType> namedParameters; | 926 List<NamedDartType> namedParameters; |
915 DartType returnType; | 927 DartType returnType; |
916 } | 928 } |
917 | 929 |
918 type SimpleFunctionType extends DartType { | 930 type SimpleFunctionType extends DartType { |
919 Byte tag = 97; // Note: tag is out of order. | 931 Byte tag = 97; // Note: tag is out of order. |
920 List<DartType> positionalParameters; | 932 List<DartType> positionalParameters; |
921 DartType returnType; | 933 DartType returnType; |
922 // Equivalent to a FunctionType with no type parameters or named parameters, | 934 // Equivalent to a FunctionType with no type parameters or named parameters, |
(...skipping 19 matching lines...) Expand all Loading... |
942 // from the definition of scoping, since type parameter N+1 is not "in scope" | 954 // from the definition of scoping, since type parameter N+1 is not "in scope" |
943 // in the bound of type parameter N, but it takes up an index as if it was in | 955 // in the bound of type parameter N, but it takes up an index as if it was in |
944 // scope there. | 956 // scope there. |
945 // | 957 // |
946 // The type parameter can be bound by a Class, FunctionNode, or FunctionType. | 958 // The type parameter can be bound by a Class, FunctionNode, or FunctionType. |
947 // | 959 // |
948 // Note that constructors currently do not declare type parameters. Uses of | 960 // Note that constructors currently do not declare type parameters. Uses of |
949 // the class type parameters in a constructor refer to those declared on the | 961 // the class type parameters in a constructor refer to those declared on the |
950 // class. | 962 // class. |
951 UInt index; | 963 UInt index; |
952 | 964 |
| 965 // Byte offset in the binary for the type declaration. |
| 966 // Note: This can also be 0, which is a 'forward reference' and is not to be u
sed. |
| 967 UInt typeParameterPosition; |
953 Option<DartType> bound; | 968 Option<DartType> bound; |
954 } | 969 } |
955 | 970 |
956 type VectorType extends DartType { | 971 type VectorType extends DartType { |
957 Byte tag = 88; | 972 Byte tag = 88; |
958 } | 973 } |
959 | 974 |
960 type TypeParameter { | 975 type TypeParameter { |
961 // Note: there is no tag on TypeParameter | 976 // Note: there is no tag on TypeParameter |
962 StringReference name; // Cosmetic, may be empty, not unique. | 977 StringReference name; // Cosmetic, may be empty, not unique. |
963 DartType bound; // 'dynamic' if no explicit bound was given. | 978 DartType bound; // 'dynamic' if no explicit bound was given. |
964 } | 979 } |
965 | 980 |
966 ``` | 981 ``` |
OLD | NEW |