From 9eb8212bd68d78dd05742d414740c66205c4ed06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Inf=C3=BChr?= Date: Thu, 20 Feb 2025 21:22:13 +0100 Subject: [PATCH] frontend: Change Assoc type definition --- dora-bytecode/src/display.rs | 13 +--- dora-bytecode/src/dumper.rs | 6 +- dora-bytecode/src/ty.rs | 9 ++- dora-frontend/src/aliasck.rs | 2 +- dora-frontend/src/extensiondefck.rs | 6 +- dora-frontend/src/generator.rs | 19 +++--- dora-frontend/src/impldefck.rs | 7 +- dora-frontend/src/parsety.rs | 17 +++-- dora-frontend/src/sema/impl_matching.rs | 2 +- dora-frontend/src/sema/matching.rs | 2 +- dora-frontend/src/specialize.rs | 65 +++++++++++-------- dora-frontend/src/ty.rs | 34 ++++------ dora-frontend/src/typeck/expr.rs | 6 +- dora-frontend/src/typeck/function.rs | 2 +- dora-runtime/src/boots/deserializer.rs | 4 +- dora-runtime/src/boots/serializer.rs | 4 +- dora-runtime/src/cannon/asm.rs | 8 +-- dora-runtime/src/cannon/codegen.rs | 20 +++--- .../src/compiler/lazy_compilation_stub.rs | 2 +- dora-runtime/src/vm/extensions.rs | 2 +- dora-runtime/src/vm/impls.rs | 2 +- dora-runtime/src/vm/specialize.rs | 14 ++-- dora-runtime/src/vm/ty.rs | 4 +- pkgs/boots/bytecode/data.dora | 2 +- pkgs/boots/deserializer.dora | 4 +- pkgs/boots/serializer.dora | 4 +- 26 files changed, 128 insertions(+), 132 deletions(-) diff --git a/dora-bytecode/src/display.rs b/dora-bytecode/src/display.rs index 0f382afc0..3ed4eb54c 100644 --- a/dora-bytecode/src/display.rs +++ b/dora-bytecode/src/display.rs @@ -282,18 +282,9 @@ impl<'a> std::fmt::Display for BytecodeTypePrinter<'a> { BytecodeType::This => write!(f, "Self"), - BytecodeType::Assoc(assoc_id, type_params) => { + BytecodeType::Assoc { assoc_id, .. } => { let alias = self.prog.alias(*assoc_id); - write!(f, "Self::{}", alias.name)?; - if !type_params.is_empty() { - write!( - f, - "[{}]", - fmt_type_list(self.prog, &type_params, self.type_params) - ) - } else { - Ok(()) - } + write!(f, "Self::{}", alias.name) } BytecodeType::TypeAlias(..) | BytecodeType::GenericAssoc { .. } => unimplemented!(), diff --git a/dora-bytecode/src/dumper.rs b/dora-bytecode/src/dumper.rs index dc1a4f55e..1fdc51814 100644 --- a/dora-bytecode/src/dumper.rs +++ b/dora-bytecode/src/dumper.rs @@ -361,7 +361,7 @@ impl<'a> Display for BytecodeTypePrinter<'a> { fmt_ty(self.prog, return_ty) ) } - BytecodeType::TypeAlias(alias_id) | BytecodeType::Assoc(alias_id, ..) => { + BytecodeType::TypeAlias(alias_id) => { let alias = self.prog.alias(*alias_id); write!(f, "{}", alias.name)?; if let Some(ref ty) = alias.ty { @@ -370,6 +370,10 @@ impl<'a> Display for BytecodeTypePrinter<'a> { Ok(()) } } + BytecodeType::Assoc { assoc_id, .. } => { + let alias = self.prog.alias(*assoc_id); + write!(f, "{}", alias.name) + } BytecodeType::GenericAssoc { type_param_id, assoc_id, diff --git a/dora-bytecode/src/ty.rs b/dora-bytecode/src/ty.rs index 993135320..11b28a548 100644 --- a/dora-bytecode/src/ty.rs +++ b/dora-bytecode/src/ty.rs @@ -24,7 +24,10 @@ pub enum BytecodeType { TraitObject(TraitId, BytecodeTypeArray, BytecodeTypeArray), Lambda(BytecodeTypeArray, Box), TypeAlias(AliasId), - Assoc(AliasId, BytecodeTypeArray), + Assoc { + trait_ty: BytecodeTraitType, + assoc_id: AliasId, + }, GenericAssoc { type_param_id: u32, trait_ty: BytecodeTraitType, @@ -52,7 +55,7 @@ impl BytecodeType { BytecodeType::TraitObject(..) => BytecodeTypeKind::TraitObject, BytecodeType::Lambda(..) => BytecodeTypeKind::Lambda, BytecodeType::TypeAlias(..) => BytecodeTypeKind::TypeAlias, - BytecodeType::Assoc(..) => BytecodeTypeKind::Assoc, + BytecodeType::Assoc { .. } => BytecodeTypeKind::Assoc, BytecodeType::GenericAssoc { .. } => BytecodeTypeKind::GenericAssoc, BytecodeType::This => unreachable!(), } @@ -175,7 +178,7 @@ impl BytecodeType { BytecodeType::TypeParam(_) => false, BytecodeType::TypeAlias(..) | BytecodeType::GenericAssoc { .. } - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::This => { unreachable!() } diff --git a/dora-frontend/src/aliasck.rs b/dora-frontend/src/aliasck.rs index 79a659ca4..998492c26 100644 --- a/dora-frontend/src/aliasck.rs +++ b/dora-frontend/src/aliasck.rs @@ -109,7 +109,7 @@ fn expand_type( SourceType::Tuple(expand_sta(sa, subtypes, visited, visiting, context)) } - SourceType::Alias(id, _type_params) | SourceType::Assoc(id, _type_params) => { + SourceType::Alias(id, ..) | SourceType::Assoc { assoc_id: id, .. } => { let alias = sa.alias(*id); let found_cycle = detect_cycles_for_alias(sa, visited, visiting, context, alias); diff --git a/dora-frontend/src/extensiondefck.rs b/dora-frontend/src/extensiondefck.rs index 316b609ae..047be045b 100644 --- a/dora-frontend/src/extensiondefck.rs +++ b/dora-frontend/src/extensiondefck.rs @@ -78,7 +78,7 @@ pub fn package_for_type(sa: &Sema, ty: SourceType) -> Option Some(sa.enum_(id).package_id), SourceType::TraitObject(id, ..) => Some(sa.trait_(id).package_id), SourceType::Alias(id, ..) => Some(sa.alias(id).package_id), - SourceType::Assoc(..) | SourceType::GenericAssoc { .. } => unimplemented!(), + SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => unimplemented!(), } } @@ -105,7 +105,7 @@ impl<'x> ExtensionCheck<'x> { SourceType::Any | SourceType::Ptr | SourceType::This - | SourceType::Assoc(..) + | SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => { unreachable!() } @@ -243,7 +243,7 @@ fn discover_type_params(sa: &Sema, ty: SourceType, used_type_params: &mut FixedB SourceType::TypeParam(tp_id) => { used_type_params.insert(tp_id.index()); } - SourceType::Alias(..) | SourceType::Assoc(..) | SourceType::GenericAssoc { .. } => { + SourceType::Alias(..) | SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => { unreachable!() } } diff --git a/dora-frontend/src/generator.rs b/dora-frontend/src/generator.rs index c4415ba7f..6e262f56d 100644 --- a/dora-frontend/src/generator.rs +++ b/dora-frontend/src/generator.rs @@ -3483,13 +3483,10 @@ pub fn bty_from_ty(ty: SourceType) -> BytecodeType { assert!(type_params.is_empty()); BytecodeType::TypeAlias(AliasId(id.index().try_into().expect("overflow"))) } - SourceType::Assoc(id, type_params) => { - assert!(type_params.is_empty()); - BytecodeType::Assoc( - AliasId(id.index().try_into().expect("overflow")), - bty_array_from_ty(&type_params), - ) - } + SourceType::Assoc { trait_ty, assoc_id } => BytecodeType::Assoc { + trait_ty: convert_trait_type(&trait_ty), + assoc_id: AliasId(assoc_id.index().try_into().expect("overflow")), + }, SourceType::GenericAssoc { tp_id, trait_ty, @@ -3541,10 +3538,10 @@ pub fn register_bty_from_ty(ty: SourceType) -> BytecodeType { trait_ty: convert_trait_type(&trait_ty), assoc_id: AliasId(assoc_id.index().try_into().expect("overflow")), }, - SourceType::Assoc(assoc_id, type_params) => BytecodeType::Assoc( - AliasId(assoc_id.index().try_into().expect("overflow")), - bty_array_from_ty(&type_params), - ), + SourceType::Assoc { trait_ty, assoc_id } => BytecodeType::Assoc { + trait_ty: convert_trait_type(&trait_ty), + assoc_id: AliasId(assoc_id.index().try_into().expect("overflow")), + }, _ => panic!("SourceType {:?} cannot be converted to BytecodeType", ty), } } diff --git a/dora-frontend/src/impldefck.rs b/dora-frontend/src/impldefck.rs index 72bc9af6c..a4140579f 100644 --- a/dora-frontend/src/impldefck.rs +++ b/dora-frontend/src/impldefck.rs @@ -23,7 +23,7 @@ fn check_impl_definition(sa: &Sema, impl_: &ImplDefinition) { SourceType::Any | SourceType::Ptr | SourceType::This - | SourceType::Assoc(..) + | SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => { unreachable!() } @@ -437,9 +437,8 @@ fn trait_and_impl_arg_ty_compatible( } } - SourceType::Assoc(id, type_params) => { - assert!(type_params.is_empty()); - let ty = trait_alias_map.get(&id).unwrap_or(&SourceType::Error); + SourceType::Assoc { assoc_id, .. } => { + let ty = trait_alias_map.get(&assoc_id).unwrap_or(&SourceType::Error); ty.allows(sa, impl_arg_ty) } diff --git a/dora-frontend/src/parsety.rs b/dora-frontend/src/parsety.rs index 244897090..2255c4909 100644 --- a/dora-frontend/src/parsety.rs +++ b/dora-frontend/src/parsety.rs @@ -590,7 +590,12 @@ fn ty_for_sym(sa: &Sema, sym: SymbolKind, type_params: SourceTypeArray) -> Sourc if alias.parent.is_none() { SourceType::Alias(id, type_params) } else { - SourceType::Assoc(id, type_params) + let trait_id = alias.parent.to_trait_id().expect("trait expected"); + let trait_ty = TraitType::from_trait_id(trait_id); + SourceType::Assoc { + trait_ty, + assoc_id: id, + } } } _ => unimplemented!(), @@ -731,7 +736,7 @@ fn check_type_inner( unreachable!() } SourceType::This => SourceType::This, - SourceType::Assoc(..) + SourceType::Assoc { .. } | SourceType::Error | SourceType::Unit | SourceType::TypeParam(..) @@ -1200,14 +1205,12 @@ fn expand_st( expand_st(sa, element, alias_ty, replace_self) } - SourceType::Assoc(id, type_params) => { - let alias = sa.alias(*id); - let trait_id = alias.parent.to_trait_id().expect("trait expected"); - assert!(type_params.is_empty()); + SourceType::Assoc { trait_ty, assoc_id } => { + let trait_id = trait_ty.trait_id; let element = parent_element_or_self(sa, element); if let Some(impl_) = element.to_impl() { - let impl_alias_id = impl_.trait_alias_map().get(&id).cloned(); + let impl_alias_id = impl_.trait_alias_map().get(&assoc_id).cloned(); if let Some(impl_alias_id) = impl_alias_id { let impl_alias = sa.alias(impl_alias_id); expand_st(sa, element, impl_alias.ty(), replace_self) diff --git a/dora-frontend/src/sema/impl_matching.rs b/dora-frontend/src/sema/impl_matching.rs index ff88dcf21..ab2aec213 100644 --- a/dora-frontend/src/sema/impl_matching.rs +++ b/dora-frontend/src/sema/impl_matching.rs @@ -65,7 +65,7 @@ pub fn implements_trait( SourceType::TypeParam(tp_id) => check_type_param_defs.implements_trait(sa, tp_id, trait_ty), - SourceType::Alias(..) | SourceType::Assoc(..) | SourceType::GenericAssoc { .. } => { + SourceType::Alias(..) | SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => { unreachable!() } diff --git a/dora-frontend/src/sema/matching.rs b/dora-frontend/src/sema/matching.rs index 49f12f489..64adc8c77 100644 --- a/dora-frontend/src/sema/matching.rs +++ b/dora-frontend/src/sema/matching.rs @@ -236,7 +236,7 @@ fn match_concrete_types( _ => false, }, - SourceType::Alias(..) | SourceType::Assoc(..) | SourceType::GenericAssoc { .. } => { + SourceType::Alias(..) | SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => { unimplemented!() } diff --git a/dora-frontend/src/specialize.rs b/dora-frontend/src/specialize.rs index 892ceb79a..f7e5dd79f 100644 --- a/dora-frontend/src/specialize.rs +++ b/dora-frontend/src/specialize.rs @@ -8,27 +8,42 @@ pub fn specialize_trait_type(sa: &Sema, ty: TraitType, type_params: &SourceTypeA specialize_trait_type_generic(sa, ty, &|ty| replace_type(sa, ty, Some(type_params), None)) } -pub fn specialize_trait_type_generic(_sa: &Sema, ty: TraitType, specialize: &S) -> TraitType +pub fn specialize_trait_type_generic( + _sa: &Sema, + trait_ty: TraitType, + specialize: &S, +) -> TraitType where S: Fn(SourceType) -> SourceType, { - let type_params = ty + let type_params = trait_ty .type_params .iter() .map(|ty| specialize(ty)) .collect::>(); - let mut new_bindings = Vec::with_capacity(ty.bindings.len()); + let mut new_bindings = Vec::with_capacity(trait_ty.bindings.len()); - for (id, ty) in ty.bindings { - let ty = specialize(ty); - if SourceType::Assoc(id, SourceTypeArray::empty()) != ty { - new_bindings.push((id, ty)); + for (id, ty) in &trait_ty.bindings { + let ty = specialize(ty.clone()); + + match ty { + SourceType::Assoc { + trait_ty: assoc_trait_ty, + assoc_id, + } if assoc_trait_ty.trait_id == trait_ty.trait_id + && assoc_trait_ty.type_params == trait_ty.type_params + && assoc_id == *id => + { + // Associated type binds to itself. + } + + _ => new_bindings.push((*id, ty)), } } TraitType { - trait_id: ty.trait_id, + trait_id: trait_ty.trait_id, type_params: type_params.into(), bindings: new_bindings, } @@ -84,11 +99,6 @@ pub fn replace_type( replace_sta(sa, alias_type_params, type_params, self_ty), ), - SourceType::Assoc(alias_id, alias_type_params) => SourceType::Assoc( - alias_id, - replace_sta(sa, alias_type_params, type_params, self_ty), - ), - SourceType::Lambda(params, return_type) => SourceType::Lambda( replace_sta(sa, params, type_params, self_ty.clone()), Box::new(replace_type(sa, *return_type, type_params, self_ty)), @@ -123,6 +133,7 @@ pub fn replace_type( | SourceType::Float32 | SourceType::Float64 | SourceType::Error + | SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => ty, SourceType::Any | SourceType::Ptr => unreachable!(), @@ -180,9 +191,8 @@ pub fn specialize_ty_for_call( specialize_ty_for_call_array(sa, alias_type_params, caller_element, call_data), ), - SourceType::Assoc(alias_id, alias_type_params) => { - let alias = sa.alias(alias_id); - assert!(alias_type_params.is_empty()); + SourceType::Assoc { assoc_id, .. } => { + let alias = sa.alias(assoc_id); match &call_data.object_ty { SourceType::TraitObject(_trait_id, _type_params, assoc_types) => { @@ -216,7 +226,9 @@ pub fn specialize_ty_for_call( caller_fct.trait_id(), assoc.parent.to_trait_id().expect("expected trait") ); - SourceType::Assoc(assoc_id, SourceTypeArray::empty()) + + let trait_ty = TraitType::from_trait_id(caller_fct.trait_id()); + SourceType::Assoc { trait_ty, assoc_id } } else if let Some(impl_match) = find_impl( sa, caller_element, @@ -349,9 +361,8 @@ pub fn specialize_ty_for_trait_object( ), ), - SourceType::Assoc(alias_id, alias_type_params) => { - let alias = sa.alias(alias_id); - assert!(alias_type_params.is_empty()); + SourceType::Assoc { assoc_id, .. } => { + let alias = sa.alias(assoc_id); assoc_types[alias.idx_in_trait()].clone() } @@ -484,10 +495,9 @@ pub fn specialize_ty_for_default_trait_method( ), ), - SourceType::Assoc(assoc_id, assoc_type_params) => { + SourceType::Assoc { assoc_id, .. } => { let assoc = sa.alias(assoc_id); assert!(assoc.parent.is_trait()); - assert!(assoc_type_params.is_empty()); let impl_alias_id = impl_.trait_alias_map().get(&assoc_id).cloned(); @@ -720,18 +730,17 @@ pub fn specialize_ty_for_generic( ), ), - SourceType::Assoc(alias_id, alias_type_params) => { - let alias = sa.alias(alias_id); + SourceType::Assoc { assoc_id, .. } => { + let alias = sa.alias(assoc_id); assert_eq!(alias.parent, AliasParent::Trait(trait_ty.trait_id)); - assert!(alias_type_params.is_empty()); - if let Some((_, ty)) = trait_ty.bindings.iter().find(|(x, _)| *x == alias_id) { + if let Some((_, ty)) = trait_ty.bindings.iter().find(|(x, _)| *x == assoc_id) { ty.clone() } else { SourceType::GenericAssoc { tp_id: type_param_id, trait_ty: trait_ty.clone(), - assoc_id: alias_id, + assoc_id, } } } @@ -956,7 +965,7 @@ pub fn specialize_for_element( } } - SourceType::Any | SourceType::Ptr | SourceType::Assoc(..) => unreachable!(), + SourceType::Any | SourceType::Ptr | SourceType::Assoc { .. } => unreachable!(), } } diff --git a/dora-frontend/src/ty.rs b/dora-frontend/src/ty.rs index 0f67d5701..d238cc06d 100644 --- a/dora-frontend/src/ty.rs +++ b/dora-frontend/src/ty.rs @@ -151,7 +151,10 @@ pub enum SourceType { Alias(AliasDefinitionId, SourceTypeArray), // Some associated type (used through Self::X). - Assoc(AliasDefinitionId, SourceTypeArray), + Assoc { + trait_ty: TraitType, + assoc_id: AliasDefinitionId, + }, // Some associated type on type parameter (T::X). GenericAssoc { @@ -189,7 +192,7 @@ impl SourceType { SourceType::Enum(..) => TyKind::Enum, SourceType::Class(..) => TyKind::Class, SourceType::Unit | SourceType::Tuple(..) => TyKind::Tuple, - SourceType::Assoc(..) => TyKind::Assoc, + SourceType::Assoc { .. } => TyKind::Assoc, SourceType::GenericAssoc { .. } => TyKind::GenericAssoc, } } @@ -507,7 +510,7 @@ impl SourceType { | SourceType::TraitObject(..) | SourceType::Class(..) | SourceType::Alias(..) - | SourceType::Assoc(..) + | SourceType::Assoc { .. } | SourceType::This | SourceType::TypeParam(..) | SourceType::Lambda(..) @@ -555,7 +558,7 @@ impl SourceType { | SourceType::TraitObject(..) | SourceType::Lambda(..) | SourceType::TypeParam(_) => true, - SourceType::GenericAssoc { trait_ty, .. } => { + SourceType::Assoc { trait_ty, .. } | SourceType::GenericAssoc { trait_ty, .. } => { for ty in trait_ty.type_params.iter() { if !ty.is_defined_type(sa) { return false; @@ -575,8 +578,7 @@ impl SourceType { } SourceType::Enum(_, params) | SourceType::Class(_, params) - | SourceType::Struct(_, params) - | SourceType::Assoc(_, params) => { + | SourceType::Struct(_, params) => { for param in params.iter() { if !param.is_defined_type(sa) { return false; @@ -656,7 +658,7 @@ impl SourceType { } SourceType::Alias(..) | SourceType::TypeParam(_) - | SourceType::Assoc(..) + | SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => false, } } @@ -676,7 +678,7 @@ pub fn contains_self(sa: &Sema, ty: SourceType) -> bool { | SourceType::Float32 | SourceType::Float64 | SourceType::TypeParam(..) - | SourceType::Assoc(..) => false, + | SourceType::Assoc { .. } => false, SourceType::Alias(..) | SourceType::GenericAssoc { .. } => { unimplemented!() @@ -1048,21 +1050,11 @@ impl<'a> SourceTypePrinter<'a> { } } - SourceType::Assoc(id, type_params) => { - let alias = self.sa.alias(id); + SourceType::Assoc { assoc_id, .. } => { + let alias = self.sa.alias(assoc_id); let name = self.sa.interner.str(alias.name).to_string(); - if type_params.len() == 0 { - name - } else { - let params = type_params - .iter() - .map(|ty| self.name(ty)) - .collect::>() - .join(", "); - - format!("Self::{}[{}]", name, params) - } + format!("Self::{}", name) } SourceType::GenericAssoc { diff --git a/dora-frontend/src/typeck/expr.rs b/dora-frontend/src/typeck/expr.rs index d3bd79903..d19617fd3 100644 --- a/dora-frontend/src/typeck/expr.rs +++ b/dora-frontend/src/typeck/expr.rs @@ -736,7 +736,7 @@ fn check_expr_assign_unnamed_field( | SourceType::TypeParam(..) | SourceType::Lambda(..) | SourceType::Alias(..) - | SourceType::Assoc(..) + | SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => { let name = index.to_string(); let expr_name = ck.ty_name(&object_type); @@ -898,7 +898,7 @@ pub(super) fn check_expr_dot( | SourceType::Lambda(..) | SourceType::Tuple(..) | SourceType::Alias(..) - | SourceType::Assoc(..) + | SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => {} SourceType::Class(cls_id, class_type_params) => { if let Some((field_id, _)) = @@ -996,7 +996,7 @@ fn check_expr_dot_unnamed_field( | SourceType::TypeParam(..) | SourceType::Lambda(..) | SourceType::Alias(..) - | SourceType::Assoc(..) + | SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => { let name = index.to_string(); let expr_name = ck.ty_name(&object_type); diff --git a/dora-frontend/src/typeck/function.rs b/dora-frontend/src/typeck/function.rs index 03d9c0769..4817165b3 100644 --- a/dora-frontend/src/typeck/function.rs +++ b/dora-frontend/src/typeck/function.rs @@ -706,7 +706,7 @@ pub(super) fn arg_allows( arg_allows(sa, alias.ty(), arg, self_ty.clone()) } - SourceType::Assoc(..) | SourceType::GenericAssoc { .. } => def == arg, + SourceType::Assoc { .. } | SourceType::GenericAssoc { .. } => def == arg, } } diff --git a/dora-runtime/src/boots/deserializer.rs b/dora-runtime/src/boots/deserializer.rs index aaf6ec0b5..ae9ac5ad2 100644 --- a/dora-runtime/src/boots/deserializer.rs +++ b/dora-runtime/src/boots/deserializer.rs @@ -248,9 +248,9 @@ pub fn decode_bytecode_type(reader: &mut ByteReader) -> BytecodeType { } BytecodeTypeKind::Assoc => { + let trait_ty = decode_bytecode_trait_ty(reader); let assoc_id = AliasId(reader.read_u32()); - let type_params = decode_bytecode_type_array(reader); - BytecodeType::Assoc(assoc_id, type_params) + BytecodeType::Assoc { trait_ty, assoc_id } } BytecodeTypeKind::TypeAlias => unreachable!(), diff --git a/dora-runtime/src/boots/serializer.rs b/dora-runtime/src/boots/serializer.rs index 925d824db..edad377bd 100644 --- a/dora-runtime/src/boots/serializer.rs +++ b/dora-runtime/src/boots/serializer.rs @@ -304,10 +304,10 @@ pub fn encode_bytecode_type(vm: &VM, ty: &BytecodeType, buffer: &mut ByteBuffer) encode_bytecode_trait_type(vm, trait_ty, buffer); buffer.emit_id(assoc_id.0 as usize); } - BytecodeType::Assoc(assoc_id, assoc_type_params) => { + BytecodeType::Assoc { trait_ty, assoc_id } => { buffer.emit_u8(BytecodeTypeKind::Assoc as u8); + encode_bytecode_trait_type(vm, trait_ty, buffer); buffer.emit_u32(assoc_id.0); - encode_bytecode_type_array(vm, assoc_type_params, buffer); } BytecodeType::TypeAlias(..) => { unreachable!() diff --git a/dora-runtime/src/cannon/asm.rs b/dora-runtime/src/cannon/asm.rs index c445be657..443aef6a8 100644 --- a/dora-runtime/src/cannon/asm.rs +++ b/dora-runtime/src/cannon/asm.rs @@ -173,7 +173,7 @@ impl<'a> BaselineAssembler<'a> { } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::This => { @@ -311,7 +311,7 @@ impl<'a> BaselineAssembler<'a> { } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::Lambda(_, _) @@ -419,7 +419,7 @@ impl<'a> BaselineAssembler<'a> { } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::Lambda(_, _) @@ -1298,7 +1298,7 @@ impl<'a> BaselineAssembler<'a> { } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::This => { diff --git a/dora-runtime/src/cannon/codegen.rs b/dora-runtime/src/cannon/codegen.rs index f3fd75d00..a81004d1b 100644 --- a/dora-runtime/src/cannon/codegen.rs +++ b/dora-runtime/src/cannon/codegen.rs @@ -244,7 +244,7 @@ impl<'a> CannonCodeGen<'a> { } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::Class(_, _) @@ -371,7 +371,7 @@ impl<'a> CannonCodeGen<'a> { } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::Unit @@ -1592,7 +1592,7 @@ impl<'a> CannonCodeGen<'a> { } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::Class(..) | BytecodeType::TypeParam(_) @@ -1769,7 +1769,7 @@ impl<'a> CannonCodeGen<'a> { } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::Class(_, _) @@ -2317,7 +2317,7 @@ impl<'a> CannonCodeGen<'a> { } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::Class(_, _) @@ -3933,7 +3933,7 @@ impl<'a> CannonCodeGen<'a> { } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::Class(..) @@ -4689,7 +4689,7 @@ pub fn result_passed_as_argument(ty: BytecodeType) -> bool { | BytecodeType::Ptr | BytecodeType::TraitObject(..) => false, BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(..) | BytecodeType::This => { @@ -4769,7 +4769,7 @@ pub fn mode(vm: &VM, ty: BytecodeType) -> MachineMode { } } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::Tuple(_) | BytecodeType::TypeParam(_) @@ -4797,7 +4797,7 @@ pub fn size(vm: &VM, ty: BytecodeType) -> i32 { | BytecodeType::Lambda(..) => mem::ptr_width(), BytecodeType::Tuple(..) => get_concrete_tuple_bty(vm, &ty).size(), BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::This => { @@ -4837,7 +4837,7 @@ pub fn align(vm: &VM, ty: BytecodeType) -> i32 { | BytecodeType::Lambda(..) => mem::ptr_width(), BytecodeType::Tuple(_) => get_concrete_tuple_bty(vm, &ty).align(), BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::This => { diff --git a/dora-runtime/src/compiler/lazy_compilation_stub.rs b/dora-runtime/src/compiler/lazy_compilation_stub.rs index a0ed00a29..18d39a5d5 100644 --- a/dora-runtime/src/compiler/lazy_compilation_stub.rs +++ b/dora-runtime/src/compiler/lazy_compilation_stub.rs @@ -282,7 +282,7 @@ pub fn iterate_roots( } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::Unit diff --git a/dora-runtime/src/vm/extensions.rs b/dora-runtime/src/vm/extensions.rs index 45e31debc..b9f1d0269 100644 --- a/dora-runtime/src/vm/extensions.rs +++ b/dora-runtime/src/vm/extensions.rs @@ -239,7 +239,7 @@ fn compare_concrete_types( } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::Ptr | BytecodeType::This => { diff --git a/dora-runtime/src/vm/impls.rs b/dora-runtime/src/vm/impls.rs index 4bc730960..145cbd8da 100644 --- a/dora-runtime/src/vm/impls.rs +++ b/dora-runtime/src/vm/impls.rs @@ -121,7 +121,7 @@ pub fn ty_implements_trait( } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::Ptr | BytecodeType::This => unreachable!(), diff --git a/dora-runtime/src/vm/specialize.rs b/dora-runtime/src/vm/specialize.rs index 202a2fb06..dd949a61d 100644 --- a/dora-runtime/src/vm/specialize.rs +++ b/dora-runtime/src/vm/specialize.rs @@ -268,7 +268,7 @@ pub fn add_ref_fields(vm: &VM, ref_fields: &mut Vec, offset: i32, ty: Bytec | BytecodeType::Unit => {} BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(..) | BytecodeType::This => { @@ -404,7 +404,7 @@ fn create_shape_for_array_class( | BytecodeType::Float64 => InstanceSize::PrimitiveArray(size(vm, element_ty)), BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::TypeParam(_) | BytecodeType::This => { @@ -590,7 +590,7 @@ pub fn specialize_bty(ty: BytecodeType, type_params: &BytecodeTypeArray) -> Byte } BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } | BytecodeType::This => { unreachable!() @@ -678,7 +678,7 @@ pub fn specialize_ty( BytecodeType::Tuple(subtypes) } - BytecodeType::Assoc(assoc_id, assoc_type_params) => { + BytecodeType::Assoc { assoc_id, .. } => { let specialize_self = self_data.expect("unexpected associated item on Self."); // Here we only end up if default trait method implementation is used from @@ -689,7 +689,6 @@ pub fn specialize_ty( specialize_ty(vm, None, specialize_self.extended_ty.clone(), type_params); assert!(extended_ty.is_concrete_type()); - assert!(assoc_type_params.is_empty()); let impl_ = vm.impl_(specialize_self.impl_id); @@ -854,9 +853,8 @@ pub fn specialize_bty_for_trait_object( BytecodeType::Tuple(subtypes) } - BytecodeType::Assoc(alias_id, alias_type_params) => { - let alias = program.alias(alias_id); - assert!(alias_type_params.is_empty()); + BytecodeType::Assoc { assoc_id, .. } => { + let alias = program.alias(assoc_id); assoc_types[alias.idx_in_trait()].clone() } diff --git a/dora-runtime/src/vm/ty.rs b/dora-runtime/src/vm/ty.rs index 56bd9c2b0..5df97d76f 100644 --- a/dora-runtime/src/vm/ty.rs +++ b/dora-runtime/src/vm/ty.rs @@ -32,7 +32,7 @@ impl BytecodeTypeExt for BytecodeType { | &BytecodeType::Float32 | &BytecodeType::Float64 => true, BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } => unreachable!(), &BytecodeType::Unit | &BytecodeType::Tuple(..) @@ -54,7 +54,7 @@ impl BytecodeTypeExt for BytecodeType { | BytecodeType::Struct(_, params) | BytecodeType::TraitObject(_, params, ..) => params.clone(), BytecodeType::TypeAlias(..) - | BytecodeType::Assoc(..) + | BytecodeType::Assoc { .. } | BytecodeType::GenericAssoc { .. } => unreachable!(), &BytecodeType::Bool | &BytecodeType::UInt8 diff --git a/pkgs/boots/bytecode/data.dora b/pkgs/boots/bytecode/data.dora index 2a5d5947c..9ed7a1fc6 100644 --- a/pkgs/boots/bytecode/data.dora +++ b/pkgs/boots/bytecode/data.dora @@ -222,7 +222,7 @@ pub enum BytecodeType { TypeParam(Int32), Lambda(Array[BytecodeType], BytecodeType), TypeAlias(AliasId), - Assoc(AliasId, Array[BytecodeType]), + Assoc { traitTy: BytecodeTraitType, assocId: AliasId }, GenericAssoc { typeParamId: Int32, traitTy: BytecodeTraitType, assocId: AliasId }, } diff --git a/pkgs/boots/deserializer.dora b/pkgs/boots/deserializer.dora index ae84d1939..c51a628c0 100644 --- a/pkgs/boots/deserializer.dora +++ b/pkgs/boots/deserializer.dora @@ -205,9 +205,9 @@ pub fn decodeBytecodeType(reader: ByteReader): BytecodeType { let assocId = AliasId(reader.readId()); BytecodeType::GenericAssoc(typeParamId, traitTy, assocId) } else if opcode == opc::BC_TYPE_ASSOC { + let traitTy = decodeBytecodeTraitType(reader); let assocId = AliasId(reader.readId()); - let typeParams = decodeBytecodeTypeArray(reader); - BytecodeType::Assoc(assocId, typeParams) + BytecodeType::Assoc(traitTy, assocId) } else if opcode == opc::BC_TYPE_THIS { BytecodeType::This } else { diff --git a/pkgs/boots/serializer.dora b/pkgs/boots/serializer.dora index 63d3d9f97..6a5880715 100644 --- a/pkgs/boots/serializer.dora +++ b/pkgs/boots/serializer.dora @@ -222,10 +222,10 @@ pub fn encodeBytecodeType(writer: ByteWriter, ty: BytecodeType) { encodeBytecodeTraitType(writer, traitTy); writer.emitInt32(assocId.0); } - BytecodeType::Assoc(assocId, typeParams) => { + BytecodeType::Assoc(traitTy, assocId) => { writer.emitByte(opc::BC_TYPE_ASSOC.toUInt8()); + encodeBytecodeTraitType(writer, traitTy); writer.emitInt32(assocId.0); - encodeBytecodeTypeArray(writer, typeParams); } BytecodeType::TypeAlias(..) => { unimplemented[()]();