mdbe 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/LICENSE.txt +21 -0
- data/README.md +53 -0
- data/app.rb +182 -0
- data/bin/mdbe +5 -0
- data/config.ru +2 -0
- data/environment.rb +8 -0
- data/lib/mdbe.rb +39 -0
- data/lib/mdbe/action_controller_debug_patch.rb +12 -0
- data/lib/mdbe/code_evaluation.rb +46 -0
- data/lib/mdbe/database_views.rb +24 -0
- data/lib/mdbe/database_views/abstract_dictionary.rb +69 -0
- data/lib/mdbe/database_views/abstract_exception.rb +25 -0
- data/lib/mdbe/database_views/array.rb +28 -0
- data/lib/mdbe/database_views/boolean.rb +12 -0
- data/lib/mdbe/database_views/class.rb +46 -0
- data/lib/mdbe/database_views/exception.rb +3 -0
- data/lib/mdbe/database_views/execblock.rb +5 -0
- data/lib/mdbe/database_views/fixnum.rb +5 -0
- data/lib/mdbe/database_views/float.rb +5 -0
- data/lib/mdbe/database_views/globals.rb +2 -0
- data/lib/mdbe/database_views/gsnmethod.rb +29 -0
- data/lib/mdbe/database_views/hash.rb +5 -0
- data/lib/mdbe/database_views/maglev_record.rb +42 -0
- data/lib/mdbe/database_views/module.rb +103 -0
- data/lib/mdbe/database_views/nilclass.rb +5 -0
- data/lib/mdbe/database_views/object.rb +80 -0
- data/lib/mdbe/database_views/proc.rb +3 -0
- data/lib/mdbe/database_views/repository.rb +3 -0
- data/lib/mdbe/database_views/ruby_workspace.rb +5 -0
- data/lib/mdbe/database_views/smalltalk_classes.rb +34 -0
- data/lib/mdbe/database_views/smalltalk_classes.st +60 -0
- data/lib/mdbe/database_views/string.rb +31 -0
- data/lib/mdbe/database_views/symbol.rb +32 -0
- data/lib/mdbe/database_views/system.rb +61 -0
- data/lib/mdbe/database_views/thread.rb +101 -0
- data/lib/mdbe/debug_server.rb +22 -0
- data/lib/mdbe/halt.rb +42 -0
- data/lib/mdbe/ruby_workspace.rb +29 -0
- data/lib/mdbe/version.rb +3 -0
- data/lib/tasks/maglev-database-explorer_tasks.rake +4 -0
- data/public/LICENSE +35 -0
- data/public/amber/CHANGELOG +65 -0
- data/public/amber/LICENSE +22 -0
- data/public/amber/Makefile +53 -0
- data/public/amber/README.md +30 -0
- data/public/amber/bin/amber +3 -0
- data/public/amber/bin/amberc +352 -0
- data/public/amber/bin/nodecompile.js +33 -0
- data/public/amber/bin/server +3 -0
- data/public/amber/bin/server.bat +3 -0
- data/public/amber/css/amber-normalize.css +468 -0
- data/public/amber/css/amber-normalize.less +501 -0
- data/public/amber/css/amber.css +539 -0
- data/public/amber/css/documentation.css +84 -0
- data/public/amber/css/profstef.css +75 -0
- data/public/amber/css/style.css +313 -0
- data/public/amber/documentation.html +37 -0
- data/public/amber/examples/Makefile +23 -0
- data/public/amber/examples/README +4 -0
- data/public/amber/examples/android/helloamber/AndroidManifest.xml +19 -0
- data/public/amber/examples/android/helloamber/HelloAmber.st +13 -0
- data/public/amber/examples/android/helloamber/Makefile +56 -0
- data/public/amber/examples/android/helloamber/README.md +80 -0
- data/public/amber/examples/android/helloamber/ant.properties +17 -0
- data/public/amber/examples/android/helloamber/assets/index.html +15 -0
- data/public/amber/examples/android/helloamber/assets/jquery-1.7.2.min.js +4 -0
- data/public/amber/examples/android/helloamber/build.xml +83 -0
- data/public/amber/examples/android/helloamber/local.properties +10 -0
- data/public/amber/examples/android/helloamber/proguard-project.txt +20 -0
- data/public/amber/examples/android/helloamber/project.properties +14 -0
- data/public/amber/examples/android/helloamber/res/layout/main.xml +6 -0
- data/public/amber/examples/android/helloamber/res/values/strings.xml +4 -0
- data/public/amber/examples/android/helloamber/src/org/amberlang/android/helloamber/HelloAmber.java +59 -0
- data/public/amber/examples/myproject/index.html +16 -0
- data/public/amber/examples/nodejs/README +9 -0
- data/public/amber/examples/nodejs/benchfib/Benchfib.st +124 -0
- data/public/amber/examples/nodejs/benchfib/Makefile +8 -0
- data/public/amber/examples/nodejs/benchfib/benchfib +1 -0
- data/public/amber/examples/nodejs/hello/Hello.st +9 -0
- data/public/amber/examples/nodejs/hello/Makefile +8 -0
- data/public/amber/examples/nodejs/hello/README +13 -0
- data/public/amber/examples/nodejs/hello/hello +1 -0
- data/public/amber/examples/nodejs/meta/Makefile +8 -0
- data/public/amber/examples/nodejs/meta/MyScript.st +27 -0
- data/public/amber/examples/nodejs/meta/meta +1 -0
- data/public/amber/examples/nodejs/pystone/Makefile +8 -0
- data/public/amber/examples/nodejs/pystone/Pystone.st +306 -0
- data/public/amber/examples/nodejs/pystone/pystone +1 -0
- data/public/amber/examples/nodejs/trivialserver/Makefile +8 -0
- data/public/amber/examples/nodejs/trivialserver/TrivialServer.st +51 -0
- data/public/amber/examples/nodejs/trivialserver/trivial +1 -0
- data/public/amber/examples/presentation/esug2011/images/asterix.png +0 -0
- data/public/amber/examples/presentation/esug2011/images/background_box.png +0 -0
- data/public/amber/examples/presentation/esug2011/images/background_header.png +0 -0
- data/public/amber/examples/presentation/esug2011/images/balloon.jpg +0 -0
- data/public/amber/examples/presentation/esug2011/images/balloon_header.png +0 -0
- data/public/amber/examples/presentation/esug2011/images/devices.jpg +0 -0
- data/public/amber/examples/presentation/esug2011/images/enyo.png +0 -0
- data/public/amber/examples/presentation/esug2011/images/ide_star_wars.png +0 -0
- data/public/amber/examples/presentation/esug2011/images/nodejs.png +0 -0
- data/public/amber/examples/presentation/esug2011/images/terminal.png +0 -0
- data/public/amber/examples/presentation/esug2011/images/webos.png +0 -0
- data/public/amber/examples/presentation/fosdem2012/images/amber.png +0 -0
- data/public/amber/examples/presentation/fosdem2012/images/ambrhino.jpg +0 -0
- data/public/amber/examples/presentation/fosdem2012/images/nodejs.png +0 -0
- data/public/amber/examples/presentation/fosdem2012/images/pharo.png +0 -0
- data/public/amber/examples/presentation/fosdem2012/images/php.gif +0 -0
- data/public/amber/examples/presentation/fosdem2012/images/rails.png +0 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/images/arrow-next.png +0 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/images/arrow-prev.png +0 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/images/closedhand.cur +0 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/images/openhand.cur +0 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/images/shadow-top-back.png +0 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/images/shadow-top-forward.png +0 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/images/shadow.png +0 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/jquery.booklet.1.2.0.css +100 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/jquery.booklet.1.2.0.js +1232 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/jquery.booklet.1.2.0.min.js +13 -0
- data/public/amber/examples/presentation/fosdem2012/lib/booklet/jquery.easing.1.3.js +38 -0
- data/public/amber/examples/presentation/index.html +17 -0
- data/public/amber/examples/presentation/js/Presentation.deploy.js +1922 -0
- data/public/amber/examples/presentation/js/Presentation.js +2712 -0
- data/public/amber/examples/presentation/st/Presentation.st +1996 -0
- data/public/amber/examples/trysmalltalk/index.html +18 -0
- data/public/amber/examples/trysmalltalk/js/TrySmalltalk.deploy.js +837 -0
- data/public/amber/examples/trysmalltalk/js/TrySmalltalk.js +1206 -0
- data/public/amber/examples/trysmalltalk/st/TrySmalltalk.st +964 -0
- data/public/amber/examples/twitterwall/css/twitterwall.css +19 -0
- data/public/amber/examples/twitterwall/index.html +35 -0
- data/public/amber/examples/twitterwall/js/TwitterWall.deploy.js +116 -0
- data/public/amber/examples/twitterwall/js/TwitterWall.js +146 -0
- data/public/amber/examples/twitterwall/st/TwitterWall.st +91 -0
- data/public/amber/examples/webos/README +11 -0
- data/public/amber/examples/webos/eris/DuckQwaq.wav +0 -0
- data/public/amber/examples/webos/eris/EnyoAmber.st +36 -0
- data/public/amber/examples/webos/eris/Eris.css +0 -0
- data/public/amber/examples/webos/eris/Eris.st +86 -0
- data/public/amber/examples/webos/eris/Makefile +37 -0
- data/public/amber/examples/webos/eris/README +3 -0
- data/public/amber/examples/webos/eris/appinfo.json +10 -0
- data/public/amber/examples/webos/eris/index.html +12 -0
- data/public/amber/examples/webos/helloamber/EnyoAmber.st +36 -0
- data/public/amber/examples/webos/helloamber/HelloAmber.st +86 -0
- data/public/amber/examples/webos/helloamber/Makefile +38 -0
- data/public/amber/examples/webos/helloamber/README +5 -0
- data/public/amber/examples/webos/helloamber/appinfo.json +10 -0
- data/public/amber/examples/webos/helloamber/index.html +12 -0
- data/public/amber/favicon.ico +0 -0
- data/public/amber/images/amber.png +0 -0
- data/public/amber/images/amber.svg +706 -0
- data/public/amber/images/amber_small.png +0 -0
- data/public/amber/images/off.amber.png +0 -0
- data/public/amber/images/off.png +0 -0
- data/public/amber/images/offHover.amber.png +0 -0
- data/public/amber/images/offHover.png +0 -0
- data/public/amber/images/presentation.png +0 -0
- data/public/amber/images/profstef.png +0 -0
- data/public/amber/images/sprite.amber.png +0 -0
- data/public/amber/images/sprite.png +0 -0
- data/public/amber/images/tinylogo.amber.png +0 -0
- data/public/amber/images/tinylogo.png +0 -0
- data/public/amber/images/twitterwall.png +0 -0
- data/public/amber/index.html +55 -0
- data/public/amber/js/Additional-Examples.deploy.js +15 -0
- data/public/amber/js/Additional-Examples.js +21 -0
- data/public/amber/js/Benchfib.deploy.js +132 -0
- data/public/amber/js/Benchfib.js +167 -0
- data/public/amber/js/Canvas.deploy.js +2446 -0
- data/public/amber/js/Canvas.js +3547 -0
- data/public/amber/js/Compiler-Tests.deploy.js +97 -0
- data/public/amber/js/Compiler-Tests.js +137 -0
- data/public/amber/js/Compiler.deploy.js +1877 -0
- data/public/amber/js/Compiler.js +2622 -0
- data/public/amber/js/Documentation.deploy.js +961 -0
- data/public/amber/js/Documentation.js +1376 -0
- data/public/amber/js/Examples.deploy.js +53 -0
- data/public/amber/js/Examples.js +73 -0
- data/public/amber/js/IDE.deploy.js +3557 -0
- data/public/amber/js/IDE.js +5002 -0
- data/public/amber/js/Kernel-Announcements.deploy.js +107 -0
- data/public/amber/js/Kernel-Announcements.js +152 -0
- data/public/amber/js/Kernel-Classes.deploy.js +774 -0
- data/public/amber/js/Kernel-Classes.js +1095 -0
- data/public/amber/js/Kernel-Collections.deploy.js +3121 -0
- data/public/amber/js/Kernel-Collections.js +4427 -0
- data/public/amber/js/Kernel-Exceptions.deploy.js +244 -0
- data/public/amber/js/Kernel-Exceptions.js +349 -0
- data/public/amber/js/Kernel-Methods.deploy.js +573 -0
- data/public/amber/js/Kernel-Methods.js +807 -0
- data/public/amber/js/Kernel-Objects.deploy.js +2877 -0
- data/public/amber/js/Kernel-Objects.js +4107 -0
- data/public/amber/js/Kernel-Tests.deploy.js +1513 -0
- data/public/amber/js/Kernel-Tests.js +2053 -0
- data/public/amber/js/Kernel-Transcript.deploy.js +142 -0
- data/public/amber/js/Kernel-Transcript.js +202 -0
- data/public/amber/js/Maglev-Core.deploy.js +2996 -0
- data/public/amber/js/Maglev-Core.js +4246 -0
- data/public/amber/js/Maglev-Database-Explorer.deploy.js +4476 -0
- data/public/amber/js/Maglev-Database-Explorer.js +6232 -0
- data/public/amber/js/Maglev-Vendor.deploy.js +350 -0
- data/public/amber/js/Maglev-Vendor.js +465 -0
- data/public/amber/js/README.md +5 -0
- data/public/amber/js/SUnit.deploy.js +351 -0
- data/public/amber/js/SUnit.js +501 -0
- data/public/amber/js/amber.js +273 -0
- data/public/amber/js/boot.js +602 -0
- data/public/amber/js/compat.js +22 -0
- data/public/amber/js/init.js +9 -0
- data/public/amber/js/lib/CodeMirror/LICENSE +19 -0
- data/public/amber/js/lib/CodeMirror/active-line.js +39 -0
- data/public/amber/js/lib/CodeMirror/amber.css +21 -0
- data/public/amber/js/lib/CodeMirror/codemirror.css +67 -0
- data/public/amber/js/lib/CodeMirror/codemirror.js +2144 -0
- data/public/amber/js/lib/CodeMirror/smalltalk.js +134 -0
- data/public/amber/js/lib/jQuery/jquery-1.4.4.min.js +167 -0
- data/public/amber/js/lib/jQuery/jquery-1.6.4.min.js +4 -0
- data/public/amber/js/lib/jQuery/jquery-ui-1.8.16.custom.min.js +791 -0
- data/public/amber/js/lib/jQuery/jquery.textarea.js +267 -0
- data/public/amber/js/lib/peg-0.6.2.min.js +2 -0
- data/public/amber/js/lib/showdown.js +419 -0
- data/public/amber/js/parser.js +4222 -0
- data/public/amber/js/parser.pegjs +223 -0
- data/public/amber/learn.html +40 -0
- data/public/amber/repl/Makefile +8 -0
- data/public/amber/repl/REPL.js +124 -0
- data/public/amber/repl/REPL.st +56 -0
- data/public/amber/repl/amber.js +18085 -0
- data/public/amber/server/FileServer.st +576 -0
- data/public/amber/server/Makefile +8 -0
- data/public/amber/server/server.js +13049 -0
- data/public/amber/st/Benchfib.js +297 -0
- data/public/amber/st/Benchfib.st +124 -0
- data/public/amber/st/Canvas.st +968 -0
- data/public/amber/st/Compiler-Tests.st +471 -0
- data/public/amber/st/Compiler.st +1445 -0
- data/public/amber/st/Documentation.st +758 -0
- data/public/amber/st/Examples.js +100 -0
- data/public/amber/st/Examples.st +38 -0
- data/public/amber/st/IDE.st +2404 -0
- data/public/amber/st/Kernel-Announcements.st +61 -0
- data/public/amber/st/Kernel-Classes.st +462 -0
- data/public/amber/st/Kernel-Collections.st +1611 -0
- data/public/amber/st/Kernel-Exceptions.st +124 -0
- data/public/amber/st/Kernel-Methods.st +291 -0
- data/public/amber/st/Kernel-Objects.st +1587 -0
- data/public/amber/st/Kernel-Tests.st +953 -0
- data/public/amber/st/Kernel-Transcript.st +70 -0
- data/public/amber/st/Maglev-Core.st +1694 -0
- data/public/amber/st/Maglev-Database-Explorer.st +3148 -0
- data/public/amber/st/Maglev-Vendor.st +151 -0
- data/public/amber/st/Makefile +104 -0
- data/public/amber/st/README.md +4 -0
- data/public/amber/st/SUnit.st +172 -0
- data/public/css/bootstrap-combined.no-icons.min.css +731 -0
- data/public/css/bootstrap.css +6811 -0
- data/public/css/images/animated-overlay.gif +0 -0
- data/public/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/public/css/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/public/css/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/public/css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/public/css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/public/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/public/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/public/css/images/ui-icons_222222_256x240.png +0 -0
- data/public/css/images/ui-icons_228ef1_256x240.png +0 -0
- data/public/css/images/ui-icons_ef8c08_256x240.png +0 -0
- data/public/css/images/ui-icons_ffd27a_256x240.png +0 -0
- data/public/css/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/jquery-ui.min.css +5 -0
- data/public/css/smalltalk_code.css +42 -0
- data/public/css/style.css +210 -0
- data/public/images/bg_tile.png +0 -0
- data/public/images/maglev-logo.gif +0 -0
- data/public/images/mchammer.gif +0 -0
- data/public/images/rails_tiny.png +0 -0
- data/public/images/ruby.png +0 -0
- data/public/images/ruby_smalltalk_bridge.png +0 -0
- data/public/images/smalltalk.png +0 -0
- data/public/img/glyphicons-halflings.png +0 -0
- data/public/index.html +118 -0
- data/public/libs/bootstrap.min.js +7 -0
- data/public/libs/codemirror/CONTRIBUTING.md +72 -0
- data/public/libs/codemirror/LICENSE +23 -0
- data/public/libs/codemirror/README.md +11 -0
- data/public/libs/codemirror/addon/dialog/dialog.css +32 -0
- data/public/libs/codemirror/addon/dialog/dialog.js +80 -0
- data/public/libs/codemirror/addon/display/placeholder.js +54 -0
- data/public/libs/codemirror/addon/edit/closebrackets.js +54 -0
- data/public/libs/codemirror/addon/edit/closetag.js +86 -0
- data/public/libs/codemirror/addon/edit/continuecomment.js +44 -0
- data/public/libs/codemirror/addon/edit/continuelist.js +25 -0
- data/public/libs/codemirror/addon/edit/matchbrackets.js +82 -0
- data/public/libs/codemirror/addon/fold/brace-fold.js +31 -0
- data/public/libs/codemirror/addon/fold/foldcode.js +32 -0
- data/public/libs/codemirror/addon/fold/indent-fold.js +11 -0
- data/public/libs/codemirror/addon/fold/xml-fold.js +64 -0
- data/public/libs/codemirror/addon/hint/html-hint.js +582 -0
- data/public/libs/codemirror/addon/hint/javascript-hint.js +142 -0
- data/public/libs/codemirror/addon/hint/pig-hint.js +117 -0
- data/public/libs/codemirror/addon/hint/python-hint.js +93 -0
- data/public/libs/codemirror/addon/hint/show-hint.css +38 -0
- data/public/libs/codemirror/addon/hint/show-hint.js +180 -0
- data/public/libs/codemirror/addon/hint/xml-hint.js +118 -0
- data/public/libs/codemirror/addon/lint/javascript-lint.js +127 -0
- data/public/libs/codemirror/addon/lint/json-lint.js +14 -0
- data/public/libs/codemirror/addon/lint/lint.css +96 -0
- data/public/libs/codemirror/addon/lint/lint.js +197 -0
- data/public/libs/codemirror/addon/mode/loadmode.js +51 -0
- data/public/libs/codemirror/addon/mode/multiplex.js +95 -0
- data/public/libs/codemirror/addon/mode/overlay.js +59 -0
- data/public/libs/codemirror/addon/runmode/colorize.js +29 -0
- data/public/libs/codemirror/addon/runmode/runmode-standalone.js +130 -0
- data/public/libs/codemirror/addon/runmode/runmode.js +52 -0
- data/public/libs/codemirror/addon/runmode/runmode.node.js +89 -0
- data/public/libs/codemirror/addon/search/match-highlighter.js +60 -0
- data/public/libs/codemirror/addon/search/search.js +131 -0
- data/public/libs/codemirror/addon/search/searchcursor.js +133 -0
- data/public/libs/codemirror/addon/selection/active-line.js +39 -0
- data/public/libs/codemirror/addon/selection/mark-selection.js +34 -0
- data/public/libs/codemirror/bin/compress +91 -0
- data/public/libs/codemirror/bin/lint +11 -0
- data/public/libs/codemirror/demo/activeline.html +70 -0
- data/public/libs/codemirror/demo/bidi.html +61 -0
- data/public/libs/codemirror/demo/btree.html +87 -0
- data/public/libs/codemirror/demo/buffers.html +98 -0
- data/public/libs/codemirror/demo/changemode.html +50 -0
- data/public/libs/codemirror/demo/closebrackets.html +63 -0
- data/public/libs/codemirror/demo/closetag.html +37 -0
- data/public/libs/codemirror/demo/complete.html +70 -0
- data/public/libs/codemirror/demo/emacs.html +60 -0
- data/public/libs/codemirror/demo/folding.html +69 -0
- data/public/libs/codemirror/demo/fullscreen.html +147 -0
- data/public/libs/codemirror/demo/html5complete.html +92 -0
- data/public/libs/codemirror/demo/indentwrap.html +49 -0
- data/public/libs/codemirror/demo/lint.html +90 -0
- data/public/libs/codemirror/demo/loadmode.html +40 -0
- data/public/libs/codemirror/demo/marker.html +59 -0
- data/public/libs/codemirror/demo/markselection.html +36 -0
- data/public/libs/codemirror/demo/matchhighlighter.html +38 -0
- data/public/libs/codemirror/demo/multiplex.html +60 -0
- data/public/libs/codemirror/demo/mustache.html +59 -0
- data/public/libs/codemirror/demo/placeholder.html +36 -0
- data/public/libs/codemirror/demo/preview.html +76 -0
- data/public/libs/codemirror/demo/resize.html +49 -0
- data/public/libs/codemirror/demo/runmode.html +50 -0
- data/public/libs/codemirror/demo/search.html +85 -0
- data/public/libs/codemirror/demo/spanaffectswrapping_shim.html +73 -0
- data/public/libs/codemirror/demo/theme.html +89 -0
- data/public/libs/codemirror/demo/variableheight.html +52 -0
- data/public/libs/codemirror/demo/vim.html +65 -0
- data/public/libs/codemirror/demo/visibletabs.html +53 -0
- data/public/libs/codemirror/demo/widget.html +74 -0
- data/public/libs/codemirror/demo/xmlcomplete.html +81 -0
- data/public/libs/codemirror/index.html +487 -0
- data/public/libs/codemirror/keymap/emacs.js +30 -0
- data/public/libs/codemirror/keymap/vim.js +3044 -0
- data/public/libs/codemirror/lib/codemirror.css +253 -0
- data/public/libs/codemirror/lib/codemirror.js +5585 -0
- data/public/libs/codemirror/mode/apl/apl.js +160 -0
- data/public/libs/codemirror/mode/apl/index.html +61 -0
- data/public/libs/codemirror/mode/asterisk/asterisk.js +183 -0
- data/public/libs/codemirror/mode/asterisk/index.html +142 -0
- data/public/libs/codemirror/mode/clike/clike.js +302 -0
- data/public/libs/codemirror/mode/clike/index.html +103 -0
- data/public/libs/codemirror/mode/clike/scala.html +767 -0
- data/public/libs/codemirror/mode/clojure/clojure.js +222 -0
- data/public/libs/codemirror/mode/clojure/index.html +76 -0
- data/public/libs/codemirror/mode/coffeescript/LICENSE +22 -0
- data/public/libs/codemirror/mode/coffeescript/coffeescript.js +346 -0
- data/public/libs/codemirror/mode/coffeescript/index.html +728 -0
- data/public/libs/codemirror/mode/commonlisp/commonlisp.js +101 -0
- data/public/libs/codemirror/mode/commonlisp/index.html +165 -0
- data/public/libs/codemirror/mode/css/css.js +567 -0
- data/public/libs/codemirror/mode/css/index.html +58 -0
- data/public/libs/codemirror/mode/css/scss.html +145 -0
- data/public/libs/codemirror/mode/css/scss_test.js +80 -0
- data/public/libs/codemirror/mode/css/test.js +113 -0
- data/public/libs/codemirror/mode/d/d.js +205 -0
- data/public/libs/codemirror/mode/d/index.html +262 -0
- data/public/libs/codemirror/mode/diff/diff.js +32 -0
- data/public/libs/codemirror/mode/diff/index.html +105 -0
- data/public/libs/codemirror/mode/ecl/ecl.js +192 -0
- data/public/libs/codemirror/mode/ecl/index.html +39 -0
- data/public/libs/codemirror/mode/erlang/erlang.js +463 -0
- data/public/libs/codemirror/mode/erlang/index.html +64 -0
- data/public/libs/codemirror/mode/gas/gas.js +326 -0
- data/public/libs/codemirror/mode/gas/index.html +57 -0
- data/public/libs/codemirror/mode/gfm/gfm.js +96 -0
- data/public/libs/codemirror/mode/gfm/index.html +74 -0
- data/public/libs/codemirror/mode/gfm/test.js +112 -0
- data/public/libs/codemirror/mode/go/go.js +165 -0
- data/public/libs/codemirror/mode/go/index.html +74 -0
- data/public/libs/codemirror/mode/groovy/groovy.js +210 -0
- data/public/libs/codemirror/mode/groovy/index.html +73 -0
- data/public/libs/codemirror/mode/haskell/haskell.js +242 -0
- data/public/libs/codemirror/mode/haskell/index.html +62 -0
- data/public/libs/codemirror/mode/haxe/haxe.js +429 -0
- data/public/libs/codemirror/mode/haxe/index.html +90 -0
- data/public/libs/codemirror/mode/htmlembedded/htmlembedded.js +73 -0
- data/public/libs/codemirror/mode/htmlembedded/index.html +49 -0
- data/public/libs/codemirror/mode/htmlmixed/htmlmixed.js +104 -0
- data/public/libs/codemirror/mode/htmlmixed/index.html +73 -0
- data/public/libs/codemirror/mode/http/http.js +98 -0
- data/public/libs/codemirror/mode/http/index.html +32 -0
- data/public/libs/codemirror/mode/javascript/index.html +92 -0
- data/public/libs/codemirror/mode/javascript/javascript.js +467 -0
- data/public/libs/codemirror/mode/javascript/typescript.html +48 -0
- data/public/libs/codemirror/mode/jinja2/index.html +38 -0
- data/public/libs/codemirror/mode/jinja2/jinja2.js +42 -0
- data/public/libs/codemirror/mode/less/index.html +741 -0
- data/public/libs/codemirror/mode/less/less.js +266 -0
- data/public/libs/codemirror/mode/livescript/LICENSE +23 -0
- data/public/libs/codemirror/mode/livescript/index.html +446 -0
- data/public/libs/codemirror/mode/livescript/livescript.js +267 -0
- data/public/libs/codemirror/mode/livescript/livescript.ls +266 -0
- data/public/libs/codemirror/mode/lua/index.html +74 -0
- data/public/libs/codemirror/mode/lua/lua.js +140 -0
- data/public/libs/codemirror/mode/markdown/index.html +344 -0
- data/public/libs/codemirror/mode/markdown/markdown.js +526 -0
- data/public/libs/codemirror/mode/markdown/test.js +636 -0
- data/public/libs/codemirror/mode/meta.js +75 -0
- data/public/libs/codemirror/mode/mirc/index.html +149 -0
- data/public/libs/codemirror/mode/mirc/mirc.js +177 -0
- data/public/libs/codemirror/mode/ntriples/index.html +33 -0
- data/public/libs/codemirror/mode/ntriples/ntriples.js +170 -0
- data/public/libs/codemirror/mode/ocaml/index.html +131 -0
- data/public/libs/codemirror/mode/ocaml/ocaml.js +113 -0
- data/public/libs/codemirror/mode/pascal/LICENSE +7 -0
- data/public/libs/codemirror/mode/pascal/index.html +48 -0
- data/public/libs/codemirror/mode/pascal/pascal.js +94 -0
- data/public/libs/codemirror/mode/perl/LICENSE +19 -0
- data/public/libs/codemirror/mode/perl/index.html +62 -0
- data/public/libs/codemirror/mode/perl/perl.js +816 -0
- data/public/libs/codemirror/mode/php/index.html +51 -0
- data/public/libs/codemirror/mode/php/php.js +129 -0
- data/public/libs/codemirror/mode/pig/index.html +42 -0
- data/public/libs/codemirror/mode/pig/pig.js +171 -0
- data/public/libs/codemirror/mode/properties/index.html +41 -0
- data/public/libs/codemirror/mode/properties/properties.js +63 -0
- data/public/libs/codemirror/mode/python/LICENSE.txt +21 -0
- data/public/libs/codemirror/mode/python/index.html +135 -0
- data/public/libs/codemirror/mode/python/python.js +340 -0
- data/public/libs/codemirror/mode/q/index.html +131 -0
- data/public/libs/codemirror/mode/q/q.js +124 -0
- data/public/libs/codemirror/mode/r/LICENSE +24 -0
- data/public/libs/codemirror/mode/r/index.html +74 -0
- data/public/libs/codemirror/mode/r/r.js +141 -0
- data/public/libs/codemirror/mode/rpm/changes/changes.js +19 -0
- data/public/libs/codemirror/mode/rpm/changes/index.html +53 -0
- data/public/libs/codemirror/mode/rpm/spec/index.html +99 -0
- data/public/libs/codemirror/mode/rpm/spec/spec.css +5 -0
- data/public/libs/codemirror/mode/rpm/spec/spec.js +66 -0
- data/public/libs/codemirror/mode/rst/LICENSE.txt +21 -0
- data/public/libs/codemirror/mode/rst/index.html +524 -0
- data/public/libs/codemirror/mode/rst/rst.js +550 -0
- data/public/libs/codemirror/mode/ruby/LICENSE +24 -0
- data/public/libs/codemirror/mode/ruby/index.html +173 -0
- data/public/libs/codemirror/mode/ruby/ruby.js +197 -0
- data/public/libs/codemirror/mode/rust/index.html +48 -0
- data/public/libs/codemirror/mode/rust/rust.js +432 -0
- data/public/libs/codemirror/mode/sass/index.html +54 -0
- data/public/libs/codemirror/mode/sass/sass.js +349 -0
- data/public/libs/codemirror/mode/scheme/index.html +65 -0
- data/public/libs/codemirror/mode/scheme/scheme.js +230 -0
- data/public/libs/codemirror/mode/shell/index.html +51 -0
- data/public/libs/codemirror/mode/shell/shell.js +118 -0
- data/public/libs/codemirror/mode/sieve/LICENSE +19 -0
- data/public/libs/codemirror/mode/sieve/index.html +81 -0
- data/public/libs/codemirror/mode/sieve/sieve.js +183 -0
- data/public/libs/codemirror/mode/smalltalk/index.html +57 -0
- data/public/libs/codemirror/mode/smalltalk/smalltalk.js +141 -0
- data/public/libs/codemirror/mode/smarty/index.html +83 -0
- data/public/libs/codemirror/mode/smarty/smarty.js +148 -0
- data/public/libs/codemirror/mode/sparql/index.html +42 -0
- data/public/libs/codemirror/mode/sparql/sparql.js +143 -0
- data/public/libs/codemirror/mode/sql/index.html +68 -0
- data/public/libs/codemirror/mode/sql/sql.js +268 -0
- data/public/libs/codemirror/mode/stex/index.html +98 -0
- data/public/libs/codemirror/mode/stex/stex.js +246 -0
- data/public/libs/codemirror/mode/stex/test.js +117 -0
- data/public/libs/codemirror/mode/tcl/index.html +129 -0
- data/public/libs/codemirror/mode/tcl/tcl.js +131 -0
- data/public/libs/codemirror/mode/tiddlywiki/index.html +142 -0
- data/public/libs/codemirror/mode/tiddlywiki/tiddlywiki.css +14 -0
- data/public/libs/codemirror/mode/tiddlywiki/tiddlywiki.js +353 -0
- data/public/libs/codemirror/mode/tiki/index.html +81 -0
- data/public/libs/codemirror/mode/tiki/tiki.css +26 -0
- data/public/libs/codemirror/mode/tiki/tiki.js +308 -0
- data/public/libs/codemirror/mode/turtle/index.html +39 -0
- data/public/libs/codemirror/mode/turtle/turtle.js +145 -0
- data/public/libs/codemirror/mode/vb/LICENSE.txt +21 -0
- data/public/libs/codemirror/mode/vb/index.html +88 -0
- data/public/libs/codemirror/mode/vb/vb.js +259 -0
- data/public/libs/codemirror/mode/vbscript/index.html +42 -0
- data/public/libs/codemirror/mode/vbscript/vbscript.js +26 -0
- data/public/libs/codemirror/mode/velocity/index.html +103 -0
- data/public/libs/codemirror/mode/velocity/velocity.js +144 -0
- data/public/libs/codemirror/mode/verilog/index.html +121 -0
- data/public/libs/codemirror/mode/verilog/verilog.js +182 -0
- data/public/libs/codemirror/mode/xml/index.html +45 -0
- data/public/libs/codemirror/mode/xml/xml.js +328 -0
- data/public/libs/codemirror/mode/xquery/LICENSE +20 -0
- data/public/libs/codemirror/mode/xquery/index.html +221 -0
- data/public/libs/codemirror/mode/xquery/test.js +64 -0
- data/public/libs/codemirror/mode/xquery/xquery.js +450 -0
- data/public/libs/codemirror/mode/yaml/index.html +68 -0
- data/public/libs/codemirror/mode/yaml/yaml.js +95 -0
- data/public/libs/codemirror/mode/z80/index.html +39 -0
- data/public/libs/codemirror/mode/z80/z80.js +85 -0
- data/public/libs/codemirror/package.json +21 -0
- data/public/libs/codemirror/test/doc_test.js +329 -0
- data/public/libs/codemirror/test/driver.js +138 -0
- data/public/libs/codemirror/test/index.html +182 -0
- data/public/libs/codemirror/test/lint/acorn.js +1593 -0
- data/public/libs/codemirror/test/lint/lint.js +112 -0
- data/public/libs/codemirror/test/lint/parse-js.js +1372 -0
- data/public/libs/codemirror/test/lint/walk.js +216 -0
- data/public/libs/codemirror/test/mode_test.css +10 -0
- data/public/libs/codemirror/test/mode_test.js +192 -0
- data/public/libs/codemirror/test/phantom_driver.js +31 -0
- data/public/libs/codemirror/test/run.js +33 -0
- data/public/libs/codemirror/test/test.js +1400 -0
- data/public/libs/codemirror/test/vim_test.js +1688 -0
- data/public/libs/codemirror/theme/ambiance-mobile.css +5 -0
- data/public/libs/codemirror/theme/ambiance.css +75 -0
- data/public/libs/codemirror/theme/blackboard.css +25 -0
- data/public/libs/codemirror/theme/cobalt.css +18 -0
- data/public/libs/codemirror/theme/eclipse.css +25 -0
- data/public/libs/codemirror/theme/elegant.css +10 -0
- data/public/libs/codemirror/theme/erlang-dark.css +21 -0
- data/public/libs/codemirror/theme/lesser-dark.css +44 -0
- data/public/libs/codemirror/theme/midnight.css +52 -0
- data/public/libs/codemirror/theme/monokai.css +28 -0
- data/public/libs/codemirror/theme/neat.css +9 -0
- data/public/libs/codemirror/theme/night.css +21 -0
- data/public/libs/codemirror/theme/rubyblue.css +21 -0
- data/public/libs/codemirror/theme/solarized.css +207 -0
- data/public/libs/codemirror/theme/twilight.css +26 -0
- data/public/libs/codemirror/theme/vibrant-ink.css +27 -0
- data/public/libs/codemirror/theme/xq-dark.css +46 -0
- data/public/libs/codemirror/theme/xq-light.css +43 -0
- data/public/libs/font-awesome/css/font-awesome-ie7.css +983 -0
- data/public/libs/font-awesome/css/font-awesome-ie7.min.css +24 -0
- data/public/libs/font-awesome/css/font-awesome.css +1268 -0
- data/public/libs/font-awesome/css/font-awesome.min.css +24 -0
- data/public/libs/font-awesome/font/FontAwesome.otf +0 -0
- data/public/libs/font-awesome/font/fontawesome-webfont.eot +0 -0
- data/public/libs/font-awesome/font/fontawesome-webfont.svg +339 -0
- data/public/libs/font-awesome/font/fontawesome-webfont.ttf +0 -0
- data/public/libs/font-awesome/font/fontawesome-webfont.woff +0 -0
- data/public/libs/font-awesome/less/bootstrap.less +78 -0
- data/public/libs/font-awesome/less/core.less +132 -0
- data/public/libs/font-awesome/less/extras.less +79 -0
- data/public/libs/font-awesome/less/font-awesome-ie7.less +413 -0
- data/public/libs/font-awesome/less/font-awesome.less +32 -0
- data/public/libs/font-awesome/less/icons.less +330 -0
- data/public/libs/font-awesome/less/mixins.less +34 -0
- data/public/libs/font-awesome/less/path.less +15 -0
- data/public/libs/font-awesome/less/variables.less +9 -0
- data/public/libs/jquery-1.10.0.min.js +6 -0
- data/public/libs/jquery-ui.min.js +12 -0
- data/public/libs/jquery.jsPlumb-1.4.0-all.js +9571 -0
- data/public/libs/jquery.livequery.js +226 -0
- data/public/libs/jsPlumbInitializer.js +72 -0
- data/public/libs/jstree/README.txt +10 -0
- data/public/libs/jstree/_demo/_dump.sql +20 -0
- data/public/libs/jstree/_demo/_inc/__mysql_errors.log +0 -0
- data/public/libs/jstree/_demo/_inc/class._database.php +146 -0
- data/public/libs/jstree/_demo/_inc/class._database_i.php +152 -0
- data/public/libs/jstree/_demo/_inc/class.tree.php +602 -0
- data/public/libs/jstree/_demo/_install.txt +6 -0
- data/public/libs/jstree/_demo/config.php +14 -0
- data/public/libs/jstree/_demo/file.png +0 -0
- data/public/libs/jstree/_demo/folder.png +0 -0
- data/public/libs/jstree/_demo/index.html +461 -0
- data/public/libs/jstree/_demo/root.png +0 -0
- data/public/libs/jstree/_demo/server.php +69 -0
- data/public/libs/jstree/_docs/!style.css +48 -0
- data/public/libs/jstree/_docs/_drive.png +0 -0
- data/public/libs/jstree/_docs/_html_data.html +2 -0
- data/public/libs/jstree/_docs/_json_data.json +4 -0
- data/public/libs/jstree/_docs/_search_data.json +6 -0
- data/public/libs/jstree/_docs/_search_result.json +1 -0
- data/public/libs/jstree/_docs/_xml_flat.xml +12 -0
- data/public/libs/jstree/_docs/_xml_nest.xml +18 -0
- data/public/libs/jstree/_docs/checkbox.html +171 -0
- data/public/libs/jstree/_docs/contextmenu.html +121 -0
- data/public/libs/jstree/_docs/cookies.html +97 -0
- data/public/libs/jstree/_docs/core.html +689 -0
- data/public/libs/jstree/_docs/crrm.html +316 -0
- data/public/libs/jstree/_docs/dnd.html +199 -0
- data/public/libs/jstree/_docs/hotkeys.html +82 -0
- data/public/libs/jstree/_docs/html_data.html +175 -0
- data/public/libs/jstree/_docs/index.html +86 -0
- data/public/libs/jstree/_docs/json_data.html +249 -0
- data/public/libs/jstree/_docs/languages.html +152 -0
- data/public/libs/jstree/_docs/logo.png +0 -0
- data/public/libs/jstree/_docs/search.html +153 -0
- data/public/libs/jstree/_docs/sort.html +85 -0
- data/public/libs/jstree/_docs/syntax/!script.js +2232 -0
- data/public/libs/jstree/_docs/syntax/!style.css +511 -0
- data/public/libs/jstree/_docs/syntax/clipboard.swf +0 -0
- data/public/libs/jstree/_docs/syntax/help.png +0 -0
- data/public/libs/jstree/_docs/syntax/magnifier.png +0 -0
- data/public/libs/jstree/_docs/syntax/page_white_code.png +0 -0
- data/public/libs/jstree/_docs/syntax/page_white_copy.png +0 -0
- data/public/libs/jstree/_docs/syntax/printer.png +0 -0
- data/public/libs/jstree/_docs/syntax/wrapping.png +0 -0
- data/public/libs/jstree/_docs/themeroller.html +107 -0
- data/public/libs/jstree/_docs/themes.html +127 -0
- data/public/libs/jstree/_docs/types.html +178 -0
- data/public/libs/jstree/_docs/ui.html +197 -0
- data/public/libs/jstree/_docs/unique.html +85 -0
- data/public/libs/jstree/_docs/xml_data.html +218 -0
- data/public/libs/jstree/_lib/jquery.cookie.js +96 -0
- data/public/libs/jstree/_lib/jquery.hotkeys.js +99 -0
- data/public/libs/jstree/_lib/jquery.js +5 -0
- data/public/libs/jstree/jquery.jstree.js +4564 -0
- data/public/libs/jstree/themes/apple/bg.jpg +0 -0
- data/public/libs/jstree/themes/apple/d.png +0 -0
- data/public/libs/jstree/themes/apple/dot_for_ie.gif +0 -0
- data/public/libs/jstree/themes/apple/style.css +61 -0
- data/public/libs/jstree/themes/apple/throbber.gif +0 -0
- data/public/libs/jstree/themes/classic/d.gif +0 -0
- data/public/libs/jstree/themes/classic/d.png +0 -0
- data/public/libs/jstree/themes/classic/dot_for_ie.gif +0 -0
- data/public/libs/jstree/themes/classic/style.css +77 -0
- data/public/libs/jstree/themes/classic/throbber.gif +0 -0
- data/public/libs/jstree/themes/default-rtl/d.gif +0 -0
- data/public/libs/jstree/themes/default-rtl/d.png +0 -0
- data/public/libs/jstree/themes/default-rtl/dots.gif +0 -0
- data/public/libs/jstree/themes/default-rtl/style.css +84 -0
- data/public/libs/jstree/themes/default-rtl/throbber.gif +0 -0
- data/public/libs/jstree/themes/default/d.gif +0 -0
- data/public/libs/jstree/themes/default/d.png +0 -0
- data/public/libs/jstree/themes/default/style.css +74 -0
- data/public/libs/jstree/themes/default/throbber.gif +0 -0
- data/public/themes/geo-bootstrap/README.md +25 -0
- data/public/themes/geo-bootstrap/img/flames.gif +0 -0
- data/public/themes/geo-bootstrap/img/glyphicons-halflings-white.png +0 -0
- data/public/themes/geo-bootstrap/img/glyphicons-halflings.png +0 -0
- data/public/themes/geo-bootstrap/img/microfab.gif +0 -0
- data/public/themes/geo-bootstrap/img/progress.gif +0 -0
- data/public/themes/geo-bootstrap/img/rainbow.gif +0 -0
- data/public/themes/geo-bootstrap/img/stars.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/7upspot.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/americanflag.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/community.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/computer-01.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/computer.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/construction.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/counter.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/counter2.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/divider.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/divider1.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/divider2.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/divider3.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/divider4.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/drudgesiren.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/emailme.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/funky.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/geocities.jpg +0 -0
- data/public/themes/geo-bootstrap/img/test/hacker.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/heart.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/hot.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/ie_logo.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/mailkitten.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/mchammer.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/new.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/new2.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/noframes.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/notepad.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/ns_logo.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/sign-in.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/spinningearth.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/underconstruction.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/wabwalk.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/webtrips.gif +0 -0
- data/public/themes/geo-bootstrap/img/test/yahooweek.gif +0 -0
- data/public/themes/geo-bootstrap/package.json +21 -0
- data/public/themes/geo-bootstrap/swatch/bootstrap-responsive.css +1109 -0
- data/public/themes/geo-bootstrap/swatch/bootstrap-responsive.min.css +9 -0
- data/public/themes/geo-bootstrap/swatch/bootstrap.css +6462 -0
- data/public/themes/geo-bootstrap/swatch/bootstrap.min.css +9 -0
- metadata +791 -0
|
@@ -0,0 +1,1445 @@
|
|
|
1
|
+
Smalltalk current createPackage: 'Compiler' properties: #{}!
|
|
2
|
+
Object subclass: #ChunkParser
|
|
3
|
+
instanceVariableNames: 'stream'
|
|
4
|
+
package: 'Compiler'!
|
|
5
|
+
|
|
6
|
+
!ChunkParser methodsFor: 'accessing'!
|
|
7
|
+
|
|
8
|
+
stream: aStream
|
|
9
|
+
stream := aStream
|
|
10
|
+
! !
|
|
11
|
+
|
|
12
|
+
!ChunkParser methodsFor: 'reading'!
|
|
13
|
+
|
|
14
|
+
nextChunk
|
|
15
|
+
"The chunk format (Smalltalk Interchange Format or Fileout format)
|
|
16
|
+
is a trivial format but can be a bit tricky to understand:
|
|
17
|
+
- Uses the exclamation mark as delimiter of chunks.
|
|
18
|
+
- Inside a chunk a normal exclamation mark must be doubled.
|
|
19
|
+
- A non empty chunk must be a valid Smalltalk expression.
|
|
20
|
+
- A chunk on top level with a preceding empty chunk is an instruction chunk:
|
|
21
|
+
- The object created by the expression then takes over reading chunks.
|
|
22
|
+
|
|
23
|
+
This metod returns next chunk as a String (trimmed), empty String (all whitespace) or nil."
|
|
24
|
+
|
|
25
|
+
| char result chunk |
|
|
26
|
+
result := '' writeStream.
|
|
27
|
+
[char := stream next.
|
|
28
|
+
char notNil] whileTrue: [
|
|
29
|
+
char = '!!' ifTrue: [
|
|
30
|
+
stream peek = '!!'
|
|
31
|
+
ifTrue: [stream next "skipping the escape double"]
|
|
32
|
+
ifFalse: [^result contents trimBoth "chunk end marker found"]].
|
|
33
|
+
result nextPut: char].
|
|
34
|
+
^nil "a chunk needs to end with !!"
|
|
35
|
+
! !
|
|
36
|
+
|
|
37
|
+
!ChunkParser class methodsFor: 'not yet classified'!
|
|
38
|
+
|
|
39
|
+
on: aStream
|
|
40
|
+
^self new stream: aStream
|
|
41
|
+
! !
|
|
42
|
+
|
|
43
|
+
Object subclass: #DoIt
|
|
44
|
+
instanceVariableNames: ''
|
|
45
|
+
package: 'Compiler'!
|
|
46
|
+
|
|
47
|
+
Object subclass: #Exporter
|
|
48
|
+
instanceVariableNames: ''
|
|
49
|
+
package: 'Compiler'!
|
|
50
|
+
|
|
51
|
+
!Exporter methodsFor: 'fileOut'!
|
|
52
|
+
|
|
53
|
+
exportAll
|
|
54
|
+
"Export all packages in the system."
|
|
55
|
+
|
|
56
|
+
^String streamContents: [:stream |
|
|
57
|
+
Smalltalk current packages do: [:pkg |
|
|
58
|
+
stream nextPutAll: (self exportPackage: pkg name)]]
|
|
59
|
+
!
|
|
60
|
+
|
|
61
|
+
exportClass: aClass
|
|
62
|
+
"Export a single class. Subclasses override these methods."
|
|
63
|
+
|
|
64
|
+
^String streamContents: [:stream |
|
|
65
|
+
self exportDefinitionOf: aClass on: stream.
|
|
66
|
+
self exportMethodsOf: aClass on: stream.
|
|
67
|
+
self exportMetaDefinitionOf: aClass on: stream.
|
|
68
|
+
self exportMethodsOf: aClass class on: stream]
|
|
69
|
+
!
|
|
70
|
+
|
|
71
|
+
exportPackage: packageName
|
|
72
|
+
"Export a given package by name."
|
|
73
|
+
|
|
74
|
+
| package |
|
|
75
|
+
^String streamContents: [:stream |
|
|
76
|
+
package := Smalltalk current packageAt: packageName.
|
|
77
|
+
self exportPackageDefinitionOf: package on: stream.
|
|
78
|
+
|
|
79
|
+
"Export classes in dependency order.
|
|
80
|
+
Update (issue #171): Remove duplicates for export"
|
|
81
|
+
package sortedClasses asSet do: [:each |
|
|
82
|
+
stream nextPutAll: (self exportClass: each)].
|
|
83
|
+
self exportPackageExtensionsOf: package on: stream]
|
|
84
|
+
! !
|
|
85
|
+
|
|
86
|
+
!Exporter methodsFor: 'private'!
|
|
87
|
+
|
|
88
|
+
classNameFor: aClass
|
|
89
|
+
^aClass isMetaclass
|
|
90
|
+
ifTrue: [aClass instanceClass name, '.klass']
|
|
91
|
+
ifFalse: [
|
|
92
|
+
aClass isNil
|
|
93
|
+
ifTrue: ['nil']
|
|
94
|
+
ifFalse: [aClass name]]
|
|
95
|
+
!
|
|
96
|
+
|
|
97
|
+
exportDefinitionOf: aClass on: aStream
|
|
98
|
+
aStream
|
|
99
|
+
nextPutAll: 'smalltalk.addClass(';
|
|
100
|
+
nextPutAll: '''', (self classNameFor: aClass), ''', ';
|
|
101
|
+
nextPutAll: 'smalltalk.', (self classNameFor: aClass superclass);
|
|
102
|
+
nextPutAll: ', ['.
|
|
103
|
+
aClass instanceVariableNames
|
|
104
|
+
do: [:each | aStream nextPutAll: '''', each, '''']
|
|
105
|
+
separatedBy: [aStream nextPutAll: ', '].
|
|
106
|
+
aStream
|
|
107
|
+
nextPutAll: '], ''';
|
|
108
|
+
nextPutAll: aClass category, '''';
|
|
109
|
+
nextPutAll: ');'.
|
|
110
|
+
aClass comment notEmpty ifTrue: [
|
|
111
|
+
aStream
|
|
112
|
+
lf;
|
|
113
|
+
nextPutAll: 'smalltalk.';
|
|
114
|
+
nextPutAll: (self classNameFor: aClass);
|
|
115
|
+
nextPutAll: '.comment=';
|
|
116
|
+
nextPutAll: 'unescape(''', aClass comment escaped, ''')'].
|
|
117
|
+
aStream lf
|
|
118
|
+
!
|
|
119
|
+
|
|
120
|
+
exportMetaDefinitionOf: aClass on: aStream
|
|
121
|
+
aClass class instanceVariableNames isEmpty ifFalse: [
|
|
122
|
+
aStream
|
|
123
|
+
nextPutAll: 'smalltalk.', (self classNameFor: aClass class);
|
|
124
|
+
nextPutAll: '.iVarNames = ['.
|
|
125
|
+
aClass class instanceVariableNames
|
|
126
|
+
do: [:each | aStream nextPutAll: '''', each, '''']
|
|
127
|
+
separatedBy: [aStream nextPutAll: ','].
|
|
128
|
+
aStream nextPutAll: '];', String lf]
|
|
129
|
+
!
|
|
130
|
+
|
|
131
|
+
exportMethod: aMethod of: aClass on: aStream
|
|
132
|
+
aStream
|
|
133
|
+
nextPutAll: 'smalltalk.addMethod(';lf;
|
|
134
|
+
nextPutAll: 'unescape(''', aMethod selector asSelector escaped, '''),';lf;
|
|
135
|
+
nextPutAll: 'smalltalk.method({';lf;
|
|
136
|
+
nextPutAll: 'selector: unescape(''', aMethod selector escaped, '''),';lf;
|
|
137
|
+
nextPutAll: 'category: ''', aMethod category, ''',';lf;
|
|
138
|
+
nextPutAll: 'fn: ', aMethod fn compiledSource, ',';lf;
|
|
139
|
+
nextPutAll: 'args: ', aMethod arguments asJavascript, ','; lf;
|
|
140
|
+
nextPutAll: 'source: unescape(''', aMethod source escaped, '''),';lf;
|
|
141
|
+
nextPutAll: 'messageSends: ', aMethod messageSends asJavascript, ',';lf;
|
|
142
|
+
nextPutAll: 'referencedClasses: ', aMethod referencedClasses asJavascript.
|
|
143
|
+
aStream
|
|
144
|
+
lf;
|
|
145
|
+
nextPutAll: '}),';lf;
|
|
146
|
+
nextPutAll: 'smalltalk.', (self classNameFor: aClass);
|
|
147
|
+
nextPutAll: ');';lf;lf
|
|
148
|
+
!
|
|
149
|
+
|
|
150
|
+
exportMethodsOf: aClass on: aStream
|
|
151
|
+
"Issue #143: sort methods alphabetically"
|
|
152
|
+
|
|
153
|
+
((aClass methodDictionary values) sorted: [:a :b | a selector <= b selector]) do: [:each |
|
|
154
|
+
(each category match: '^\*') ifFalse: [
|
|
155
|
+
self exportMethod: each of: aClass on: aStream]].
|
|
156
|
+
aStream lf
|
|
157
|
+
!
|
|
158
|
+
|
|
159
|
+
exportPackageDefinitionOf: package on: aStream
|
|
160
|
+
aStream
|
|
161
|
+
nextPutAll: 'smalltalk.addPackage(';
|
|
162
|
+
nextPutAll: '''', package name, ''', ', package propertiesAsJSON , ');'.
|
|
163
|
+
aStream lf
|
|
164
|
+
!
|
|
165
|
+
|
|
166
|
+
exportPackageExtensionsOf: package on: aStream
|
|
167
|
+
"Issue #143: sort classes and methods alphabetically"
|
|
168
|
+
|
|
169
|
+
| name |
|
|
170
|
+
name := package name.
|
|
171
|
+
(Package sortedClasses: Smalltalk current classes) do: [:each |
|
|
172
|
+
{each. each class} do: [:aClass |
|
|
173
|
+
((aClass methodDictionary values) sorted: [:a :b | a selector <= b selector]) do: [:method |
|
|
174
|
+
(method category match: '^\*', name) ifTrue: [
|
|
175
|
+
self exportMethod: method of: aClass on: aStream ]]]]
|
|
176
|
+
! !
|
|
177
|
+
|
|
178
|
+
Exporter subclass: #ChunkExporter
|
|
179
|
+
instanceVariableNames: ''
|
|
180
|
+
package: 'Compiler'!
|
|
181
|
+
|
|
182
|
+
!ChunkExporter methodsFor: 'not yet classified'!
|
|
183
|
+
|
|
184
|
+
chunkEscape: aString
|
|
185
|
+
"Replace all occurrences of !! with !!!! and trim at both ends."
|
|
186
|
+
|
|
187
|
+
^(aString replace: '!!' with: '!!!!') trimBoth
|
|
188
|
+
!
|
|
189
|
+
|
|
190
|
+
classNameFor: aClass
|
|
191
|
+
^aClass isMetaclass
|
|
192
|
+
ifTrue: [aClass instanceClass name, ' class']
|
|
193
|
+
ifFalse: [
|
|
194
|
+
aClass isNil
|
|
195
|
+
ifTrue: ['nil']
|
|
196
|
+
ifFalse: [aClass name]]
|
|
197
|
+
!
|
|
198
|
+
|
|
199
|
+
exportDefinitionOf: aClass on: aStream
|
|
200
|
+
"Chunk format."
|
|
201
|
+
|
|
202
|
+
aStream
|
|
203
|
+
nextPutAll: (self classNameFor: aClass superclass);
|
|
204
|
+
nextPutAll: ' subclass: #', (self classNameFor: aClass); lf;
|
|
205
|
+
nextPutAll: ' instanceVariableNames: '''.
|
|
206
|
+
aClass instanceVariableNames
|
|
207
|
+
do: [:each | aStream nextPutAll: each]
|
|
208
|
+
separatedBy: [aStream nextPutAll: ' '].
|
|
209
|
+
aStream
|
|
210
|
+
nextPutAll: ''''; lf;
|
|
211
|
+
nextPutAll: ' package: ''', aClass category, '''!!'; lf.
|
|
212
|
+
aClass comment notEmpty ifTrue: [
|
|
213
|
+
aStream
|
|
214
|
+
nextPutAll: '!!', (self classNameFor: aClass), ' commentStamp!!';lf;
|
|
215
|
+
nextPutAll: (self chunkEscape: aClass comment), '!!';lf].
|
|
216
|
+
aStream lf
|
|
217
|
+
!
|
|
218
|
+
|
|
219
|
+
exportMetaDefinitionOf: aClass on: aStream
|
|
220
|
+
|
|
221
|
+
aClass class instanceVariableNames isEmpty ifFalse: [
|
|
222
|
+
aStream
|
|
223
|
+
nextPutAll: (self classNameFor: aClass class);
|
|
224
|
+
nextPutAll: ' instanceVariableNames: '''.
|
|
225
|
+
aClass class instanceVariableNames
|
|
226
|
+
do: [:each | aStream nextPutAll: each]
|
|
227
|
+
separatedBy: [aStream nextPutAll: ' '].
|
|
228
|
+
aStream
|
|
229
|
+
nextPutAll: '''!!'; lf; lf]
|
|
230
|
+
!
|
|
231
|
+
|
|
232
|
+
exportMethod: aMethod of: aClass on: aStream
|
|
233
|
+
aStream
|
|
234
|
+
lf; lf; nextPutAll: (self chunkEscape: aMethod source); lf;
|
|
235
|
+
nextPutAll: '!!'
|
|
236
|
+
!
|
|
237
|
+
|
|
238
|
+
exportMethods: methods category: category of: aClass on: aStream
|
|
239
|
+
"Issue #143: sort methods alphabetically"
|
|
240
|
+
|
|
241
|
+
aStream
|
|
242
|
+
nextPutAll: '!!', (self classNameFor: aClass);
|
|
243
|
+
nextPutAll: ' methodsFor: ''', category, '''!!'.
|
|
244
|
+
(methods sorted: [:a :b | a selector <= b selector]) do: [:each |
|
|
245
|
+
self exportMethod: each of: aClass on: aStream].
|
|
246
|
+
aStream nextPutAll: ' !!'; lf; lf
|
|
247
|
+
!
|
|
248
|
+
|
|
249
|
+
exportMethodsOf: aClass on: aStream
|
|
250
|
+
"Issue #143: sort protocol alphabetically"
|
|
251
|
+
|
|
252
|
+
| map |
|
|
253
|
+
map := Dictionary new.
|
|
254
|
+
aClass protocolsDo: [:category :methods |
|
|
255
|
+
(category match: '^\*') ifFalse: [ map at: category put: methods ]].
|
|
256
|
+
(map keys sorted: [:a :b | a <= b ]) do: [:category | | methods |
|
|
257
|
+
methods := map at: category.
|
|
258
|
+
self
|
|
259
|
+
exportMethods: methods
|
|
260
|
+
category: category
|
|
261
|
+
of: aClass
|
|
262
|
+
on: aStream ]
|
|
263
|
+
!
|
|
264
|
+
|
|
265
|
+
exportPackageDefinitionOf: package on: aStream
|
|
266
|
+
"Chunk format."
|
|
267
|
+
|
|
268
|
+
aStream
|
|
269
|
+
nextPutAll: 'Smalltalk current createPackage: ''', package name,
|
|
270
|
+
''' properties: ', package properties storeString, '!!'; lf.
|
|
271
|
+
!
|
|
272
|
+
|
|
273
|
+
exportPackageExtensionsOf: package on: aStream
|
|
274
|
+
"We need to override this one too since we need to group
|
|
275
|
+
all methods in a given protocol under a leading methodsFor: chunk
|
|
276
|
+
for that class."
|
|
277
|
+
|
|
278
|
+
"Issue #143: sort protocol alphabetically"
|
|
279
|
+
|
|
280
|
+
| name map |
|
|
281
|
+
name := package name.
|
|
282
|
+
(Package sortedClasses: Smalltalk current classes) do: [:each |
|
|
283
|
+
{each. each class} do: [:aClass |
|
|
284
|
+
map := Dictionary new.
|
|
285
|
+
aClass protocolsDo: [:category :methods |
|
|
286
|
+
(category match: '^\*', name) ifTrue: [ map at: category put: methods ]].
|
|
287
|
+
(map keys sorted: [:a :b | a <= b ]) do: [:category | | methods |
|
|
288
|
+
methods := map at: category.
|
|
289
|
+
self exportMethods: methods category: category of: aClass on: aStream ]]]
|
|
290
|
+
! !
|
|
291
|
+
|
|
292
|
+
Exporter subclass: #StrippedExporter
|
|
293
|
+
instanceVariableNames: ''
|
|
294
|
+
package: 'Compiler'!
|
|
295
|
+
|
|
296
|
+
!StrippedExporter methodsFor: 'private'!
|
|
297
|
+
|
|
298
|
+
exportDefinitionOf: aClass on: aStream
|
|
299
|
+
aStream
|
|
300
|
+
nextPutAll: 'smalltalk.addClass(';
|
|
301
|
+
nextPutAll: '''', (self classNameFor: aClass), ''', ';
|
|
302
|
+
nextPutAll: 'smalltalk.', (self classNameFor: aClass superclass);
|
|
303
|
+
nextPutAll: ', ['.
|
|
304
|
+
aClass instanceVariableNames
|
|
305
|
+
do: [:each | aStream nextPutAll: '''', each, '''']
|
|
306
|
+
separatedBy: [aStream nextPutAll: ', '].
|
|
307
|
+
aStream
|
|
308
|
+
nextPutAll: '], ''';
|
|
309
|
+
nextPutAll: aClass category, '''';
|
|
310
|
+
nextPutAll: ');'.
|
|
311
|
+
aStream lf
|
|
312
|
+
!
|
|
313
|
+
|
|
314
|
+
exportMethod: aMethod of: aClass on: aStream
|
|
315
|
+
aStream
|
|
316
|
+
nextPutAll: 'smalltalk.addMethod(';lf;
|
|
317
|
+
nextPutAll: 'unescape(''', aMethod selector asSelector escaped, '''),';lf;
|
|
318
|
+
nextPutAll: 'smalltalk.method({';lf;
|
|
319
|
+
nextPutAll: 'selector: unescape(''', aMethod selector escaped, '''),';lf;
|
|
320
|
+
nextPutAll: 'fn: ', aMethod fn compiledSource;lf;
|
|
321
|
+
nextPutAll: '}),';lf;
|
|
322
|
+
nextPutAll: 'smalltalk.', (self classNameFor: aClass);
|
|
323
|
+
nextPutAll: ');';lf;lf
|
|
324
|
+
! !
|
|
325
|
+
|
|
326
|
+
Object subclass: #Importer
|
|
327
|
+
instanceVariableNames: ''
|
|
328
|
+
package: 'Compiler'!
|
|
329
|
+
|
|
330
|
+
!Importer methodsFor: 'fileIn'!
|
|
331
|
+
|
|
332
|
+
import: aStream
|
|
333
|
+
| chunk result parser lastEmpty |
|
|
334
|
+
parser := ChunkParser on: aStream.
|
|
335
|
+
lastEmpty := false.
|
|
336
|
+
[chunk := parser nextChunk.
|
|
337
|
+
chunk isNil] whileFalse: [
|
|
338
|
+
chunk isEmpty
|
|
339
|
+
ifTrue: [lastEmpty := true]
|
|
340
|
+
ifFalse: [
|
|
341
|
+
result := Compiler new loadExpression: chunk.
|
|
342
|
+
lastEmpty
|
|
343
|
+
ifTrue: [
|
|
344
|
+
lastEmpty := false.
|
|
345
|
+
result scanFrom: parser]]]
|
|
346
|
+
! !
|
|
347
|
+
|
|
348
|
+
Object subclass: #Node
|
|
349
|
+
instanceVariableNames: 'nodes'
|
|
350
|
+
package: 'Compiler'!
|
|
351
|
+
|
|
352
|
+
!Node methodsFor: 'accessing'!
|
|
353
|
+
|
|
354
|
+
addNode: aNode
|
|
355
|
+
self nodes add: aNode
|
|
356
|
+
!
|
|
357
|
+
|
|
358
|
+
nodes
|
|
359
|
+
^nodes ifNil: [nodes := Array new]
|
|
360
|
+
! !
|
|
361
|
+
|
|
362
|
+
!Node methodsFor: 'building'!
|
|
363
|
+
|
|
364
|
+
nodes: aCollection
|
|
365
|
+
nodes := aCollection
|
|
366
|
+
! !
|
|
367
|
+
|
|
368
|
+
!Node methodsFor: 'testing'!
|
|
369
|
+
|
|
370
|
+
isBlockNode
|
|
371
|
+
^false
|
|
372
|
+
!
|
|
373
|
+
|
|
374
|
+
isBlockSequenceNode
|
|
375
|
+
^false
|
|
376
|
+
!
|
|
377
|
+
|
|
378
|
+
isValueNode
|
|
379
|
+
^false
|
|
380
|
+
! !
|
|
381
|
+
|
|
382
|
+
!Node methodsFor: 'visiting'!
|
|
383
|
+
|
|
384
|
+
accept: aVisitor
|
|
385
|
+
aVisitor visitNode: self
|
|
386
|
+
! !
|
|
387
|
+
|
|
388
|
+
Node subclass: #AssignmentNode
|
|
389
|
+
instanceVariableNames: 'left right'
|
|
390
|
+
package: 'Compiler'!
|
|
391
|
+
|
|
392
|
+
!AssignmentNode methodsFor: 'accessing'!
|
|
393
|
+
|
|
394
|
+
left
|
|
395
|
+
^left
|
|
396
|
+
!
|
|
397
|
+
|
|
398
|
+
left: aNode
|
|
399
|
+
left := aNode.
|
|
400
|
+
left assigned: true
|
|
401
|
+
!
|
|
402
|
+
|
|
403
|
+
right
|
|
404
|
+
^right
|
|
405
|
+
!
|
|
406
|
+
|
|
407
|
+
right: aNode
|
|
408
|
+
right := aNode
|
|
409
|
+
! !
|
|
410
|
+
|
|
411
|
+
!AssignmentNode methodsFor: 'visiting'!
|
|
412
|
+
|
|
413
|
+
accept: aVisitor
|
|
414
|
+
aVisitor visitAssignmentNode: self
|
|
415
|
+
! !
|
|
416
|
+
|
|
417
|
+
Node subclass: #BlockNode
|
|
418
|
+
instanceVariableNames: 'parameters inlined'
|
|
419
|
+
package: 'Compiler'!
|
|
420
|
+
|
|
421
|
+
!BlockNode methodsFor: 'accessing'!
|
|
422
|
+
|
|
423
|
+
inlined
|
|
424
|
+
^inlined ifNil: [false]
|
|
425
|
+
!
|
|
426
|
+
|
|
427
|
+
inlined: aBoolean
|
|
428
|
+
inlined := aBoolean
|
|
429
|
+
!
|
|
430
|
+
|
|
431
|
+
parameters
|
|
432
|
+
^parameters ifNil: [parameters := Array new]
|
|
433
|
+
!
|
|
434
|
+
|
|
435
|
+
parameters: aCollection
|
|
436
|
+
parameters := aCollection
|
|
437
|
+
! !
|
|
438
|
+
|
|
439
|
+
!BlockNode methodsFor: 'testing'!
|
|
440
|
+
|
|
441
|
+
isBlockNode
|
|
442
|
+
^true
|
|
443
|
+
! !
|
|
444
|
+
|
|
445
|
+
!BlockNode methodsFor: 'visiting'!
|
|
446
|
+
|
|
447
|
+
accept: aVisitor
|
|
448
|
+
aVisitor visitBlockNode: self
|
|
449
|
+
! !
|
|
450
|
+
|
|
451
|
+
Node subclass: #CascadeNode
|
|
452
|
+
instanceVariableNames: 'receiver'
|
|
453
|
+
package: 'Compiler'!
|
|
454
|
+
|
|
455
|
+
!CascadeNode methodsFor: 'accessing'!
|
|
456
|
+
|
|
457
|
+
receiver
|
|
458
|
+
^receiver
|
|
459
|
+
!
|
|
460
|
+
|
|
461
|
+
receiver: aNode
|
|
462
|
+
receiver := aNode
|
|
463
|
+
! !
|
|
464
|
+
|
|
465
|
+
!CascadeNode methodsFor: 'visiting'!
|
|
466
|
+
|
|
467
|
+
accept: aVisitor
|
|
468
|
+
aVisitor visitCascadeNode: self
|
|
469
|
+
! !
|
|
470
|
+
|
|
471
|
+
Node subclass: #DynamicArrayNode
|
|
472
|
+
instanceVariableNames: ''
|
|
473
|
+
package: 'Compiler'!
|
|
474
|
+
|
|
475
|
+
!DynamicArrayNode methodsFor: 'visiting'!
|
|
476
|
+
|
|
477
|
+
accept: aVisitor
|
|
478
|
+
aVisitor visitDynamicArrayNode: self
|
|
479
|
+
! !
|
|
480
|
+
|
|
481
|
+
Node subclass: #DynamicDictionaryNode
|
|
482
|
+
instanceVariableNames: ''
|
|
483
|
+
package: 'Compiler'!
|
|
484
|
+
|
|
485
|
+
!DynamicDictionaryNode methodsFor: 'visiting'!
|
|
486
|
+
|
|
487
|
+
accept: aVisitor
|
|
488
|
+
aVisitor visitDynamicDictionaryNode: self
|
|
489
|
+
! !
|
|
490
|
+
|
|
491
|
+
Node subclass: #JSStatementNode
|
|
492
|
+
instanceVariableNames: 'source'
|
|
493
|
+
package: 'Compiler'!
|
|
494
|
+
|
|
495
|
+
!JSStatementNode methodsFor: 'accessing'!
|
|
496
|
+
|
|
497
|
+
source
|
|
498
|
+
^source ifNil: ['']
|
|
499
|
+
!
|
|
500
|
+
|
|
501
|
+
source: aString
|
|
502
|
+
source := aString
|
|
503
|
+
! !
|
|
504
|
+
|
|
505
|
+
!JSStatementNode methodsFor: 'visiting'!
|
|
506
|
+
|
|
507
|
+
accept: aVisitor
|
|
508
|
+
aVisitor visitJSStatementNode: self
|
|
509
|
+
! !
|
|
510
|
+
|
|
511
|
+
Node subclass: #MethodNode
|
|
512
|
+
instanceVariableNames: 'selector arguments source'
|
|
513
|
+
package: 'Compiler'!
|
|
514
|
+
|
|
515
|
+
!MethodNode methodsFor: 'accessing'!
|
|
516
|
+
|
|
517
|
+
arguments
|
|
518
|
+
^arguments ifNil: [#()]
|
|
519
|
+
!
|
|
520
|
+
|
|
521
|
+
arguments: aCollection
|
|
522
|
+
arguments := aCollection
|
|
523
|
+
!
|
|
524
|
+
|
|
525
|
+
selector
|
|
526
|
+
^selector
|
|
527
|
+
!
|
|
528
|
+
|
|
529
|
+
selector: aString
|
|
530
|
+
selector := aString
|
|
531
|
+
!
|
|
532
|
+
|
|
533
|
+
source
|
|
534
|
+
^source
|
|
535
|
+
!
|
|
536
|
+
|
|
537
|
+
source: aString
|
|
538
|
+
source := aString
|
|
539
|
+
! !
|
|
540
|
+
|
|
541
|
+
!MethodNode methodsFor: 'visiting'!
|
|
542
|
+
|
|
543
|
+
accept: aVisitor
|
|
544
|
+
aVisitor visitMethodNode: self
|
|
545
|
+
! !
|
|
546
|
+
|
|
547
|
+
Node subclass: #ReturnNode
|
|
548
|
+
instanceVariableNames: ''
|
|
549
|
+
package: 'Compiler'!
|
|
550
|
+
|
|
551
|
+
!ReturnNode methodsFor: 'visiting'!
|
|
552
|
+
|
|
553
|
+
accept: aVisitor
|
|
554
|
+
aVisitor visitReturnNode: self
|
|
555
|
+
! !
|
|
556
|
+
|
|
557
|
+
Node subclass: #SendNode
|
|
558
|
+
instanceVariableNames: 'selector arguments receiver'
|
|
559
|
+
package: 'Compiler'!
|
|
560
|
+
|
|
561
|
+
!SendNode methodsFor: 'accessing'!
|
|
562
|
+
|
|
563
|
+
arguments
|
|
564
|
+
^arguments ifNil: [arguments := #()]
|
|
565
|
+
!
|
|
566
|
+
|
|
567
|
+
arguments: aCollection
|
|
568
|
+
arguments := aCollection
|
|
569
|
+
!
|
|
570
|
+
|
|
571
|
+
cascadeNodeWithMessages: aCollection
|
|
572
|
+
| first |
|
|
573
|
+
first := SendNode new
|
|
574
|
+
selector: self selector;
|
|
575
|
+
arguments: self arguments;
|
|
576
|
+
yourself.
|
|
577
|
+
^CascadeNode new
|
|
578
|
+
receiver: self receiver;
|
|
579
|
+
nodes: (Array with: first), aCollection;
|
|
580
|
+
yourself
|
|
581
|
+
!
|
|
582
|
+
|
|
583
|
+
receiver
|
|
584
|
+
^receiver
|
|
585
|
+
!
|
|
586
|
+
|
|
587
|
+
receiver: aNode
|
|
588
|
+
receiver := aNode
|
|
589
|
+
!
|
|
590
|
+
|
|
591
|
+
selector
|
|
592
|
+
^selector
|
|
593
|
+
!
|
|
594
|
+
|
|
595
|
+
selector: aString
|
|
596
|
+
selector := aString
|
|
597
|
+
!
|
|
598
|
+
|
|
599
|
+
valueForReceiver: anObject
|
|
600
|
+
^SendNode new
|
|
601
|
+
receiver: (self receiver
|
|
602
|
+
ifNil: [anObject]
|
|
603
|
+
ifNotNil: [self receiver valueForReceiver: anObject]);
|
|
604
|
+
selector: self selector;
|
|
605
|
+
arguments: self arguments;
|
|
606
|
+
yourself
|
|
607
|
+
! !
|
|
608
|
+
|
|
609
|
+
!SendNode methodsFor: 'visiting'!
|
|
610
|
+
|
|
611
|
+
accept: aVisitor
|
|
612
|
+
aVisitor visitSendNode: self
|
|
613
|
+
! !
|
|
614
|
+
|
|
615
|
+
Node subclass: #SequenceNode
|
|
616
|
+
instanceVariableNames: 'temps'
|
|
617
|
+
package: 'Compiler'!
|
|
618
|
+
|
|
619
|
+
!SequenceNode methodsFor: 'accessing'!
|
|
620
|
+
|
|
621
|
+
temps
|
|
622
|
+
^temps ifNil: [#()]
|
|
623
|
+
!
|
|
624
|
+
|
|
625
|
+
temps: aCollection
|
|
626
|
+
temps := aCollection
|
|
627
|
+
! !
|
|
628
|
+
|
|
629
|
+
!SequenceNode methodsFor: 'testing'!
|
|
630
|
+
|
|
631
|
+
asBlockSequenceNode
|
|
632
|
+
^BlockSequenceNode new
|
|
633
|
+
nodes: self nodes;
|
|
634
|
+
temps: self temps;
|
|
635
|
+
yourself
|
|
636
|
+
! !
|
|
637
|
+
|
|
638
|
+
!SequenceNode methodsFor: 'visiting'!
|
|
639
|
+
|
|
640
|
+
accept: aVisitor
|
|
641
|
+
aVisitor visitSequenceNode: self
|
|
642
|
+
! !
|
|
643
|
+
|
|
644
|
+
SequenceNode subclass: #BlockSequenceNode
|
|
645
|
+
instanceVariableNames: ''
|
|
646
|
+
package: 'Compiler'!
|
|
647
|
+
|
|
648
|
+
!BlockSequenceNode methodsFor: 'testing'!
|
|
649
|
+
|
|
650
|
+
isBlockSequenceNode
|
|
651
|
+
^true
|
|
652
|
+
! !
|
|
653
|
+
|
|
654
|
+
!BlockSequenceNode methodsFor: 'visiting'!
|
|
655
|
+
|
|
656
|
+
accept: aVisitor
|
|
657
|
+
aVisitor visitBlockSequenceNode: self
|
|
658
|
+
! !
|
|
659
|
+
|
|
660
|
+
Node subclass: #ValueNode
|
|
661
|
+
instanceVariableNames: 'value'
|
|
662
|
+
package: 'Compiler'!
|
|
663
|
+
|
|
664
|
+
!ValueNode methodsFor: 'accessing'!
|
|
665
|
+
|
|
666
|
+
value
|
|
667
|
+
^value
|
|
668
|
+
!
|
|
669
|
+
|
|
670
|
+
value: anObject
|
|
671
|
+
value := anObject
|
|
672
|
+
! !
|
|
673
|
+
|
|
674
|
+
!ValueNode methodsFor: 'testing'!
|
|
675
|
+
|
|
676
|
+
isValueNode
|
|
677
|
+
^true
|
|
678
|
+
! !
|
|
679
|
+
|
|
680
|
+
!ValueNode methodsFor: 'visiting'!
|
|
681
|
+
|
|
682
|
+
accept: aVisitor
|
|
683
|
+
aVisitor visitValueNode: self
|
|
684
|
+
! !
|
|
685
|
+
|
|
686
|
+
ValueNode subclass: #VariableNode
|
|
687
|
+
instanceVariableNames: 'assigned'
|
|
688
|
+
package: 'Compiler'!
|
|
689
|
+
|
|
690
|
+
!VariableNode methodsFor: 'accessing'!
|
|
691
|
+
|
|
692
|
+
assigned
|
|
693
|
+
^assigned ifNil: [false]
|
|
694
|
+
!
|
|
695
|
+
|
|
696
|
+
assigned: aBoolean
|
|
697
|
+
assigned := aBoolean
|
|
698
|
+
! !
|
|
699
|
+
|
|
700
|
+
!VariableNode methodsFor: 'visiting'!
|
|
701
|
+
|
|
702
|
+
accept: aVisitor
|
|
703
|
+
aVisitor visitVariableNode: self
|
|
704
|
+
! !
|
|
705
|
+
|
|
706
|
+
VariableNode subclass: #ClassReferenceNode
|
|
707
|
+
instanceVariableNames: ''
|
|
708
|
+
package: 'Compiler'!
|
|
709
|
+
|
|
710
|
+
!ClassReferenceNode methodsFor: 'visiting'!
|
|
711
|
+
|
|
712
|
+
accept: aVisitor
|
|
713
|
+
aVisitor visitClassReferenceNode: self
|
|
714
|
+
! !
|
|
715
|
+
|
|
716
|
+
Object subclass: #NodeVisitor
|
|
717
|
+
instanceVariableNames: ''
|
|
718
|
+
package: 'Compiler'!
|
|
719
|
+
|
|
720
|
+
!NodeVisitor methodsFor: 'visiting'!
|
|
721
|
+
|
|
722
|
+
visit: aNode
|
|
723
|
+
aNode accept: self
|
|
724
|
+
!
|
|
725
|
+
|
|
726
|
+
visitAssignmentNode: aNode
|
|
727
|
+
self visitNode: aNode
|
|
728
|
+
!
|
|
729
|
+
|
|
730
|
+
visitBlockNode: aNode
|
|
731
|
+
self visitNode: aNode
|
|
732
|
+
!
|
|
733
|
+
|
|
734
|
+
visitBlockSequenceNode: aNode
|
|
735
|
+
self visitSequenceNode: aNode
|
|
736
|
+
!
|
|
737
|
+
|
|
738
|
+
visitCascadeNode: aNode
|
|
739
|
+
self visitNode: aNode
|
|
740
|
+
!
|
|
741
|
+
|
|
742
|
+
visitClassReferenceNode: aNode
|
|
743
|
+
self
|
|
744
|
+
nextPutAll: 'smalltalk.';
|
|
745
|
+
nextPutAll: aNode value
|
|
746
|
+
!
|
|
747
|
+
|
|
748
|
+
visitDynamicArrayNode: aNode
|
|
749
|
+
self visitNode: aNode
|
|
750
|
+
!
|
|
751
|
+
|
|
752
|
+
visitDynamicDictionaryNode: aNode
|
|
753
|
+
self visitNode: aNode
|
|
754
|
+
!
|
|
755
|
+
|
|
756
|
+
visitJSStatementNode: aNode
|
|
757
|
+
self
|
|
758
|
+
nextPutAll: 'function(){';
|
|
759
|
+
nextPutAll: aNode source;
|
|
760
|
+
nextPutAll: '})()'
|
|
761
|
+
!
|
|
762
|
+
|
|
763
|
+
visitMethodNode: aNode
|
|
764
|
+
self visitNode: aNode
|
|
765
|
+
!
|
|
766
|
+
|
|
767
|
+
visitNode: aNode
|
|
768
|
+
!
|
|
769
|
+
|
|
770
|
+
visitReturnNode: aNode
|
|
771
|
+
self visitNode: aNode
|
|
772
|
+
!
|
|
773
|
+
|
|
774
|
+
visitSendNode: aNode
|
|
775
|
+
self visitNode: aNode
|
|
776
|
+
!
|
|
777
|
+
|
|
778
|
+
visitSequenceNode: aNode
|
|
779
|
+
self visitNode: aNode
|
|
780
|
+
!
|
|
781
|
+
|
|
782
|
+
visitValueNode: aNode
|
|
783
|
+
self visitNode: aNode
|
|
784
|
+
!
|
|
785
|
+
|
|
786
|
+
visitVariableNode: aNode
|
|
787
|
+
! !
|
|
788
|
+
|
|
789
|
+
NodeVisitor subclass: #Compiler
|
|
790
|
+
instanceVariableNames: 'stream nestedBlocks earlyReturn currentClass currentSelector unknownVariables tempVariables messageSends referencedClasses classReferenced source argVariables'
|
|
791
|
+
package: 'Compiler'!
|
|
792
|
+
|
|
793
|
+
!Compiler methodsFor: 'accessing'!
|
|
794
|
+
|
|
795
|
+
argVariables
|
|
796
|
+
^argVariables copy
|
|
797
|
+
!
|
|
798
|
+
|
|
799
|
+
classNameFor: aClass
|
|
800
|
+
^aClass isMetaclass
|
|
801
|
+
ifTrue: [aClass instanceClass name, '.klass']
|
|
802
|
+
ifFalse: [
|
|
803
|
+
aClass isNil
|
|
804
|
+
ifTrue: ['nil']
|
|
805
|
+
ifFalse: [aClass name]]
|
|
806
|
+
!
|
|
807
|
+
|
|
808
|
+
currentClass
|
|
809
|
+
^currentClass
|
|
810
|
+
!
|
|
811
|
+
|
|
812
|
+
currentClass: aClass
|
|
813
|
+
currentClass := aClass
|
|
814
|
+
!
|
|
815
|
+
|
|
816
|
+
knownVariables
|
|
817
|
+
^self pseudoVariables
|
|
818
|
+
addAll: self tempVariables;
|
|
819
|
+
addAll: self argVariables;
|
|
820
|
+
yourself
|
|
821
|
+
!
|
|
822
|
+
|
|
823
|
+
parser
|
|
824
|
+
^SmalltalkParser new
|
|
825
|
+
!
|
|
826
|
+
|
|
827
|
+
pseudoVariables
|
|
828
|
+
^#('self' 'super' 'true' 'false' 'nil' 'thisContext')
|
|
829
|
+
!
|
|
830
|
+
|
|
831
|
+
safeVariableNameFor: aString
|
|
832
|
+
^(Smalltalk current reservedWords includes: aString)
|
|
833
|
+
ifTrue: [aString, '_']
|
|
834
|
+
ifFalse: [aString]
|
|
835
|
+
!
|
|
836
|
+
|
|
837
|
+
source
|
|
838
|
+
^source ifNil: ['']
|
|
839
|
+
!
|
|
840
|
+
|
|
841
|
+
source: aString
|
|
842
|
+
source := aString
|
|
843
|
+
!
|
|
844
|
+
|
|
845
|
+
tempVariables
|
|
846
|
+
^tempVariables copy
|
|
847
|
+
!
|
|
848
|
+
|
|
849
|
+
unknownVariables
|
|
850
|
+
^unknownVariables copy
|
|
851
|
+
! !
|
|
852
|
+
|
|
853
|
+
!Compiler methodsFor: 'compiling'!
|
|
854
|
+
|
|
855
|
+
compile: aString
|
|
856
|
+
^self compileNode: (self parse: aString)
|
|
857
|
+
!
|
|
858
|
+
|
|
859
|
+
compile: aString forClass: aClass
|
|
860
|
+
self currentClass: aClass.
|
|
861
|
+
self source: aString.
|
|
862
|
+
^self compile: aString
|
|
863
|
+
!
|
|
864
|
+
|
|
865
|
+
compileExpression: aString
|
|
866
|
+
self currentClass: DoIt.
|
|
867
|
+
self source: 'doIt ^[', aString, '] value'.
|
|
868
|
+
^self compileNode: (self parse: self source)
|
|
869
|
+
!
|
|
870
|
+
|
|
871
|
+
compileNode: aNode
|
|
872
|
+
stream := '' writeStream.
|
|
873
|
+
self visit: aNode.
|
|
874
|
+
^stream contents
|
|
875
|
+
!
|
|
876
|
+
|
|
877
|
+
eval: aString
|
|
878
|
+
<return eval(aString)>
|
|
879
|
+
!
|
|
880
|
+
|
|
881
|
+
load: aString forClass: aClass
|
|
882
|
+
| compiled |
|
|
883
|
+
compiled := self eval: (self compile: aString forClass: aClass).
|
|
884
|
+
self setupClass: aClass.
|
|
885
|
+
^compiled
|
|
886
|
+
!
|
|
887
|
+
|
|
888
|
+
loadExpression: aString
|
|
889
|
+
| result |
|
|
890
|
+
DoIt addCompiledMethod: (self eval: (self compileExpression: aString)).
|
|
891
|
+
result := DoIt new doIt.
|
|
892
|
+
DoIt removeCompiledMethod: (DoIt methodDictionary at: 'doIt').
|
|
893
|
+
^result
|
|
894
|
+
!
|
|
895
|
+
|
|
896
|
+
parse: aString
|
|
897
|
+
^Smalltalk current parse: aString
|
|
898
|
+
!
|
|
899
|
+
|
|
900
|
+
parseExpression: aString
|
|
901
|
+
^self parse: 'doIt ^[', aString, '] value'
|
|
902
|
+
!
|
|
903
|
+
|
|
904
|
+
recompile: aClass
|
|
905
|
+
aClass methodDictionary do: [:each || method |
|
|
906
|
+
method := self load: each source forClass: aClass.
|
|
907
|
+
method category: each category.
|
|
908
|
+
aClass addCompiledMethod: method].
|
|
909
|
+
aClass isMetaclass ifFalse: [self recompile: aClass class]
|
|
910
|
+
!
|
|
911
|
+
|
|
912
|
+
recompileAll
|
|
913
|
+
Smalltalk current classes do: [:each |
|
|
914
|
+
Transcript show: each; cr.
|
|
915
|
+
[self recompile: each] valueWithTimeout: 100]
|
|
916
|
+
!
|
|
917
|
+
|
|
918
|
+
setupClass: aClass
|
|
919
|
+
<smalltalk.init(aClass)>
|
|
920
|
+
! !
|
|
921
|
+
|
|
922
|
+
!Compiler methodsFor: 'initialization'!
|
|
923
|
+
|
|
924
|
+
initialize
|
|
925
|
+
super initialize.
|
|
926
|
+
stream := '' writeStream.
|
|
927
|
+
unknownVariables := #().
|
|
928
|
+
tempVariables := #().
|
|
929
|
+
argVariables := #().
|
|
930
|
+
messageSends := #().
|
|
931
|
+
classReferenced := #()
|
|
932
|
+
! !
|
|
933
|
+
|
|
934
|
+
!Compiler methodsFor: 'optimizations'!
|
|
935
|
+
|
|
936
|
+
checkClass: aClassName for: receiver
|
|
937
|
+
stream nextPutAll: '((($receiver = ', receiver, ').klass === smalltalk.', aClassName, ') ? '
|
|
938
|
+
!
|
|
939
|
+
|
|
940
|
+
inline: aSelector receiver: receiver argumentNodes: aCollection
|
|
941
|
+
| inlined |
|
|
942
|
+
inlined := false.
|
|
943
|
+
|
|
944
|
+
"-- Booleans --"
|
|
945
|
+
|
|
946
|
+
(aSelector = 'ifFalse:') ifTrue: [
|
|
947
|
+
aCollection first isBlockNode ifTrue: [
|
|
948
|
+
self checkClass: 'Boolean' for: receiver.
|
|
949
|
+
stream nextPutAll: '(!! $receiver ? '.
|
|
950
|
+
self visit: aCollection first.
|
|
951
|
+
stream nextPutAll: '() : nil)'.
|
|
952
|
+
inlined := true]].
|
|
953
|
+
|
|
954
|
+
(aSelector = 'ifTrue:') ifTrue: [
|
|
955
|
+
aCollection first isBlockNode ifTrue: [
|
|
956
|
+
self checkClass: 'Boolean' for: receiver.
|
|
957
|
+
stream nextPutAll: '($receiver ? '.
|
|
958
|
+
self visit: aCollection first.
|
|
959
|
+
stream nextPutAll: '() : nil)'.
|
|
960
|
+
inlined := true]].
|
|
961
|
+
|
|
962
|
+
(aSelector = 'ifTrue:ifFalse:') ifTrue: [
|
|
963
|
+
(aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
|
|
964
|
+
self checkClass: 'Boolean' for: receiver.
|
|
965
|
+
stream nextPutAll: '($receiver ? '.
|
|
966
|
+
self visit: aCollection first.
|
|
967
|
+
stream nextPutAll: '() : '.
|
|
968
|
+
self visit: aCollection second.
|
|
969
|
+
stream nextPutAll: '())'.
|
|
970
|
+
inlined := true]].
|
|
971
|
+
|
|
972
|
+
(aSelector = 'ifFalse:ifTrue:') ifTrue: [
|
|
973
|
+
(aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
|
|
974
|
+
self checkClass: 'Boolean' for: receiver.
|
|
975
|
+
stream nextPutAll: '(!! $receiver ? '.
|
|
976
|
+
self visit: aCollection first.
|
|
977
|
+
stream nextPutAll: '() : '.
|
|
978
|
+
self visit: aCollection second.
|
|
979
|
+
stream nextPutAll: '())'.
|
|
980
|
+
inlined := true]].
|
|
981
|
+
|
|
982
|
+
"-- Numbers --"
|
|
983
|
+
|
|
984
|
+
(aSelector = '<') ifTrue: [
|
|
985
|
+
self checkClass: 'Number' for: receiver.
|
|
986
|
+
stream nextPutAll: '$receiver <'.
|
|
987
|
+
self visit: aCollection first.
|
|
988
|
+
inlined := true].
|
|
989
|
+
|
|
990
|
+
(aSelector = '<=') ifTrue: [
|
|
991
|
+
self checkClass: 'Number' for: receiver.
|
|
992
|
+
stream nextPutAll: '$receiver <='.
|
|
993
|
+
self visit: aCollection first.
|
|
994
|
+
inlined := true].
|
|
995
|
+
|
|
996
|
+
(aSelector = '>') ifTrue: [
|
|
997
|
+
self checkClass: 'Number' for: receiver.
|
|
998
|
+
stream nextPutAll: '$receiver >'.
|
|
999
|
+
self visit: aCollection first.
|
|
1000
|
+
inlined := true].
|
|
1001
|
+
|
|
1002
|
+
(aSelector = '>=') ifTrue: [
|
|
1003
|
+
self checkClass: 'Number' for: receiver.
|
|
1004
|
+
stream nextPutAll: '$receiver >='.
|
|
1005
|
+
self visit: aCollection first.
|
|
1006
|
+
inlined := true].
|
|
1007
|
+
|
|
1008
|
+
(aSelector = '+') ifTrue: [
|
|
1009
|
+
self checkClass: 'Number' for: receiver.
|
|
1010
|
+
stream nextPutAll: '$receiver +'.
|
|
1011
|
+
self visit: aCollection first.
|
|
1012
|
+
inlined := true].
|
|
1013
|
+
|
|
1014
|
+
(aSelector = '-') ifTrue: [
|
|
1015
|
+
self checkClass: 'Number' for: receiver.
|
|
1016
|
+
stream nextPutAll: '$receiver -'.
|
|
1017
|
+
self visit: aCollection first.
|
|
1018
|
+
inlined := true].
|
|
1019
|
+
|
|
1020
|
+
(aSelector = '*') ifTrue: [
|
|
1021
|
+
self checkClass: 'Number' for: receiver.
|
|
1022
|
+
stream nextPutAll: '$receiver *'.
|
|
1023
|
+
self visit: aCollection first.
|
|
1024
|
+
inlined := true].
|
|
1025
|
+
|
|
1026
|
+
(aSelector = '/') ifTrue: [
|
|
1027
|
+
self checkClass: 'Number' for: receiver.
|
|
1028
|
+
stream nextPutAll: '$receiver /'.
|
|
1029
|
+
self visit: aCollection first.
|
|
1030
|
+
inlined := true].
|
|
1031
|
+
|
|
1032
|
+
^inlined
|
|
1033
|
+
!
|
|
1034
|
+
|
|
1035
|
+
inlineLiteral: aSelector receiverNode: anObject argumentNodes: aCollection
|
|
1036
|
+
| inlined |
|
|
1037
|
+
inlined := false.
|
|
1038
|
+
|
|
1039
|
+
"-- BlockClosures --"
|
|
1040
|
+
|
|
1041
|
+
(aSelector = 'whileTrue:') ifTrue: [
|
|
1042
|
+
(anObject isBlockNode and: [aCollection first isBlockNode]) ifTrue: [
|
|
1043
|
+
stream nextPutAll: '(function(){while('.
|
|
1044
|
+
self visit: anObject.
|
|
1045
|
+
stream nextPutAll: '()) {'.
|
|
1046
|
+
self visit: aCollection first.
|
|
1047
|
+
stream nextPutAll: '()}})()'.
|
|
1048
|
+
inlined := true]].
|
|
1049
|
+
|
|
1050
|
+
(aSelector = 'whileFalse:') ifTrue: [
|
|
1051
|
+
(anObject isBlockNode and: [aCollection first isBlockNode]) ifTrue: [
|
|
1052
|
+
stream nextPutAll: '(function(){while(!!'.
|
|
1053
|
+
self visit: anObject.
|
|
1054
|
+
stream nextPutAll: '()) {'.
|
|
1055
|
+
self visit: aCollection first.
|
|
1056
|
+
stream nextPutAll: '()}})()'.
|
|
1057
|
+
inlined := true]].
|
|
1058
|
+
|
|
1059
|
+
(aSelector = 'whileTrue') ifTrue: [
|
|
1060
|
+
anObject isBlockNode ifTrue: [
|
|
1061
|
+
stream nextPutAll: '(function(){while('.
|
|
1062
|
+
self visit: anObject.
|
|
1063
|
+
stream nextPutAll: '()) {}})()'.
|
|
1064
|
+
inlined := true]].
|
|
1065
|
+
|
|
1066
|
+
(aSelector = 'whileFalse') ifTrue: [
|
|
1067
|
+
anObject isBlockNode ifTrue: [
|
|
1068
|
+
stream nextPutAll: '(function(){while(!!'.
|
|
1069
|
+
self visit: anObject.
|
|
1070
|
+
stream nextPutAll: '()) {}})()'.
|
|
1071
|
+
inlined := true]].
|
|
1072
|
+
|
|
1073
|
+
"-- Numbers --"
|
|
1074
|
+
|
|
1075
|
+
(aSelector = '+') ifTrue: [
|
|
1076
|
+
(self isNode: anObject ofClass: Number) ifTrue: [
|
|
1077
|
+
self visit: anObject.
|
|
1078
|
+
stream nextPutAll: ' + '.
|
|
1079
|
+
self visit: aCollection first.
|
|
1080
|
+
inlined := true]].
|
|
1081
|
+
|
|
1082
|
+
(aSelector = '-') ifTrue: [
|
|
1083
|
+
(self isNode: anObject ofClass: Number) ifTrue: [
|
|
1084
|
+
self visit: anObject.
|
|
1085
|
+
stream nextPutAll: ' - '.
|
|
1086
|
+
self visit: aCollection first.
|
|
1087
|
+
inlined := true]].
|
|
1088
|
+
|
|
1089
|
+
(aSelector = '*') ifTrue: [
|
|
1090
|
+
(self isNode: anObject ofClass: Number) ifTrue: [
|
|
1091
|
+
self visit: anObject.
|
|
1092
|
+
stream nextPutAll: ' * '.
|
|
1093
|
+
self visit: aCollection first.
|
|
1094
|
+
inlined := true]].
|
|
1095
|
+
|
|
1096
|
+
(aSelector = '/') ifTrue: [
|
|
1097
|
+
(self isNode: anObject ofClass: Number) ifTrue: [
|
|
1098
|
+
self visit: anObject.
|
|
1099
|
+
stream nextPutAll: ' / '.
|
|
1100
|
+
self visit: aCollection first.
|
|
1101
|
+
inlined := true]].
|
|
1102
|
+
|
|
1103
|
+
(aSelector = '<') ifTrue: [
|
|
1104
|
+
(self isNode: anObject ofClass: Number) ifTrue: [
|
|
1105
|
+
self visit: anObject.
|
|
1106
|
+
stream nextPutAll: ' < '.
|
|
1107
|
+
self visit: aCollection first.
|
|
1108
|
+
inlined := true]].
|
|
1109
|
+
|
|
1110
|
+
(aSelector = '<=') ifTrue: [
|
|
1111
|
+
(self isNode: anObject ofClass: Number) ifTrue: [
|
|
1112
|
+
self visit: anObject.
|
|
1113
|
+
stream nextPutAll: ' <= '.
|
|
1114
|
+
self visit: aCollection first.
|
|
1115
|
+
inlined := true]].
|
|
1116
|
+
|
|
1117
|
+
(aSelector = '>') ifTrue: [
|
|
1118
|
+
(self isNode: anObject ofClass: Number) ifTrue: [
|
|
1119
|
+
self visit: anObject.
|
|
1120
|
+
stream nextPutAll: ' > '.
|
|
1121
|
+
self visit: aCollection first.
|
|
1122
|
+
inlined := true]].
|
|
1123
|
+
|
|
1124
|
+
(aSelector = '>=') ifTrue: [
|
|
1125
|
+
(self isNode: anObject ofClass: Number) ifTrue: [
|
|
1126
|
+
self visit: anObject.
|
|
1127
|
+
stream nextPutAll: ' >= '.
|
|
1128
|
+
self visit: aCollection first.
|
|
1129
|
+
inlined := true]].
|
|
1130
|
+
|
|
1131
|
+
"-- UndefinedObject --"
|
|
1132
|
+
|
|
1133
|
+
(aSelector = 'ifNil:') ifTrue: [
|
|
1134
|
+
aCollection first isBlockNode ifTrue: [
|
|
1135
|
+
stream nextPutAll: '(($receiver = '.
|
|
1136
|
+
self visit: anObject.
|
|
1137
|
+
stream nextPutAll: ') == nil || $receiver == undefined) ? '.
|
|
1138
|
+
self visit: aCollection first.
|
|
1139
|
+
stream nextPutAll: '() : $receiver'.
|
|
1140
|
+
inlined := true]].
|
|
1141
|
+
|
|
1142
|
+
(aSelector = 'ifNotNil:') ifTrue: [
|
|
1143
|
+
aCollection first isBlockNode ifTrue: [
|
|
1144
|
+
stream nextPutAll: '(($receiver = '.
|
|
1145
|
+
self visit: anObject.
|
|
1146
|
+
stream nextPutAll: ') !!= nil && $receiver !!= undefined) ? '.
|
|
1147
|
+
self visit: aCollection first.
|
|
1148
|
+
stream nextPutAll: '() : nil'.
|
|
1149
|
+
inlined := true]].
|
|
1150
|
+
|
|
1151
|
+
(aSelector = 'ifNil:ifNotNil:') ifTrue: [
|
|
1152
|
+
(aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
|
|
1153
|
+
stream nextPutAll: '(($receiver = '.
|
|
1154
|
+
self visit: anObject.
|
|
1155
|
+
stream nextPutAll: ') == nil || $receiver == undefined) ? '.
|
|
1156
|
+
self visit: aCollection first.
|
|
1157
|
+
stream nextPutAll: '() : '.
|
|
1158
|
+
self visit: aCollection second.
|
|
1159
|
+
stream nextPutAll: '()'.
|
|
1160
|
+
inlined := true]].
|
|
1161
|
+
|
|
1162
|
+
(aSelector = 'ifNotNil:ifNil:') ifTrue: [
|
|
1163
|
+
(aCollection first isBlockNode and: [aCollection second isBlockNode]) ifTrue: [
|
|
1164
|
+
stream nextPutAll: '(($receiver = '.
|
|
1165
|
+
self visit: anObject.
|
|
1166
|
+
stream nextPutAll: ') == nil || $receiver == undefined) ? '.
|
|
1167
|
+
self visit: aCollection second.
|
|
1168
|
+
stream nextPutAll: '() : '.
|
|
1169
|
+
self visit: aCollection first.
|
|
1170
|
+
stream nextPutAll: '()'.
|
|
1171
|
+
inlined := true]].
|
|
1172
|
+
|
|
1173
|
+
^inlined
|
|
1174
|
+
!
|
|
1175
|
+
|
|
1176
|
+
isNode: aNode ofClass: aClass
|
|
1177
|
+
^aNode isValueNode and: [
|
|
1178
|
+
aNode value class = aClass or: [
|
|
1179
|
+
aNode value = 'self' and: [self currentClass = aClass]]]
|
|
1180
|
+
! !
|
|
1181
|
+
|
|
1182
|
+
!Compiler methodsFor: 'testing'!
|
|
1183
|
+
|
|
1184
|
+
performOptimizations
|
|
1185
|
+
^self class performOptimizations
|
|
1186
|
+
! !
|
|
1187
|
+
|
|
1188
|
+
!Compiler methodsFor: 'visiting'!
|
|
1189
|
+
|
|
1190
|
+
send: aSelector to: aReceiver arguments: aCollection superSend: aBoolean
|
|
1191
|
+
^String streamContents: [:str || tmp |
|
|
1192
|
+
tmp := stream.
|
|
1193
|
+
str nextPutAll: 'smalltalk.send('.
|
|
1194
|
+
str nextPutAll: aReceiver.
|
|
1195
|
+
str nextPutAll: ', "', aSelector asSelector, '", ['.
|
|
1196
|
+
stream := str.
|
|
1197
|
+
aCollection
|
|
1198
|
+
do: [:each | self visit: each]
|
|
1199
|
+
separatedBy: [stream nextPutAll: ', '].
|
|
1200
|
+
stream := tmp.
|
|
1201
|
+
str nextPutAll: ']'.
|
|
1202
|
+
aBoolean ifTrue: [
|
|
1203
|
+
str nextPutAll: ', smalltalk.', (self classNameFor: self currentClass superclass)].
|
|
1204
|
+
str nextPutAll: ')']
|
|
1205
|
+
!
|
|
1206
|
+
|
|
1207
|
+
visit: aNode
|
|
1208
|
+
aNode accept: self
|
|
1209
|
+
!
|
|
1210
|
+
|
|
1211
|
+
visitAssignmentNode: aNode
|
|
1212
|
+
stream nextPutAll: '('.
|
|
1213
|
+
self visit: aNode left.
|
|
1214
|
+
stream nextPutAll: '='.
|
|
1215
|
+
self visit: aNode right.
|
|
1216
|
+
stream nextPutAll: ')'
|
|
1217
|
+
!
|
|
1218
|
+
|
|
1219
|
+
visitBlockNode: aNode
|
|
1220
|
+
stream nextPutAll: '(function('.
|
|
1221
|
+
aNode parameters
|
|
1222
|
+
do: [:each |
|
|
1223
|
+
tempVariables add: each.
|
|
1224
|
+
stream nextPutAll: each]
|
|
1225
|
+
separatedBy: [stream nextPutAll: ', '].
|
|
1226
|
+
stream nextPutAll: '){'.
|
|
1227
|
+
aNode nodes do: [:each | self visit: each].
|
|
1228
|
+
stream nextPutAll: '})'
|
|
1229
|
+
!
|
|
1230
|
+
|
|
1231
|
+
visitBlockSequenceNode: aNode
|
|
1232
|
+
| index |
|
|
1233
|
+
nestedBlocks := nestedBlocks + 1.
|
|
1234
|
+
aNode nodes isEmpty
|
|
1235
|
+
ifTrue: [
|
|
1236
|
+
stream nextPutAll: 'return nil;']
|
|
1237
|
+
ifFalse: [
|
|
1238
|
+
aNode temps do: [:each | | temp |
|
|
1239
|
+
temp := self safeVariableNameFor: each.
|
|
1240
|
+
tempVariables add: temp.
|
|
1241
|
+
stream nextPutAll: 'var ', temp, '=nil;'; lf].
|
|
1242
|
+
index := 0.
|
|
1243
|
+
aNode nodes do: [:each |
|
|
1244
|
+
index := index + 1.
|
|
1245
|
+
index = aNode nodes size ifTrue: [
|
|
1246
|
+
stream nextPutAll: 'return '].
|
|
1247
|
+
self visit: each.
|
|
1248
|
+
stream nextPutAll: ';']].
|
|
1249
|
+
nestedBlocks := nestedBlocks - 1
|
|
1250
|
+
!
|
|
1251
|
+
|
|
1252
|
+
visitCascadeNode: aNode
|
|
1253
|
+
| index |
|
|
1254
|
+
index := 0.
|
|
1255
|
+
(tempVariables includes: '$rec') ifFalse: [
|
|
1256
|
+
tempVariables add: '$rec'].
|
|
1257
|
+
stream nextPutAll: '(function($rec){'.
|
|
1258
|
+
aNode nodes do: [:each |
|
|
1259
|
+
index := index + 1.
|
|
1260
|
+
index = aNode nodes size ifTrue: [
|
|
1261
|
+
stream nextPutAll: 'return '].
|
|
1262
|
+
each receiver: (VariableNode new value: '$rec').
|
|
1263
|
+
self visit: each.
|
|
1264
|
+
stream nextPutAll: ';'].
|
|
1265
|
+
stream nextPutAll: '})('.
|
|
1266
|
+
self visit: aNode receiver.
|
|
1267
|
+
stream nextPutAll: ')'
|
|
1268
|
+
!
|
|
1269
|
+
|
|
1270
|
+
visitClassReferenceNode: aNode
|
|
1271
|
+
(referencedClasses includes: aNode value) ifFalse: [
|
|
1272
|
+
referencedClasses add: aNode value].
|
|
1273
|
+
stream nextPutAll: '(smalltalk.', aNode value, ' || ', aNode value, ')'
|
|
1274
|
+
!
|
|
1275
|
+
|
|
1276
|
+
visitDynamicArrayNode: aNode
|
|
1277
|
+
stream nextPutAll: '['.
|
|
1278
|
+
aNode nodes
|
|
1279
|
+
do: [:each | self visit: each]
|
|
1280
|
+
separatedBy: [stream nextPutAll: ','].
|
|
1281
|
+
stream nextPutAll: ']'
|
|
1282
|
+
!
|
|
1283
|
+
|
|
1284
|
+
visitDynamicDictionaryNode: aNode
|
|
1285
|
+
stream nextPutAll: 'smalltalk.HashedCollection._fromPairs_(['.
|
|
1286
|
+
aNode nodes
|
|
1287
|
+
do: [:each | self visit: each]
|
|
1288
|
+
separatedBy: [stream nextPutAll: ','].
|
|
1289
|
+
stream nextPutAll: '])'
|
|
1290
|
+
!
|
|
1291
|
+
|
|
1292
|
+
visitFailure: aFailure
|
|
1293
|
+
self error: aFailure asString
|
|
1294
|
+
!
|
|
1295
|
+
|
|
1296
|
+
visitJSStatementNode: aNode
|
|
1297
|
+
stream nextPutAll: (aNode source replace: '>>' with: '>')
|
|
1298
|
+
!
|
|
1299
|
+
|
|
1300
|
+
visitMethodNode: aNode
|
|
1301
|
+
| str currentSelector |
|
|
1302
|
+
currentSelector := aNode selector asSelector.
|
|
1303
|
+
nestedBlocks := 0.
|
|
1304
|
+
earlyReturn := false.
|
|
1305
|
+
messageSends := #().
|
|
1306
|
+
referencedClasses := #().
|
|
1307
|
+
unknownVariables := #().
|
|
1308
|
+
tempVariables := #().
|
|
1309
|
+
argVariables := #().
|
|
1310
|
+
stream
|
|
1311
|
+
nextPutAll: 'smalltalk.method({'; lf;
|
|
1312
|
+
nextPutAll: 'selector: "', aNode selector, '",'; lf.
|
|
1313
|
+
stream nextPutAll: 'source: unescape("', self source escaped, '"),';lf.
|
|
1314
|
+
stream nextPutAll: 'fn: function('.
|
|
1315
|
+
aNode arguments
|
|
1316
|
+
do: [:each |
|
|
1317
|
+
argVariables add: each.
|
|
1318
|
+
stream nextPutAll: each]
|
|
1319
|
+
separatedBy: [stream nextPutAll: ', '].
|
|
1320
|
+
stream
|
|
1321
|
+
nextPutAll: '){'; lf;
|
|
1322
|
+
nextPutAll: 'var self=this;'; lf.
|
|
1323
|
+
str := stream.
|
|
1324
|
+
stream := '' writeStream.
|
|
1325
|
+
aNode nodes do: [:each |
|
|
1326
|
+
self visit: each].
|
|
1327
|
+
earlyReturn ifTrue: [
|
|
1328
|
+
str nextPutAll: 'try{'].
|
|
1329
|
+
str nextPutAll: stream contents.
|
|
1330
|
+
stream := str.
|
|
1331
|
+
stream
|
|
1332
|
+
lf;
|
|
1333
|
+
nextPutAll: 'return self;'.
|
|
1334
|
+
earlyReturn ifTrue: [
|
|
1335
|
+
stream lf; nextPutAll: '} catch(e) {if(e.name === ''stReturn'' && e.selector === ', currentSelector printString, '){return e.fn()} throw(e)}'].
|
|
1336
|
+
stream nextPutAll: '}'.
|
|
1337
|
+
stream
|
|
1338
|
+
nextPutAll: ',', String lf, 'messageSends: ';
|
|
1339
|
+
nextPutAll: messageSends asJavascript, ','; lf;
|
|
1340
|
+
nextPutAll: 'args: ', argVariables asJavascript, ','; lf;
|
|
1341
|
+
nextPutAll: 'referencedClasses: ['.
|
|
1342
|
+
referencedClasses
|
|
1343
|
+
do: [:each | stream nextPutAll: each printString]
|
|
1344
|
+
separatedBy: [stream nextPutAll: ','].
|
|
1345
|
+
stream nextPutAll: ']'.
|
|
1346
|
+
stream nextPutAll: '})'
|
|
1347
|
+
!
|
|
1348
|
+
|
|
1349
|
+
visitReturnNode: aNode
|
|
1350
|
+
nestedBlocks > 0 ifTrue: [
|
|
1351
|
+
earlyReturn := true].
|
|
1352
|
+
earlyReturn
|
|
1353
|
+
ifTrue: [
|
|
1354
|
+
stream
|
|
1355
|
+
nextPutAll: '(function(){throw(';
|
|
1356
|
+
nextPutAll: '{name: ''stReturn'', selector: ';
|
|
1357
|
+
nextPutAll: currentSelector printString;
|
|
1358
|
+
nextPutAll: ', fn: function(){return ']
|
|
1359
|
+
ifFalse: [stream nextPutAll: 'return '].
|
|
1360
|
+
aNode nodes do: [:each |
|
|
1361
|
+
self visit: each].
|
|
1362
|
+
earlyReturn ifTrue: [
|
|
1363
|
+
stream nextPutAll: '}})})()']
|
|
1364
|
+
!
|
|
1365
|
+
|
|
1366
|
+
visitSendNode: aNode
|
|
1367
|
+
| str receiver superSend inlined |
|
|
1368
|
+
str := stream.
|
|
1369
|
+
(messageSends includes: aNode selector) ifFalse: [
|
|
1370
|
+
messageSends add: aNode selector].
|
|
1371
|
+
stream := '' writeStream.
|
|
1372
|
+
self visit: aNode receiver.
|
|
1373
|
+
superSend := stream contents = 'super'.
|
|
1374
|
+
receiver := superSend ifTrue: ['self'] ifFalse: [stream contents].
|
|
1375
|
+
stream := str.
|
|
1376
|
+
|
|
1377
|
+
self performOptimizations
|
|
1378
|
+
ifTrue: [
|
|
1379
|
+
(self inlineLiteral: aNode selector receiverNode: aNode receiver argumentNodes: aNode arguments) ifFalse: [
|
|
1380
|
+
(self inline: aNode selector receiver: receiver argumentNodes: aNode arguments)
|
|
1381
|
+
ifTrue: [stream nextPutAll: ' : ', (self send: aNode selector to: '$receiver' arguments: aNode arguments superSend: superSend), ')']
|
|
1382
|
+
ifFalse: [stream nextPutAll: (self send: aNode selector to: receiver arguments: aNode arguments superSend: superSend)]]]
|
|
1383
|
+
ifFalse: [stream nextPutAll: (self send: aNode selector to: receiver arguments: aNode arguments superSend: superSend)]
|
|
1384
|
+
!
|
|
1385
|
+
|
|
1386
|
+
visitSequenceNode: aNode
|
|
1387
|
+
aNode temps do: [:each || temp |
|
|
1388
|
+
temp := self safeVariableNameFor: each.
|
|
1389
|
+
tempVariables add: temp.
|
|
1390
|
+
stream nextPutAll: 'var ', temp, '=nil;'; lf].
|
|
1391
|
+
aNode nodes do: [:each |
|
|
1392
|
+
self visit: each.
|
|
1393
|
+
stream nextPutAll: ';']
|
|
1394
|
+
separatedBy: [stream lf]
|
|
1395
|
+
!
|
|
1396
|
+
|
|
1397
|
+
visitValueNode: aNode
|
|
1398
|
+
stream nextPutAll: aNode value asJavascript
|
|
1399
|
+
!
|
|
1400
|
+
|
|
1401
|
+
visitVariableNode: aNode
|
|
1402
|
+
| varName |
|
|
1403
|
+
(self currentClass allInstanceVariableNames includes: aNode value)
|
|
1404
|
+
ifTrue: [stream nextPutAll: 'self[''@', aNode value, ''']']
|
|
1405
|
+
ifFalse: [
|
|
1406
|
+
varName := self safeVariableNameFor: aNode value.
|
|
1407
|
+
(self knownVariables includes: varName)
|
|
1408
|
+
ifFalse: [
|
|
1409
|
+
unknownVariables add: aNode value.
|
|
1410
|
+
aNode assigned
|
|
1411
|
+
ifTrue: [stream nextPutAll: varName]
|
|
1412
|
+
ifFalse: [stream nextPutAll: '(typeof ', varName, ' == ''undefined'' ? nil : ', varName, ')']]
|
|
1413
|
+
ifTrue: [
|
|
1414
|
+
aNode value = 'thisContext'
|
|
1415
|
+
ifTrue: [stream nextPutAll: '(smalltalk.getThisContext())']
|
|
1416
|
+
ifFalse: [stream nextPutAll: varName]]]
|
|
1417
|
+
! !
|
|
1418
|
+
|
|
1419
|
+
Compiler class instanceVariableNames: 'performOptimizations'!
|
|
1420
|
+
|
|
1421
|
+
!Compiler class methodsFor: 'accessing'!
|
|
1422
|
+
|
|
1423
|
+
performOptimizations
|
|
1424
|
+
^performOptimizations ifNil: [true]
|
|
1425
|
+
!
|
|
1426
|
+
|
|
1427
|
+
performOptimizations: aBoolean
|
|
1428
|
+
performOptimizations := aBoolean
|
|
1429
|
+
! !
|
|
1430
|
+
|
|
1431
|
+
!Compiler class methodsFor: 'compiling'!
|
|
1432
|
+
|
|
1433
|
+
recompile: aClass
|
|
1434
|
+
aClass methodDictionary do: [:each || method |
|
|
1435
|
+
method := self new load: each source forClass: aClass.
|
|
1436
|
+
method category: each category.
|
|
1437
|
+
aClass addCompiledMethod: method].
|
|
1438
|
+
aClass isMetaclass ifFalse: [self recompile: aClass class]
|
|
1439
|
+
!
|
|
1440
|
+
|
|
1441
|
+
recompileAll
|
|
1442
|
+
Smalltalk current classes do: [:each |
|
|
1443
|
+
self recompile: each]
|
|
1444
|
+
! !
|
|
1445
|
+
|