Skip to content

Commit 1b160f7

Browse files
rmacnak-googlecommit-bot@chromium.org
authored andcommitted
[vm] Gracefully handle loads not solicited by prefix.loadLibrary().
TEST=flutter Bug: #41974 Change-Id: Ia0e99c5e84cdff8736c44e4e82ce40b045ed0207 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/174563 Reviewed-by: Régis Crelier <[email protected]> Commit-Queue: Ryan Macnak <[email protected]>
1 parent 7d64e39 commit 1b160f7

File tree

4 files changed

+14
-15
lines changed

4 files changed

+14
-15
lines changed

runtime/vm/dart_api_impl.cc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6095,8 +6095,9 @@ static Dart_Handle DeferredLoadComplete(intptr_t loading_unit_id,
60956095

60966096
if (error) {
60976097
CHECK_NULL(error_message);
6098-
unit.CompleteLoad(String::Handle(String::New(error_message)),
6099-
transient_error);
6098+
return Api::NewHandle(
6099+
T, unit.CompleteLoad(String::Handle(String::New(error_message)),
6100+
transient_error));
61006101
} else {
61016102
#if defined(SUPPORT_TIMELINE)
61026103
TimelineBeginEndScope tbes(T, Timeline::GetIsolateStream(),
@@ -6120,10 +6121,8 @@ static Dart_Handle DeferredLoadComplete(intptr_t loading_unit_id,
61206121
return Api::NewHandle(T, error.raw());
61216122
}
61226123

6123-
unit.CompleteLoad(String::Handle(), false);
6124+
return Api::NewHandle(T, unit.CompleteLoad(String::Handle(), false));
61246125
}
6125-
6126-
return Api::Success();
61276126
}
61286127

61296128
DART_EXPORT Dart_Handle

runtime/vm/object.cc

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17481,8 +17481,8 @@ ObjectPtr LoadingUnit::IssueLoad() const {
1748117481
return Isolate::Current()->CallDeferredLoadHandler(id());
1748217482
}
1748317483

17484-
void LoadingUnit::CompleteLoad(const String& error_message,
17485-
bool transient_error) const {
17484+
ObjectPtr LoadingUnit::CompleteLoad(const String& error_message,
17485+
bool transient_error) const {
1748617486
ASSERT(!loaded());
1748717487
ASSERT(load_outstanding());
1748817488
set_loaded(error_message.IsNull());
@@ -17496,12 +17496,7 @@ void LoadingUnit::CompleteLoad(const String& error_message,
1749617496
args.SetAt(0, Smi::Handle(Smi::New(id())));
1749717497
args.SetAt(1, error_message);
1749817498
args.SetAt(2, Bool::Get(transient_error));
17499-
const Object& result = Object::Handle(DartEntry::InvokeFunction(func, args));
17500-
if (result.IsUnwindError()) {
17501-
Thread::Current()->set_sticky_error(Error::Cast(result));
17502-
} else if (result.IsError()) {
17503-
UNREACHABLE();
17504-
}
17499+
return DartEntry::InvokeFunction(func, args);
1750517500
}
1750617501

1750717502
const char* Error::ToErrorCString() const {

runtime/vm/object.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6996,7 +6996,8 @@ class LoadingUnit : public Object {
69966996
}
69976997

69986998
ObjectPtr IssueLoad() const;
6999-
void CompleteLoad(const String& error_message, bool transient_error) const;
6999+
ObjectPtr CompleteLoad(const String& error_message,
7000+
bool transient_error) const;
70007001

70017002
private:
70027003
FINAL_HEAP_OBJECT_IMPLEMENTATION(LoadingUnit, Object);

sdk/lib/_internal/vm/lib/lib_prefix.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ class _DeferredNotLoadedError extends Error implements NoSuchMethodError {
3131

3232
@pragma("vm:entry-point")
3333
void _completeLoads(Object unit, String? errorMessage, bool transientError) {
34-
Completer<void> load = _LibraryPrefix._loads[unit]!;
34+
Completer<void>? load = _LibraryPrefix._loads[unit];
35+
if (load == null) {
36+
// Embedder loaded even though prefix.loadLibrary() wasn't called.
37+
_LibraryPrefix._loads[unit] = load = new Completer<void>();
38+
}
3539
if (errorMessage == null) {
3640
load.complete(null);
3741
} else {

0 commit comments

Comments
 (0)