{"id":56,"date":"2010-11-30T22:39:09","date_gmt":"2010-12-01T06:39:09","guid":{"rendered":"http:\/\/www.mirandabanda.org\/cogblog\/?p=56"},"modified":"2010-11-30T22:39:09","modified_gmt":"2010-12-01T06:39:09","slug":"sometimes-smalltalk-is-truly-awesome-1","status":"publish","type":"post","link":"http:\/\/www.mirandabanda.org\/cogblog\/2010\/11\/30\/sometimes-smalltalk-is-truly-awesome-1\/","title":{"rendered":"Sometimes Smalltalk is truly awesome #1"},"content":{"rendered":"<p><html><head><\/head><body>Occasionally I find myself able to do something in Smalltalk that I think is truly fabulous, not because I&#8217;m a fabulous Smalltalk programmer, but because a live reflective pure object system provides such fabulous ease.  Today was one such example.  I&#8217;m working on a new code generator for the Cog VM and it (cough) has a few bugs.  In debugging it I needed to see what the correct execution of the following method is for a particular input:<\/p>\n<pre>    <i>Bitmap methods for filing<\/i>\r\n    <b>decompress:<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">bm<\/font><font color=\"#000000\"> <\/font><b>fromByteArray:<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">ba<\/font><font color=\"#000000\"> <\/font><b>at:<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">index<\/font>\r\n        <font color=\"#008080\">&quot;Decompress the body of a byteArray encoded by compressToByteArray (qv)...<\/font>\r\n        <font color=\"#008080\">The format is simply a sequence of run-coded pairs, {N D}*.<\/font>\r\n            <font color=\"#008080\">N is a run-length * 4 + data code.<\/font>\r\n            <font color=\"#008080\">D, the data, depends on the data code...<\/font>\r\n                <font color=\"#008080\">0<\/font>    <font color=\"#008080\">skip N words, D is absent<\/font>\r\n                    <font color=\"#008080\">(could be used to skip from one raster line to the next)<\/font>\r\n                <font color=\"#008080\">1<\/font>    <font color=\"#008080\">N words with all 4 bytes = D (1 byte)<\/font>\r\n                <font color=\"#008080\">2<\/font>    <font color=\"#008080\">N words all = D (4 bytes)<\/font>\r\n                <font color=\"#008080\">3<\/font>    <font color=\"#008080\">N words follow in D (4N bytes)<\/font>\r\n            <font color=\"#008080\">S and N are encoded as follows (see decodeIntFrom:)...<\/font>\r\n                <font color=\"#008080\">0-223<\/font>    <font color=\"#008080\">0-223<\/font>\r\n                <font color=\"#008080\">224-254<\/font>    <font color=\"#008080\">(0-30)*256 + next byte (0-7935)<\/font>\r\n                <font color=\"#008080\">255<\/font>        <font color=\"#008080\">next 4 bytes&quot;<\/font>    \r\n        <font color=\"#008080\">&quot;NOTE:  If fed with garbage, this routine could read past the end of ba, but it should fail before writing past the ned of bm.&quot;<\/font>\r\n        <font color=\"#808080\">|<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">code<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">n<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">anInt<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">end<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">k<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">pastEnd<\/font><font color=\"#000000\"> <\/font><font color=\"#808080\">|<\/font>\r\n        <font color=\"#000000\">&lt;<\/font><font color=\"#008000\"><b>primitive:<\/b><\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">'primitiveDecompressFromByteArray'<\/font><font color=\"#000000\"> <\/font><font color=\"#008000\"><b>module:<\/b><\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">'MiscPrimitivePlugin'<\/font><font color=\"#000000\">&gt;<\/font>\r\n        <font color=\"#000000\">&lt;<\/font><font color=\"#008000\"><b>var:<\/b><\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">#bm<\/font><font color=\"#000000\"> <\/font><font color=\"#008000\"><b>declareC:<\/b><\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">'int *bm'<\/font><font color=\"#000000\">&gt;<\/font>\r\n        <font color=\"#000000\">&lt;<\/font><font color=\"#008000\"><b>var:<\/b><\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">#ba<\/font><font color=\"#000000\"> <\/font><font color=\"#008000\"><b>declareC:<\/b><\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">'unsigned char *ba'<\/font><font color=\"#000000\">&gt;<\/font>\r\n        <font color=\"#6B6767\">i<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">index<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#008080\">&quot;byteArray read index&quot;<\/font>\r\n        <font color=\"#6B6767\">end<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">ba<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">size<\/font><font color=\"#000000\">.<\/font>\r\n        <font color=\"#6B6767\">k<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#800000\">1<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#008080\">&quot;bitmap write index&quot;<\/font>\r\n        <font color=\"#6B6767\">pastEnd<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">bm<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">size<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">+<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">1<\/font><font color=\"#000000\">.<\/font>\r\n        <font color=\"#000000\">[<\/font><font color=\"#6B6767\">i<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">&lt;=<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">end<\/font><font color=\"#000000\">]<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">whileTrue:<\/font>\r\n            <font color=\"#000000\">[<\/font><font color=\"#008080\">&quot;Decode next run start N&quot;<\/font>\r\n            <font color=\"#6B6767\">anInt<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">ba<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">at:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000080\">+<\/font><font color=\"#800000\">1<\/font><font color=\"#000000\">.<\/font>\r\n            <font color=\"#6B6767\">anInt<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">&lt;=<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">223<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">ifFalse:<\/font>\r\n                <font color=\"#008000\">[<\/font><font color=\"#6B6767\">anInt<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">&lt;=<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">254<\/font>\r\n                    <font color=\"#000080\">ifTrue:<\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">[<\/font><font color=\"#6B6767\">anInt<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#800000\">(<\/font><font color=\"#6B6767\">anInt<\/font><font color=\"#000080\">-<\/font><font color=\"#800000\">224<\/font><font color=\"#800000\">)<\/font><font color=\"#000080\">*<\/font><font color=\"#800000\">256<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">+<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">(<\/font><font color=\"#000080\">ba<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">at:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#800000\">)<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000080\">+<\/font><font color=\"#800000\">1<\/font><font color=\"#800080\">]<\/font>\r\n                    <font color=\"#000080\">ifFalse:<\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">[<\/font><font color=\"#6B6767\">anInt<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#800000\">0<\/font><font color=\"#000000\">.<\/font>\r\n                            <font color=\"#800000\">1<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">to:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">4<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">do:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">[<\/font><font color=\"#000000\">:<\/font><font color=\"#000080\">j<\/font><font color=\"#000000\"> <\/font><font color=\"#808080\">|<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">anInt<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#00EB00\">(<\/font><font color=\"#6B6767\">anInt<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bitShift:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">8<\/font><font color=\"#00EB00\">)<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">+<\/font><font color=\"#000000\"> <\/font><font color=\"#00EB00\">(<\/font><font color=\"#000080\">ba<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">at:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#00EB00\">)<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000080\">+<\/font><font color=\"#800000\">1<\/font><font color=\"#800000\">]<\/font><font color=\"#800080\">]<\/font><font color=\"#008000\">]<\/font><font color=\"#000000\">.<\/font>\r\n            <font color=\"#6B6767\">n<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">anInt<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">&gt;&gt;<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">2<\/font><font color=\"#000000\">.<\/font>\r\n            <font color=\"#008000\">(<\/font><font color=\"#6B6767\">k<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">+<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">n<\/font><font color=\"#008000\">)<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">&gt;<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">pastEnd<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">ifTrue:<\/font><font color=\"#000000\"> <\/font><font color=\"#008000\">[<\/font><font color=\"#800000\">^<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">self<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">primitiveFail<\/font><font color=\"#008000\">]<\/font><font color=\"#000000\">.<\/font>\r\n            <font color=\"#6B6767\">code<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">anInt<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bitAnd:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">3<\/font><font color=\"#000000\">.<\/font>\r\n            <font color=\"#6B6767\">code<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">=<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">0<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">ifTrue:<\/font><font color=\"#000000\"> <\/font><font color=\"#008000\">[<\/font><font color=\"#008080\">&quot;skip&quot;<\/font><font color=\"#008000\">]<\/font><font color=\"#000000\">.<\/font>\r\n            <font color=\"#6B6767\">code<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">=<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">1<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">ifTrue:<\/font><font color=\"#000000\"> <\/font><font color=\"#008000\">[<\/font><font color=\"#008080\">&quot;n consecutive words of 4 bytes = the following byte&quot;<\/font>\r\n                            <font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">ba<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">at:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000080\">+<\/font><font color=\"#800000\">1<\/font><font color=\"#000000\">.<\/font>\r\n                            <font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bitOr:<\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">(<\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bitShift:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">8<\/font><font color=\"#800080\">)<\/font><font color=\"#000000\">.<\/font>\r\n                            <font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bitOr:<\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">(<\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bitShift:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">16<\/font><font color=\"#800080\">)<\/font><font color=\"#000000\">.<\/font>\r\n                            <font color=\"#800000\">1<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">to:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">n<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">do:<\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">[<\/font><font color=\"#000000\">:<\/font><font color=\"#000080\">j<\/font><font color=\"#000000\"> <\/font><font color=\"#808080\">|<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bm<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">at:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">k<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">put:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#6B6767\">k<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">k<\/font><font color=\"#000080\">+<\/font><font color=\"#800000\">1<\/font><font color=\"#800080\">]<\/font><font color=\"#008000\">]<\/font><font color=\"#000000\">.<\/font>\r\n            <font color=\"#6B6767\">code<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">=<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">2<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">ifTrue:<\/font><font color=\"#000000\"> <\/font><font color=\"#008000\">[<\/font><font color=\"#008080\">&quot;n consecutive words = 4 following bytes&quot;<\/font>\r\n                            <font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#800000\">0<\/font><font color=\"#000000\">.<\/font>\r\n                            <font color=\"#800000\">1<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">to:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">4<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">do:<\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">[<\/font><font color=\"#000000\">:<\/font><font color=\"#000080\">j<\/font><font color=\"#000000\"> <\/font><font color=\"#808080\">|<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#800000\">(<\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bitShift:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">8<\/font><font color=\"#800000\">)<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bitOr:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">(<\/font><font color=\"#000080\">ba<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">at:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#800000\">)<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000080\">+<\/font><font color=\"#800000\">1<\/font><font color=\"#800080\">]<\/font><font color=\"#000000\">.<\/font>\r\n                            <font color=\"#800000\">1<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">to:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">n<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">do:<\/font><font color=\"#000000\"> <\/font><font color=\"#800080\">[<\/font><font color=\"#000000\">:<\/font><font color=\"#000080\">j<\/font><font color=\"#000000\"> <\/font><font color=\"#808080\">|<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bm<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">at:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">k<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">put:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#6B6767\">k<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">k<\/font><font color=\"#000080\">+<\/font><font color=\"#800000\">1<\/font><font color=\"#800080\">]<\/font><font color=\"#008000\">]<\/font><font color=\"#000000\">.<\/font>\r\n            <font color=\"#6B6767\">code<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">=<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">3<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">ifTrue:<\/font><font color=\"#000000\"> <\/font><font color=\"#008000\">[<\/font><font color=\"#008080\">&quot;n consecutive words from the data...&quot;<\/font>\r\n                            <font color=\"#800000\">1<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">to:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">n<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">do:<\/font>\r\n                                <font color=\"#800080\">[<\/font><font color=\"#000000\">:<\/font><font color=\"#000080\">m<\/font><font color=\"#000000\"> <\/font><font color=\"#808080\">|<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#800000\">0<\/font><font color=\"#000000\">.<\/font>\r\n                                <font color=\"#800000\">1<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">to:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">4<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">do:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">[<\/font><font color=\"#000000\">:<\/font><font color=\"#000080\">j<\/font><font color=\"#000000\"> <\/font><font color=\"#808080\">|<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#00EB00\">(<\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bitShift:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">8<\/font><font color=\"#00EB00\">)<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">bitOr:<\/font><font color=\"#000000\"> <\/font><font color=\"#00EB00\">(<\/font><font color=\"#000080\">ba<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">at:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#00EB00\">)<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">i<\/font><font color=\"#000080\">+<\/font><font color=\"#800000\">1<\/font><font color=\"#800000\">]<\/font><font color=\"#000000\">.<\/font>\r\n                                <font color=\"#000080\">bm<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">at:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">k<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">put:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">data<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#6B6767\">k<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#6B6767\">k<\/font><font color=\"#000080\">+<\/font><font color=\"#800000\">1<\/font><font color=\"#800080\">]<\/font><font color=\"#008000\">]<\/font><font color=\"#000000\">]<\/font><\/pre>\n<p>From my VM simulator I printed out the ByteArray that was being decompressed incorrectly by the jitted code generated by my new code generator (the new code was invoking primitiveFail in the above). &nbsp;So now I wanted to trace through execution of the above in the debugger so I could see what the values of local variables should be in a correct execution to identify the location of the error as opposed to the location of its symptom. &nbsp;So I na&iuml;vely debug evaluated the following:<\/p>\n<pre>    Bitmap decompressFromByteArray: #[ 16r10 16r27 16rC0 16r0 16r0 16r0 16rE0 16r0 16r0 16r0 16rF0 16r0 16r0 16r0 16rF8 16r0\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16r0 16r0 16rFC 16r0 16r0 16r0 16rFE 16r0 16r0 16r0 16rFF 16r0 16r0 16r0 16rFF 16r80\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16r0 16r0 16rFF 16r0 16r0 16r0 16rA 16rFE 16r0 16r0 16r0 16rB 16rCF 16r0 16r0 16r0\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16rF 16r0 16r0 16r0 16rA 16r7 16r80 16r0 16r0 16r7 16r3 16r0 16r0 16r0]<\/pre>\n<p>and stepped into the activation of the following method:<\/p>\n<pre>    <i>Bitmap class methods for instance creation<\/i><b>\r\n<\/b>    <b>decompressFromByteArray:<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">byteArray<\/font><font color=\"#000000\">\r\n<\/font>        <font color=\"#808080\">|<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">s<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">bitmap<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">size<\/font><font color=\"#000000\"> <\/font><font color=\"#808080\">|<\/font><font color=\"#000000\">\r\n<\/font>        <font color=\"#6B6767\">s<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#000000\">ReadStream<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">on:<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">byteArray<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">\r\n<\/font>        <font color=\"#6B6767\">size<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#800000\">self<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">decodeIntFrom:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">s<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">\r\n<\/font>        <font color=\"#6B6767\">bitmap<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#800000\">self<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">new:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">size<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">\r\n<\/font>        <font color=\"#6B6767\">bitmap<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">decompress:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">bitmap<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">fromByteArray:<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">byteArray<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">at:<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">s<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">position<\/font><font color=\"#000080\">+<\/font><font color=\"#800000\">1<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">\r\n<\/font>        <font color=\"#800000\">^<\/font><font color=\"#000000\"> <\/font><font color=\"#6B6767\">bitmap<\/font><\/pre>\n<p><font color=\"#6B6767\"><br \/>\n<\/font><br \/>\nSo far so good.  But when I tried to step into the Bitmap&gt;&gt;#decompress:fromByteArray:at: method the debugger of course evaluated the primitive that is in the VM, primitiveDecompressFromByteArray (which just happens to get generated from the above by the VMMaker, but that&#8217;s a different story).  What the debugger didn&#8217;t do, quite correctly, is evaluate the non-primitive method, starting at  <font color=\"#6B6767\">i<\/font><font color=\"#000000\"> <\/font><b>:=<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">index<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\">  <\/font><font color=\"#008080\">&quot;byteArray read index&quot;<\/font>, the actual Smalltalk code whose execution I wanted to observe.<\/p>\n<p>This is where things turn awesome.  Since Smalltalk has first-class activation records I can actually create an activation of the above method poised to start execution at the first bytecode, hence <i>after<\/i> the evaluation of the primitive.  Here&#8217;s how.  In the debugger window I evaluated<\/p>\n<pre>    thisContext swapSender: (MethodContext\r\n                                            sender: ThisContext\r\n                                            receiver: bitmap\r\n                                            method: (Bitmap&gt;&gt;#decompress:fromByteArray:at:)\r\n                                            arguments: {bitmap. byteArray. s position + 1 }).\r\n    self halt<\/pre>\n<p>What&#8217;s going on here? &nbsp;First, the debugger allows me to access the local variables of the activation I&#8217;m debugging, from within a script evaluated in the debugger (neat!).   If you look at the script in the debugger you see it translated into:<\/p>\n<pre>    <b>DoItIn:<\/b><font color=\"#000000\"> <\/font><font color=\"#000080\">ThisContext<\/font><font color=\"#000000\"> <\/font>\r\n        <font color=\"#800000\">thisContext<\/font>\r\n            <font color=\"#000080\">swapSender:<\/font><font color=\"#000000\"> <\/font><font color=\"#000000\">(<\/font><font color=\"#000000\">MethodContext<\/font>\r\n                    <font color=\"#000080\">sender:<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">ThisContext<\/font>\r\n                    <font color=\"#000080\">receiver:<\/font><font color=\"#000000\"> <\/font><font color=\"#008000\">(<\/font><font color=\"#000080\">ThisContext<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">namedTempAt:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">3<\/font><font color=\"#008000\">)<\/font>\r\n                    <font color=\"#000080\">method:<\/font><font color=\"#000000\"> <\/font><font color=\"#000000\">Bitmap<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">&gt;&gt;<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">#decompress:fromByteArray:at:<\/font>\r\n                    <font color=\"#000080\">arguments:<\/font><font color=\"#000000\"> <\/font><font color=\"#000000\">{<\/font><font color=\"#000080\">ThisContext<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">namedTempAt:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">3<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">ThisContext<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">namedTempAt:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">1<\/font><font color=\"#000000\">.<\/font><font color=\"#000000\"> <\/font><font color=\"#008000\">(<\/font><font color=\"#000080\">ThisContext<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">namedTempAt:<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">2<\/font><font color=\"#008000\">)<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">position<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">+<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">1<\/font><font color=\"#000000\">}<\/font><font color=\"#000000\">)<\/font><font color=\"#000000\">.<\/font>\r\n        <font color=\"#800000\">^<\/font><font color=\"#000000\"> <\/font><font color=\"#800000\">self<\/font><font color=\"#000000\"> <\/font><font color=\"#000080\">halt<\/font><\/pre>\n<p>But the clever bit is what the script <i>does<\/i>.  ThisContext with capitals is the debugger&#8217;s name for the activation of decompressFromByteArray: I had stepped into; its simply the argument to the <b>DoItIn:<\/b> method created to run my script. &nbsp;thisContext without capitals is the name for the current activation (any activation) and so refers to the activation of <b>DoItIn:<\/b>. &nbsp;The (MethodContext sender:&#8230;) expression creates an activation record on the method&nbsp;(Bitmap&gt;&gt;#decompress:fromByteArray:at:), and initializes the activation at the start of the bytecodes for the method, effectively <i>after<\/i> the primitive it contains. &nbsp;The thisContext swapSender: &#8230; expression substitutes this activation as the one to return to from thisContext. &nbsp;i.e. my script&nbsp;&quot;thisContext swapSender: (MethodContext&#8230;&quot; etc will now return into the activation of&nbsp;(Bitmap&gt;&gt;#decompress:fromByteArray:at:) I just created instead of back to the compiler that compiled and evaluated the script. &nbsp;The &quot;self halt.&quot; brings up the debugger. &nbsp;So now I simply step out of the halt, into my script, stepping until it returns into the method I wanted to evaluate. &nbsp;Awesome!<\/body><\/html><\/p>\n<div class=\"pdf24Plugin-cp\"> \t<form name=\"pdf24Form0\" method=\"post\" action=\"https:\/\/doc2pdf.pdf24.org\/wordpress.php\" target=\"pdf24PopWin\" onsubmit=\"var pdf24Win = window.open('about:blank', 'pdf24PopWin', 'resizable=yes,scrollbars=yes,width=600,height=250,left='+(screen.width\/2-300)+',top='+(screen.height\/3-125)+''); pdf24Win.focus(); if(typeof pdf24OnCreatePDF === 'function'){void(pdf24OnCreatePDF(this,pdf24Win));}\"> \t\t<input type=\"hidden\" name=\"blogCharset\" value=\"Cw1x07UAAA==\" \/><input type=\"hidden\" name=\"blogPosts\" value=\"MwQA\" \/><input type=\"hidden\" name=\"blogUrl\" value=\"yygpKbDS1y8vL9fLzSxKzEtJTAIRevlF6frJ+elJOfnpAA==\" \/><input type=\"hidden\" name=\"blogName\" value=\"c85PV3DKyU8HAA==\" \/><input type=\"hidden\" name=\"blogValueEncoding\" value=\"gzdeflate base64\" \/><input type=\"hidden\" name=\"postId_0\" value=\"MzUDAA==\" \/><input type=\"hidden\" name=\"postTitle_0\" value=\"C87PTS3JzE0tVgjOTczJKUnMyVbILFYoKSrNqVRILE8tBsorKBsCAA==\" \/><input type=\"hidden\" name=\"postLink_0\" value=\"FckxDoAgDADAF5VS3fxNUYLE1hqoIf7esNxyp\/uzIY4xgtbG98FpEqwV3K0ksYJLpIhEuEbsptmr5g5dWcRZLqgdvL3yAY88Hwh\/\" \/><input type=\"hidden\" name=\"postAuthor_0\" value=\"S0zJzcwDAA==\" \/><input type=\"hidden\" name=\"postDateTime_0\" value=\"MzIwNNA1NNQ1NlAwMrIyNLQysAQA\" \/><input type=\"hidden\" name=\"postContent_0\" value=\"7V1tc9s2Ev58mel\/QJuZVEpl+S1xfLajmziJ5\/whTufsaT90cjMgCUmISYIBQCtqLv\/9dgGSImW9EpJfYntaxyKJXexid7ELQA+Pks5RX0ch\/GY06Bxt2n88EQw7H32fKi5iGoZDckq6PA5INFQs7BLqhYxoQQJBlIiY7vO4R3hMziN4WNPwkug+1dAI71wSroiWKVDpUi8NRapaJBaaeMynqWLk9NnT\/Z3tV4cRocUTJVKJFD1Jo4jJFvHSUTNKQn7FiGTdkPka\/0xSyYjwPsNHooZKswgbX\/GAKaJSvz+izqhibUIuRECHZEAVETGzj7CvNEpCvDnq1kDIS5RQxMA0ZgPii4CRHouZpFpI0oX\/dZ+Rt6JH\/vhAKCiKa9LwRdrrN0kfyINg0MxLewoJxyRg8HfPaA3VFDMWsAA1qhgjA9Qd0vOFlCgL+8r8VMNQENE1N7oiDMUAm6PyRYAaxk5QklCpuZ+GVMJ4JKk+ONpMOk+OEsk6BH6OeOeY64gmWUPbrMtDoHW0yTs\/PTFPeZ2A+SKCVkoBBa9z1BWxhv6EQr7+5emW+fmlQ4428fqEu\/tw14um3q409jpdKaLjoWZvpKTD+vzoovyors0EnIB9zZ6wyjIKG3t23zz77Esq9OG7QpNm6NC1cBgp8XKJCYvRoAK4QvJnL0ShENL4ctVst9sLcr0w9iEjsCGwCsXBmofATbEvKfBhyFum8YblmFAuwRu\/nZF3359f5zCdyxkSp4ZSyOKe7pPn5AX5jQRUU+MeyxB71zKqwbYtcI2ExQF6ZHHREmxPJjmd7Fb2\/PQn1CVPyBn6dwBaeGdk8hSL9VRO02mhu4cwhoxAcLK+jNTRtk10kRQCkoSYFZvQibLF7KtuLinU9lyhMnnIgMOoQBCFcUFTU+Q1SNjYNh+W5bqzMFdkaBhlXJfltLswJxsEcdpBbmez2E0mdG4i9RmhMGvkLkhzuoo0MBZjHAzYaaxPYBwPmjWMcGNnZ75M5acWHpOdFxs7L1\/Mpd3Y2tjdaj7febkH\/okmZzRF4PKrf+6+XNoSXr4scZz+nGGU2YANhKVmi0XOs48X7w9guuzC5BlYc+5R6dEew3gBvioFzIoxzpPoeRJSFwhoys6dEEMw1HnUJg0wzaq+eaxLeQheCiESZlrJNc6iRauY2VZRu9Lnaf3dz\/r7v8VmnsrdveO9V3uvYEZxaIu26dA8dmhL49MiTNZpj3HdoTkMr0PrS4e2aCvva3Eft5bpXmCpPAsLA7zuJvgApDKJ5BHH5NdmNHU6ZRObXwtKo4TlpJyX\/VqDeKmjkQjS0L2XH7jyf897+nuYQg49u2PPenO9eBl9X1FZV4Y8hXy6aGI8rQ8wJ0F+z946K5PDxededP8USO+IAtNY8R7OGX4fCq7nHnVW5ZKzgtc5eL2KUmZy+\/bsTkzX82gOHxU5Zno2PBeaWpcO9C6qqGlQtrHif7OF1DhP1Mv1Cbqf3d1e+3jb1QVMrFiN0V5qcnUa8WidIz67+W81Q87iAzgvUP+18ow0lw2ngNdrzOs+OfRt0Ochu5ApZiELFImzVHV9iSew5TyuiBClqdTkbIrlT7f+JXLqW4t2Zu1sTcVOrfhzAzPmfBbT3bqu467ESlbqorkko5WKWllH94SGaooLTl4RmB+xbl0lxTLMYiuGuSrKwahOAroyrbjkFA2HTqAQG3Os7cXM+82ZtJ\/PGba9W5rGG\/crQM9X9sMM37kffqrl\/ZVAeG\/df6vGxDZbQ4tNmbO9QIsDB\/d84cA5cOL818y2BzM5f17BmuSal4Lrpa3vj13nmQWSYq7P+7yrXQZvf2b\/mzc818zW2x0uBhZR18Oca6ZXwOMz0eQs+tPKipB4\/Sp0Tup7+rC04lorr3fWV675xsr3o1xCw7xR3N9yDVg1Fe++yeZeXM0uOXPT+K+DWeEZOgfRip26E8rDG\/L3xXeab9PlYRJ\/EwcuU\/juLWhsoiguyxFbd9BvqiumeDSqsjx6d+x35aOxfedHI4brsTJnTK9YdrpKdEvnxqpnTvHqjLXt2cXd8uc\/Hpe6H8BS910wGsejSaVJ6KN0WdZprLl3a6pz8+43H4f\/xx7+7b0bHv\/bWxB0OSnpviC4f88WBFdyuMJt1nWppO3XZdZ3otVpzr9cf+C7XPv+yA+c5e\/cyyz\/NST51cRe3fHM\/nHb6aHPMjdrZ\/c4GXddw3XKZB9POfywpxweE\/vHxP4xsX9M7B9GYr97LxN787Xz\/Pvz7Xa7dlb\/o4To2TJPlts1TEc\/dGa8igrssQq774f\/1r2Pt8jZvztbha3i6F\/tKuzx\/N8DOv\/nGnYfM\/zHDH\/lGX5xdxPxx54cJR1ElCDREFHSFI\/S0MCnnZJE8lgj9EpqYVhG2FcGRw4B2jyGK9QjWDKGXybPANLCIUJnYcPPXCOdMj6bxdUCnhOA2xoW8yW7jmx4fCUM1lvlkB2CDOGj1BNXrNkmz2JPJYfngsRiAN0fUNN7RHWS1GfwqETot+u4baZ9TsxiwDFJlAAaFsOmAv92RcOUmZM4ofBpCJ8lR+Q9lUPZeIYWnYATB13hAYs171q9IIFyR5iUCBcHxJNEZHBV489xDYyGUaJFVJL4lMT0GU+j8PCKgd6NEIRhV42qKyeFxsDnMuS5YDK+yAF5+hfZ3pPbW\/h75xX+fmv+Hvv1ftLFk4kX982fPz35h+3+4r+rZN5Oov1+0sWTqRf33bsxifibqX05Ngocb1OvE1M5v7KiVe+Yi7tjTT6NggCibinNksT4cGZ5FCEc6SyQw6lQhn5IlaoAGvJYaYpgd75khiZiG0KA\/ekJBthrEIcnq8EfzCnMjInYhRnwWatIyZVDW4vf4MK8HjbCYnLPUd6SCqh7sBDv\/ofR4FyDdbnkSyI+cCkMFrK39koUuvCguiwoOB6Lr0L1rc1\/VqLQZdzsFlUKqdHBOmPBjetyquEUWLc3Hznzboyj4K45MKyzlFMupZxQ3E7Zaz6AXHN+rv\/1n8mWUqRFkx8+8iTZ7DwpgoH5BHl4l5rCoSdE0IbUGgqnQZ\/FCLkteQY\/CynWKL+yuVL+nbinJZuv2h0MfA4qXSlSICmDEkUqNpbsF3WSLdW4ysubPz60yDxMQdIY9LnfJ59TpUmfQkYYK+x6j+lS+VbsZdjyKSv1\/vjwgV7mmODIO4PrRljigHe7TEL9A0oQcggVG\/kzr6oKiQIexFkbTQLRIl9SBK0qasoWCpMLa9FBRbwxktdqqWXRfjBNBQYPHc2tlefyKdSrIwh3W173BVpPUaOW62bhKSavEDTapPidC4R3hf\/ApiUzKPI9MIxUQrU7YAg5DyN6zjHDHzFBnPUul0pv2IKgVFHAgJpdMSizaZx1D4pXUx1Ad+MJ1Ye1tcwTEsFzTGcD7TQSIjMqw9ecn0NRW6RvoLahRKFdzSRWH7bsttZUYlOYEwj0b5C1MOK+GFio+IrNQjkUmCWHwgmrRRHC4r6FgUAkKjWgyTmDIZIHpPHBCJLdmr84WP5RGY2LEe3lCID2GUgIJGzkW651VvyRxhIRrLkcCyp7aQTRQh2Qb7aL7RE6e5soks9J5DeyTb4325a8eRVCn4Z6FMP\/LMehnsheGoBG\/K9sCeUELaVVHVVqAacjAwxOfT\/Hih9f9slNc2Sso3cUFG8UaNl4iXDJZnFI+ZInuhS1x5efGjF4wc8YIxFqeShS4Csuc8vOmo83wsdwsYprXPOKVZiRNltvlTLd67wTp\/o0rl1Xl+xuoTA6HazZPqev0ZuHA2cw\/0beVDO5mb0Xg3crTloDUkY59W+yrpfhXzi6w4GHxkptYUpZQyMWXLAoeaPX8V3h6rfnl1FgsdBV28COXasQB9SEAp93VmiuoZVReHZQzLf7b1cLpXH3R8ztNYh572LIztoQOObW0bcJVPt95t2mE8jtHUDosEnhWH1\/nG1u+iGDORJzYVvhVBMtqBkCwRSWDPiCqlI+b16A4dOEQ7VjiqNyQlYknWiXxQupqmXN1I23U8hiq1syh3b3z748yFDKYnC+UVhN6\/I6yRZUplBCHNxomEmV7x\/qMXFwv3dcoooAfipNGV8SpEHjYelz07zERQl8DxiTikzcTqr2Nu8NvimpWhjltQ5qc3frsAmFntEXkrGyqbFq0VaW+cuKrBos9aXqlZZ9aVgMHktD\/jdT40LkRmLKz6wOyMtNVagrX5Jg3a59JRqM3rUidLSCwdFyY015rMo6mVZEZlopK0WlntJcp9r0mFeKbmqFEPZ9R5KZ8h3+ypZzCh45a96GIrgwmWwH0iwuLFbVZt2zTQjTPphYGJot+oz55M3GGsMFHmOWrHJ7x\/1GXBAxL5zxL3MjRAo8ZNIujWWfAjPU1UW0qpfgGGQwKXmFmZ3fJZ40KyFpUnH+awcSMsc1K4DoY5nBIKWW1UKh55b1e6xU01jjUQedqUuN9JW5d3nFJhcg5\/3Grsv8DA6GLw882rSvFcRa8P8=\" \/> \t\t<a href=\"https:\/\/www.pdf24.org\" target=\"_blank\" title=\"www.pdf24.org\" rel=\"nofollow\"><img src=\"http:\/\/www.mirandabanda.org\/cogblog\/wp-content\/plugins\/pdf24-post-to-pdf\/img\/pdf_32x32.png\" alt=\"\" border=\"0\" height=\"32\" \/><\/a> \t\t<span class=\"pdf24Plugin-cp-space\">&nbsp;&nbsp;<\/span> \t\t<span class=\"pdf24Plugin-cp-text\">Send article as PDF<\/span> \t\t<span class=\"pdf24Plugin-cp-space\">&nbsp;&nbsp;<\/span> \t\t<input class=\"pdf24Plugin-cp-input\" style=\"margin: 0px;\" type=\"text\" name=\"sendEmailTo\" placeholder=\"Enter email address\" \/> \t\t<input class=\"pdf24Plugin-cp-submit\" style=\"margin: 0px;\" type=\"submit\" value=\"Send\" \/> \t<\/form> <\/div>","protected":false},"excerpt":{"rendered":"<p>Occasionally I find myself able to do something in Smalltalk that I think is truly fabulous, not because I&#8217;m a fabulous Smalltalk programmer, but because a live reflective pure object system provides such fabulous ease. Today was one such example. I&#8217;m working on a new code generator for the Cog VM and it (cough) has [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/posts\/56"}],"collection":[{"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/comments?post=56"}],"version-history":[{"count":27,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/posts\/56\/revisions"}],"predecessor-version":[{"id":83,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/posts\/56\/revisions\/83"}],"wp:attachment":[{"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/media?parent=56"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/categories?post=56"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/tags?post=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}