From: "Florian Groß" Date: 2005-07-11T05:44:22+09:00 Subject: Re: [SOLUTION] SerializableProc (#38) --------------060202010105010009040807 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Robin Stocker wrote: > Here's my solution... And mine's attached to this mail. I wrote this a while ago and it works by extracting a proc's origin file name and line number from its .inspect string and using the source code (which usually does not have to be read from disc) -- it works with procs generated in IRB, eval() calls and regular files. It does not work from ruby -e and stuff like "foo".instance_eval "lambda {}".source probably doesn't work either. Usage: code = lambda { puts "Hello World" } puts code.source Marshal.load(Marshal.dump(code)).call YAML.load(code.to_yaml).call --------------060202010105010009040807 Content-Type: application/x-ruby; name="proc_source.rb" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="proc_source.rb" cmVxdWlyZSAnc3RyaW5naW8nDQpyZXF1aXJlICdpcmIvcnVieS1sZXgnDQoNCiMgVGVsbCB0 aGUgcnVieSBpbnRlcnByZXRlciB0byBsb2FkIGNvZGUgbGluZXMgb2YgcmVxdWlyZWQgZmls ZXMNCiMgaW50byB0aGlzIGZpbGVuYW1lIC0+IGxpbmVzIEhhc2guIFRoaXMgYmVoYXZpb3Vy IHNlZW1zIHRvIGJlDQojIHZlcnkgdW5kb2N1bWVudGVkIGFuZCB0aGVyZWZvcmUgc2hvdWxk bid0IHJlYWxseSBiZSByZWxpZWQgb24uDQpTQ1JJUFRfTElORVNfXyA9IHt9IHVubGVzcyBk ZWZpbmVkPyBTQ1JJUFRfTElORVNfXw0KDQptb2R1bGUgUHJvY1NvdXJjZQ0KICBkZWYgZ2V0 X2xpbmVzKGZpbGVuYW1lLCBzdGFydF9saW5lID0gMCkNCiAgICBjYXNlIGZpbGVuYW1lDQog ICAgICAjIHNwZWNpYWwgIihpcmIpIiBkZXNjcmlwdG9yPw0KICAgICAgd2hlbiAiKGlyYiki DQogICAgICAgIElSQi5jb25mWzpNQUlOX0NPTlRFWFRdLmlvLmxpbmUoc3RhcnRfbGluZSAu LiAtMSkNCiAgICAgICMgc3BlY2lhbCAiKGV2YWwuLi4pIiBkZXNjcmlwdG9yPw0KICAgICAg d2hlbiAvXlwoZXZhbC4rXCkkLw0KICAgICAgICBFVkFMX0xJTkVTX19bZmlsZW5hbWVdW3N0 YXJ0X2xpbmUgLi4gLTFdDQogICAgICAjIHJlZ3VsYXIgZmlsZQ0KICAgICAgZWxzZQ0KICAg ICAgICAjIFJ1YnkgYWxyZWFkeSBwYXJzZWQgdGhpcyBmaWxlPyAoc2VlIGRpc2NsYWltZXIg YWJvdmUpDQogICAgICAgIGlmIGxpbmVzID0gU0NSSVBUX0xJTkVTX19bZmlsZW5hbWVdDQog ICAgICAgICAgbGluZXNbKHN0YXJ0X2xpbmUgLSAxKSAuLiAtMV0NCiAgICAgICAgIyBJZiB0 aGUgZmlsZSBleGlzdHMgd2UncmUgZ29pbmcgdG8gdHJ5IHJlYWRpbmcgaXQgaW4NCiAgICAg ICAgZWxzaWYgRmlsZS5leGlzdD8oZmlsZW5hbWUpDQogICAgICAgICAgYmVnaW4NCiAgICAg ICAgICAgIEZpbGUucmVhZGxpbmVzKGZpbGVuYW1lKVsoc3RhcnRfbGluZSAtIDEpIC4uIC0x XQ0KICAgICAgICAgIHJlc2N1ZQ0KICAgICAgICAgICAgbmlsDQogICAgICAgICAgZW5kDQog ICAgICAgIGVuZA0KICAgIGVuZA0KICBlbmQNCg0KICBkZWYgaGFuZGxlKHByb2MpDQogICAg ZmlsZW5hbWUsIGxpbmUgPSBwcm9jLnNvdXJjZV9kZXNjcmlwdG9yDQogICAgbGluZXMgPSBn ZXRfbGluZXMoZmlsZW5hbWUsIGxpbmUpIHx8IFtdDQoNCiAgICBsZXhlciA9IFJ1YnlMZXgu bmV3DQogICAgbGV4ZXIuc2V0X2lucHV0KFN0cmluZ0lPLm5ldyhsaW5lcy5qb2luKSkNCg0K ICAgIHN0YXRlID0gOmJlZm9yZV9jb25zdHJ1Y3Rvcg0KICAgIG5lc3RpbmdfbGV2ZWwgPSAx DQogICAgc3RhcnRfdG9rZW4sIGVuZF90b2tlbiA9IG5pbCwgbmlsDQogICAgZm91bmQgPSBm YWxzZQ0KICAgIHdoaWxlIHRva2VuID0gbGV4ZXIudG9rZW4NCiAgICAgICMgd2UndmUgbm90 IHlldCBmb3VuZCBhbnkgcHJvYy1jb25zdHJ1Y3RvciAtLSB3ZSdsbCB0cnkgdG8gZmluZCBv bmUuDQogICAgICBpZiBbOmJlZm9yZV9jb25zdHJ1Y3RvciwgOmNoZWNrX21vcmVdLmluY2x1 ZGU/KHN0YXRlKQ0KICAgICAgICAjIGNoZWNraW5nIG1vcmUgYW5kIG5ld2xpbmU/IC0+IGRv bmUNCiAgICAgICAgaWYgdG9rZW4uaXNfYT8oUnVieVRva2VuOjpUa05MKSBhbmQgc3RhdGUg PT0gOmNoZWNrX21vcmUNCiAgICAgICAgICBzdGF0ZSA9IDpkb25lDQogICAgICAgICAgYnJl YWsNCiAgICAgICAgZW5kDQogICAgICAgICMgdG9rZW4gaXMgUHJvYz8NCiAgICAgICAgaWYg dG9rZW4uaXNfYT8oUnVieVRva2VuOjpUa0NPTlNUQU5UKSBhbmQNCiAgICAgICAgICAgdG9r ZW4uaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAbmFtZSkgPT0gIlByb2MiDQogICAgICAgICAg IyBtZXRob2QgY2FsbD8NCiAgICAgICAgICBpZiBsZXhlci50b2tlbi5pc19hPyhSdWJ5VG9r ZW46OlRrRE9UKQ0KICAgICAgICAgICAgbWV0aG9kID0gbGV4ZXIudG9rZW4NCiAgICAgICAg ICAgICMgY29uc3RydWN0b3I/DQogICAgICAgICAgICBpZiBtZXRob2QuaXNfYT8oUnVieVRv a2VuOjpUa0lERU5USUZJRVIpIGFuZA0KICAgICAgICAgICAgICAgbWV0aG9kLmluc3RhbmNl X3ZhcmlhYmxlX2dldCg6QG5hbWUpID09ICJuZXciDQogICAgICAgICAgICAgIHVubGVzcyBz dGF0ZSA9PSA6Y2hlY2tfbW9yZQ0KICAgICAgICAgICAgICAgICMgb2theSwgY29kZSB3aWxs IGZvbGxvdyBzb29uLg0KICAgICAgICAgICAgICAgIHN0YXRlID0gOmJlZm9yZV9jb2RlDQog ICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAjIG11bHRpcGxlIHByb2NzIG9u IG9uZSBsaW5lDQogICAgICAgICAgICAgICAgcmV0dXJuDQogICAgICAgICAgICAgIGVuZA0K ICAgICAgICAgICAgZW5kDQogICAgICAgICAgZW5kDQogICAgICAgICMgdG9rZW4gaXMgbGFt YmRhIG9yIHByb2MgY2FsbD8NCiAgICAgICAgZWxzaWYgdG9rZW4uaXNfYT8oUnVieVRva2Vu OjpUa0lERU5USUZJRVIpIGFuZA0KICAgICAgICAgICAgICAld3twcm9jIGxhbWJkYX0uaW5j bHVkZT8odG9rZW4uaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAbmFtZSkpDQogICAgICAgICAg dW5sZXNzIHN0YXRlID09IDpjaGVja19tb3JlDQogICAgICAgICAgICAjIG9rYXksIGNvZGUg d2lsbCBmb2xsb3cgc29vbi4NCiAgICAgICAgICAgIHN0YXRlID0gOmJlZm9yZV9jb2RlDQog ICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgIyBtdWx0aXBsZSBwcm9jcyBvbiBvbmUgbGlu ZQ0KICAgICAgICAgICAgcmV0dXJuDQogICAgICAgICAgZW5kDQogICAgICAgIGVuZA0KDQog ICAgICAjIHdlJ3JlIHdhaXRpbmcgZm9yIHRoZSBjb2RlIHN0YXJ0IHRvIGFwcGVhci4NCiAg ICAgIGVsc2lmIHN0YXRlID09IDpiZWZvcmVfY29kZQ0KICAgICAgICBpZiB0b2tlbi5pc19h PyhSdWJ5VG9rZW46OlRrZkxCUkFDRSkgb3IgdG9rZW4uaXNfYT8oUnVieVRva2VuOjpUa0RP KQ0KICAgICAgICAgICMgZm91bmQgdGhlIGNvZGUgc3RhcnQsIHVwZGF0ZSBzdGF0ZSBhbmQg cmVtZW1iZXIgY3VycmVudCB0b2tlbg0KICAgICAgICAgIHN0YXRlID0gOmluX2NvZGUNCiAg ICAgICAgICBzdGFydF90b2tlbiA9IHRva2VuDQogICAgICAgIGVuZA0KDQogICAgICAjIG9r YXksIHdlJ3JlIGluc2lkZSBjb2RlDQogICAgICBlbHNpZiBzdGF0ZSA9PSA6aW5fY29kZQ0K ICAgICAgICBpZiB0b2tlbi5pc19hPyhSdWJ5VG9rZW46OlRrUkJSQUNFKSBvciB0b2tlbi5p c19hPyhSdWJ5VG9rZW46OlRrRU5EKQ0KICAgICAgICAgIG5lc3RpbmdfbGV2ZWwgLT0gMQ0K ICAgICAgICAgIGlmIG5lc3RpbmdfbGV2ZWwgPT0gMA0KICAgICAgICAgICAgIyB3ZSdyZSBk b25lIQ0KICAgICAgICAgICAgZW5kX3Rva2VuID0gdG9rZW4NCiAgICAgICAgICAgICMgcGFy c2UgYW5vdGhlciB0aW1lIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBwcm9jcyBv biBvbmUgbGluZQ0KICAgICAgICAgICAgIyB3ZSBjYW4ndCBoYW5kbGUgdGhhdCBjYXNlIGNv cnJlY3RseSBzbyB3ZSByZXR1cm4gbm8gc291cmNlIGNvZGUgYXQgYWxsDQogICAgICAgICAg ICBzdGF0ZSA9IDpjaGVja19tb3JlDQogICAgICAgICAgZW5kDQogICAgICAgIGVsc2lmIHRv a2VuLmlzX2E/KFJ1YnlUb2tlbjo6VGtmTEJSQUNFKSBvciB0b2tlbi5pc19hPyhSdWJ5VG9r ZW46OlRrRE8pIG9yDQogICAgICAgICAgICAgIHRva2VuLmlzX2E/KFJ1YnlUb2tlbjo6VGtC RUdJTikgb3IgdG9rZW4uaXNfYT8oUnVieVRva2VuOjpUa0NBU0UpIG9yDQogICAgICAgICAg ICAgIHRva2VuLmlzX2E/KFJ1YnlUb2tlbjo6VGtDTEFTUykgb3IgdG9rZW4uaXNfYT8oUnVi eVRva2VuOjpUa0RFRikgb3INCiAgICAgICAgICAgICAgdG9rZW4uaXNfYT8oUnVieVRva2Vu OjpUa0ZPUikgb3IgdG9rZW4uaXNfYT8oUnVieVRva2VuOjpUa0lGKSBvcg0KICAgICAgICAg ICAgICB0b2tlbi5pc19hPyhSdWJ5VG9rZW46OlRrTU9EVUxFKSBvciB0b2tlbi5pc19hPyhS dWJ5VG9rZW46OlRrVU5MRVNTKSBvcg0KICAgICAgICAgICAgICB0b2tlbi5pc19hPyhSdWJ5 VG9rZW46OlRrVU5USUwpIG9yIHRva2VuLmlzX2E/KFJ1YnlUb2tlbjo6VGtXSElMRSkgb3IN CiAgICAgICAgICAgICAgdG9rZW4uaXNfYT8oUnVieVRva2VuOjpUa2xCRUdJTikNCiAgICAg ICAgICBuZXN0aW5nX2xldmVsICs9IDENCiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICBl bmQNCg0KICAgIGlmIHN0YXJ0X3Rva2VuIGFuZCBlbmRfdG9rZW4NCiAgICAgIHN0YXJ0X2xp bmUsIGVuZF9saW5lID0gc3RhcnRfdG9rZW4ubGluZV9ubyAtIDEsIGVuZF90b2tlbi5saW5l X25vIC0gMSANCiAgICAgIHNvdXJjZSA9IGxpbmVzW3N0YXJ0X2xpbmUgLi4gZW5kX2xpbmVd DQogICAgICBzdGFydF9vZmZzZXQgPSBzdGFydF90b2tlbi5jaGFyX25vDQogICAgICBzdGFy dF9vZmZzZXQgKz0gMSBpZiBzdGFydF90b2tlbi5pc19hPyhSdWJ5VG9rZW46OlRrRE8pDQog ICAgICBlbmRfb2Zmc2V0ID0gLShzb3VyY2UubGFzdC5sZW5ndGggLSBlbmRfdG9rZW4uY2hh cl9ubykNCiAgICAgIHNvdXJjZS5maXJzdC5zbGljZSEoMCAuLiBzdGFydF9vZmZzZXQpDQog ICAgICBzb3VyY2UubGFzdC5zbGljZSEoZW5kX29mZnNldCAuLiAtMSkNCg0KICAgICAgIyBD YW4ndCB1c2UgLnN0cmlwIGJlY2F1c2UgbmV3bGluZSBhdCBlbmQgb2YgY29kZSBtaWdodCBi ZSBpbXBvcnRhbnQNCiAgICAgICMgKFN0dWZmIHdvdWxkIGJyZWFrIHdoZW4gc29tZWJvZHkg ZG9lcyBwcm9jIHsgLi4uICNmb29cbn0pDQogICAgICBwcm9jLnNvdXJjZSA9IHNvdXJjZS5q b2luLmdzdWIoL14gfCAkLywgIiIpDQogICAgZW5kDQogIGVuZA0KDQogIG1vZHVsZV9mdW5j dGlvbiA6aGFuZGxlLCA6Z2V0X2xpbmVzDQplbmQNCg0KY2xhc3MgUHJvYw0KICBkZWYgc291 cmNlX2Rlc2NyaXB0b3INCiAgICBpZiBtZCA9IC9eIzxQcm9jOjB4WzAtOUEtRmEtZl0rQCgu Kyk6KFxkKyk+JC8ubWF0Y2gob2xkX2luc3BlY3QpDQogICAgICBmaWxlbmFtZSwgbGluZSA9 IG1kLmNhcHR1cmVzDQogICAgICByZXR1cm4gZmlsZW5hbWUsIGxpbmUudG9faQ0KICAgIGVu ZA0KICBlbmQNCg0KICBhdHRyX2FjY2Vzc29yIDpzb3VyY2UNCiAgZGVmIHNvdXJjZQ0KICAg IFByb2NTb3VyY2UuaGFuZGxlKHNlbGYpIHVubGVzcyBAc291cmNlDQogICAgQHNvdXJjZQ0K ICBlbmQNCg0KICBhbGlhcyA6b2xkX2luc3BlY3QgOmluc3BlY3QNCiAgZGVmIGluc3BlY3QN CiAgICBpZiBzb3VyY2UNCiAgICAgICJwcm9jIHsje3NvdXJjZX19Ig0KICAgIGVsc2UNCiAg ICAgIG9sZF9pbnNwZWN0DQogICAgZW5kDQogIGVuZA0KDQogIGRlZiA9PShvdGhlcikNCiAg ICBpZiBzZWxmLnNvdXJjZSBhbmQgb3RoZXIuc291cmNlDQogICAgICBzZWxmLnNvdXJjZSA9 PSBvdGhlci5zb3VyY2UNCiAgICBlbHNlDQogICAgICBzZWxmLmlkID09IG90aGVyLmlkDQog ICAgZW5kDQogIGVuZA0KDQogIGRlZiBfZHVtcChkZXB0aCA9IDApDQogICAgaWYgc291cmNl DQogICAgICBzb3VyY2UNCiAgICBlbHNlDQogICAgICByYWlzZShUeXBlRXJyb3IsICJDYW4n dCBzZXJpYWxpemUgUHJvYyB3aXRoIHVua25vd24gc291cmNlIGNvZGUuIikNCiAgICBlbmQN CiAgZW5kDQoNCiAgZGVmIHRvX3lhbWwoKmFyZ3MpDQogICAgc2VsZi5zb3VyY2UgIyBmb3Jj ZSBAc291cmNlIHRvIGJlIHNldA0KICAgIHN1cGVyLnN1Yigib2JqZWN0OlByb2MiLCAicHJv YyIpDQogIGVuZA0KDQogIGRlZiBzZWxmLmFsbG9jYXRlOyBmcm9tX3N0cmluZyAiIjsgZW5k DQoNCiAgZGVmIHNlbGYuZnJvbV9zdHJpbmcoc3RyaW5nKQ0KICAgIHJlc3VsdCA9IGV2YWwo InByb2MgeyN7c3RyaW5nfX0iKQ0KICAgIHJlc3VsdC5zb3VyY2UgPSBzdHJpbmcNCiAgICBy ZXR1cm4gcmVzdWx0DQogIGVuZA0KDQogIGRlZiBzZWxmLl9sb2FkKGNvZGUpDQogICAgc2Vs Zi5mcm9tX3N0cmluZyhjb2RlKQ0KICBlbmQNCg0KICBkZWYgc2VsZi5tYXJzaGFsX2xvYWQ7 IGVuZA0KICBkZWYgbWFyc2hhbF9sb2FkOyBlbmQNCmVuZA0KDQpyZXF1aXJlICd5YW1sJw0K WUFNTC5hZGRfcnVieV90eXBlKC9ecHJvYy8pIGRvIHx0eXBlLCB2YWx8DQogIFByb2MuZnJv bV9zdHJpbmcodmFsWyJzb3VyY2UiXSkNCmVuZA0KDQpFVkFMX0xJTkVTX18gPSBIYXNoLm5l dw0KDQphbGlhcyA6b2xkX2V2YWwgOmV2YWwNCmRlZiBldmFsKGNvZGUsICphcmdzKQ0KICBj b250ZXh0LCBkZXNjcmlwdG9yLCBzdGFydF9saW5lLCAqbW9yZSA9ICphcmdzDQogIGRlc2Ny aXB0b3IgfHw9ICIoZXZhbCN7Y29kZS5oYXNofSkiDQogIHN0YXJ0X2xpbmUgfHw9IDANCiAg bGluZXMgfHw9IGNvZGUuZ3JlcCgvLiovKQ0KICBFVkFMX0xJTkVTX19bZGVzY3JpcHRvcl0g fHw9IEFycmF5Lm5ldw0KICBFVkFMX0xJTkVTX19bZGVzY3JpcHRvcl1bc3RhcnRfbGluZSwg bGluZXMubGVuZ3RoXSA9IGxpbmVzDQogIG9sZF9ldmFsKGNvZGUsIGNvbnRleHQsIGRlc2Ny aXB0b3IsIHN0YXJ0X2xpbmUsICptb3JlKQ0KZW5kDQoNCg0KaWYgX19GSUxFX18gPT0gJDAg dGhlbg0KICByZXF1aXJlICJwc3RvcmUiDQoNCiAgY29kZSA9IGxhbWJkYSB7IHB1dHMgIkhl bGxvIFdvcmxkISIgfQ0KDQogIEZpbGUub3BlbigicHJvYy5tYXJzaGFsbGVkIiwgInciKSB7 IHxmaWxlfCBNYXJzaGFsLmR1bXAoY29kZSwgZmlsZSkgfQ0KICBjb2RlID0gRmlsZS5vcGVu KCJwcm9jLm1hcnNoYWxsZWQiKSB7IHxmaWxlfCBNYXJzaGFsLmxvYWQoZmlsZSkgfQ0KDQog IGNvZGUuY2FsbA0KDQogIHN0b3JlID0gUFN0b3JlLm5ldygicHJvYy5wc3RvcmUiKQ0KICBz dG9yZS50cmFuc2FjdGlvbiBkbw0KICAgIHN0b3JlWyJwcm9jIl0gPSBjb2RlDQogIGVuZA0K ICBzdG9yZS50cmFuc2FjdGlvbiBkbw0KICAgIGNvZGUgPSBzdG9yZVsicHJvYyJdDQogIGVu ZA0KDQogIGNvZGUuY2FsbA0KDQogIEZpbGUub3BlbigicHJvYy55YW1sIiwgInciKSB7IHxm aWxlfCBZQU1MLmR1bXAoY29kZSwgZmlsZSkgfQ0KICBjb2RlID0gRmlsZS5vcGVuKCJwcm9j LnlhbWwiKSB7IHxmaWxlfCBZQU1MLmxvYWQoZmlsZSkgfQ0KDQogIGNvZGUuY2FsbA0KZW5k DQo= --------------060202010105010009040807--