Version 1.9.0-dev.10.10
svn merge -c 44291 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44435 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44437 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44451 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44455 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44457 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44508 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44538 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44540 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44542 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44544 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44546 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44547 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 44548 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
git-svn-id: http://dart.googlecode.com/svn/trunk@44550 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index d7939f2..17944cd 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -638,8 +638,13 @@
staticModifier = _inStaticContext();
}
utils.targetClassElement = targetClassElement;
+ // prepare target ClassDeclaration
+ AstNode targetTypeNode = targetClassElement.node;
+ if (targetTypeNode is! ClassDeclaration) {
+ return;
+ }
+ ClassDeclaration targetClassNode = targetTypeNode;
// prepare location
- ClassDeclaration targetClassNode = targetClassElement.node;
_FieldLocation targetLocation = _prepareNewFieldLocation(targetClassNode);
// build method source
String targetFile = targetClassElement.source.fullName;
@@ -763,8 +768,13 @@
staticModifier = _inStaticContext();
}
utils.targetClassElement = targetClassElement;
+ // prepare target ClassDeclaration
+ AstNode targetTypeNode = targetClassElement.node;
+ if (targetTypeNode is! ClassDeclaration) {
+ return;
+ }
+ ClassDeclaration targetClassNode = targetTypeNode;
// prepare location
- ClassDeclaration targetClassNode = targetClassElement.node;
_FieldLocation targetLocation = _prepareNewGetterLocation(targetClassNode);
// build method source
String targetFile = targetClassElement.source.fullName;
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index c748c6f..efeb876 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -10,9 +10,9 @@
import 'package:analysis_server/src/protocol.dart';
import 'package:analysis_server/src/services/index/index.dart';
import 'package:analysis_server/src/services/index/local_file_index.dart';
-import 'package:analysis_server/src/source/caching_pub_package_map_provider.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:analyzer/source/pub_package_map_provider.dart';
import 'package:analyzer/src/generated/sdk_io.dart';
/**
@@ -69,7 +69,7 @@
}
analysisServer = new AnalysisServer(serverChannel, resourceProvider,
- new CachingPubPackageMapProvider(resourceProvider, defaultSdk), index,
+ new PubPackageMapProvider(resourceProvider, defaultSdk), index,
analysisServerOptions, defaultSdk, instrumentationService,
rethrowExceptions: false);
_initializeHandlers(analysisServer);
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index e627842..339645b 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -521,6 +521,18 @@
assertNoFix(FixKind.CREATE_CONSTRUCTOR_SUPER);
}
+ void test_createField_BAD_inEnum() {
+ resolveTestUnit('''
+enum MyEnum {
+ AAA, BBB
+}
+main() {
+ MyEnum.foo;
+}
+''');
+ assertNoFix(FixKind.CREATE_FIELD);
+ }
+
void test_createField_BAD_inSDK() {
resolveTestUnit('''
main(List p) {
diff --git a/runtime/vm/ast_transformer.cc b/runtime/vm/ast_transformer.cc
index dacabbf..8284a64 100644
--- a/runtime/vm/ast_transformer.cc
+++ b/runtime/vm/ast_transformer.cc
@@ -601,12 +601,13 @@
void AwaitTransformer::VisitLetNode(LetNode* node) {
- // Add all the initializer nodes and their temporary variables
- // to the preamble. The temporary variables will be captured
- // as a side effect of being added to a scope, and the subsequent
- // nodes that are added to the preample can access them.
+ // Add all the initializer nodes to the preamble and the
+ // temporary variables to the scope for async temporary variables.
+ // The temporary variables will be captured as a side effect of being
+ // added to a scope, and the subsequent nodes that are added to the
+ // preample can access them.
for (intptr_t i = 0; i < node->num_temps(); i++) {
- preamble_->scope()->AddVariable(node->TempAt(i));
+ function_top_->AddVariable(node->TempAt(i));
AstNode* new_init_val = Transform(node->InitializerAt(i));
preamble_->Add(new(Z) StoreLocalNode(node->token_pos(),
node->TempAt(i),
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 05334bc..7103b61 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -1830,7 +1830,7 @@
String& Parser::ParseNativeDeclaration() {
TRACE_PARSER("ParseNativeDeclaration");
- ASSERT(IsLiteral("native"));
+ ASSERT(IsSymbol(Symbols::Native()));
ConsumeToken();
CheckToken(Token::kSTRING, "string literal expected");
String& native_name = *CurrentLiteral();
@@ -2980,7 +2980,7 @@
ExpectToken(Token::kRBRACE);
} else if (CurrentToken() == Token::kARROW) {
ReportError("constructors may not return a value");
- } else if (IsLiteral("native")) {
+ } else if (IsSymbol(Symbols::Native())) {
ReportError("native constructors not supported");
} else if (CurrentToken() == Token::kSEMICOLON) {
// Some constructors have no function body.
@@ -3239,7 +3239,7 @@
ASSERT(expr != NULL);
current_block_->statements->Add(new ReturnNode(expr_pos, expr));
end_token_pos = TokenPos();
- } else if (IsLiteral("native")) {
+ } else if (IsSymbol(Symbols::Native())) {
if (String::Handle(Z, func.name()).Equals(
Symbols::EqualOperator())) {
const Class& owner = Class::Handle(Z, func.Owner());
@@ -3654,7 +3654,7 @@
method_end_pos = TokenPos();
ExpectSemicolon();
}
- } else if (IsLiteral("native")) {
+ } else if (IsSymbol(Symbols::Native())) {
if (method->has_abstract) {
ReportError(method->name_pos,
"abstract method '%s' may not have a function body",
@@ -5288,7 +5288,7 @@
RawFunction::AsyncModifier Parser::ParseFunctionModifier() {
- if (CurrentLiteral()->raw() == Symbols::Async().raw()) {
+ if (IsSymbol(Symbols::Async())) {
ConsumeToken();
if (CurrentToken() == Token::kMUL) {
const bool enableAsyncStar = true;
@@ -5300,7 +5300,7 @@
} else {
return RawFunction::kAsync;
}
- } else if ((CurrentLiteral()->raw() == Symbols::Sync().raw()) &&
+ } else if (IsSymbol(Symbols::Sync()) &&
(LookaheadToken(1) == Token::kMUL)) {
const bool enableSyncStar = true;
if (!enableSyncStar) {
@@ -5390,7 +5390,7 @@
SkipExpr();
function_end_pos = TokenPos();
ExpectSemicolon();
- } else if (IsLiteral("native")) {
+ } else if (IsSymbol(Symbols::Native())) {
ParseNativeDeclaration();
function_end_pos = TokenPos();
ExpectSemicolon();
@@ -5540,7 +5540,7 @@
SkipExpr();
accessor_end_pos = TokenPos();
ExpectSemicolon();
- } else if (IsLiteral("native")) {
+ } else if (IsSymbol(Symbols::Native())) {
ParseNativeDeclaration();
accessor_end_pos = TokenPos();
ExpectSemicolon();
@@ -5666,7 +5666,7 @@
ReportError("library url expected");
}
bool is_deferred_import = false;
- if (is_import && (IsLiteral("deferred"))) {
+ if (is_import && (IsSymbol(Symbols::Deferred()))) {
is_deferred_import = true;
ConsumeToken();
CheckToken(Token::kAS, "'as' expected");
@@ -5681,7 +5681,9 @@
Array& show_names = Array::Handle(Z);
Array& hide_names = Array::Handle(Z);
- if (is_deferred_import || IsLiteral("show") || IsLiteral("hide")) {
+ if (is_deferred_import ||
+ IsSymbol(Symbols::Show()) ||
+ IsSymbol(Symbols::Hide())) {
GrowableObjectArray& show_list =
GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
GrowableObjectArray& hide_list =
@@ -5692,10 +5694,10 @@
hide_list.Add(Symbols::LoadLibrary());
}
for (;;) {
- if (IsLiteral("show")) {
+ if (IsSymbol(Symbols::Show())) {
ConsumeToken();
ParseIdentList(&show_list);
- } else if (IsLiteral("hide")) {
+ } else if (IsSymbol(Symbols::Hide())) {
ConsumeToken();
ParseIdentList(&hide_list);
} else {
@@ -5846,7 +5848,7 @@
SkipMetadata();
CheckToken(Token::kPART, "'part of' expected");
ConsumeToken();
- if (!IsLiteral("of")) {
+ if (!IsSymbol(Symbols::Of())) {
ReportError("'part of' expected");
}
ConsumeToken();
@@ -5898,7 +5900,7 @@
} else if ((CurrentToken() == Token::kABSTRACT) &&
(LookaheadToken(1) == Token::kCLASS)) {
ParseClassDeclaration(pending_classes, toplevel_class, metadata_pos);
- } else if (is_patch_source() && IsLiteral("patch") &&
+ } else if (is_patch_source() && IsSymbol(Symbols::Patch()) &&
(LookaheadToken(1) == Token::kCLASS)) {
ParseClassDeclaration(pending_classes, toplevel_class, metadata_pos);
} else {
@@ -7543,6 +7545,12 @@
}
+bool Parser::IsSymbol(const String& symbol) {
+ return (CurrentLiteral()->raw() == symbol.raw()) &&
+ (CurrentToken() == Token::kIDENT);
+}
+
+
// Returns true if the next tokens can be parsed as a an optionally
// qualified identifier: [ident '.'] ident.
// Current token position is not restored.
@@ -7686,10 +7694,10 @@
SkipToMatchingParenthesis();
if ((CurrentToken() == Token::kLBRACE) ||
(CurrentToken() == Token::kARROW) ||
- (is_top_level_ && IsLiteral("native")) ||
+ (is_top_level_ && IsSymbol(Symbols::Native())) ||
is_external ||
- (CurrentLiteral()->raw() == Symbols::Async().raw()) ||
- (CurrentLiteral()->raw() == Symbols::Sync().raw())) {
+ IsSymbol(Symbols::Async()) ||
+ IsSymbol(Symbols::Sync())) {
SetPosition(saved_pos);
return true;
}
@@ -7701,9 +7709,7 @@
bool Parser::IsTopLevelAccessor() {
const intptr_t saved_pos = TokenPos();
- if (is_patch_source() &&
- (CurrentToken() == Token::kIDENT) &&
- (CurrentLiteral()->Equals("patch"))) {
+ if (is_patch_source() && IsSymbol(Symbols::Patch())) {
ConsumeToken();
} else if (CurrentToken() == Token::kEXTERNAL) {
ConsumeToken();
@@ -8826,14 +8832,14 @@
bool generic_catch_seen = false;
GrowableArray<AstNode*> type_tests;
GrowableArray<SequenceNode*> catch_blocks;
- while ((CurrentToken() == Token::kCATCH) || IsLiteral("on")) {
+ while ((CurrentToken() == Token::kCATCH) || IsSymbol(Symbols::On())) {
// Open a block that contains the if or an unconditional body. It's
// closed in the loop that builds the if-then-else nest.
OpenBlock();
const intptr_t catch_pos = TokenPos();
CatchParamDesc exception_param;
CatchParamDesc stack_trace_param;
- if (IsLiteral("on")) {
+ if (IsSymbol(Symbols::On())) {
ConsumeToken();
exception_param.type = &AbstractType::ZoneHandle(Z,
ParseType(ClassFinalizer::kCanonicalize));
@@ -9156,7 +9162,7 @@
ExpectToken(Token::kRBRACE);
SequenceNode* try_block = CloseBlock();
- if ((CurrentToken() != Token::kCATCH) && !IsLiteral("on") &&
+ if ((CurrentToken() != Token::kCATCH) && !IsSymbol(Symbols::On()) &&
(CurrentToken() != Token::kFINALLY)) {
ReportError("catch or finally clause expected");
}
@@ -9698,20 +9704,13 @@
}
-bool Parser::IsLiteral(const char* literal) {
- return IsIdentifier() && CurrentLiteral()->Equals(literal);
-}
-
-
bool Parser::IsAwaitKeyword() {
- return await_is_keyword_ &&
- (CurrentLiteral()->raw() == Symbols::Await().raw());
+ return await_is_keyword_ && IsSymbol(Symbols::Await());
}
bool Parser::IsYieldKeyword() {
- return await_is_keyword_ &&
- (CurrentLiteral()->raw() == Symbols::YieldKw().raw());
+ return await_is_keyword_ && IsSymbol(Symbols::YieldKw());
}
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 0e3d694..49eef83 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -321,7 +321,6 @@
void UnexpectedToken();
String* ExpectUserDefinedTypeIdentifier(const char* msg);
String* ExpectIdentifier(const char* msg);
- bool IsLiteral(const char* literal);
bool IsAwaitKeyword();
bool IsYieldKeyword();
@@ -651,6 +650,7 @@
SourceLabel* label);
void ParseStatementSequence();
bool IsIdentifier();
+ bool IsSymbol(const String& symbol);
bool IsSimpleLiteral(const AbstractType& type, Instance* value);
bool IsFunctionTypeAliasName();
bool IsMixinAppAlias();
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 14384bf..a55bcfb 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -95,6 +95,11 @@
V(Library, "library") \
V(LoadLibrary, "loadLibrary") \
V(_LibraryPrefix, "_LibraryPrefix") \
+ V(On, "on") \
+ V(Of, "of") \
+ V(Deferred, "deferred") \
+ V(Show, "show") \
+ V(Hide, "hide") \
V(Async, "async") \
V(Sync, "sync") \
V(YieldKw, "yield") \
@@ -132,6 +137,7 @@
V(BoundedType, "_BoundedType") \
V(MixinAppType, "_MixinAppType") \
V(TypeArguments, "TypeArguments") \
+ V(Patch, "patch") \
V(PatchClass, "PatchClass") \
V(Function, "Function") \
V(FunctionImpl, "_FunctionImpl") \
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
index f515392..c2f4bd5 100644
--- a/sdk/lib/collection/queue.dart
+++ b/sdk/lib/collection/queue.dart
@@ -96,59 +96,129 @@
}
+class _DoubleLink {
+ _DoubleLink _previousLink;
+ _DoubleLink _nextLink;
+
+ void _link(_DoubleLink previous,
+ _DoubleLink next) {
+ _nextLink = next;
+ _previousLink = previous;
+ if (previous != null) previous._nextLink = this;
+ if (next != null) next._previousLink = this;
+ }
+
+ void _unlink() {
+ if (_previousLink != null) _previousLink._nextLink = _nextLink;
+ if (_nextLink != null) _nextLink._previousLink = _previousLink;
+ _nextLink = null;
+ _previousLink = null;
+ }
+}
+
/**
* An entry in a doubly linked list. It contains a pointer to the next
* entry, the previous entry, and the boxed element.
*/
-class DoubleLinkedQueueEntry<E> {
- DoubleLinkedQueueEntry<E> _previous;
- DoubleLinkedQueueEntry<E> _next;
- E _element;
+class DoubleLinkedQueueEntry<E> extends _DoubleLink {
+ E element;
- DoubleLinkedQueueEntry(E e) : _element = e;
-
- void _link(DoubleLinkedQueueEntry<E> previous,
- DoubleLinkedQueueEntry<E> next) {
- _next = next;
- _previous = previous;
- previous._next = this;
- next._previous = this;
- }
+ DoubleLinkedQueueEntry(this.element);
void append(E e) {
- new DoubleLinkedQueueEntry<E>(e)._link(this, _next);
+ new DoubleLinkedQueueEntry<E>(e)._link(this, _nextLink);
}
void prepend(E e) {
- new DoubleLinkedQueueEntry<E>(e)._link(_previous, this);
+ new DoubleLinkedQueueEntry<E>(e)._link(_previousLink, this);
}
E remove() {
- _previous._next = _next;
- _next._previous = _previous;
- _next = null;
- _previous = null;
- return _element;
- }
-
- DoubleLinkedQueueEntry<E> _asNonSentinelEntry() {
- return this;
+ _unlink();
+ return element;
}
DoubleLinkedQueueEntry<E> previousEntry() {
- return _previous._asNonSentinelEntry();
+ return _previousLink;
}
DoubleLinkedQueueEntry<E> nextEntry() {
- return _next._asNonSentinelEntry();
+ return _nextLink;
+ }
+}
+
+/**
+ * Interface for the link classes used by [DoubleLinkedQueue].
+ *
+ * Both the [_DoubleLinkedQueueElement] and [_DoubleLinkedQueueSentinel]
+ * implements this interface.
+ * The entry contains a link back to the queue, so calling `append`
+ * or `prepend` can correctly update the element count.
+ */
+abstract class _DoubleLinkedQueueEntry<E> extends _DoubleLink {
+ DoubleLinkedQueue<E> _queue;
+ _DoubleLinkedQueueEntry(this._queue);
+
+ _DoubleLinkedQueueElement _asNonSentinelEntry();
+
+ void _append(E e) {
+ new _DoubleLinkedQueueElement<E>(e, _queue)._link(this, _nextLink);
}
- E get element {
- return _element;
+ void _prepend(E e) {
+ new _DoubleLinkedQueueElement<E>(e, _queue)._link(_previousLink, this);
}
- void set element(E e) {
- _element = e;
+ E _remove();
+
+ E get element;
+
+ DoubleLinkedQueueEntry<E> nextEntry() {
+ _DoubleLinkedQueueEntry next = _nextLink;
+ return next._asNonSentinelEntry();
+ }
+
+ DoubleLinkedQueueEntry<E> previousEntry() {
+ _DoubleLinkedQueueEntry previous = _previousLink;
+ return previous._asNonSentinelEntry();
+ }
+}
+
+/**
+ * The actual entry type used by the [DoubleLinkedQueue].
+ *
+ * The entry contains a reference to the queue, allowing
+ * [append]/[prepend] to update the list length.
+ */
+class _DoubleLinkedQueueElement<E> extends _DoubleLinkedQueueEntry<E>
+ implements DoubleLinkedQueueEntry<E> {
+ E element;
+ _DoubleLinkedQueueElement(this.element, DoubleLinkedQueue<E> queue)
+ : super(queue);
+
+ void append(E e) {
+ _append(e);
+ if (_queue != null) _queue._elementCount++;
+ }
+
+ void prepend(E e) {
+ _prepend(e);
+ if (_queue != null) _queue._elementCount++;
+ }
+
+ E _remove() {
+ _queue = null;
+ _unlink();
+ return element;
+ }
+
+ E remove() {
+ if (_queue != null) _queue._elementCount--;
+ return _remove();
+ }
+
+ _DoubleLinkedQueueElement _asNonSentinelEntry() {
+ return this;
}
}
@@ -160,25 +230,22 @@
* Initially, a sentinel has its next and previous entry point to itself.
* A sentinel does not box any user element.
*/
-class _DoubleLinkedQueueEntrySentinel<E> extends DoubleLinkedQueueEntry<E> {
- _DoubleLinkedQueueEntrySentinel() : super(null) {
- _link(this, this);
+class _DoubleLinkedQueueSentinel<E> extends _DoubleLinkedQueueEntry<E> {
+ _DoubleLinkedQueueSentinel(DoubleLinkedQueue queue) : super(queue) {
+ _previousLink = this;
+ _nextLink = this;
}
- E remove() {
- throw IterableElementError.noElement();
- }
-
- DoubleLinkedQueueEntry<E> _asNonSentinelEntry() {
+ _DoubleLinkedQueueElement _asNonSentinelEntry() {
return null;
}
- void set element(E e) {
- // This setter is unreachable.
- // TODO(lrn): Don't inherit the field if we don't use it.
- assert(false);
+ /** Hit by, e.g., [DoubleLinkedQueue.removeFirst] if the queue is empty. */
+ E _remove() {
+ throw IterableElementError.noElement();
}
+ /** Hit by, e.g., [DoubleLinkedQueue.first] if the queue is empty. */
E get element {
throw IterableElementError.noElement();
}
@@ -190,11 +257,11 @@
* Allows constant time add, remove-at-ends and peek operations.
*/
class DoubleLinkedQueue<E> extends IterableBase<E> implements Queue<E> {
- _DoubleLinkedQueueEntrySentinel<E> _sentinel;
+ _DoubleLinkedQueueSentinel<E> _sentinel;
int _elementCount = 0;
DoubleLinkedQueue() {
- _sentinel = new _DoubleLinkedQueueEntrySentinel<E>();
+ _sentinel = new _DoubleLinkedQueueSentinel<E>(this);
}
/**
@@ -204,7 +271,7 @@
* [addLast] in the order provided by [elements.iterator].
*/
factory DoubleLinkedQueue.from(Iterable elements) {
- Queue<E> list = new DoubleLinkedQueue();
+ Queue<E> list = new DoubleLinkedQueue<E>();
for (final E e in elements) {
list.addLast(e);
}
@@ -214,58 +281,60 @@
int get length => _elementCount;
void addLast(E value) {
- _sentinel.prepend(value);
+ _sentinel._prepend(value);
_elementCount++;
}
void addFirst(E value) {
- _sentinel.append(value);
+ _sentinel._append(value);
_elementCount++;
}
void add(E value) {
- _sentinel.prepend(value);
+ _sentinel._prepend(value);
_elementCount++;
}
void addAll(Iterable<E> iterable) {
for (final E value in iterable) {
- _sentinel.prepend(value);
+ _sentinel._prepend(value);
_elementCount++;
}
}
E removeLast() {
- E result = _sentinel._previous.remove();
+ _DoubleLinkedQueueEntry lastEntry = _sentinel._previousLink;
+ E result = lastEntry._remove();
_elementCount--;
return result;
}
E removeFirst() {
- E result = _sentinel._next.remove();
+ _DoubleLinkedQueueEntry firstEntry = _sentinel._nextLink;
+ E result = firstEntry._remove();
_elementCount--;
return result;
}
bool remove(Object o) {
- DoubleLinkedQueueEntry<E> entry = _sentinel._next;
+ _DoubleLinkedQueueEntry<E> entry = _sentinel._nextLink;
while (!identical(entry, _sentinel)) {
if (entry.element == o) {
- entry.remove();
+ entry._remove();
_elementCount--;
return true;
}
- entry = entry._next;
+ entry = entry._nextLink;
}
return false;
}
void _filter(bool test(E element), bool removeMatching) {
- DoubleLinkedQueueEntry<E> entry = _sentinel._next;
+ _DoubleLinkedQueueEntry<E> entry = _sentinel._nextLink;
while (!identical(entry, _sentinel)) {
- DoubleLinkedQueueEntry<E> next = entry._next;
+ _DoubleLinkedQueueEntry<E> next = entry._nextLink;
if (identical(removeMatching, test(entry.element))) {
- entry.remove();
+ entry._remove();
_elementCount--;
}
entry = next;
@@ -281,17 +350,21 @@
}
E get first {
- return _sentinel._next.element;
+ _DoubleLinkedQueueEntry firstEntry = _sentinel._nextLink;
+ return firstEntry.element;
}
E get last {
- return _sentinel._previous.element;
+ _DoubleLinkedQueueEntry lastEntry = _sentinel._previousLink;
+ return lastEntry.element;
}
E get single {
- // Note that this throws correctly if the queue is empty.
- if (identical(_sentinel._next, _sentinel._previous)) {
- return _sentinel._next.element;
+ // Note that this throws correctly if the queue is empty
+ // because reading element on the sentinel throws.
+ if (identical(_sentinel._nextLink, _sentinel._previousLink)) {
+ _DoubleLinkedQueueEntry entry = _sentinel._nextLink;
+ return entry.element;
}
throw IterableElementError.tooMany();
}
@@ -305,20 +378,21 @@
}
bool get isEmpty {
- return (identical(_sentinel._next, _sentinel));
+ return (identical(_sentinel._nextLink, _sentinel));
}
void clear() {
- _sentinel._next = _sentinel;
- _sentinel._previous = _sentinel;
+ _sentinel._nextLink = _sentinel;
+ _sentinel._previousLink = _sentinel;
_elementCount = 0;
}
void forEachEntry(void f(DoubleLinkedQueueEntry<E> element)) {
- DoubleLinkedQueueEntry<E> entry = _sentinel._next;
+ _DoubleLinkedQueueEntry<E> entry = _sentinel._nextLink;
while (!identical(entry, _sentinel)) {
- DoubleLinkedQueueEntry<E> nextEntry = entry._next;
- f(entry);
+ _DoubleLinkedQueueEntry<E> nextEntry = entry._nextLink;
+ _DoubleLinkedQueueElement element = entry;
+ f(element);
entry = nextEntry;
}
}
@@ -331,23 +405,27 @@
}
class _DoubleLinkedQueueIterator<E> implements Iterator<E> {
- _DoubleLinkedQueueEntrySentinel<E> _sentinel;
- DoubleLinkedQueueEntry<E> _nextEntry = null;
+ _DoubleLinkedQueueSentinel<E> _sentinel;
+ _DoubleLinkedQueueEntry<E> _nextEntry = null;
E _current;
- _DoubleLinkedQueueIterator(_DoubleLinkedQueueEntrySentinel<E> sentinel)
- : _sentinel = sentinel, _nextEntry = sentinel._next;
+ _DoubleLinkedQueueIterator(_DoubleLinkedQueueSentinel<E> sentinel)
+ : _sentinel = sentinel, _nextEntry = sentinel._nextLink;
bool moveNext() {
- // When [_currentEntry] it is set to [:null:] then it is at the end.
- if (!identical(_nextEntry, _sentinel)) {
- _current = _nextEntry._element;
- _nextEntry = _nextEntry._next;
- return true;
+ if (identical(_nextEntry, _sentinel)) {
+ _current = null;
+ _nextEntry = null;
+ _sentinel = null;
+ return false;
}
- _current = null;
- _nextEntry = _sentinel = null; // Still identical.
- return false;
+ _DoubleLinkedQueueElement elementEntry = _nextEntry;
+ if (elementEntry._queue == null) {
+ throw new ConcurrentModificationError(_sentinel._queue);
+ }
+ _current = elementEntry.element;
+ _nextEntry = elementEntry._nextLink;
+ return true;
}
E get current => _current;
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index f9a2e67..f42f3d2 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -457,6 +457,7 @@
LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/canvas-as-image-incremental-repaint_t01: Skip # Times out. Please triage this failure
LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
@@ -477,9 +478,10 @@
LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/setWidthResetAfterForcedRender_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/webgl/context-lost-restored_t01: Pass, Timeout # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
@@ -569,9 +571,10 @@
LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError # Please triage this failure
LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/counters/complex-before_t01: RuntimeError # Please triage this failure
LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/csstext-of-content-string_t01: Pass, RuntimeError # Please triage this failure
LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/csstext-of-content-string_t01: Pass, RuntimeError # Please triage this failure
LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
LayoutTests/fast/css/ex-unit-with-no-x-height_t01: Pass, RuntimeError # Please triage this failure
@@ -747,6 +750,7 @@
LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError # Please triage this failure
LayoutTests/fast/dynamic/insertAdjacentElement_t01: RuntimeError # Please triage this failure
LayoutTests/fast/dynamic/recursive-layout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/encoding/css-charset-dom_t01: RuntimeError # Please triage this failure
LayoutTests/fast/events/add-event-without-document_t01: RuntimeError # Please triage this failure
LayoutTests/fast/events/change-overflow-on-overflow-change_t01: Skip # Times out. Please triage this failure
LayoutTests/fast/events/clipboard-clearData_t01: Skip # Times out. Please triage this failure
@@ -938,7 +942,6 @@
LayoutTests/fast/text/international/thai-offsetForPosition-inside-character_t01: RuntimeError # Please triage this failure
LayoutTests/fast/text/ipa-tone-letters_t01: Pass, RuntimeError # Please triage this failure
LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/regional-indicator-symobls_t01: RuntimeError # Please triage this failure
LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError # Please triage this failure
LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: Pass, RuntimeError # Please triage this failure
LayoutTests/fast/text/sub-pixel/text-scaling-pixel_t01: Pass, RuntimeError # Please triage this failure
@@ -1012,7 +1015,6 @@
LibTest/html/Element/dataset_A02_t01: RuntimeError # Please triage this failure
LibTest/html/Element/focus_A01_t01: Skip # Times out. Please triage this failure
LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Issue 16395
-LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Issue 16575
LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Issue 16395
LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Please triage this failure
LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Please triage this failure
@@ -1052,7 +1054,6 @@
LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # Please triage this failure
LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # Please triage this failure
LibTest/html/IFrameElement/focus_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError # Please triage this failure
LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # Please triage this failure
@@ -1097,14 +1098,6 @@
WebPlatformTest/custom-elements/concepts/type_A03_t01: RuntimeError # Please triage this failure
WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # Please triage this failure
WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # Please triage this failure
WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # Please triage this failure
WebPlatformTest/dom/EventTarget/dispatchEvent_A03_t01: Skip # Times out. Please triage this failure
WebPlatformTest/dom/events/type_A01_t01: RuntimeError # Please triage this failure
@@ -1177,7 +1170,6 @@
WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError # Please triage this failure
WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError # Please triage this failure
WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/url_t01: RuntimeError # Please triage this failure
WebPlatformTest/html/semantics/forms/the-input-element/valueMode_t01: RuntimeError # Please triage this failure
WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError # Please triage this failure
WebPlatformTest/html/semantics/forms/the-meter-element/meter_t01: RuntimeError # Please triage this failure
@@ -1245,11 +1237,10 @@
WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure
WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # Please triage this failure
WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/event_local_key_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/event_session_key_t01: RuntimeError # Please triage this failure
WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
+
[ $compiler == dart2js && $runtime == chrome && $checked ]
LayoutTests/fast/css-intrinsic-dimensions/css-tables_t01: RuntimeError # Please triage this failure
LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-absolutes_t01: RuntimeError # Please triage this failure
@@ -1322,10 +1313,11 @@
WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Please triage this failure
[ $compiler == dart2js && $runtime == chrome && $system == macos ]
+LayoutTests/fast/canvas/webgl/canvas-test_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/vertical-align-length-copy-bug_t01: RuntimeError # Please triage this failure
LayoutTests/fast/flexbox/repaint-scrollbar_t01: RuntimeError # Please triage this failure
LayoutTests/fast/multicol/orphans-relayout_t01: RuntimeError # Please triage this failure
LayoutTests/fast/text/glyph-reordering_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/vertical-align-length-copy-bug_t01: RuntimeError # Please triage this failure
LayoutTests/fast/text/zero-width-characters_t01: RuntimeError # Please triage this failure
@@ -1333,7 +1325,6 @@
LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Please triage this failure
@@ -1410,6 +1401,7 @@
LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # Please triage this failure
LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # Please triage this failure
LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/regional-indicator-symobls_t01: RuntimeError # Please triage this failure
LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError # Please triage this failure
[ $compiler == dart2js && $runtime == ff ]
diff --git a/tests/corelib/queue_test.dart b/tests/corelib/queue_test.dart
index cb4f2c7..e9a96b8 100644
--- a/tests/corelib/queue_test.dart
+++ b/tests/corelib/queue_test.dart
@@ -399,7 +399,7 @@
}
void testQueueElements() {
- DoubleLinkedQueue<int> queue1 = new DoubleLinkedQueue<int>.from([1, 2, 4]);
+ DoubleLinkedQueue<int> queue1 = new DoubleLinkedQueue<int>.from([1, 2, 3]);
DoubleLinkedQueue<int> queue2 = new DoubleLinkedQueue<int>();
queue2.addAll(queue1);
@@ -412,11 +412,67 @@
entry2 = entry2.nextEntry();
}
Expect.equals(null, entry2);
+
+ var firstEntry = queue1.firstEntry();
+ var secondEntry = queue1.firstEntry().nextEntry();
+ var thirdEntry = queue1.lastEntry();
+ firstEntry.prepend(4);
+ firstEntry.append(5);
+ secondEntry.prepend(6);
+ secondEntry.append(7);
+ thirdEntry.prepend(8);
+ thirdEntry.append(9);
+ Expect.equals(9, queue1.length);
+ Expect.listEquals(queue1.toList(), [4, 1, 5, 6, 2, 7, 8, 3, 9]);
+ Expect.equals(1, firstEntry.remove());
+ Expect.equals(2, secondEntry.remove());
+ Expect.equals(3, thirdEntry.remove());
+ Expect.equals(6, queue1.length);
+ Expect.listEquals(queue1.toList(), [4, 5, 6, 7, 8, 9]);
}
}
+void linkEntryTest() {
+ var entry = new DoubleLinkedQueueEntry(42);
+ Expect.equals(null, entry.previousEntry());
+ Expect.equals(null, entry.nextEntry());
+
+ entry.append(37);
+ entry.prepend(87);
+ var prev = entry.previousEntry();
+ var next = entry.nextEntry();
+ Expect.equals(42, entry.element);
+ Expect.equals(37, next.element);
+ Expect.equals(87, prev.element);
+ Expect.identical(entry, prev.nextEntry());
+ Expect.identical(entry, next.previousEntry());
+ Expect.equals(null, next.nextEntry());
+ Expect.equals(null, prev.previousEntry());
+
+ entry.element = 117;
+ Expect.equals(117, entry.element);
+ Expect.identical(next, entry.nextEntry());
+ Expect.identical(prev, entry.previousEntry());
+
+ Expect.equals(117, entry.remove());
+ Expect.identical(next, prev.nextEntry());
+ Expect.identical(prev, next.previousEntry());
+ Expect.equals(null, next.nextEntry());
+ Expect.equals(null, prev.previousEntry());
+ Expect.equals(37, next.element);
+ Expect.equals(87, prev.element);
+
+ Expect.equals(37, next.remove());
+ Expect.equals(87, prev.element);
+ Expect.equals(null, prev.nextEntry());
+ Expect.equals(null, prev.previousEntry());
+
+ Expect.equals(87, prev.remove());
+}
+
main() {
new DoubleLinkedQueueTest().testMain();
new ListQueueTest().testMain();
+ linkEntryTest();
}
diff --git a/tests/html/html.status b/tests/html/html.status
index 9c82cc1..7255772 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -131,9 +131,11 @@
deferred_multi_app_htmltest: Skip # Times out on IE. Issue 21537
localstorage_test: Pass, RuntimeError # Issue 22166
storage_test: Pass, RuntimeError # Issue 22166
+postmessage_structured_test/more_primitives: Fail # Does not support the MessageEvent constructor.
+
+[$runtime == ie10 || $runtime == ie11 || ($runtime == chrome && $system == macos)]
transition_event_test/functional: Skip # Times out. Issue 22167
request_animation_frame_test: Skip # Times out. Issue 22167
-postmessage_structured_test/more_primitives: Fail # Does not support the MessageEvent constructor.
[$runtime == ie10 ]
# IE10 Feature support statuses-
diff --git a/tests/language/await_postfix_expr_test.dart b/tests/language/await_postfix_expr_test.dart
index fbec643..faad975 100644
--- a/tests/language/await_postfix_expr_test.dart
+++ b/tests/language/await_postfix_expr_test.dart
@@ -31,12 +31,24 @@
return s;
}
+// Adapted from repro case for issue 22875.
+sum2(n) async {
+ int i, s = 0;
+ for (i = 1; i <= n; await i++) {
+ // The loop-local variable j was necessary for the crash in 22785.
+ var j = await i;
+ s += j;
+ }
+ return s;
+}
+
test() async {
Expect.equals(10, await post0(10));
Expect.equals(21, await post1(10));
Expect.equals(11, await pref0(10));
Expect.equals(23, await pref1(10));
Expect.equals(10, await sum([1, 2, 3, 4]));
+ Expect.equals(10, await sum2(4));
}
main() {
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 5ccdf36..2d179b1 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -161,6 +161,8 @@
[ $compiler == dart2js && $runtime == none ]
*: Fail, Pass # TODO(ahe): Triage these tests.
+[ $compiler == dart2js && $runtime == chrome && $system == macos ]
+await_future_test: Pass, Timeout # Issue 22695.
[ $compiler == dart2js && ($runtime == jsshell || $runtime == safari || $runtime == safarimobilesim)]
round_test: Fail, OK # Common JavaScript engine Math.round bug.
@@ -175,18 +177,6 @@
[ $compiler == dart2js && $runtime == chromeOnAndroid ]
override_field_test/02: Pass, Slow # TODO(kasperl): Please triage.
-[ $runtime == opera ]
-null_access_error_test: Fail # Issue: 7413
-string_interpolate_null_test: Fail # Issue: 7413
-call_through_null_getter_test: Fail
-closure3_test: Fail
-execute_finally3_test: Fail
-method_invocation_test: Fail
-stack_overflow_test: Fail
-stack_overflow_stacktrace_test: Fail
-closure_call_wrong_argument_count_negative_test: Skip
-label_test: Skip
-
[ $compiler == dart2dart && $builder_tag == new_backend ]
async_await_syntax_test/a03a: CompileTimeError # Issue 21404
async_await_syntax_test/a03b: CompileTimeError # Issue 21404
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 3797f59..30cd46f 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -214,8 +214,14 @@
convert/streamed_conversion_utf8_decode_test: Pass, Slow # Issue 12029
mirrors/mirrors_reader_test: Timeout, Slow, RuntimeError # Issue 16589
+[ $runtime == chrome && $system == macos ]
+async/timer_isActive_test: Pass, Timeout # Issue 22696
+async/slow_consumer_test: Pass, Timeout # Issue 22696
+async/catch_errors11_test: Pass, Timeout # Issue 22696
+
[ $runtime == chrome || $runtime == ff || $runtime == ContentShellOnAndroid ]
convert/streamed_conversion_utf8_encode_test: SkipSlow # Times out. Issue 22050
+convert/streamed_conversion_utf8_decode_test: SkipSlow # Times out. Issue 22050
convert/streamed_conversion_json_utf8_encode_test: SkipSlow # Times out. Issue 22050
convert/streamed_conversion_json_utf8_decode_test: SkipSlow # Times out. Issue 22050
async/slow_consumer2_test: SkipSlow # Times out. Issue 22050
diff --git a/tools/VERSION b/tools/VERSION
index 26e0d2a..669823c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
MINOR 9
PATCH 0
PRERELEASE 10
-PRERELEASE_PATCH 9
+PRERELEASE_PATCH 10