[ruby-core:118735] [Ruby master Feature#20594] A new String method to append bytes while preserving encoding
From:
duerst via ruby-core <ruby-core@...>
Date:
2024-07-30 08:03:12 UTC
List:
ruby-core #118735
SXNzdWUgIzIwNTk0IGhhcyBiZWVuIHVwZGF0ZWQgYnkgZHVlcnN0IChNYXJ0aW4gRMO8cnN0KS4N Cg0KDQpFcmVnb24gKEJlbm9pdCBEYWxvemUpIHdyb3RlIGluICNub3RlLTk6DQoNCj4gTXkgdW5k ZXJzdGFuZGluZyBvZiBgYnl0ZSpgIG1ldGhvZHMgaXMgdGhleSB0cmVhdCB0aGUgU3RyaW5nIGFz IGEgYnl0ZSBhcnJheSwgd2hpY2ggaW1wbGllcyBpbmRpY2VzIGFyZSBqdXN0IGJ5dGUgaW5kaWNl cyBidXQgYWxzbyB0aGF0IHRoZSBlbmNvZGluZyBpcyBpZ25vcmVkIChpdCBzZWVtcyBjbGVhciB3 aGVuIG9uZSBkb2VzIGAiw6kiLmdldGJ5dGUoMClgKS4NCg0KVGhpcyBtYXkgbmVlZCBhIGNvbXBs ZXRlbHkgc2VwYXJhdGUgaXNzdWUsIGJ1dCB3aGVuIEkgaW50cm9kdWNlZCBgU3RyaW5nI2ZvcmNl X2VuY29kaW5nYCwgSSB3YXMgaW1hZ2luaW5nIGFkZGluZyBhIGJsb2NrIHRvIGl0IHNvIHRoYXQg dGhlIGZvcmNlZCBlbmNvZGluZyB3b3VsZCBvbmx5IGFwcGx5IGluc2lkZSB0aGUgYmxvY2suDQoN CmBgYFJ1YnkNCnMgPSAieW91ciBzdHJpbmcgKGUuZy4gVVRGLTggb3Igd2hhdGV2ZXIpIGhlcmUi DQpzLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpIHsNCiAgIyBiaW5hcnkgb3BlcmF0 aW9ucyBnbyBoZXJlDQp9DQpzLmVuY29kaW5nICMgPT4gRW5jb2Rpbmc6VVRGLTgNCmBgYA0KDQpU aGlzIHdvdWxkIHN0cmVhbWxpbmUgdGhpbmdzIHF1aXRlIGEgYml0OyBubyBuZWVkIGZvciBzZXBh cmF0ZSBgYnl0ZSpgIG1ldGhvZHMuIFVzaW5nIGEgYmxvY2sgc2hvdWxkIGFsc28gaGVscCBiZWNh dXNlIGluIG1hbnkgdXNlIGNhc2VzLCB0aGVyZSdzIGJlIG1vcmUgdGhhbiBqdXN0IG9uZSBgYnl0 ZSpgIG1ldGhvZC4NCg0KVGhlIHF1ZXN0aW9uIHRoZW4gd291bGQgb2YgY291cnNlIGJlIGhvdyB0 byBvcHRpbWl6ZSB0aGluZ3MuIEJ1dCB0byBhIGxhcmdlIHBhcnQsIHRoZSBvcHRpbWl6YXRpb25z IGFyZSBhY3R1YWxseSBhbHJlYWR5IGRvbmUsIGJlY2F1c2UgZGlmZmVyZW50IGVuY29kaW5ncyB1 c2UgZGlmZmVyZW50IHByaW1pdGl2ZXMuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCkZlYXR1cmUgIzIwNTk0OiBBIG5ldyBTdHJpbmcgbWV0aG9kIHRvIGFwcGVu ZCBieXRlcyB3aGlsZSBwcmVzZXJ2aW5nIGVuY29kaW5nDQpodHRwczovL2J1Z3MucnVieS1sYW5n Lm9yZy9pc3N1ZXMvMjA1OTQjY2hhbmdlLTEwOTI3NA0KDQoqIEF1dGhvcjogYnlyb290IChKZWFu IEJvdXNzaWVyKQ0KKiBTdGF0dXM6IE9wZW4NCiogQXNzaWduZWU6IGJ5cm9vdCAoSmVhbiBCb3Vz c2llcikNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMjIyBDb250 ZXh0DQoNCldoZW4gd29ya2luZyB3aXRoIGJpbmFyeSBwcm90b2NvbHMgc3VjaCBhcyBgcHJvdG9i dWZgIG9yIGBNZXNzYWdlUGFja2AsIHlvdSBtYXkgb2Z0ZW4gbmVlZCB0byBhc3NlbWJsZSBtdWx0 aXBsZQ0Kc3RyaW5ncyBvZiBkaWZmZXJlbnQgZW5jb2Rpbmc6DQoNCmBgYHJ1YnkNClBvc3QgPSBT dHJ1Y3QubmV3KDp0aXRsZSwgOmJvZHkpIGRvDQogIGRlZiBzZXJpYWxpemUoYnVmKQ0KICAgIGJ1 ZiA8PA0KICAgICAgMjU1IDw8IHRpdGxlLmJ5dGVzaXplIDw8IHRpdGxlIDw8DQogICAgICAyNTUg PDwgYm9keS5ieXRlc2l6ZSA8PCBib2R5DQogIGVuZA0KZW5kDQoNClBvc3QubmV3KCJIZWxsbyIs ICJXb3JsZCIpLnNlcmlhbGl6ZSgic29tZWRhdGEiLmIpICMgPT4gInNvbWVkYXRhXHhGRlx4MDVI ZWxsb1x4RkZceDA1V29ybGQiICM8RW5jb2Rpbmc6QVNDSUktOEJJVD4NCmBgYA0KDQpUaGUgcHJv YmxlbSBpbiB0aGUgYWJvdmUgY2FzZSwgaXMgdGhhdCBiZWNhdXNlIGBFbmNvZGluZzo6QVNDSUlf OEJJVGAgaXMgZGVjbGFyZWQgYXMgQVNDSUkgY29tcGF0aWJsZSwNCmlmIG9uZSBvZiB0aGUgYXBw ZW5kZWQgc3RyaW5nIGNvbnRhaW5zIGJ5dGVzIG91dHNpZGUgdGhlIEFTQ0lJIHJhbmdlLCBzdHJp bmcgaXMgYXV0b21hdGljYWxseSBwcm9tb3RlZA0KdG8gYW5vdGhlciBlbmNvZGluZywgd2hpY2gg dGhlbiBsZWFkcyB0byBlbmNvZGluZyBpc3N1ZXM6DQoNCmBgYHJ1YnkNClBvc3QubmV3KCJI4oKs bGxvIiwgIlfDtHJsZCIpLnNlcmlhbGl6ZSgic29tZWRhdGEiLmIpICMgPT4gaW5jb21wYXRpYmxl IGNoYXJhY3RlciBlbmNvZGluZ3M6IEFTQ0lJLThCSVQgYW5kIFVURi04IChFbmNvZGluZzo6Q29t cGF0aWJpbGl0eUVycm9yKQ0KYGBgDQoNCkluIG1hbnkgY2FzZXMsIHlvdSB3YW50IHRvIGFwcGVu ZCB0byBhIFN0cmluZyB3aXRob3V0IGNoYW5naW5nIHRoZSByZWNlaXZlcidzIGVuY29kaW5nLg0K DQpUaGUgaXNzdWUgaXNuJ3QgZXhjbHVzaXZlIHRvIGJpbmFyeSBwcm90b2NvbHMgYW5kIGZvcm1h dHMsIGl0IGFsc28gaGFwcGVuIHdpdGggQVNDSUkgcHJvdG9jb2xzIHRoYXQgYWNjZXB0IGFyYml0 cmFyeSBieXRlcyBpbmxpbmUsDQpsaWtlIFJlZGlzJ3MgUkVTUCBwcm90b2NvbCBvciBldmVuIEhU VFAvMS4xLg0KDQojIyMgUHJldmlvdXMgZGlzY3Vzc2lvbg0KDQpUaGVyZSB3YXMgYSBzaW1pbGFy IGZlYXR1cmUgcmVxdWVzdCBhIHdoaWxlIGFnbywgYnV0IGl0IHdhcyBhYmFuZG9uZWQ6IGh0dHBz Oi8vYnVncy5ydWJ5LWxhbmcub3JnL2lzc3Vlcy8xNDk3NQ0KDQojIyMgRXhpc3Rpbmcgc29sdXRp b25zDQoNCllvdSBjYW4gb2YgY291cnNlIGFsd2F5cyBjYXN0IHRoZSBzdHJpbmdzIHlvdSBhcHBl bmQgdG8gYXZvaWQgdGhpcyBwcm9ibGVtOg0KDQpgYGBydWJ5DQpQb3N0ID0gU3RydWN0Lm5ldyg6 dGl0bGUsIDpib2R5KSBkbw0KICBkZWYgc2VyaWFsaXplKGJ1ZikNCiAgICBidWYgPDwNCiAgICAg IDI1NSA8PCB0aXRsZS5ieXRlc2l6ZSA8PCB0aXRsZS5iIDw8DQogICAgICAyNTUgPDwgYm9keS5i eXRlc2l6ZSA8PCBib2R5LmINCiAgZW5kDQplbmQNCmBgYA0KDQpCdXQgdGhpcyBjYXVzZSBhIGxv dCBvZiBuZWVkbGVzcyBhbGxvY2F0aW9ucy4NCg0KWW91J2QgdGhpbmsgeW91IGNvdWxkIGFsc28g dXNlIGBieXRlc3BsaWNlYCwgYnV0IGl0IGFjdHVhbGx5IGhhcyB0aGUgc2FtZSBpc3N1ZToNCg0K YGBgcnVieQ0KUG9zdCA9IFN0cnVjdC5uZXcoOnRpdGxlLCA6Ym9keSkgZG8NCiAgZGVmIHNlcmlh bGl6ZShidWYpDQogICAgYnVmIDw8IDI1NSA8PCB0aXRsZS5ieXRlc2l6ZQ0KICAgIGJ1Zi5ieXRl c3BsaWNlKGJ1Zi5ieXRlc2l6ZSwgdGl0bGUuYnl0ZXNpemUsIHRpdGxlKQ0KICAgIGJ1ZiA8PCAy NTUgPDwgYm9keS5ieXRlc2l6ZQ0KICAgIGJ1Zi5ieXRlc3BsaWNlKGJ1Zi5ieXRlc2l6ZSwgYm9k eS5ieXRlc2l6ZSwgdGl0bGUpDQogIGVuZA0KZW5kDQpQb3N0Lm5ldygiSOKCrGxsbyIsICJXw7Ry bGQiKS5zZXJpYWxpemUoInNvbWVkYXRhIi5iKSAjID0+ICdTdHJpbmcjYnl0ZXNwbGljZSc6IGlu Y29tcGF0aWJsZSBjaGFyYWN0ZXIgZW5jb2RpbmdzOiBCSU5BUlkgKEFTQ0lJLThCSVQpIGFuZCBV VEYtOCAoRW5jb2Rpbmc6OkNvbXBhdGliaWxpdHlFcnJvcikNCmBgYA0KDQpBbmQgZXZlbiBpZiBp dCB3b3JrZWQsIGl0IHdvdWxkIGJlIHZlcnkgdW5lcmdvbm9taWMuDQoNCiMjIyBQcm9wb3NhbDog YSBgYnl0ZWNvbmNhdGAgbWV0aG9kDQoNCkEgc29sdXRpb24gdG8gdGhpcyB3b3VsZCBiZSB0byBh ZGQgYSBuZXcgYGJ5dGVjb25jYXRgIG1ldGhvZCwgdGhhdCBjb3VsZCBiZSBzaGltZWQgYXM6DQoN CmBgYHJ1YnkNCmNsYXNzIFN0cmluZw0KICBkZWYgYnl0ZWNvbmNhdCgqc3RyaW5ncykNCiAgICBz dHJpbmdzLm1hcCEgZG8gfHN8DQogICAgICBpZiBzLmlzX2E/KFN0cmluZykgJiYgcy5lbmNvZGlu ZyAhPSBlbmNvZGluZw0KICAgICAgICBzLmR1cC5mb3JjZV9lbmNvZGluZyhlbmNvZGluZykNCiAg ICAgIGVsc2UNCiAgICAgICAgcw0KICAgICAgZW5kDQogICAgZW5kDQogICAgY29uY2F0KCpzdHJp bmdzKQ0KICBlbmQNCmVuZA0KDQpQb3N0ID0gU3RydWN0Lm5ldyg6dGl0bGUsIDpib2R5KSBkbw0K ICBkZWYgc2VyaWFsaXplKGJ1ZikNCiAgICBidWYuYnl0ZWNvbmNhdCgNCiAgICAgIDI1NSwgdGl0 bGUuYnl0ZXNpemUsIHRpdGxlLA0KICAgICAgMjU1LCBib2R5LmJ5dGVzaXplLCBib2R5LA0KICAg ICkNCiAgZW5kDQplbmQNCg0KUG9zdC5uZXcoIkjigqxsbG8iLCAiV8O0cmxkIikuc2VyaWFsaXpl KCJzb21lZGF0YSIuYikgIyA9PiAic29tZWRhdGFceEZGXGFIXHhFMlx4ODJceEFDbGxvXHhGRlx4 MDZXXHhDM1x4QjRybGQiICM8RW5jb2Rpbmc6QVNDSUktOEJJVD4NCmBgYA0KDQpCdXQgb2YgY291 cnNlIGEgYnVpbHRpbiBpbXBsZW1lbnRhdGlvbiB3b3VsZG4ndCBuZWVkIHRvIGR1cCB0aGUgYXJn dW1lbnRzLg0KDQpMaWtlIG90aGVyIGBieXRlKmAgbWV0aG9kcywgaXQncyB0aGUgcmVzcG9uc2li aWxpdHkgb2YgdGhlIGNhbGxlciB0byBlbnN1cmUgdGhlIHJlc3VsdGluZyBzdHJpbmcgaGFzIGEg dmFsaWQgZW5jb2RpbmcsIG9yDQp0byBkZWFsIHdpdGggaXQgaWYgbm90Lg0KDQojIyMgTWV0aG9k IG5hbWUgYW5kIHNpZ25hdHVyZQ0KDQojIyMjIE5hbWUNCg0KVGhpcyBwcm9wb3NhbCBzdWdnZXN0 cyBgU3RyaW5nI2J5dGVjb25jYXRgLCB0byBtaXJyb3IgYFN0cmluZyNjb25jYXRgLCBidXQgb3Ro ZXIgbmFtZXMgYXJlIHBvc3NpYmxlOg0KDQogIC0gYGJ5dGVhcHBlbmRgIChsaWtlIGBBcnJheSNh cHBlbmRgKQ0KICAtIGBieXRlcHVzaGAgIChsaWtlIGBBcnJheSNwdXNoYCkNCg0KIyMjIyBTaWdu YXR1cmUNCg0KVGhpcyBwcm9wb3NhbCBtYWtlcyBgYnl0ZWNvbmNhdGAgYWNjZXB0IGVpdGhlciBg U3RyaW5nYCBvciBgSW50ZWdlcmAgKGluIGNoYXIgcmFuZ2UpIGFyZ3VtZW50cyBsaWtlIGBjb25j YXRgLiBJIGJlbGlldmUgaXQgbWFrZXMgc2Vuc2UgZm9yIGNvbnNpc3RlbmN5IGFuZCBhbHNvIGJl Y2F1c2UgaXQncyBub3QgdW5jb21tb24gZm9yIHByb3RvY29scyB0byBoYXZlIHNvbWUgYnl0ZSBi YXNlZCBzZWdtZW50cywgYW5kIEludGVnZXJzIGFyZSBtb3JlIGNvbnZlbmllbnQgdGhlcmUuDQoN ClRoZSBwcm9wb3NlZCBtZXRob2QgYWxzbyBhY2NlcHQgdmFyaWFibGUgYXJndW1lbnRzIGZvciBj b25zaXN0ZW5jeSB3aXRoIGBTdHJpbmcjY29uY2F0YCwgYEFycmF5I3B1c2hgLCBgQXJyYXkjYXBw ZW5kYC4NCg0KVGhlIHByb3Bvc2VkIG1ldGhvZCByZXR1cm5zIHNlbGYsIGxpa2UgYGNvbmNhdGAg YW5kIG90aGVycy4NCg0KIyMjIFlKSVQgY29uc2lkZXJhdGlvbg0KDQpJIGNvbnN1bHRlZCBAbWF4 aW1lY2IgYWJvdXQgdGhpcyBwcm9wb3NhbCwgYW5kIGFjY29yZGluZyB0byBoZXIsIGFjY2VwdGlu ZyB2YXJpYWJsZSBhcmd1bWVudHMgbWFrZXMgaXQgaGFyZGVyIGZvciBZSklUIHRvIG9wdGltaXpl Lg0KSSBzdXNwZWN0IGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgQVBJcyB0cnVtcHMgdGhlIHBlcmZv cm1hbmNlIGNvbnNpZGVyYXRpb24sIGJ1dCBJIHRoaW5rIGl0J3Mgd29ydGggbWVudGlvbmluZy4N Cg0KDQoNCg0KDQotLSANCmh0dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnLw0KIF9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIHJ1YnktY29yZSBtYWlsaW5nIGxp c3QgLS0gcnVieS1jb3JlQG1sLnJ1YnktbGFuZy5vcmcKIFRvIHVuc3Vic2NyaWJlIHNlbmQgYW4g ZW1haWwgdG8gcnVieS1jb3JlLWxlYXZlQG1sLnJ1YnktbGFuZy5vcmcKIHJ1YnktY29yZSBpbmZv IC0tIGh0dHBzOi8vbWwucnVieS1sYW5nLm9yZy9tYWlsbWFuMy9saXN0cy9ydWJ5LWNvcmUubWwu cnVieS1sYW5nLm9yZy8=