Separate objects context and interface
This commit is contained in:
parent
cf3f8dbc9c
commit
24f9d8acae
32 changed files with 362 additions and 384 deletions
|
|
@ -15,13 +15,13 @@ void CallStack::enter(const CallStack::CallFrame& frame) {
|
|||
|
||||
frame.mMethod->mScript->mBytecode.mArgumentsLoaded = 0;
|
||||
frame.mMethod->mScript->mBytecode.mInstructionIdx = 0;
|
||||
obj::NDO->increaseReferenceCount(frame.mMethod);
|
||||
objects_api::increaseReferenceCount(frame.mMethod);
|
||||
mStack.append(frame);
|
||||
}
|
||||
|
||||
void CallStack::leave() {
|
||||
auto frame = mStack.last();
|
||||
obj::NDO->destroy(frame.mMethod);
|
||||
objects_api::destroy(frame.mMethod);
|
||||
mStack.pop();
|
||||
|
||||
if (mStack.size()) {
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
case OpCode::JUMP_IF:
|
||||
{
|
||||
auto cond = mOperandsStack.getOperand();
|
||||
if (NDO->toBool(cond)) {
|
||||
if (objects_api::toBool(cond)) {
|
||||
bytecode->mInstructionIdx += param(bytecode);
|
||||
} else {
|
||||
skip_param(bytecode);
|
||||
|
|
@ -178,7 +178,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
case OpCode::JUMP_IF_NOT:
|
||||
{
|
||||
auto cond = mOperandsStack.getOperand();
|
||||
if (!NDO->toBool(cond)) {
|
||||
if (!objects_api::toBool(cond)) {
|
||||
bytecode->mInstructionIdx += param(bytecode);
|
||||
} else {
|
||||
skip_param(bytecode);
|
||||
|
|
@ -195,7 +195,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
case OpCode::JUMP_IF_R:
|
||||
{
|
||||
auto cond = mOperandsStack.getOperand();
|
||||
if (NDO->toBool(cond)) {
|
||||
if (objects_api::toBool(cond)) {
|
||||
bytecode->mInstructionIdx -= param(bytecode);
|
||||
} else {
|
||||
skip_param(bytecode);
|
||||
|
|
@ -206,7 +206,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
case OpCode::JUMP_IF_NOT_R:
|
||||
{
|
||||
auto cond = mOperandsStack.getOperand();
|
||||
if (!NDO->toBool(cond)) {
|
||||
if (!objects_api::toBool(cond)) {
|
||||
bytecode->mInstructionIdx -= param(bytecode);
|
||||
} else {
|
||||
skip_param(bytecode);
|
||||
|
|
@ -224,7 +224,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
{
|
||||
auto obj = mOperandsStack.getOperand();
|
||||
if (obj->type->conversions && obj->type->conversions->to_string) {
|
||||
auto str = NDO->toString(obj);
|
||||
auto str = objects_api::toString(obj);
|
||||
printf("%s\n", str.c_str());
|
||||
} else {
|
||||
printf("Object with type '%s' has no string representation.\n", obj->type->name);
|
||||
|
|
@ -245,7 +245,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
auto id = mOperandsStack.getOperand<StringObject>();
|
||||
auto obj = mOperandsStack.getOperand();
|
||||
mScopeStack.addLocal(obj, id->val);
|
||||
NDO->increaseReferenceCount(obj);
|
||||
objects_api::increaseReferenceCount(obj);
|
||||
// mScopeStack.popTemp();
|
||||
break;
|
||||
}
|
||||
|
|
@ -255,7 +255,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
auto type = mOperandsStack.getOperand<StringObject>();
|
||||
|
||||
// basic types
|
||||
auto idx = NDO->types.presents(type->val);
|
||||
auto idx = objects_api::isType(type->val.c_str());
|
||||
if (idx) {
|
||||
Object* new_obj = objects_api::createByName(type->val.c_str());
|
||||
|
||||
|
|
@ -285,7 +285,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
|
||||
case OpCode::CLASS_CONSTRUCT:
|
||||
{
|
||||
auto class_obj = NDO->create<ClassObject>();
|
||||
auto class_obj = objects_api::create<ClassObject>();
|
||||
|
||||
for (auto local : mScopeStack.getCurrentScope()->mLocals) {
|
||||
class_obj->addMember(local->val, local->key);
|
||||
|
|
@ -333,7 +333,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
auto argument = mOperandsStack.getOperand();
|
||||
|
||||
while (argument) {
|
||||
NDO->increaseReferenceCount(argument);
|
||||
objects_api::increaseReferenceCount(argument);
|
||||
|
||||
auto argument_id = bytecode->mConstants[loadConstDataIdx(bytecode)];
|
||||
auto id = objects_api::cast<StringObject>(argument_id);
|
||||
|
|
@ -391,7 +391,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
ASSERT(left->type == right->type && "addition of different types is not implemented");
|
||||
ASSERT(left->type->arithmetics && left->type->arithmetics->add && "cannot add object of this type");
|
||||
|
||||
auto res = NDO->instantiate(left);
|
||||
auto res = objects_api::instantiate(left);
|
||||
res->type->arithmetics->add(res, right);
|
||||
|
||||
mScopeStack.addTemp(res);
|
||||
|
|
@ -406,7 +406,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
ASSERT(left->type == right->type && "addition of different types is not implemented");
|
||||
ASSERT(left->type->arithmetics && left->type->arithmetics->add && "cannot add object of this type");
|
||||
|
||||
auto res = NDO->instantiate(left);
|
||||
auto res = objects_api::instantiate(left);
|
||||
res->type->arithmetics->sub(res, right);
|
||||
|
||||
mScopeStack.addTemp(res);
|
||||
|
|
@ -421,7 +421,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
ASSERT(left->type == right->type && "addition of different types is not implemented");
|
||||
ASSERT(left->type->arithmetics && left->type->arithmetics->add && "cannot add object of this type");
|
||||
|
||||
auto res = NDO->instantiate(left);
|
||||
auto res = objects_api::instantiate(left);
|
||||
res->type->arithmetics->mul(res, right);
|
||||
|
||||
mScopeStack.addTemp(res);
|
||||
|
|
@ -436,7 +436,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
ASSERT(left->type == right->type && "addition of different types is not implemented");
|
||||
ASSERT(left->type->arithmetics && left->type->arithmetics->add && "cannot add object of this type");
|
||||
|
||||
auto res = NDO->instantiate(left);
|
||||
auto res = objects_api::instantiate(left);
|
||||
res->type->arithmetics->div(res, right);
|
||||
|
||||
mScopeStack.addTemp(res);
|
||||
|
|
@ -448,7 +448,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
{
|
||||
auto left = mOperandsStack.getOperand();
|
||||
auto right = mOperandsStack.getOperand();
|
||||
NDO->copy(left, right);
|
||||
objects_api::copy(left, right);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -495,7 +495,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
case OpCode::OBJ_LOAD:
|
||||
{
|
||||
auto path = mOperandsStack.getOperand<StringObject>();
|
||||
auto obj = NDO->load(path->val);
|
||||
auto obj = objects_api::load(path->val);
|
||||
mScopeStack.addTemp(obj);
|
||||
mOperandsStack.push(obj);
|
||||
break;
|
||||
|
|
@ -504,14 +504,14 @@ void Interpreter::stepBytecodeIn() {
|
|||
{
|
||||
auto path = mOperandsStack.getOperand<StringObject>();
|
||||
auto target = mOperandsStack.getOperand();
|
||||
NDO->save(target, path->val);
|
||||
objects_api::save(target, path->val);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpCode::AND:
|
||||
{
|
||||
auto left = NDO->toBool(mOperandsStack.getOperand());
|
||||
auto right = NDO->toBool(mOperandsStack.getOperand());
|
||||
auto left = objects_api::toBool(mOperandsStack.getOperand());
|
||||
auto right = objects_api::toBool(mOperandsStack.getOperand());
|
||||
auto out = BoolObject::create(left && right);
|
||||
mScopeStack.addTemp(out);
|
||||
mOperandsStack.push(out);
|
||||
|
|
@ -519,8 +519,8 @@ void Interpreter::stepBytecodeIn() {
|
|||
}
|
||||
case OpCode::OR:
|
||||
{
|
||||
auto left = NDO->toBool(mOperandsStack.getOperand());
|
||||
auto right = NDO->toBool(mOperandsStack.getOperand());
|
||||
auto left = objects_api::toBool(mOperandsStack.getOperand());
|
||||
auto right = objects_api::toBool(mOperandsStack.getOperand());
|
||||
auto out = BoolObject::create(left || right);
|
||||
mScopeStack.addTemp(out);
|
||||
mOperandsStack.push(out);
|
||||
|
|
@ -528,7 +528,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
}
|
||||
case OpCode::NOT:
|
||||
{
|
||||
auto inv = NDO->toBool(mOperandsStack.getOperand());
|
||||
auto inv = objects_api::toBool(mOperandsStack.getOperand());
|
||||
auto out = BoolObject::create(!inv);
|
||||
mScopeStack.addTemp(out);
|
||||
mOperandsStack.push(out);
|
||||
|
|
@ -538,7 +538,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
{
|
||||
auto left = mOperandsStack.getOperand();
|
||||
auto right = mOperandsStack.getOperand();
|
||||
auto out = BoolObject::create(!NDO->compare(left, right));
|
||||
auto out = BoolObject::create(!objects_api::compare(left, right));
|
||||
mScopeStack.addTemp(out);
|
||||
mOperandsStack.push(out);
|
||||
break;
|
||||
|
|
@ -547,7 +547,7 @@ void Interpreter::stepBytecodeIn() {
|
|||
{
|
||||
auto left = mOperandsStack.getOperand();
|
||||
auto right = mOperandsStack.getOperand();
|
||||
auto out = BoolObject::create(NDO->compare(left, right));
|
||||
auto out = BoolObject::create(objects_api::compare(left, right));
|
||||
mScopeStack.addTemp(out);
|
||||
mOperandsStack.push(out);
|
||||
break;
|
||||
|
|
@ -555,8 +555,8 @@ void Interpreter::stepBytecodeIn() {
|
|||
|
||||
case OpCode::MORE:
|
||||
{
|
||||
auto left = NDO->toFloat(mOperandsStack.getOperand());
|
||||
auto right = NDO->toFloat(mOperandsStack.getOperand());
|
||||
auto left = objects_api::toFloat(mOperandsStack.getOperand());
|
||||
auto right = objects_api::toFloat(mOperandsStack.getOperand());
|
||||
auto out = BoolObject::create(left > right);
|
||||
mScopeStack.addTemp(out);
|
||||
mOperandsStack.push(out);
|
||||
|
|
@ -564,8 +564,8 @@ void Interpreter::stepBytecodeIn() {
|
|||
}
|
||||
case OpCode::LESS:
|
||||
{
|
||||
auto left = NDO->toFloat(mOperandsStack.getOperand());
|
||||
auto right = NDO->toFloat(mOperandsStack.getOperand());
|
||||
auto left = objects_api::toFloat(mOperandsStack.getOperand());
|
||||
auto right = objects_api::toFloat(mOperandsStack.getOperand());
|
||||
auto out = BoolObject::create(left < right);
|
||||
mScopeStack.addTemp(out);
|
||||
mOperandsStack.push(out);
|
||||
|
|
@ -573,8 +573,8 @@ void Interpreter::stepBytecodeIn() {
|
|||
}
|
||||
case OpCode::EQUAL_OR_MORE:
|
||||
{
|
||||
auto left = NDO->toFloat(mOperandsStack.getOperand());
|
||||
auto right = NDO->toFloat(mOperandsStack.getOperand());
|
||||
auto left = objects_api::toFloat(mOperandsStack.getOperand());
|
||||
auto right = objects_api::toFloat(mOperandsStack.getOperand());
|
||||
auto out = BoolObject::create(left >= right);
|
||||
mScopeStack.addTemp(out);
|
||||
mOperandsStack.push(out);
|
||||
|
|
@ -582,8 +582,8 @@ void Interpreter::stepBytecodeIn() {
|
|||
}
|
||||
case OpCode::EQUAL_OR_LESS:
|
||||
{
|
||||
auto left = NDO->toFloat(mOperandsStack.getOperand());
|
||||
auto right = NDO->toFloat(mOperandsStack.getOperand());
|
||||
auto left = objects_api::toFloat(mOperandsStack.getOperand());
|
||||
auto right = objects_api::toFloat(mOperandsStack.getOperand());
|
||||
auto out = BoolObject::create(left <= right);
|
||||
mScopeStack.addTemp(out);
|
||||
mOperandsStack.push(out);
|
||||
|
|
|
|||
|
|
@ -6,10 +6,10 @@ using namespace obj;
|
|||
|
||||
Scope::~Scope() {
|
||||
for (auto local : mLocals) {
|
||||
obj::NDO->destroy(local->val);
|
||||
objects_api::destroy(local->val);
|
||||
}
|
||||
for (auto tmp : mTemps) {
|
||||
obj::NDO->destroy(tmp.data());
|
||||
objects_api::destroy(tmp.data());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -47,18 +47,18 @@ void ScopeStack::leaveScope() {
|
|||
}
|
||||
|
||||
void ScopeStack::addTemp(obj::Object* tmp) {
|
||||
obj::NDO->increaseReferenceCount(tmp);
|
||||
objects_api::increaseReferenceCount(tmp);
|
||||
mBuff[mIdx - 1].mTemps.pushBack(tmp);
|
||||
}
|
||||
|
||||
void ScopeStack::popTemp() {
|
||||
obj::NDO->destroy(mBuff[mIdx - 1].mTemps.last()->data);
|
||||
objects_api::destroy(mBuff[mIdx - 1].mTemps.last()->data);
|
||||
mBuff[mIdx - 1].mTemps.popBack();
|
||||
}
|
||||
|
||||
void ScopeStack::addTempReturn(obj::Object* ret) {
|
||||
if (mIdx >= 2) {
|
||||
obj::NDO->increaseReferenceCount(ret);
|
||||
objects_api::increaseReferenceCount(ret);
|
||||
mBuff[mIdx - 2].mTemps.pushBack(ret);
|
||||
}
|
||||
}
|
||||
|
|
@ -68,9 +68,9 @@ void ScopeStack::addLocal(obj::Object* local, const std::string& id) {
|
|||
Scope::ObjDict& locals = mBuff[mIdx - 1].mLocals;
|
||||
auto idx = locals.presents(id);
|
||||
if (idx) {
|
||||
obj::NDO->destroy(locals.getSlotVal(idx));
|
||||
objects_api::destroy(locals.getSlotVal(idx));
|
||||
}
|
||||
obj::NDO->increaseReferenceCount(local);
|
||||
objects_api::increaseReferenceCount(local);
|
||||
locals.put(id, local);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue