@@ -2955,6 +2955,20 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
2955
2955
case VM_OC_PROP_PRE_DECR :
2956
2956
case VM_OC_PROP_POST_INCR :
2957
2957
case VM_OC_PROP_POST_DECR :
2958
+ if (byte_code_start_p [-3 ] == CBC_EXT_OPCODE
2959
+ && byte_code_start_p [-2 ] == CBC_EXT_PUSH_PRIVATE_PROP_LITERAL_REFERENCE )
2960
+ {
2961
+ if (opcode < CBC_PRE_INCR )
2962
+ {
2963
+ break ;
2964
+ }
2965
+ result = right_value ;
2966
+ stack_top_p += 1 ;
2967
+ left_value = right_value ;
2968
+ /* Use right_value as the marker for private field */
2969
+ right_value = ECMA_VALUE_EMPTY ;
2970
+ }
2971
+ else
2958
2972
{
2959
2973
result = vm_op_get_value (left_value , right_value );
2960
2974
@@ -3018,7 +3032,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
3018
3032
}
3019
3033
3020
3034
result = (ecma_value_t ) (int_value + int_increase );
3021
- break ;
3035
+ goto unary_arithmetic_operation_break ;
3022
3036
}
3023
3037
result_number = (ecma_number_t ) ecma_get_integer_from_value (result );
3024
3038
}
@@ -3068,7 +3082,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
3068
3082
{
3069
3083
goto error ;
3070
3084
}
3071
- break ;
3085
+ goto unary_arithmetic_operation_break ;
3072
3086
}
3073
3087
#endif /* JERRY_BUILTIN_BIGINT */
3074
3088
@@ -3089,7 +3103,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
3089
3103
POST_INCREASE_DECREASE_PUT_RESULT (result );
3090
3104
3091
3105
result = ecma_make_number_value (result_number + increase );
3092
- break ;
3106
+ goto unary_arithmetic_operation_break ;
3093
3107
}
3094
3108
3095
3109
if (ecma_is_value_integer_number (result ))
@@ -3100,6 +3114,35 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
3100
3114
{
3101
3115
result = ecma_update_float_number (result , result_number + increase );
3102
3116
}
3117
+ unary_arithmetic_operation_break :
3118
+ if (JERRY_UNLIKELY (right_value == ECMA_VALUE_EMPTY ))
3119
+ {
3120
+ right_value = ECMA_VALUE_UNDEFINED ;
3121
+
3122
+ if (opcode_data & VM_OC_PUT_REFERENCE )
3123
+ {
3124
+ ecma_value_t property = * (-- stack_top_p );
3125
+ ecma_value_t base = * (-- stack_top_p );
3126
+ ecma_value_t set_value_result = opfunc_private_set (base , property , result );
3127
+ ecma_free_value (base );
3128
+ ecma_free_value (property );
3129
+
3130
+ if (ECMA_IS_VALUE_ERROR (set_value_result ))
3131
+ {
3132
+ ecma_free_value (result );
3133
+ result = set_value_result ;
3134
+ goto error ;
3135
+ }
3136
+
3137
+ if (!(opcode_data & (VM_OC_PUT_STACK | VM_OC_PUT_BLOCK )))
3138
+ {
3139
+ ecma_fast_free_value (result );
3140
+ goto free_both_values ;
3141
+ }
3142
+
3143
+ opcode_data &= (uint32_t ) ~VM_OC_PUT_REFERENCE ;
3144
+ }
3145
+ }
3103
3146
break ;
3104
3147
}
3105
3148
case VM_OC_ASSIGN :
0 commit comments