1 /*! 2 * 3 * JavaLikeScript 4 * 5 */ 6 /** 7 * jls Base framework. 8 * All the framework objects are created under the jls namespace. 9 * The default objects are extended using prototype like behaviors. 10 * 11 * @namespace 12 * @see jls.lang 13 */ 14 var jls = {}; 15 16 /** 17 * @namespace Provides base classes for the jls language. 18 * @see jls.lang.Exception 19 * @see jls.lang.Logger 20 * @see jls.lang.ClassLoader 21 */ 22 jls.lang = {}; 23 24 // Load prototype light 25 _native.core.evalScript('plight.js'); 26 27 // Load base classes 28 _native.core.evalScript('jls/lang/Exception.js'); 29 _native.core.evalScript('jls/lang/Logger.js'); 30 31 /** 32 * Logger. 33 * 34 * @type jls.lang.Logger 35 * @memberOf jls 36 */ 37 jls.logger = new jls.lang.Logger(jls.lang.Logger.WARN); 38 39 if ('jls.logger.logLevel' in _native.core.properties) { 40 jls.logger.setLogLevel(_native.core.properties['jls.logger.logLevel']); 41 } 42 43 _native.core.evalScript('jls/lang/ClassLoader.js'); 44 45 /** 46 * ClassLoader. 47 * 48 * @type jls.lang.ClassLoader 49 * @memberOf jls 50 */ 51 jls.loader = new jls.lang.ClassLoader(); 52 53 // Register base classes 54 jls.loader.provide('jls.lang.Exception', true); 55 jls.loader.provide('jls.lang.Logger', true); 56 jls.loader.provide('jls.lang.ClassLoader', true); 57 58 /* 59 * Provide all lang classes 60 */ 61 jls.loader.require('jls.lang.Buffer'); 62 jls.loader.require('jls.lang.Process'); 63 jls.loader.require('jls.lang.Runtime'); 64 jls.loader.require('jls.lang.System'); 65 66 jls.lang.System._initialize(); 67 68 jls.loader.require('jls.lang.Thread'); 69 jls.loader.require('jls.lang.Signal'); 70 jls.loader.require('jls.lang.Lock'); 71 jls.loader.require('jls.lang.Monitor'); 72 //jls.loader.require('jls.lang.ProcessBuilder'); 73 jls.loader.require('jls.lang.Struct'); 74 //jls.loader.require('jls.lang.AssertionError'); 75 76 if ('jls.disableDefaultExceptionHandler' in _native.core.properties) { 77 jls.logger.info('Default exception handler disabled'); 78 } else { 79 /* 80 * Override exception handler 81 */ 82 _native.core.exceptionHandler = function(e) { 83 jls.lang.Exception.wrap(e).printStackTrace(jls.lang.System.err); 84 } 85 } 86 87 if ('jls.disableDefaultSignalHandler' in _native.core.properties) { 88 jls.logger.info('Default signal handlers disabled'); 89 } else { 90 /* 91 * Register default signal handlers. 92 */ 93 jls.lang.Signal.handle(jls.lang.Signal.SIGINT, function() { 94 jls.lang.Runtime.exit(0); 95 }); 96 /* 97 * Don't know how to dump javascript thread stacktraces 98 */ 99 /*jls.lang.Signal.handle(jls.lang.Signal.SIGBREAK, function() { 100 //jls.lang.System.out.println('... Dump stack trace ...'); 101 //new jls.lang.Exception().printStackTrace(jls.lang.System.out); 102 var name = 'jlsdump.' + new Date().getTime() + '.log'; 103 jls.lang.System.out.println('... Dump head to ' + name + '...'); 104 _native.core.dumpHead(name); 105 });*/ 106 } 107 108 if ('jls.enableCommonJSModule' in _native.core.properties) { 109 jls.loader.require('jls.lang.ModuleLoader'); 110 require = jls.lang.ModuleLoader.getInstance().require.bind(jls.lang.ModuleLoader.getInstance()); 111 } 112 113 if (_native.core.arguments.length > 0) { 114 var args = Array.from(_native.core.arguments); 115 var arg = args.shift(); 116 117 if ((arg == null) || (arg == '-help')) { 118 _native.core.boot = function() { 119 var lines = [ 120 'Usage: jls [options] classname [args...]', 121 'where options include:', 122 '\t-bs <bootstrap script file name>', 123 '\t\tThe file name of the script to use for bootstrap.', 124 '\t-ep <extension path>', 125 '\t\tA directory to search for native library files,', 126 '\t\tscript ZIP files and directories.', 127 '\t-lp <library search path of directories>', 128 '\t\tA ; separated list of directories to search for native library files.', 129 '\t-sp <script search path of directories and ZIP files>', 130 '\t\tA ; separated list of directories and ZIP archives', 131 '\t\tto search for script files.', 132 '\t-D<name>=<value>', 133 '\t\tSet a system property.', 134 '\t-logLevel <level>', 135 '\t\tSet the native log level.', 136 '\t--', 137 '\t\tStop the jls options parsing.', 138 'where system properties include:', 139 '\t-Djls.logger.logLevel=<level>', 140 '\t\tSet the log level.', 141 '\t-Djls.disableDefaultExceptionHandler', 142 '\t\tDisable uncaught exception default handler.', 143 '\t-Djls.disableDefaultSignalHandler', 144 '\t\tDisable default signal handlers.', 145 '\t-Djls.keep', 146 '\t\tWaits Ctrl-C if an exception occurs at boot phase.', 147 '\t-Djls.interactive', 148 '\t\tEnables interactive boot mode.', 149 'See http://javalikescript.free.fr/ for more details.' 150 ]; 151 for (var i = 0; i < lines.length; i++) { 152 jls.lang.System.out.println(lines[i]); 153 } 154 } 155 } else if (! arg.endsWith('.js')) { 156 /* 157 * Override boot function 158 */ 159 _native.core.boot = function() { 160 jls.loader.require(arg); 161 var mainclass = eval(arg); 162 if (! ('main' in mainclass)) { 163 throw new jls.lang.Exception('The class ' + arg + ' does not have a main method.'); 164 } 165 mainclass['main'](args); 166 }; 167 } 168 } else { 169 if ('jls.interactive' in _native.core.properties) { 170 // TODO 171 } 172 } 173 174 if ('jls.keep' in _native.core.properties) { 175 var previousBoot = _native.core.boot; 176 _native.core.boot = function() { 177 try { 178 previousBoot.apply(this, arguments); 179 } catch (e) { 180 jls.lang.System.err.println('Error during boot, hit ctrl-c to end.'); 181 jls.lang.Exception.wrap(e).printStackTrace(jls.lang.System.err); 182 // Start an infinite non daemon thread 183 var thread = new jls.lang.Thread(); 184 thread.run = function() { 185 while (true) { 186 jls.lang.Thread.sleep(500); 187 } 188 }; 189 thread.start(); 190 } 191 }; 192 } 193