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

Unified Diff: runtime/vm/kernel_binary_flowgraph.h

Issue 2854393002: [kernel] [partial] Streaming of kernel binary without AST nodes (Closed)
Patch Set: Address comments; small fixes; rebased. 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
« no previous file with comments | « runtime/vm/kernel_binary.cc ('k') | runtime/vm/kernel_binary_flowgraph.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/kernel_binary_flowgraph.h
diff --git a/runtime/vm/kernel_binary_flowgraph.h b/runtime/vm/kernel_binary_flowgraph.h
index 124987afdf1607f448d698e61407083c110f3db1..3e741db6a38e91504abca280eeca4794f12c1e6b 100644
--- a/runtime/vm/kernel_binary_flowgraph.h
+++ b/runtime/vm/kernel_binary_flowgraph.h
@@ -17,27 +17,132 @@
namespace dart {
namespace kernel {
+class StreamingDartTypeTranslator {
+ public:
+ StreamingDartTypeTranslator(StreamingFlowGraphBuilder* builder,
+ bool finalize = false);
+
+ // Can return a malformed type.
+ AbstractType& BuildType();
+ // Will return `TypeArguments::null()` in case any of the arguments are
+ // malformed.
+ const TypeArguments& BuildTypeArguments(intptr_t length);
+
+ // Will return `TypeArguments::null()` in case any of the arguments are
+ // malformed.
+ const TypeArguments& BuildInstantiatedTypeArguments(
+ const dart::Class& receiver_class,
+ intptr_t length);
+
+ const Type& ReceiverType(const dart::Class& klass);
+
+ private:
+ // Can build a malformed type.
+ void BuildTypeInternal();
+ void BuildInterfaceType(bool simple);
+ void BuildFunctionType(bool simple);
+ void BuildTypeParameterType();
+
+ class TypeParameterScope {
+ public:
+ TypeParameterScope(StreamingDartTypeTranslator* translator,
+ intptr_t* parameters,
+ intptr_t parameters_count)
+ : parameters_(parameters),
+ parameters_count_(parameters_count),
+ outer_(translator->type_parameter_scope_),
+ translator_(translator) {
+ translator_->type_parameter_scope_ = this;
+ }
+ ~TypeParameterScope() {
+ delete[] parameters_;
+ translator_->type_parameter_scope_ = outer_;
+ }
+
+ TypeParameterScope* outer() const { return outer_; }
+ intptr_t* parameters() const { return parameters_; }
+ intptr_t parameters_count() const { return parameters_count_; }
+
+ private:
+ intptr_t* parameters_;
+ intptr_t parameters_count_;
+ TypeParameterScope* outer_;
+ StreamingDartTypeTranslator* translator_;
+ };
+
+ StreamingFlowGraphBuilder* builder_;
+ TranslationHelper& translation_helper_;
+ ActiveClass* active_class_;
+ TypeParameterScope* type_parameter_scope_;
+ Zone* zone_;
+ AbstractType& result_;
+ bool finalize_;
+};
+
+
class StreamingConstantEvaluator {
public:
- StreamingConstantEvaluator(StreamingFlowGraphBuilder* builder,
- Zone* zone,
- TranslationHelper* h,
- DartTypeTranslator* type_translator);
+ explicit StreamingConstantEvaluator(StreamingFlowGraphBuilder* builder);
virtual ~StreamingConstantEvaluator() {}
- Instance& EvaluateExpression();
+ Instance& EvaluateExpression(intptr_t offset, bool reset_position = true);
+ Instance& EvaluateListLiteral(intptr_t offset, bool reset_position = true);
+ Instance& EvaluateMapLiteral(intptr_t offset, bool reset_position = true);
+ Instance& EvaluateConstructorInvocation(intptr_t offset,
+ bool reset_position = true);
+ Object& EvaluateExpressionSafe(intptr_t offset);
+ private:
+ void EvaluateVariableGet();
+ void EvaluateVariableGet(uint8_t payload);
+ void EvaluatePropertyGet();
void EvaluateStaticGet();
+ void EvaluateMethodInvocation();
+ void EvaluateStaticInvocation();
+ void EvaluateConstructorInvocationInternal();
+ void EvaluateNot();
+ void EvaluateLogicalExpression();
+ void EvaluateConditionalExpression();
+ void EvaluateStringConcatenation();
void EvaluateSymbolLiteral();
+ void EvaluateTypeLiteral();
+ void EvaluateListLiteralInternal();
+ void EvaluateMapLiteralInternal();
+ void EvaluateLet();
+ void EvaluateBigIntLiteral();
+ void EvaluateStringLiteral();
+ void EvaluateIntLiteral(uint8_t payload);
+ void EvaluateIntLiteral(bool is_negative);
void EvaluateDoubleLiteral();
+ void EvaluateBoolLiteral(bool value);
+ void EvaluateNullLiteral();
+
+ const Object& RunFunction(const Function& function,
+ intptr_t argument_count,
+ const Instance* receiver,
+ const TypeArguments* type_args);
+
+ const Object& RunFunction(const Function& function,
+ const Array& arguments,
+ const Array& names);
- private:
RawObject* EvaluateConstConstructorCall(const dart::Class& type_class,
const TypeArguments& type_arguments,
const Function& constructor,
const Object& argument);
+ const TypeArguments* TranslateTypeArguments(const Function& target,
+ dart::Class* target_klass);
+
+ void AssertBoolInCheckedMode() {
+ if (isolate_->type_checks() && !result_.IsBool()) {
+ translation_helper_.ReportError("Expected boolean expression.");
+ }
+ }
+
+ bool EvaluateBooleanExpressionHere();
+
bool GetCachedConstant(intptr_t kernel_offset, Instance* value);
void CacheConstantValue(intptr_t kernel_offset, const Instance& value);
@@ -45,7 +150,7 @@ class StreamingConstantEvaluator {
Isolate* isolate_;
Zone* zone_;
TranslationHelper& translation_helper_;
- // DartTypeTranslator& type_translator_;
+ StreamingDartTypeTranslator& type_translator_;
Script& script_;
Instance& result_;
@@ -61,32 +166,91 @@ class StreamingFlowGraphBuilder {
translation_helper_(flow_graph_builder->translation_helper_),
zone_(flow_graph_builder->zone_),
reader_(new Reader(buffer, buffer_length)),
- constant_evaluator_(this,
- flow_graph_builder->zone_,
- &flow_graph_builder->translation_helper_,
- &flow_graph_builder->type_translator_) {}
-
- virtual ~StreamingFlowGraphBuilder() {}
+ constant_evaluator_(this),
+ type_translator_(this, /* finalize= */ true) {}
- Fragment BuildAt(intptr_t kernel_offset);
+ Fragment BuildExpressionAt(intptr_t kernel_offset);
+ Fragment BuildStatementAt(intptr_t kernel_offset);
private:
+ Fragment BuildExpression(TokenPosition* position = NULL);
+ Fragment BuildStatement();
+
intptr_t ReaderOffset();
void SetOffset(intptr_t offset);
void SkipBytes(intptr_t skip);
+ bool ReadBool();
+ uint8_t ReadByte();
uint32_t ReadUInt();
+ uint32_t PeekUInt();
intptr_t ReadListLength();
+ StringIndex ReadStringReference();
NameIndex ReadCanonicalNameReference();
+ StringIndex ReadNameAsStringIndex();
+ const dart::String& ReadNameAsMethodName();
+ const dart::String& ReadNameAsGetterName();
+ const dart::String& ReadNameAsSetterName();
+ void SkipStringReference();
+ void SkipCanonicalNameReference();
+ void SkipDartType();
+ void SkipOptionalDartType();
+ void SkipInterfaceType(bool simple);
+ void SkipFunctionType(bool simple);
+ void SkipExpression();
+ void SkipStatement();
+ void SkipName();
+ void SkipArguments();
+ void SkipVariableDeclaration();
TokenPosition ReadPosition(bool record = true);
Tag ReadTag(uint8_t* payload = NULL);
+ Tag PeekTag(uint8_t* payload = NULL);
+ word ReadFlags();
+ void loop_depth_inc();
+ void loop_depth_dec();
+ intptr_t for_in_depth();
+ void for_in_depth_inc();
+ void for_in_depth_dec();
+ void catch_depth_inc();
+ void catch_depth_dec();
+ void try_depth_inc();
+ void try_depth_dec();
+ intptr_t CurrentTryIndex();
+ intptr_t AllocateTryIndex();
+ LocalVariable* CurrentException();
+ LocalVariable* CurrentStackTrace();
CatchBlock* catch_block();
+ ActiveClass* active_class();
ScopeBuildingResult* scopes();
ParsedFunction* parsed_function();
+ TryFinallyBlock* try_finally_block();
+ SwitchBlock* switch_block();
+ BreakableBlock* breakable_block();
+ GrowableArray<YieldContinuation>& yield_continuations();
+ Value* stack();
+ Value* Pop();
+
+ Tag PeekArgumentsFirstPositionalTag();
+ const TypeArguments& PeekArgumentsInstantiatedType(const dart::Class& klass);
+ intptr_t PeekArgumentsCount();
+ intptr_t PeekArgumentsTypeCount();
+ void SkipArgumentsBeforeActualArguments();
+
+ LocalVariable* LookupVariable(intptr_t kernel_offset);
+ LocalVariable* MakeTemporary();
+ Token::Kind MethodKind(const dart::String& name);
+ dart::RawFunction* LookupMethodByMember(NameIndex target,
+ const dart::String& method_name);
+
+ bool NeedsDebugStepCheck(const Function& function, TokenPosition position);
+ bool NeedsDebugStepCheck(Value* value, TokenPosition position);
+ void InlineBailout(const char* reason);
Fragment DebugStepCheck(TokenPosition position);
Fragment LoadLocal(LocalVariable* variable);
+ Fragment Return(TokenPosition position);
Fragment PushArgument();
+ Fragment EvaluateAssertion();
Fragment RethrowException(TokenPosition position, int catch_try_index);
Fragment ThrowNoSuchMethodError();
Fragment Constant(const Object& value);
@@ -95,27 +259,145 @@ class StreamingFlowGraphBuilder {
Fragment StaticCall(TokenPosition position,
const Function& target,
intptr_t argument_count);
+ Fragment StaticCall(TokenPosition position,
+ const Function& target,
+ intptr_t argument_count,
+ const Array& argument_names);
+ Fragment InstanceCall(TokenPosition position,
+ const dart::String& name,
+ Token::Kind kind,
+ intptr_t argument_count,
+ intptr_t num_args_checked = 1);
+ Fragment InstanceCall(TokenPosition position,
+ const dart::String& name,
+ Token::Kind kind,
+ intptr_t argument_count,
+ const Array& argument_names,
+ intptr_t num_args_checked);
+ Fragment ThrowException(TokenPosition position);
+ Fragment BooleanNegate();
+ Fragment TranslateInstantiatedTypeArguments(
+ const TypeArguments& type_arguments);
+ Fragment StrictCompare(Token::Kind kind, bool number_check = false);
+ Fragment AllocateObject(const dart::Class& klass, intptr_t argument_count);
+ Fragment StoreLocal(TokenPosition position, LocalVariable* variable);
+ Fragment StoreStaticField(TokenPosition position, const dart::Field& field);
+ Fragment StringInterpolate(TokenPosition position);
+ Fragment StringInterpolateSingle(TokenPosition position);
+ Fragment ThrowTypeError();
+ Fragment LoadInstantiatorTypeArguments();
+ Fragment LoadFunctionTypeArguments();
+ Fragment InstantiateType(const AbstractType& type);
+ Fragment CreateArray();
+ Fragment StoreIndexed(intptr_t class_id);
+ Fragment CheckStackOverflow();
+ Fragment CloneContext();
+ Fragment TranslateFinallyFinalizers(TryFinallyBlock* outer_finally,
+ intptr_t target_context_depth);
+ Fragment BranchIfTrue(TargetEntryInstr** then_entry,
+ TargetEntryInstr** otherwise_entry,
+ bool negate);
+ Fragment BranchIfEqual(TargetEntryInstr** then_entry,
+ TargetEntryInstr** otherwise_entry,
+ bool negate);
+ Fragment BranchIfNull(TargetEntryInstr** then_entry,
+ TargetEntryInstr** otherwise_entry,
+ bool negate = false);
+ Fragment CatchBlockEntry(const Array& handler_types,
+ intptr_t handler_index,
+ bool needs_stacktrace);
+ Fragment TryCatch(int try_handler_index);
+ Fragment Drop();
+ Fragment NullConstant();
+ JoinEntryInstr* BuildJoinEntry();
+ JoinEntryInstr* BuildJoinEntry(intptr_t try_index);
+ Fragment Goto(JoinEntryInstr* destination);
+ Fragment BuildImplicitClosureCreation(const Function& target);
+ Fragment CheckBooleanInCheckedMode();
+ Fragment CheckAssignableInCheckedMode(const dart::AbstractType& dst_type,
+ const dart::String& dst_name);
+ Fragment CheckVariableTypeInCheckedMode(intptr_t variable_kernel_position);
+ Fragment CheckVariableTypeInCheckedMode(const AbstractType& dst_type,
+ const dart::String& name_symbol);
+ Fragment EnterScope(intptr_t kernel_offset, bool* new_context = NULL);
+ Fragment ExitScope(intptr_t kernel_offset);
+
+ Fragment TranslateCondition(bool* negate);
+ const TypeArguments& BuildTypeArguments();
+ Fragment BuildArguments(Array* argument_names,
+ intptr_t* argument_count,
+ bool skip_push_arguments = false,
+ bool do_drop = false);
+ Fragment BuildArgumentsFromActualArguments(Array* argument_names,
+ bool skip_push_arguments = false,
+ bool do_drop = false);
+
+ Fragment BuildInvalidExpression(TokenPosition* position);
+ Fragment BuildVariableGet(TokenPosition* position);
+ Fragment BuildVariableGet(uint8_t payload, TokenPosition* position);
+ Fragment BuildVariableSet(TokenPosition* position);
+ Fragment BuildVariableSet(uint8_t payload, TokenPosition* position);
+ Fragment BuildPropertyGet(TokenPosition* position);
+ Fragment BuildPropertySet(TokenPosition* position);
+ Fragment BuildDirectPropertyGet(TokenPosition* position);
+ Fragment BuildDirectPropertySet(TokenPosition* position);
+ Fragment BuildStaticGet(TokenPosition* position);
+ Fragment BuildStaticSet(TokenPosition* position);
+ Fragment BuildMethodInvocation(TokenPosition* position);
+ Fragment BuildDirectMethodInvocation(TokenPosition* position);
+ Fragment BuildStaticInvocation(bool is_const, TokenPosition* position);
+ Fragment BuildConstructorInvocation(bool is_const, TokenPosition* position);
+ Fragment BuildNot(TokenPosition* position);
+ Fragment BuildLogicalExpression(TokenPosition* position);
+ Fragment BuildConditionalExpression(TokenPosition* position);
+ Fragment BuildStringConcatenation(TokenPosition* position);
+ Fragment BuildIsExpression(TokenPosition* position);
+ Fragment BuildAsExpression(TokenPosition* position);
+ Fragment BuildSymbolLiteral(TokenPosition* position);
+ Fragment BuildTypeLiteral(TokenPosition* position);
+ Fragment BuildThisExpression(TokenPosition* position);
+ Fragment BuildRethrow(TokenPosition* position);
+ Fragment BuildThrow(TokenPosition* position);
+ Fragment BuildListLiteral(bool is_const, TokenPosition* position);
+ Fragment BuildMapLiteral(bool is_const, TokenPosition* position);
+ Fragment BuildLet(TokenPosition* position);
+ Fragment BuildBigIntLiteral(TokenPosition* position);
+ Fragment BuildStringLiteral(TokenPosition* position);
+ Fragment BuildIntLiteral(uint8_t payload, TokenPosition* position);
+ Fragment BuildIntLiteral(bool is_negative, TokenPosition* position);
+ Fragment BuildDoubleLiteral(TokenPosition* position);
+ Fragment BuildBoolLiteral(bool value, TokenPosition* position);
+ Fragment BuildNullLiteral(TokenPosition* position);
- Fragment BuildInvalidExpression();
- Fragment BuildStaticGet();
- Fragment BuildSymbolLiteral();
- Fragment BuildThisExpression();
- Fragment BuildRethrow();
- Fragment BuildBigIntLiteral();
- Fragment BuildStringLiteral();
- Fragment BuildIntLiteral(uint8_t payload);
- Fragment BuildIntLiteral(bool is_negative);
- Fragment BuildDoubleLiteral();
- Fragment BuildBoolLiteral(bool value);
- Fragment BuildNullLiteral();
+ Fragment BuildInvalidStatement();
+ Fragment BuildExpressionStatement();
+ Fragment BuildBlock();
+ Fragment BuildEmptyStatement();
+ Fragment BuildAssertStatement();
+ Fragment BuildLabeledStatement();
+ Fragment BuildBreakStatement();
+ Fragment BuildWhileStatement();
+ Fragment BuildDoStatement();
+ Fragment BuildForStatement();
+ Fragment BuildForInStatement(bool async);
+ Fragment BuildSwitchStatement();
+ Fragment BuildContinueSwitchStatement();
+ Fragment BuildIfStatement();
+ Fragment BuildReturnStatement();
+ Fragment BuildTryCatch();
+ Fragment BuildTryFinally();
+ Fragment BuildYieldStatement();
+ Fragment BuildVariableDeclaration(bool has_tag);
FlowGraphBuilder* flow_graph_builder_;
TranslationHelper& translation_helper_;
Zone* zone_;
Reader* reader_;
StreamingConstantEvaluator constant_evaluator_;
+ StreamingDartTypeTranslator type_translator_;
friend class StreamingConstantEvaluator;
+ friend class StreamingDartTypeTranslator;
};
« no previous file with comments | « runtime/vm/kernel_binary.cc ('k') | runtime/vm/kernel_binary_flowgraph.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698