Version 2.12.0-79.0.dev
Merge commit '85174e4d8cfdb75b80c95d10476ebbd2eeba2857' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index f616daa..8315206 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -258,12 +258,6 @@
"languageVersion": "2.12"
},
{
- "name": "file",
- "rootUri": "../third_party/pkg/file/packages/file",
- "packageUri": "lib/",
- "languageVersion": "2.12"
- },
- {
"name": "fixnum",
"rootUri": "../third_party/pkg/fixnum",
"packageUri": "lib/",
@@ -290,7 +284,7 @@
"name": "glob",
"rootUri": "../third_party/pkg/glob",
"packageUri": "lib/",
- "languageVersion": "2.12"
+ "languageVersion": "2.2"
},
{
"name": "html",
diff --git a/DEPS b/DEPS
index cee5f0a..70e73aa 100644
--- a/DEPS
+++ b/DEPS
@@ -104,8 +104,7 @@
"dartdoc_rev" : "d79877d0764ce23ffea7055049f8da5dffce0308",
"ffi_rev": "a5d4232cd38562c75a3ed847baa340e399538028",
"fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
- "file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
- "glob_rev": "7c0ef8d4fa086f6b185c4dd724b700e7d7ad8f79",
+ "glob_rev": "e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6",
"html_rev": "22f17e97fedeacaa1e945cf84d8016284eed33a6",
"http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
"http_multi_server_rev" : "f1d1c9c024a293ab0a0e16f8b7632e87c708b448",
@@ -336,9 +335,6 @@
Var("dart_git") + "ffi.git" + "@" + Var("ffi_rev"),
Var("dart_root") + "/third_party/pkg/fixnum":
Var("dart_git") + "fixnum.git" + "@" + Var("fixnum_rev"),
- Var("dart_root") + "/third_party/pkg/file":
- Var("dart_git") + "external/github.com/google/file.dart/"
- + "@" + Var("file_rev"),
Var("dart_root") + "/third_party/pkg/glob":
Var("dart_git") + "glob.git" + "@" + Var("glob_rev"),
Var("dart_root") + "/third_party/pkg/html":
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index e168137..0c7657a 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -3357,6 +3357,25 @@
assertNotSuggested('Object');
}
+ @failingTest
+ Future<void> test_functionExpression_expressionBody() async {
+ // This test fails because the OpType at the completion location doesn't
+ // allow for functions that return `void`. But because the expected return
+ // type is `dynamic` we probably want to allow it.
+ addTestSource('''
+void f() {
+ g(() => ^);
+}
+void g(dynamic Function() h) {}
+''');
+ await computeSuggestions();
+
+ expect(replacementOffset, completionOffset);
+ expect(replacementLength, 0);
+ assertSuggestFunction('f', 'void');
+ assertSuggestFunction('g', 'void');
+ }
+
Future<void> test_functionExpression_parameterList() async {
addTestSource('''
var c = <T>(^) {};
@@ -5187,6 +5206,20 @@
assertSuggestMethod('m', 'B', null);
}
+ @failingTest
+ Future<void> test_parameterList_genericFunctionType() async {
+ // This test fails because we don't suggest `void` as the type of a
+ // parameter, but we should for the case of `void Function()`.
+ addTestSource('''
+void f(^) {}
+''');
+ await computeSuggestions();
+
+ expect(replacementOffset, completionOffset);
+ expect(replacementLength, 0);
+ assertSuggest('void');
+ }
+
Future<void> test_parameterName_excludeTypes() async {
addTestSource('m(int ^) {}');
await computeSuggestions();
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index b8bfd7d..755e7d6 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -48,9 +48,9 @@
final ExecutableElement element;
final bool isAsynchronous;
final bool isConstConstructor;
- final bool isFactoryConstructor;
final bool isGenerativeConstructor;
final bool isGenerator;
+ final bool inFactoryConstructor;
final bool inStaticMethod;
/// The return statements that have a value.
@@ -66,11 +66,10 @@
EnclosingExecutableContext(this.element)
: isAsynchronous = element != null && element.isAsynchronous,
isConstConstructor = element is ConstructorElement && element.isConst,
- isFactoryConstructor =
- element is ConstructorElement && element.isFactory,
isGenerativeConstructor =
element is ConstructorElement && !element.isFactory,
isGenerator = element != null && element.isGenerator,
+ inFactoryConstructor = _inFactoryConstructor(element),
inStaticMethod = _inStaticMethod(element);
EnclosingExecutableContext.empty() : this(null);
@@ -84,7 +83,7 @@
? className
: '$className.$constructorName';
} else {
- return element.displayName;
+ return element?.displayName;
}
}
@@ -107,6 +106,17 @@
DartType get returnType => element.returnType;
+ static bool _inFactoryConstructor(ExecutableElement element) {
+ if (element is ConstructorElement) {
+ return element.isFactory;
+ }
+ var enclosing = element?.enclosingElement;
+ if (enclosing is ExecutableElement) {
+ return _inFactoryConstructor(enclosing);
+ }
+ return false;
+ }
+
static bool _inStaticMethod(ExecutableElement element) {
var enclosing = element?.enclosingElement;
if (enclosing is ClassElement || enclosing is ExtensionElement) {
@@ -1129,7 +1139,7 @@
void visitSimpleIdentifier(SimpleIdentifier node) {
_checkForAmbiguousImport(node);
_checkForReferenceBeforeDeclaration(node);
- _checkForImplicitThisReferenceInInitializer(node);
+ _checkForInvalidInstanceMemberAccess(node);
_checkForTypeParameterReferencedByStatic(node);
if (!_isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
_checkForUnqualifiedReferenceToNonLocalStaticMember(node);
@@ -2773,76 +2783,6 @@
}
}
- /// Verify that if the given [identifier] is part of a constructor
- /// initializer, then it does not implicitly reference 'this' expression.
- ///
- /// See [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER], and
- /// [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC].
- /// TODO(scheglov) rename thid method
- void _checkForImplicitThisReferenceInInitializer(
- SimpleIdentifier identifier) {
- if (_isInComment) {
- return;
- }
- if (!_isInConstructorInitializer &&
- !_enclosingExecutable.inStaticMethod &&
- !_enclosingExecutable.isFactoryConstructor &&
- !_isInInstanceNotLateVariableDeclaration &&
- !_isInStaticVariableDeclaration) {
- return;
- }
- // prepare element
- Element element = identifier.writeOrReadElement;
- if (!(element is MethodElement || element is PropertyAccessorElement)) {
- return;
- }
- // static element
- ExecutableElement executableElement = element as ExecutableElement;
- if (executableElement.isStatic) {
- return;
- }
- // not a class member
- Element enclosingElement = element.enclosingElement;
- if (enclosingElement is! ClassElement &&
- enclosingElement is! ExtensionElement) {
- return;
- }
- // qualified method invocation
- AstNode parent = identifier.parent;
- if (parent is MethodInvocation) {
- if (identical(parent.methodName, identifier) &&
- parent.realTarget != null) {
- return;
- }
- }
- // qualified property access
- if (parent is PropertyAccess) {
- if (identical(parent.propertyName, identifier) &&
- parent.realTarget != null) {
- return;
- }
- }
- if (parent is PrefixedIdentifier) {
- if (identical(parent.identifier, identifier)) {
- return;
- }
- }
-
- if (_enclosingExecutable.inStaticMethod) {
- // TODO
- _errorReporter.reportErrorForNode(
- CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, identifier);
- } else if (_enclosingExecutable.isFactoryConstructor) {
- _errorReporter.reportErrorForNode(
- CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, identifier);
- } else {
- _errorReporter.reportErrorForNode(
- CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
- identifier,
- [identifier.name]);
- }
- }
-
/// Check that if the visiting library is not system, then any given library
/// should not be SDK internal library. The [importElement] is the
/// [ImportElement] retrieved from the node, if the element in the node was
@@ -3011,6 +2951,74 @@
}
}
+ /// Verify that if the given [identifier] is part of a constructor
+ /// initializer, then it does not implicitly reference 'this' expression.
+ ///
+ /// See [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER],
+ /// [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY], and
+ /// [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC].
+ void _checkForInvalidInstanceMemberAccess(SimpleIdentifier identifier) {
+ if (_isInComment) {
+ return;
+ }
+ if (!_isInConstructorInitializer &&
+ !_enclosingExecutable.inStaticMethod &&
+ !_enclosingExecutable.inFactoryConstructor &&
+ !_isInInstanceNotLateVariableDeclaration &&
+ !_isInStaticVariableDeclaration) {
+ return;
+ }
+ // prepare element
+ Element element = identifier.writeOrReadElement;
+ if (!(element is MethodElement || element is PropertyAccessorElement)) {
+ return;
+ }
+ // static element
+ ExecutableElement executableElement = element as ExecutableElement;
+ if (executableElement.isStatic) {
+ return;
+ }
+ // not a class member
+ Element enclosingElement = element.enclosingElement;
+ if (enclosingElement is! ClassElement &&
+ enclosingElement is! ExtensionElement) {
+ return;
+ }
+ // qualified method invocation
+ AstNode parent = identifier.parent;
+ if (parent is MethodInvocation) {
+ if (identical(parent.methodName, identifier) &&
+ parent.realTarget != null) {
+ return;
+ }
+ }
+ // qualified property access
+ if (parent is PropertyAccess) {
+ if (identical(parent.propertyName, identifier) &&
+ parent.realTarget != null) {
+ return;
+ }
+ }
+ if (parent is PrefixedIdentifier) {
+ if (identical(parent.identifier, identifier)) {
+ return;
+ }
+ }
+
+ if (_enclosingExecutable.inStaticMethod) {
+ _errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, identifier);
+ } else if (_enclosingExecutable.inFactoryConstructor) {
+ _errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, identifier);
+ } else {
+ _errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
+ identifier,
+ [identifier.name]);
+ }
+ }
+
/// Check to see whether the given function [body] has a modifier associated
/// with it, and report it as an error if it does.
void _checkForInvalidModifierOnBody(
diff --git a/pkg/analyzer/test/src/diagnostics/instance_member_access_from_factory_test.dart b/pkg/analyzer/test/src/diagnostics/instance_member_access_from_factory_test.dart
index 5bde8d7..8791394 100644
--- a/pkg/analyzer/test/src/diagnostics/instance_member_access_from_factory_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/instance_member_access_from_factory_test.dart
@@ -30,6 +30,39 @@
]);
}
+ test_property() async {
+ await assertErrorsInCode(r'''
+class A {
+ int m;
+ A();
+ factory A.make() {
+ m;
+ return new A();
+ }
+}
+''', [
+ error(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, 51, 1),
+ ]);
+ }
+
+ test_property_fromClosure() async {
+ await assertErrorsInCode(r'''
+class A {
+ int m;
+ A();
+ factory A.make() {
+ void f() {
+ m;
+ }
+ f();
+ return new A();
+ }
+}
+''', [
+ error(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, 68, 1),
+ ]);
+ }
+
test_unnamed() async {
await assertErrorsInCode(r'''
class A {
diff --git a/pkg/test_runner/lib/src/browser_controller.dart b/pkg/test_runner/lib/src/browser_controller.dart
index fce0fca..708d185 100644
--- a/pkg/test_runner/lib/src/browser_controller.dart
+++ b/pkg/test_runner/lib/src/browser_controller.dart
@@ -298,8 +298,8 @@
// We run killAndResetSafari in a Zone as opposed to running an external
// process. The Zone allows us to collect its output, and protect the rest
// of the test infrastructure against errors in it.
- runZonedGuarded(zoneWrapper, handleUncaughtError,
- zoneSpecification: specification);
+ runZoned(zoneWrapper,
+ zoneSpecification: specification, onError: handleUncaughtError);
try {
await completer.future;
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index 6f5d5f2..91e0731 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -862,6 +862,7 @@
print("Cannot create URL for path $file. Not in build or dart directory.");
exit(1);
+ throw "unreachable";
}
String _uriForBrowserTest(String pathComponent) {
diff --git a/pkg/test_runner/pubspec.yaml b/pkg/test_runner/pubspec.yaml
index 9fad3c1..be9765a 100644
--- a/pkg/test_runner/pubspec.yaml
+++ b/pkg/test_runner/pubspec.yaml
@@ -22,14 +22,10 @@
dev_dependencies:
expect:
path: ../expect
- file: any
- glob: any
+ glob:
+ path: ../../third_party/pkg/glob
dependency_overrides:
# Other packages in the dependency graph have normal hosted dependencies on
# this, so just override it to force the local one.
args:
path: ../../third_party/pkg/args
- file:
- path: ../../third_party/pkg/file/packages/file
- glob:
- path: ../../third_party/pkg/glob
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index add8fe5..7432ff2 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -7,9 +7,7 @@
import 'dart:io';
import 'package:args/args.dart';
-import 'package:file/file.dart' as pkg_file;
import 'package:glob/glob.dart';
-import 'package:glob/list_local_fs.dart';
import 'package:path/path.dart' as p;
import 'package:test_runner/src/command_output.dart';
@@ -132,7 +130,7 @@
for (var entry in glob.listSync(root: root)) {
if (!entry.path.endsWith(".dart")) continue;
- if (entry is pkg_file.File) {
+ if (entry is File) {
await _processFile(entry,
dryRun: dryRun,
remove: removeSources,
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 4a56206..8407f4f 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -563,10 +563,16 @@
}
void DeleteReloadContext();
-
- bool IsReloading() const { return group_reload_context_ != nullptr; }
#endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
+ bool IsReloading() const {
+#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
+ return group_reload_context_ != nullptr;
+#else
+ return false;
+#endif
+ }
+
uint64_t id() { return id_; }
static void Init();
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 801ca53..e1e4f70 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -14962,27 +14962,27 @@
NumArgsTestedBits::update(value, raw_ptr()->state_bits_));
}
-intptr_t ICData::TypeArgsLen() const {
+intptr_t CallSiteData::TypeArgsLen() const {
ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
return args_desc.TypeArgsLen();
}
-intptr_t ICData::CountWithTypeArgs() const {
+intptr_t CallSiteData::CountWithTypeArgs() const {
ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
return args_desc.CountWithTypeArgs();
}
-intptr_t ICData::CountWithoutTypeArgs() const {
+intptr_t CallSiteData::CountWithoutTypeArgs() const {
ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
return args_desc.Count();
}
-intptr_t ICData::SizeWithoutTypeArgs() const {
+intptr_t CallSiteData::SizeWithoutTypeArgs() const {
ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
return args_desc.Size();
}
-intptr_t ICData::SizeWithTypeArgs() const {
+intptr_t CallSiteData::SizeWithTypeArgs() const {
ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
return args_desc.SizeWithTypeArgs();
}
@@ -15134,11 +15134,14 @@
return -1;
}
-void ICData::WriteSentinelAt(intptr_t index) const {
+void ICData::WriteSentinelAt(intptr_t index,
+ const CallSiteResetter& proof_of_reload) const {
+ USE(proof_of_reload); // This method can only be called during reload.
+
+ Thread* thread = Thread::Current();
const intptr_t len = Length();
ASSERT(index >= 0);
ASSERT(index < len);
- Thread* thread = Thread::Current();
REUSABLE_ARRAY_HANDLESCOPE(thread);
Array& data = thread->ArrayHandle();
data = entries();
@@ -15149,13 +15152,20 @@
}
}
-void ICData::ClearCountAt(intptr_t index) const {
+void ICData::ClearCountAt(intptr_t index,
+ const CallSiteResetter& proof_of_reload) const {
+ USE(proof_of_reload); // This method can only be called during reload.
+
ASSERT(index >= 0);
ASSERT(index < NumberOfChecks());
SetCountAt(index, 0);
}
-void ICData::ClearAndSetStaticTarget(const Function& func) const {
+void ICData::ClearAndSetStaticTarget(
+ const Function& func,
+ const CallSiteResetter& proof_of_reload) const {
+ USE(proof_of_reload); // This method can only be called during reload.
+
if (IsImmutable()) {
return;
}
@@ -15163,12 +15173,13 @@
if (len == 0) {
return;
}
+ Thread* thread = Thread::Current();
+
// The final entry is always the sentinel.
ASSERT(IsSentinelAt(len - 1));
const intptr_t num_args_tested = NumArgsTested();
if (num_args_tested == 0) {
// No type feedback is being collected.
- Thread* thread = Thread::Current();
REUSABLE_ARRAY_HANDLESCOPE(thread);
Array& data = thread->ArrayHandle();
data = entries();
@@ -15186,9 +15197,8 @@
// Type feedback on arguments is being collected.
// Fill all but the first entry with the sentinel.
for (intptr_t i = len - 1; i > 0; i--) {
- WriteSentinelAt(i);
+ WriteSentinelAt(i, proof_of_reload);
}
- Thread* thread = Thread::Current();
REUSABLE_ARRAY_HANDLESCOPE(thread);
Array& data = thread->ArrayHandle();
data = entries();
@@ -15557,15 +15567,6 @@
#endif
}
-ObjectPtr ICData::GetTargetOrCodeAt(intptr_t index) const {
- const intptr_t data_pos =
- index * TestEntryLength() + TargetIndexFor(NumArgsTested());
-
- NoSafepointScope no_safepoint;
- ArrayPtr raw_data = entries();
- return raw_data->ptr()->data()[data_pos];
-}
-
void ICData::IncrementCountAt(intptr_t index, intptr_t value) const {
ASSERT(0 <= value);
ASSERT(value <= Smi::kMaxValue);
@@ -15616,46 +15617,7 @@
return count;
}
-void ICData::SetCodeAt(intptr_t index, const Code& value) const {
#if !defined(DART_PRECOMPILED_RUNTIME)
- UNREACHABLE();
-#else
- Thread* thread = Thread::Current();
- REUSABLE_ARRAY_HANDLESCOPE(thread);
- Array& data = thread->ArrayHandle();
- data = entries();
- const intptr_t data_pos =
- index * TestEntryLength() + CodeIndexFor(NumArgsTested());
- data.SetAt(data_pos, value);
-#endif
-}
-
-void ICData::SetEntryPointAt(intptr_t index, const Smi& value) const {
-#if !defined(DART_PRECOMPILED_RUNTIME)
- UNREACHABLE();
-#else
- Thread* thread = Thread::Current();
- REUSABLE_ARRAY_HANDLESCOPE(thread);
- Array& data = thread->ArrayHandle();
- data = entries();
- const intptr_t data_pos =
- index * TestEntryLength() + EntryPointIndexFor(NumArgsTested());
- data.SetAt(data_pos, value);
-#endif
-}
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-ICDataPtr ICData::AsUnaryClassChecksForCid(intptr_t cid,
- const Function& target) const {
- ASSERT(!IsNull());
- const intptr_t kNumArgsTested = 1;
- ICData& result = ICData::Handle(ICData::NewFrom(*this, kNumArgsTested));
-
- // Copy count so that we copy the state "count == 0" vs "count > 0".
- result.AddReceiverCheck(cid, target, GetCountAt(0));
- return result.raw();
-}
-
ICDataPtr ICData::AsUnaryClassChecksForArgNr(intptr_t arg_nr) const {
ASSERT(!IsNull());
ASSERT(NumArgsTested() > arg_nr);
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 28ab1c2..0ec0812 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -63,6 +63,7 @@
class FlowGraphCompiler;
class HierarchyInfo;
class LocalScope;
+class CallSiteResetter;
class CodeStatistics;
class IsolateGroupReloadContext;
@@ -1862,6 +1863,16 @@
StringPtr target_name() const { return raw_ptr()->target_name_; }
ArrayPtr arguments_descriptor() const { return raw_ptr()->args_descriptor_; }
+ intptr_t TypeArgsLen() const;
+
+ intptr_t CountWithTypeArgs() const;
+
+ intptr_t CountWithoutTypeArgs() const;
+
+ intptr_t SizeWithoutTypeArgs() const;
+
+ intptr_t SizeWithTypeArgs() const;
+
static intptr_t target_name_offset() {
return OFFSET_OF(CallSiteDataLayout, target_name_);
}
@@ -1921,16 +1932,6 @@
intptr_t NumArgsTested() const;
- intptr_t TypeArgsLen() const;
-
- intptr_t CountWithTypeArgs() const;
-
- intptr_t CountWithoutTypeArgs() const;
-
- intptr_t SizeWithoutTypeArgs() const;
-
- intptr_t SizeWithTypeArgs() const;
-
intptr_t deopt_id() const {
#if defined(DART_PRECOMPILED_RUNTIME)
UNREACHABLE();
@@ -1946,21 +1947,13 @@
AbstractTypePtr receivers_static_type() const {
return raw_ptr()->receivers_static_type_;
}
- void SetReceiversStaticType(const AbstractType& type) const;
bool is_tracking_exactness() const {
return TrackingExactnessBit::decode(raw_ptr()->state_bits_);
}
- void set_tracking_exactness(bool value) const {
- StoreNonPointer(
- &raw_ptr()->state_bits_,
- TrackingExactnessBit::update(value, raw_ptr()->state_bits_));
- }
#else
bool is_tracking_exactness() const { return false; }
#endif
- void Reset(Zone* zone) const;
-
// Note: only deopts with reasons before Unknown in this list are recorded in
// the ICData. All other reasons are used purely for informational messages
// printed during deoptimization itself.
@@ -2025,7 +2018,6 @@
static const char* RebindRuleToCString(RebindRule r);
static bool ParseRebindRule(const char* str, RebindRule* out);
RebindRule rebind_rule() const;
- void set_rebind_rule(uint32_t rebind_rule) const;
void set_is_megamorphic(bool value) const {
// We don't have concurrent RW access to [state_bits_].
@@ -2077,14 +2069,20 @@
#endif
// Replaces entry |index| with the sentinel.
- void WriteSentinelAt(intptr_t index) const;
+ // NOTE: Can only be called during reload.
+ void WriteSentinelAt(intptr_t index,
+ const CallSiteResetter& proof_of_reload) const;
// Clears the count for entry |index|.
- void ClearCountAt(intptr_t index) const;
+ // NOTE: Can only be called during reload.
+ void ClearCountAt(intptr_t index,
+ const CallSiteResetter& proof_of_reload) const;
// Clear all entries with the sentinel value and reset the first entry
// with the dummy target entry.
- void ClearAndSetStaticTarget(const Function& func) const;
+ // NOTE: Can only be called during reload.
+ void ClearAndSetStaticTarget(const Function& func,
+ const CallSiteResetter& proof_of_reload) const;
void DebugDump() const;
@@ -2112,9 +2110,6 @@
StaticTypeExactnessState exactness =
StaticTypeExactnessState::NotTracking()) const;
- // Does entry |index| contain the sentinel value?
- bool IsSentinelAt(intptr_t index) const;
-
// Retrieving checks.
void GetCheckAt(intptr_t index,
@@ -2134,10 +2129,6 @@
FunctionPtr GetTargetAt(intptr_t index) const;
- ObjectPtr GetTargetOrCodeAt(intptr_t index) const;
- void SetCodeAt(intptr_t index, const Code& value) const;
- void SetEntryPointAt(intptr_t index, const Smi& value) const;
-
void IncrementCountAt(intptr_t index, intptr_t value) const;
void SetCountAt(intptr_t index, intptr_t value) const;
intptr_t GetCountAt(intptr_t index) const;
@@ -2148,8 +2139,6 @@
// Returns only used entries.
ICDataPtr AsUnaryClassChecksForArgNr(intptr_t arg_nr) const;
ICDataPtr AsUnaryClassChecks() const { return AsUnaryClassChecksForArgNr(0); }
- ICDataPtr AsUnaryClassChecksForCid(intptr_t cid,
- const Function& target) const;
// Returns ICData with aggregated receiver count, sorted by highest count.
// Smi not first!! (the convention for ICData used in code generation is that
@@ -2239,11 +2228,21 @@
// for the new entry.
ArrayPtr Grow(intptr_t* index) const;
- void set_owner(const Function& value) const;
void set_deopt_id(intptr_t value) const;
- void SetNumArgsTested(intptr_t value) const;
void set_entries(const Array& value) const;
+ void set_owner(const Function& value) const;
+ void set_rebind_rule(uint32_t rebind_rule) const;
void set_state_bits(uint32_t bits) const;
+ void set_tracking_exactness(bool value) const {
+ StoreNonPointer(
+ &raw_ptr()->state_bits_,
+ TrackingExactnessBit::update(value, raw_ptr()->state_bits_));
+ }
+
+ // Does entry |index| contain the sentinel value?
+ bool IsSentinelAt(intptr_t index) const;
+ void SetNumArgsTested(intptr_t value) const;
+ void SetReceiversStaticType(const AbstractType& type) const;
// This bit is set when a call site becomes megamorphic and starts using a
// MegamorphicCache instead of ICData. It means that the entries in the
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 447dbc2..907dda1 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -904,8 +904,8 @@
(class_ids[1] == kSmiCid)) {
// The smi fast path case, preserve the initial entry but reset the
// count.
- ic.ClearCountAt(0);
- ic.WriteSentinelAt(1);
+ ic.ClearCountAt(0, *this);
+ ic.WriteSentinelAt(1, *this);
entries_ = ic.entries();
entries_.Truncate(2 * ic.TestEntryLength());
return;
@@ -955,7 +955,7 @@
Object::Handle(zone_, ic.Owner()).ToCString());
return;
}
- ic.ClearAndSetStaticTarget(new_target_);
+ ic.ClearAndSetStaticTarget(new_target_, *this);
} else {
FATAL("Unexpected rebind rule.");
}
diff --git a/tools/VERSION b/tools/VERSION
index c5859ca..832de43 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 12
PATCH 0
-PRERELEASE 78
+PRERELEASE 79
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/patches/flutter-engine/ce76503f5b461590926ba619351518d593b81153.patch b/tools/patches/flutter-engine/ce76503f5b461590926ba619351518d593b81153.patch
deleted file mode 100644
index da7f66b..0000000
--- a/tools/patches/flutter-engine/ce76503f5b461590926ba619351518d593b81153.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/DEPS b/DEPS
-index 17f3f9f68..39b78c735 100644
---- a/DEPS
-+++ b/DEPS
-@@ -198,6 +198,9 @@ deps = {
- 'src/third_party/dart/third_party/pkg/ffi':
- Var('dart_git') + '/ffi.git@a5d4232cd38562c75a3ed847baa340e399538028',
-
-+ 'src/third_party/dart/third_party/pkg/file':
-+ Var('dart_git') + '/external/github.com/google/file.dart@0e09370f581ab6388d46fda4cdab66638c0171a1',
-+
- 'src/third_party/dart/third_party/pkg/fixnum':
- Var('dart_git') + '/fixnum.git@16d3890c6dc82ca629659da1934e412292508bba',
-