luna::Function * RandomFunction() { auto f = g_gc.NewFunction(); auto s = RandomString(); f->SetModuleName(s); f->SetLine(RandomNum(1000)); int instruction_count = RandomRange(10, 1000); for (int i = 0; i < instruction_count; ++i) { unsigned int op_min = luna::OpType_LoadNil; unsigned int op_max = luna::OpType_GetGlobal; luna::OpType op = static_cast<luna::OpType>(RandomRange(op_min, op_max)); luna::Instruction instruction(op, RandomNum(128), RandomNum(128), RandomNum(128)); f->AddInstruction(instruction, i); } int const_num = RandomNum(5); for (int i = 0; i < const_num; ++i) f->AddConstNumber(RandomNum(100000)); int const_str = RandomNum(5); for (int i = 0; i < const_str; ++i) f->AddConstString(RandomString()); CHECK_BARRIER(g_gc, f); return f; }
int main(int argc, char *argv[]) { InitializeTraceMon(0); AddInstruction(0, 1, 1, 1, 0xD18C0009, 0x000E0001, 10); //AddInstruction(0, 2, 2, 200); AddInstruction(0, 1, 3, 0, 0x118C0009, 0x300E0001, 20); //PrintAndDeleteAll(0, 2); //AddInstruction(0, 1, 4, 400); PrintAndDelete(0, 1, 3); PrintAndDelete(0, 1, 1); //AddInstruction(0, 1, 5, 500); //PrintAndDelete(0, 1, 4); //PrintAndDeleteAll(0, 1); return 0; }
void SQFuncState::AddLineInfos(SQInteger line,bool lineop,bool force) { if(_lastline!=line || force){ SQLineInfo li; li._line=line;li._op=(GetCurrentPos()+1); if(lineop)AddInstruction(_OP_LINE,0,line); _lineinfos.push_back(li); _lastline=line; } }
CodeGen::GenState* CodeGen::GenerateDefaultState() { auto state = GenState::CreateNewState(); auto _print_fun_ = Context::GetGC()->New<Function>(Context::_print_); auto _fun_id = state->AddConstant(_print_fun_->toValue()); auto var_id = state->AddVariable(u"print"); state->AddInstruction(VM_CODE::LOAD_C, _fun_id); state->AddInstruction(VM_CODE::STORE_V, var_id); return state; }