// Copyright (c) 2014, 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. // part of "core_patch.dart"; // This type corresponds to the VM-internal class LibraryPrefix. @pragma("vm:entry-point") class _LibraryPrefix { factory _LibraryPrefix._uninstantiable() { throw "Unreachable"; } bool _load() native "LibraryPrefix_load"; Object _loadError() native "LibraryPrefix_loadError"; bool isLoaded() native "LibraryPrefix_isLoaded"; bool _invalidateDependentCode() native "LibraryPrefix_invalidateDependentCode"; loadLibrary() { for (int i = 0; i < _outstandingLoadRequests.length; i++) { if (_outstandingLoadRequests[i][0] == this) { return _outstandingLoadRequests[i][1].future; } } var completer = new Completer(); var pair = new List(); pair.add(this); pair.add(completer); _outstandingLoadRequests.add(pair); Timer.run(() { var hasCompleted = this._load(); // Loading can complete immediately, for example when the same // library has been loaded eagerly or through another deferred // prefix. If that is the case, we must invalidate the dependent // code and complete the future now since there will be no callback // from the VM. if (hasCompleted && !completer.isCompleted) { _invalidateDependentCode(); completer.complete(true); _outstandingLoadRequests.remove(pair); } }); return completer.future; } } // A list of two element lists. The first element is the _LibraryPrefix. The // second element is the Completer for the load request. var _outstandingLoadRequests = new List(); // Called from the VM when an outstanding load request has finished. @pragma("vm:entry-point", "call") _completeDeferredLoads() { // Determine which outstanding load requests have completed and complete // their completer (with an error or true). For outstanding load requests // which have not completed, remember them for next time in // stillOutstandingLoadRequests. var stillOutstandingLoadRequests = new List(); // Make a copy of the outstandingRequests because the call to _load below // may recursively trigger another call to |_completeDeferredLoads|, which // can cause |_outstandingLoadRequests| to be modified. var outstandingRequests = _outstandingLoadRequests.toList(); for (int i = 0; i < outstandingRequests.length; i++) { var prefix = outstandingRequests[i][0]; var completer = outstandingRequests[i][1]; var error = prefix._loadError(); if (completer.isCompleted) { // Already completed. Skip. continue; } if (error != null) { completer.completeError(error); } else if (prefix._load()) { prefix._invalidateDependentCode(); completer.complete(true); } else { stillOutstandingLoadRequests.add(outstandingRequests[i]); } } _outstandingLoadRequests = stillOutstandingLoadRequests; }