[ruby-core:118560] [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 10:54:58 UTC
List:
ruby-core #118560
SXNzdWUgIzIwNTk0IGhhcyBiZWVuIHVwZGF0ZWQgYnkgRXJlZ29uIChCZW5vaXQgRGFsb3plKS4N Cg0KDQptYW1lIChZdXN1a2UgRW5kb2gpIHdyb3RlIGluICNub3RlLTc6DQo+IEV4aXN0aW5nIG1l dGhvZHMgd2l0aCBieXRlLXByZWZpeCAoU3RyaW5nI2J5dGVpbmRleCwgI2J5dGVzcGxpdGUsIGV0 Yy4pIG1lYW4gdGhhdCB0aGUgdW5pdCBvZiBvZmZzZXQgb3Igc2l6ZSBpcyBpbiBieXRlLg0KDQpN eSB1bmRlcnN0YW5kaW5nIG9mIGBieXRlKmAgbWV0aG9kcyBpcyB0aGV5IHRyZWF0IHRoZSBTdHJp bmcgYXMgYSBieXRlIGFycmF5LCB3aGljaCBpbXBsaWVzIGluZGljZXMgYXJlIGp1c3QgYnl0ZSBp bmRpY2VzIGJ1dCBhbHNvIHRoYXQgdGhlIGVuY29kaW5nIGlzIGlnbm9yZWQgKGl0IHNlZW1zIGNs ZWFyIHdoZW4gb25lIGRvZXMgYCLDqSIuZ2V0Ynl0ZSgwKWApLg0KSXQncyAoYWxtb3N0KSBhcy1p ZiB0aGUgc3RyaW5nIGhhZCB0aGUgQklOQVJZIGVuY29kaW5nIGZvciB0aGUgZHVyYXRpb24gb2Yg dGhlIG9wZXJhdGlvbiwgYnV0IHdpdGhvdXQgdGhlIG92ZXJoZWFkIHRvIHN3aXRjaCB0byBCSU5B UlkgYW5kIGJhY2sgKHdoaWNoIG5vdGFibHkgY291bGQgY2F1c2Ugc29tZSBleHRyYSBjb2RlIHJh bmdlIGNvbXB1dGF0aW9uLCBldGMpLg0KQlRXLCBJIHdvdWxkIGNvbnNpZGVyIGBlYWNoX2J5dGVg IGFsc28gYSBgYnl0ZSpgIG1ldGhvZCwgYW5kIHRoYXQgb25lIGRvZXMgbm90IGFjY2VwdCBvciBw YXNzIGJ5dGUgaW5kaWNlcy4NCg0KU28gSSB0aGluayBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIGV4 dGVuZCB0aGUgbWVhbmluZyBvZiBgYnl0ZSpgIG1ldGhvZHMgdG8gYmUgYSBsaXR0bGUgbW9yZSBn ZW5lcmFsLCBqdXN0IGxpa2UgSSBleHBsYWluZWQgYWJvdmUuDQpJIGRvbid0IHRoaW5rIGl0IHdh cyBkb2N1bWVudGVkIHRvIGJlIG9ubHkgYWJvdXQgYnl0ZSBpbmRpY2VzIGVpdGhlci4NCg0KVGhh dCBzYWlkLCBJIHRoaW5rIGBTdHJpbmcjYXBwZW5kX2J5dGVzKFN0cmluZylgIHNvdW5kcyBmaW5l IHRvby4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRmVhdHVy ZSAjMjA1OTQ6IEEgbmV3IFN0cmluZyBtZXRob2QgdG8gYXBwZW5kIGJ5dGVzIHdoaWxlIHByZXNl cnZpbmcgZW5jb2RpbmcNCmh0dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnL2lzc3Vlcy8yMDU5NCNj aGFuZ2UtMTA5MDgzDQoNCiogQXV0aG9yOiBieXJvb3QgKEplYW4gQm91c3NpZXIpDQoqIFN0YXR1 czogT3Blbg0KKiBBc3NpZ25lZTogYnlyb290IChKZWFuIEJvdXNzaWVyKQ0KLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyMjIENvbnRleHQNCg0KV2hlbiB3b3JraW5n IHdpdGggYmluYXJ5IHByb3RvY29scyBzdWNoIGFzIGBwcm90b2J1ZmAgb3IgYE1lc3NhZ2VQYWNr YCwgeW91IG1heSBvZnRlbiBuZWVkIHRvIGFzc2VtYmxlIG11bHRpcGxlDQpzdHJpbmdzIG9mIGRp ZmZlcmVudCBlbmNvZGluZzoNCg0KYGBgcnVieQ0KUG9zdCA9IFN0cnVjdC5uZXcoOnRpdGxlLCA6 Ym9keSkgZG8NCiAgZGVmIHNlcmlhbGl6ZShidWYpDQogICAgYnVmIDw8DQogICAgICAyNTUgPDwg dGl0bGUuYnl0ZXNpemUgPDwgdGl0bGUgPDwNCiAgICAgIDI1NSA8PCBib2R5LmJ5dGVzaXplIDw8 IGJvZHkNCiAgZW5kDQplbmQNCg0KUG9zdC5uZXcoIkhlbGxvIiwgIldvcmxkIikuc2VyaWFsaXpl KCJzb21lZGF0YSIuYikgIyA9PiAic29tZWRhdGFceEZGXHgwNUhlbGxvXHhGRlx4MDVXb3JsZCIg IzxFbmNvZGluZzpBU0NJSS04QklUPg0KYGBgDQoNClRoZSBwcm9ibGVtIGluIHRoZSBhYm92ZSBj YXNlLCBpcyB0aGF0IGJlY2F1c2UgYEVuY29kaW5nOjpBU0NJSV84QklUYCBpcyBkZWNsYXJlZCBh cyBBU0NJSSBjb21wYXRpYmxlLA0KaWYgb25lIG9mIHRoZSBhcHBlbmRlZCBzdHJpbmcgY29udGFp bnMgYnl0ZXMgb3V0c2lkZSB0aGUgQVNDSUkgcmFuZ2UsIHN0cmluZyBpcyBhdXRvbWF0aWNhbGx5 IHByb21vdGVkDQp0byBhbm90aGVyIGVuY29kaW5nLCB3aGljaCB0aGVuIGxlYWRzIHRvIGVuY29k aW5nIGlzc3VlczoNCg0KYGBgcnVieQ0KUG9zdC5uZXcoIkjigqxsbG8iLCAiV8O0cmxkIikuc2Vy aWFsaXplKCJzb21lZGF0YSIuYikgIyA9PiBpbmNvbXBhdGlibGUgY2hhcmFjdGVyIGVuY29kaW5n czogQVNDSUktOEJJVCBhbmQgVVRGLTggKEVuY29kaW5nOjpDb21wYXRpYmlsaXR5RXJyb3IpDQpg YGANCg0KSW4gbWFueSBjYXNlcywgeW91IHdhbnQgdG8gYXBwZW5kIHRvIGEgU3RyaW5nIHdpdGhv dXQgY2hhbmdpbmcgdGhlIHJlY2VpdmVyJ3MgZW5jb2RpbmcuDQoNClRoZSBpc3N1ZSBpc24ndCBl eGNsdXNpdmUgdG8gYmluYXJ5IHByb3RvY29scyBhbmQgZm9ybWF0cywgaXQgYWxzbyBoYXBwZW4g d2l0aCBBU0NJSSBwcm90b2NvbHMgdGhhdCBhY2NlcHQgYXJiaXRyYXJ5IGJ5dGVzIGlubGluZSwN Cmxpa2UgUmVkaXMncyBSRVNQIHByb3RvY29sIG9yIGV2ZW4gSFRUUC8xLjEuDQoNCiMjIyBQcmV2 aW91cyBkaXNjdXNzaW9uDQoNClRoZXJlIHdhcyBhIHNpbWlsYXIgZmVhdHVyZSByZXF1ZXN0IGEg d2hpbGUgYWdvLCBidXQgaXQgd2FzIGFiYW5kb25lZDogaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5v cmcvaXNzdWVzLzE0OTc1DQoNCiMjIyBFeGlzdGluZyBzb2x1dGlvbnMNCg0KWW91IGNhbiBvZiBj b3Vyc2UgYWx3YXlzIGNhc3QgdGhlIHN0cmluZ3MgeW91IGFwcGVuZCB0byBhdm9pZCB0aGlzIHBy b2JsZW06DQoNCmBgYHJ1YnkNClBvc3QgPSBTdHJ1Y3QubmV3KDp0aXRsZSwgOmJvZHkpIGRvDQog IGRlZiBzZXJpYWxpemUoYnVmKQ0KICAgIGJ1ZiA8PA0KICAgICAgMjU1IDw8IHRpdGxlLmJ5dGVz aXplIDw8IHRpdGxlLmIgPDwNCiAgICAgIDI1NSA8PCBib2R5LmJ5dGVzaXplIDw8IGJvZHkuYg0K ICBlbmQNCmVuZA0KYGBgDQoNCkJ1dCB0aGlzIGNhdXNlIGEgbG90IG9mIG5lZWRsZXNzIGFsbG9j YXRpb25zLg0KDQpZb3UnZCB0aGluayB5b3UgY291bGQgYWxzbyB1c2UgYGJ5dGVzcGxpY2VgLCBi dXQgaXQgYWN0dWFsbHkgaGFzIHRoZSBzYW1lIGlzc3VlOg0KDQpgYGBydWJ5DQpQb3N0ID0gU3Ry dWN0Lm5ldyg6dGl0bGUsIDpib2R5KSBkbw0KICBkZWYgc2VyaWFsaXplKGJ1ZikNCiAgICBidWYg PDwgMjU1IDw8IHRpdGxlLmJ5dGVzaXplDQogICAgYnVmLmJ5dGVzcGxpY2UoYnVmLmJ5dGVzaXpl LCB0aXRsZS5ieXRlc2l6ZSwgdGl0bGUpDQogICAgYnVmIDw8IDI1NSA8PCBib2R5LmJ5dGVzaXpl DQogICAgYnVmLmJ5dGVzcGxpY2UoYnVmLmJ5dGVzaXplLCBib2R5LmJ5dGVzaXplLCB0aXRsZSkN CiAgZW5kDQplbmQNClBvc3QubmV3KCJI4oKsbGxvIiwgIlfDtHJsZCIpLnNlcmlhbGl6ZSgic29t ZWRhdGEiLmIpICMgPT4gJ1N0cmluZyNieXRlc3BsaWNlJzogaW5jb21wYXRpYmxlIGNoYXJhY3Rl ciBlbmNvZGluZ3M6IEJJTkFSWSAoQVNDSUktOEJJVCkgYW5kIFVURi04IChFbmNvZGluZzo6Q29t cGF0aWJpbGl0eUVycm9yKQ0KYGBgDQoNCkFuZCBldmVuIGlmIGl0IHdvcmtlZCwgaXQgd291bGQg YmUgdmVyeSB1bmVyZ29ub21pYy4NCg0KIyMjIFByb3Bvc2FsOiBhIGBieXRlY29uY2F0YCBtZXRo b2QNCg0KQSBzb2x1dGlvbiB0byB0aGlzIHdvdWxkIGJlIHRvIGFkZCBhIG5ldyBgYnl0ZWNvbmNh dGAgbWV0aG9kLCB0aGF0IGNvdWxkIGJlIHNoaW1lZCBhczoNCg0KYGBgcnVieQ0KY2xhc3MgU3Ry aW5nDQogIGRlZiBieXRlY29uY2F0KCpzdHJpbmdzKQ0KICAgIHN0cmluZ3MubWFwISBkbyB8c3wN CiAgICAgIGlmIHMuaXNfYT8oU3RyaW5nKSAmJiBzLmVuY29kaW5nICE9IGVuY29kaW5nDQogICAg ICAgIHMuZHVwLmZvcmNlX2VuY29kaW5nKGVuY29kaW5nKQ0KICAgICAgZWxzZQ0KICAgICAgICBz DQogICAgICBlbmQNCiAgICBlbmQNCiAgICBjb25jYXQoKnN0cmluZ3MpDQogIGVuZA0KZW5kDQoN ClBvc3QgPSBTdHJ1Y3QubmV3KDp0aXRsZSwgOmJvZHkpIGRvDQogIGRlZiBzZXJpYWxpemUoYnVm KQ0KICAgIGJ1Zi5ieXRlY29uY2F0KA0KICAgICAgMjU1LCB0aXRsZS5ieXRlc2l6ZSwgdGl0bGUs DQogICAgICAyNTUsIGJvZHkuYnl0ZXNpemUsIGJvZHksDQogICAgKQ0KICBlbmQNCmVuZA0KDQpQ b3N0Lm5ldygiSOKCrGxsbyIsICJXw7RybGQiKS5zZXJpYWxpemUoInNvbWVkYXRhIi5iKSAjID0+ ICJzb21lZGF0YVx4RkZcYUhceEUyXHg4Mlx4QUNsbG9ceEZGXHgwNldceEMzXHhCNHJsZCIgIzxF bmNvZGluZzpBU0NJSS04QklUPg0KYGBgDQoNCkJ1dCBvZiBjb3Vyc2UgYSBidWlsdGluIGltcGxl bWVudGF0aW9uIHdvdWxkbid0IG5lZWQgdG8gZHVwIHRoZSBhcmd1bWVudHMuDQoNCkxpa2Ugb3Ro ZXIgYGJ5dGUqYCBtZXRob2RzLCBpdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVy IHRvIGVuc3VyZSB0aGUgcmVzdWx0aW5nIHN0cmluZyBoYXMgYSB2YWxpZCBlbmNvZGluZywgb3IN CnRvIGRlYWwgd2l0aCBpdCBpZiBub3QuDQoNCiMjIyBNZXRob2QgbmFtZSBhbmQgc2lnbmF0dXJl DQoNCiMjIyMgTmFtZQ0KDQpUaGlzIHByb3Bvc2FsIHN1Z2dlc3RzIGBTdHJpbmcjYnl0ZWNvbmNh dGAsIHRvIG1pcnJvciBgU3RyaW5nI2NvbmNhdGAsIGJ1dCBvdGhlciBuYW1lcyBhcmUgcG9zc2li bGU6DQoNCiAgLSBgYnl0ZWFwcGVuZGAgKGxpa2UgYEFycmF5I2FwcGVuZGApDQogIC0gYGJ5dGVw dXNoYCAgKGxpa2UgYEFycmF5I3B1c2hgKQ0KDQojIyMjIFNpZ25hdHVyZQ0KDQpUaGlzIHByb3Bv c2FsIG1ha2VzIGBieXRlY29uY2F0YCBhY2NlcHQgZWl0aGVyIGBTdHJpbmdgIG9yIGBJbnRlZ2Vy YCAoaW4gY2hhciByYW5nZSkgYXJndW1lbnRzIGxpa2UgYGNvbmNhdGAuIEkgYmVsaWV2ZSBpdCBt YWtlcyBzZW5zZSBmb3IgY29uc2lzdGVuY3kgYW5kIGFsc28gYmVjYXVzZSBpdCdzIG5vdCB1bmNv bW1vbiBmb3IgcHJvdG9jb2xzIHRvIGhhdmUgc29tZSBieXRlIGJhc2VkIHNlZ21lbnRzLCBhbmQg SW50ZWdlcnMgYXJlIG1vcmUgY29udmVuaWVudCB0aGVyZS4NCg0KVGhlIHByb3Bvc2VkIG1ldGhv ZCBhbHNvIGFjY2VwdCB2YXJpYWJsZSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5IHdpdGggYFN0 cmluZyNjb25jYXRgLCBgQXJyYXkjcHVzaGAsIGBBcnJheSNhcHBlbmRgLg0KDQpUaGUgcHJvcG9z ZWQgbWV0aG9kIHJldHVybnMgc2VsZiwgbGlrZSBgY29uY2F0YCBhbmQgb3RoZXJzLg0KDQojIyMg WUpJVCBjb25zaWRlcmF0aW9uDQoNCkkgY29uc3VsdGVkIEBtYXhpbWVjYiBhYm91dCB0aGlzIHBy b3Bvc2FsLCBhbmQgYWNjb3JkaW5nIHRvIGhlciwgYWNjZXB0aW5nIHZhcmlhYmxlIGFyZ3VtZW50 cyBtYWtlcyBpdCBoYXJkZXIgZm9yIFlKSVQgdG8gb3B0aW1pemUuDQpJIHN1c3BlY3QgY29uc2lz dGVuY3kgd2l0aCBvdGhlciBBUElzIHRydW1wcyB0aGUgcGVyZm9ybWFuY2UgY29uc2lkZXJhdGlv biwgYnV0IEkgdGhpbmsgaXQncyB3b3J0aCBtZW50aW9uaW5nLg0KDQoNCg0KDQoNCi0tIA0KaHR0 cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvDQogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwogcnVieS1jb3JlIG1haWxpbmcgbGlzdCAtLSBydWJ5LWNvcmVAbWwu cnVieS1sYW5nLm9yZwogVG8gdW5zdWJzY3JpYmUgc2VuZCBhbiBlbWFpbCB0byBydWJ5LWNvcmUt bGVhdmVAbWwucnVieS1sYW5nLm9yZwogcnVieS1jb3JlIGluZm8gLS0gaHR0cHM6Ly9tbC5ydWJ5 LWxhbmcub3JnL21haWxtYW4zL2xpc3RzL3J1YnktY29yZS5tbC5ydWJ5LWxhbmcub3JnLw==