@@ -820,11 +820,19 @@ pm_interpolated_node_compile(pm_node_list_t *parts, rb_iseq_t *iseq, NODE dummy_
820
820
current_string = rb_enc_str_new (NULL , 0 , scope_node -> encoding );
821
821
}
822
822
823
- if (ISEQ_COMPILE_DATA (iseq )-> option -> frozen_string_literal ) {
824
- ADD_INSN1 (ret , & dummy_line_node , putobject , rb_str_freeze (current_string ));
825
- }
826
- else {
823
+ switch (ISEQ_COMPILE_DATA (iseq )-> option -> frozen_string_literal ) {
824
+ case -1 : // unspecified
825
+ ADD_INSN1 (ret , & dummy_line_node , putchilledstring , rb_str_freeze (current_string ));
826
+ break ;
827
+ case 0 : // disabled
827
828
ADD_INSN1 (ret , & dummy_line_node , putstring , rb_str_freeze (current_string ));
829
+ break ;
830
+ case 1 : // enabled
831
+ ADD_INSN1 (ret , & dummy_line_node , putobject , rb_str_freeze (current_string ));
832
+ break ;
833
+ default :
834
+ rb_bug ("invalid frozen_string_literal" );
835
+ break ;
828
836
}
829
837
830
838
current_string = Qnil ;
@@ -842,11 +850,19 @@ pm_interpolated_node_compile(pm_node_list_t *parts, rb_iseq_t *iseq, NODE dummy_
842
850
if (RTEST (current_string )) {
843
851
current_string = rb_fstring (current_string );
844
852
845
- if (ISEQ_COMPILE_DATA (iseq )-> option -> frozen_string_literal ) {
846
- ADD_INSN1 (ret , & dummy_line_node , putobject , current_string );
847
- }
848
- else {
853
+ switch (ISEQ_COMPILE_DATA (iseq )-> option -> frozen_string_literal ) {
854
+ case -1 : // unspecified
855
+ ADD_INSN1 (ret , & dummy_line_node , putchilledstring , current_string );
856
+ break ;
857
+ case 0 : // disabled
849
858
ADD_INSN1 (ret , & dummy_line_node , putstring , current_string );
859
+ break ;
860
+ case 1 : // enabled
861
+ ADD_INSN1 (ret , & dummy_line_node , putobject , current_string );
862
+ break ;
863
+ default :
864
+ rb_bug ("invalid frozen_string_literal" );
865
+ break ;
850
866
}
851
867
852
868
current_string = Qnil ;
@@ -4019,7 +4035,7 @@ pm_opt_aref_with_p(const rb_iseq_t *iseq, const pm_call_node_t *node)
4019
4035
((const pm_arguments_node_t * ) node -> arguments )-> arguments .size == 1 &&
4020
4036
PM_NODE_TYPE_P (((const pm_arguments_node_t * ) node -> arguments )-> arguments .nodes [0 ], PM_STRING_NODE ) &&
4021
4037
node -> block == NULL &&
4022
- !ISEQ_COMPILE_DATA (iseq )-> option -> frozen_string_literal &&
4038
+ !frozen_string_literal_p (iseq ) &&
4023
4039
ISEQ_COMPILE_DATA (iseq )-> option -> specialized_instruction
4024
4040
);
4025
4041
}
@@ -4038,7 +4054,7 @@ pm_opt_aset_with_p(const rb_iseq_t *iseq, const pm_call_node_t *node)
4038
4054
((const pm_arguments_node_t * ) node -> arguments )-> arguments .size == 2 &&
4039
4055
PM_NODE_TYPE_P (((const pm_arguments_node_t * ) node -> arguments )-> arguments .nodes [0 ], PM_STRING_NODE ) &&
4040
4056
node -> block == NULL &&
4041
- !ISEQ_COMPILE_DATA (iseq )-> option -> frozen_string_literal &&
4057
+ !frozen_string_literal_p (iseq ) &&
4042
4058
ISEQ_COMPILE_DATA (iseq )-> option -> specialized_instruction
4043
4059
);
4044
4060
}
@@ -7958,9 +7974,13 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
7958
7974
if (PM_NODE_FLAG_P (node , PM_STRING_FLAGS_FROZEN ) || ISEQ_COMPILE_DATA (iseq )-> option -> frozen_string_literal ) {
7959
7975
PUSH_INSN1 (ret , location , putobject , value );
7960
7976
}
7961
- else {
7977
+ else if ( PM_NODE_FLAG_P ( node , PM_STRING_FLAGS_MUTABLE )) {
7962
7978
PUSH_INSN1 (ret , location , putstring , value );
7963
7979
}
7980
+ else {
7981
+ // TODO: need a flag for explicit false
7982
+ PUSH_INSN1 (ret , location , putchilledstring , value );
7983
+ }
7964
7984
}
7965
7985
return ;
7966
7986
}
0 commit comments