From: Ramon de C Valle Date: 2012-12-12T20:40:44+09:00 Subject: Re: How I can create/extract a variable/hash into the current binding in Ruby? This is a cryptographically signed message in MIME format. --------------ms010200020300000402040606 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi, On 12/12/2012 08:57 AM, Arlen Christian Mart Cuss wrote: > To expand on Jan's comments, note the difference in disassemblies: >=20 >>> puts RubyVM::InstructionSequence.disasm lambda { eval 'x =3D 1'; puts= x } > =3D=3D disasm: = =3D=3D=3D=3D=3D > =3D=3D catch table > | catch type: redo st: 0000 ed: 0028 sp: 0000 cont: 0000 > | catch type: next st: 0000 ed: 0028 sp: 0000 cont: 0028 > |----------------------------------------------------------------------= -- > 0000 trace 1 (= 3) > 0002 putself =20 > 0003 putstring "x =3D 1" > 0005 send :eval, 1, nil, 8, > 0011 pop =20 > 0012 trace 1 > 0014 putself =20 > 0015 putself =20 > 0016 send :x, 0, nil, 24, > 0022 send :puts, 1, nil, 8, > 0028 leave =20 > =3D> nil >>> puts RubyVM::InstructionSequence.disasm lambda { x =3D nil; eval 'x =3D= > 1'; puts x } > =3D=3D disasm: = =3D=3D=3D=3D=3D > =3D=3D catch table > | catch type: redo st: 0000 ed: 0030 sp: 0000 cont: 0000 > | catch type: next st: 0000 ed: 0030 sp: 0000 cont: 0030 > |----------------------------------------------------------------------= -- > local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1] s= 1) > [ 2] x =20 > 0000 trace 1 (= 4) > 0002 putnil =20 > 0003 setdynamic x, 0 > 0006 trace 1 > 0008 putself =20 > 0009 putstring "x =3D 1" > 0011 send :eval, 1, nil, 8, > 0017 pop =20 > 0018 trace 1 > 0020 putself =20 > 0021 getdynamic x, 0 > 0024 send :puts, 1, nil, 8, > 0030 leave =20 > =3D> nil >=20 > In the first instance, the parser decides that, having seen no local x,= > it must be a function call, and so "0016 send :x, 0, nil, 24, " i= s > emitted. >=20 > In the second, having already seen an x ("0003 setdynamic x, 0"), it > knows that it is referring to the local var, so it emits "0021 > getdynamic x, 0" instead of a call. >=20 > Unfortunately, there's no in between where it could refer to either a > local or function, because the compiler needs to know all > locally-referable variables in order to emit the instructions; > "setdynamic x, 0" is actually "setdynamic 2, 0" (note the 'local table'= > before the instructions in the second disassembly, and the total lack o= f > same in the first one), which is why local variables are so fast; > they're just direct offsets from the local frame pointer > ("= environment > pointer" as of June 2012 > ). >=20 > So, in short, VM constraints are responsible for this being impossible.= > You could either just say 'a =3D b =3D c =3D d =3D =E2=80=A6 =3D nil' b= efore your > hash.extract to make them findable, or find a possibly "more Ruby" way.= :) Thank you for the additional information! Any suggestions of a possible "more Ruby" way of doing this? >=20 > =E2=80=94 Arlen >=20 >=20 > On Wed, Dec 12, 2012 at 9:23 PM, Jan E. > wrote: >=20 > Hi, >=20 > I'm no expert on this stuff, but I think it's a problem of the Ruby= > interpreter determining variables while it parses the code: >=20 > eval 'x =3D 1' > puts x >=20 > This doesn't work, because the parser doesn't "see" the eval stuff.= It > doesn't find an assignment for "x", so it assumes it's a method (wh= ich > leads to a NameError). >=20 > If, however, you set "x" to an arbitrary value beforehands, it corr= ectly > regognizes "x" as a variable: >=20 > x =3D nil > eval 'x =3D 1' > puts x >=20 > Apart from the technical stuff: I don't find it a good idea to just= dump > variables into a binding, because it's just too much "magic". It ma= kes > it hard to keep track of which variable has which value. And I can'= t > think of any good reason to do that when you're programming > object-oriented. >=20 > Did you get the idea from PHP? Because that language is notorious f= or > dumping values into all kinds of contexts, which has lead and still= > leads to gigantic security problems. >=20 > -- > Posted via http://www.ruby-forum.com/. >=20 >=20 --=20 Ramon de C Valle / Red Hat Product Security Team --------------ms010200020300000402040606 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIMSDCC BVIwggQ6oAMCAQICEAqzP+sBemOzul4+4fzvl/kwDQYJKoZIhvcNAQEFBQAwgd0xCzAJBgNV BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 c3QgTmV0d29yazE7MDkGA1UECxMyVGVybXMgb2YgdXNlIGF0IGh0dHBzOi8vd3d3LnZlcmlz aWduLmNvbS9ycGEgKGMpMDkxHjAcBgNVBAsTFVBlcnNvbmEgTm90IFZhbGlkYXRlZDE3MDUG A1UEAxMuVmVyaVNpZ24gQ2xhc3MgMSBJbmRpdmlkdWFsIFN1YnNjcmliZXIgQ0EgLSBHMzAe Fw0xMjA0MjQwMDAwMDBaFw0xMzA0MjQyMzU5NTlaMIIBFTEXMBUGA1UEChMOVmVyaVNpZ24s IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxRjBEBgNVBAsTPXd3dy52 ZXJpc2lnbi5jb20vcmVwb3NpdG9yeS9SUEEgSW5jb3JwLiBieSBSZWYuLExJQUIuTFREKGMp OTgxHjAcBgNVBAsTFVBlcnNvbmEgTm90IFZhbGlkYXRlZDEzMDEGA1UECxMqRGlnaXRhbCBJ RCBDbGFzcyAxIC0gTmV0c2NhcGUgRnVsbCBTZXJ2aWNlMRkwFwYDVQQDFBBSYW1vbiBkZSBD IFZhbGxlMSEwHwYJKoZIhvcNAQkBFhJyY3ZhbGxlQHJlZGhhdC5jb20wggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCtHIDnFV/HlKm9UnSRo6izQmlNfDgekHNzCaDbb91myLVY gYhZ0LGIjZGwQL5/biXWhKNudbn7wVX3w+RLplA3rRzId/pC/uOuw1NBljRwFRPFxPXNvnqz +aZUP+23mYNiFfKqFTNKP73D08k6FxCFwtqNWvKKdBqFA1PAQjs3vIAmn8gk/h21sN9CDn7I wO87OdfRrFPChpyJxCgBTVcfUlEK1xcMjbQSM8nNw15AkgkITDmxEclu3aehXViKEzWAiOmd B6oYN5Jo3Oh58PvjvWQlX07qPlJJ1XKJeZ8CpA4i7iNC7BXtFH15YzDb/Pw8VxqwhiAuyACA SqCFuNp1AgMBAAGjgdIwgc8wCQYDVR0TBAIwADBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBxcB MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwCwYDVR0PBAQD AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMEBggrBgEFBQcDAjBQBgNVHR8ESTBHMEWgQ6BBhj9o dHRwOi8vaW5kYzFkaWdpdGFsaWQtZzMtY3JsLnZlcmlzaWduLmNvbS9JbmRDMURpZ2l0YWxJ RC1HMy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAJkX3S0O1NP8uJa6rDOVBnsxGDyq/nMzOroc VVCKrmfsyQ48gcWBqo77QciFnzo04eaMa8uEajGdJwl7z8M0OrNTmNvNeUETE44RhEObHtBo /1+HoVh2sGbxHD82rqwFxyTZOk9A7/mTqbjqwAZF3YkvL4QhKoLAjvLqs7fWjYTIZWMoej5k PCzuHdvVc4pFLwkzjhx04IW5PozTPVnp+Ik2AaCieHn/gAsMYtglHs4OdXmbePxS2vU3Lf3O bfWE8Axgq+dwwYgUtLXR5LaA5FaMutUjcJg0ZrzzAtxyrh8MNeJmdNuHVot3eQgSsvIlo+cT d699EQKDq0uowKmnd9IwggbuMIIF1qADAgECAhBxFWYFSuSRIU3pvET5rNPcMA0GCSqGSIb3 DQEBBQUAMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENs YXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw0w OTA1MDEwMDAwMDBaFw0xOTA0MzAyMzU5NTlaMIHdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNV BAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTA5 MR4wHAYDVQQLExVQZXJzb25hIE5vdCBWYWxpZGF0ZWQxNzA1BgNVBAMTLlZlcmlTaWduIENs YXNzIDEgSW5kaXZpZHVhbCBTdWJzY3JpYmVyIENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQDtxEffKigdfAZru9chMslsE4/psY1BTjT32gvjavpliCALERPpm+BJ Totv1QHQXw1HkYpaTHQ+P8aRCbtMNJ6NbqGCUWL3aXZYlgevnhQYB09avZ/SMbJUGXNGahlC EewScyGN9dwwzeXZVgoxxTZtKRSXvS3aiUcZiNhLBD3rtjxnHnQAEw3QhtqTZ/gzA64aPGtp ePbALI7hgz93+Zn//p9SWsK0hwrYbKlHwVQpZUM+SsCWH8Gt93evbLEEXr7BtpQtl5AtJ9K7 HumDaoT2xLKuIwZlJqUnWCsHIrRvpmJIGnfy1VAnminTlvso9bokdmLjjFnr+27VQsS+Qcf1 AgMBAAGjggK5MIICtTA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3Nw LnZlcmlzaWduLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEAMHAGA1UdIARpMGcwZQYLYIZIAYb4 RQEHFwEwVjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL2NwczAqBggr BgEFBQcCAjAeGhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwudmVyaXNpZ24uY29tL3BjYTEtZzMuY3JsMA4GA1UdDwEB/wQEAwIB BjBuBggrBgEFBQcBDARiMGChXqBcMFowWDBWFglpbWFnZS9naWYwITAfMAcGBSsOAwIaBBRL a7kolgYMu9BSOJsprEsHiyEFGDAmFiRodHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dv MS5naWYwLgYDVR0RBCcwJaQjMCExHzAdBgNVBAMTFlByaXZhdGVMYWJlbDQtMjA0OC0xMTgw HQYDVR0OBBYEFHlHYQhB/TgEokvntcz1Q/ZJKxH4MIHxBgNVHSMEgekwgeahgdCkgc0wgcox CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMSBQdWJs aWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczghEAi1t1VoRUhQsAz684 SM6xpDANBgkqhkiG9w0BAQUFAAOCAQEAOU3PQZmBtakFtVI46TmEiWzkNKha59hsCUwkGrpZ pIc7cyHxk4HPv2hjWmf+NYUrocNdo0rCOhndMNbMTe/x0oGXylRaQ783i3qOGY0PQ6iM8q9g sxWKs5WcPOCesyeYpDVyF+X8Kl2H04oNwtFFKvjA9KwqkzrVrhJwCOv7O+J37OgrZDV2zbra 4NHLFNZxWJu+1T59ttnoJMUkZkxdkR92sxc+fw3GIYkvsze4of9csm1J3mVSQvsOiNLtSh2/ S+P4zHL6SA5ljknI1viZmDu3lD4xcQaH+mxZUy7X3yvtX2MArBXtA7hVFozGaAPnIqhzC7G8 oNpSWN0KDn/BgjGCBOwwggToAgEBMIHyMIHdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVy aVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsT MlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTA5MR4w HAYDVQQLExVQZXJzb25hIE5vdCBWYWxpZGF0ZWQxNzA1BgNVBAMTLlZlcmlTaWduIENsYXNz IDEgSW5kaXZpZHVhbCBTdWJzY3JpYmVyIENBIC0gRzMCEAqzP+sBemOzul4+4fzvl/kwCQYF Kw4DAhoFAKCCAs4wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcN MTIxMjEyMTE0MDM5WjAjBgkqhkiG9w0BCQQxFgQUJNj36BiIMV6HEafKdohte9ScDJwwXwYJ KoZIhvcNAQkPMVIwUDALBglghkgBZQMEAQIwCgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCA MA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEoMIIBAwYJKwYBBAGCNxAE MYH1MIHyMIHdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBo dHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTA5MR4wHAYDVQQLExVQZXJzb25hIE5v dCBWYWxpZGF0ZWQxNzA1BgNVBAMTLlZlcmlTaWduIENsYXNzIDEgSW5kaXZpZHVhbCBTdWJz Y3JpYmVyIENBIC0gRzMCEAqzP+sBemOzul4+4fzvl/kwggEFBgsqhkiG9w0BCRACCzGB9aCB 8jCB3TELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6 Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykwOTEeMBwGA1UECxMVUGVyc29uYSBOb3QgVmFs aWRhdGVkMTcwNQYDVQQDEy5WZXJpU2lnbiBDbGFzcyAxIEluZGl2aWR1YWwgU3Vic2NyaWJl ciBDQSAtIEczAhAKsz/rAXpjs7pePuH875f5MA0GCSqGSIb3DQEBAQUABIIBAGT/uYdecO5i reQ6j6hF52WZgmk7qBjmdx0H7Tvy2UrzRul8eddbvAsOflK7C8az7jA9aGDXMcjMmGRiBbs5 XZg5rr7EAal4naowN5ByhG0dA1X9+Lf6E2RGo+gwFiEN9S6yoxeUrTbaPWm3EgBEN4tNKAkt 8Gx1a04UdPP8cWJu25uDRR/F7ABOE7mMsr3/yXrT6WaolGnieeyR+XDX8jZwNXex0ffUkWh+ nmEYMgWi4LR/BKytkBbVH53Bcn6ky2xaA45jpTxwVKivPlvy+GXfeuO52XLWNrKx1sCGBA23 8FevrrRa5DlKjjXkrJ4Idyf7LTuFGnNPqbOBF9klVWEAAAAAAAA= --------------ms010200020300000402040606--