34 lines
901 B
C++
34 lines
901 B
C++
|
|
#include "interpreter/CallStack.hpp"
|
|
|
|
#include "interpreter/ByteCode.hpp"
|
|
#include "primitives/MethodObject.hpp"
|
|
|
|
using namespace obj;
|
|
|
|
void CallStack::enter(const CallStack::CallFrame& frame) {
|
|
if (mStack.size()) {
|
|
auto& last_frame = mStack.last();
|
|
last_frame.mIp = last_frame.mMethod->mScript->mBytecode.mInstructionIdx;
|
|
}
|
|
|
|
frame.mMethod->mScript->mBytecode.mArgumentsLoaded = 0;
|
|
frame.mMethod->mScript->mBytecode.mInstructionIdx = 0;
|
|
obj::NDO->refinc(frame.mMethod);
|
|
mStack.append(frame);
|
|
}
|
|
|
|
void CallStack::leave() {
|
|
auto frame = mStack.last();
|
|
obj::NDO->destroy(frame.mMethod);
|
|
mStack.pop();
|
|
|
|
if (mStack.size()) {
|
|
auto& last_frame = mStack.last();
|
|
last_frame.mMethod->mScript->mBytecode.mInstructionIdx = last_frame.mIp;
|
|
}
|
|
}
|
|
|
|
ByteCode* CallStack::getBytecode() { return &mStack.last().mMethod->mScript->mBytecode; }
|
|
|
|
tp::halni CallStack::len() const { return mStack.size(); }
|