in src/mockRuntime.ts [540:635]
private executeLine(ln: number, reverse: boolean): boolean {
// first "execute" the instructions associated with this line and potentially hit instruction breakpoints
while (reverse ? this.instruction >= this.starts[ln] : this.instruction < this.ends[ln]) {
reverse ? this.instruction-- : this.instruction++;
if (this.instructionBreakpoints.has(this.instruction)) {
this.sendEvent('stopOnInstructionBreakpoint');
return true;
}
}
const line = this.getLine(ln);
// find variable accesses
let reg0 = /\$([a-z][a-z0-9]*)(=(false|true|[0-9]+(\.[0-9]+)?|\".*\"|\{.*\}))?/ig;
let matches0: RegExpExecArray | null;
while (matches0 = reg0.exec(line)) {
if (matches0.length === 5) {
let access: string | undefined;
const name = matches0[1];
const value = matches0[3];
let v = new RuntimeVariable(name, value);
if (value && value.length > 0) {
if (value === 'true') {
v.value = true;
} else if (value === 'false') {
v.value = false;
} else if (value[0] === '"') {
v.value = value.slice(1, -1);
} else if (value[0] === '{') {
v.value = [
new RuntimeVariable('fBool', true),
new RuntimeVariable('fInteger', 123),
new RuntimeVariable('fString', 'hello'),
];
} else {
v.value = parseFloat(value);
}
if (this.variables.has(name)) {
// the first write access to a variable is the "declaration" and not a "write access"
access = 'write';
}
this.variables.set(name, v);
} else {
if (this.variables.has(name)) {
// variable must exist in order to trigger a read access
access = 'read';
}
}
const accessType = this.breakAddresses.get(name);
if (access && accessType && accessType.indexOf(access) >= 0) {
this.sendEvent('stopOnDataBreakpoint', access);
return true;
}
}
}
// if 'log(...)' found in source -> send argument to debug console
const matches = /log\((.*)\)/.exec(line);
if (matches && matches.length === 2) {
this.sendEvent('output', matches[1], this._sourceFile, ln, matches.index);
}
// if pattern 'exception(...)' found in source -> throw named exception
const matches2 = /exception\((.*)\)/.exec(line);
if (matches2 && matches2.length === 2) {
const exception = matches2[1].trim();
if (this.namedException === exception) {
this.sendEvent('stopOnException', exception);
return true;
} else {
if (this.otherExceptions) {
this.sendEvent('stopOnException', undefined);
return true;
}
}
} else {
// if word 'exception' found in source -> throw exception
if (line.indexOf('exception') >= 0) {
if (this.otherExceptions) {
this.sendEvent('stopOnException', undefined);
return true;
}
}
}
// nothing interesting found -> continue
return false;
}