fpc/utils/pas2js/dist/rtl.js
marco a4445c0e9f --- Merging r35565 into '.':
U    packages/fcl-json/tests/testjsonrtti.pp
U    packages/fcl-json/src/fpjsonrtti.pp
--- Recording mergeinfo for merge of r35565 into '.':
 U   .
--- Merging r35571 into '.':
U    packages/fcl-passrc/src/pparser.pp
U    packages/fcl-passrc/tests/testpassrc.lpi
A    packages/fcl-passrc/tests/tcgenerics.pp
U    packages/fcl-passrc/tests/tctypeparser.pas
U    packages/fcl-passrc/tests/testpassrc.lpr
--- Recording mergeinfo for merge of r35571 into '.':
 G   .
--- Merging r35574 into '.':
U    packages/pastojs/fpmake.pp
--- Recording mergeinfo for merge of r35574 into '.':
 G   .
--- Merging r35576 into '.':
U    packages/fcl-js/src/jsscanner.pp
--- Recording mergeinfo for merge of r35576 into '.':
 G   .
--- Merging r35577 into '.':
U    packages/fcl-js/tests/tcwriter.pp
U    packages/fcl-js/src/jswriter.pp
--- Recording mergeinfo for merge of r35577 into '.':
 G   .
--- Merging r35578 into '.':
U    packages/fcl-passrc/src/pastree.pp
--- Recording mergeinfo for merge of r35578 into '.':
 G   .
--- Merging r35579 into '.':
U    packages/fcl-passrc/src/pscanner.pp
--- Recording mergeinfo for merge of r35579 into '.':
 G   .
--- Merging r35580 into '.':
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35580 into '.':
 G   .
--- Merging r35581 into '.':
U    packages/fcl-passrc/src/pasresolver.pp
--- Recording mergeinfo for merge of r35581 into '.':
 G   .
--- Merging r35582 into '.':
U    packages/fcl-passrc/tests/tcresolver.pas
--- Recording mergeinfo for merge of r35582 into '.':
 G   .
--- Merging r35583 into '.':
U    packages/pastojs/tests/tcmodules.pas
--- Recording mergeinfo for merge of r35583 into '.':
 G   .
--- Merging r35584 into '.':
U    packages/fcl-passrc/tests/tcbaseparser.pas
--- Recording mergeinfo for merge of r35584 into '.':
 G   .
--- Merging r35585 into '.':
U    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35585 into '.':
 G   .
--- Merging r35586 into '.':
G    packages/fcl-passrc/tests/testpassrc.lpr
A    packages/fcl-passrc/tests/tcuseanalyzer.pas
G    packages/fcl-passrc/tests/testpassrc.lpi
A    packages/fcl-passrc/src/pasuseanalyzer.pas
--- Recording mergeinfo for merge of r35586 into '.':
 G   .
--- Merging r35587 into '.':
U    packages/pastojs/tests/testpas2js.lpi
--- Recording mergeinfo for merge of r35587 into '.':
 G   .
--- Merging r35588 into '.':
G    packages/fcl-passrc/src/pscanner.pp
--- Recording mergeinfo for merge of r35588 into '.':
 G   .
--- Merging r35591 into '.':
U    packages/fcl-passrc/tests/tcexprparser.pas
U    packages/fcl-passrc/tests/tcgenerics.pp
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35591 into '.':
 G   .
--- Merging r35593 into '.':
U    packages/fcl-passrc/tests/tcstatements.pas
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35593 into '.':
 G   .
--- Merging r35597 into '.':
U    packages/fcl-passrc/tests/tcprocfunc.pas
G    packages/fcl-passrc/src/pastree.pp
--- Recording mergeinfo for merge of r35597 into '.':
 G   .
--- Merging r35612 into '.':
G    packages/fcl-passrc/tests/tcgenerics.pp
G    packages/fcl-passrc/src/pparser.pp
G    packages/fcl-passrc/src/pastree.pp
--- Recording mergeinfo for merge of r35612 into '.':
 G   .
--- Merging r35613 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/fcl-passrc/src/pscanner.pp
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35613 into '.':
 G   .
--- Merging r35614 into '.':
U    packages/fcl-passrc/tests/tcuseanalyzer.pas
U    packages/fcl-passrc/src/pasuseanalyzer.pas
--- Recording mergeinfo for merge of r35614 into '.':
 G   .
--- Merging r35615 into '.':
G    packages/pastojs/src/fppas2js.pp
U    packages/pastojs/tests/testpas2js.pp
G    packages/pastojs/tests/tcmodules.pas
A    packages/pastojs/tests/tcoptimizations.pas
G    packages/pastojs/tests/testpas2js.lpi
--- Recording mergeinfo for merge of r35615 into '.':
 G   .
--- Merging r35616 into '.':
G    packages/fcl-passrc/tests/tcgenerics.pp
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35616 into '.':
 G   .
--- Merging r35617 into '.':
G    packages/fcl-passrc/tests/tcgenerics.pp
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35617 into '.':
 G   .
--- Merging r35621 into '.':
G    packages/fcl-passrc/src/pscanner.pp
--- Recording mergeinfo for merge of r35621 into '.':
 G   .
--- Merging r35623 into '.':
U    packages/fcl-web/src/base/fpweb.pp
--- Recording mergeinfo for merge of r35623 into '.':
 G   .
--- Merging r35625 into '.':
U    packages/fcl-passrc/tests/tcscanner.pas
G    packages/fcl-passrc/src/pscanner.pp
--- Recording mergeinfo for merge of r35625 into '.':
 G   .
--- Merging r35631 into '.':
U    utils/pas2js/dist/rtl.js
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35631 into '.':
 G   .
--- Merging r35633 into '.':
G    packages/fcl-js/src/jswriter.pp
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pastree.pp
G    packages/fcl-passrc/src/pasresolver.pp
U    packages/pastojs/tests/tcconverter.pp
G    packages/pastojs/tests/tcmodules.pas
U    packages/pastojs/tests/tcoptimizations.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35633 into '.':
 G   .
--- Merging r35635 into '.':
G    packages/fcl-passrc/tests/testpassrc.lpi
U    packages/fcl-passrc/tests/tcclasstype.pas
G    packages/fcl-passrc/src/pastree.pp
G    packages/fcl-passrc/src/pscanner.pp
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35635 into '.':
 G   .
--- Merging r35636 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/tests/tcclasstype.pas
G    packages/fcl-passrc/src/pastree.pp
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35636 into '.':
 G   .
--- Merging r35637 into '.':
G    packages/fcl-passrc/tests/tcclasstype.pas
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35637 into '.':
 G   .
--- Merging r35638 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35638 into '.':
 G   .
--- Merging r35639 into '.':
G    packages/fcl-passrc/src/pparser.pp
U    packages/fcl-passrc/tests/tcvarparser.pas
G    packages/fcl-passrc/tests/tcclasstype.pas
G    packages/fcl-passrc/tests/tcresolver.pas
--- Recording mergeinfo for merge of r35639 into '.':
 G   .
--- Merging r35640 into '.':
G    packages/fcl-js/src/jswriter.pp
--- Recording mergeinfo for merge of r35640 into '.':
 G   .
--- Merging r35641 into '.':
G    packages/fcl-passrc/tests/tcstatements.pas
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35641 into '.':
 G   .
--- Merging r35642 into '.':
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/fcl-passrc/tests/tcresolver.pas
--- Recording mergeinfo for merge of r35642 into '.':
 G   .
--- Merging r35643 into '.':
G    packages/pastojs/src/fppas2js.pp
G    packages/pastojs/tests/tcmodules.pas
--- Recording mergeinfo for merge of r35643 into '.':
 G   .
--- Merging r35644 into '.':
U    packages/fcl-json/src/jsonconf.pp
--- Recording mergeinfo for merge of r35644 into '.':
 G   .
--- Merging r35648 into '.':
U    packages/fcl-passrc/fpmake.pp
--- Recording mergeinfo for merge of r35648 into '.':
 G   .
--- Merging r35651 into '.':
G    packages/fcl-js/src/jswriter.pp
--- Recording mergeinfo for merge of r35651 into '.':
 G   .
--- Merging r35652 into '.':
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35652 into '.':
 G   .
--- Merging r35653 into '.':
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35653 into '.':
 G   .
--- Merging r35667 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/tests/tcuseanalyzer.pas
G    packages/fcl-passrc/src/pastree.pp
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/fcl-passrc/src/pasuseanalyzer.pas
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35667 into '.':
 G   .
--- Merging r35668 into '.':
G    packages/pastojs/tests/tcconverter.pp
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/tests/tcoptimizations.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35668 into '.':
 G   .
--- Merging r35680 into '.':
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35680 into '.':
 G   .
--- Merging r35681 into '.':
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/fcl-passrc/tests/tcresolver.pas
--- Recording mergeinfo for merge of r35681 into '.':
 G   .
--- Merging r35682 into '.':
G    packages/fcl-passrc/src/pasuseanalyzer.pas
G    packages/fcl-passrc/tests/tcuseanalyzer.pas
--- Recording mergeinfo for merge of r35682 into '.':
 G   .
--- Merging r35683 into '.':
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35683 into '.':
 G   .
--- Merging r35691 into '.':
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35691 into '.':
 G   .
--- Merging r35692 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pasresolver.pp
--- Recording mergeinfo for merge of r35692 into '.':
 G   .
--- Merging r35693 into '.':
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35693 into '.':
 G   .
--- Merging r35694 into '.':
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35694 into '.':
 G   .
--- Merging r35695 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pasresolver.pp
--- Recording mergeinfo for merge of r35695 into '.':
 G   .
--- Merging r35696 into '.':
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35696 into '.':
 G   .
--- Merging r35697 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/tests/tcuseanalyzer.pas
G    packages/fcl-passrc/src/pasuseanalyzer.pas
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35697 into '.':
 G   .
--- Merging r35702 into '.':
G    packages/fcl-passrc/tests/tcbaseparser.pas
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pasresolver.pp
--- Recording mergeinfo for merge of r35702 into '.':
 G   .
--- Merging r35703 into '.':
G    packages/fcl-passrc/tests/tcuseanalyzer.pas
G    packages/fcl-passrc/src/pasuseanalyzer.pas
--- Recording mergeinfo for merge of r35703 into '.':
 G   .
--- Merging r35704 into '.':
G    packages/pastojs/src/fppas2js.pp
G    packages/pastojs/tests/tcmodules.pas
--- Recording mergeinfo for merge of r35704 into '.':
 G   .
--- Merging r35705 into '.':
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35705 into '.':
 G   .
--- Merging r35706 into '.':
G    packages/pastojs/tests/tcmodules.pas
--- Recording mergeinfo for merge of r35706 into '.':
 G   .
--- Merging r35708 into '.':
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/fcl-passrc/tests/tcuseanalyzer.pas
--- Recording mergeinfo for merge of r35708 into '.':
 G   .
--- Merging r35709 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pasresolver.pp
--- Recording mergeinfo for merge of r35709 into '.':
 G   .
--- Merging r35710 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pasresolver.pp
--- Recording mergeinfo for merge of r35710 into '.':
 G   .
--- Merging r35711 into '.':
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35711 into '.':
 G   .
--- Merging r35713 into '.':
G    packages/fcl-passrc/src/pasresolver.pp
--- Recording mergeinfo for merge of r35713 into '.':
 G   .
--- Merging r35714 into '.':
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35714 into '.':
 G   .
--- Merging r35715 into '.':
G    packages/fcl-passrc/src/pastree.pp
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/fcl-passrc/src/pasuseanalyzer.pas
--- Recording mergeinfo for merge of r35715 into '.':
 G   .
--- Merging r35716 into '.':
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35716 into '.':
 G   .
--- Merging r35718 into '.':
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
G    packages/fcl-passrc/src/pasresolver.pp
--- Recording mergeinfo for merge of r35718 into '.':
 G   .
--- Merging r35719 into '.':
G    packages/pastojs/src/fppas2js.pp
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/tests/tcuseanalyzer.pas
G    packages/fcl-passrc/src/pasresolver.pp
--- Recording mergeinfo for merge of r35719 into '.':
 G   .
--- Merging r35720 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/tests/tcuseanalyzer.pas
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/fcl-passrc/src/pasuseanalyzer.pas
--- Recording mergeinfo for merge of r35720 into '.':
 G   .
--- Merging r35728 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pastree.pp
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/fcl-passrc/src/pscanner.pp
G    packages/fcl-passrc/src/pparser.pp
--- Recording mergeinfo for merge of r35728 into '.':
 G   .
--- Merging r35729 into '.':
G    packages/pastojs/src/fppas2js.pp
G    packages/pastojs/tests/tcmodules.pas
--- Recording mergeinfo for merge of r35729 into '.':
 G   .
--- Merging r35731 into '.':
G    packages/fcl-passrc/src/pasuseanalyzer.pas
G    packages/fcl-passrc/src/pparser.pp
G    packages/fcl-passrc/src/pasresolver.pp
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/tests/tcuseanalyzer.pas
--- Recording mergeinfo for merge of r35731 into '.':
 G   .
--- Merging r35732 into '.':
G    packages/pastojs/src/fppas2js.pp
G    packages/pastojs/tests/tcmodules.pas
--- Recording mergeinfo for merge of r35732 into '.':
 G   .
--- Merging r35735 into '.':
G    packages/fcl-passrc/tests/tcresolver.pas
G    packages/fcl-passrc/src/pasresolver.pp
--- Recording mergeinfo for merge of r35735 into '.':
 G   .
--- Merging r35736 into '.':
G    packages/pastojs/src/fppas2js.pp
G    packages/pastojs/tests/tcmodules.pas
--- Recording mergeinfo for merge of r35736 into '.':
 G   .
--- Merging r35737 into '.':
G    packages/fcl-passrc/tests/tcuseanalyzer.pas
--- Recording mergeinfo for merge of r35737 into '.':
 G   .
--- Merging r35738 into '.':
G    packages/pastojs/tests/tcmodules.pas
G    packages/pastojs/src/fppas2js.pp
--- Recording mergeinfo for merge of r35738 into '.':
 G   .

# revisions: 35565,35571,35574,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35591,35593,35597,35612,35613,35614,35615,35616,35617,35621,35623,35625,35631,35633,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35648,35651,35652,35653,35667,35668,35680,35681,35682,35683,35691,35692,35693,35694,35695,35696,35697,35702,35703,35704,35705,35706,35708,35709,35710,35711,35713,35714,35715,35716,35718,35719,35720,35728,35729,35731,35732,35735,35736,35737,35738

git-svn-id: branches/fixes_3_0@35986 -
2017-04-27 19:48:42 +00:00

346 lines
9.4 KiB
JavaScript

/*
This file is part of the Free Pascal pas2js tool.
Copyright (c) 2017 Mattias Gaertner
Basic RTL for pas2js programs.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
var pas = {};
var rtl = {
quiet: false,
debug_load_units: false,
m_loading: 0,
m_loading_intf: 1,
m_intf_loaded: 2,
m_loading_impl: 3, // loading all used unit
m_initializing: 4, // running initialization
m_initialized: 5,
debug: function(){
if (rtl.quiet || !console || !console.log) return;
console.log(arguments);
},
error: function(s){
rtl.debug('Error: ',s);
throw s;
},
warn: function(s){
rtl.debug('Warn: ',s);
},
isArray: function(a) {
return a instanceof Array;
},
isNumber: function(n){
return typeof(n)=="number";
},
isInteger: function(A){
return Math.floor(A)===A;
},
isBoolean: function(b){
return typeof(b)=="boolean";
},
isString: function(s){
return typeof(s)=="string";
},
isObject: function(o){
return typeof(o)=="object";
},
isFunction: function(f){
return typeof(f)=="function";
},
isNull: function(o){
return (o==null && typeof(o)=='object') || o==undefined;
},
isRecord: function(r){
return (typeof(r)=="function") && (typeof(r.$create) == "function");
},
isClass: function(c){
return (typeof(o)=="object") && (o.$class == o);
},
isClassInstance: function(c){
return (typeof(o)=="object") && (o.$class == Object.getPrototypeOf(o));
},
hasString: function(s){
return rtl.isString(s) && (s.length>0);
},
module: function(module_name, intfuseslist, code, impluseslist){
if (rtl.debug_load_units) rtl.debug('rtl.module name="'+module_name+'" intfuses='+intfuseslist+' impluses='+impluseslist);
if (!rtl.hasString(module_name)) rtl.error('invalid module name "'+module_name+'"');
if (!rtl.isArray(intfuseslist)) rtl.error('invalid interface useslist of "'+module_name+'"');
if (!rtl.isFunction(code)) rtl.error('invalid module code of "'+module_name+'"');
if ((impluseslist!=undefined) && !rtl.isArray(impluseslist)) rtl.error('invalid implementation useslist of "'+module_name+'"');
if (pas[module_name])
rtl.error('module "'+module_name+'" already registered');
var module = pas[module_name] = {
$name: module_name,
$intfuseslist: intfuseslist,
$impluseslist: impluseslist,
$state: rtl.m_loading,
$code: code
};
},
run: function(module_name){
if (module_name==undefined) module_name='program';
if (rtl.debug_load_units) rtl.debug('rtl.run module="'+module_name+'"');
var module = pas[module_name];
rtl.loadintf(module);
rtl.loadimpl(module);
if (module_name=='program'){
if (rtl.debug_load_units) rtl.debug('running $main');
pas.program.$main();
}
return pas.System.ExitCode;
},
loadintf: function(module){
if (module.state>rtl.m_loading_intf) return; // already finished
if (rtl.debug_load_units) rtl.debug('loadintf: '+module.$name);
if (module.$state==rtl.m_loading_intf)
rtl.error('unit cycle detected "'+module.$name+'"');
module.$state=rtl.m_loading_intf;
// load interfaces of interface useslist
rtl.loaduseslist(module,module.$intfuseslist,rtl.loadintf);
// run interface
if (rtl.debug_load_units) rtl.debug('loadintf: run intf of '+module.$name);
module.$code(module.$intfuseslist,module);
// success
module.$state=rtl.m_intf_loaded;
// Note: units only used in implementations are not yet loaded (not even their interfaces)
},
loaduseslist: function(module,useslist,f){
if (useslist==undefined) return;
for (var i in useslist){
var unitname=useslist[i];
if (rtl.debug_load_units) rtl.debug('loaduseslist of "'+module.name+'" uses="'+unitname+'"');
if (pas[unitname]==undefined)
rtl.error('module "'+module.$name+'" misses "'+unitname+'"');
f(pas[unitname]);
}
},
loadimpl: function(module){
if (module.$state>=rtl.m_loading_impl) return; // already processing
if (module.$state<rtl.m_loading_intf) rtl.loadintf(module);
if (rtl.debug_load_units) rtl.debug('loadimpl: '+module.$name+' load uses');
module.$state=rtl.m_loading_impl;
// load implementation of interfaces useslist
rtl.loaduseslist(module,module.$intfuseslist,rtl.loadimpl);
// load implementation of implementation useslist
rtl.loaduseslist(module,module.$impluseslist,rtl.loadimpl);
// Note: At this point all interfaces used by this unit are loaded. If
// there are implementation uses cycles some used units might not yet be
// initialized. This is by design.
// run initialization
if (rtl.debug_load_units) rtl.debug('loadimpl: '+module.$name+' run init');
module.$state=rtl.m_initializing;
if (rtl.isFunction(module.$init))
module.$init();
// unit initialized
module.$state=rtl.m_initialized;
},
createCallback: function(scope, fnname){
var cb = function(){
return scope[fnname].apply(scope,arguments);
};
cb.scope = scope;
cb.fnname = fnname;
return cb;
},
cloneCallback: function(cb){
return rtl.createCallback(cb.scope,cb.fnname);
},
eqCallback: function(a,b){
if (a==null){
return (b==null);
} else {
return (b!=null) && (a.scope==b.scope) && (a.fnname==b.fnname);
}
},
createClass: function(owner,name,ancestor,initfn){
var c = null;
if (ancestor != null){
c = Object.create(ancestor);
c.$ancestor = ancestor; // c.$ancestor == Object.getPrototypeOf(c)
} else {
c = {};
c.$create = function(fnname,args){
var o = Object.create(this);
o.$class = this; // Note: o.$class == Object.getPrototypeOf(o)
if (args == undefined) args = [];
o.$init();
o[fnname].apply(o,args);
o.AfterConstruction();
return o;
};
c.$destroy = function(fnname){
this.BeforeDestruction();
this[fnname]();
this.$final;
};
};
c.$classname = name;
c.$name = owner.$name+'.'+name;
c.$unitname = rtl.isString(owner.$unitname) ? owner.$unitname : owner.$name;
owner[name] = c;
initfn.call(c);
},
as: function(instance,typ){
if(typ.isPrototypeOf(instance)) return instance;
throw pas.System.EInvalidCast.$create("create");
},
arraySetLength: function(arr,newlength,defaultvalue){
var oldlen = arr.length;
if (oldlen==newlength) return;
arr.length = newlength;
if (rtl.isArray(defaultvalue)){
for (var i=oldlen; i<newlength; i++) arr[i]=[]; // new array
} else if (rtl.isFunction(defaultvalue)){
for (var i=oldlen; i<newlength; i++) arr[i]=new defaultvalue(); // new record
} else {
for (var i=oldlen; i<newlength; i++) arr[i]=defaultvalue;
}
return arr;
},
arrayNewMultiDim: function(dims,defaultvalue){
function create(dim){
if (dim == dims.length-1){
return rtl.arraySetLength([],dims[dim],defaultvalue);
}
var a = [];
var count = dims[dim];
a.length = count;
for(var i=0; i<count; i++) a[i] = create(dim+1);
return a;
};
return create(0);
},
setCharAt: function(s,index,c){
return s.substr(0,index)+c+s.substr(index+1);
},
createSet: function(){
var s = {};
for (var i=0; i<arguments.length; i++){
if (arguments[i]!=null){
s[arguments[i]]=true;
} else {
var first=arguments[i+=1];
var last=arguments[i+=1];
for(var j=first; j<=last; j++) s[j]=true;
}
}
return s;
},
cloneSet: function(s){
var r = {};
for (var key in s) if (s.hasOwnProperty(key)) r[key]=true;
return r;
},
refSet: function(s){
s.$shared = true;
return s;
},
includeSet: function(s,enumvalue){
if (s.$shared) s = cloneSet(s);
s[enumvalue] = true;
return s;
},
excludeSet: function(s,enumvalue){
if (s.$shared) s = cloneSet(s);
delete s[enumvalue];
return s;
},
diffSet: function(s,t){
var r = {};
for (var key in s) if (s.hasOwnProperty(key) && !t[key]) r[key]=true;
delete r.$shared;
return r;
},
unionSet: function(s,t){
var r = {};
for (var key in s) if (s.hasOwnProperty(key)) r[key]=true;
for (var key in t) if (t.hasOwnProperty(key)) r[key]=true;
delete r.$shared;
return r;
},
intersectSet: function(s,t){
var r = {};
for (var key in s) if (s.hasOwnProperty(key) && t[key]) r[key]=true;
delete r.$shared;
return r;
},
symDiffSet: function(s,t){
var r = {};
for (var key in s) if (s.hasOwnProperty(key) && !t[key]) r[key]=true;
for (var key in t) if (t.hasOwnProperty(key) && !s[key]) r[key]=true;
delete r.$shared;
return r;
},
eqSet: function(s,t){
for (var key in s) if (s.hasOwnProperty(key) && !t[key] && (key!='$shared')) return false;
for (var key in t) if (t.hasOwnProperty(key) && !s[key] && (key!='$shared')) return false;
return true;
},
neSet: function(s,t){
return !rtl.eqSet(s,t);
},
leSet: function(s,t){
for (var key in s) if (s.hasOwnProperty(key) && !t[key] && (key!='$shared')) return false;
return true;
},
geSet: function(s,t){
for (var key in t) if (t.hasOwnProperty(key) && !s[key] && (key!='$shared')) return false;
return true;
},
}