Spaces.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. smalltalk.addPackage('Spaces');
  2. smalltalk.addClass('ObjectSpace', smalltalk.Object, ['frame'], 'Spaces');
  3. smalltalk.ObjectSpace.comment="I am a connection to another Smalltalk environment.\x0aThe implementation creates an iframe on the same location as the window, and connect to the Amber environment.\x0a\x0a\x0a\x0a## Usage example:\x0a\x0a\x09| space |\x0a\x09\x0a\x09space := ObjectSpace new.\x0a\x09space do: [ smalltalk ] \x22Answers aSmalltalk\x22\x0a\x09(space do: [ smalltalk ]) == smalltalk \x22Answers false\x22\x0a\x09\x0a\x09space release \x22Remove the object space environment\x22"
  4. smalltalk.addMethod(
  5. "_connectTo_",
  6. smalltalk.method({
  7. selector: "connectTo:",
  8. category: 'initialization',
  9. fn: function (aFrame){
  10. var self=this;
  11. return smalltalk.withContext(function($ctx1) {
  12. _st(self)._release();
  13. self["@frame"]=aFrame;
  14. return self}, function($ctx1) {$ctx1.fill(self,"connectTo:",{aFrame:aFrame},smalltalk.ObjectSpace)})},
  15. args: ["aFrame"],
  16. source: "connectTo: aFrame\x0a\x09self release.\x0a\x09frame := aFrame",
  17. messageSends: ["release"],
  18. referencedClasses: []
  19. }),
  20. smalltalk.ObjectSpace);
  21. smalltalk.addMethod(
  22. "_create",
  23. smalltalk.method({
  24. selector: "create",
  25. category: 'initialization',
  26. fn: function (){
  27. var self=this;
  28. return smalltalk.withContext(function($ctx1) {
  29. _st(_st(window)._jQuery_("body"))._append_("<iframe style=\x22display: none;\x22></iframe>");
  30. self["@frame"]=_st(_st(_st(window)._jQuery_("iframe"))._get())._last();
  31. _st(_st(self["@frame"])._contentWindow())._location_(_st(window)._location());
  32. return self}, function($ctx1) {$ctx1.fill(self,"create",{},smalltalk.ObjectSpace)})},
  33. args: [],
  34. source: "create\x0a\x09(window jQuery: 'body') append: '<iframe style=\x22display: none;\x22></iframe>'.\x0a\x09frame := (window jQuery: 'iframe') get last.\x0a\x09frame contentWindow location: window location",
  35. messageSends: ["append:", "jQuery:", "last", "get", "location:", "location", "contentWindow"],
  36. referencedClasses: []
  37. }),
  38. smalltalk.ObjectSpace);
  39. smalltalk.addMethod(
  40. "_destroy",
  41. smalltalk.method({
  42. selector: "destroy",
  43. category: 'releasing',
  44. fn: function (){
  45. var self=this;
  46. return smalltalk.withContext(function($ctx1) {
  47. var $1,$2;
  48. $1=self["@frame"];
  49. if(($receiver = $1) == nil || $receiver == undefined){
  50. $2=self;
  51. return $2;
  52. } else {
  53. $1;
  54. };
  55. _st(_st(window)._jQuery_(self["@frame"]))._remove();
  56. _st(self)._release();
  57. return self}, function($ctx1) {$ctx1.fill(self,"destroy",{},smalltalk.ObjectSpace)})},
  58. args: [],
  59. source: "destroy\x0a\x09frame ifNil: [ ^ self ].\x0a\x09(window jQuery: frame) remove.\x0a\x0a\x09self release",
  60. messageSends: ["ifNil:", "remove", "jQuery:", "release"],
  61. referencedClasses: []
  62. }),
  63. smalltalk.ObjectSpace);
  64. smalltalk.addMethod(
  65. "_do_",
  66. smalltalk.method({
  67. selector: "do:",
  68. category: 'evaluating',
  69. fn: function (aBlock){
  70. var self=this;
  71. function $ObjectSpaceConnectionError(){return smalltalk.ObjectSpaceConnectionError||(typeof ObjectSpaceConnectionError=="undefined"?nil:ObjectSpaceConnectionError)}
  72. return smalltalk.withContext(function($ctx1) {
  73. var $1,$2,$3;
  74. $1=_st(self)._isConnected();
  75. if(! smalltalk.assert($1)){
  76. $2=_st($ObjectSpaceConnectionError())._signal();
  77. return $2;
  78. };
  79. $3=_st(_st(self["@frame"])._contentWindow())._eval_(_st(_st("(").__comma(_st(aBlock)._compiledSource())).__comma(")()"));
  80. return $3;
  81. }, function($ctx1) {$ctx1.fill(self,"do:",{aBlock:aBlock},smalltalk.ObjectSpace)})},
  82. args: ["aBlock"],
  83. source: "do: aBlock\x0a\x09self isConnected ifFalse: [ ^ ObjectSpaceConnectionError signal ].\x0a\x09^ frame contentWindow eval: '(', aBlock compiledSource, ')()'",
  84. messageSends: ["ifFalse:", "signal", "isConnected", "eval:", ",", "compiledSource", "contentWindow"],
  85. referencedClasses: ["ObjectSpaceConnectionError"]
  86. }),
  87. smalltalk.ObjectSpace);
  88. smalltalk.addMethod(
  89. "_frame",
  90. smalltalk.method({
  91. selector: "frame",
  92. category: 'accessing',
  93. fn: function (){
  94. var self=this;
  95. return smalltalk.withContext(function($ctx1) {
  96. var $1;
  97. $1=self["@frame"];
  98. return $1;
  99. }, function($ctx1) {$ctx1.fill(self,"frame",{},smalltalk.ObjectSpace)})},
  100. args: [],
  101. source: "frame\x0a\x09^ frame",
  102. messageSends: [],
  103. referencedClasses: []
  104. }),
  105. smalltalk.ObjectSpace);
  106. smalltalk.addMethod(
  107. "_initialize",
  108. smalltalk.method({
  109. selector: "initialize",
  110. category: 'initialization',
  111. fn: function (){
  112. var self=this;
  113. return smalltalk.withContext(function($ctx1) {
  114. smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
  115. _st(self)._create();
  116. return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.ObjectSpace)})},
  117. args: [],
  118. source: "initialize\x0a\x09super initialize.\x0a\x09self create",
  119. messageSends: ["initialize", "create"],
  120. referencedClasses: []
  121. }),
  122. smalltalk.ObjectSpace);
  123. smalltalk.addMethod(
  124. "_isConnected",
  125. smalltalk.method({
  126. selector: "isConnected",
  127. category: 'initialization',
  128. fn: function (){
  129. var self=this;
  130. return smalltalk.withContext(function($ctx1) {
  131. var $1;
  132. $1=_st(_st(self)._frame())._notNil();
  133. return $1;
  134. }, function($ctx1) {$ctx1.fill(self,"isConnected",{},smalltalk.ObjectSpace)})},
  135. args: [],
  136. source: "isConnected\x0a\x09^ self frame notNil",
  137. messageSends: ["notNil", "frame"],
  138. referencedClasses: []
  139. }),
  140. smalltalk.ObjectSpace);
  141. smalltalk.addMethod(
  142. "_release",
  143. smalltalk.method({
  144. selector: "release",
  145. category: 'releasing',
  146. fn: function (){
  147. var self=this;
  148. return smalltalk.withContext(function($ctx1) {
  149. self["@frame"]=nil;
  150. return self}, function($ctx1) {$ctx1.fill(self,"release",{},smalltalk.ObjectSpace)})},
  151. args: [],
  152. source: "release\x0a\x09frame := nil",
  153. messageSends: [],
  154. referencedClasses: []
  155. }),
  156. smalltalk.ObjectSpace);
  157. smalltalk.addMethod(
  158. "_whenReadyDo_",
  159. smalltalk.method({
  160. selector: "whenReadyDo:",
  161. category: 'events',
  162. fn: function (aBlock){
  163. var self=this;
  164. return smalltalk.withContext(function($ctx1) {
  165. _st(_st(window)._jQuery_(self["@frame"]))._bind_do_("load",aBlock);
  166. return self}, function($ctx1) {$ctx1.fill(self,"whenReadyDo:",{aBlock:aBlock},smalltalk.ObjectSpace)})},
  167. args: ["aBlock"],
  168. source: "whenReadyDo: aBlock\x0a\x09(window jQuery: frame)\x0a\x09\x09bind: 'load'\x0a\x09\x09do: aBlock",
  169. messageSends: ["bind:do:", "jQuery:"],
  170. referencedClasses: []
  171. }),
  172. smalltalk.ObjectSpace);
  173. smalltalk.addMethod(
  174. "_on_",
  175. smalltalk.method({
  176. selector: "on:",
  177. category: 'instance creation',
  178. fn: function (aFrame){
  179. var self=this;
  180. return smalltalk.withContext(function($ctx1) {
  181. var $2,$3,$1;
  182. $2=_st(self)._basicNew();
  183. _st($2)._connectTo_(aFrame);
  184. $3=_st($2)._yourself();
  185. $1=$3;
  186. return $1;
  187. }, function($ctx1) {$ctx1.fill(self,"on:",{aFrame:aFrame},smalltalk.ObjectSpace.klass)})},
  188. args: ["aFrame"],
  189. source: "on: aFrame\x0a\x09^ self basicNew\x0a\x09\x09connectTo: aFrame;\x0a\x09\x09yourself",
  190. messageSends: ["connectTo:", "basicNew", "yourself"],
  191. referencedClasses: []
  192. }),
  193. smalltalk.ObjectSpace.klass);
  194. smalltalk.addClass('ObjectSpaceConnectionError', smalltalk.Error, [], 'Spaces');
  195. smalltalk.addMethod(
  196. "_messageText",
  197. smalltalk.method({
  198. selector: "messageText",
  199. category: 'accessing',
  200. fn: function (){
  201. var self=this;
  202. return smalltalk.withContext(function($ctx1) {
  203. return "The ObjectSpace is not connected";
  204. }, function($ctx1) {$ctx1.fill(self,"messageText",{},smalltalk.ObjectSpaceConnectionError)})},
  205. args: [],
  206. source: "messageText\x0a\x09^ 'The ObjectSpace is not connected'",
  207. messageSends: [],
  208. referencedClasses: []
  209. }),
  210. smalltalk.ObjectSpaceConnectionError);
  211. smalltalk.addClass('ObjectSpaceTest', smalltalk.TestCase, ['space'], 'Spaces');
  212. smalltalk.addMethod(
  213. "_setUp",
  214. smalltalk.method({
  215. selector: "setUp",
  216. category: 'initialization',
  217. fn: function (){
  218. var self=this;
  219. function $ObjectSpace(){return smalltalk.ObjectSpace||(typeof ObjectSpace=="undefined"?nil:ObjectSpace)}
  220. return smalltalk.withContext(function($ctx1) {
  221. self["@space"]=_st($ObjectSpace())._new();
  222. return self}, function($ctx1) {$ctx1.fill(self,"setUp",{},smalltalk.ObjectSpaceTest)})},
  223. args: [],
  224. source: "setUp\x0a\x09space := ObjectSpace new",
  225. messageSends: ["new"],
  226. referencedClasses: ["ObjectSpace"]
  227. }),
  228. smalltalk.ObjectSpaceTest);
  229. smalltalk.addMethod(
  230. "_tearDown",
  231. smalltalk.method({
  232. selector: "tearDown",
  233. category: 'initialization',
  234. fn: function (){
  235. var self=this;
  236. return smalltalk.withContext(function($ctx1) {
  237. _st(self["@space"])._destroy();
  238. return self}, function($ctx1) {$ctx1.fill(self,"tearDown",{},smalltalk.ObjectSpaceTest)})},
  239. args: [],
  240. source: "tearDown\x0a\x09space destroy",
  241. messageSends: ["destroy"],
  242. referencedClasses: []
  243. }),
  244. smalltalk.ObjectSpaceTest);
  245. smalltalk.addMethod(
  246. "_testConnection",
  247. smalltalk.method({
  248. selector: "testConnection",
  249. category: 'tests',
  250. fn: function (){
  251. var self=this;
  252. function $ObjectSpaceConnectionError(){return smalltalk.ObjectSpaceConnectionError||(typeof ObjectSpaceConnectionError=="undefined"?nil:ObjectSpaceConnectionError)}
  253. return smalltalk.withContext(function($ctx1) {
  254. _st(self["@space"])._destroy();
  255. _st(self)._deny_(_st(self["@space"])._isConnected());
  256. _st(self)._should_raise_((function(){
  257. return smalltalk.withContext(function($ctx2) {
  258. return _st(self["@space"])._do_((function(){
  259. return smalltalk.withContext(function($ctx3) {
  260. }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
  261. }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}),$ObjectSpaceConnectionError());
  262. return self}, function($ctx1) {$ctx1.fill(self,"testConnection",{},smalltalk.ObjectSpaceTest)})},
  263. args: [],
  264. source: "testConnection\x0a\x09space destroy.\x0a\x09self deny: space isConnected.\x0a\x09self should: [ space do: [] ] raise: ObjectSpaceConnectionError",
  265. messageSends: ["destroy", "deny:", "isConnected", "should:raise:", "do:"],
  266. referencedClasses: ["ObjectSpaceConnectionError"]
  267. }),
  268. smalltalk.ObjectSpaceTest);
  269. smalltalk.addMethod(
  270. "_testCreate",
  271. smalltalk.method({
  272. selector: "testCreate",
  273. category: 'tests',
  274. fn: function (){
  275. var self=this;
  276. return smalltalk.withContext(function($ctx1) {
  277. _st(self)._assert_(_st(_st(self["@space"])._frame())._notNil());
  278. _st(self)._assert_(_st(self["@space"])._isConnected());
  279. return self}, function($ctx1) {$ctx1.fill(self,"testCreate",{},smalltalk.ObjectSpaceTest)})},
  280. args: [],
  281. source: "testCreate\x0a\x0a\x09self assert: space frame notNil.\x0a\x09self assert: space isConnected",
  282. messageSends: ["assert:", "notNil", "frame", "isConnected"],
  283. referencedClasses: []
  284. }),
  285. smalltalk.ObjectSpaceTest);
  286. smalltalk.addMethod(
  287. "_testEvaluation",
  288. smalltalk.method({
  289. selector: "testEvaluation",
  290. category: 'tests',
  291. fn: function (){
  292. var self=this;
  293. var result;
  294. function $Smalltalk(){return smalltalk.Smalltalk||(typeof Smalltalk=="undefined"?nil:Smalltalk)}
  295. return smalltalk.withContext(function($ctx1) {
  296. _st(self["@space"])._whenReadyDo_((function(){
  297. return smalltalk.withContext(function($ctx2) {
  298. result=_st(self["@space"])._do_((function(){
  299. return smalltalk.withContext(function($ctx3) {
  300. return smalltalk;
  301. }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
  302. result;
  303. _st(self)._assert_equals_(_st(_st(result)._class())._name(),"Smalltalk");
  304. _st(self)._deny_(_st(_st(result)._class()).__eq($Smalltalk()));
  305. return _st(self)._deny_(_st(result).__eq_eq(smalltalk));
  306. }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
  307. return self}, function($ctx1) {$ctx1.fill(self,"testEvaluation",{result:result},smalltalk.ObjectSpaceTest)})},
  308. args: [],
  309. source: "testEvaluation\x0a\x09| result |\x0a\x0a\x09space whenReadyDo: [\x0a\x09\x09result := space do: [ smalltalk ].\x0a\x0a\x09\x09self assert: result class name equals: 'Smalltalk'.\x0a\x09\x09self deny: result class = Smalltalk.\x0a\x09\x09self deny: result == smalltalk ]",
  310. messageSends: ["whenReadyDo:", "do:", "assert:equals:", "name", "class", "deny:", "=", "=="],
  311. referencedClasses: ["Smalltalk"]
  312. }),
  313. smalltalk.ObjectSpaceTest);
  314. smalltalk.addMethod(
  315. "_testRelease",
  316. smalltalk.method({
  317. selector: "testRelease",
  318. category: 'tests',
  319. fn: function (){
  320. var self=this;
  321. return smalltalk.withContext(function($ctx1) {
  322. _st(self)._deny_(_st(_st(self["@space"])._frame())._isNil());
  323. _st(self["@space"])._release();
  324. _st(self)._assert_(_st(_st(self["@space"])._frame())._isNil());
  325. return self}, function($ctx1) {$ctx1.fill(self,"testRelease",{},smalltalk.ObjectSpaceTest)})},
  326. args: [],
  327. source: "testRelease\x0a\x0a\x09self deny: space frame isNil.\x0a\x0a\x09space release.\x0a\x09\x0a\x09self assert: space frame isNil",
  328. messageSends: ["deny:", "isNil", "frame", "release", "assert:"],
  329. referencedClasses: []
  330. }),
  331. smalltalk.ObjectSpaceTest);