📄 kernel.js
字号:
{
classesCodeCache[name] = code;
}
this.getClassCode = function(name)
{
return classesCodeCache[name];
}
this.clear = function ()
{
classesCache = {};
classesCodeCache = {};
}
this.getClassesCache = function ()
{
return classesCache;
}
this.getClassesCodeCache = function ()
{
return classesCodeCache;
}
});
/* Set Default Console */
JSVM.setConsole(new function()
{
this.output = function(msg)
{
window.alert(msg);
}
this.input = function(pmt)
{
window.prompt(pmt);
}
});
/* Set Default Compiler */
JSVM.setCompiler(new function()
{
var parsers = {"native" : {parse : function(s){return s;}}};
this.setParser = function(name, parser)
{
parsers[name.toLowerCase()] = parser;
JSVM.logger.log("JSVM compiler set the '"
+ name + "' parser succ.");
}
this.getParser = function(name)
{
return parsers[name.toLowerCase()];
}
var regexp_lang = /^(\s*)#( *)(language)( *):( *)(\S+)(\s*)/;
this.compile = function (sourceCode)
{
var code = sourceCode;
if (regexp_lang.test(code))
{
code = code.replace(regexp_lang, "");
var language = RegExp.$6;
var parser = this.getParser(language);
if (parser != null)
{
try
{
code = parser.parse(code);
}
catch(ex)
{
throw new Exception(0x001A,
"kernel.js/JSVM.compiler.compile() error. [code: "
+ sourceCode + "]");
}
}
else
{
throw new Exception(0x001C,
"kernel.js/JSVM.compiler.compile() error. the parser for '"
+ language + "' can't been found.");
}
}
return "(function(){" + code + "})();";
}
});
/* Set Default Engine */
JSVM.setEngine(new function()
{
var engine = this;
/* default API */
var _$import = function(name)
{
return JSVM.loadClass(name);
}
var _$package = function(name)
{
engine.definePackage(name);
}
this.executor = new function()
{
/* Mask these variables */
var jsre, JSVM, engine, typeOf, isPackage, isClass;
this.execute = function(code)
{
try
{
eval(code);
}
catch (ex)
{
var flag = false;
var cause = ex.cause;
while (cause != null)
{
if (cause.number ==
_JSVM_Namespace.deviceNumber * 0x10000 + 0x0012)
{
flag = true;
break;
}
cause = cause.cause;
}
throw new Exception(0x0012,
"kernel.js/JSVM.engine.executor.execute() fail. "
+ (flag ? "" : "[code: " + code + "]") , ex);
}
}
}
var typeOf = function(name)
{
try
{
return eval("typeof " + name);
}
catch (ex)
{
return "undefined";
}
}
/* Check Package */
var isPackage = function(name)
{
return (typeOf(name) == "object" &&
(eval(name) instanceof Package));
}
/* Check Class */
var isClass = function(name)
{
return (typeOf(name) == "object" &&
(eval(name) instanceof Class));
}
var classLock = new function()
{
var lockeds = {};
this.lock = function(name)
{
lockeds[name] = 1;
}
this.unlock = function(name)
{
lockeds[name] = 0;
}
this.isLocked = function(name)
{
return (lockeds[name] == 1);
}
}
/* Define Class */
this.defineClass = function(name, code)
{
try
{
if (classLock.isLocked(name))
{
throw new Exception(0x0013,
"kernel.js/JSVM.engine.defineClass() fail. class: '"
+ name +"' is locked.", ex);
}
classLock.lock(name);
this.executor.execute(code);
eval("var c=eval(name);c.prototype"
+ ".$class=c;c.$name=name;");
return c;
}
catch (ex)
{
throw new Exception(0x001E,
"kernel.js/JSVM.engine.defineClass() fail.", ex);
}
finally
{
classLock.unlock(name);
}
}
/* Define Package */
this.definePackage = function(name)
{
if (isPackage(name))
{
return;
}
if (typeOf(name) == "undefined")
{
var idx = name.lastIndexOf(".");
if (idx > -1)
{
this.definePackage(name.substring(0, idx));
}
return eval("window." + name
+ "=new Package(name);");
}
throw new Exception(0x0014,
"kernel.js/JSVM.engine.definePackage() fail. {'"
+ name + "' has been defined.}");
}
});
/* Set default classloader */
JSVM.setClassloader(new function()
{
/*** private properties begin ***/
var tmp, ex;
var classResourceBases = [];
var libResources = [];
var classHome = ((tmp = jsre.config.getParameter("class_home")) == null) ?
(jsre.jsvmHome + "/classes") : tmp.replace("${jsvmHome}", jsre.jsvmHome);
var libHome = ((tmp = jsre.config.getParameter("lib_home")) == null) ?
(jsre.jsvmHome + "/lib") : tmp.replace("${jsvmHome}", jsre.jsvmHome);
var logger = JSVM.logger;
var cache = {
"dict" : {},
"getClass" : function(name) {return this.dict[name];},
"putClass" : function(name, code) {this.dict[name] = code;}
};
/*** private properties end ***/
/*** ResourceLoader-Component Begin ***/
var resourceLoader = new function()
{
this.loadTxtResource = function(src)
{
try
{
var xmlHttp = (jsre.navigator == "ie") ?
new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
xmlHttp.open("GET", src, false);
xmlHttp.send(null);
var stus = xmlHttp.status;
if (stus == 200 || stus == 0 || stus == 304)
{
return xmlHttp.responseText;
}
}
catch (ex)
{
throw new Exception(0x0021,
"ie.js/ResourceLoader/loadTxtResource(String): Can't load Resource [src:"
+ src + "] {XmlHttp.send() Error:"
+ ex.getMessage().replace(/\r\n$/, "")
+ "}", ex);
}
finally
{
xmlHttp = null;
}
throw new Exception(0x0021,
"ie.js/ResourceLoader/loadTxtResource(String): Can't load Resource [src:"
+ src + "] {HTTP-STATUS:"
+ stus + "}", null);
}
}
/*** ResourceLoader-Component End ***/
/*** Private Methods Begin ***/
var loadLibFromObject = function(obj)
{
try
{
var entity = obj.entity;
for(var c in entity)
{
cache.putClass(c, entity[c]);
}
}
catch (ex)
{
throw new Exception(0x002E,
"moz.js/Classloader:loadLibFromObject(Object): fail. [obj:"
+ obj + "]", ex);
}
}
var loadScriptLib = function(src)
{
document.write("<script language=\"javascript\" src=\""
+ ((/^(\.|\\|\/|(\w){2,8}:)/.test(src)) ? src : (libHome + "/" + src))
+ "\"></script>");
}
/*** Private Methods End ***/
/*** Public Methods Begin ***/
/**
* load class from server or other
* @param name class name
*/
this.loadClassSource = function(name)
{
var err;
var classDirs = [classHome].concat(
classResourceBases);
for(var i = 0; i < classDirs.length; i++)
{
var path = classDirs[i] + "/"
+ name.replace(/\./gi,"/") + ".jsc";
try
{
return resourceLoader.loadTxtResource(path);
}
catch (ex)
{
err = ex;
if ((ex instanceof Exception)
&& (ex.number & 0x0000FFFF) == 0x0021)
{
continue;
}
}
}
throw new Exception(0x0024,
"ie.js/Classloader/loadClassSource(String): Can't load ["
+ name + "] Class Resource.", err);
}
/* Classloader initialize load some .jsr resource */
this.initialize = function()
{
for (var i = 0; i < libResources.length; i++)
{
this.loadLib(libResources[i]);
}
}
/**
* load class
* @param name class name
*/
this.loadClass = function(name)
{
try
{
var code = cache.getClass(name);
if (null != code)
{
return code;
}
code = this.loadClassSource(name);
if (code != null)
{
cache.putClass(name, code);
}
return code;
}
catch (ex)
{
throw new Exception(0x002B,
"ie.js/Classloader.loadClass(String): Class: '"
+ name + "' NotFound.", ex);
}
}
/**
* load package
* @param _packagename package name
*/
this.loadPackage = function(name)
{
throw new Exception(0x001B,
"ie.js/Classloader.loadPackage(String) not implemented.");
}
this.loadLib = function (arg)
{
try
{
switch (typeof(arg))
{
case "string" : loadScriptLib(arg); break;
case "object" : loadLibFromObject(arg); break;
}
}
catch (ex)
{
logger.log(new Exception(0x002C,
"ie.js/Classloader.loadLib(arg): fail [arg:"
+ arg + "]", ex));
}
}
this.setClasspath = function(cp)
{
if (cp != null && cp != "")
{
var cps = cp.replace(/;$/, "").split(";");
for (var i = 0; i < cps.length; i++)
{
if (/\.(\w)+$/.test(cps[i].toLowerCase()))
{
var l = libResources.length;
libResources[l++] = cps[i];
}
else
{
var l = classResourceBases.length;
classResourceBases[l++] = cps[i].replace(/\/$/, "");
}
}
}
}
this.setClassHome = function(ch)
{
classHome = ch;
}
this.getClassHome = function()
{
return classHome;
}
this.setLibHome = function(lh)
{
libHome = lh;
}
this.getLibHome = function()
{
return libHome;
}
this.setLogger = function(lg)
{
logger = lg;
}
/* set classpath */
this.setClasspath(jsre.classpath.replace("${jsvmHome}", jsre.jsvmHome));
this.initialize();
});
});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -