@@ -1621,58 +1621,70 @@ static void jit_make_env( jit_ctx *ctx, int esize ) {
1621
1621
1622
1622
static void jit_object_op_gen ( jit_ctx * ctx , enum Operation op , int right ) {
1623
1623
int * next ;
1624
+ field f ;
1625
+ int is_opset ;
1626
+
1624
1627
INIT_BUFFER ;
1625
1628
1626
- // prepare args
1627
- XPush_r (right ?REG_TMP :REG_ACC );
1628
- if ( op == OP_SET ) {
1629
- XMov_rp (TMP2 ,Esp ,FIELD (3 ));
1630
- XPush_r (TMP2 );
1631
- }
1632
- XMov_rr (TMP2 ,Esp );
1633
- XPush_c (0 );
1634
- XPush_c ((op == OP_SET )?2 :1 );
1635
- XPush_r (TMP2 );
1629
+ f = 0 ;
1630
+ is_opset = 0 ;
1636
1631
switch ( op ) {
1637
1632
case OP_ADD :
1638
- XPush_c (right ? id_radd : id_add );
1633
+ f = (right ? id_radd : id_add );
1639
1634
break ;
1640
1635
case OP_SUB :
1641
- XPush_c (right ? id_rsub : id_sub );
1636
+ f = (right ? id_rsub : id_sub );
1642
1637
break ;
1643
1638
case OP_MUL :
1644
- XPush_c (right ? id_rmult : id_mult );
1639
+ f = (right ? id_rmult : id_mult );
1645
1640
break ;
1646
1641
case OP_DIV :
1647
- XPush_c (right ? id_rdiv : id_div );
1642
+ f = (right ? id_rdiv : id_div );
1648
1643
break ;
1649
1644
case OP_MOD :
1650
- XPush_c (right ? id_rmod : id_mod );
1645
+ f = (right ? id_rmod : id_mod );
1651
1646
break ;
1652
1647
case OP_GET :
1653
- XPush_c ( id_get ) ;
1648
+ f = id_get ;
1654
1649
break ;
1655
1650
case OP_SET :
1656
- XPush_c (id_set );
1651
+ f = id_set ;
1652
+ is_opset = 1 ;
1657
1653
break ;
1658
1654
default :
1659
1655
ERROR ;
1660
1656
}
1657
+
1658
+ // prepare args
1659
+ XPush_r (right ?REG_TMP :REG_ACC );
1660
+ if ( is_opset ) {
1661
+ XMov_rp (TMP2 ,Esp ,FIELD (3 ));
1662
+ XPush_r (TMP2 );
1663
+ }
1664
+ XMov_rr (TMP2 ,Esp );
1665
+ XPush_c (0 );
1666
+ XPush_c (is_opset ?2 :1 );
1667
+ XPush_r (TMP2 );
1668
+ XPush_r (right ?REG_ACC :REG_TMP );
1669
+
1670
+ XPush_c (f );
1661
1671
XPush_r (right ?REG_ACC :REG_TMP );
1662
1672
XCall_m (val_field );
1673
+ stack_pop (Esp ,2 );
1663
1674
XCmp_rc (ACC ,CONST (val_null ));
1664
1675
XJump (JNeq ,next );
1665
- stack_pop (Esp ,( op == OP_SET )? 7 : 6 );
1676
+ stack_pop (Esp ,is_opset ? 6 : 5 );
1666
1677
runtime_error (11 ,true); // Unsupported operation
1678
+
1667
1679
PATCH_JUMP (next );
1668
1680
XPop_r (TMP );
1669
- stack_pop ( Esp , 1 );
1681
+
1670
1682
XPush_r (ACC );
1671
1683
XPush_r (TMP );
1672
1684
begin_call ();
1673
1685
XCall_m (val_callEx );
1674
1686
end_call ();
1675
- stack_pop (Esp ,( op == OP_SET ) ?7 :6 );
1687
+ stack_pop (Esp ,is_opset ?7 :6 );
1676
1688
XRet ();
1677
1689
END_BUFFER ;
1678
1690
}
0 commit comments