Skip to content

Commit c2a3d17

Browse files
committed
Fix the logic of parsing expressions, update parameter handling methods, optimize memory management in bytecode generators, and add version information.
1 parent d5da8d1 commit c2a3d17

File tree

1 file changed

+26
-12
lines changed

1 file changed

+26
-12
lines changed

prototype/compiler.cc

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2950,7 +2950,7 @@ ExprNode* Parser::ParsePrimaryExpr(Token* token, std::size_t length,
29502950
std::cout << "ARG ParsePrimaryExpr FUNC" << " \n"
29512951
<< token[index] << std::endl
29522952
<< std::endl;
2953-
args.push_back(ParseVarDecl(token, length, index));
2953+
args.push_back(ParseExpr(token, length, index));
29542954
if (token[index].type == Token::Type::OPERATOR &&
29552955
token[index].value._operator == Token::OperatorType::comma) {
29562956
index++;
@@ -3104,11 +3104,10 @@ ExprNode* Parser::ParsePrimaryExpr(Token* token, std::size_t length,
31043104
if (full_expr == nullptr || preoper_expr == nullptr) {
31053105
full_expr = main_expr = number_node;
31063106
} else {
3107-
if (preoper_expr != nullptr)
3108-
dynamic_cast<UnaryNode*>(preoper_expr)
3109-
->SetUnaryNode(
3110-
dynamic_cast<UnaryNode*>(preoper_expr)->GetOperator(),
3111-
number_node);
3107+
dynamic_cast<UnaryNode*>(preoper_expr)
3108+
->SetUnaryNode(
3109+
dynamic_cast<UnaryNode*>(preoper_expr)->GetOperator(),
3110+
number_node);
31123111
main_expr = number_node;
31133112
}
31143113
index++;
@@ -3130,6 +3129,7 @@ ExprNode* Parser::ParseExpr(Token* token, std::size_t length,
31303129
<< token[index] << std::endl
31313130
<< std::endl;
31323131
if (index >= length) return nullptr;
3132+
if (IsDecl(token, length, index)) return ParseVarDecl(token, length, index);
31333133
ExprNode* expr = ParsePrimaryExpr(token, length, index);
31343134
expr = ParseBinaryExpr(token, length, index, expr, 0);
31353135
std::cout << "END ParseExpr" << " \n"
@@ -3574,7 +3574,7 @@ class BytecodeGenerator {
35743574
if (memory_.size() % 2 != 0) {
35753575
memory_.push_back(0);
35763576
// all_size_++;
3577-
type_[type_.size()] = (type_[type_.size()] << 4) | type;
3577+
type_[type_.size()-1] = (type_[type_.size()-1] << 4) | type;
35783578
} else {
35793579
memory_.push_back(0);
35803580
// all_size_ += 2;
@@ -3596,7 +3596,8 @@ class BytecodeGenerator {
35963596

35973597
void* memory_data = malloc(size);
35983598

3599-
std::size_t read_index = 0;
3599+
std::memcpy(memory_data, data, size);
3600+
/*std::size_t read_index = 0;
36003601
while (read_index < size) {
36013602
switch (type) {
36023603
case 0x01:
@@ -3643,14 +3644,14 @@ class BytecodeGenerator {
36433644
default:
36443645
return index;
36453646
}
3646-
}
3647+
}*/
36473648

36483649
for (std::size_t i = 0; i < size; i++) {
36493650
if (memory_.size() % 2 != 0) {
36503651
memory_.push_back(*(uint64_t*)memory_data);
36513652
memory_data = (void*)((uintptr_t)memory_data + 1);
36523653
// all_size_++;
3653-
type_[type_.size()] = (type_[type_.size()] << 4) | type;
3654+
type_[type_.size()-1] = (type_[type_.size()-1] << 4) | type;
36543655
} else {
36553656
memory_.push_back(*(uint64_t*)memory_data);
36563657
memory_data = (void*)((uintptr_t)memory_data + 1);
@@ -3845,6 +3846,12 @@ void BytecodeGenerator::GenerateBytecode(CompoundNode* stmt) {
38453846
code_.push_back(0x42);
38463847
code_.push_back(0x43);
38473848

3849+
// Version
3850+
code_.push_back(0x00);
3851+
code_.push_back(0x00);
3852+
code_.push_back(0x00);
3853+
code_.push_back(0x00);
3854+
38483855
size_t memory_size = global_memory_.GetSize();
38493856
std::cout << "Memory Size: " << memory_size << std::endl;
38503857
// if (global_memory_.GetSize() % 2 != 0) memory_size++;
@@ -4864,8 +4871,15 @@ std::size_t BytecodeGenerator::HandleFuncInvoke(FuncNode* func,
48644871
std::cout << "vm_type OK" << std::endl;
48654872

48664873
std::vector<std::size_t> vm_args;
4874+
4875+
std::string func_name = std::string(*func->GetName());
4876+
std::size_t func_name_index =
4877+
global_memory_.Add(0x01, func_name.size() + 1, func_name.c_str());
4878+
std::size_t func_name_ptr_index = global_memory_.Add(0x06, 8);
4879+
code.push_back(Bytecode(_AQVM_OPERATOR_PTR, func_name_index,
4880+
func_name_ptr_index));
4881+
vm_args.push_back(func_name_ptr_index);
48674882
vm_args.push_back(args.size() + 1);
4868-
// TODO(ERROR)
48694883
std::cout << "vm_type: " << vm_type << ", Size: " << func_type->GetSize()
48704884
<< std::endl;
48714885
std::size_t return_value_index =
@@ -4878,7 +4892,7 @@ std::size_t BytecodeGenerator::HandleFuncInvoke(FuncNode* func,
48784892

48794893
code.push_back(Bytecode(_AQVM_OPERATOR_INVOKE, vm_args));
48804894

4881-
return vm_args[1];
4895+
return vm_args[2];
48824896
}
48834897

48844898
std::size_t BytecodeGenerator::GetIndex(ExprNode* expr,

0 commit comments

Comments
 (0)