Skip to content
Permalink
Browse files Browse the repository at this point in the history
Release "3.0.6": Fix crashes in Array for "integer overflow #10"
FossilOrigin-Name: 50642d64b8f0a4e62df68e59fcb2ef0923c3dbec8fc8a15d38b1ddbe655c38d6
  • Loading branch information
pmacdona committed Apr 13, 2020
1 parent bd0bd26 commit 5408a6d
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 57 deletions.
3 changes: 2 additions & 1 deletion md/Reference.md
Expand Up @@ -519,7 +519,7 @@ Otherwise second argument must be a set of options.</td></tr>
<tr><td>level</td><td>level(level:number=void):number|array|object </td><td>Return current level or details of a call-stack frame. With no arg, returns the number of the current stack frame level.
Otherwise returns details on the specified level.
The topmost level is 1, and 0 is the current level, and a negative level translates as relative to the current level.</td></tr>
<tr><td>locals</td><td>locals(varsOnly:boolean=void):object </td><td>Return functions/vars inside local function.</td></tr>
<tr><td>locals</td><td>locals(filter:boolean=void):object </td><td>Return locals; use filter=true/false just vars/functions.</td></tr>
<tr><td>lookup</td><td>lookup(name:string) </td><td>Given string name, lookup and return value, eg: function.</td></tr>
<tr><td>methods</td><td>methods(val:string|regexp):array|object </td><td>Return functions and commands.</td></tr>
<tr><td>named</td><td>named(name:string=void):array|userobj </td><td>Returns command names for builtin Objects, eg: 'File', 'Interp', sub-Object names, or the named object.</td></tr>
Expand Down Expand Up @@ -1328,6 +1328,7 @@ With one argument, loads the package (if necessary) and returns its version.
With two arguments, returns object containing: version, loadFile, func.
A third argument sets options for package or module.
Note an error is thrown if requested version is greater than actual version.</td></tr>
<tr><td>runMain</td><td>runMain(cmd:string|null|function=void, conf:array=undefined) </td><td>If isMain invokes runModule.</td></tr>
<tr><td>runModule</td><td>runModule(cmd:string|null|function=void, conf:array=undefined) </td><td>Invoke named module. If name is empty, uses file basename. If isMain and no args givine parses console.args.</td></tr>
<tr><td>setInterval</td><td>setInterval(callback:function, ms:number):number </td><td>Setup recurring function to run every given millisecs.</td></tr>
<tr><td>setTimeout</td><td>setTimeout(callback:function, ms:number):number </td><td>Setup function to run after given millisecs.</td></tr>
Expand Down
2 changes: 1 addition & 1 deletion src/jsi.h
Expand Up @@ -4,7 +4,7 @@

#define JSI_VERSION_MAJOR 3
#define JSI_VERSION_MINOR 0
#define JSI_VERSION_RELEASE 4
#define JSI_VERSION_RELEASE 6

#define JSI_VERSION (JSI_VERSION_MAJOR + ((Jsi_Number)JSI_VERSION_MINOR/100.0) + ((Jsi_Number)JSI_VERSION_RELEASE/10000.0))

Expand Down
78 changes: 27 additions & 51 deletions src/jsiArray.c
Expand Up @@ -7,6 +7,12 @@
#define NO_QSORT_R 1
#endif

static uint jsi_SizeOfArray(Jsi_Interp *interp, Jsi_Obj *obj) {
if (!obj || !obj->arr)
return 0;
return obj->arrCnt;
}

static Jsi_RC jsi_ArrayPushCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,
Jsi_Value **ret, Jsi_Func *funcPtr)
{
Expand All @@ -19,19 +25,15 @@ static Jsi_RC jsi_ArrayPushCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_
obj = _this->d.obj;

int argc = Jsi_ValueGetLength(interp, args);
int curlen = Jsi_ObjGetLength(interp, obj);
if (curlen < 0) {
Jsi_ObjSetLength(interp, obj, 0);
}

int curlen = jsi_SizeOfArray(interp, obj);
int i;
for (i = 0; i < argc; ++i) {
Jsi_Value *ov = Jsi_ValueArrayIndex(interp, args, i);
if (!ov) { Jsi_LogBug("Arguments Error"); ov = Jsi_ValueNew(interp); }
Jsi_ValueInsertArray(interp, _this, curlen + i, ov, 0);
}

Jsi_ValueMakeNumber(interp, ret, Jsi_ObjGetLength(interp, obj));
Jsi_ValueMakeNumber(interp, ret, jsi_SizeOfArray(interp, obj));
return JSI_OK;
}

Expand All @@ -45,7 +47,7 @@ static Jsi_RC jsi_ArrayPopCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_t
Jsi_Value *v;
Jsi_Obj *obj;
obj = _this->d.obj;
int i = Jsi_ObjGetLength(interp, obj) - 1;
int i = jsi_SizeOfArray(interp, obj) - 1;

if (i < 0) {
Jsi_ValueMakeUndef(interp, ret);
Expand Down Expand Up @@ -78,7 +80,7 @@ static Jsi_RC jsi_ArrayJoinCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_
int argc, curlen;
Jsi_DString dStr = {};

curlen = Jsi_ObjGetLength(interp, _this->d.obj);
curlen = jsi_SizeOfArray(interp, _this->d.obj);
if (curlen == 0) {
goto bail;
}
Expand All @@ -89,7 +91,7 @@ static Jsi_RC jsi_ArrayJoinCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_
jstr = Jsi_ValueToString(interp, sc, NULL);
}

if (0 == (argc=Jsi_ObjGetLength(interp, _this->d.obj))) {
if (0 == (argc=jsi_SizeOfArray(interp, _this->d.obj))) {
goto bail;
}
int i;
Expand Down Expand Up @@ -233,7 +235,7 @@ void Jsi_ValueArrayShift(Jsi_Interp *interp, Jsi_Value *v)
return;
}

int len = Jsi_ObjGetLength(interp, v->d.obj);
int len = jsi_SizeOfArray(interp, v->d.obj);
if (len <= 0) return;

Jsi_Value *v0 = Jsi_ValueArrayIndex(interp, v, 0);
Expand All @@ -255,10 +257,10 @@ void Jsi_ValueArrayShift(Jsi_Interp *interp, Jsi_Value *v)

static Jsi_RC jsi_ArrayFlatSub(Jsi_Interp *interp, Jsi_Obj* nobj, Jsi_Value *arr, int depth) {

int i, n = 0, len = Jsi_ObjGetLength(interp, arr->d.obj);
int i, n = 0, len = jsi_SizeOfArray(interp, arr->d.obj);
if (len <= 0) return JSI_OK;
Jsi_RC rc = JSI_OK;
int clen = Jsi_ObjGetLength(interp, nobj);
int clen = jsi_SizeOfArray(interp, nobj);
for (i = 0; i < len && rc == JSI_OK; i++) {
Jsi_Value *t = Jsi_ValueArrayIndex(interp, arr, i);
if (t && depth>0 && Jsi_ValueIsArray(interp, t))
Expand Down Expand Up @@ -302,10 +304,7 @@ static Jsi_RC jsi_ArrayConcatCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value
obj = _this->d.obj;

argc = Jsi_ValueGetLength(interp, args);
curlen = Jsi_ObjGetLength(interp, obj);
if (curlen < 0) {
Jsi_ObjSetLength(interp, obj, 0);
}
curlen = jsi_SizeOfArray(interp, obj);
Jsi_ObjListifyArray(interp, obj);

nobj = Jsi_ObjNewType(interp, JSI_OT_ARRAY);
Expand Down Expand Up @@ -377,10 +376,7 @@ static Jsi_RC jsi_ArrayMapCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_t
if (!sthis)
sthis = nthis = Jsi_ValueNew1(interp);
obj = _this->d.obj;
curlen = Jsi_ObjGetLength(interp, obj);
if (curlen < 0) {
Jsi_ObjSetLength(interp, obj, 0);
}
curlen = jsi_SizeOfArray(interp, obj);
Jsi_ObjListifyArray(interp, obj);
nobj = Jsi_ObjNewType(interp, JSI_OT_ARRAY);
nsiz = obj->arrCnt;
Expand Down Expand Up @@ -439,10 +435,7 @@ static Jsi_RC jsi_ArrayFilterCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value
if (!sthis)
sthis = nthis = Jsi_ValueNew1(interp);
obj = _this->d.obj;
curlen = Jsi_ObjGetLength(interp, obj);
if (curlen < 0) {
Jsi_ObjSetLength(interp, obj, 0);
}
curlen = jsi_SizeOfArray(interp, obj);
Jsi_ObjListifyArray(interp, obj);
nobj = Jsi_ObjNewType(interp, JSI_OT_ARRAY);
nsiz = obj->arrCnt;
Expand Down Expand Up @@ -522,7 +515,6 @@ static Jsi_RC jsi_ArrayForeachCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value
if (_this->vt != JSI_VT_OBJECT || !Jsi_ObjIsArray(interp, _this->d.obj))
return Jsi_LogError("expected array object");
Jsi_Obj *obj;
int curlen;
uint i;
Jsi_Value *func, *vpargs;

Expand All @@ -535,10 +527,6 @@ static Jsi_RC jsi_ArrayForeachCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value
sthis = nthis = Jsi_ValueNew1(interp);

obj = _this->d.obj;
curlen = Jsi_ObjGetLength(interp, obj);
if (curlen < 0) {
Jsi_ObjSetLength(interp, obj, 0);
}
Jsi_ObjListifyArray(interp, obj);
Jsi_RC rc = JSI_OK;

Expand Down Expand Up @@ -566,7 +554,6 @@ static Jsi_RC jsi_ArrayFindSubCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value
if (_this->vt != JSI_VT_OBJECT || !Jsi_ObjIsArray(interp, _this->d.obj))
return Jsi_LogError("expected array");
Jsi_Obj *obj;
int curlen;
uint i;
Jsi_RC rc = JSI_OK;
Jsi_Value *func, *vpargs, *sthis = Jsi_ValueArrayIndex(interp, args, 1);
Expand All @@ -579,10 +566,6 @@ static Jsi_RC jsi_ArrayFindSubCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value
sthis = nthis = Jsi_ValueNew1(interp);

obj = _this->d.obj;
curlen = Jsi_ObjGetLength(interp, obj);
if (curlen < 0) {
Jsi_ObjSetLength(interp, obj, 0);
}
Jsi_ObjListifyArray(interp, obj);
int fval = 0;
Jsi_Value *nrPtr = Jsi_ValueNew1(interp);
Expand Down Expand Up @@ -628,7 +611,7 @@ static Jsi_RC jsi_ArrayReduceSubCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Val
if (_this->vt != JSI_VT_OBJECT || !Jsi_ObjIsArray(interp, _this->d.obj))
return Jsi_LogError("expected array");
Jsi_RC rc = JSI_OK;
int curlen, i;
int i;
Jsi_Obj *obj;
Jsi_Value *func, *vpargs, *ini = Jsi_ValueArrayIndex(interp, args, 1);

Expand All @@ -638,9 +621,6 @@ static Jsi_RC jsi_ArrayReduceSubCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Val

Jsi_Value *nrPtr = Jsi_ValueNew1(interp);
obj = _this->d.obj;
curlen = Jsi_ObjGetLength(interp, obj);
if (curlen < 0)
Jsi_ObjSetLength(interp, obj, 0);
Jsi_ObjListifyArray(interp, obj);
Jsi_Value *vobjs[4];
int n, rev = (op==2);
Expand Down Expand Up @@ -717,7 +697,7 @@ static Jsi_RC jsi_ArrayIndexSubCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Valu
goto bail;
}

n = Jsi_ObjGetLength(interp, obj);
n = jsi_SizeOfArray(interp, obj);
if (n == 0) {
goto bail;
}
Expand Down Expand Up @@ -769,7 +749,7 @@ static Jsi_RC jsi_ArrayIncludesCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Valu
static Jsi_RC jsi_ArraySizeOfCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,Jsi_Value **ret, Jsi_Func *funcPtr) {
if (_this->vt != JSI_VT_OBJECT || !Jsi_ObjIsArray(interp, _this->d.obj))
return Jsi_LogError("expected array object");
int i = Jsi_ObjGetLength(interp, _this->d.obj);
int i = jsi_SizeOfArray(interp, _this->d.obj);
Jsi_ValueMakeNumber(interp, ret, i);
return JSI_OK;
}
Expand All @@ -780,8 +760,7 @@ static Jsi_RC jsi_ArrayShiftCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *
Jsi_Value *v;
Jsi_Obj *obj = _this->d.obj;
Jsi_ObjListifyArray(interp, obj);
uint n = Jsi_ObjGetLength(interp, obj);
assert(n <= obj->arrCnt);
uint n = jsi_SizeOfArray(interp, obj);
if (n<=0) {
Jsi_ValueMakeUndef(interp, ret);
} else {
Expand All @@ -802,10 +781,7 @@ static Jsi_RC jsi_ArrayUnshiftCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value

Jsi_Obj *obj = _this->d.obj;
int argc = Jsi_ValueGetLength(interp, args);
int curlen = Jsi_ObjGetLength(interp, obj);
if (curlen < 0) {
Jsi_ObjSetLength(interp, obj, 0);
}
int curlen = jsi_SizeOfArray(interp, obj);
if (argc <= 0) {
Jsi_ValueMakeNumber(interp, ret, 0);
return JSI_OK;
Expand All @@ -825,7 +801,7 @@ static Jsi_RC jsi_ArrayUnshiftCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value
}
Jsi_ObjSetLength(interp, obj, curlen+argc);

Jsi_ValueMakeNumber(interp, ret, Jsi_ObjGetLength(interp, obj));
Jsi_ValueMakeNumber(interp, ret, jsi_SizeOfArray(interp, obj));
return JSI_OK;
}

Expand All @@ -839,7 +815,7 @@ static Jsi_RC jsi_ArrayFillCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_
*start = Jsi_ValueArrayIndex(interp, args, 1),
*end = Jsi_ValueArrayIndex(interp, args, 2);
Jsi_Obj *obj = _this->d.obj;
n = Jsi_ObjGetLength(interp, obj);
n = jsi_SizeOfArray(interp, obj);

if (start && Jsi_GetNumberFromValue(interp, start, &nstart) == JSI_OK) {
istart = (int)nstart;
Expand Down Expand Up @@ -902,7 +878,7 @@ static Jsi_RC jsi_ArraySliceCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *
goto bail;
}
obj = _this->d.obj;
n = Jsi_ObjGetLength(interp, obj);
n = jsi_SizeOfArray(interp, obj);
if (Jsi_GetNumberFromValue(interp,start, &nstart) == JSI_OK) {
istart = (int)nstart;
if (istart > n)
Expand Down Expand Up @@ -1166,7 +1142,7 @@ static Jsi_RC jsi_ArraySpliceCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value
argc = Jsi_ValueGetLength(interp, args);
istart = 0;
ilen = (argc>=2 ? argc - 2 : 0);
n = Jsi_ObjGetLength(interp, obj);
n = jsi_SizeOfArray(interp, obj);
curlen = n;

if (!start) {
Expand Down Expand Up @@ -1202,7 +1178,7 @@ static Jsi_RC jsi_ArraySpliceCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value
}

if (curlen < 0) {
Jsi_ObjSetLength(interp, obj, 0);
Jsi_ObjSetLength(interp, obj, curlen=0);
}
Jsi_ObjListifyArray(interp, obj);

Expand Down
11 changes: 10 additions & 1 deletion src/jsiCmds.c
Expand Up @@ -4509,6 +4509,14 @@ static Jsi_RC SysRunModuleCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_t
return rc;
}

static Jsi_RC SysRunMainCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,
Jsi_Value **ret, Jsi_Func *funcPtr)
{
if (jsi_isMain(interp))
return SysRunModuleCmd(interp, args, _this, ret, funcPtr);
return JSI_OK;
}

static const char *jsi_FindHelpStr(const char *fstr, const char *key, Jsi_DString *dPtr) {
if (!fstr) return "";
Jsi_DSSetLength(dPtr, 0);
Expand Down Expand Up @@ -4762,7 +4770,7 @@ static Jsi_CmdSpec infoCmds[] = {
{ "execZip", InfoExecZipCmd, 0, 0, "", .help="If executing a .zip file, return file name", .retType=(uint)JSI_TT_STRING|JSI_TT_VOID },
{ "files", InfoFilesCmd, 0, 0, "", .help="Return list of all sourced files", .retType=(uint)JSI_TT_ARRAY },
{ "funcs", InfoFuncsCmd, 0, 1, "string|regexp|object=void", .help="Return details or list of matching functions", .retType=(uint)JSI_TT_ARRAY|JSI_TT_OBJECT },
{ "locals", InfoLocalsCmd, 0, 1, "varsOnly:boolean=void", .help="Return functions/vars inside local function", .retType=(uint)JSI_TT_OBJECT },
{ "locals", InfoLocalsCmd, 0, 1, "filter:boolean=void", .help="Return locals; use filter=true/false just vars/functions", .retType=(uint)JSI_TT_OBJECT },
{ "interp", jsi_InterpInfo, 0, 1, "interp:userobj=void", .help="Return info on given or current interp", .retType=(uint)JSI_TT_OBJECT },
{ "isMain", InfoIsMainCmd, 0, 0, "", .help="Return true if current script was the main script invoked from command-line", .retType=(uint)JSI_TT_BOOLEAN },
{ "keywords", InfoKeywordsCmd, 0, 2, "isSql=false, name:string=void", .help="Return/lookup reserved keyword", .retType=(uint)JSI_TT_ARRAY|JSI_TT_BOOLEAN },
Expand Down Expand Up @@ -4863,6 +4871,7 @@ static Jsi_CmdSpec sysCmds[] = {
{ "puts", SysPutsCmd, 1, -1, "val, ...", .help="Output one or more values to stdout", .retType=(uint)JSI_TT_VOID, .flags=0, .info=FN_puts },
{ "quote", SysQuoteCmd, 1, 1, "val:string", .help="Return quoted string", .retType=(uint)JSI_TT_STRING },
{ "require", SysRequireCmd, 0, 3, "name:string=void, version:number|string=1, options:object=void", .help="Load/query packages", .retType=(uint)JSI_TT_NUMBER|JSI_TT_OBJECT|JSI_TT_ARRAY, .flags=0, .info=FN_require, .opts=jsiModuleOptions },
{ "runMain", SysRunMainCmd, 0, 2, "cmd:string|null|function=void, conf:array=undefined", .help="If isMain invokes runModule", .retType=(uint)JSI_TT_ANY, .flags=0},
{ "runModule", SysRunModuleCmd, 0, 2, "cmd:string|null|function=void, conf:array=undefined", .help="Invoke named module. If name is empty, uses file basename. If isMain and no args givine parses console.args", .retType=(uint)JSI_TT_ANY, .flags=0},
{ "sleep", SysSleepCmd, 0, 1, "secs:number=1.0", .help="sleep for N milliseconds, minimum .001", .retType=(uint)JSI_TT_VOID },
#ifndef JSI_OMIT_EVENT
Expand Down
19 changes: 19 additions & 0 deletions tests/locals.jsi
@@ -0,0 +1,19 @@
function foo() {


function bar() { }
var x = 1;
; Info.locals();
; Info.locals(false);
; Info.locals(true);
}

foo();

/*
=!EXPECTSTART!=
Info.locals() ==> { bar:"function bar() {...}", x:1 }
Info.locals(false) ==> { bar:"function bar() {...}" }
Info.locals(true) ==> { x:1 }
=!EXPECTEND!=
*/
6 changes: 4 additions & 2 deletions tools/protos.jsi
@@ -1,4 +1,4 @@
//JSI Command Prototypes: version 3.0.4
//JSI Command Prototypes: version 3.0.6
throw("NOT EXECUTABLE: USE FILE IN GEANY EDITOR FOR CMD LINE COMPLETION + GOTO TAG");

var Array = function(cmd,args) {};
Expand Down Expand Up @@ -140,7 +140,7 @@ Info.prototype.interp = function(interp:userobj=void):object {};
Info.prototype.isMain = function():boolean {};
Info.prototype.keywords = function(isSql=false, name:string=void):boolean|array {};
Info.prototype.level = function(level:number=void):number|array|object {};
Info.prototype.locals = function(varsOnly:boolean=void):object {};
Info.prototype.locals = function(filter:boolean=void):object {};
Info.prototype.lookup = function(name:string):any {};
Info.prototype.methods = function(val:string|regexp):array|object {};
Info.prototype.named = function(name:string=void):array|userobj {};
Expand Down Expand Up @@ -303,6 +303,7 @@ System.prototype.provide = function(name:string|function=void, version:number|st
System.prototype.puts = function(val, ...):void {};
System.prototype.quote = function(val:string):string {};
System.prototype.require = function(name:string=void, version:number|string=1, options:object=void):number|array|object {};
System.prototype.runMain = function(cmd:string|null|function=void, conf:array=undefined):any {};
System.prototype.runModule = function(cmd:string|null|function=void, conf:array=undefined):any {};
System.prototype.setInterval = function(callback:function, ms:number):number {};
System.prototype.setTimeout = function(callback:function, ms:number):number {};
Expand Down Expand Up @@ -394,6 +395,7 @@ var provide = function(name:string|function=void, version:number|string=1.0, opt
var puts = function(val, ...):void {};
var quote = function(val:string):string {};
var require = function(name:string=void, version:number|string=1, options:object=void):number|array|object {};
var runMain = function(cmd:string|null|function=void, conf:array=undefined):any {};
var runModule = function(cmd:string|null|function=void, conf:array=undefined):any {};
var setInterval = function(callback:function, ms:number):number {};
var setTimeout = function(callback:function, ms:number):number {};
Expand Down
3 changes: 2 additions & 1 deletion www/reference.wiki
Expand Up @@ -552,7 +552,7 @@ Otherwise second argument must be a set of options.</td></tr>
<tr><td>level</td><td>level(level:number=void):number|array|object </td><td>Return current level or details of a call-stack frame. With no arg, returns the number of the current stack frame level.
Otherwise returns details on the specified level.
The topmost level is 1, and 0 is the current level, and a negative level translates as relative to the current level.</td></tr>
<tr><td>locals</td><td>locals(varsOnly:boolean=void):object </td><td>Return functions/vars inside local function.</td></tr>
<tr><td>locals</td><td>locals(filter:boolean=void):object </td><td>Return locals; use filter=true/false just vars/functions.</td></tr>
<tr><td>lookup</td><td>lookup(name:string) </td><td>Given string name, lookup and return value, eg: function.</td></tr>
<tr><td>methods</td><td>methods(val:string|regexp):array|object </td><td>Return functions and commands.</td></tr>
<tr><td>named</td><td>named(name:string=void):array|userobj </td><td>Returns command names for builtin Objects, eg: 'File', 'Interp', sub-Object names, or the named object.</td></tr>
Expand Down Expand Up @@ -1361,6 +1361,7 @@ With one argument, loads the package (if necessary) and returns its version.
With two arguments, returns object containing: version, loadFile, func.
A third argument sets options for package or module.
Note an error is thrown if requested version is greater than actual version.</td></tr>
<tr><td>runMain</td><td>runMain(cmd:string|null|function=void, conf:array=undefined) </td><td>If isMain invokes runModule.</td></tr>
<tr><td>runModule</td><td>runModule(cmd:string|null|function=void, conf:array=undefined) </td><td>Invoke named module. If name is empty, uses file basename. If isMain and no args givine parses console.args.</td></tr>
<tr><td>setInterval</td><td>setInterval(callback:function, ms:number):number </td><td>Setup recurring function to run every given millisecs.</td></tr>
<tr><td>setTimeout</td><td>setTimeout(callback:function, ms:number):number </td><td>Setup function to run after given millisecs.</td></tr>
Expand Down

0 comments on commit 5408a6d

Please sign in to comment.