[ruby-core:118564] [Ruby master Feature#20594] A new String method to append bytes while preserving encoding
From:
"Eregon (Benoit Daloze) via ruby-core" <ruby-core@...>
Date:
2024-07-11 15:19:20 UTC
List:
ruby-core #118564
SXNzdWUgIzIwNTk0IGhhcyBiZWVuIHVwZGF0ZWQgYnkgRXJlZ29uIChCZW5vaXQgRGFsb3plKS4N Cg0KDQpJIHdvbmRlciBpZiB0aGF0J3MgYSBidWcgb2YgYGJ5dGVzcGxpY2VgLg0KSXQncyBub3Qg bGlrZSBlLmcuIGBzZXRieXRlYCB3b3VsZCByZXNwZWN0IHRoZSBlbmNvZGluZyAoaXQgY2Fubm90 IHBvc3NpYmx5KS4NCk9UT0ggYGJ5dGVpbmRleGAgYWxzbyB0YWtlcyBhIFN0cmluZyBhcmd1bWVu dCBhbmQgcmFpc2VzIGBFbmNvZGluZzo6Q29tcGF0aWJpbGl0eUVycm9yYCBmb3IgYCLDqSIuYi5i eXRlaW5kZXggIsOpImAgc28gSSBndWVzcyBpdCdzIG5vdCBzbyBjbGVhci1jdXQgY3VycmVudGx5 IChJIGdldCB0aGUgcmVwbGllcyBhYm92ZSBhIGJpdCBiZXR0ZXIpLg0KDQpBbm90aGVyIHdheSB0 byBzZWUgdGhlIG5ldyBtZXRob2QgaXMgY29uY2F0ZW5hdGlvbiB3aXRob3V0IGVuY29kaW5nIG5l Z290aWF0aW9uL2NoZWNraW5nIGVuY29kaW5nIGNvbXBhdGliaWxpdHkuDQpIYXZpbmcgYnl0ZS9i eXRlcyBpbiB0aGUgbmFtZSBzZWVtcyBhIGdvb2Qgd2F5IHRvIGV4cHJlc3MgdGhhdC4NCg0KLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRmVhdHVyZSAjMjA1OTQ6IEEg bmV3IFN0cmluZyBtZXRob2QgdG8gYXBwZW5kIGJ5dGVzIHdoaWxlIHByZXNlcnZpbmcgZW5jb2Rp bmcNCmh0dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnL2lzc3Vlcy8yMDU5NCNjaGFuZ2UtMTA5MDg2 DQoNCiogQXV0aG9yOiBieXJvb3QgKEplYW4gQm91c3NpZXIpDQoqIFN0YXR1czogT3Blbg0KKiBB c3NpZ25lZTogYnlyb290IChKZWFuIEJvdXNzaWVyKQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KIyMjIENvbnRleHQNCg0KV2hlbiB3b3JraW5nIHdpdGggYmluYXJ5 IHByb3RvY29scyBzdWNoIGFzIGBwcm90b2J1ZmAgb3IgYE1lc3NhZ2VQYWNrYCwgeW91IG1heSBv ZnRlbiBuZWVkIHRvIGFzc2VtYmxlIG11bHRpcGxlDQpzdHJpbmdzIG9mIGRpZmZlcmVudCBlbmNv ZGluZzoNCg0KYGBgcnVieQ0KUG9zdCA9IFN0cnVjdC5uZXcoOnRpdGxlLCA6Ym9keSkgZG8NCiAg ZGVmIHNlcmlhbGl6ZShidWYpDQogICAgYnVmIDw8DQogICAgICAyNTUgPDwgdGl0bGUuYnl0ZXNp emUgPDwgdGl0bGUgPDwNCiAgICAgIDI1NSA8PCBib2R5LmJ5dGVzaXplIDw8IGJvZHkNCiAgZW5k DQplbmQNCg0KUG9zdC5uZXcoIkhlbGxvIiwgIldvcmxkIikuc2VyaWFsaXplKCJzb21lZGF0YSIu YikgIyA9PiAic29tZWRhdGFceEZGXHgwNUhlbGxvXHhGRlx4MDVXb3JsZCIgIzxFbmNvZGluZzpB U0NJSS04QklUPg0KYGBgDQoNClRoZSBwcm9ibGVtIGluIHRoZSBhYm92ZSBjYXNlLCBpcyB0aGF0 IGJlY2F1c2UgYEVuY29kaW5nOjpBU0NJSV84QklUYCBpcyBkZWNsYXJlZCBhcyBBU0NJSSBjb21w YXRpYmxlLA0KaWYgb25lIG9mIHRoZSBhcHBlbmRlZCBzdHJpbmcgY29udGFpbnMgYnl0ZXMgb3V0 c2lkZSB0aGUgQVNDSUkgcmFuZ2UsIHN0cmluZyBpcyBhdXRvbWF0aWNhbGx5IHByb21vdGVkDQp0 byBhbm90aGVyIGVuY29kaW5nLCB3aGljaCB0aGVuIGxlYWRzIHRvIGVuY29kaW5nIGlzc3VlczoN Cg0KYGBgcnVieQ0KUG9zdC5uZXcoIkjigqxsbG8iLCAiV8O0cmxkIikuc2VyaWFsaXplKCJzb21l ZGF0YSIuYikgIyA9PiBpbmNvbXBhdGlibGUgY2hhcmFjdGVyIGVuY29kaW5nczogQVNDSUktOEJJ VCBhbmQgVVRGLTggKEVuY29kaW5nOjpDb21wYXRpYmlsaXR5RXJyb3IpDQpgYGANCg0KSW4gbWFu eSBjYXNlcywgeW91IHdhbnQgdG8gYXBwZW5kIHRvIGEgU3RyaW5nIHdpdGhvdXQgY2hhbmdpbmcg dGhlIHJlY2VpdmVyJ3MgZW5jb2RpbmcuDQoNClRoZSBpc3N1ZSBpc24ndCBleGNsdXNpdmUgdG8g YmluYXJ5IHByb3RvY29scyBhbmQgZm9ybWF0cywgaXQgYWxzbyBoYXBwZW4gd2l0aCBBU0NJSSBw cm90b2NvbHMgdGhhdCBhY2NlcHQgYXJiaXRyYXJ5IGJ5dGVzIGlubGluZSwNCmxpa2UgUmVkaXMn cyBSRVNQIHByb3RvY29sIG9yIGV2ZW4gSFRUUC8xLjEuDQoNCiMjIyBQcmV2aW91cyBkaXNjdXNz aW9uDQoNClRoZXJlIHdhcyBhIHNpbWlsYXIgZmVhdHVyZSByZXF1ZXN0IGEgd2hpbGUgYWdvLCBi dXQgaXQgd2FzIGFiYW5kb25lZDogaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzE0 OTc1DQoNCiMjIyBFeGlzdGluZyBzb2x1dGlvbnMNCg0KWW91IGNhbiBvZiBjb3Vyc2UgYWx3YXlz IGNhc3QgdGhlIHN0cmluZ3MgeW91IGFwcGVuZCB0byBhdm9pZCB0aGlzIHByb2JsZW06DQoNCmBg YHJ1YnkNClBvc3QgPSBTdHJ1Y3QubmV3KDp0aXRsZSwgOmJvZHkpIGRvDQogIGRlZiBzZXJpYWxp emUoYnVmKQ0KICAgIGJ1ZiA8PA0KICAgICAgMjU1IDw8IHRpdGxlLmJ5dGVzaXplIDw8IHRpdGxl LmIgPDwNCiAgICAgIDI1NSA8PCBib2R5LmJ5dGVzaXplIDw8IGJvZHkuYg0KICBlbmQNCmVuZA0K YGBgDQoNCkJ1dCB0aGlzIGNhdXNlIGEgbG90IG9mIG5lZWRsZXNzIGFsbG9jYXRpb25zLg0KDQpZ b3UnZCB0aGluayB5b3UgY291bGQgYWxzbyB1c2UgYGJ5dGVzcGxpY2VgLCBidXQgaXQgYWN0dWFs bHkgaGFzIHRoZSBzYW1lIGlzc3VlOg0KDQpgYGBydWJ5DQpQb3N0ID0gU3RydWN0Lm5ldyg6dGl0 bGUsIDpib2R5KSBkbw0KICBkZWYgc2VyaWFsaXplKGJ1ZikNCiAgICBidWYgPDwgMjU1IDw8IHRp dGxlLmJ5dGVzaXplDQogICAgYnVmLmJ5dGVzcGxpY2UoYnVmLmJ5dGVzaXplLCB0aXRsZS5ieXRl c2l6ZSwgdGl0bGUpDQogICAgYnVmIDw8IDI1NSA8PCBib2R5LmJ5dGVzaXplDQogICAgYnVmLmJ5 dGVzcGxpY2UoYnVmLmJ5dGVzaXplLCBib2R5LmJ5dGVzaXplLCB0aXRsZSkNCiAgZW5kDQplbmQN ClBvc3QubmV3KCJI4oKsbGxvIiwgIlfDtHJsZCIpLnNlcmlhbGl6ZSgic29tZWRhdGEiLmIpICMg PT4gJ1N0cmluZyNieXRlc3BsaWNlJzogaW5jb21wYXRpYmxlIGNoYXJhY3RlciBlbmNvZGluZ3M6 IEJJTkFSWSAoQVNDSUktOEJJVCkgYW5kIFVURi04IChFbmNvZGluZzo6Q29tcGF0aWJpbGl0eUVy cm9yKQ0KYGBgDQoNCkFuZCBldmVuIGlmIGl0IHdvcmtlZCwgaXQgd291bGQgYmUgdmVyeSB1bmVy Z29ub21pYy4NCg0KIyMjIFByb3Bvc2FsOiBhIGBieXRlY29uY2F0YCBtZXRob2QNCg0KQSBzb2x1 dGlvbiB0byB0aGlzIHdvdWxkIGJlIHRvIGFkZCBhIG5ldyBgYnl0ZWNvbmNhdGAgbWV0aG9kLCB0 aGF0IGNvdWxkIGJlIHNoaW1lZCBhczoNCg0KYGBgcnVieQ0KY2xhc3MgU3RyaW5nDQogIGRlZiBi eXRlY29uY2F0KCpzdHJpbmdzKQ0KICAgIHN0cmluZ3MubWFwISBkbyB8c3wNCiAgICAgIGlmIHMu aXNfYT8oU3RyaW5nKSAmJiBzLmVuY29kaW5nICE9IGVuY29kaW5nDQogICAgICAgIHMuZHVwLmZv cmNlX2VuY29kaW5nKGVuY29kaW5nKQ0KICAgICAgZWxzZQ0KICAgICAgICBzDQogICAgICBlbmQN CiAgICBlbmQNCiAgICBjb25jYXQoKnN0cmluZ3MpDQogIGVuZA0KZW5kDQoNClBvc3QgPSBTdHJ1 Y3QubmV3KDp0aXRsZSwgOmJvZHkpIGRvDQogIGRlZiBzZXJpYWxpemUoYnVmKQ0KICAgIGJ1Zi5i eXRlY29uY2F0KA0KICAgICAgMjU1LCB0aXRsZS5ieXRlc2l6ZSwgdGl0bGUsDQogICAgICAyNTUs IGJvZHkuYnl0ZXNpemUsIGJvZHksDQogICAgKQ0KICBlbmQNCmVuZA0KDQpQb3N0Lm5ldygiSOKC rGxsbyIsICJXw7RybGQiKS5zZXJpYWxpemUoInNvbWVkYXRhIi5iKSAjID0+ICJzb21lZGF0YVx4 RkZcYUhceEUyXHg4Mlx4QUNsbG9ceEZGXHgwNldceEMzXHhCNHJsZCIgIzxFbmNvZGluZzpBU0NJ SS04QklUPg0KYGBgDQoNCkJ1dCBvZiBjb3Vyc2UgYSBidWlsdGluIGltcGxlbWVudGF0aW9uIHdv dWxkbid0IG5lZWQgdG8gZHVwIHRoZSBhcmd1bWVudHMuDQoNCkxpa2Ugb3RoZXIgYGJ5dGUqYCBt ZXRob2RzLCBpdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0 aGUgcmVzdWx0aW5nIHN0cmluZyBoYXMgYSB2YWxpZCBlbmNvZGluZywgb3INCnRvIGRlYWwgd2l0 aCBpdCBpZiBub3QuDQoNCiMjIyBNZXRob2QgbmFtZSBhbmQgc2lnbmF0dXJlDQoNCiMjIyMgTmFt ZQ0KDQpUaGlzIHByb3Bvc2FsIHN1Z2dlc3RzIGBTdHJpbmcjYnl0ZWNvbmNhdGAsIHRvIG1pcnJv ciBgU3RyaW5nI2NvbmNhdGAsIGJ1dCBvdGhlciBuYW1lcyBhcmUgcG9zc2libGU6DQoNCiAgLSBg Ynl0ZWFwcGVuZGAgKGxpa2UgYEFycmF5I2FwcGVuZGApDQogIC0gYGJ5dGVwdXNoYCAgKGxpa2Ug YEFycmF5I3B1c2hgKQ0KDQojIyMjIFNpZ25hdHVyZQ0KDQpUaGlzIHByb3Bvc2FsIG1ha2VzIGBi eXRlY29uY2F0YCBhY2NlcHQgZWl0aGVyIGBTdHJpbmdgIG9yIGBJbnRlZ2VyYCAoaW4gY2hhciBy YW5nZSkgYXJndW1lbnRzIGxpa2UgYGNvbmNhdGAuIEkgYmVsaWV2ZSBpdCBtYWtlcyBzZW5zZSBm b3IgY29uc2lzdGVuY3kgYW5kIGFsc28gYmVjYXVzZSBpdCdzIG5vdCB1bmNvbW1vbiBmb3IgcHJv dG9jb2xzIHRvIGhhdmUgc29tZSBieXRlIGJhc2VkIHNlZ21lbnRzLCBhbmQgSW50ZWdlcnMgYXJl IG1vcmUgY29udmVuaWVudCB0aGVyZS4NCg0KVGhlIHByb3Bvc2VkIG1ldGhvZCBhbHNvIGFjY2Vw dCB2YXJpYWJsZSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5IHdpdGggYFN0cmluZyNjb25jYXRg LCBgQXJyYXkjcHVzaGAsIGBBcnJheSNhcHBlbmRgLg0KDQpUaGUgcHJvcG9zZWQgbWV0aG9kIHJl dHVybnMgc2VsZiwgbGlrZSBgY29uY2F0YCBhbmQgb3RoZXJzLg0KDQojIyMgWUpJVCBjb25zaWRl cmF0aW9uDQoNCkkgY29uc3VsdGVkIEBtYXhpbWVjYiBhYm91dCB0aGlzIHByb3Bvc2FsLCBhbmQg YWNjb3JkaW5nIHRvIGhlciwgYWNjZXB0aW5nIHZhcmlhYmxlIGFyZ3VtZW50cyBtYWtlcyBpdCBo YXJkZXIgZm9yIFlKSVQgdG8gb3B0aW1pemUuDQpJIHN1c3BlY3QgY29uc2lzdGVuY3kgd2l0aCBv dGhlciBBUElzIHRydW1wcyB0aGUgcGVyZm9ybWFuY2UgY29uc2lkZXJhdGlvbiwgYnV0IEkgdGhp bmsgaXQncyB3b3J0aCBtZW50aW9uaW5nLg0KDQoNCg0KDQoNCi0tIA0KaHR0cHM6Ly9idWdzLnJ1 YnktbGFuZy5vcmcvDQogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwogcnVieS1jb3JlIG1haWxpbmcgbGlzdCAtLSBydWJ5LWNvcmVAbWwucnVieS1sYW5nLm9y ZwogVG8gdW5zdWJzY3JpYmUgc2VuZCBhbiBlbWFpbCB0byBydWJ5LWNvcmUtbGVhdmVAbWwucnVi eS1sYW5nLm9yZwogcnVieS1jb3JlIGluZm8gLS0gaHR0cHM6Ly9tbC5ydWJ5LWxhbmcub3JnL21h aWxtYW4zL2xpc3RzL3J1YnktY29yZS5tbC5ydWJ5LWxhbmcub3JnLw==