@@ -750,12 +750,16 @@ impl FunctionBindgen<'_> {
750750
751751 fn emit_cleanup ( & mut self ) {
752752 for ( ptr, layout) in mem:: take ( & mut self . cleanup ) {
753- self . push_str ( & format ! ( "std::alloc::dealloc({}, {});\n " , ptr, layout) ) ;
753+ self . push_str ( & format ! (
754+ "if {layout}.size() != 0 {{\n std::alloc::dealloc({ptr}, {layout});\n }}\n "
755+ ) ) ;
754756 }
755757 if self . needs_cleanup_list {
756758 self . push_str (
757- "for (ptr, layout) in cleanup_list {
758- std::alloc::dealloc(ptr, layout);
759+ "for (ptr, layout) in cleanup_list {\n
760+ if layout.size() != 0 {\n
761+ std::alloc::dealloc(ptr, layout);\n
762+ }\n
759763 }\n " ,
760764 ) ;
761765 }
@@ -1365,37 +1369,34 @@ impl Bindgen for FunctionBindgen<'_> {
13651369 Instruction :: ListLower { element, realloc } => {
13661370 let body = self . blocks . pop ( ) . unwrap ( ) ;
13671371 let tmp = self . tmp ( ) ;
1368- let vec = format ! ( "vec{}" , tmp) ;
1369- let result = format ! ( "result{}" , tmp) ;
1370- let layout = format ! ( "layout{}" , tmp) ;
1371- let len = format ! ( "len{}" , tmp) ;
1372- self . push_str ( & format ! ( "let {} = {};\n " , vec, operands[ 0 ] ) ) ;
1373- self . push_str ( & format ! ( "let {} = {}.len() as i32;\n " , len, vec) ) ;
1374- let size = self . gen . sizes . size ( element) ;
1375- let align = self . gen . sizes . align ( element) ;
1372+ let vec = format ! ( "vec{tmp}" ) ;
1373+ let result = format ! ( "result{tmp}" ) ;
1374+ let layout = format ! ( "layout{tmp}" ) ;
1375+ let len = format ! ( "len{tmp}" ) ;
13761376 self . push_str ( & format ! (
1377- "let {} = core::alloc::Layout::from_size_align_unchecked({}.len() * {}, {}) ;\n " ,
1378- layout , vec , size , align ,
1377+ "let {vec } = {operand0} ;\n " ,
1378+ operand0 = operands [ 0 ]
13791379 ) ) ;
1380+ self . push_str ( & format ! ( "let {len} = {vec}.len() as i32;\n " ) ) ;
1381+ let size = self . gen . sizes . size ( element) ;
1382+ let align = self . gen . sizes . align ( element) ;
13801383 self . push_str ( & format ! (
1381- "let {} = std::alloc::alloc({});\n " ,
1382- result, layout,
1384+ "let {layout} = core::alloc::Layout::from_size_align_unchecked({vec}.len() * {size}, {align});\n " ,
13831385 ) ) ;
13841386 self . push_str ( & format ! (
1385- "if {}.is_null() {{ std::alloc::handle_alloc_error({}); }}\n " ,
1386- result, layout,
1387+ "let {result} = if {layout}.size() != 0\n {{\n let ptr = std::alloc::alloc({layout});\n " ,
13871388 ) ) ;
13881389 self . push_str ( & format ! (
1389- "for (i, e) in {}.into_iter().enumerate() {{\n " ,
1390- vec
1390+ "if ptr.is_null()\n {{\n std::alloc::handle_alloc_error({layout});\n }}\n ptr\n }}" ,
13911391 ) ) ;
1392+ self . push_str ( & format ! ( "else {{\n std::ptr::null_mut()\n }};\n " , ) ) ;
1393+ self . push_str ( & format ! ( "for (i, e) in {vec}.into_iter().enumerate() {{\n " , ) ) ;
13921394 self . push_str ( & format ! (
1393- "let base = {} as i32 + (i as i32) * {};\n " ,
1394- result, size,
1395+ "let base = {result} as i32 + (i as i32) * {size};\n " ,
13951396 ) ) ;
13961397 self . push_str ( & body) ;
13971398 self . push_str ( "}\n " ) ;
1398- results. push ( format ! ( "{} as i32" , result ) ) ;
1399+ results. push ( format ! ( "{result } as i32" ) ) ;
13991400 results. push ( len) ;
14001401
14011402 if realloc. is_none ( ) {
@@ -1414,14 +1415,19 @@ impl Bindgen for FunctionBindgen<'_> {
14141415 let tmp = self . tmp ( ) ;
14151416 let size = self . gen . sizes . size ( element) ;
14161417 let align = self . gen . sizes . align ( element) ;
1417- let len = format ! ( "len{}" , tmp) ;
1418- let base = format ! ( "base{}" , tmp) ;
1419- let result = format ! ( "result{}" , tmp) ;
1420- self . push_str ( & format ! ( "let {} = {};\n " , base, operands[ 0 ] ) ) ;
1421- self . push_str ( & format ! ( "let {} = {};\n " , len, operands[ 1 ] , ) ) ;
1418+ let len = format ! ( "len{tmp}" ) ;
1419+ let base = format ! ( "base{tmp}" ) ;
1420+ let result = format ! ( "result{tmp}" ) ;
1421+ self . push_str ( & format ! (
1422+ "let {base} = {operand0};\n " ,
1423+ operand0 = operands[ 0 ]
1424+ ) ) ;
1425+ self . push_str ( & format ! (
1426+ "let {len} = {operand1};\n " ,
1427+ operand1 = operands[ 1 ]
1428+ ) ) ;
14221429 self . push_str ( & format ! (
1423- "let mut {} = Vec::with_capacity({} as usize);\n " ,
1424- result, len,
1430+ "let mut {result} = Vec::with_capacity({len} as usize);\n " ,
14251431 ) ) ;
14261432
14271433 self . push_str ( "for i in 0.." ) ;
@@ -1439,14 +1445,7 @@ impl Bindgen for FunctionBindgen<'_> {
14391445 self . push_str ( "}\n " ) ;
14401446 results. push ( result) ;
14411447 self . push_str ( & format ! (
1442- "std::alloc::dealloc(
1443- {} as *mut _,
1444- std::alloc::Layout::from_size_align_unchecked(
1445- ({} as usize) * {},
1446- {},
1447- ),
1448- );\n " ,
1449- base, len, size, align
1448+ "if {len} != 0 {{\n std::alloc::dealloc({base} as *mut _, std::alloc::Layout::from_size_align_unchecked(({len} as usize) * {size}, {align}));\n }}\n " ,
14501449 ) ) ;
14511450 }
14521451
0 commit comments