| Index: runtime/vm/kernel_to_il.cc
|
| diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
|
| index f9f4e351199ec32af0e7bd1cf192853ce4f1f337..acc6d3b08a9fa3e3b2ae766152e7e078a8778d7c 100644
|
| --- a/runtime/vm/kernel_to_il.cc
|
| +++ b/runtime/vm/kernel_to_il.cc
|
| @@ -442,6 +442,13 @@ const dart::String& TranslationHelper::DartFieldName(Name* kernel_name) {
|
| }
|
|
|
|
|
| +const dart::String& TranslationHelper::DartFieldName(NameIndex parent,
|
| + StringIndex field) {
|
| + dart::String& name = DartString(field);
|
| + return ManglePrivateName(parent, &name);
|
| +}
|
| +
|
| +
|
| const dart::String& TranslationHelper::DartInitializerName(Name* kernel_name) {
|
| // The [DartFieldName] will take care of mangling the name.
|
| dart::String& name =
|
| @@ -685,9 +692,6 @@ FlowGraphBuilder::FlowGraphBuilder(
|
| try_catch_block_(NULL),
|
| next_used_try_index_(0),
|
| catch_block_(NULL),
|
| - type_translator_(&translation_helper_,
|
| - &active_class_,
|
| - /* finalize= */ true),
|
| streaming_flow_graph_builder_(NULL) {
|
| Script& script = Script::Handle(Z, parsed_function->function().script());
|
| H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets()));
|
| @@ -737,16 +741,11 @@ Fragment FlowGraphBuilder::TranslateFinallyFinalizers(
|
| instructions = Fragment(instructions.entry, entry);
|
| }
|
|
|
| - Statement* finalizer = try_finally_block_->finalizer();
|
| intptr_t finalizer_kernel_offset =
|
| try_finally_block_->finalizer_kernel_offset();
|
| try_finally_block_ = try_finally_block_->outer();
|
| - if (finalizer != NULL) {
|
| - UNREACHABLE();
|
| - } else {
|
| - instructions += streaming_flow_graph_builder_->BuildStatementAt(
|
| - finalizer_kernel_offset);
|
| - }
|
| + instructions += streaming_flow_graph_builder_->BuildStatementAt(
|
| + finalizer_kernel_offset);
|
|
|
| // We only need to make sure that if the finalizer ended normally, we
|
| // continue towards the next outer try-finally.
|
| @@ -2381,313 +2380,6 @@ ArgumentArray FlowGraphBuilder::GetArguments(int count) {
|
| }
|
|
|
|
|
| -#define STREAM_EXPRESSION_IF_POSSIBLE(node) \
|
| - if (node->can_stream()) { \
|
| - fragment_ = streaming_flow_graph_builder_->BuildExpressionAt( \
|
| - node->kernel_offset()); \
|
| - return; \
|
| - }
|
| -
|
| -
|
| -AbstractType& DartTypeTranslator::TranslateType(DartType* node) {
|
| - node->AcceptDartTypeVisitor(this);
|
| -
|
| - // We return a new `ZoneHandle` here on purpose: The intermediate language
|
| - // instructions do not make a copy of the handle, so we do it.
|
| - return AbstractType::ZoneHandle(Z, result_.raw());
|
| -}
|
| -
|
| -
|
| -AbstractType& DartTypeTranslator::TranslateTypeWithoutFinalization(
|
| - DartType* node) {
|
| - bool saved_finalize = finalize_;
|
| - finalize_ = false;
|
| - AbstractType& result = TranslateType(node);
|
| - finalize_ = saved_finalize;
|
| - return result;
|
| -}
|
| -
|
| -
|
| -const AbstractType& DartTypeTranslator::TranslateVariableType(
|
| - VariableDeclaration* variable) {
|
| - AbstractType& abstract_type = TranslateType(variable->type());
|
| -
|
| - // We return a new `ZoneHandle` here on purpose: The intermediate language
|
| - // instructions do not make a copy of the handle, so we do it.
|
| - AbstractType& type = Type::ZoneHandle(Z);
|
| -
|
| - if (abstract_type.IsMalformed()) {
|
| - type = AbstractType::dynamic_type().raw();
|
| - } else {
|
| - type = result_.raw();
|
| - }
|
| -
|
| - return type;
|
| -}
|
| -
|
| -
|
| -void DartTypeTranslator::VisitInvalidType(InvalidType* node) {
|
| - result_ = ClassFinalizer::NewFinalizedMalformedType(
|
| - Error::Handle(Z), // No previous error.
|
| - Script::Handle(Z, Script::null()), TokenPosition::kNoSource,
|
| - "[InvalidType] in Kernel IR.");
|
| -}
|
| -
|
| -
|
| -void DartTypeTranslator::VisitFunctionType(FunctionType* node) {
|
| - // The spec describes in section "19.1 Static Types":
|
| - //
|
| - // Any use of a malformed type gives rise to a static warning. A
|
| - // malformed type is then interpreted as dynamic by the static type
|
| - // checker and the runtime unless explicitly specified otherwise.
|
| - //
|
| - // So we convert malformed return/parameter types to `dynamic`.
|
| - TypeParameterScope scope(this, &node->type_parameters());
|
| -
|
| - Function& signature_function = Function::ZoneHandle(
|
| - Z, Function::NewSignatureFunction(*active_class_->klass,
|
| - TokenPosition::kNoSource));
|
| -
|
| - node->return_type()->AcceptDartTypeVisitor(this);
|
| - if (result_.IsMalformed()) {
|
| - result_ = AbstractType::dynamic_type().raw();
|
| - }
|
| - signature_function.set_result_type(result_);
|
| -
|
| - const intptr_t positional_count = node->positional_parameters().length();
|
| - const intptr_t named_count = node->named_parameters().length();
|
| - const intptr_t all_count = positional_count + named_count;
|
| - const intptr_t required_count = node->required_parameter_count();
|
| -
|
| - // The additional first parameter is the receiver type (set to dynamic).
|
| - signature_function.set_num_fixed_parameters(1 + required_count);
|
| - signature_function.SetNumOptionalParameters(
|
| - all_count - required_count, positional_count > required_count);
|
| -
|
| - const Array& parameter_types =
|
| - Array::Handle(Z, Array::New(1 + all_count, Heap::kOld));
|
| - signature_function.set_parameter_types(parameter_types);
|
| - const Array& parameter_names =
|
| - Array::Handle(Z, Array::New(1 + all_count, Heap::kOld));
|
| - signature_function.set_parameter_names(parameter_names);
|
| -
|
| - intptr_t pos = 0;
|
| - parameter_types.SetAt(pos, AbstractType::dynamic_type());
|
| - parameter_names.SetAt(pos, H.DartSymbol("_receiver_"));
|
| - pos++;
|
| - for (intptr_t i = 0; i < positional_count; i++, pos++) {
|
| - node->positional_parameters()[i]->AcceptDartTypeVisitor(this);
|
| - if (result_.IsMalformed()) {
|
| - result_ = AbstractType::dynamic_type().raw();
|
| - }
|
| - parameter_types.SetAt(pos, result_);
|
| - parameter_names.SetAt(pos, H.DartSymbol("noname"));
|
| - }
|
| - for (intptr_t i = 0; i < named_count; i++, pos++) {
|
| - NamedParameter* parameter = node->named_parameters()[i];
|
| - parameter->type()->AcceptDartTypeVisitor(this);
|
| - if (result_.IsMalformed()) {
|
| - result_ = AbstractType::dynamic_type().raw();
|
| - }
|
| - parameter_types.SetAt(pos, result_);
|
| - parameter_names.SetAt(pos, H.DartSymbol(parameter->name()));
|
| - }
|
| -
|
| - Type& signature_type =
|
| - Type::ZoneHandle(Z, signature_function.SignatureType());
|
| -
|
| - if (finalize_) {
|
| - signature_type ^=
|
| - ClassFinalizer::FinalizeType(*active_class_->klass, signature_type);
|
| - // Do not refer to signature_function anymore, since it may have been
|
| - // replaced during canonicalization.
|
| - signature_function = Function::null();
|
| - }
|
| -
|
| - result_ = signature_type.raw();
|
| -}
|
| -
|
| -
|
| -static intptr_t FindTypeParameterIndex(List<TypeParameter>* parameters,
|
| - TypeParameter* param) {
|
| - for (intptr_t i = 0; i < parameters->length(); i++) {
|
| - if (param == (*parameters)[i]) {
|
| - return i;
|
| - }
|
| - }
|
| - return -1;
|
| -}
|
| -
|
| -
|
| -void DartTypeTranslator::VisitTypeParameterType(TypeParameterType* node) {
|
| - for (TypeParameterScope* scope = type_parameter_scope_; scope != NULL;
|
| - scope = scope->outer()) {
|
| - const intptr_t index =
|
| - FindTypeParameterIndex(scope->parameters(), node->parameter());
|
| - if (index >= 0) {
|
| - result_ ^= dart::Type::DynamicType();
|
| - return;
|
| - }
|
| - }
|
| -
|
| - if ((active_class_->member != NULL) && active_class_->member->IsProcedure()) {
|
| - Procedure* procedure = Procedure::Cast(active_class_->member);
|
| - if ((procedure->function() != NULL) &&
|
| - (procedure->function()->type_parameters().length() > 0)) {
|
| - //
|
| - // WARNING: This is a little hackish:
|
| - //
|
| - // We have a static factory constructor. The kernel IR gives the factory
|
| - // constructor function it's own type parameters (which are equal in name
|
| - // and number to the ones of the enclosing class).
|
| - // I.e.,
|
| - //
|
| - // class A<T> {
|
| - // factory A.x() { return new B<T>(); }
|
| - // }
|
| - //
|
| - // is basically translated to this:
|
| - //
|
| - // class A<T> {
|
| - // static A.x<T'>() { return new B<T'>(); }
|
| - // }
|
| - //
|
| - const intptr_t index = FindTypeParameterIndex(
|
| - &procedure->function()->type_parameters(), node->parameter());
|
| - if (index >= 0) {
|
| - if (procedure->kind() == Procedure::kFactory) {
|
| - // The index of the type parameter in [parameters] is
|
| - // the same index into the `klass->type_parameters()` array.
|
| - result_ ^=
|
| - TypeArguments::Handle(Z, active_class_->klass->type_parameters())
|
| - .TypeAt(index);
|
| - } else {
|
| - result_ ^= dart::Type::DynamicType();
|
| - }
|
| - return;
|
| - }
|
| - }
|
| - }
|
| -
|
| - ASSERT(active_class_->kernel_class != NULL);
|
| - List<TypeParameter>* parameters =
|
| - &active_class_->kernel_class->type_parameters();
|
| - const intptr_t index = FindTypeParameterIndex(parameters, node->parameter());
|
| - if (index >= 0) {
|
| - // The index of the type parameter in [parameters] is
|
| - // the same index into the `klass->type_parameters()` array.
|
| - result_ ^= TypeArguments::Handle(Z, active_class_->klass->type_parameters())
|
| - .TypeAt(index);
|
| - return;
|
| - }
|
| -
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void DartTypeTranslator::VisitInterfaceType(InterfaceType* node) {
|
| - // NOTE: That an interface type like `T<A, B>` is considered to be
|
| - // malformed iff `T` is malformed.
|
| - // => We therefore ignore errors in `A` or `B`.
|
| - const TypeArguments& type_arguments = TranslateTypeArguments(
|
| - node->type_arguments().raw_array(), node->type_arguments().length());
|
| -
|
| -
|
| - Object& klass = Object::Handle(Z, H.LookupClassByKernelClass(node->klass()));
|
| - result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource);
|
| - if (finalize_) {
|
| - ASSERT(active_class_->klass != NULL);
|
| - result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
|
| - }
|
| -}
|
| -
|
| -
|
| -void DartTypeTranslator::VisitDynamicType(DynamicType* node) {
|
| - result_ = Object::dynamic_type().raw();
|
| -}
|
| -
|
| -
|
| -void DartTypeTranslator::VisitVoidType(VoidType* node) {
|
| - result_ = Object::void_type().raw();
|
| -}
|
| -
|
| -
|
| -void DartTypeTranslator::VisitBottomType(BottomType* node) {
|
| - result_ =
|
| - dart::Class::Handle(Z, I->object_store()->null_class()).CanonicalType();
|
| -}
|
| -
|
| -
|
| -const TypeArguments& DartTypeTranslator::TranslateTypeArguments(
|
| - DartType** dart_types,
|
| - intptr_t length) {
|
| - bool only_dynamic = true;
|
| - for (intptr_t i = 0; i < length; i++) {
|
| - if (!dart_types[i]->IsDynamicType()) {
|
| - only_dynamic = false;
|
| - break;
|
| - }
|
| - }
|
| - TypeArguments& type_arguments = TypeArguments::ZoneHandle(Z);
|
| - if (!only_dynamic) {
|
| - type_arguments = TypeArguments::New(length);
|
| - for (intptr_t i = 0; i < length; i++) {
|
| - dart_types[i]->AcceptDartTypeVisitor(this);
|
| - if (result_.IsMalformed()) {
|
| - type_arguments = TypeArguments::null();
|
| - return type_arguments;
|
| - }
|
| - type_arguments.SetTypeAt(i, result_);
|
| - }
|
| - if (finalize_) {
|
| - type_arguments = type_arguments.Canonicalize();
|
| - }
|
| - }
|
| - return type_arguments;
|
| -}
|
| -
|
| -
|
| -const TypeArguments& DartTypeTranslator::TranslateInstantiatedTypeArguments(
|
| - const dart::Class& receiver_class,
|
| - DartType** receiver_type_arguments,
|
| - intptr_t length) {
|
| - const TypeArguments& type_arguments =
|
| - TranslateTypeArguments(receiver_type_arguments, length);
|
| - if (type_arguments.IsNull()) return type_arguments;
|
| -
|
| - // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to
|
| - // finalize the argument types.
|
| - // (This can for example make the [type_arguments] vector larger)
|
| - Type& type = Type::Handle(
|
| - Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource));
|
| - if (finalize_) {
|
| - type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type);
|
| - }
|
| -
|
| - const TypeArguments& instantiated_type_arguments =
|
| - TypeArguments::ZoneHandle(Z, type.arguments());
|
| - return instantiated_type_arguments;
|
| -}
|
| -
|
| -
|
| -const Type& DartTypeTranslator::ReceiverType(const dart::Class& klass) {
|
| - ASSERT(!klass.IsNull());
|
| - ASSERT(!klass.IsTypedefClass());
|
| - // Note that if klass is _Closure, the returned type will be _Closure,
|
| - // and not the signature type.
|
| - Type& type = Type::ZoneHandle(Z, klass.CanonicalType());
|
| - if (!type.IsNull()) {
|
| - return type;
|
| - }
|
| - type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
|
| - klass.token_pos());
|
| - if (klass.is_type_finalized()) {
|
| - type ^= ClassFinalizer::FinalizeType(klass, type);
|
| - klass.SetCanonicalType(type);
|
| - }
|
| - return type;
|
| -}
|
| -
|
| RawObject* EvaluateMetadata(const dart::Field& metadata_field) {
|
| LongJumpScope jump;
|
| if (setjmp(*jump.Set()) == 0) {
|
|
|