Skip to content

Commit f9ebf21

Browse files
committed
Version 2.1.0-dev.9.4
Cherry-pick e23acaa to dev Cherry-pick e6d3a45 to dev Cherry-pick a40fd6a to dev Cherry-pick 9eb1d74 to dev
2 parents 204556d + 58bb05b commit f9ebf21

File tree

63 files changed

+584
-174
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+584
-174
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
# 2.1.0-dev.9.4
2+
3+
Cherry-pick e23acaaf90996b84548ea23af14730ff1a21d826 to dev
4+
5+
Cherry-pick e6d3a45b6a98ea36581ac375ec5cdd63dd829004 to dev
6+
7+
Cherry-pick a40fd6a976d3d3bc341cd2e0f7fb290b7819a52a to dev
8+
9+
Cherry-pick 9eb1d748819530bb3eb2f78699e0968de8b638fe to dev
10+
111
# 2.1.0-dev.9.3
212

313
Cherry-pick 65951ef5080bcfa7d8862685e96f75c2c5d17841 to dev

pkg/vm/bin/dump_kernel.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import 'package:vm/metadata/procedure_attributes.dart'
1616
show ProcedureAttributesMetadataRepository;
1717
import 'package:vm/metadata/unreachable.dart'
1818
show UnreachableNodeMetadataRepository;
19-
2019
import 'package:vm/metadata/call_site_attributes.dart'
2120
show CallSiteAttributesMetadataRepository;
2221

pkg/vm/lib/kernel_front_end.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ import 'transformations/no_dynamic_invocations_annotator.dart'
3737
as no_dynamic_invocations_annotator show transformComponent;
3838
import 'transformations/type_flow/transformer.dart' as globalTypeFlow
3939
show transformComponent;
40+
import 'transformations/obfuscation_prohibitions_annotator.dart'
41+
as obfuscationProhibitions;
4042

4143
/// Generates a kernel representation of the program whose main library is in
4244
/// the given [source]. Intended for whole program (non-modular) compilation.
@@ -140,6 +142,10 @@ Future _runGlobalTransformations(
140142
devirtualization.transformComponent(coreTypes, component);
141143
no_dynamic_invocations_annotator.transformComponent(component);
142144
}
145+
146+
// We don't know yet whether gen_snapshot will want to do obfuscation, but if
147+
// it does it will need the obfuscation prohibitions.
148+
obfuscationProhibitions.transformComponent(component, coreTypes);
143149
}
144150

145151
/// Runs given [action] with [CompilerContext]. This is needed to
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
library vm.metadata.obfuscation_prohibitions;
6+
7+
import 'package:kernel/ast.dart';
8+
9+
class ObfuscationProhibitionsMetadata {
10+
final Set<String> protectedNames = Set<String>();
11+
12+
ObfuscationProhibitionsMetadata();
13+
14+
@override
15+
String toString() => protectedNames.toString();
16+
}
17+
18+
/// Repository for [ObfuscationProhibitionsMetadata].
19+
class ObfuscationProhibitionsMetadataRepository
20+
extends MetadataRepository<ObfuscationProhibitionsMetadata> {
21+
static final repositoryTag = 'vm.obfuscation-prohibitions.metadata';
22+
23+
@override
24+
final String tag = repositoryTag;
25+
26+
@override
27+
final Map<TreeNode, ObfuscationProhibitionsMetadata> mapping =
28+
<TreeNode, ObfuscationProhibitionsMetadata>{};
29+
30+
@override
31+
void writeToBinary(
32+
ObfuscationProhibitionsMetadata metadata, Node node, BinarySink sink) {
33+
sink.writeUInt32(metadata.protectedNames.length);
34+
for (String name in metadata.protectedNames) {
35+
sink.writeStringReference(name);
36+
}
37+
}
38+
39+
@override
40+
ObfuscationProhibitionsMetadata readFromBinary(
41+
Node node, BinarySource source) {
42+
final metadata = ObfuscationProhibitionsMetadata();
43+
int length = source.readUint32();
44+
for (int i = 0; i < length; ++i) {
45+
metadata.protectedNames.add(source.readStringReference());
46+
}
47+
return metadata;
48+
}
49+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
library vm.transformations.obfuscation_prohibitions_annotator;
6+
7+
import 'package:kernel/ast.dart';
8+
import 'package:kernel/core_types.dart' show CoreTypes;
9+
10+
import '../metadata/obfuscation_prohibitions.dart';
11+
import 'pragma.dart';
12+
13+
void transformComponent(Component component, CoreTypes coreTypes) {
14+
final repo = new ObfuscationProhibitionsMetadataRepository();
15+
component.addMetadataRepository(repo);
16+
final visitor =
17+
ObfuscationProhibitionsVisitor(ConstantPragmaAnnotationParser(coreTypes));
18+
visitor.visitComponent(component);
19+
repo.mapping[component] = visitor.metadata;
20+
}
21+
22+
class ObfuscationProhibitionsVisitor extends RecursiveVisitor {
23+
final PragmaAnnotationParser parser;
24+
final metadata = ObfuscationProhibitionsMetadata();
25+
26+
ObfuscationProhibitionsVisitor(this.parser);
27+
28+
void _addIfEntryPoint(
29+
List<Expression> annotations, String name, TreeNode node) {
30+
for (var ann in annotations) {
31+
ParsedPragma pragma = parser.parsePragma(ann);
32+
if (pragma is ParsedEntryPointPragma) {
33+
metadata.protectedNames.add(name);
34+
if (node is Field) {
35+
metadata.protectedNames.add(name + "=");
36+
}
37+
final parent = node.parent;
38+
if (parent is Class) {
39+
metadata.protectedNames.add(parent.name);
40+
}
41+
break;
42+
}
43+
}
44+
}
45+
46+
@override
47+
visitClass(Class klass) {
48+
_addIfEntryPoint(klass.annotations, klass.name, klass);
49+
klass.visitChildren(this);
50+
}
51+
52+
@override
53+
visitProcedure(Procedure proc) {
54+
_addIfEntryPoint(proc.annotations, proc.name.name, proc);
55+
}
56+
57+
@override
58+
visitField(Field field) {
59+
_addIfEntryPoint(field.annotations, field.name.name, field);
60+
}
61+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
library vm.transformations.pragma;
6+
7+
import 'package:kernel/ast.dart';
8+
import 'package:kernel/core_types.dart' show CoreTypes;
9+
10+
const kEntryPointPragmaName = "vm:entry-point";
11+
const kExactResultTypePragmaName = "vm:exact-result-type";
12+
13+
abstract class ParsedPragma {}
14+
15+
enum PragmaEntryPointType { Always, GetterOnly, SetterOnly }
16+
17+
class ParsedEntryPointPragma extends ParsedPragma {
18+
final PragmaEntryPointType type;
19+
ParsedEntryPointPragma(this.type);
20+
}
21+
22+
class ParsedResultTypeByTypePragma extends ParsedPragma {
23+
final DartType type;
24+
ParsedResultTypeByTypePragma(this.type);
25+
}
26+
27+
class ParsedResultTypeByPathPragma extends ParsedPragma {
28+
final String path;
29+
ParsedResultTypeByPathPragma(this.path);
30+
}
31+
32+
abstract class PragmaAnnotationParser {
33+
/// May return 'null' if the annotation does not represent a recognized
34+
/// @pragma.
35+
ParsedPragma parsePragma(Expression annotation);
36+
}
37+
38+
class ConstantPragmaAnnotationParser extends PragmaAnnotationParser {
39+
final CoreTypes coreTypes;
40+
41+
ConstantPragmaAnnotationParser(this.coreTypes);
42+
43+
ParsedPragma parsePragma(Expression annotation) {
44+
InstanceConstant pragmaConstant;
45+
if (annotation is ConstantExpression) {
46+
Constant constant = annotation.constant;
47+
if (constant is InstanceConstant) {
48+
if (constant.classReference.node == coreTypes.pragmaClass) {
49+
pragmaConstant = constant;
50+
}
51+
}
52+
}
53+
if (pragmaConstant == null) return null;
54+
55+
String pragmaName;
56+
Constant name = pragmaConstant.fieldValues[coreTypes.pragmaName.reference];
57+
if (name is StringConstant) {
58+
pragmaName = name.value;
59+
} else {
60+
return null;
61+
}
62+
63+
Constant options =
64+
pragmaConstant.fieldValues[coreTypes.pragmaOptions.reference];
65+
assert(options != null);
66+
67+
switch (pragmaName) {
68+
case kEntryPointPragmaName:
69+
PragmaEntryPointType type;
70+
if (options is NullConstant) {
71+
type = PragmaEntryPointType.Always;
72+
} else if (options is BoolConstant && options.value == true) {
73+
type = PragmaEntryPointType.Always;
74+
} else if (options is StringConstant) {
75+
if (options.value == "get") {
76+
type = PragmaEntryPointType.GetterOnly;
77+
} else if (options.value == "set") {
78+
type = PragmaEntryPointType.SetterOnly;
79+
} else {
80+
throw "Error: string directive to @pragma('$kEntryPointPragmaName', ...) "
81+
"must be either 'get' or 'set'.";
82+
}
83+
}
84+
return type != null ? new ParsedEntryPointPragma(type) : null;
85+
case kExactResultTypePragmaName:
86+
if (options == null) return null;
87+
if (options is TypeLiteralConstant) {
88+
return new ParsedResultTypeByTypePragma(options.type);
89+
} else if (options is StringConstant) {
90+
return new ParsedResultTypeByPathPragma(options.value);
91+
}
92+
throw "ERROR: Unsupported option to '$kExactResultTypePragmaName' "
93+
"pragma: $options";
94+
default:
95+
return null;
96+
}
97+
}
98+
}

pkg/vm/lib/transformations/type_flow/analysis.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import 'summary.dart';
2222
import 'summary_collector.dart';
2323
import 'types.dart';
2424
import 'utils.dart';
25+
import '../pragma.dart';
2526

2627
// TODO(alexmarkov)
2728
// Unordered list of various improvements in type flow analysis,

pkg/vm/lib/transformations/type_flow/native_code.dart

Lines changed: 9 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ library vm.transformations.type_flow.native_code;
88
import 'dart:core' hide Type;
99

1010
import 'package:kernel/ast.dart';
11-
import 'package:kernel/core_types.dart' show CoreTypes;
1211
import 'package:kernel/library_index.dart' show LibraryIndex;
1312

1413
import 'calls.dart';
1514
import 'types.dart';
1615
import 'utils.dart';
16+
import '../pragma.dart';
1717

1818
abstract class EntryPointsListener {
1919
/// Add call by the given selector with arbitrary ('raw') arguments.
@@ -33,96 +33,6 @@ abstract class EntryPointsListener {
3333
void recordMemberCalledViaThis(Member target);
3434
}
3535

36-
abstract class ParsedPragma {}
37-
38-
enum PragmaEntryPointType { Always, GetterOnly, SetterOnly }
39-
40-
class ParsedEntryPointPragma extends ParsedPragma {
41-
final PragmaEntryPointType type;
42-
ParsedEntryPointPragma(this.type);
43-
}
44-
45-
class ParsedResultTypeByTypePragma extends ParsedPragma {
46-
final DartType type;
47-
ParsedResultTypeByTypePragma(this.type);
48-
}
49-
50-
class ParsedResultTypeByPathPragma extends ParsedPragma {
51-
final String path;
52-
ParsedResultTypeByPathPragma(this.path);
53-
}
54-
55-
const kEntryPointPragmaName = "vm:entry-point";
56-
const kExactResultTypePragmaName = "vm:exact-result-type";
57-
58-
abstract class PragmaAnnotationParser {
59-
/// May return 'null' if the annotation does not represent a recognized
60-
/// @pragma.
61-
ParsedPragma parsePragma(Expression annotation);
62-
}
63-
64-
class ConstantPragmaAnnotationParser extends PragmaAnnotationParser {
65-
final CoreTypes coreTypes;
66-
67-
ConstantPragmaAnnotationParser(this.coreTypes);
68-
69-
ParsedPragma parsePragma(Expression annotation) {
70-
InstanceConstant pragmaConstant;
71-
if (annotation is ConstantExpression) {
72-
Constant constant = annotation.constant;
73-
if (constant is InstanceConstant) {
74-
if (constant.classReference.node == coreTypes.pragmaClass) {
75-
pragmaConstant = constant;
76-
}
77-
}
78-
}
79-
if (pragmaConstant == null) return null;
80-
81-
String pragmaName;
82-
Constant name = pragmaConstant.fieldValues[coreTypes.pragmaName.reference];
83-
if (name is StringConstant) {
84-
pragmaName = name.value;
85-
} else {
86-
return null;
87-
}
88-
89-
Constant options =
90-
pragmaConstant.fieldValues[coreTypes.pragmaOptions.reference];
91-
assertx(options != null);
92-
93-
switch (pragmaName) {
94-
case kEntryPointPragmaName:
95-
PragmaEntryPointType type;
96-
if (options is NullConstant) {
97-
type = PragmaEntryPointType.Always;
98-
} else if (options is BoolConstant && options.value == true) {
99-
type = PragmaEntryPointType.Always;
100-
} else if (options is StringConstant) {
101-
if (options.value == "get") {
102-
type = PragmaEntryPointType.GetterOnly;
103-
} else if (options.value == "set") {
104-
type = PragmaEntryPointType.SetterOnly;
105-
} else {
106-
throw "Error: string directive to @pragma('$kEntryPointPragmaName', ...) "
107-
"must be either 'get' or 'set'.";
108-
}
109-
}
110-
return type != null ? new ParsedEntryPointPragma(type) : null;
111-
case kExactResultTypePragmaName:
112-
if (options == null) return null;
113-
if (options is TypeLiteralConstant) {
114-
return new ParsedResultTypeByTypePragma(options.type);
115-
} else if (options is StringConstant) {
116-
return new ParsedResultTypeByPathPragma(options.value);
117-
}
118-
throw "ERROR: Unsupported option to '$kExactResultTypePragmaName' "
119-
"pragma: $options";
120-
default:
121-
return null;
122-
}
123-
}
124-
}
125-
12636
class PragmaEntryPointsVisitor extends RecursiveVisitor {
12737
final EntryPointsListener entryPoints;
12838
final NativeCodeOracle nativeCodeOracle;
@@ -145,13 +55,15 @@ class PragmaEntryPointsVisitor extends RecursiveVisitor {
14555

14656
@override
14757
visitClass(Class klass) {
148-
var type = _annotationsDefineRoot(klass.annotations);
149-
if (type != null) {
150-
if (type != PragmaEntryPointType.Always) {
151-
throw "Error: pragma entry-point definition on a class must evaluate "
152-
"to null, true or false. See entry_points_pragma.md.";
58+
if (!klass.isAbstract) {
59+
var type = _annotationsDefineRoot(klass.annotations);
60+
if (type != null) {
61+
if (type != PragmaEntryPointType.Always) {
62+
throw "Error: pragma entry-point definition on a class must evaluate "
63+
"to null, true or false. See entry_points_pragma.md.";
64+
}
65+
entryPoints.addAllocatedClass(klass);
15366
}
154-
entryPoints.addAllocatedClass(klass);
15567
}
15668
currentClass = klass;
15769
klass.visitChildren(this);

0 commit comments

Comments
 (0)