Skip to content

Commit 1f38b23

Browse files
committed
Merge pull request 'fibers' (dart-lang#15) from fibers into main
Reviewed-on: http://git.local/dependencies/dart/pulls/15
2 parents 937e3ce + 4c057ae commit 1f38b23

38 files changed

+841
-541
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,4 +119,5 @@ build-sdk.sh
119119
build-fiber-test.sh
120120
*.exe
121121
*.aot
122-
*.S
122+
*.S
123+
*.s

runtime/bin/eventhandler.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ class CircularLinkedList {
135135
}
136136
}
137137

138-
void _removeHead(ClearFun clear = nullptr) {
138+
void RemoveHead(ClearFun clear = nullptr) {
139139
ASSERT(head_ != nullptr);
140140

141141
Entry* e = head_;
@@ -184,7 +184,7 @@ class CircularLinkedList {
184184

185185
void RemoveAll(ClearFun clear = nullptr) {
186186
while (HasHead()) {
187-
_removeHead(clear);
187+
RemoveHead(clear);
188188
}
189189
}
190190

@@ -502,7 +502,7 @@ class DescriptorInfoMultipleMixin : public DI {
502502
pentry->token_count--;
503503
}
504504
if (pentry->token_count <= 0) {
505-
active_readers_._removeHead();
505+
active_readers_.RemoveHead();
506506
} else {
507507
active_readers_.Rotate();
508508
}

runtime/bin/eventhandler_test.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ VM_UNIT_TEST_CASE(CircularLinkedList) {
3333

3434
// Test: Removing head results in next element to be head.
3535
for (int i = 1; i <= 100; i++) {
36-
list._removeHead();
36+
list.RemoveHead();
3737
for (int j = i + 1; j <= 100; j++) {
3838
EXPECT(list.HasHead());
3939
EXPECT(list.head() == j);

tests/lib/fiber/fiber_test.dart renamed to runtime/tests/vm/dart/fiber/fiber_test.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ var globalState = "";
77
void main() {
88
// testBase();
99

10-
testClosures();
10+
while (true) {
11+
testClosures();
12+
}
1113
// testRecycle();
1214
}
1315

runtime/vm/compiler/backend/il.cc

Lines changed: 40 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -8551,106 +8551,52 @@ void Call1ArgStubInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
85518551
locs(), deopt_id(), env());
85528552
}
85538553

8554-
LocationSummary* CoroutineInitializeInstr::MakeLocationSummary(
8555-
Zone* zone,
8556-
bool opt) const {
8554+
LocationSummary* CoroutineInitializeInstr::MakeLocationSummary(Zone* zone,
8555+
bool opt) const {
85578556
const intptr_t kNumInputs = 1;
85588557
const intptr_t kNumTemps = 0;
8559-
LocationSummary* locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8560-
locs->set_in(0, Location::RegisterLocation(CoroutineInitializeABI::kCoroutineReg));
8558+
LocationSummary* locs = new (zone)
8559+
LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8560+
locs->set_in(
8561+
0, Location::RegisterLocation(CoroutineInitializeABI::kCoroutineReg));
85618562
return locs;
85628563
}
85638564

85648565
void CoroutineInitializeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
8565-
const Register kCoroutine = CoroutineInitializeABI::kCoroutineReg;
8566-
8567-
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
8568-
SPILLS_LR_TO_FRAME({});
8569-
#endif
8570-
__ PushObject(compiler::NullObject());
8571-
__ PushRegister(kCoroutine);
8572-
__ CallRuntime(kEnterCoroutineRuntimeEntry, 1);
8573-
__ PopRegister(kCoroutine);
8574-
__ Drop(1);
8575-
8576-
__ PushRegister(FPREG);
8577-
__ StoreFieldToOffset(SPREG, kCoroutine, Coroutine::native_stack_base_offset());
8578-
8579-
__ LoadFieldFromOffset(SPREG, kCoroutine, Coroutine::stack_base_offset());
8580-
__ PushRegister(kCoroutine);
8581-
compiler->GenerateStubCall(source(), StubCode::CoroutineEntry(), UntaggedPcDescriptors::kOther, locs(), deopt_id(), env());
8582-
__ PopRegister(kCoroutine);
8583-
__ StoreFieldToOffset(SPREG, kCoroutine, Coroutine::stack_base_offset());
8584-
8585-
__ LoadFieldFromOffset(SPREG, kCoroutine, Coroutine::native_stack_base_offset());
8586-
__ PopRegister(FPREG);
8587-
if (!FLAG_precompiled_mode) __ RestoreCodePointer();
8588-
if (FLAG_precompiled_mode) __ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
8589-
8590-
__ PushObject(compiler::NullObject());
8591-
__ PushRegister(kCoroutine);
8592-
__ CallRuntime(kExitCoroutineRuntimeEntry, 1);
8593-
__ PopRegister(kCoroutine);
8594-
__ Drop(1);
8566+
compiler->GenerateStubCall(source(), StubCode::CoroutineInitialize(),
8567+
UntaggedPcDescriptors::kOther, locs(), deopt_id(),
8568+
env());
85958569
}
85968570

8597-
LocationSummary* CoroutineForkInstr::MakeLocationSummary(
8598-
Zone* zone,
8599-
bool opt) const {
8571+
LocationSummary* CoroutineForkInstr::MakeLocationSummary(Zone* zone,
8572+
bool opt) const {
86008573
const intptr_t kNumInputs = 2;
86018574
const intptr_t kNumTemps = 0;
8602-
LocationSummary* locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8603-
locs->set_in(0, Location::RegisterLocation(CoroutineForkABI::kCallerCoroutineReg));
8604-
locs->set_in(1, Location::RegisterLocation(CoroutineForkABI::kForkedCoroutineReg));
8575+
LocationSummary* locs = new (zone)
8576+
LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8577+
locs->set_in(
8578+
0, Location::RegisterLocation(CoroutineForkABI::kCallerCoroutineReg));
8579+
locs->set_in(
8580+
1, Location::RegisterLocation(CoroutineForkABI::kForkedCoroutineReg));
86058581
return locs;
86068582
}
86078583

86088584
void CoroutineForkInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
8609-
const Register kCallerCoroutine = CoroutineForkABI::kCallerCoroutineReg;
8610-
const Register kForkedCoroutine = CoroutineForkABI::kForkedCoroutineReg;
8611-
8612-
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
8613-
SPILLS_LR_TO_FRAME({});
8614-
#endif
8615-
__ PushObject(compiler::NullObject());
8616-
__ PushRegister(kForkedCoroutine);
8617-
__ CallRuntime(kEnterForkedCoroutineRuntimeEntry, 1);
8618-
__ PopRegister(kForkedCoroutine);
8619-
__ Drop(1);
8620-
8621-
__ LoadCompressedFieldFromOffset(kCallerCoroutine, kForkedCoroutine, Coroutine::caller_offset());
8622-
8623-
__ PushRegister(FPREG);
8624-
__ StoreFieldToOffset(SPREG, kCallerCoroutine, Coroutine::stack_base_offset());
8625-
8626-
__ LoadFieldFromOffset(SPREG, kForkedCoroutine, Coroutine::stack_base_offset());
8627-
__ PushRegister(kForkedCoroutine);
8628-
compiler->GenerateStubCall(source(), StubCode::CoroutineEntry(), UntaggedPcDescriptors::kOther, locs(), deopt_id(), env());
8629-
__ PopRegister(kForkedCoroutine);
8630-
__ StoreFieldToOffset(SPREG, kForkedCoroutine, Coroutine::stack_base_offset());
8631-
8632-
__ LoadCompressedFieldFromOffset(kCallerCoroutine, kForkedCoroutine, Coroutine::caller_offset());
8633-
8634-
__ LoadFieldFromOffset(SPREG, kCallerCoroutine, Coroutine::stack_base_offset());
8635-
__ PopRegister(FPREG);
8636-
if (!FLAG_precompiled_mode) __ RestoreCodePointer();
8637-
if (FLAG_precompiled_mode) __ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
8638-
8639-
__ PushObject(compiler::NullObject());
8640-
__ PushRegister(kForkedCoroutine);
8641-
__ CallRuntime(kExitForkedCoroutineRuntimeEntry, 1);
8642-
__ PopRegister(kForkedCoroutine);
8643-
__ Drop(1);
8585+
compiler->GenerateStubCall(source(), StubCode::CoroutineFork(),
8586+
UntaggedPcDescriptors::kOther, locs(), deopt_id(),
8587+
env());
86448588
}
86458589

8646-
LocationSummary* CoroutineTransferInstr::MakeLocationSummary(
8647-
Zone* zone,
8648-
bool opt) const {
8590+
LocationSummary* CoroutineTransferInstr::MakeLocationSummary(Zone* zone,
8591+
bool opt) const {
86498592
const intptr_t kNumInputs = 2;
86508593
const intptr_t kNumTemps = 0;
8651-
LocationSummary* locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8652-
locs->set_in(0, Location::RegisterLocation(CoroutineTransferABI::kFromCoroutineReg));
8653-
locs->set_in(1, Location::RegisterLocation(CoroutineTransferABI::kToCoroutineReg));
8594+
LocationSummary* locs = new (zone)
8595+
LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8596+
locs->set_in(
8597+
0, Location::RegisterLocation(CoroutineTransferABI::kFromCoroutineReg));
8598+
locs->set_in(
8599+
1, Location::RegisterLocation(CoroutineTransferABI::kToCoroutineReg));
86548600
return locs;
86558601
}
86568602

@@ -8661,18 +8607,26 @@ void CoroutineTransferInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
86618607

86628608
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
86638609
SPILLS_LR_TO_FRAME({});
8664-
#endif
8610+
#endif
86658611
__ PushRegister(FPREG);
86668612
__ StoreFieldToOffset(SPREG, kFromCoroutine, Coroutine::stack_base_offset());
86678613

86688614
__ LoadFieldFromOffset(SPREG, kToCoroutine, Coroutine::stack_base_offset());
86698615
__ PopRegister(FPREG);
86708616
if (!FLAG_precompiled_mode) __ RestoreCodePointer();
8671-
if (FLAG_precompiled_mode) __ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
8617+
if (FLAG_precompiled_mode)
8618+
__ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
86728619

8673-
__ LoadFieldFromOffset(kToStackLimit, kToCoroutine, Coroutine::stack_limit_offset());
8674-
__ StoreToOffset(kToStackLimit, THR, Thread::stack_limit_offset());
8620+
__ LoadFieldFromOffset(kToStackLimit, kToCoroutine, Coroutine::overflow_stack_limit_offset());
86758621
__ StoreToOffset(kToCoroutine, THR, Thread::coroutine_offset());
8622+
__ StoreToOffset(kToStackLimit, THR, Thread::saved_stack_limit_offset());
8623+
8624+
compiler::Label scheduled_interrupts;
8625+
__ LoadFromOffset(TMP, THR, Thread::stack_limit_offset());
8626+
__ testq(TMP, compiler::Immediate(Thread::kInterruptsMask));
8627+
__ BranchIf(ZERO, &scheduled_interrupts);
8628+
__ StoreToOffset(kToStackLimit, THR, Thread::stack_limit_offset());
8629+
__ Bind(&scheduled_interrupts);
86768630
}
86778631

86788632
Definition* SuspendInstr::Canonicalize(FlowGraph* flow_graph) {

runtime/vm/compiler/frontend/kernel_to_il.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,7 @@ bool FlowGraphBuilder::IsRecognizedMethodForFlowGraph(
11641164
case MethodRecognizer::kCoroutineInitialize:
11651165
case MethodRecognizer::kCoroutineTransfer:
11661166
case MethodRecognizer::kCoroutine_getCurrent:
1167+
case MethodRecognizer::kCoroutine_atIndex:
11671168
return true;
11681169
default:
11691170
return false;

runtime/vm/compiler/recognized_methods_list.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -381,9 +381,9 @@ namespace dart {
381381
V(::, _memCopy, MemCopy, 0x51939aa6) \
382382
V(::, debugger, Debugger, 0xf0aaff14) \
383383
V(::, _checkNotDeeplyImmutable, CheckNotDeeplyImmutable, 0x34e4da90) \
384-
V(_Coroutine, _initialize, CoroutineInitialize, 0xa75fb4b4) \
385-
V(_Coroutine, _transfer, CoroutineTransfer, 0x94684214) \
386-
V(_Coroutine, _fork, CoroutineFork, 0x9e657623) \
384+
V(_Coroutine, _initialize, CoroutineInitialize, 0xa75fbc36) \
385+
V(_Coroutine, _transfer, CoroutineTransfer, 0x94684996) \
386+
V(_Coroutine, _fork, CoroutineFork, 0x9e657da5) \
387387
V(_Coroutine, get:_name, Coroutine_getName,0x2b1f1c32) \
388388
V(_Coroutine, get:_index, Coroutine_getIndex, 0x683b41d2) \
389389
V(_Coroutine, get:_entry, Coroutine_getEntry, 0xc825e938) \
@@ -407,8 +407,8 @@ namespace dart {
407407
V(_Coroutine, set:_toProcessorNext, Coroutine_setToProcessorNext, 0xa59ec215)\
408408
V(_Coroutine, set:_toProcessorPrevious, Coroutine_setToProcessorPrevious, \
409409
0x9b4aa9a6) \
410-
V(_Coroutine, get:_current, Coroutine_getCurrent, 0xc845245c) \
411-
V(_Coroutine, _at, Coroutine_atIndex, 0x28baa8da) \
410+
V(_Coroutine, get:_current, Coroutine_getCurrent, 0xc8452bde) \
411+
V(_Coroutine, _at, Coroutine_atIndex, 0x28bab05c) \
412412

413413

414414
// List of intrinsics:

runtime/vm/compiler/runtime_api.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,8 +1045,6 @@ class Coroutine : public AllStatic {
10451045
static word caller_offset();
10461046
static word scheduler_offset();
10471047
static word processor_offset();
1048-
static word previous_offset();
1049-
static word next_offset();
10501048
static word to_state_offset();
10511049
static word to_processor_next_offset();
10521050
static word to_processor_previous_offset();
@@ -1055,6 +1053,7 @@ class Coroutine : public AllStatic {
10551053
static word stack_root_offset();
10561054
static word stack_base_offset();
10571055
static word stack_limit_offset();
1056+
static word overflow_stack_limit_offset();
10581057
static word InstanceSize();
10591058
FINAL_CLASS();
10601059
};
@@ -1281,6 +1280,7 @@ class Thread : public AllStatic {
12811280
static word auto_scope_native_wrapper_entry_point_offset();
12821281

12831282
static word coroutine_offset();
1283+
static word disabled_coroutine_offset();
12841284

12851285
#define THREAD_XMM_CONSTANT_LIST(V) \
12861286
V(float_not) \

0 commit comments

Comments
 (0)