// 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 {
  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<bool>();
    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<List>();

// Called from the VM when an outstanding load request has finished.
@pragma("vm:entry-point")
_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<List>();
  var completedLoadRequests = new List<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;
}
