Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(405)

Unified Diff: runtime/vm/kernel_binary_flowgraph.cc

Issue 2891053003: Add support for converted closures with explicit contexts to VM (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/kernel_binary_flowgraph.cc
diff --git a/runtime/vm/kernel_binary_flowgraph.cc b/runtime/vm/kernel_binary_flowgraph.cc
index 8e1b0e1986cb78d29e37c6e79389f57c9aa117d4..cfa7f3f0b0245a050b1d222864dd508f1e0d1e34 100644
--- a/runtime/vm/kernel_binary_flowgraph.cc
+++ b/runtime/vm/kernel_binary_flowgraph.cc
@@ -1227,6 +1227,16 @@ Fragment StreamingFlowGraphBuilder::BuildExpression(TokenPosition* position) {
return BuildBoolLiteral(false, position);
case kNullLiteral:
return BuildNullLiteral(position);
+ case kVectorCreation:
+ return BuildVectorCreation(position);
+ case kVectorGet:
+ return BuildVectorGet(position);
+ case kVectorSet:
+ return BuildVectorSet(position);
+ case kVectorCopy:
+ return BuildVectorCopy(position);
+ case kClosureCreation:
+ return BuildClosureCreation(position);
default:
UNREACHABLE();
}
@@ -1932,6 +1942,10 @@ Value* StreamingFlowGraphBuilder::stack() {
return flow_graph_builder_->stack_;
}
+void StreamingFlowGraphBuilder::Push(Definition* definition) {
+ flow_graph_builder_->Push(definition);
+}
+
Value* StreamingFlowGraphBuilder::Pop() {
return flow_graph_builder_->Pop();
}
@@ -2112,6 +2126,20 @@ Fragment StreamingFlowGraphBuilder::AllocateObject(const dart::Class& klass,
return flow_graph_builder_->AllocateObject(klass, argument_count);
}
+Fragment StreamingFlowGraphBuilder::AllocateObject(
+ const dart::Class& klass,
+ const Function& closure_function) {
+ return flow_graph_builder_->AllocateObject(klass, closure_function);
+}
+
+Fragment StreamingFlowGraphBuilder::AllocateContext(int size) {
+ return flow_graph_builder_->AllocateContext(size);
+}
+
+Fragment StreamingFlowGraphBuilder::LoadField(intptr_t offset) {
+ return flow_graph_builder_->LoadField(offset);
+}
+
Fragment StreamingFlowGraphBuilder::InstanceCall(TokenPosition position,
const dart::String& name,
Token::Kind kind,
@@ -2132,6 +2160,11 @@ Fragment StreamingFlowGraphBuilder::StoreStaticField(TokenPosition position,
return flow_graph_builder_->StoreStaticField(position, field);
}
+Fragment StreamingFlowGraphBuilder::StoreInstanceField(TokenPosition position,
+ intptr_t offset) {
+ return flow_graph_builder_->StoreInstanceField(position, offset);
+}
+
Fragment StreamingFlowGraphBuilder::StringInterpolate(TokenPosition position) {
return flow_graph_builder_->StringInterpolate(position);
}
@@ -3045,9 +3078,10 @@ Fragment StreamingFlowGraphBuilder::BuildIsExpression(TokenPosition* p) {
if (dart::FlowGraphBuilder::SimpleInstanceOfType(type)) {
instructions += Constant(type);
instructions += PushArgument(); // Type.
- instructions += InstanceCall(position, dart::Library::PrivateCoreLibName(
- Symbols::_simpleInstanceOf()),
- Token::kIS, 2, 2); // 2 checked arguments.
+ instructions += InstanceCall(
+ position,
+ dart::Library::PrivateCoreLibName(Symbols::_simpleInstanceOf()),
+ Token::kIS, 2, 2); // 2 checked arguments.
return instructions;
}
@@ -3372,6 +3406,91 @@ Fragment StreamingFlowGraphBuilder::BuildNullLiteral(TokenPosition* position) {
return Constant(Instance::ZoneHandle(Z, Instance::null()));
}
+Fragment StreamingFlowGraphBuilder::BuildVectorCreation(
+ TokenPosition* position) {
+ if (position != NULL) *position = TokenPosition::kNoSource;
+
+ intptr_t size = ReadUInt(); // read size.
+ return AllocateContext(size);
+}
+
+Fragment StreamingFlowGraphBuilder::BuildVectorGet(TokenPosition* position) {
+ if (position != NULL) *position = TokenPosition::kNoSource;
+
+ Fragment instructions = BuildExpression(); // read expression.
+ intptr_t index = ReadUInt(); // read index.
+ instructions += LoadField(Context::variable_offset(index));
+ return instructions;
+}
+
+Fragment StreamingFlowGraphBuilder::BuildVectorSet(TokenPosition* position) {
+ if (position != NULL) *position = TokenPosition::kNoSource;
+
+ Fragment instructions = BuildExpression(); // read vector expression.
+ intptr_t index = ReadUInt(); // read index.
+ instructions += BuildExpressionStatement(); // read value expression.
jensj 2017/05/18 11:19:05 Shouldn't this just be BuildExpression();?
Dmitry Stefantsov 2017/05/18 12:18:53 Yes, of course. Thanks! Fixed.
+
+ // The assigned value is the result of the expression.
+ LocalVariable* result = MakeTemporary();
+
+ Value* value = Pop();
+ StoreInstanceFieldInstr* store = new (Z)
+ StoreInstanceFieldInstr(Context::variable_offset(index), Pop(), value,
+ kNoStoreBarrier, TokenPosition::kNoSource);
+ instructions <<= store;
+
+ // Load the result that is stored in the temporary variable.
+ instructions += LoadLocal(result);
+
+ return instructions;
+}
+
+Fragment StreamingFlowGraphBuilder::BuildVectorCopy(TokenPosition* position) {
+ if (position != NULL) *position = TokenPosition::kNoSource;
+
+ Fragment instructions = BuildExpression(); // read vector expression.
+ CloneContextInstr* clone_instruction =
+ new (Z) CloneContextInstr(TokenPosition::kNoSource, Pop());
+ instructions <<= clone_instruction;
+ Push(clone_instruction);
+
+ return instructions;
+}
+
+Fragment StreamingFlowGraphBuilder::BuildClosureCreation(
+ TokenPosition* position) {
+ if (position != NULL) *position = TokenPosition::kNoSource;
+
+ NameIndex function_reference =
+ ReadCanonicalNameReference(); // read function reference.
+ Function& function = Function::ZoneHandle(
+ Z, H.LookupStaticMethodByKernelProcedure(function_reference));
+ function = function.ConvertedClosureFunction();
+ ASSERT(!function.IsNull());
+
+ const dart::Class& closure_class =
+ dart::Class::ZoneHandle(Z, I->object_store()->closure_class());
+ Fragment instructions = AllocateObject(closure_class, function);
+ LocalVariable* closure = MakeTemporary();
+
+ instructions += BuildExpression(); // read vector expression.
jensj 2017/05/18 11:19:06 from the kernel_binary.cc file I would guess the c
Dmitry Stefantsov 2017/05/18 12:18:52 Yep. Thanks!
+ LocalVariable* context = MakeTemporary();
+
+ instructions += LoadLocal(closure);
+ instructions += Constant(function);
+ instructions +=
+ StoreInstanceField(TokenPosition::kNoSource, Closure::function_offset());
+
+ instructions += LoadLocal(closure);
+ instructions += LoadLocal(context);
+ instructions +=
+ StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset());
+
+ instructions += Drop();
+
+ return instructions;
jensj 2017/05/18 11:19:06 Isn't there a SkipDartType or something missing?
Dmitry Stefantsov 2017/05/18 12:18:52 Yes. I should have put an invocation of SkipDartTy
+}
+
Fragment StreamingFlowGraphBuilder::BuildInvalidStatement() {
H.ReportError("Invalid statements not implemented yet!");
return Fragment();

Powered by Google App Engine
This is Rietveld 408576698