@@ -154,84 +154,101 @@ vm_op_get_value (ecma_value_t object, /**< base object */
154
154
* if the property setting is unsuccessful
155
155
*/
156
156
static ecma_value_t
157
- vm_op_set_value (ecma_value_t object , /**< base object */
157
+ vm_op_set_value (ecma_value_t base , /**< base object */
158
158
ecma_value_t property , /**< property name */
159
159
ecma_value_t value , /**< ecma value */
160
160
bool is_strict ) /**< strict mode */
161
161
{
162
- ecma_object_t * object_p ;
162
+ ecma_value_t result = ECMA_VALUE_EMPTY ;
163
+ ecma_object_t * object_p ;
164
+ ecma_string_t * property_p ;
163
165
164
- if (JERRY_UNLIKELY (!ecma_is_value_object (object )))
166
+ if (JERRY_UNLIKELY (!ecma_is_value_object (base )))
165
167
{
166
- ecma_value_t to_object = ecma_op_to_object (object );
167
- ecma_free_value (object );
168
-
169
- if (ECMA_IS_VALUE_ERROR (to_object ))
168
+ if (JERRY_UNLIKELY (ecma_is_value_null (base ) || ecma_is_value_undefined (base )))
170
169
{
171
170
#if ENABLED (JERRY_ERROR_MESSAGES )
172
- ecma_free_value (to_object );
173
- jcontext_release_exception ();
174
-
175
- ecma_value_t error_value = ecma_raise_standard_error_with_format (ECMA_ERROR_TYPE ,
176
- "Cannot set property '%' of %" ,
177
- property ,
178
- object );
179
- ecma_free_value (property );
180
-
181
- return error_value ;
171
+ result = ecma_raise_standard_error_with_format (ECMA_ERROR_TYPE ,
172
+ "Cannot set property '%' of %" ,
173
+ property ,
174
+ base );
182
175
#else /* !ENABLED (JERRY_ERROR_MESSAGES) */
183
- ecma_free_value (property );
184
- return to_object ;
176
+ result = ecma_raise_type_error (NULL );
185
177
#endif /* ENABLED (JERRY_ERROR_MESSAGES) */
178
+ ecma_free_value (property );
179
+ return result ;
186
180
}
187
181
188
- object_p = ecma_get_object_from_value (to_object );
182
+ if (JERRY_UNLIKELY (!ecma_is_value_prop_name (property )))
183
+ {
184
+ property_p = ecma_op_to_string (property );
185
+ ecma_fast_free_value (property );
186
+
187
+ if (JERRY_UNLIKELY (property_p == NULL ))
188
+ {
189
+ ecma_free_value (base );
190
+ return ECMA_VALUE_ERROR ;
191
+ }
192
+ }
193
+ else
194
+ {
195
+ property_p = ecma_get_prop_name_from_value (property );
196
+ }
197
+
198
+ ecma_value_t object = ecma_op_to_object (base );
199
+ JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (object ));
200
+
201
+ object_p = ecma_get_object_from_value (object );
189
202
ecma_op_ordinary_object_prevent_extensions (object_p );
203
+
204
+ result = ecma_op_object_put_with_receiver (object_p ,
205
+ property_p ,
206
+ value ,
207
+ base ,
208
+ is_strict );
209
+
210
+ ecma_free_value (base );
190
211
}
191
212
else
192
213
{
193
- object_p = ecma_get_object_from_value (object );
194
- }
214
+ object_p = ecma_get_object_from_value (base );
195
215
196
- ecma_string_t * property_p ;
197
-
198
- if (!ecma_is_value_prop_name (property ))
199
- {
200
- property_p = ecma_op_to_prop_name (property );
201
- ecma_fast_free_value (property );
216
+ if (JERRY_UNLIKELY (!ecma_is_value_prop_name (property )))
217
+ {
218
+ property_p = ecma_op_to_string (property );
219
+ ecma_fast_free_value (property );
202
220
203
- if (JERRY_UNLIKELY (property_p == NULL ))
221
+ if (JERRY_UNLIKELY (property_p == NULL ))
222
+ {
223
+ ecma_deref_object (object_p );
224
+ return ECMA_VALUE_ERROR ;
225
+ }
226
+ }
227
+ else
204
228
{
205
- ecma_deref_object (object_p );
206
- return ECMA_VALUE_ERROR ;
229
+ property_p = ecma_get_prop_name_from_value (property );
207
230
}
208
- }
209
- else
210
- {
211
- property_p = ecma_get_prop_name_from_value (property );
212
- }
213
231
214
- ecma_value_t completion_value = ECMA_VALUE_EMPTY ;
215
-
216
- if (! ecma_is_lexical_environment (object_p ))
217
- {
218
- completion_value = ecma_op_object_put ( object_p ,
219
- property_p ,
220
- value ,
221
- is_strict );
222
- }
223
- else
224
- {
225
- completion_value = ecma_op_set_mutable_binding ( object_p ,
226
- property_p ,
227
- value ,
228
- is_strict );
232
+ if (! ecma_is_lexical_environment ( object_p ))
233
+ {
234
+ result = ecma_op_object_put_with_receiver (object_p ,
235
+ property_p ,
236
+ value ,
237
+ base ,
238
+ is_strict );
239
+ }
240
+ else
241
+ {
242
+ result = ecma_op_set_mutable_binding ( object_p ,
243
+ property_p ,
244
+ value ,
245
+ is_strict );
246
+ }
229
247
}
230
248
231
249
ecma_deref_object (object_p );
232
250
ecma_deref_ecma_string (property_p );
233
-
234
- return completion_value ;
251
+ return result ;
235
252
} /* vm_op_set_value */
236
253
237
254
/** Compact bytecode define */
@@ -3882,9 +3899,9 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
3882
3899
else if (opcode_data & VM_OC_PUT_REFERENCE )
3883
3900
{
3884
3901
ecma_value_t property = * (-- stack_top_p );
3885
- ecma_value_t object = * (-- stack_top_p );
3902
+ ecma_value_t base = * (-- stack_top_p );
3886
3903
3887
- if (object == ECMA_VALUE_REGISTER_REF )
3904
+ if (base == ECMA_VALUE_REGISTER_REF )
3888
3905
{
3889
3906
property = (ecma_value_t ) ecma_get_integer_from_value (property );
3890
3907
ecma_fast_free_value (VM_GET_REGISTER (frame_ctx_p , property ));
@@ -3898,7 +3915,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
3898
3915
}
3899
3916
else
3900
3917
{
3901
- ecma_value_t set_value_result = vm_op_set_value (object ,
3918
+ ecma_value_t set_value_result = vm_op_set_value (base ,
3902
3919
property ,
3903
3920
result ,
3904
3921
is_strict );
0 commit comments