mdbe 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|