浏览代码

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;