feat: 支持成员自增自减与复合运算

This commit is contained in:
爱特每羊队
2026-06-06 20:48:44 +08:00
parent b812cfae01
commit c8996dc438
6 changed files with 814 additions and 19 deletions
+21 -2
View File
@@ -1,4 +1,6 @@
use oxide_parser::{Expression, ForStatementInit, SimpleAssignmentTarget, Statement};
use oxide_parser::{
AssignmentOperator, Expression, ForStatementInit, SimpleAssignmentTarget, Statement,
};
use crate::compiler::{is_side_effect_free, CompileCtx, Compiler, Label};
@@ -210,8 +212,12 @@ impl Compiler {
{
self.count_expression(&member.object, ctx);
self.count_expression(&assign.right, ctx);
if assign.operator != AssignmentOperator::Assign {
ctx.alloc_reg();
ctx.projected_pc += 1;
}
ctx.alloc_reg();
ctx.projected_pc += 1; // IC_SET_PROP
ctx.projected_pc += 1; // IC_SET_PROP or COMPOUND_MEMBER_*
} else if let oxide_parser::AssignmentTarget::ComputedMemberExpression(member) =
&assign.left
{
@@ -319,6 +325,19 @@ impl Compiler {
ctx.alloc_reg();
ctx.projected_pc += 1;
}
SimpleAssignmentTarget::StaticMemberExpression(member) => {
self.count_expression(&member.object, ctx);
ctx.alloc_reg();
ctx.projected_pc += 1;
ctx.alloc_reg();
ctx.projected_pc += 1;
}
SimpleAssignmentTarget::ComputedMemberExpression(member) => {
self.count_expression(&member.object, ctx);
self.count_expression(&member.expression, ctx);
ctx.alloc_reg();
ctx.projected_pc += 1;
}
_ => {
ctx.alloc_reg();
}