mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-01 21:42:35 +02:00

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 -
346 lines
9.4 KiB
JavaScript
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;
|
|
},
|
|
}
|