// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | |

// for details. All rights reserved. Use of this source code is governed by a | |

// BSD-style license that can be found in the LICENSE file. | |

library kernel.binary.tag; | |

class Tag { | |

static const int Nothing = 0; | |

static const int Something = 1; | |

static const int Class = 2; | |

static const int Extension = 115; | |

static const int FunctionNode = 3; | |

// Members | |

static const int Field = 4; | |

static const int Constructor = 5; | |

static const int Procedure = 6; | |

static const int RedirectingFactory = 108; | |

// Initializers | |

static const int InvalidInitializer = 7; | |

static const int FieldInitializer = 8; | |

static const int SuperInitializer = 9; | |

static const int RedirectingInitializer = 10; | |

static const int LocalInitializer = 11; | |

static const int AssertInitializer = 12; | |

// Expressions | |

static const int CheckLibraryIsLoaded = 13; | |

static const int LoadLibrary = 14; | |

static const int EqualsNull = 15; | |

static const int EqualsCall = 16; | |

static const int StaticTearOff = 17; | |

static const int ConstStaticInvocation = 18; | |

static const int InvalidExpression = 19; | |

static const int VariableGet = 20; | |

static const int VariableSet = 21; | |

static const int SuperPropertyGet = 24; | |

static const int SuperPropertySet = 25; | |

static const int StaticGet = 26; | |

static const int StaticSet = 27; | |

static const int SuperMethodInvocation = 29; | |

static const int StaticInvocation = 30; | |

static const int ConstructorInvocation = 31; | |

static const int ConstConstructorInvocation = 32; | |

static const int Not = 33; | |

static const int LogicalExpression = 34; | |

static const int ConditionalExpression = 35; | |

static const int StringConcatenation = 36; | |

static const int IsExpression = 37; | |

static const int AsExpression = 38; | |

static const int StringLiteral = 39; | |

static const int DoubleLiteral = 40; | |

static const int TrueLiteral = 41; | |

static const int FalseLiteral = 42; | |

static const int NullLiteral = 43; | |

static const int SymbolLiteral = 44; | |

static const int TypeLiteral = 45; | |

static const int ThisExpression = 46; | |

static const int Rethrow = 47; | |

static const int Throw = 48; | |

static const int ListLiteral = 49; | |

static const int MapLiteral = 50; | |

static const int AwaitExpression = 51; | |

static const int FunctionExpression = 52; | |

static const int Let = 53; | |

static const int BlockExpression = 82; | |

static const int Instantiation = 54; | |

static const int PositiveIntLiteral = 55; | |

static const int NegativeIntLiteral = 56; | |

static const int BigIntLiteral = 57; | |

static const int ConstListLiteral = 58; | |

static const int ConstMapLiteral = 59; | |

static const int ConstructorTearOff = 60; | |

static const int TypedefTearOff = 83; | |

static const int RedirectingFactoryTearOff = 84; | |

static const int SetLiteral = 109; | |

static const int ConstSetLiteral = 110; | |

static const int ListConcatenation = 111; | |

static const int SetConcatenation = 112; | |

static const int MapConcatenation = 113; | |

static const int InstanceCreation = 114; | |

static const int FileUriExpression = 116; | |

/// 115 is occupied by [Extension]. | |

static const int NullCheck = 117; | |

static const int InstanceGet = 118; | |

static const int InstanceSet = 119; | |

static const int InstanceInvocation = 120; | |

static const int InstanceGetterInvocation = 89; | |

static const int InstanceTearOff = 121; | |

static const int DynamicGet = 122; | |

static const int DynamicSet = 123; | |

static const int DynamicInvocation = 124; | |

static const int FunctionInvocation = 125; | |

static const int FunctionTearOff = 126; | |

static const int LocalFunctionInvocation = 127; | |

// Statements | |

static const int ExpressionStatement = 61; | |

static const int Block = 62; | |

static const int EmptyStatement = 63; | |

static const int AssertStatement = 64; | |

static const int LabeledStatement = 65; | |

static const int BreakStatement = 66; | |

static const int WhileStatement = 67; | |

static const int DoStatement = 68; | |

static const int ForStatement = 69; | |

static const int ForInStatement = 70; | |

static const int SwitchStatement = 71; | |

static const int ContinueSwitchStatement = 72; | |

static const int IfStatement = 73; | |

static const int ReturnStatement = 74; | |

static const int TryCatch = 75; | |

static const int TryFinally = 76; | |

static const int YieldStatement = 77; | |

static const int VariableDeclaration = 78; | |

static const int FunctionDeclaration = 79; | |

static const int AsyncForInStatement = 80; | |

static const int AssertBlock = 81; | |

// 82 is occupied by [BlockExpression] (expression). | |

// 83 is occupied by [TypedefTearOff] (expression). | |

// 84 is occupied by [RedirectingFactoryTearOff] (expression). | |

// Types | |

static const int TypedefType = 87; | |

// 89 is occupied by [InstanceGetterInvocation] (expression). | |

static const int InvalidType = 90; | |

static const int DynamicType = 91; | |

static const int VoidType = 92; | |

static const int InterfaceType = 93; | |

static const int FunctionType = 94; | |

static const int TypeParameterType = 95; | |

static const int SimpleInterfaceType = 96; | |

static const int SimpleFunctionType = 97; | |

static const int NeverType = 98; | |

static const int ConstantExpression = 106; | |

/// 108 is occupied by [RedirectingFactory] (member). | |

/// 109 is occupied by [SetLiteral] (expression). | |

/// 110 is occupied by [ConstSetLiteral] (expression). | |

/// 111 is occupied by [ListConcatenation] (expression). | |

/// 112 is occupied by [SetConcatenation] (expression). | |

/// 113 is occupied by [MapConcatenation] (expression). | |

/// 114 is occupied by [InstanceCreation] (expression). | |

/// 115 is occupied by [Extension]. | |

/// 116 is occupied by [FileUriExpression] (expression). | |

/// 117 is occupied by [NullCheck] (expression). | |

/// 118 is occupied by [InstanceGet] (expression). | |

/// 119 is occupied by [InstanceSet] (expression). | |

/// 120 is occupied by [InstanceInvocation] (expression). | |

/// 121 is occupied by [InstanceTearOff] (expression). | |

/// 122 is occupied by [DynamicGet] (expression). | |

/// 123 is occupied by [DynamicSet] (expression). | |

/// 124 is occupied by [DynamicInvocation] (expression). | |

/// 125 is occupied by [FunctionInvocation] (expression). | |

/// 126 is occupied by [FunctionTearOff] (expression). | |

/// 127 is occupied by [LocalFunctionInvocation] (expression). | |

static const int SpecializedTagHighBit = 0x80; // 10000000 | |

static const int SpecializedTagMask = 0xF8; // 11111000 | |

static const int SpecializedPayloadMask = 0x7; // 00000111 | |

static const int SpecializedVariableGet = 128; | |

static const int SpecializedVariableSet = 136; | |

static const int SpecializedIntLiteral = 144; | |

static const int SpecializedIntLiteralBias = 3; | |

static const int ComponentFile = 0x90ABCDEF; | |

/// Internal version of kernel binary format. | |

/// Bump it when making incompatible changes in kernel binaries. | |

/// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md. | |

static const int BinaryFormatVersion = 76; | |

} | |

abstract class ConstantTag { | |

static const int NullConstant = 0; | |

static const int BoolConstant = 1; | |

static const int IntConstant = 2; | |

static const int DoubleConstant = 3; | |

static const int StringConstant = 4; | |

static const int SymbolConstant = 5; | |

static const int MapConstant = 6; | |

static const int ListConstant = 7; | |

static const int SetConstant = 13; | |

static const int InstanceConstant = 8; | |

static const int InstantiationConstant = 9; | |

static const int StaticTearOffConstant = 10; | |

static const int TypeLiteralConstant = 11; | |

static const int UnevaluatedConstant = 12; | |

// 13 is occupied by [SetConstant] | |

static const int TypedefTearOffConstant = 14; | |

static const int ConstructorTearOffConstant = 15; | |

static const int RedirectingFactoryTearOffConstant = 16; | |

} | |

const int sdkHashLength = 10; // Bytes, a Git "short hash". | |

const String sdkHashNull = '0000000000'; | |

// Will be correct hash for Flutter SDK / Dart SDK we distribute. | |

// If non-null we will validate when consuming kernel, will use when producing | |

// kernel. | |

// If null, local development setting (e.g. run gen_kernel.dart from source), | |

// we put 0x00..00 into when producing, do not validate when consuming. | |

String get expectedSdkHash { | |

final String sdkHash = | |

const String.fromEnvironment('sdk_hash', defaultValue: sdkHashNull); | |

if (sdkHash.length != sdkHashLength) { | |

throw '-Dsdk_hash=<hash> must be a ${sdkHashLength} byte string!'; | |

} | |

return sdkHash; | |

} | |

bool isValidSdkHash(String sdkHash) { | |

return (sdkHash == sdkHashNull || | |

expectedSdkHash == sdkHashNull || | |

sdkHash == expectedSdkHash); | |

} |