
We were doing a *lot* of string-to-int conversion while creating a new global object. This happened because Object::put() would try to convert the property name (string) to an integer to see if it refers to an indexed property. Sidestep this issue by using PropertyName for the CommonPropertyNames struct on VM (vm.names.foo), and giving PropertyName a flag that tells us whether it's a string that *may be* a number. All CommonPropertyNames are set up so they are known to not be numbers.
47 lines
1.3 KiB
C++
47 lines
1.3 KiB
C++
/*
|
|
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Function.h>
|
|
#include <LibJS/Runtime/Function.h>
|
|
|
|
namespace JS {
|
|
|
|
class NativeFunction : public Function {
|
|
JS_OBJECT(NativeFunction, Function);
|
|
|
|
public:
|
|
static NativeFunction* create(GlobalObject&, const FlyString& name, AK::Function<Value(VM&, GlobalObject&)>);
|
|
|
|
explicit NativeFunction(PropertyName const& name, AK::Function<Value(VM&, GlobalObject&)>, Object& prototype);
|
|
virtual void initialize(GlobalObject&) override { }
|
|
virtual ~NativeFunction() override;
|
|
|
|
virtual Value call() override;
|
|
virtual Value construct(Function& new_target) override;
|
|
|
|
virtual const FlyString& name() const override { return m_name; };
|
|
virtual bool has_constructor() const { return false; }
|
|
|
|
virtual bool is_strict_mode() const override;
|
|
|
|
protected:
|
|
NativeFunction(PropertyName const& name, Object& prototype);
|
|
explicit NativeFunction(Object& prototype);
|
|
|
|
private:
|
|
virtual LexicalEnvironment* create_environment() override final;
|
|
virtual bool is_native_function() const final { return true; }
|
|
|
|
FlyString m_name;
|
|
AK::Function<Value(VM&, GlobalObject&)> m_native_function;
|
|
};
|
|
|
|
template<>
|
|
inline bool Object::fast_is<NativeFunction>() const { return is_native_function(); }
|
|
|
|
}
|