Version 2.12.0-48.0.dev
Merge commit '2f27573c41eca3c54683a8c19cc47678a9947c3a' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index c75c95d3..d9dd292 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
"constraint, update this by running tools/generate_package_config.dart."
],
"configVersion": 2,
- "generated": "2020-10-26T09:42:07.748397",
+ "generated": "2020-11-15T14:18:10.587065",
"generator": "tools/generate_package_config.dart",
"packages": [
{
@@ -267,7 +267,7 @@
"name": "front_end",
"rootUri": "../pkg/front_end",
"packageUri": "lib/",
- "languageVersion": "2.2"
+ "languageVersion": "2.6"
},
{
"name": "front_end_testcases",
@@ -361,7 +361,7 @@
"name": "kernel",
"rootUri": "../pkg/kernel",
"packageUri": "lib/",
- "languageVersion": "2.2"
+ "languageVersion": "2.6"
},
{
"name": "language_versioning_2.7_test",
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 3f3905b..e34f9f2 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -6,7 +6,7 @@
publish_to: none
environment:
- sdk: '>=2.2.2 <3.0.0'
+ sdk: '>=2.6.0 <3.0.0'
dependencies:
_fe_analyzer_shared: any
diff --git a/pkg/front_end/test/static_types/cfe_allowed.json b/pkg/front_end/test/static_types/cfe_allowed.json
index 1e26e85..9dd0b5b 100644
--- a/pkg/front_end/test/static_types/cfe_allowed.json
+++ b/pkg/front_end/test/static_types/cfe_allowed.json
@@ -40,28 +40,6 @@
"pkg/front_end/lib/src/fasta/kernel/body_builder.dart": {
"Dynamic invocation of 'buildForEffect'.": 1
},
- "pkg/kernel/lib/text/text_serializer.dart": {
- "Dynamic access of 'first'.": 68,
- "Dynamic invocation of 'getReference'.": 10,
- "Dynamic access of 'second'.": 88,
- "Dynamic access of 'third'.": 29,
- "Dynamic access of 'fourth'.": 17,
- "Dynamic access of 'fifth'.": 3,
- "Dynamic access of 'sixth'.": 2,
- "Dynamic invocation of 'fold'.": 9,
- "Dynamic invocation of '|'.": 8,
- "Dynamic access of 'value'.": 11,
- "Dynamic access of 'key'.": 11,
- "Dynamic update to 'name'.": 2,
- "Dynamic invocation of 'addAnnotation'.": 1,
- "Dynamic access of 'expressions'.": 1,
- "Dynamic access of 'length'.": 3,
- "Dynamic invocation of '+'.": 2,
- "Dynamic invocation of 'toList'.": 5,
- "Dynamic invocation of 'cast'.": 5,
- "Dynamic invocation of 'where'.": 5,
- "Dynamic access of 'seventh'.": 1
- },
"pkg/_fe_analyzer_shared/lib/src/util/link.dart": {
"Dynamic access of 'isEmpty'.": 1
},
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 20825b3..cdc1183 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -24,10 +24,6 @@
general/callable_type_variable: TypeCheckError
general/candidate_found: TypeCheckError
general/cascade: RuntimeError
-general/constants/with_unevaluated_agnostic/const_asserts: TextSerializationFailure
-general/constants/with_unevaluated_agnostic/const_collections_2: TextSerializationFailure
-general/constants/with_unevaluated_agnostic/various: TextSerializationFailure
-general/constants/with_unevaluated_agnostic/various_2: TextSerializationFailure
general/constructor_initializer_invalid: RuntimeError
general/covariant_field: TypeCheckError
general/covariant_generic: RuntimeError
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 42b5bda..0aee5ce 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -23,7 +23,7 @@
TextSerializer<Name> publicName =
Wrapped((w) => w.text, (u) => Name(u), const DartString());
-TextSerializer<Name> privateName = Wrapped(
+TextSerializer<Name> privateName = Wrapped<Tuple2<String, CanonicalName>, Name>(
(w) => Tuple2(w.text, w.library.canonicalName),
(u) => Name.byReference(u.first, u.second.getReference()),
Tuple2Serializer(DartString(), CanonicalNameSerializer()));
@@ -629,39 +629,48 @@
return new FunctionExpression(node);
}
-TextSerializer<ListConcatenation> listConcatenationSerializer = Wrapped(
- (lc) => Tuple2(lc.typeArgument, lc.lists),
- (t) => ListConcatenation(t.second, typeArgument: t.first),
- Tuple2Serializer(dartTypeSerializer, ListSerializer(expressionSerializer)));
+TextSerializer<ListConcatenation> listConcatenationSerializer =
+ Wrapped<Tuple2<DartType, List<Expression>>, ListConcatenation>(
+ (lc) => Tuple2(lc.typeArgument, lc.lists),
+ (t) => ListConcatenation(t.second, typeArgument: t.first),
+ Tuple2Serializer(
+ dartTypeSerializer, ListSerializer(expressionSerializer)));
-TextSerializer<SetConcatenation> setConcatenationSerializer = Wrapped(
- (sc) => Tuple2(sc.typeArgument, sc.sets),
- (t) => SetConcatenation(t.second, typeArgument: t.first),
- Tuple2Serializer(dartTypeSerializer, ListSerializer(expressionSerializer)));
+TextSerializer<SetConcatenation> setConcatenationSerializer =
+ Wrapped<Tuple2<DartType, List<Expression>>, SetConcatenation>(
+ (sc) => Tuple2(sc.typeArgument, sc.sets),
+ (t) => SetConcatenation(t.second, typeArgument: t.first),
+ Tuple2Serializer(
+ dartTypeSerializer, ListSerializer(expressionSerializer)));
-TextSerializer<MapConcatenation> mapConcatenationSerializer = Wrapped(
- (mc) => Tuple3(mc.keyType, mc.valueType, mc.maps),
- (t) => MapConcatenation(t.third, keyType: t.first, valueType: t.second),
- Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
- ListSerializer(expressionSerializer)));
+TextSerializer<MapConcatenation> mapConcatenationSerializer =
+ Wrapped<Tuple3<DartType, DartType, List<Expression>>, MapConcatenation>(
+ (mc) => Tuple3(mc.keyType, mc.valueType, mc.maps),
+ (t) => MapConcatenation(t.third, keyType: t.first, valueType: t.second),
+ Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
+ ListSerializer(expressionSerializer)));
-TextSerializer<BlockExpression> blockExpressionSerializer = Wrapped(
- (w) => Tuple2(w.body.statements, w.value),
- (u) => BlockExpression(Block(u.first), u.second),
- const BlockSerializer());
+TextSerializer<BlockExpression> blockExpressionSerializer =
+ Wrapped<Tuple2<List<Statement>, Expression>, BlockExpression>(
+ (w) => Tuple2(w.body.statements, w.value),
+ (u) => BlockExpression(Block(u.first), u.second),
+ const BlockSerializer());
-TextSerializer<Instantiation> instantiationSerializer = Wrapped(
- (i) => Tuple2(i.expression, i.typeArguments),
- (t) => Instantiation(t.first, t.second),
- Tuple2Serializer(expressionSerializer, ListSerializer(dartTypeSerializer)));
+TextSerializer<Instantiation> instantiationSerializer =
+ Wrapped<Tuple2<Expression, List<DartType>>, Instantiation>(
+ (i) => Tuple2(i.expression, i.typeArguments),
+ (t) => Instantiation(t.first, t.second),
+ Tuple2Serializer(
+ expressionSerializer, ListSerializer(dartTypeSerializer)));
TextSerializer<NullCheck> nullCheckSerializer =
Wrapped((nc) => nc.operand, (op) => NullCheck(op), expressionSerializer);
-TextSerializer<FileUriExpression> fileUriExpressionSerializer = Wrapped(
- (fue) => Tuple2(fue.expression, fue.fileUri),
- (t) => FileUriExpression(t.first, t.second),
- Tuple2Serializer(expressionSerializer, const UriSerializer()));
+TextSerializer<FileUriExpression> fileUriExpressionSerializer =
+ Wrapped<Tuple2<Expression, Uri>, FileUriExpression>(
+ (fue) => Tuple2(fue.expression, fue.fileUri),
+ (t) => FileUriExpression(t.first, t.second),
+ Tuple2Serializer(expressionSerializer, const UriSerializer()));
TextSerializer<CheckLibraryIsLoaded> checkLibraryIsLoadedSerializer = Wrapped(
(clil) => clil.import,
@@ -671,12 +680,16 @@
TextSerializer<LoadLibrary> loadLibrarySerializer = Wrapped(
(ll) => ll.import, (i) => LoadLibrary(i), libraryDependencySerializer);
-TextSerializer<ConstantExpression> constantExpressionSerializer = Wrapped(
- (ce) => Tuple2(ce.constant, ce.type),
- (t) => ConstantExpression(t.first, t.second),
- Tuple2Serializer(constantSerializer, dartTypeSerializer));
+TextSerializer<ConstantExpression> constantExpressionSerializer =
+ Wrapped<Tuple2<Constant, DartType>, ConstantExpression>(
+ (ce) => Tuple2(ce.constant, ce.type),
+ (t) => ConstantExpression(t.first, t.second),
+ Tuple2Serializer(constantSerializer, dartTypeSerializer));
-TextSerializer<InstanceCreation> instanceCreationSerializer = Wrapped(
+TextSerializer<InstanceCreation> instanceCreationSerializer = Wrapped<
+ Tuple6<CanonicalName, List<DartType>, List<CanonicalName>,
+ List<Expression>, List<AssertStatement>, List<Expression>>,
+ InstanceCreation>(
(ic) => Tuple6(
ic.classReference.canonicalName,
ic.typeArguments,
@@ -684,8 +697,12 @@
ic.fieldValues.values.toList(),
ic.asserts,
ic.unusedArguments),
- (t) => InstanceCreation(t.first.getReference(), t.second,
- Map.fromIterables(t.third, t.fourth), t.fifth, t.sixth),
+ (t) => InstanceCreation(
+ t.first.getReference(),
+ t.second,
+ Map.fromIterables(t.third.map((cn) => cn.reference), t.fourth),
+ t.fifth,
+ t.sixth),
Tuple6Serializer(
CanonicalNameSerializer(),
ListSerializer(dartTypeSerializer),
@@ -746,36 +763,39 @@
}
}
-TextSerializer<int> variableDeclarationFlagsSerializer = Wrapped(
- (w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(
- VariableDeclarationFlagTagger(),
- Map.fromIterable(variableDeclarationFlagToName.entries,
- key: (e) => e.value,
- value: (e) => Wrapped((_) => null, (_) => e.key, Nothing())))));
+TextSerializer<int> variableDeclarationFlagsSerializer =
+ Wrapped<List<int>, int>(
+ (w) => List.generate(30, (i) => w & (1 << i))
+ .where((f) => f != 0)
+ .toList(),
+ (u) => u.fold(0, (fs, f) => fs |= f),
+ ListSerializer(Case(VariableDeclarationFlagTagger(),
+ convertFlagsMap(variableDeclarationFlagToName))));
-TextSerializer<VariableDeclaration> variableDeclarationSerializer = Wrapped(
- (v) => Tuple2(v.name, v),
- (t) => t.second..name = t.first,
- Binder<VariableDeclaration>(
- new Wrapped(
- (w) => Tuple4(w.flags, w.type, w.initializer, w.annotations),
- (u) => u.fourth.fold(
- VariableDeclaration(null,
- flags: u.first, type: u.second, initializer: u.third),
- (v, a) => v..addAnnotation(a)),
- Tuple4Serializer(
- variableDeclarationFlagsSerializer,
- dartTypeSerializer,
- new Optional(expressionSerializer),
- new ListSerializer(expressionSerializer))),
- ));
+TextSerializer<VariableDeclaration> variableDeclarationSerializer =
+ Wrapped<Tuple2<String, VariableDeclaration>, VariableDeclaration>(
+ (v) => Tuple2(v.name, v),
+ (t) => t.second..name = t.first,
+ Binder<VariableDeclaration>(
+ new Wrapped<Tuple4<int, DartType, Expression, List<Expression>>,
+ VariableDeclaration>(
+ (w) => Tuple4(w.flags, w.type, w.initializer, w.annotations),
+ (u) => u.fourth.fold(
+ VariableDeclaration(null,
+ flags: u.first, type: u.second, initializer: u.third),
+ (v, a) => v..addAnnotation(a)),
+ Tuple4Serializer(
+ variableDeclarationFlagsSerializer,
+ dartTypeSerializer,
+ new Optional(expressionSerializer),
+ new ListSerializer(expressionSerializer))),
+ ));
-TextSerializer<TypeParameter> typeParameterSerializer = Wrapped(
- (p) => Tuple2(p.name, p),
- (t) => t.second..name = t.first,
- Binder(Wrapped((_) => null, (_) => TypeParameter(), const Nothing())));
+TextSerializer<TypeParameter> typeParameterSerializer =
+ Wrapped<Tuple2<String, TypeParameter>, TypeParameter>(
+ (p) => Tuple2(p.name, p),
+ (t) => t.second..name = t.first,
+ Binder(Wrapped((_) => null, (_) => TypeParameter(), const Nothing())));
TextSerializer<List<TypeParameter>> typeParametersSerializer = new Zip(
new Rebind(
@@ -1048,18 +1068,23 @@
return new YieldStatement(expression);
}
-TextSerializer<AssertStatement> assertStatementSerializer = Wrapped(
- (a) => Tuple2(a.condition, a.message),
- (t) => AssertStatement(t.first, message: t.second),
- Tuple2Serializer(expressionSerializer, Optional(expressionSerializer)));
+TextSerializer<AssertStatement> assertStatementSerializer =
+ Wrapped<Tuple2<Expression, Expression>, AssertStatement>(
+ (a) => Tuple2(a.condition, a.message),
+ (t) => AssertStatement(t.first, message: t.second),
+ Tuple2Serializer(expressionSerializer, Optional(expressionSerializer)));
-TextSerializer<Block> blockSerializer = new Wrapped(
- (w) => Tuple2(w.statements, null),
- (u) => Block(u.first),
- const BlockSerializer());
+TextSerializer<Block> blockSerializer =
+ Wrapped<Tuple2<List<Statement>, Expression>, Block>(
+ (w) => Tuple2(w.statements, null),
+ (u) => Block(u.first),
+ const BlockSerializer());
-TextSerializer<AssertBlock> assertBlockSerializer = new Wrapped(
- (w) => Tuple2(w.statements, null), (u) => u.first, const BlockSerializer());
+TextSerializer<AssertBlock> assertBlockSerializer =
+ Wrapped<Tuple2<List<Statement>, Expression>, AssertBlock>(
+ (w) => Tuple2(w.statements, null),
+ (u) => AssertBlock(u.first),
+ const BlockSerializer());
/// Serializer for [Block]s.
///
@@ -1179,7 +1204,10 @@
return new DoStatement(tuple.first, tuple.second);
}
-TextSerializer<ForStatement> forStatementSerializer = new Wrapped(
+TextSerializer<ForStatement> forStatementSerializer = Wrapped<
+ Tuple2<List<VariableDeclaration>,
+ Tuple3<Expression, List<Expression>, Statement>>,
+ ForStatement>(
(w) => Tuple2(w.variables, Tuple3(w.condition, w.updates, w.body)),
(u) =>
ForStatement(u.first, u.second.first, u.second.second, u.second.third),
@@ -1223,7 +1251,7 @@
(ls) => Tuple2(ls, ls.body),
(t) => t.first..body = t.second,
Bind(
- Wrapped(
+ Wrapped<Tuple2<String, LabeledStatement>, LabeledStatement>(
(ls) => Tuple2("L", ls),
(t) => t.second,
Binder(Wrapped(
@@ -1243,37 +1271,47 @@
return new BreakStatement(node);
}
-TextSerializer<TryFinally> tryFinallySerializer = Wrapped(
- (w) => Tuple2(w.body, w.finalizer),
- (u) => TryFinally(u.first, u.second),
- Tuple2Serializer(statementSerializer, statementSerializer));
+TextSerializer<TryFinally> tryFinallySerializer =
+ Wrapped<Tuple2<Statement, Statement>, TryFinally>(
+ (w) => Tuple2(w.body, w.finalizer),
+ (u) => TryFinally(u.first, u.second),
+ Tuple2Serializer(statementSerializer, statementSerializer));
-TextSerializer<TryCatch> tryCatchSerializer = Wrapped(
- (w) => Tuple2(w.body, w.catches),
- (u) => TryCatch(u.first, u.second),
- Tuple2Serializer(statementSerializer, ListSerializer(catchSerializer)));
+TextSerializer<TryCatch> tryCatchSerializer =
+ Wrapped<Tuple2<Statement, List<Catch>>, TryCatch>(
+ (w) => Tuple2(w.body, w.catches),
+ (u) => TryCatch(u.first, u.second),
+ Tuple2Serializer(statementSerializer, ListSerializer(catchSerializer)));
-TextSerializer<Catch> catchSerializer = Wrapped(
- (w) => Tuple2(w.guard, Tuple2(Tuple2(w.exception, w.stackTrace), w.body)),
- (u) => Catch(u.second.first.first, u.second.second,
- stackTrace: u.second.first.second, guard: u.first),
- Tuple2Serializer(
- dartTypeSerializer,
- Bind(
- Tuple2Serializer(Optional(variableDeclarationSerializer),
- Optional(variableDeclarationSerializer)),
- statementSerializer)));
+TextSerializer<Catch> catchSerializer =
+ Wrapped<
+ Tuple2<
+ DartType,
+ Tuple2<Tuple2<VariableDeclaration, VariableDeclaration>,
+ Statement>>,
+ Catch>(
+ (w) =>
+ Tuple2(w.guard, Tuple2(Tuple2(w.exception, w.stackTrace), w.body)),
+ (u) => Catch(u.second.first.first, u.second.second,
+ stackTrace: u.second.first.second, guard: u.first),
+ Tuple2Serializer(
+ dartTypeSerializer,
+ Bind(
+ Tuple2Serializer(Optional(variableDeclarationSerializer),
+ Optional(variableDeclarationSerializer)),
+ statementSerializer)));
-TextSerializer<SwitchStatement> switchStatementSerializer = Wrapped(
- (w) => Tuple2(w.expression, w.cases),
- (u) => SwitchStatement(u.first, u.second),
- Tuple2Serializer(
- expressionSerializer,
- Zip(
- Bind(ListSerializer<SwitchCase>(switchCaseSerializer),
- ListSerializer(statementSerializer)),
- (SwitchCase c, Statement b) => c..body = b,
- (SwitchCase z) => Tuple2(z, z.body))));
+TextSerializer<SwitchStatement> switchStatementSerializer =
+ Wrapped<Tuple2<Expression, List<SwitchCase>>, SwitchStatement>(
+ (w) => Tuple2(w.expression, w.cases),
+ (u) => SwitchStatement(u.first, u.second),
+ Tuple2Serializer(
+ expressionSerializer,
+ Zip(
+ Bind(ListSerializer<SwitchCase>(switchCaseSerializer),
+ ListSerializer(statementSerializer)),
+ (SwitchCase c, Statement b) => c..body = b,
+ (SwitchCase z) => Tuple2(z, z.body))));
class SwitchCaseTagger implements Tagger<SwitchCase> {
String tag(SwitchCase node) {
@@ -1281,15 +1319,17 @@
}
}
-TextSerializer<SwitchCase> switchCaseCaseSerializer = Wrapped(
- (w) => Tuple2("L", w),
- (u) => u.second,
- Binder(Wrapped(
- (w) => w.expressions,
- (u) => SwitchCase(u, List.filled(u.length, 0), null),
- ListSerializer(expressionSerializer))));
+TextSerializer<SwitchCase> switchCaseCaseSerializer =
+ Wrapped<Tuple2<String, SwitchCase>, SwitchCase>(
+ (w) => Tuple2("L", w),
+ (u) => u.second,
+ Binder(Wrapped<List<Expression>, SwitchCase>(
+ (w) => w.expressions,
+ (u) => SwitchCase(u, List.filled(u.length, 0), null),
+ ListSerializer(expressionSerializer))));
-TextSerializer<SwitchCase> switchCaseDefaultSerializer = Wrapped(
+TextSerializer<SwitchCase> switchCaseDefaultSerializer = Wrapped<
+ Tuple2<String, SwitchCase>, SwitchCase>(
(w) => Tuple2("L", w),
(u) => u.second,
Binder(
@@ -1303,10 +1343,11 @@
TextSerializer<ContinueSwitchStatement> continueSwitchStatementSerializer =
Wrapped((w) => w.target, (u) => ContinueSwitchStatement(u), ScopedUse());
-TextSerializer<FunctionDeclaration> functionDeclarationSerializer = Wrapped(
- (w) => Tuple2(w.variable, w.function),
- (u) => FunctionDeclaration(u.first, u.second),
- Rebind(variableDeclarationSerializer, functionNodeSerializer));
+TextSerializer<FunctionDeclaration> functionDeclarationSerializer =
+ Wrapped<Tuple2<VariableDeclaration, FunctionNode>, FunctionDeclaration>(
+ (w) => Tuple2(w.variable, w.function),
+ (u) => FunctionDeclaration(u.first, u.second),
+ Rebind(variableDeclarationSerializer, functionNodeSerializer));
Case<Statement> statementSerializer =
new Case.uninitialized(const StatementTagger());
@@ -1327,14 +1368,24 @@
}
}
-TextSerializer<AsyncMarker> asyncMarkerSerializer = Case(
- AsyncMarkerTagger(),
- Map.fromIterable(asyncMarkerToName.entries,
- key: (e) => e.value,
- value: (e) => Wrapped((_) => null, (_) => e.key, Nothing())));
+TextSerializer<AsyncMarker> asyncMarkerSerializer =
+ Case(AsyncMarkerTagger(), convertFlagsMap(asyncMarkerToName));
-TextSerializer<Tuple2<FunctionNode, List<Initializer>>>
- functionNodeWithInitializersSerializer = Wrapped(
+// '/**/' comments added to guide formatting.
+
+TextSerializer<Tuple2<FunctionNode, List<Initializer>>> /**/
+ functionNodeWithInitializersSerializer = Wrapped<
+ Tuple2<
+ AsyncMarker,
+ Tuple2< /**/
+ Tuple2< /**/
+ List<TypeParameter>,
+ Tuple3<
+ List<VariableDeclaration>,
+ List<VariableDeclaration>,
+ List<VariableDeclaration>>>,
+ Tuple3<DartType, List<Initializer>, Statement>>>,
+ Tuple2<FunctionNode, List<Initializer>>>(
(w) => Tuple2(
w.first.asyncMarker,
Tuple2(
@@ -1371,10 +1422,11 @@
Optional(ListSerializer(initializerSerializer)),
Optional(statementSerializer)))));
-TextSerializer<FunctionNode> functionNodeSerializer = Wrapped(
- (w) => Tuple2(w, null),
- (u) => u.first,
- functionNodeWithInitializersSerializer);
+TextSerializer<FunctionNode> functionNodeSerializer =
+ Wrapped<Tuple2<FunctionNode, List<Initializer>>, FunctionNode>(
+ (w) => Tuple2(w, null),
+ (u) => u.first,
+ functionNodeWithInitializersSerializer);
const Map<int, String> procedureFlagToName = const {
Procedure.FlagStatic: "static",
@@ -1400,14 +1452,11 @@
}
}
-TextSerializer<int> procedureFlagsSerializer = Wrapped(
+TextSerializer<int> procedureFlagsSerializer = Wrapped<List<int>, int>(
(w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
(u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(
- ProcedureFlagTagger(),
- Map.fromIterable(procedureFlagToName.entries,
- key: (e) => e.value,
- value: (e) => Wrapped((_) => null, (_) => e.key, Nothing())))));
+ ListSerializer(
+ Case(ProcedureFlagTagger(), convertFlagsMap(procedureFlagToName))));
const Map<int, String> fieldFlagToName = const {
Field.FlagFinal: "final",
@@ -1432,14 +1481,10 @@
}
}
-TextSerializer<int> fieldFlagsSerializer = Wrapped(
+TextSerializer<int> fieldFlagsSerializer = Wrapped<List<int>, int>(
(w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
(u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(
- FieldFlagTagger(),
- Map.fromIterable(fieldFlagToName.entries,
- key: (e) => e.value,
- value: (e) => Wrapped((_) => null, (_) => e.key, Nothing())))));
+ ListSerializer(Case(FieldFlagTagger(), convertFlagsMap(fieldFlagToName))));
const Map<int, String> constructorFlagToName = const {
Constructor.FlagConst: "const",
@@ -1457,14 +1502,11 @@
}
}
-TextSerializer<int> constructorFlagsSerializer = Wrapped(
+TextSerializer<int> constructorFlagsSerializer = Wrapped<List<int>, int>(
(w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
(u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(
- ConstructorFlagTagger(),
- Map.fromIterable(constructorFlagToName.entries,
- key: (e) => e.value,
- value: (e) => Wrapped((_) => null, (_) => e.key, Nothing())))));
+ ListSerializer(
+ Case(ConstructorFlagTagger(), convertFlagsMap(constructorFlagToName))));
const Map<int, String> redirectingFactoryConstructorFlagToName = const {
RedirectingFactoryConstructor.FlagConst: "const",
@@ -1483,14 +1525,14 @@
}
}
-TextSerializer<int> redirectingFactoryConstructorFlagsSerializer = Wrapped(
- (w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(
- RedirectingFactoryConstructorFlagTagger(),
- Map.fromIterable(redirectingFactoryConstructorFlagToName.entries,
- key: (e) => e.value,
- value: (e) => Wrapped((_) => null, (_) => e.key, Nothing())))));
+TextSerializer<int> redirectingFactoryConstructorFlagsSerializer =
+ Wrapped<List<int>, int>(
+ (w) => List.generate(30, (i) => w & (1 << i))
+ .where((f) => f != 0)
+ .toList(),
+ (u) => u.fold(0, (fs, f) => fs |= f),
+ ListSerializer(Case(RedirectingFactoryConstructorFlagTagger(),
+ convertFlagsMap(redirectingFactoryConstructorFlagToName))));
class MemberTagger implements Tagger<Member> {
const MemberTagger();
@@ -1523,45 +1565,57 @@
}
}
-TextSerializer<Field> fieldSerializer = Wrapped(
- (w) => Tuple4(w.name, w.flags, w.type, w.initializer),
- (u) =>
- Field(u.first, type: u.third, initializer: u.fourth)..flags = u.second,
- Tuple4Serializer(nameSerializer, fieldFlagsSerializer, dartTypeSerializer,
- Optional(expressionSerializer)));
+TextSerializer<Field> fieldSerializer =
+ Wrapped<Tuple4<Name, int, DartType, Expression>, Field>(
+ (w) => Tuple4(w.name, w.flags, w.type, w.initializer),
+ (u) => Field(u.first, type: u.third, initializer: u.fourth)
+ ..flags = u.second,
+ Tuple4Serializer(nameSerializer, fieldFlagsSerializer,
+ dartTypeSerializer, Optional(expressionSerializer)));
-TextSerializer<Procedure> methodSerializer = Wrapped(
- (w) => Tuple3(w.name, w.flags, w.function),
- (u) => Procedure(u.first, ProcedureKind.Method, u.third)..flags = u.second,
- Tuple3Serializer(
- nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
+TextSerializer<Procedure> methodSerializer =
+ Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
+ (w) => Tuple3(w.name, w.flags, w.function),
+ (u) =>
+ Procedure(u.first, ProcedureKind.Method, u.third)..flags = u.second,
+ Tuple3Serializer(
+ nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
-TextSerializer<Procedure> getterSerializer = Wrapped(
- (w) => Tuple3(w.name, w.flags, w.function),
- (u) => Procedure(u.first, ProcedureKind.Getter, u.third)..flags = u.second,
- Tuple3Serializer(
- nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
+TextSerializer<Procedure> getterSerializer =
+ Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
+ (w) => Tuple3(w.name, w.flags, w.function),
+ (u) =>
+ Procedure(u.first, ProcedureKind.Getter, u.third)..flags = u.second,
+ Tuple3Serializer(
+ nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
-TextSerializer<Procedure> setterSerializer = Wrapped(
- (w) => Tuple3(w.name, w.flags, w.function),
- (u) => Procedure(u.first, ProcedureKind.Setter, u.third)..flags = u.second,
- Tuple3Serializer(
- nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
+TextSerializer<Procedure> setterSerializer =
+ Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
+ (w) => Tuple3(w.name, w.flags, w.function),
+ (u) =>
+ Procedure(u.first, ProcedureKind.Setter, u.third)..flags = u.second,
+ Tuple3Serializer(
+ nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
-TextSerializer<Procedure> operatorSerializer = Wrapped(
- (w) => Tuple3(w.name, w.flags, w.function),
- (u) =>
- Procedure(u.first, ProcedureKind.Operator, u.third)..flags = u.second,
- Tuple3Serializer(
- nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
+TextSerializer<Procedure> operatorSerializer =
+ Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
+ (w) => Tuple3(w.name, w.flags, w.function),
+ (u) => Procedure(u.first, ProcedureKind.Operator, u.third)
+ ..flags = u.second,
+ Tuple3Serializer(
+ nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
-TextSerializer<Procedure> factorySerializer = Wrapped(
- (w) => Tuple3(w.name, w.flags, w.function),
- (u) => Procedure(u.first, ProcedureKind.Factory, u.third)..flags = u.second,
- Tuple3Serializer(
- nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
+TextSerializer<Procedure> factorySerializer =
+ Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
+ (w) => Tuple3(w.name, w.flags, w.function),
+ (u) => Procedure(u.first, ProcedureKind.Factory, u.third)
+ ..flags = u.second,
+ Tuple3Serializer(
+ nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
-TextSerializer<Constructor> constructorSerializer = Wrapped(
+TextSerializer<Constructor> constructorSerializer = Wrapped<
+ Tuple3<Name, int, Tuple2<FunctionNode, List<Initializer>>>,
+ Constructor>(
(w) => Tuple3(w.name, w.flags, Tuple2(w.function, w.initializers)),
(u) =>
Constructor(u.third.first, name: u.first, initializers: u.third.second)
@@ -1570,7 +1624,16 @@
functionNodeWithInitializersSerializer));
TextSerializer<RedirectingFactoryConstructor>
- redirectingFactoryConstructorSerializer = Wrapped(
+ redirectingFactoryConstructorSerializer = Wrapped<
+ Tuple4<
+ Name,
+ int,
+ CanonicalName,
+ Tuple2<
+ List<TypeParameter>,
+ Tuple4<List<VariableDeclaration>, List<VariableDeclaration>,
+ List<VariableDeclaration>, List<DartType>>>>,
+ RedirectingFactoryConstructor>(
(w) => Tuple4(
w.name,
w.flags,
@@ -1586,7 +1649,7 @@
.toList(),
w.namedParameters,
w.typeArguments))),
- (u) => RedirectingFactoryConstructor(u.third,
+ (u) => RedirectingFactoryConstructor(u.third.reference,
name: u.first,
typeParameters: u.fourth.first,
positionalParameters:
@@ -1609,10 +1672,11 @@
Case<Member> memberSerializer = new Case.uninitialized(const MemberTagger());
-TextSerializer<LibraryPart> libraryPartSerializer = Wrapped(
- (w) => Tuple2(w.partUri, w.annotations),
- (u) => LibraryPart(u.second, u.first),
- Tuple2Serializer(DartString(), ListSerializer(expressionSerializer)));
+TextSerializer<LibraryPart> libraryPartSerializer =
+ Wrapped<Tuple2<String, List<Expression>>, LibraryPart>(
+ (w) => Tuple2(w.partUri, w.annotations),
+ (u) => LibraryPart(u.second, u.first),
+ Tuple2Serializer(DartString(), ListSerializer(expressionSerializer)));
class LibraryTagger implements Tagger<Library> {
const LibraryTagger();
@@ -1638,16 +1702,16 @@
}
}
-TextSerializer<int> libraryFlagsSerializer = Wrapped(
+TextSerializer<int> libraryFlagsSerializer = Wrapped<List<int>, int>(
(w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
(u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(
- LibraryFlagTagger(),
- Map.fromIterable(libraryFlagToName.entries,
- key: (e) => e.value,
- value: (e) => Wrapped((_) => null, (_) => e.key, Nothing())))));
+ ListSerializer(
+ Case(LibraryFlagTagger(), convertFlagsMap(libraryFlagToName))));
-TextSerializer<Library> librarySerializer = new Wrapped(
+TextSerializer<Library> librarySerializer = new Wrapped<
+ Tuple7<Uri, int, List<LibraryPart>, List<Member>, List<Class>,
+ List<Typedef>, List<Extension>>,
+ Library>(
(w) => Tuple7(w.importUri, w.flags, w.parts, [...w.fields, ...w.procedures],
w.classes, w.typedefs, w.extensions),
(u) => Library(u.first,
@@ -1669,16 +1733,17 @@
ListSerializer(extensionSerializer)),
);
-TextSerializer<Component> componentSerializer = Wrapped(
- (w) => w.libraries,
- (u) => Component(nameRoot: CanonicalName.root(), libraries: u),
- ListSerializer(librarySerializer));
+TextSerializer<Component> componentSerializer =
+ Wrapped<List<Library>, Component>(
+ (w) => w.libraries,
+ (u) => Component(nameRoot: CanonicalName.root(), libraries: u),
+ ListSerializer(librarySerializer));
class ShowHideTagger implements Tagger<Combinator> {
String tag(Combinator node) => node.isShow ? "show" : "hide";
}
-TextSerializer<Combinator> showSerializer = Wrapped(
+TextSerializer<Combinator> showSerializer = Wrapped<List<String>, Combinator>(
(c) => c.names, (ns) => Combinator(true, ns), ListSerializer(DartString()));
TextSerializer<Combinator> hideSerializer = Wrapped((c) => c.names,
@@ -1689,7 +1754,9 @@
"hide": hideSerializer,
});
-TextSerializer<LibraryDependency> libraryDependencySerializer = Wrapped(
+TextSerializer<LibraryDependency> libraryDependencySerializer = Wrapped<
+ Tuple5<CanonicalName, String, List<Combinator>, int, List<Expression>>,
+ LibraryDependency>(
(ld) => Tuple5(ld.importedLibraryReference.canonicalName, ld.name,
ld.combinators, ld.flags, ld.annotations),
(t) => LibraryDependency.byReference(
@@ -1725,64 +1792,78 @@
}
TextSerializer<BoolConstant> boolConstantSerializer =
- Wrapped((w) => w.value, (u) => BoolConstant(u), DartBool());
+ Wrapped<bool, BoolConstant>(
+ (w) => w.value, (u) => BoolConstant(u), DartBool());
TextSerializer<DoubleConstant> doubleConstantSerializer =
- Wrapped((w) => w.value, (u) => DoubleConstant(u), DartDouble());
+ Wrapped<double, DoubleConstant>(
+ (w) => w.value, (u) => DoubleConstant(u), DartDouble());
TextSerializer<IntConstant> intConstantSerializer =
- Wrapped((w) => w.value, (u) => IntConstant(u), DartInt());
+ Wrapped<int, IntConstant>((w) => w.value, (u) => IntConstant(u), DartInt());
-TextSerializer<ListConstant> listConstantSerializer = Wrapped(
- (w) => Tuple2(w.typeArgument, w.entries),
- (u) => ListConstant(u.first, u.second),
- Tuple2Serializer(dartTypeSerializer, ListSerializer(constantSerializer)));
+TextSerializer<ListConstant> listConstantSerializer =
+ Wrapped<Tuple2<DartType, List<Constant>>, ListConstant>(
+ (w) => Tuple2(w.typeArgument, w.entries),
+ (u) => ListConstant(u.first, u.second),
+ Tuple2Serializer(
+ dartTypeSerializer, ListSerializer(constantSerializer)));
-TextSerializer<MapConstant> mapConstantSerializer = Wrapped(
- (w) => Tuple3(w.keyType, w.valueType, w.entries),
- (u) => MapConstant(u.first, u.second, u.third),
- Tuple3Serializer(
- dartTypeSerializer,
- dartTypeSerializer,
- Zip(
- Tuple2Serializer(ListSerializer(constantSerializer),
- ListSerializer(constantSerializer)),
- (k, v) => ConstantMapEntry(k, v),
- (z) => Tuple2(z.key, z.value))));
+TextSerializer<MapConstant> mapConstantSerializer =
+ Wrapped<Tuple3<DartType, DartType, List<ConstantMapEntry>>, MapConstant>(
+ (w) => Tuple3(w.keyType, w.valueType, w.entries),
+ (u) => MapConstant(u.first, u.second, u.third),
+ Tuple3Serializer(
+ dartTypeSerializer,
+ dartTypeSerializer,
+ Zip(
+ Tuple2Serializer(ListSerializer(constantSerializer),
+ ListSerializer(constantSerializer)),
+ (k, v) => ConstantMapEntry(k, v),
+ (z) => Tuple2(z.key, z.value))));
TextSerializer<NullConstant> nullConstantSerializer =
- Wrapped((w) => null, (u) => NullConstant(), Nothing());
+ Wrapped<void, NullConstant>((w) => null, (u) => NullConstant(), Nothing());
TextSerializer<PartialInstantiationConstant>
- partialInstantiationConstantSerializer = Wrapped(
+ partialInstantiationConstantSerializer = Wrapped<
+ Tuple2<TearOffConstant, List<DartType>>,
+ PartialInstantiationConstant>(
(w) => Tuple2(w.tearOffConstant, w.types),
(u) => PartialInstantiationConstant(u.first, u.second),
Tuple2Serializer(
tearOffConstantSerializer, ListSerializer(dartTypeSerializer)));
-TextSerializer<SetConstant> setConstantSerializer = Wrapped(
- (w) => Tuple2(w.typeArgument, w.entries),
- (u) => SetConstant(u.first, u.second),
- Tuple2Serializer(dartTypeSerializer, ListSerializer(constantSerializer)));
+TextSerializer<SetConstant> setConstantSerializer =
+ Wrapped<Tuple2<DartType, List<Constant>>, SetConstant>(
+ (w) => Tuple2(w.typeArgument, w.entries),
+ (u) => SetConstant(u.first, u.second),
+ Tuple2Serializer(
+ dartTypeSerializer, ListSerializer(constantSerializer)));
TextSerializer<StringConstant> stringConstantSerializer =
- Wrapped((w) => w.value, (u) => StringConstant(u), DartString());
+ Wrapped<String, StringConstant>(
+ (w) => w.value, (u) => StringConstant(u), DartString());
-TextSerializer<SymbolConstant> symbolConstantSerializer = Wrapped(
- (w) => Tuple2(w.name, w.libraryReference?.canonicalName),
- (u) => SymbolConstant(u.first, u.second?.getReference()),
- Tuple2Serializer(DartString(), Optional(CanonicalNameSerializer())));
+TextSerializer<SymbolConstant> symbolConstantSerializer =
+ Wrapped<Tuple2<String, CanonicalName>, SymbolConstant>(
+ (w) => Tuple2(w.name, w.libraryReference?.canonicalName),
+ (u) => SymbolConstant(u.first, u.second?.getReference()),
+ Tuple2Serializer(DartString(), Optional(CanonicalNameSerializer())));
-TextSerializer<TearOffConstant> tearOffConstantSerializer = Wrapped(
- (w) => w.procedureReference.canonicalName,
- (u) => TearOffConstant.byReference(u.getReference()),
- CanonicalNameSerializer());
+TextSerializer<TearOffConstant> tearOffConstantSerializer =
+ Wrapped<CanonicalName, TearOffConstant>(
+ (w) => w.procedureReference.canonicalName,
+ (u) => TearOffConstant.byReference(u.getReference()),
+ CanonicalNameSerializer());
TextSerializer<TypeLiteralConstant> typeLiteralConstantSerializer =
- Wrapped((w) => w.type, (u) => TypeLiteralConstant(u), dartTypeSerializer);
+ Wrapped<DartType, TypeLiteralConstant>(
+ (w) => w.type, (u) => TypeLiteralConstant(u), dartTypeSerializer);
-TextSerializer<UnevaluatedConstant> unevaluatedConstantSerializer = Wrapped(
- (w) => w.expression, (u) => UnevaluatedConstant(u), expressionSerializer);
+TextSerializer<UnevaluatedConstant> unevaluatedConstantSerializer =
+ Wrapped<Expression, UnevaluatedConstant>((w) => w.expression,
+ (u) => UnevaluatedConstant(u), expressionSerializer);
TextSerializer<InstanceConstant> instanceConstantSerializer =
Wrapped<
@@ -1826,42 +1907,46 @@
}
}
-TextSerializer<AssertInitializer> assertInitializerSerializer = Wrapped(
- (w) => w.statement, (u) => AssertInitializer(u), statementSerializer);
+TextSerializer<AssertInitializer> assertInitializerSerializer =
+ Wrapped<Statement, AssertInitializer>(
+ (w) => w.statement, (u) => AssertInitializer(u), statementSerializer);
-TextSerializer<FieldInitializer> fieldInitializerSerializer = Wrapped(
- (w) => Tuple2(w.fieldReference.canonicalName, w.value),
- (u) => FieldInitializer.byReference(u.first.getReference(), u.second),
- Tuple2Serializer(CanonicalNameSerializer(), expressionSerializer));
+TextSerializer<FieldInitializer> fieldInitializerSerializer =
+ Wrapped<Tuple2<CanonicalName, Expression>, FieldInitializer>(
+ (w) => Tuple2(w.fieldReference.canonicalName, w.value),
+ (u) => FieldInitializer.byReference(u.first.getReference(), u.second),
+ Tuple2Serializer(CanonicalNameSerializer(), expressionSerializer));
TextSerializer<InvalidInitializer> invalidInitializerSerializer =
- Wrapped((_) => null, (_) => InvalidInitializer(), Nothing());
+ Wrapped<void, InvalidInitializer>(
+ (_) => null, (_) => InvalidInitializer(), Nothing());
-TextSerializer<LocalInitializer> localInitializerSerializer = Wrapped(
- (w) => w.variable,
- (u) => LocalInitializer(u),
- variableDeclarationSerializer);
+TextSerializer<LocalInitializer> localInitializerSerializer =
+ Wrapped<VariableDeclaration, LocalInitializer>((w) => w.variable,
+ (u) => LocalInitializer(u), variableDeclarationSerializer);
TextSerializer<RedirectingInitializer> redirectingInitializerSerializer =
- Wrapped(
+ Wrapped<Tuple2<CanonicalName, Arguments>, RedirectingInitializer>(
(w) => Tuple2(w.targetReference.canonicalName, w.arguments),
(u) => RedirectingInitializer.byReference(
u.first.getReference(), u.second),
Tuple2Serializer(CanonicalNameSerializer(), argumentsSerializer));
-TextSerializer<SuperInitializer> superInitializerSerializer = Wrapped(
- (w) => Tuple2(w.targetReference.canonicalName, w.arguments),
- (u) => SuperInitializer.byReference(u.first.getReference(), u.second),
- Tuple2Serializer(CanonicalNameSerializer(), argumentsSerializer));
+TextSerializer<SuperInitializer> superInitializerSerializer =
+ Wrapped<Tuple2<CanonicalName, Arguments>, SuperInitializer>(
+ (w) => Tuple2(w.targetReference.canonicalName, w.arguments),
+ (u) => SuperInitializer.byReference(u.first.getReference(), u.second),
+ Tuple2Serializer(CanonicalNameSerializer(), argumentsSerializer));
Case<Initializer> initializerSerializer =
Case.uninitialized(InitializerTagger());
-TextSerializer<Supertype> supertypeSerializer = Wrapped(
- (w) => Tuple2(w.className.canonicalName, w.typeArguments),
- (u) => Supertype.byReference(u.first.getReference(), u.second),
- Tuple2Serializer(
- CanonicalNameSerializer(), ListSerializer(dartTypeSerializer)));
+TextSerializer<Supertype> supertypeSerializer =
+ Wrapped<Tuple2<CanonicalName, List<DartType>>, Supertype>(
+ (w) => Tuple2(w.className.canonicalName, w.typeArguments),
+ (u) => Supertype.byReference(u.first.getReference(), u.second),
+ Tuple2Serializer(
+ CanonicalNameSerializer(), ListSerializer(dartTypeSerializer)));
const Map<int, String> classFlagToName = const {
Class.FlagAbstract: "abstract",
@@ -1881,16 +1966,20 @@
}
}
-TextSerializer<int> classFlagsSerializer = Wrapped(
+TextSerializer<int> classFlagsSerializer = Wrapped<List<int>, int>(
(w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
(u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(
- ClassFlagTagger(),
- Map.fromIterable(classFlagToName.entries,
- key: (e) => e.value,
- value: (e) => Wrapped((_) => null, (_) => e.key, Nothing())))));
+ ListSerializer(Case(ClassFlagTagger(), convertFlagsMap(classFlagToName))));
-TextSerializer<Class> classSerializer = Wrapped(
+TextSerializer<Class> classSerializer = Wrapped<
+ Tuple3<
+ String,
+ int,
+ Tuple2<
+ List<TypeParameter>,
+ /* Comment added to guide formatting. */
+ Tuple4<Supertype, Supertype, List<Supertype>, List<Member>>>>,
+ Class>(
(w) => Tuple3(
w.name,
w.flags,
@@ -1928,11 +2017,13 @@
ListSerializer(supertypeSerializer),
ListSerializer(memberSerializer)))));
-TextSerializer<Typedef> typedefSerializer = Wrapped(
- (w) => Tuple2(w.name, Tuple2(w.typeParameters, w.type)),
- (u) => Typedef(u.first, u.second.second, typeParameters: u.second.first),
- Tuple2Serializer(
- DartString(), Bind(typeParametersSerializer, dartTypeSerializer)));
+TextSerializer<Typedef> typedefSerializer =
+ Wrapped<Tuple2<String, Tuple2<List<TypeParameter>, DartType>>, Typedef>(
+ (w) => Tuple2(w.name, Tuple2(w.typeParameters, w.type)),
+ (u) =>
+ Typedef(u.first, u.second.second, typeParameters: u.second.first),
+ Tuple2Serializer(
+ DartString(), Bind(typeParametersSerializer, dartTypeSerializer)));
const Map<int, String> extensionMemberDescriptorFlagToName = const {
ExtensionMemberDescriptor.FlagStatic: "static",
@@ -1948,14 +2039,14 @@
}
}
-TextSerializer<int> extensionMemberDescriptorFlagsSerializer = Wrapped(
- (w) => List.generate(30, (i) => w & (1 << i)).where((f) => f != 0).toList(),
- (u) => u.fold(0, (fs, f) => fs |= f),
- ListSerializer(Case(
- ExtensionMemberDescriptorFlagTagger(),
- Map.fromIterable(extensionMemberDescriptorFlagToName.entries,
- key: (e) => e.value,
- value: (e) => Wrapped((_) => null, (_) => e.key, Nothing())))));
+TextSerializer<int> extensionMemberDescriptorFlagsSerializer =
+ Wrapped<List<int>, int>(
+ (w) => List.generate(30, (i) => w & (1 << i))
+ .where((f) => f != 0)
+ .toList(),
+ (u) => u.fold(0, (fs, f) => fs |= f),
+ ListSerializer(Case(ExtensionMemberDescriptorFlagTagger(),
+ convertFlagsMap(extensionMemberDescriptorFlagToName))));
const Map<ExtensionMemberKind, String> extensionMemberKindToName = const {
ExtensionMemberKind.Field: "field",
@@ -1976,13 +2067,11 @@
}
TextSerializer<ExtensionMemberKind> extensionMemberKindSerializer = Case(
- ExtensionMemberKindTagger(),
- Map.fromIterable(extensionMemberKindToName.entries,
- key: (e) => e.value,
- value: (e) => Wrapped((_) => null, (_) => e.key, Nothing())));
+ ExtensionMemberKindTagger(), convertFlagsMap(extensionMemberKindToName));
TextSerializer<ExtensionMemberDescriptor> extensionMemberDescriptorSerializer =
- Wrapped(
+ Wrapped<Tuple4<Name, ExtensionMemberKind, int, CanonicalName>,
+ ExtensionMemberDescriptor>(
(w) => Tuple4(w.name, w.kind, w.flags, w.member.canonicalName),
(u) => ExtensionMemberDescriptor()
..name = u.first
@@ -1995,7 +2084,10 @@
extensionMemberDescriptorFlagsSerializer,
CanonicalNameSerializer()));
-TextSerializer<Extension> extensionSerializer = Wrapped(
+TextSerializer<Extension> extensionSerializer = Wrapped<
+ Tuple3<String, Tuple2<List<TypeParameter>, DartType>,
+ List<ExtensionMemberDescriptor>>,
+ Extension>(
(w) => Tuple3(w.name, Tuple2(w.typeParameters, w.onType), w.members),
(u) => Extension(
name: u.first,
@@ -2135,3 +2227,15 @@
"super": superInitializerSerializer,
});
}
+
+Map<String, Wrapped<void, T>> convertFlagsMap<T>(Map<T, String> map) {
+ return map.entries.toMap(
+ key: (e) => e.value,
+ value: (e) => Wrapped((_) => null, (_) => e.key, Nothing()));
+}
+
+extension MapFromIterable<E> on Iterable<E> {
+ Map<K, V> toMap<K, V>({K Function(E) key, V Function(E) value}) {
+ return {for (E e in this) key(e): value(e)};
+ }
+}
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index 1732869..dc4c5f73 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -6,7 +6,7 @@
publish_to: none
environment:
- sdk: '>=2.2.2 <3.0.0'
+ sdk: '>=2.6.0 <3.0.0'
dependencies:
meta: ^1.0.0
dev_dependencies:
diff --git a/pkg/kernel/test/binary/can_read_platform_test.dart b/pkg/kernel/test/binary/can_read_platform_test.dart
new file mode 100644
index 0000000..4984a0b
--- /dev/null
+++ b/pkg/kernel/test/binary/can_read_platform_test.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2020, 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.
+
+import 'dart:io';
+
+import 'package:kernel/binary/ast_from_binary.dart';
+import 'package:kernel/kernel.dart';
+
+main() {
+ File exe = new File(Platform.resolvedExecutable).absolute;
+ int steps = 0;
+ Directory parent = exe.parent.parent;
+ while (true) {
+ Set<String> foundDirs = {};
+ for (FileSystemEntity entry in parent.listSync(recursive: false)) {
+ if (entry is Directory) {
+ List<String> pathSegments = entry.uri.pathSegments;
+ String name = pathSegments[pathSegments.length - 2];
+ foundDirs.add(name);
+ }
+ }
+ if (foundDirs.contains("pkg") &&
+ foundDirs.contains("tools") &&
+ foundDirs.contains("tests")) {
+ break;
+ }
+ steps++;
+ if (parent.uri == parent.parent.uri) {
+ throw "Reached end without finding the root.";
+ }
+ parent = parent.parent;
+ }
+ // We had to go $steps steps to reach the "root" --- now we should go 2 steps
+ // shorter to be in the "compiled dir".
+ parent = exe.parent;
+ for (int i = steps - 2; i >= 0; i--) {
+ parent = parent.parent;
+ }
+
+ List<File> dills = [];
+ for (FileSystemEntity entry in parent.listSync(recursive: false)) {
+ if (entry is File) {
+ if (entry.path.toLowerCase().endsWith(".dill")) {
+ dills.add(entry);
+ }
+ }
+ }
+ Directory sdk = new Directory.fromUri(parent.uri.resolve("dart-sdk/"));
+ for (FileSystemEntity entry in sdk.listSync(recursive: true)) {
+ if (entry is File) {
+ if (entry.path.toLowerCase().endsWith(".dill")) {
+ dills.add(entry);
+ }
+ }
+ }
+
+ print("Found ${dills.length} dills!");
+
+ List<File> errors = [];
+ for (File dill in dills) {
+ if (!canRead(dill)) {
+ errors.add(dill);
+ }
+ }
+ if (errors.isEmpty) {
+ print("Read all OK.");
+ } else {
+ print("Errors when reading:");
+ for (File error in errors) {
+ print(error);
+ }
+ exitCode = 1;
+ }
+}
+
+bool canRead(File dill) {
+ print("Reading $dill");
+ List<int> bytes = dill.readAsBytesSync();
+
+ try {
+ Component component = new Component();
+ new BinaryBuilderWithMetadata(bytes).readComponent(component);
+ int libs = component.libraries.length;
+
+ component = new Component();
+ new BinaryBuilder(bytes).readComponent(component);
+ if (libs != component.libraries.length) {
+ throw "Didn't get the same number of libraries: $libs when reading with "
+ "BinaryBuilderWithMetadata and ${component.libraries.length} "
+ "when reading with BinaryBuilder";
+ }
+
+ return true;
+ } catch (e, st) {
+ print("Error for $dill:");
+ print(e);
+ print(st);
+ print("");
+ print("--------------------");
+ print("");
+ return false;
+ }
+}
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index cb51ea4..3a41006 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -713,9 +713,10 @@
bool EnqueueEntrypointInvocationAndNotifySpawner(Thread* thread) {
auto isolate = thread->isolate();
+ auto zone = thread->zone();
// Step 1) Resolve the entrypoint function.
- auto& result = Object::Handle(thread->zone(), state_->ResolveFunction());
+ auto& result = Object::Handle(zone, state_->ResolveFunction());
const bool is_spawn_uri = state_->is_spawn_uri();
if (result.IsError()) {
ASSERT(is_spawn_uri);
@@ -723,23 +724,22 @@
return false;
}
ASSERT(result.IsFunction());
- auto& func = Function::Handle(thread->zone(), Function::Cast(result).raw());
+ auto& func = Function::Handle(zone, Function::Cast(result).raw());
func = func.ImplicitClosureFunction();
const auto& entrypoint_closure =
- Object::Handle(func.ImplicitStaticClosure());
+ Object::Handle(zone, func.ImplicitStaticClosure());
// Step 2) Enqueue delayed invocation of entrypoint callback.
- const Array& args = Array::Handle(Array::New(4));
+ const Array& args = Array::Handle(zone, Array::New(4));
args.SetAt(0, entrypoint_closure);
- args.SetAt(1, Instance::Handle(state_->BuildArgs(thread)));
- args.SetAt(2, Instance::Handle(state_->BuildMessage(thread)));
+ args.SetAt(1, Instance::Handle(zone, state_->BuildArgs(thread)));
+ args.SetAt(2, Instance::Handle(zone, state_->BuildMessage(thread)));
args.SetAt(3, is_spawn_uri ? Bool::True() : Bool::False());
- const auto& lib = Library::Handle(Library::IsolateLibrary());
- const auto& entry_name =
- String::Handle(String::New("_delayEntrypointInvocation"));
+ const auto& lib = Library::Handle(zone, Library::IsolateLibrary());
+ const auto& entry_name = String::Handle(zone, String::New("_startIsolate"));
const auto& entry_point =
- Function::Handle(lib.LookupLocalFunction(entry_name));
+ Function::Handle(zone, lib.LookupLocalFunction(entry_name));
ASSERT(entry_point.IsFunction() && !entry_point.IsNull());
result = DartEntry::InvokeFunction(entry_point, args);
if (result.IsError()) {
@@ -749,15 +749,15 @@
// Step 3) Pause the isolate if required & Notify parent isolate about
// isolate creation.
- const auto& capabilities = Array::Handle(thread->zone(), Array::New(2));
- auto& capability = Capability::Handle(thread->zone());
+ const auto& capabilities = Array::Handle(zone, Array::New(2));
+ auto& capability = Capability::Handle(zone);
capability = Capability::New(isolate->pause_capability());
capabilities.SetAt(0, capability);
capability = Capability::New(isolate->terminate_capability());
capabilities.SetAt(1, capability);
const auto& send_port =
- SendPort::Handle(SendPort::New(isolate->main_port()));
- const auto& message = Array::Handle(thread->zone(), Array::New(2));
+ SendPort::Handle(zone, SendPort::New(isolate->main_port()));
+ const auto& message = Array::Handle(zone, Array::New(2));
message.SetAt(0, send_port);
message.SetAt(1, capabilities);
if (state_->paused()) {
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 73afe4c..e3e32f3 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -14,7 +14,6 @@
dart/data_uri_import_test/none: SkipByDesign
dart/emit_aot_size_info_flag_test: Pass, Slow # Spawns several subprocesses
dart/isolates/*: Pass, Slow # Tests use many isolates and take a longer time.
-dart/isolates/dart_api_create_lightweight_isolate_test: Skip # Issue #44180
dart/minimal_kernel_test: Pass, Slow # Spawns several subprocesses
dart/null_safety_autodetection_in_kernel_compiler_test: Pass, Slow # Spawns several subprocesses
dart/slow_path_shared_stub_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
@@ -24,7 +23,6 @@
dart_2/data_uri_import_test/none: SkipByDesign
dart_2/emit_aot_size_info_flag_test: Pass, Slow # Spawns several subprocesses
dart_2/isolates/*: Pass, Slow # Tests use many isolates and take a longer time.
-dart_2/isolates/dart_api_create_lightweight_isolate_test: Skip # Issue #44180
dart_2/minimal_kernel_test: Pass, Slow # Spawns several subprocesses
dart_2/null_safety_autodetection_in_kernel_compiler_test: Pass, Slow # Spawns several subprocesses
dart_2/slow_path_shared_stub_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
@@ -142,7 +140,9 @@
dart/*: SkipByDesign # Migrated tests are not supposed to run on non-NNBD bots.
[ $system == android ]
+dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # On android this test does not work due to not being able to identify library uri.
dart/sdk_hash_test: SkipByDesign # The test doesn't know location of cross-platform gen_snapshot
+dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # On android this test does not work due to not being able to identify library uri.
dart_2/sdk_hash_test: SkipByDesign # The test doesn't know location of cross-platform gen_snapshot
[ $system == fuchsia ]
@@ -160,7 +160,9 @@
[ $system == windows ]
cc/CorelibCompilerStats: Skip
dart/disassemble_determinism_test: Slow, Pass # Times out on slower bots.
+dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/40579: Dart C API symbols not available.
dart_2/disassemble_determinism_test: Slow, Pass # Times out on slower bots.
+dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/40579: Dart C API symbols not available.
[ $arch == ia32 && $mode == debug && $system == windows ]
dart/transferable_test: Skip # This is performance test and somehow debug win ia32 bot's performance is unpredictable
@@ -183,11 +185,13 @@
[ $builder_tag == obfuscated && $compiler == dartkp ]
dart/extension_names_test: SkipByDesign # No demangling (obfuscated).
dart/extension_unnamed_names_test: SkipByDesign # No demangling (obfuscated).
+dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/44215: This test relies on non-obfuscated library uris.
dart/optimized_stacktrace_line_and_column_test: SkipByDesign # Looks for filenames in stacktrace output
dart/optimized_stacktrace_line_test: SkipByDesign # Looks for filenames in stacktrace output
dart/regress_37382_test: SkipByDesign # Matches the type arguments names
dart_2/extension_names_test: SkipByDesign # No demangling (obfuscated).
dart_2/extension_unnamed_names_test: SkipByDesign # No demangling (obfuscated).
+dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/44215: This test relies on non-obfuscated library uris.
dart_2/optimized_stacktrace_line_and_column_test: SkipByDesign # Looks for filenames in stacktrace output
dart_2/optimized_stacktrace_line_test: SkipByDesign # Looks for filenames in stacktrace output
dart_2/regress_37382_test: SkipByDesign # Matches the type arguments names
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 535b34c..9f3015f 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2846,7 +2846,7 @@
}
const auto& intermediate =
*new (zone_) compiler::ffi::NativeRegistersLocation(
- dst_payload_type, dst_container_type, scratch);
+ zone_, dst_payload_type, dst_container_type, scratch);
EmitNativeMove(intermediate, source, temp);
EmitNativeMove(destination, intermediate, temp);
if (TMP == kNoRegister) {
diff --git a/runtime/vm/compiler/ffi/native_calling_convention.cc b/runtime/vm/compiler/ffi/native_calling_convention.cc
index 2ac1445..fe3881c 100644
--- a/runtime/vm/compiler/ffi/native_calling_convention.cc
+++ b/runtime/vm/compiler/ffi/native_calling_convention.cc
@@ -4,11 +4,10 @@
#include "vm/compiler/ffi/native_calling_convention.h"
-#include "vm/compiler/ffi/marshaller.h"
#include "vm/compiler/ffi/native_location.h"
#include "vm/compiler/ffi/native_type.h"
-#include "vm/log.h"
-#include "vm/symbols.h"
+#include "vm/cpu.h"
+#include "vm/zone_text_buffer.h"
namespace dart {
@@ -82,13 +81,13 @@
const Register register_1 = AllocateCpuRegister();
const Register register_2 = AllocateCpuRegister();
return *new (zone_) NativeRegistersLocation(
- payload_type, container_type, register_1, register_2);
+ zone_, payload_type, container_type, register_1, register_2);
}
} else {
ASSERT(payload_type.SizeInBytes() <= target::kWordSize);
if (cpu_regs_used + 1 <= CallingConventions::kNumArgRegs) {
return *new (zone_) NativeRegistersLocation(
- payload_type, container_type, AllocateCpuRegister());
+ zone_, payload_type, container_type, AllocateCpuRegister());
} else {
// Transfer on stack.
}
@@ -232,12 +231,12 @@
ASSERT(container_type.IsInt() || container_type.IsVoid());
if (container_type.SizeInBytes() == 8 && target::kWordSize == 4) {
return *new (zone) NativeRegistersLocation(
- payload_type, container_type, CallingConventions::kReturnReg,
+ zone, payload_type, container_type, CallingConventions::kReturnReg,
CallingConventions::kSecondReturnReg);
}
ASSERT(container_type.SizeInBytes() <= target::kWordSize);
- return *new (zone) NativeRegistersLocation(payload_type, container_type,
+ return *new (zone) NativeRegistersLocation(zone, payload_type, container_type,
CallingConventions::kReturnReg);
}
@@ -261,23 +260,41 @@
return Utils::RoundUp(max_height_in_bytes, compiler::target::kWordSize);
}
-const char* NativeCallingConvention::ToCString() const {
- char buffer[1024];
- BufferFormatter bf(buffer, 1024);
- PrintTo(&bf);
- return Thread::Current()->zone()->MakeCopyOfString(buffer);
-}
-
-void NativeCallingConvention::PrintTo(BaseTextBuffer* f) const {
- f->AddString("(");
+void NativeCallingConvention::PrintTo(BaseTextBuffer* f,
+ bool multi_line) const {
+ if (!multi_line) {
+ f->AddString("(");
+ }
for (intptr_t i = 0; i < argument_locations_.length(); i++) {
if (i > 0) {
- f->AddString(", ");
+ if (multi_line) {
+ f->AddString("\n");
+ } else {
+ f->AddString(", ");
+ }
}
argument_locations_[i]->PrintTo(f);
}
- f->AddString(") => ");
+ if (multi_line) {
+ f->AddString("\n=>\n");
+ } else {
+ f->AddString(") => ");
+ }
return_location_.PrintTo(f);
+ if (multi_line) {
+ f->AddString("\n");
+ }
+}
+
+const char* NativeCallingConvention::ToCString(Zone* zone,
+ bool multi_line) const {
+ ZoneTextBuffer textBuffer(zone);
+ PrintTo(&textBuffer, multi_line);
+ return textBuffer.buffer();
+}
+
+const char* NativeCallingConvention::ToCString(bool multi_line) const {
+ return ToCString(Thread::Current()->zone(), multi_line);
}
} // namespace ffi
diff --git a/runtime/vm/compiler/ffi/native_calling_convention.h b/runtime/vm/compiler/ffi/native_calling_convention.h
index 4948910..bb10887 100644
--- a/runtime/vm/compiler/ffi/native_calling_convention.h
+++ b/runtime/vm/compiler/ffi/native_calling_convention.h
@@ -9,9 +9,7 @@
#error "AOT runtime should not use compiler sources (including header files)"
#endif // defined(DART_PRECOMPILED_RUNTIME)
-#include <platform/globals.h>
-
-#include "vm/compiler/backend/locations.h"
+#include "platform/globals.h"
#include "vm/compiler/ffi/native_location.h"
#include "vm/compiler/ffi/native_type.h"
@@ -41,8 +39,10 @@
intptr_t StackTopInBytes() const;
- void PrintTo(BaseTextBuffer* f) const;
- const char* ToCString() const;
+ void PrintTo(BaseTextBuffer* f, bool multi_line = false) const;
+ void PrintToMultiLine(BaseTextBuffer* f) const;
+ const char* ToCString(Zone* zone, bool multi_line = false) const;
+ const char* ToCString(bool multi_line = false) const;
private:
NativeCallingConvention(const NativeLocations& argument_locations,
diff --git a/runtime/vm/compiler/ffi/native_location.cc b/runtime/vm/compiler/ffi/native_location.cc
index f954e9f..dce51c1 100644
--- a/runtime/vm/compiler/ffi/native_location.cc
+++ b/runtime/vm/compiler/ffi/native_location.cc
@@ -4,7 +4,7 @@
#include "vm/compiler/ffi/native_location.h"
-#include "vm/compiler/backend/il_printer.h"
+#include "vm/zone_text_buffer.h"
namespace dart {
@@ -41,7 +41,7 @@
switch (loc.kind()) {
case Location::Kind::kRegister:
return *new (zone)
- NativeRegistersLocation(native_rep, native_rep, loc.reg());
+ NativeRegistersLocation(zone, native_rep, native_rep, loc.reg());
case Location::Kind::kFpuRegister:
return *new (zone)
NativeFpuRegistersLocation(native_rep, native_rep, loc.fpu_reg());
@@ -126,12 +126,13 @@
}
UNREACHABLE();
}
+
NativeRegistersLocation& NativeRegistersLocation::Split(Zone* zone,
intptr_t index) const {
ASSERT(num_regs() == 2);
return *new (zone) NativeRegistersLocation(
- payload_type().Split(zone, index), container_type().Split(zone, index),
- reg_at(index));
+ zone, payload_type().Split(zone, index),
+ container_type().Split(zone, index), reg_at(index));
}
NativeStackLocation& NativeStackLocation::Split(Zone* zone,
@@ -264,11 +265,14 @@
PrintRepresentations(f, *this);
}
+const char* NativeLocation::ToCString(Zone* zone) const {
+ ZoneTextBuffer textBuffer(zone);
+ PrintTo(&textBuffer);
+ return textBuffer.buffer();
+}
+
const char* NativeLocation::ToCString() const {
- char buffer[1024];
- BufferFormatter bf(buffer, 1024);
- PrintTo(&bf);
- return Thread::Current()->zone()->MakeCopyOfString(buffer);
+ return ToCString(Thread::Current()->zone());
}
intptr_t SizeFromFpuRegisterKind(enum FpuRegisterKind kind) {
diff --git a/runtime/vm/compiler/ffi/native_location.h b/runtime/vm/compiler/ffi/native_location.h
index 6c7e980..c3cce14 100644
--- a/runtime/vm/compiler/ffi/native_location.h
+++ b/runtime/vm/compiler/ffi/native_location.h
@@ -12,8 +12,8 @@
#include "platform/assert.h"
#include "vm/compiler/backend/locations.h"
#include "vm/compiler/ffi/native_type.h"
+#include "vm/constants.h"
#include "vm/growable_array.h"
-#include "vm/thread.h"
namespace dart {
@@ -97,6 +97,7 @@
}
virtual void PrintTo(BaseTextBuffer* f) const;
+ const char* ToCString(Zone* zone) const;
const char* ToCString() const;
const NativeRegistersLocation& AsRegisters() const;
@@ -138,19 +139,21 @@
const NativeType& container_type,
ZoneGrowableArray<Register>* registers)
: NativeLocation(payload_type, container_type), regs_(registers) {}
- NativeRegistersLocation(const NativeType& payload_type,
+ NativeRegistersLocation(Zone* zone,
+ const NativeType& payload_type,
const NativeType& container_type,
Register reg)
: NativeLocation(payload_type, container_type) {
- regs_ = new ZoneGrowableArray<Register>();
+ regs_ = new (zone) ZoneGrowableArray<Register>(zone, 1);
regs_->Add(reg);
}
- NativeRegistersLocation(const NativeType& payload_type,
+ NativeRegistersLocation(Zone* zone,
+ const NativeType& payload_type,
const NativeType& container_type,
Register register1,
Register register2)
: NativeLocation(payload_type, container_type) {
- regs_ = new ZoneGrowableArray<Register>();
+ regs_ = new (zone) ZoneGrowableArray<Register>(zone, 2);
regs_->Add(register1);
regs_->Add(register2);
}
diff --git a/runtime/vm/compiler/ffi/native_type.cc b/runtime/vm/compiler/ffi/native_type.cc
index c5cd230..7c1faae 100644
--- a/runtime/vm/compiler/ffi/native_type.cc
+++ b/runtime/vm/compiler/ffi/native_type.cc
@@ -7,11 +7,8 @@
#include "platform/assert.h"
#include "platform/globals.h"
#include "vm/class_id.h"
-#include "vm/compiler/runtime_api.h"
-#include "vm/growable_array.h"
-#include "vm/log.h"
-#include "vm/object.h"
-#include "vm/symbols.h"
+#include "vm/constants.h"
+#include "vm/zone_text_buffer.h"
#if !defined(DART_PRECOMPILED_RUNTIME)
#include "vm/compiler/backend/locations.h"
@@ -282,11 +279,14 @@
}
#endif // !defined(DART_PRECOMPILED_RUNTIME)
+const char* NativeType::ToCString(Zone* zone) const {
+ ZoneTextBuffer textBuffer(zone);
+ PrintTo(&textBuffer);
+ return textBuffer.buffer();
+}
+
const char* NativeType::ToCString() const {
- char buffer[1024];
- BufferFormatter bf(buffer, 1024);
- PrintTo(&bf);
- return Thread::Current()->zone()->MakeCopyOfString(buffer);
+ return ToCString(Thread::Current()->zone());
}
static const char* PrimitiveTypeToCString(PrimitiveType rep) {
@@ -328,11 +328,14 @@
f->Printf("%s", PrimitiveTypeToCString(representation_));
}
+const char* NativeFunctionType::ToCString(Zone* zone) const {
+ ZoneTextBuffer textBuffer(zone);
+ PrintTo(&textBuffer);
+ return textBuffer.buffer();
+}
+
const char* NativeFunctionType::ToCString() const {
- char buffer[1024];
- BufferFormatter bf(buffer, 1024);
- PrintTo(&bf);
- return Thread::Current()->zone()->MakeCopyOfString(buffer);
+ return ToCString(Thread::Current()->zone());
}
void NativeFunctionType::PrintTo(BaseTextBuffer* f) const {
diff --git a/runtime/vm/compiler/ffi/native_type.h b/runtime/vm/compiler/ffi/native_type.h
index 693b7c0..d2ca9c1 100644
--- a/runtime/vm/compiler/ffi/native_type.h
+++ b/runtime/vm/compiler/ffi/native_type.h
@@ -5,12 +5,11 @@
#ifndef RUNTIME_VM_COMPILER_FFI_NATIVE_TYPE_H_
#define RUNTIME_VM_COMPILER_FFI_NATIVE_TYPE_H_
-#include <platform/globals.h>
-
#include "platform/assert.h"
+#include "platform/globals.h"
#include "vm/allocation.h"
-#include "vm/compiler/runtime_api.h"
#include "vm/growable_array.h"
+#include "vm/object.h"
#if !defined(DART_PRECOMPILED_RUNTIME)
#include "vm/compiler/backend/locations.h"
@@ -58,7 +57,7 @@
#if !defined(DART_PRECOMPILED_RUNTIME)
static NativePrimitiveType& FromUnboxedRepresentation(Zone* zone,
Representation rep);
-#endif
+#endif // !defined(DART_PRECOMPILED_RUNTIME)
virtual bool IsPrimitive() const { return false; }
const NativePrimitiveType& AsPrimitive() const;
@@ -104,6 +103,7 @@
const NativeType& WidenTo4Bytes(Zone* zone) const;
virtual void PrintTo(BaseTextBuffer* f) const;
+ const char* ToCString(Zone* zone) const;
const char* ToCString() const;
virtual ~NativeType() {}
@@ -180,6 +180,8 @@
const NativeType& return_type() const { return return_type_; }
void PrintTo(BaseTextBuffer* f) const;
+ const char* ToCString(Zone* zone) const;
+
const char* ToCString() const;
private:
diff --git a/tools/VERSION b/tools/VERSION
index 7f57bc0..9c3e9575 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 12
PATCH 0
-PRERELEASE 47
+PRERELEASE 48
PRERELEASE_PATCH 0
\ No newline at end of file