using namespace camp;
using namespace settings;
using vm::bpinfo;
using vm::bplist;
using vm::getPos;
using vm::Default;
using vm::nullfunc;
using vm::item;
using absyntax::runnable;
typedef callable callableBp;
namespace run {
extern string emptystring;
}
function *voidFunction()
{
return new function(primVoid());
}
function *breakpointFunction()
{
return new function(primString(),primString(),primInt(),primInt(),
primCode());
}
void clear(string file, Int line, bool warn=false)
{
bpinfo bp(file,line);
for(mem::list<bpinfo>::iterator p=bplist.begin(); p != bplist.end(); ++p) {
if(*p == bp) {
cout << "cleared breakpoint at " << file << ": " << line << endl;
bplist.remove(bp);
return;
}
}
if(warn)
cout << "No such breakpoint at " << file << ": " << line << endl;
}
namespace run {
void breakpoint(stack *Stack, runnable *r)
{
callable *atBreakpointFunction=processData().atBreakpointFunction;
if(atBreakpointFunction &&
!nullfunc::instance()->compare(atBreakpointFunction)) {
position curPos=getPos();
Stack->push<string>(curPos.filename());
Stack->push<Int>((Int) curPos.Line());
Stack->push<Int>((Int) curPos.Column());
Stack->push(r ? r : vm::Default);
atBreakpointFunction->call(Stack); // returns a string
} else Stack->push<string>("");
}
}