Bläddra i källkod

LibJS: Fix casting a value to ScriptFunction without checking it's one

Sergey Bugaev 5 år sedan
förälder
incheckning
53a94b8bbd

+ 3 - 3
Libraries/LibJS/AST.cpp

@@ -52,9 +52,9 @@ static void update_function_name(Value& value, const FlyString& name)
         return;
     auto& object = value.as_object();
     if (object.is_function()) {
-        auto& function = static_cast<ScriptFunction&>(object);
-        if (function.name().is_empty())
-            function.set_name(name);
+        auto& function = static_cast<Function&>(object);
+        if (function.is_script_function() && function.name().is_empty())
+            static_cast<ScriptFunction&>(function).set_name(name);
     } else if (object.is_array()) {
         auto& array = static_cast<Array&>(object);
         for (auto& entry : array.indexed_properties().values_unordered())

+ 2 - 0
Libraries/LibJS/Runtime/Function.h

@@ -42,6 +42,8 @@ public:
 
     virtual void visit_children(Visitor&) override;
 
+    virtual bool is_script_function() const { return false; }
+
     BoundFunction* bind(Value bound_this_value, Vector<Value> arguments);
 
     Value bound_this() const

+ 1 - 1
Libraries/LibJS/Runtime/ScriptFunction.h

@@ -48,7 +48,7 @@ public:
     void set_name(const FlyString& name) { m_name = name; };
 
 private:
-    virtual bool is_script_function() const final { return true; }
+    virtual bool is_script_function() const override { return true; }
     virtual const char* class_name() const override { return "ScriptFunction"; }
     virtual LexicalEnvironment* create_environment() override;
     virtual void visit_children(Visitor&) override;