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

Unified Diff: runtime/vm/kernel_to_il.cc

Issue 2632253002: VM: [Kernel] Partial support for metadata annotations (Closed)
Patch Set: Address comments Created 3 years, 11 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_to_il.h ('k') | runtime/vm/object.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/kernel_to_il.cc
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
index 312f85c88d437928e7e1f9f2f755e6d60a668176..6879a0b2b0b9dce0d6d3159c4d470659d9cac8bc 100644
--- a/runtime/vm/kernel_to_il.cc
+++ b/runtime/vm/kernel_to_il.cc
@@ -1319,10 +1319,11 @@ ConstantEvaluator::ConstantEvaluator(FlowGraphBuilder* builder,
zone_(zone),
translation_helper_(*h),
type_translator_(*type_translator),
- script_(dart::Script::Handle(
+ script_(Script::Handle(
zone,
- builder_->parsed_function_->function().script())),
- result_(dart::Instance::Handle(zone)) {}
+ builder == NULL ? Script::null()
+ : builder_->parsed_function_->function().script())),
+ result_(Instance::Handle(zone)) {}
Instance& ConstantEvaluator::EvaluateExpression(Expression* expression) {
@@ -1468,6 +1469,8 @@ RawObject* ConstantEvaluator::EvaluateConstConstructorCall(
bool ConstantEvaluator::GetCachedConstant(TreeNode* node, Instance* value) {
+ if (builder_ == NULL) return false;
+
const Function& function = builder_->parsed_function_->function();
if (function.kind() == RawFunction::kImplicitStaticFinalGetter) {
// Don't cache constants in initializer expressions. They get
@@ -1497,6 +1500,8 @@ void ConstantEvaluator::CacheConstantValue(TreeNode* node,
const Instance& value) {
ASSERT(Thread::Current()->IsMutatorThread());
+ if (builder_ == NULL) return;
+
const Function& function = builder_->parsed_function_->function();
if (function.kind() == RawFunction::kImplicitStaticFinalGetter) {
// Don't cache constants in initializer expressions. They get
@@ -5921,6 +5926,116 @@ Fragment FlowGraphBuilder::TranslateFunctionNode(FunctionNode* node,
}
+RawObject* EvaluateMetadata(TreeNode* kernel_node) {
+ LongJumpScope jump;
+ if (setjmp(*jump.Set()) == 0) {
+ Thread* thread = Thread::Current();
+ Zone* zone_ = thread->zone();
+
+ List<Expression>* metadata_expressions = NULL;
+ if (kernel_node->IsClass()) {
+ metadata_expressions = &Class::Cast(kernel_node)->annotations();
+ } else if (kernel_node->IsProcedure()) {
+ metadata_expressions = &Procedure::Cast(kernel_node)->annotations();
+ } else if (kernel_node->IsField()) {
+ metadata_expressions = &Field::Cast(kernel_node)->annotations();
+ } else if (kernel_node->IsConstructor()) {
+ metadata_expressions = &Constructor::Cast(kernel_node)->annotations();
+ } else {
+ FATAL1("No support for metadata on this type of kernel node %p\n",
+ kernel_node);
+ }
+
+ TranslationHelper translation_helper(thread);
+ DartTypeTranslator type_translator(&translation_helper, NULL, true);
+ ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z,
+ &translation_helper, &type_translator);
+
+ const Array& metadata_values =
+ Array::Handle(Z, Array::New(metadata_expressions->length()));
+
+ for (intptr_t i = 0; i < metadata_expressions->length(); i++) {
+ const Instance& value =
+ constant_evaluator.EvaluateExpression((*metadata_expressions)[i]);
+ metadata_values.SetAt(i, value);
+ }
+
+ return metadata_values.raw();
+ } else {
+ Thread* thread = Thread::Current();
+ Error& error = Error::Handle();
+ error = thread->sticky_error();
+ thread->clear_sticky_error();
+ return error.raw();
+ }
+}
+
+
+RawObject* BuildParameterDescriptor(TreeNode* kernel_node) {
+ LongJumpScope jump;
+ if (setjmp(*jump.Set()) == 0) {
+ FunctionNode* function_node = NULL;
+
+ if (kernel_node->IsProcedure()) {
+ function_node = Procedure::Cast(kernel_node)->function();
+ } else if (kernel_node->IsConstructor()) {
+ function_node = Constructor::Cast(kernel_node)->function();
+ } else if (kernel_node->IsFunctionNode()) {
+ function_node = FunctionNode::Cast(kernel_node);
+ } else {
+ UNIMPLEMENTED();
+ return NULL;
+ }
+
+ Thread* thread = Thread::Current();
+ Zone* zone_ = thread->zone();
+ TranslationHelper translation_helper(thread);
+ DartTypeTranslator type_translator(&translation_helper, NULL, true);
+ ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z,
+ &translation_helper, &type_translator);
+
+
+ intptr_t param_count = function_node->positional_parameters().length() +
+ function_node->named_parameters().length();
+ const Array& param_descriptor = Array::Handle(
+ Array::New(param_count * Parser::kParameterEntrySize, Heap::kOld));
+ for (intptr_t i = 0; i < param_count; ++i) {
+ VariableDeclaration* variable;
+ if (i < function_node->positional_parameters().length()) {
+ variable = function_node->positional_parameters()[i];
+ } else {
+ variable = function_node->named_parameters()[i];
+ }
+
+ param_descriptor.SetAt(
+ i + Parser::kParameterIsFinalOffset,
+ variable->IsFinal() ? Bool::True() : Bool::False());
+
+ if (variable->initializer() != NULL) {
+ param_descriptor.SetAt(
+ i + Parser::kParameterDefaultValueOffset,
+ constant_evaluator.EvaluateExpression(variable->initializer()));
+ } else {
+ param_descriptor.SetAt(i + Parser::kParameterDefaultValueOffset,
+ Object::null_instance());
+ }
+
+ param_descriptor.SetAt(i + Parser::kParameterMetadataOffset,
+ /* Issue(28434): Missing parameter metadata. */
+ Object::null_instance());
+ }
+ return param_descriptor.raw();
+ } else {
+ Thread* thread = Thread::Current();
+ Error& error = Error::Handle();
+ error = thread->sticky_error();
+ thread->clear_sticky_error();
+ return error.raw();
+ }
+}
+
+
} // namespace kernel
} // namespace dart
+
#endif // !defined(DART_PRECOMPILED_RUNTIME)
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | runtime/vm/object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698