@@ -1463,6 +1463,27 @@ impl<'a> DInterfaceGenerator<'a> {
14631463 String :: new ( )
14641464 }
14651465 }
1466+
1467+ fn needs_wit_free ( & self , ty : Type ) -> bool {
1468+ match ty {
1469+ Type :: String => true ,
1470+ Type :: Id ( id) => {
1471+ let typeinfo = & self . r#gen . types . get ( id) ;
1472+ typeinfo. has_list || typeinfo. has_resource
1473+ }
1474+ _ => false ,
1475+ }
1476+ }
1477+
1478+ fn can_have_wit_clone ( & self , ty : Type ) -> bool {
1479+ match ty {
1480+ Type :: Id ( id) => {
1481+ let typeinfo = & self . r#gen . types . get ( id) ;
1482+ !typeinfo. has_own_handle
1483+ }
1484+ _ => true ,
1485+ }
1486+ }
14661487}
14671488
14681489impl < ' a > InterfaceGenerator < ' a > for DInterfaceGenerator < ' a > {
@@ -1516,6 +1537,34 @@ impl<'a> InterfaceGenerator<'a> for DInterfaceGenerator<'a> {
15161537 ) ) ;
15171538 }
15181539
1540+ self . src . push_str ( "\n void witFree() {\n " ) ;
1541+ for field in & record. fields {
1542+ let lower_name = field. name . to_lower_camel_case ( ) ;
1543+ let escaped_name = escape_d_identifier ( & lower_name) ;
1544+
1545+ if self . needs_wit_free ( field. ty ) {
1546+ self . src . push_str ( & format ! ( "{escaped_name}.witFree;\n " ) ) ;
1547+ }
1548+ }
1549+ self . src . push_str ( "}\n " ) ;
1550+
1551+ if self . can_have_wit_clone ( Type :: Id ( id) ) {
1552+ self . src
1553+ . push_str ( & format ! ( "\n {escaped_name} witClone() const {{\n " ) ) ;
1554+ self . src
1555+ . push_str ( & format ! ( "{escaped_name} clone = void;\n " ) ) ;
1556+ for field in & record. fields {
1557+ let lower_name = field. name . to_lower_camel_case ( ) ;
1558+ let escaped_name = escape_d_identifier ( & lower_name) ;
1559+
1560+ self . src . push_str ( & format ! (
1561+ "clone.{escaped_name} = this.{escaped_name}.witClone;\n "
1562+ ) ) ;
1563+ }
1564+ self . src . push_str ( "return clone;\n " ) ;
1565+ self . src . push_str ( "}\n " ) ;
1566+ }
1567+
15191568 self . src . push_str ( "}\n " ) ;
15201569 }
15211570
@@ -1604,6 +1653,7 @@ impl<'a> InterfaceGenerator<'a> for DInterfaceGenerator<'a> {
16041653 ) ) ;
16051654 self . src
16061655 . push_str ( "static private extern(C) void __import_drop(uint);\n \n " ) ;
1656+ self . src . push_str ( "alias witFree = drop;\n " ) ;
16071657
16081658 self . src . push_str ( & format ! (
16091659 "// TODO: make RAII? disable copy for the own
@@ -1619,6 +1669,9 @@ impl<'a> InterfaceGenerator<'a> for DInterfaceGenerator<'a> {
16191669 }}
16201670
16211671 @disable this();
1672+
1673+ void witFree() {{}}
1674+ Borrow witClone() const {{ return Borrow(__handle); }}
16221675 "
16231676 ) ) ;
16241677
@@ -1753,6 +1806,7 @@ impl<'a> InterfaceGenerator<'a> for DInterfaceGenerator<'a> {
17531806 ) ) ;
17541807 self . src
17551808 . push_str ( "static private extern(C) void __import_drop(uint);\n \n " ) ;
1809+ self . src . push_str ( "alias witFree = drop;\n " ) ;
17561810
17571811 self . src . push_str ( & format ! (
17581812 "// TODO: make RAII? disable copy for the own
@@ -1768,6 +1822,9 @@ impl<'a> InterfaceGenerator<'a> for DInterfaceGenerator<'a> {
17681822
17691823 @disable this();
17701824
1825+ void witFree() {{}}
1826+ Borrow witClone() const {{ return Borrow(__handle); }}
1827+
17711828 "
17721829 ) ) ;
17731830
@@ -1935,6 +1992,47 @@ impl<'a> InterfaceGenerator<'a> for DInterfaceGenerator<'a> {
19351992 ) ) ;
19361993 }
19371994 }
1995+
1996+ self . src . push_str ( "\n void witFree() {\n " ) ;
1997+ if self . needs_wit_free ( Type :: Id ( id) ) {
1998+ self . src . push_str ( "switch (_tag) with (Tag) {\n " ) ;
1999+ for case in & variant. cases {
2000+ let lower_case_name = case. name . to_lower_camel_case ( ) ;
2001+ let escaped_lower_case_name = escape_d_identifier ( & lower_case_name) ;
2002+
2003+ if case. ty . is_some ( ) && self . needs_wit_free ( case. ty . unwrap ( ) ) {
2004+ self . src . push_str ( & format ! (
2005+ "case {escaped_lower_case_name}: _get!(Tag.{escaped_lower_case_name}).witFree; break;\n " ,
2006+ ) ) ;
2007+ }
2008+ }
2009+ self . src . push_str ( "default: break;\n " ) ;
2010+ self . src . push_str ( "}\n " ) ;
2011+ }
2012+ self . src . push_str ( "}\n " ) ;
2013+
2014+ if self . can_have_wit_clone ( Type :: Id ( id) ) {
2015+ self . src
2016+ . push_str ( & format ! ( "\n {escaped_name} witClone() const {{\n " ) ) ;
2017+ self . src . push_str ( "final switch (_tag) {\n " ) ;
2018+ for case in & variant. cases {
2019+ let lower_case_name = case. name . to_lower_camel_case ( ) ;
2020+ let escaped_lower_case_name = escape_d_identifier ( & lower_case_name) ;
2021+
2022+ if case. ty . is_some ( ) {
2023+ self . src . push_str ( & format ! (
2024+ "case Tag.{escaped_lower_case_name}: return _create!(Tag.{escaped_lower_case_name})(this._get!(Tag.{escaped_lower_case_name}).witClone); break;\n " ,
2025+ ) ) ;
2026+ } else {
2027+ self . src . push_str ( & format ! (
2028+ "case Tag.{escaped_lower_case_name}: return _create!(Tag.{escaped_lower_case_name}); break;\n " ,
2029+ ) ) ;
2030+ }
2031+ }
2032+ self . src . push_str ( "}\n " ) ;
2033+ self . src . push_str ( "}\n " ) ;
2034+ }
2035+
19382036 self . src . push_str ( "}\n " ) ;
19392037 }
19402038
0 commit comments