resin 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/amber/bin/amberc +10 -350
  2. data/amber/js/Benchfib.deploy.js +80 -89
  3. data/amber/js/Benchfib.js +80 -89
  4. data/amber/js/Canvas.deploy.js +558 -545
  5. data/amber/js/Canvas.js +563 -545
  6. data/amber/js/Compiler-AST.deploy.js +431 -243
  7. data/amber/js/Compiler-AST.js +487 -244
  8. data/amber/js/Compiler-Core.deploy.js +201 -1045
  9. data/amber/js/Compiler-Core.js +208 -1207
  10. data/amber/js/Compiler-Exceptions.deploy.js +37 -18
  11. data/amber/js/Compiler-Exceptions.js +42 -18
  12. data/amber/js/Compiler-IR.deploy.js +1071 -774
  13. data/amber/js/Compiler-IR.js +1194 -848
  14. data/amber/js/Compiler-Inlining.deploy.js +395 -373
  15. data/amber/js/Compiler-Inlining.js +395 -373
  16. data/amber/js/Compiler-Interpreter.deploy.js +1202 -0
  17. data/amber/js/Compiler-Interpreter.js +1631 -0
  18. data/amber/js/Compiler-Semantic.deploy.js +695 -600
  19. data/amber/js/Compiler-Semantic.js +721 -611
  20. data/amber/js/Compiler-Tests.deploy.js +699 -376
  21. data/amber/js/Compiler-Tests.js +834 -381
  22. data/amber/js/Compiler.deploy.js +8563 -1805
  23. data/amber/js/Compiler.js +11476 -2633
  24. data/amber/js/Examples.deploy.js +29 -29
  25. data/amber/js/Examples.js +29 -29
  26. data/amber/js/IDE.deploy.js +3292 -2649
  27. data/amber/js/IDE.js +3318 -2710
  28. data/amber/js/Importer-Exporter.deploy.js +393 -349
  29. data/amber/js/Importer-Exporter.js +398 -354
  30. data/amber/js/Kernel-Announcements.deploy.js +53 -44
  31. data/amber/js/Kernel-Announcements.js +55 -44
  32. data/amber/js/Kernel-Classes.deploy.js +566 -368
  33. data/amber/js/Kernel-Classes.js +660 -402
  34. data/amber/js/Kernel-Collections.deploy.js +1149 -1098
  35. data/amber/js/Kernel-Collections.js +1183 -1116
  36. data/amber/js/Kernel-Exceptions.deploy.js +173 -75
  37. data/amber/js/Kernel-Exceptions.js +215 -77
  38. data/amber/js/Kernel-Methods.deploy.js +530 -313
  39. data/amber/js/Kernel-Methods.js +632 -338
  40. data/amber/js/Kernel-Objects.deploy.js +1734 -1577
  41. data/amber/js/Kernel-Objects.js +1867 -1654
  42. data/amber/js/Kernel-Tests.deploy.js +1416 -973
  43. data/amber/js/Kernel-Tests.js +1495 -981
  44. data/amber/js/Kernel-Transcript.deploy.js +23 -24
  45. data/amber/js/Kernel-Transcript.js +25 -26
  46. data/amber/js/SUnit-Tests.deploy.js +402 -0
  47. data/amber/js/SUnit-Tests.js +518 -0
  48. data/amber/js/SUnit.deploy.js +535 -237
  49. data/amber/js/SUnit.js +634 -246
  50. data/amber/js/amber.js +90 -53
  51. data/amber/js/boot.js +441 -255
  52. data/amber/js/init.js +1 -3
  53. data/amber/js/lib/CodeMirror/codemirror.css +3 -0
  54. data/amber/js/lib/CodeMirror/codemirror.js +104 -55
  55. data/amber/js/lib/peg-0.7.0.min.js +9 -0
  56. data/amber/js/parser.js +1504 -802
  57. data/amber/js/parser.pegjs +170 -165
  58. data/amber/st/Canvas.st +6 -0
  59. data/amber/st/Compiler-AST.st +54 -3
  60. data/amber/st/Compiler-Core.st +6 -551
  61. data/amber/st/Compiler-Exceptions.st +4 -0
  62. data/amber/st/Compiler-IR.st +205 -87
  63. data/amber/st/Compiler-Interpreter.st +597 -0
  64. data/amber/st/Compiler-Semantic.st +46 -21
  65. data/amber/st/Compiler-Tests.st +254 -7
  66. data/amber/st/Compiler.st +3172 -1541
  67. data/amber/st/IDE.st +57 -93
  68. data/amber/st/Importer-Exporter.st +4 -7
  69. data/amber/st/Kernel-Announcements.st +8 -0
  70. data/amber/st/Kernel-Classes.st +149 -40
  71. data/amber/st/Kernel-Collections.st +43 -32
  72. data/amber/st/Kernel-Exceptions.st +70 -1
  73. data/amber/st/Kernel-Methods.st +165 -27
  74. data/amber/st/Kernel-Objects.st +215 -140
  75. data/amber/st/Kernel-Tests.st +195 -10
  76. data/amber/st/Kernel-Transcript.st +1 -3
  77. data/amber/st/SUnit-Tests.st +186 -0
  78. data/amber/st/SUnit.st +186 -14
  79. data/bin/resin +6 -0
  80. data/lib/resin/cli.rb +19 -0
  81. metadata +41 -25
  82. data/amber/js/lib/peg-0.6.2.min.js +0 -2
  83. data/bin/resin-compile +0 -6
  84. data/bin/runresin +0 -12
@@ -85,12 +85,10 @@ evaluateExpression: aString
85
85
  !
86
86
 
87
87
  install: aString forClass: aBehavior category: anotherString
88
- | compiled |
89
- compiled := self eval: (self compile: aString forClass: aBehavior).
90
- compiled category: anotherString.
91
- aBehavior addCompiledMethod: compiled.
92
- self setupClass: aBehavior.
93
- ^compiled
88
+ ^ ClassBuilder new
89
+ installMethod: (self eval: (self compile: aString forClass: aBehavior))
90
+ forClass: aBehavior
91
+ category: anotherString
94
92
  !
95
93
 
96
94
  parse: aString
@@ -105,7 +103,7 @@ recompile: aClass
105
103
  aClass methodDictionary do: [:each |
106
104
  console log: aClass name, ' >> ', each selector.
107
105
  self install: each source forClass: aClass category: each category].
108
- self setupClass: aClass.
106
+ "self setupClass: aClass."
109
107
  aClass isMetaclass ifFalse: [self recompile: aClass class]
110
108
  !
111
109
 
@@ -113,10 +111,6 @@ recompileAll
113
111
  Smalltalk current classes do: [:each |
114
112
  Transcript show: each; cr.
115
113
  [self recompile: each] valueWithTimeout: 100]
116
- !
117
-
118
- setupClass: aClass
119
- <smalltalk.init(aClass)>
120
114
  ! !
121
115
 
122
116
  !Compiler class methodsFor: 'compiling'!
@@ -149,7 +143,7 @@ visit: aNode
149
143
  !
150
144
 
151
145
  visitAll: aCollection
152
- ^ aCollection do: [ :each | self visit: each ]
146
+ ^ aCollection collect: [ :each | self visit: each ]
153
147
  !
154
148
 
155
149
  visitAssignmentNode: aNode
@@ -294,542 +288,3 @@ translator
294
288
  yourself
295
289
  ! !
296
290
 
297
- AbstractCodeGenerator subclass: #FunCodeGenerator
298
- instanceVariableNames: 'stream nestedBlocks earlyReturn currentSelector unknownVariables tempVariables messageSends referencedClasses classReferenced argVariables'
299
- package: 'Compiler-Core'!
300
-
301
- !FunCodeGenerator methodsFor: 'accessing'!
302
-
303
- argVariables
304
- ^argVariables copy
305
- !
306
-
307
- knownVariables
308
- ^self pseudoVariables
309
- addAll: self tempVariables;
310
- addAll: self argVariables;
311
- yourself
312
- !
313
-
314
- tempVariables
315
- ^tempVariables copy
316
- !
317
-
318
- unknownVariables
319
- ^unknownVariables copy
320
- ! !
321
-
322
- !FunCodeGenerator methodsFor: 'compiling'!
323
-
324
- compileNode: aNode
325
- stream := '' writeStream.
326
- self visit: aNode.
327
- ^stream contents
328
- ! !
329
-
330
- !FunCodeGenerator methodsFor: 'initialization'!
331
-
332
- initialize
333
- super initialize.
334
- stream := '' writeStream.
335
- unknownVariables := #().
336
- tempVariables := #().
337
- argVariables := #().
338
- messageSends := #().
339
- classReferenced := #()
340
- ! !
341
-
342
- !FunCodeGenerator methodsFor: 'optimizations'!
343
-
344
- checkClass: aClassName for: receiver
345
- stream nextPutAll: '((($receiver = ', receiver, ').klass === smalltalk.', aClassName, ') ? '
346
- !
347
-
348
- inline: aSelector receiver: receiver argumentNodes: aCollection
349
- | inlined |
350
- inlined := false.
351
-
352
- "-- Booleans --"
353
-
354
- (aSelector = 'ifFalse:') ifTrue: [
355
- aCollection first isBlockNode ifTrue: [
356
- self checkClass: 'Boolean' for: receiver.
357
- stream nextPutAll: '(!! $receiver ? '.
358
- self visit: aCollection first.
359
- stream nextPutAll: '() : nil)'.
360
- inlined := true]].
361
-
362
- (aSelector = 'ifTrue:') ifTrue: [
363
- aCollection first isBlockNode ifTrue: [
364
- self checkClass: 'Boolean' for: receiver.
365
- stream nextPutAll: '($receiver ? '.
366
- self visit: aCollection first.
367
- stream nextPutAll: '() : nil)'.
368
- inlined := true]].
369
-
370
- (aSelector = 'ifTrue:ifFalse:') ifTrue: [
371
- (aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
372
- self checkClass: 'Boolean' for: receiver.
373
- stream nextPutAll: '($receiver ? '.
374
- self visit: aCollection first.
375
- stream nextPutAll: '() : '.
376
- self visit: aCollection second.
377
- stream nextPutAll: '())'.
378
- inlined := true]].
379
-
380
- (aSelector = 'ifFalse:ifTrue:') ifTrue: [
381
- (aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
382
- self checkClass: 'Boolean' for: receiver.
383
- stream nextPutAll: '(!! $receiver ? '.
384
- self visit: aCollection first.
385
- stream nextPutAll: '() : '.
386
- self visit: aCollection second.
387
- stream nextPutAll: '())'.
388
- inlined := true]].
389
-
390
- "-- Numbers --"
391
-
392
- (aSelector = '<') ifTrue: [
393
- self checkClass: 'Number' for: receiver.
394
- stream nextPutAll: '$receiver <'.
395
- self visit: aCollection first.
396
- inlined := true].
397
-
398
- (aSelector = '<=') ifTrue: [
399
- self checkClass: 'Number' for: receiver.
400
- stream nextPutAll: '$receiver <='.
401
- self visit: aCollection first.
402
- inlined := true].
403
-
404
- (aSelector = '>') ifTrue: [
405
- self checkClass: 'Number' for: receiver.
406
- stream nextPutAll: '$receiver >'.
407
- self visit: aCollection first.
408
- inlined := true].
409
-
410
- (aSelector = '>=') ifTrue: [
411
- self checkClass: 'Number' for: receiver.
412
- stream nextPutAll: '$receiver >='.
413
- self visit: aCollection first.
414
- inlined := true].
415
-
416
- (aSelector = '+') ifTrue: [
417
- self checkClass: 'Number' for: receiver.
418
- stream nextPutAll: '$receiver +'.
419
- self visit: aCollection first.
420
- inlined := true].
421
-
422
- (aSelector = '-') ifTrue: [
423
- self checkClass: 'Number' for: receiver.
424
- stream nextPutAll: '$receiver -'.
425
- self visit: aCollection first.
426
- inlined := true].
427
-
428
- (aSelector = '*') ifTrue: [
429
- self checkClass: 'Number' for: receiver.
430
- stream nextPutAll: '$receiver *'.
431
- self visit: aCollection first.
432
- inlined := true].
433
-
434
- (aSelector = '/') ifTrue: [
435
- self checkClass: 'Number' for: receiver.
436
- stream nextPutAll: '$receiver /'.
437
- self visit: aCollection first.
438
- inlined := true].
439
-
440
- ^inlined
441
- !
442
-
443
- inlineLiteral: aSelector receiverNode: anObject argumentNodes: aCollection
444
- | inlined |
445
- inlined := false.
446
-
447
- "-- BlockClosures --"
448
-
449
- (aSelector = 'whileTrue:') ifTrue: [
450
- (anObject isBlockNode and: [aCollection first isBlockNode]) ifTrue: [
451
- stream nextPutAll: '(function(){while('.
452
- self visit: anObject.
453
- stream nextPutAll: '()) {'.
454
- self visit: aCollection first.
455
- stream nextPutAll: '()}})()'.
456
- inlined := true]].
457
-
458
- (aSelector = 'whileFalse:') ifTrue: [
459
- (anObject isBlockNode and: [aCollection first isBlockNode]) ifTrue: [
460
- stream nextPutAll: '(function(){while(!!'.
461
- self visit: anObject.
462
- stream nextPutAll: '()) {'.
463
- self visit: aCollection first.
464
- stream nextPutAll: '()}})()'.
465
- inlined := true]].
466
-
467
- (aSelector = 'whileTrue') ifTrue: [
468
- anObject isBlockNode ifTrue: [
469
- stream nextPutAll: '(function(){while('.
470
- self visit: anObject.
471
- stream nextPutAll: '()) {}})()'.
472
- inlined := true]].
473
-
474
- (aSelector = 'whileFalse') ifTrue: [
475
- anObject isBlockNode ifTrue: [
476
- stream nextPutAll: '(function(){while(!!'.
477
- self visit: anObject.
478
- stream nextPutAll: '()) {}})()'.
479
- inlined := true]].
480
-
481
- "-- Numbers --"
482
-
483
- (aSelector = '+') ifTrue: [
484
- (self isNode: anObject ofClass: Number) ifTrue: [
485
- self visit: anObject.
486
- stream nextPutAll: ' + '.
487
- self visit: aCollection first.
488
- inlined := true]].
489
-
490
- (aSelector = '-') ifTrue: [
491
- (self isNode: anObject ofClass: Number) ifTrue: [
492
- self visit: anObject.
493
- stream nextPutAll: ' - '.
494
- self visit: aCollection first.
495
- inlined := true]].
496
-
497
- (aSelector = '*') ifTrue: [
498
- (self isNode: anObject ofClass: Number) ifTrue: [
499
- self visit: anObject.
500
- stream nextPutAll: ' * '.
501
- self visit: aCollection first.
502
- inlined := true]].
503
-
504
- (aSelector = '/') ifTrue: [
505
- (self isNode: anObject ofClass: Number) ifTrue: [
506
- self visit: anObject.
507
- stream nextPutAll: ' / '.
508
- self visit: aCollection first.
509
- inlined := true]].
510
-
511
- (aSelector = '<') ifTrue: [
512
- (self isNode: anObject ofClass: Number) ifTrue: [
513
- self visit: anObject.
514
- stream nextPutAll: ' < '.
515
- self visit: aCollection first.
516
- inlined := true]].
517
-
518
- (aSelector = '<=') ifTrue: [
519
- (self isNode: anObject ofClass: Number) ifTrue: [
520
- self visit: anObject.
521
- stream nextPutAll: ' <= '.
522
- self visit: aCollection first.
523
- inlined := true]].
524
-
525
- (aSelector = '>') ifTrue: [
526
- (self isNode: anObject ofClass: Number) ifTrue: [
527
- self visit: anObject.
528
- stream nextPutAll: ' > '.
529
- self visit: aCollection first.
530
- inlined := true]].
531
-
532
- (aSelector = '>=') ifTrue: [
533
- (self isNode: anObject ofClass: Number) ifTrue: [
534
- self visit: anObject.
535
- stream nextPutAll: ' >= '.
536
- self visit: aCollection first.
537
- inlined := true]].
538
-
539
- "-- UndefinedObject --"
540
-
541
- (aSelector = 'ifNil:') ifTrue: [
542
- aCollection first isBlockNode ifTrue: [
543
- stream nextPutAll: '(($receiver = '.
544
- self visit: anObject.
545
- stream nextPutAll: ') == nil || $receiver == undefined) ? '.
546
- self visit: aCollection first.
547
- stream nextPutAll: '() : $receiver'.
548
- inlined := true]].
549
-
550
- (aSelector = 'ifNotNil:') ifTrue: [
551
- aCollection first isBlockNode ifTrue: [
552
- stream nextPutAll: '(($receiver = '.
553
- self visit: anObject.
554
- stream nextPutAll: ') !!= nil && $receiver !!= undefined) ? '.
555
- self visit: aCollection first.
556
- stream nextPutAll: '() : nil'.
557
- inlined := true]].
558
-
559
- (aSelector = 'ifNil:ifNotNil:') ifTrue: [
560
- (aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
561
- stream nextPutAll: '(($receiver = '.
562
- self visit: anObject.
563
- stream nextPutAll: ') == nil || $receiver == undefined) ? '.
564
- self visit: aCollection first.
565
- stream nextPutAll: '() : '.
566
- self visit: aCollection second.
567
- stream nextPutAll: '()'.
568
- inlined := true]].
569
-
570
- (aSelector = 'ifNotNil:ifNil:') ifTrue: [
571
- (aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
572
- stream nextPutAll: '(($receiver = '.
573
- self visit: anObject.
574
- stream nextPutAll: ') == nil || $receiver == undefined) ? '.
575
- self visit: aCollection second.
576
- stream nextPutAll: '() : '.
577
- self visit: aCollection first.
578
- stream nextPutAll: '()'.
579
- inlined := true]].
580
-
581
- ^inlined
582
- !
583
-
584
- isNode: aNode ofClass: aClass
585
- ^aNode isValueNode and: [
586
- aNode value class = aClass or: [
587
- aNode value = 'self' and: [self currentClass = aClass]]]
588
- ! !
589
-
590
- !FunCodeGenerator methodsFor: 'testing'!
591
-
592
- performOptimizations
593
- ^self class performOptimizations
594
- ! !
595
-
596
- !FunCodeGenerator methodsFor: 'visiting'!
597
-
598
- send: aSelector to: aReceiver arguments: aCollection superSend: aBoolean
599
- ^String streamContents: [:str || tmp |
600
- tmp := stream.
601
- str nextPutAll: 'smalltalk.send('.
602
- str nextPutAll: aReceiver.
603
- str nextPutAll: ', "', aSelector asSelector, '", ['.
604
- stream := str.
605
- aCollection
606
- do: [:each | self visit: each]
607
- separatedBy: [stream nextPutAll: ', '].
608
- stream := tmp.
609
- str nextPutAll: ']'.
610
- aBoolean ifTrue: [
611
- str nextPutAll: ', smalltalk.', (self classNameFor: self currentClass), '.superclass || nil'].
612
- str nextPutAll: ')']
613
- !
614
-
615
- visit: aNode
616
- aNode accept: self
617
- !
618
-
619
- visitAssignmentNode: aNode
620
- stream nextPutAll: '('.
621
- self visit: aNode left.
622
- stream nextPutAll: '='.
623
- self visit: aNode right.
624
- stream nextPutAll: ')'
625
- !
626
-
627
- visitBlockNode: aNode
628
- stream nextPutAll: '(function('.
629
- aNode parameters
630
- do: [:each |
631
- tempVariables add: each.
632
- stream nextPutAll: each]
633
- separatedBy: [stream nextPutAll: ', '].
634
- stream nextPutAll: '){'.
635
- aNode nodes do: [:each | self visit: each].
636
- stream nextPutAll: '})'
637
- !
638
-
639
- visitBlockSequenceNode: aNode
640
- | index |
641
- nestedBlocks := nestedBlocks + 1.
642
- aNode nodes isEmpty
643
- ifTrue: [
644
- stream nextPutAll: 'return nil;']
645
- ifFalse: [
646
- aNode temps do: [:each | | temp |
647
- temp := self safeVariableNameFor: each.
648
- tempVariables add: temp.
649
- stream nextPutAll: 'var ', temp, '=nil;'; lf].
650
- index := 0.
651
- aNode nodes do: [:each |
652
- index := index + 1.
653
- index = aNode nodes size ifTrue: [
654
- stream nextPutAll: 'return '].
655
- self visit: each.
656
- stream nextPutAll: ';']].
657
- nestedBlocks := nestedBlocks - 1
658
- !
659
-
660
- visitCascadeNode: aNode
661
- | index |
662
- index := 0.
663
- (tempVariables includes: '$rec') ifFalse: [
664
- tempVariables add: '$rec'].
665
- stream nextPutAll: '(function($rec){'.
666
- aNode nodes do: [:each |
667
- index := index + 1.
668
- index = aNode nodes size ifTrue: [
669
- stream nextPutAll: 'return '].
670
- each receiver: (VariableNode new value: '$rec').
671
- self visit: each.
672
- stream nextPutAll: ';'].
673
- stream nextPutAll: '})('.
674
- self visit: aNode receiver.
675
- stream nextPutAll: ')'
676
- !
677
-
678
- visitClassReferenceNode: aNode
679
- (referencedClasses includes: aNode value) ifFalse: [
680
- referencedClasses add: aNode value].
681
- stream nextPutAll: '(smalltalk.', aNode value, ' || ', aNode value, ')'
682
- !
683
-
684
- visitDynamicArrayNode: aNode
685
- stream nextPutAll: '['.
686
- aNode nodes
687
- do: [:each | self visit: each]
688
- separatedBy: [stream nextPutAll: ','].
689
- stream nextPutAll: ']'
690
- !
691
-
692
- visitDynamicDictionaryNode: aNode
693
- stream nextPutAll: 'smalltalk.HashedCollection._fromPairs_(['.
694
- aNode nodes
695
- do: [:each | self visit: each]
696
- separatedBy: [stream nextPutAll: ','].
697
- stream nextPutAll: '])'
698
- !
699
-
700
- visitFailure: aFailure
701
- self error: aFailure asString
702
- !
703
-
704
- visitJSStatementNode: aNode
705
- stream nextPutAll: aNode source
706
- !
707
-
708
- visitMethodNode: aNode
709
- | str currentSelector |
710
- currentSelector := aNode selector asSelector.
711
- nestedBlocks := 0.
712
- earlyReturn := false.
713
- messageSends := #().
714
- referencedClasses := #().
715
- unknownVariables := #().
716
- tempVariables := #().
717
- argVariables := #().
718
- stream
719
- nextPutAll: 'smalltalk.method({'; lf;
720
- nextPutAll: 'selector: "', aNode selector, '",'; lf.
721
- stream nextPutAll: 'source: ', self source asJavascript, ',';lf.
722
- stream nextPutAll: 'fn: function('.
723
- aNode arguments
724
- do: [:each |
725
- argVariables add: each.
726
- stream nextPutAll: each]
727
- separatedBy: [stream nextPutAll: ', '].
728
- stream
729
- nextPutAll: '){'; lf;
730
- nextPutAll: 'var self=this;'; lf.
731
- str := stream.
732
- stream := '' writeStream.
733
- aNode nodes do: [:each |
734
- self visit: each].
735
- earlyReturn ifTrue: [
736
- str nextPutAll: 'var $early={};'; lf; nextPutAll: 'try{'].
737
- str nextPutAll: stream contents.
738
- stream := str.
739
- stream
740
- lf;
741
- nextPutAll: 'return self;'.
742
- earlyReturn ifTrue: [
743
- stream lf; nextPutAll: '} catch(e) {if(e===$early)return e[0]; throw e}'].
744
- stream nextPutAll: '}'.
745
- stream
746
- nextPutAll: ',', String lf, 'messageSends: ';
747
- nextPutAll: messageSends asJavascript, ','; lf;
748
- nextPutAll: 'args: ', argVariables asJavascript, ','; lf;
749
- nextPutAll: 'referencedClasses: ['.
750
- referencedClasses
751
- do: [:each | stream nextPutAll: each printString]
752
- separatedBy: [stream nextPutAll: ','].
753
- stream nextPutAll: ']'.
754
- stream nextPutAll: '})'
755
- !
756
-
757
- visitReturnNode: aNode
758
- nestedBlocks > 0 ifTrue: [
759
- earlyReturn := true].
760
- nestedBlocks > 0
761
- ifTrue: [
762
- stream
763
- nextPutAll: '(function(){throw $early=[']
764
- ifFalse: [stream nextPutAll: 'return '].
765
- aNode nodes do: [:each |
766
- self visit: each].
767
- nestedBlocks > 0 ifTrue: [
768
- stream nextPutAll: ']})()']
769
- !
770
-
771
- visitSendNode: aNode
772
- | str receiver superSend inlined |
773
- str := stream.
774
- (messageSends includes: aNode selector) ifFalse: [
775
- messageSends add: aNode selector].
776
- stream := '' writeStream.
777
- self visit: aNode receiver.
778
- superSend := stream contents = 'super'.
779
- receiver := superSend ifTrue: ['self'] ifFalse: [stream contents].
780
- stream := str.
781
-
782
- self performOptimizations
783
- ifTrue: [
784
- (self inlineLiteral: aNode selector receiverNode: aNode receiver argumentNodes: aNode arguments) ifFalse: [
785
- (self inline: aNode selector receiver: receiver argumentNodes: aNode arguments)
786
- ifTrue: [stream nextPutAll: ' : ', (self send: aNode selector to: '$receiver' arguments: aNode arguments superSend: superSend), ')']
787
- ifFalse: [stream nextPutAll: (self send: aNode selector to: receiver arguments: aNode arguments superSend: superSend)]]]
788
- ifFalse: [stream nextPutAll: (self send: aNode selector to: receiver arguments: aNode arguments superSend: superSend)]
789
- !
790
-
791
- visitSequenceNode: aNode
792
- aNode temps do: [:each || temp |
793
- temp := self safeVariableNameFor: each.
794
- tempVariables add: temp.
795
- stream nextPutAll: 'var ', temp, '=nil;'; lf].
796
- aNode nodes do: [:each |
797
- self visit: each.
798
- stream nextPutAll: ';']
799
- separatedBy: [stream lf]
800
- !
801
-
802
- visitValueNode: aNode
803
- stream nextPutAll: aNode value asJavascript
804
- !
805
-
806
- visitVariableNode: aNode
807
- | varName |
808
- (self currentClass allInstanceVariableNames includes: aNode value)
809
- ifTrue: [stream nextPutAll: 'self[''@', aNode value, ''']']
810
- ifFalse: [
811
- varName := self safeVariableNameFor: aNode value.
812
- (self knownVariables includes: varName)
813
- ifFalse: [
814
- unknownVariables add: aNode value.
815
- aNode assigned
816
- ifTrue: [stream nextPutAll: varName]
817
- ifFalse: [stream nextPutAll: '(typeof ', varName, ' == ''undefined'' ? nil : ', varName, ')']]
818
- ifTrue: [
819
- aNode value = 'thisContext'
820
- ifTrue: [stream nextPutAll: '(smalltalk.getThisContext())']
821
- ifFalse: [stream nextPutAll: varName]]]
822
- ! !
823
-
824
- FunCodeGenerator class instanceVariableNames: 'performOptimizations'!
825
-
826
- !FunCodeGenerator class methodsFor: 'accessing'!
827
-
828
- performOptimizations
829
- ^performOptimizations ifNil: [true]
830
- !
831
-
832
- performOptimizations: aBoolean
833
- performOptimizations := aBoolean
834
- ! !
835
-