
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.
60 lines
1.3 KiB
C++
60 lines
1.3 KiB
C++
/*
|
|
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibJS/Runtime/GlobalObject.h>
|
|
#include <LibJS/Runtime/NativeFunction.h>
|
|
#include <LibJS/Runtime/Value.h>
|
|
|
|
namespace JS {
|
|
|
|
NativeFunction* NativeFunction::create(GlobalObject& global_object, const FlyString& name, AK::Function<Value(VM&, GlobalObject&)> function)
|
|
{
|
|
return global_object.heap().allocate<NativeFunction>(global_object, name, move(function), *global_object.function_prototype());
|
|
}
|
|
|
|
NativeFunction::NativeFunction(Object& prototype)
|
|
: Function(prototype)
|
|
{
|
|
}
|
|
|
|
NativeFunction::NativeFunction(PropertyName const& name, AK::Function<Value(VM&, GlobalObject&)> native_function, Object& prototype)
|
|
: Function(prototype)
|
|
, m_name(name.as_string())
|
|
, m_native_function(move(native_function))
|
|
{
|
|
}
|
|
|
|
NativeFunction::NativeFunction(PropertyName const& name, Object& prototype)
|
|
: Function(prototype)
|
|
, m_name(name.as_string())
|
|
{
|
|
}
|
|
|
|
NativeFunction::~NativeFunction()
|
|
{
|
|
}
|
|
|
|
Value NativeFunction::call()
|
|
{
|
|
return m_native_function(vm(), global_object());
|
|
}
|
|
|
|
Value NativeFunction::construct(Function&)
|
|
{
|
|
return {};
|
|
}
|
|
|
|
LexicalEnvironment* NativeFunction::create_environment()
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
bool NativeFunction::is_strict_mode() const
|
|
{
|
|
return vm().in_strict_mode();
|
|
}
|
|
|
|
}
|