[ruby-core:118766] [Ruby master Feature#20594] A new String method to append bytes while preserving encoding
From:
"byroot (Jean Boussier) via ruby-core" <ruby-core@...>
Date:
2024-08-01 09:35:57 UTC
List:
ruby-core #118766
SXNzdWUgIzIwNTk0IGhhcyBiZWVuIHVwZGF0ZWQgYnkgYnlyb290IChKZWFuIEJvdXNzaWVyKS4N Cg0KDQpUaGFuayB5b3UgTWF0ei4NCg0KSSBvcGVuZWQgYSBQUiB0aGF0IGltcGxlbWVudCB0aGUg bWV0aG9kIGFzIGVudmlzaW9uZWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9ydWJ5L3J1YnkvcHVsbC8x MTI5Mw0KDQo+IGRvZXMgaXQgdGFrZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50Pw0KDQpObywgYSBz aW5nbGUgYXJndW1lbnQsIGFuZCBvbmx5IGEgU3RyaW5nIChUX1NUUklORykgYXMgc3VnZ2VzdGVk IGJ5IFlKSVQgcGVvcGxlIHRvIG1ha2UgaXQgb3B0aW1pemFibGUuDQoNCj4gZG9lcyBpdCB0YWtl IGludGVnZXJzIHRvbz8NCg0KU2ltaWxhcmx5LCBZSklUIHBlb3BsZSBzdWdnZXN0ZWQgdG8gbm90 IHRha2UgZGlmZmVyZW50IHR5cGVzLiBIZW5jZSB3aHkgSSBwcm9wb3NlZCB0d28gbWV0aG9kcyBg YXBwZW5kX2J5dGUoSW50ZWdlcilgIGFuZCBgYXBwZW5kX2J5dGVzKFN0cmluZylgLg0KDQo+IHdo YXQgaXMgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGVuY29kaW5nLXdpc2U/DQoNClRoZSByZWNl aXZlciBlbmNvZGluZyBpcyBuZXZlciBjaGFuZ2VkLCBldmVuIGlmIGl0IG1lYW5zIHRoYXQgaXQn cyBlbmNvZGluZyBiZWNvbWUgaW52YWxpZC4gSXQncyB0aGUgY2FsbGVkIHJlc3BvbnNhYmlsaXR5 IHRvIGNoZWNrIGBTdHJpbmcjdmFsaWRfZW5jb2Rpbmc/YCBpZiB0aGF0J3MgYSBwb3NzaWJpbGl0 eSBhbmQgdG8gZGVhbCB3aXRoIGl0Lg0KDQpJdCBhbHNvIG1lYW5zIGBhcHBlbmRfYnl0ZXNgIG5l dmVyIHJhaXNlcyBhbiBgRW5jb2Rpbmc6OkNvbXBhdGliaWxpdHlFcnJvcmAuDQoNCg0KDQotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpGZWF0dXJlICMyMDU5NDogQSBu ZXcgU3RyaW5nIG1ldGhvZCB0byBhcHBlbmQgYnl0ZXMgd2hpbGUgcHJlc2VydmluZyBlbmNvZGlu Zw0KaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzIwNTk0I2NoYW5nZS0xMDkzMTgN Cg0KKiBBdXRob3I6IGJ5cm9vdCAoSmVhbiBCb3Vzc2llcikNCiogU3RhdHVzOiBPcGVuDQoqIEFz c2lnbmVlOiBieXJvb3QgKEplYW4gQm91c3NpZXIpDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tDQojIyMgQ29udGV4dA0KDQpXaGVuIHdvcmtpbmcgd2l0aCBiaW5hcnkg cHJvdG9jb2xzIHN1Y2ggYXMgYHByb3RvYnVmYCBvciBgTWVzc2FnZVBhY2tgLCB5b3UgbWF5IG9m dGVuIG5lZWQgdG8gYXNzZW1ibGUgbXVsdGlwbGUNCnN0cmluZ3Mgb2YgZGlmZmVyZW50IGVuY29k aW5nOg0KDQpgYGBydWJ5DQpQb3N0ID0gU3RydWN0Lm5ldyg6dGl0bGUsIDpib2R5KSBkbw0KICBk ZWYgc2VyaWFsaXplKGJ1ZikNCiAgICBidWYgPDwNCiAgICAgIDI1NSA8PCB0aXRsZS5ieXRlc2l6 ZSA8PCB0aXRsZSA8PA0KICAgICAgMjU1IDw8IGJvZHkuYnl0ZXNpemUgPDwgYm9keQ0KICBlbmQN CmVuZA0KDQpQb3N0Lm5ldygiSGVsbG8iLCAiV29ybGQiKS5zZXJpYWxpemUoInNvbWVkYXRhIi5i KSAjID0+ICJzb21lZGF0YVx4RkZceDA1SGVsbG9ceEZGXHgwNVdvcmxkIiAjPEVuY29kaW5nOkFT Q0lJLThCSVQ+DQpgYGANCg0KVGhlIHByb2JsZW0gaW4gdGhlIGFib3ZlIGNhc2UsIGlzIHRoYXQg YmVjYXVzZSBgRW5jb2Rpbmc6OkFTQ0lJXzhCSVRgIGlzIGRlY2xhcmVkIGFzIEFTQ0lJIGNvbXBh dGlibGUsDQppZiBvbmUgb2YgdGhlIGFwcGVuZGVkIHN0cmluZyBjb250YWlucyBieXRlcyBvdXRz aWRlIHRoZSBBU0NJSSByYW5nZSwgc3RyaW5nIGlzIGF1dG9tYXRpY2FsbHkgcHJvbW90ZWQNCnRv IGFub3RoZXIgZW5jb2RpbmcsIHdoaWNoIHRoZW4gbGVhZHMgdG8gZW5jb2RpbmcgaXNzdWVzOg0K DQpgYGBydWJ5DQpQb3N0Lm5ldygiSOKCrGxsbyIsICJXw7RybGQiKS5zZXJpYWxpemUoInNvbWVk YXRhIi5iKSAjID0+IGluY29tcGF0aWJsZSBjaGFyYWN0ZXIgZW5jb2RpbmdzOiBBU0NJSS04QklU IGFuZCBVVEYtOCAoRW5jb2Rpbmc6OkNvbXBhdGliaWxpdHlFcnJvcikNCmBgYA0KDQpJbiBtYW55 IGNhc2VzLCB5b3Ugd2FudCB0byBhcHBlbmQgdG8gYSBTdHJpbmcgd2l0aG91dCBjaGFuZ2luZyB0 aGUgcmVjZWl2ZXIncyBlbmNvZGluZy4NCg0KVGhlIGlzc3VlIGlzbid0IGV4Y2x1c2l2ZSB0byBi aW5hcnkgcHJvdG9jb2xzIGFuZCBmb3JtYXRzLCBpdCBhbHNvIGhhcHBlbiB3aXRoIEFTQ0lJIHBy b3RvY29scyB0aGF0IGFjY2VwdCBhcmJpdHJhcnkgYnl0ZXMgaW5saW5lLA0KbGlrZSBSZWRpcydz IFJFU1AgcHJvdG9jb2wgb3IgZXZlbiBIVFRQLzEuMS4NCg0KIyMjIFByZXZpb3VzIGRpc2N1c3Np b24NCg0KVGhlcmUgd2FzIGEgc2ltaWxhciBmZWF0dXJlIHJlcXVlc3QgYSB3aGlsZSBhZ28sIGJ1 dCBpdCB3YXMgYWJhbmRvbmVkOiBodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMTQ5 NzUNCg0KIyMjIEV4aXN0aW5nIHNvbHV0aW9ucw0KDQpZb3UgY2FuIG9mIGNvdXJzZSBhbHdheXMg Y2FzdCB0aGUgc3RyaW5ncyB5b3UgYXBwZW5kIHRvIGF2b2lkIHRoaXMgcHJvYmxlbToNCg0KYGBg cnVieQ0KUG9zdCA9IFN0cnVjdC5uZXcoOnRpdGxlLCA6Ym9keSkgZG8NCiAgZGVmIHNlcmlhbGl6 ZShidWYpDQogICAgYnVmIDw8DQogICAgICAyNTUgPDwgdGl0bGUuYnl0ZXNpemUgPDwgdGl0bGUu YiA8PA0KICAgICAgMjU1IDw8IGJvZHkuYnl0ZXNpemUgPDwgYm9keS5iDQogIGVuZA0KZW5kDQpg YGANCg0KQnV0IHRoaXMgY2F1c2UgYSBsb3Qgb2YgbmVlZGxlc3MgYWxsb2NhdGlvbnMuDQoNCllv dSdkIHRoaW5rIHlvdSBjb3VsZCBhbHNvIHVzZSBgYnl0ZXNwbGljZWAsIGJ1dCBpdCBhY3R1YWxs eSBoYXMgdGhlIHNhbWUgaXNzdWU6DQoNCmBgYHJ1YnkNClBvc3QgPSBTdHJ1Y3QubmV3KDp0aXRs ZSwgOmJvZHkpIGRvDQogIGRlZiBzZXJpYWxpemUoYnVmKQ0KICAgIGJ1ZiA8PCAyNTUgPDwgdGl0 bGUuYnl0ZXNpemUNCiAgICBidWYuYnl0ZXNwbGljZShidWYuYnl0ZXNpemUsIHRpdGxlLmJ5dGVz aXplLCB0aXRsZSkNCiAgICBidWYgPDwgMjU1IDw8IGJvZHkuYnl0ZXNpemUNCiAgICBidWYuYnl0 ZXNwbGljZShidWYuYnl0ZXNpemUsIGJvZHkuYnl0ZXNpemUsIHRpdGxlKQ0KICBlbmQNCmVuZA0K UG9zdC5uZXcoIkjigqxsbG8iLCAiV8O0cmxkIikuc2VyaWFsaXplKCJzb21lZGF0YSIuYikgIyA9 PiAnU3RyaW5nI2J5dGVzcGxpY2UnOiBpbmNvbXBhdGlibGUgY2hhcmFjdGVyIGVuY29kaW5nczog QklOQVJZIChBU0NJSS04QklUKSBhbmQgVVRGLTggKEVuY29kaW5nOjpDb21wYXRpYmlsaXR5RXJy b3IpDQpgYGANCg0KQW5kIGV2ZW4gaWYgaXQgd29ya2VkLCBpdCB3b3VsZCBiZSB2ZXJ5IHVuZXJn b25vbWljLg0KDQojIyMgUHJvcG9zYWw6IGEgYGJ5dGVjb25jYXRgIG1ldGhvZA0KDQpBIHNvbHV0 aW9uIHRvIHRoaXMgd291bGQgYmUgdG8gYWRkIGEgbmV3IGBieXRlY29uY2F0YCBtZXRob2QsIHRo YXQgY291bGQgYmUgc2hpbWVkIGFzOg0KDQpgYGBydWJ5DQpjbGFzcyBTdHJpbmcNCiAgZGVmIGJ5 dGVjb25jYXQoKnN0cmluZ3MpDQogICAgc3RyaW5ncy5tYXAhIGRvIHxzfA0KICAgICAgaWYgcy5p c19hPyhTdHJpbmcpICYmIHMuZW5jb2RpbmcgIT0gZW5jb2RpbmcNCiAgICAgICAgcy5kdXAuZm9y Y2VfZW5jb2RpbmcoZW5jb2RpbmcpDQogICAgICBlbHNlDQogICAgICAgIHMNCiAgICAgIGVuZA0K ICAgIGVuZA0KICAgIGNvbmNhdCgqc3RyaW5ncykNCiAgZW5kDQplbmQNCg0KUG9zdCA9IFN0cnVj dC5uZXcoOnRpdGxlLCA6Ym9keSkgZG8NCiAgZGVmIHNlcmlhbGl6ZShidWYpDQogICAgYnVmLmJ5 dGVjb25jYXQoDQogICAgICAyNTUsIHRpdGxlLmJ5dGVzaXplLCB0aXRsZSwNCiAgICAgIDI1NSwg Ym9keS5ieXRlc2l6ZSwgYm9keSwNCiAgICApDQogIGVuZA0KZW5kDQoNClBvc3QubmV3KCJI4oKs bGxvIiwgIlfDtHJsZCIpLnNlcmlhbGl6ZSgic29tZWRhdGEiLmIpICMgPT4gInNvbWVkYXRhXHhG RlxhSFx4RTJceDgyXHhBQ2xsb1x4RkZceDA2V1x4QzNceEI0cmxkIiAjPEVuY29kaW5nOkFTQ0lJ LThCSVQ+DQpgYGANCg0KQnV0IG9mIGNvdXJzZSBhIGJ1aWx0aW4gaW1wbGVtZW50YXRpb24gd291 bGRuJ3QgbmVlZCB0byBkdXAgdGhlIGFyZ3VtZW50cy4NCg0KTGlrZSBvdGhlciBgYnl0ZSpgIG1l dGhvZHMsIGl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZW5zdXJlIHRo ZSByZXN1bHRpbmcgc3RyaW5nIGhhcyBhIHZhbGlkIGVuY29kaW5nLCBvcg0KdG8gZGVhbCB3aXRo IGl0IGlmIG5vdC4NCg0KIyMjIE1ldGhvZCBuYW1lIGFuZCBzaWduYXR1cmUNCg0KIyMjIyBOYW1l DQoNClRoaXMgcHJvcG9zYWwgc3VnZ2VzdHMgYFN0cmluZyNieXRlY29uY2F0YCwgdG8gbWlycm9y IGBTdHJpbmcjY29uY2F0YCwgYnV0IG90aGVyIG5hbWVzIGFyZSBwb3NzaWJsZToNCg0KICAtIGBi eXRlYXBwZW5kYCAobGlrZSBgQXJyYXkjYXBwZW5kYCkNCiAgLSBgYnl0ZXB1c2hgICAobGlrZSBg QXJyYXkjcHVzaGApDQoNCiMjIyMgU2lnbmF0dXJlDQoNClRoaXMgcHJvcG9zYWwgbWFrZXMgYGJ5 dGVjb25jYXRgIGFjY2VwdCBlaXRoZXIgYFN0cmluZ2Agb3IgYEludGVnZXJgIChpbiBjaGFyIHJh bmdlKSBhcmd1bWVudHMgbGlrZSBgY29uY2F0YC4gSSBiZWxpZXZlIGl0IG1ha2VzIHNlbnNlIGZv ciBjb25zaXN0ZW5jeSBhbmQgYWxzbyBiZWNhdXNlIGl0J3Mgbm90IHVuY29tbW9uIGZvciBwcm90 b2NvbHMgdG8gaGF2ZSBzb21lIGJ5dGUgYmFzZWQgc2VnbWVudHMsIGFuZCBJbnRlZ2VycyBhcmUg bW9yZSBjb252ZW5pZW50IHRoZXJlLg0KDQpUaGUgcHJvcG9zZWQgbWV0aG9kIGFsc28gYWNjZXB0 IHZhcmlhYmxlIGFyZ3VtZW50cyBmb3IgY29uc2lzdGVuY3kgd2l0aCBgU3RyaW5nI2NvbmNhdGAs IGBBcnJheSNwdXNoYCwgYEFycmF5I2FwcGVuZGAuDQoNClRoZSBwcm9wb3NlZCBtZXRob2QgcmV0 dXJucyBzZWxmLCBsaWtlIGBjb25jYXRgIGFuZCBvdGhlcnMuDQoNCiMjIyBZSklUIGNvbnNpZGVy YXRpb24NCg0KSSBjb25zdWx0ZWQgQG1heGltZWNiIGFib3V0IHRoaXMgcHJvcG9zYWwsIGFuZCBh Y2NvcmRpbmcgdG8gaGVyLCBhY2NlcHRpbmcgdmFyaWFibGUgYXJndW1lbnRzIG1ha2VzIGl0IGhh cmRlciBmb3IgWUpJVCB0byBvcHRpbWl6ZS4NCkkgc3VzcGVjdCBjb25zaXN0ZW5jeSB3aXRoIG90 aGVyIEFQSXMgdHJ1bXBzIHRoZSBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9uLCBidXQgSSB0aGlu ayBpdCdzIHdvcnRoIG1lbnRpb25pbmcuDQoNCg0KDQoNCg0KLS0gDQpodHRwczovL2J1Z3MucnVi eS1sYW5nLm9yZy8NCiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCiBydWJ5LWNvcmUgbWFpbGluZyBsaXN0IC0tIHJ1YnktY29yZUBtbC5ydWJ5LWxhbmcub3Jn CiBUbyB1bnN1YnNjcmliZSBzZW5kIGFuIGVtYWlsIHRvIHJ1YnktY29yZS1sZWF2ZUBtbC5ydWJ5 LWxhbmcub3JnCiBydWJ5LWNvcmUgaW5mbyAtLSBodHRwczovL21sLnJ1YnktbGFuZy5vcmcvbWFp bG1hbjMvbGlzdHMvcnVieS1jb3JlLm1sLnJ1YnktbGFuZy5vcmcv