소스 검색

LibJS/Bytecode: Make setting failures throw only in strict mode

Luke Wilde 3 년 전
부모
커밋
12e3abc9e7
1개의 변경된 파일5개의 추가작업 그리고 2개의 파일을 삭제
  1. 5 2
      Userland/Libraries/LibJS/Bytecode/Op.cpp

+ 5 - 2
Userland/Libraries/LibJS/Bytecode/Op.cpp

@@ -65,9 +65,12 @@ static ThrowCompletionOr<void> put_by_property_key(Object* object, Value value,
         object->define_direct_accessor(name, nullptr, &function, Attribute::Configurable | Attribute::Enumerable);
         break;
     }
-    case PropertyKind::KeyValue:
-        TRY(object->set(name, interpreter.accumulator(), Object::ShouldThrowExceptions::Yes));
+    case PropertyKind::KeyValue: {
+        bool succeeded = TRY(object->internal_set(name, interpreter.accumulator(), object));
+        if (!succeeded && interpreter.vm().in_strict_mode())
+            return interpreter.vm().throw_completion<TypeError>(interpreter.global_object(), ErrorType::ReferenceNullishSetProperty, name, interpreter.accumulator().to_string_without_side_effects());
         break;
+    }
     case PropertyKind::Spread:
         TRY(object->copy_data_properties(value, {}, interpreter.global_object()));
         break;