mirror of
https://github.com/Samsung/escargot.git
synced 2026-06-29 10:02:14 +00:00
2. remove GetThis byte code
3. optimize Function::call
4. optimize {get, set} of TypedArrayObject
Signed-off-by: seonghyun kim <sh8281.kim@samsung.com>
137 lines
5 KiB
C++
137 lines
5 KiB
C++
#include "Escargot.h"
|
|
#include "EnvironmentRecord.h"
|
|
#include "runtime/Value.h"
|
|
#include "runtime/SmallValue.h"
|
|
#include "runtime/Context.h"
|
|
#include "runtime/GlobalObject.h"
|
|
#include "parser/CodeBlock.h"
|
|
|
|
namespace Escargot {
|
|
|
|
GlobalEnvironmentRecord::GlobalEnvironmentRecord(ExecutionState& state, CodeBlock* codeBlock, GlobalObject* global)
|
|
: EnvironmentRecord(state, codeBlock)
|
|
, m_globalCodeBlock(codeBlock)
|
|
{
|
|
ASSERT(codeBlock == nullptr || codeBlock->parentCodeBlock() == nullptr);
|
|
m_globalObject = global;
|
|
|
|
if (!codeBlock)
|
|
return;
|
|
const CodeBlock::IdentifierInfoVector& vec = codeBlock->identifierInfos();
|
|
size_t len = vec.size();
|
|
for (size_t i = 0; i < len; i++) {
|
|
createMutableBinding(state, vec[i].m_name, false);
|
|
}
|
|
}
|
|
|
|
void GlobalEnvironmentRecord::createMutableBinding(ExecutionState& state, const AtomicString& name, bool canDelete)
|
|
{
|
|
auto desc = m_globalObject->getOwnProperty(state, name);
|
|
if (!desc.hasValue()) {
|
|
ObjectPropertyDescriptor::PresentAttribute attribute = (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectStructurePropertyDescriptor::EnumerablePresent);
|
|
if (canDelete)
|
|
attribute = (ObjectPropertyDescriptor::PresentAttribute)(attribute | ObjectPropertyDescriptor::ConfigurablePresent);
|
|
m_globalObject->defineOwnPropertyThrowsExceptionWhenStrictMode(state, name, ObjectPropertyDescriptor(Value(), attribute));
|
|
}
|
|
}
|
|
|
|
EnvironmentRecord::GetBindingValueResult GlobalEnvironmentRecord::getBindingValue(ExecutionState& state, const AtomicString& name)
|
|
{
|
|
auto result = m_globalObject->get(state, name, m_globalObject);
|
|
if (result.hasValue())
|
|
return EnvironmentRecord::GetBindingValueResult(true, result.value(state, m_globalObject));
|
|
else
|
|
return EnvironmentRecord::GetBindingValueResult(false, Value());
|
|
}
|
|
|
|
void GlobalEnvironmentRecord::setMutableBinding(ExecutionState& state, const AtomicString& name, const Value& V)
|
|
{
|
|
m_globalObject->setThrowsExceptionWhenStrictMode(state, name, V, m_globalObject);
|
|
}
|
|
|
|
void GlobalEnvironmentRecord::setMutableBindingByIndex(ExecutionState& state, const size_t& idx, const AtomicString& name, const Value& V)
|
|
{
|
|
m_globalObject->setThrowsExceptionWhenStrictMode(state, name, V, m_globalObject);
|
|
}
|
|
|
|
bool GlobalEnvironmentRecord::deleteBinding(ExecutionState& state, const AtomicString& name)
|
|
{
|
|
return m_globalObject->deleteOwnProperty(state, name);
|
|
}
|
|
|
|
EnvironmentRecord::BindingSlot GlobalEnvironmentRecord::hasBinding(ExecutionState& state, const AtomicString& atomicName)
|
|
{
|
|
auto result = m_globalObject->get(state, ObjectPropertyName(atomicName));
|
|
if (result.hasValue()) {
|
|
return BindingSlot(this, SIZE_MAX - 1);
|
|
} else {
|
|
return BindingSlot(this, SIZE_MAX);
|
|
}
|
|
}
|
|
|
|
void DeclarativeEnvironmentRecordNotIndexed::createMutableBinding(ExecutionState& state, const AtomicString& name, bool canDelete)
|
|
{
|
|
ASSERT(canDelete == false);
|
|
ASSERT(hasBinding(state, name).m_index == SIZE_MAX);
|
|
IdentifierRecord record;
|
|
record.m_name = name;
|
|
m_recordVector.pushBack(record);
|
|
m_heapStorage.pushBack(Value());
|
|
}
|
|
|
|
EnvironmentRecord::GetBindingValueResult DeclarativeEnvironmentRecordNotIndexed::getBindingValue(ExecutionState& state, const AtomicString& name)
|
|
{
|
|
size_t len = m_recordVector.size();
|
|
for (size_t i = 0; i < len; i++) {
|
|
if (m_recordVector[i].m_name == name) {
|
|
return EnvironmentRecord::GetBindingValueResult(m_heapStorage[i]);
|
|
}
|
|
}
|
|
return GetBindingValueResult();
|
|
}
|
|
|
|
void DeclarativeEnvironmentRecordNotIndexed::setMutableBinding(ExecutionState& state, const AtomicString& name, const Value& V)
|
|
{
|
|
size_t len = m_recordVector.size();
|
|
for (size_t i = 0; i < len; i++) {
|
|
if (m_recordVector[i].m_name == name) {
|
|
m_heapStorage[i] = V;
|
|
return;
|
|
}
|
|
}
|
|
RELEASE_ASSERT_NOT_REACHED();
|
|
}
|
|
|
|
|
|
void FunctionEnvironmentRecordNotIndexed::createMutableBinding(ExecutionState& state, const AtomicString& name, bool canDelete)
|
|
{
|
|
ASSERT(canDelete == false);
|
|
ASSERT(hasBinding(state, name).m_index == SIZE_MAX);
|
|
IdentifierRecord record;
|
|
record.m_name = name;
|
|
m_recordVector.pushBack(record);
|
|
m_heapStorage.pushBack(Value());
|
|
}
|
|
EnvironmentRecord::GetBindingValueResult FunctionEnvironmentRecordNotIndexed::getBindingValue(ExecutionState& state, const AtomicString& name)
|
|
{
|
|
size_t len = m_recordVector.size();
|
|
for (size_t i = 0; i < len; i++) {
|
|
if (m_recordVector[i].m_name == name) {
|
|
return EnvironmentRecord::GetBindingValueResult(m_heapStorage[i]);
|
|
}
|
|
}
|
|
return GetBindingValueResult();
|
|
}
|
|
|
|
void FunctionEnvironmentRecordNotIndexed::setMutableBinding(ExecutionState& state, const AtomicString& name, const Value& V)
|
|
{
|
|
size_t len = m_recordVector.size();
|
|
for (size_t i = 0; i < len; i++) {
|
|
if (m_recordVector[i].m_name == name) {
|
|
m_heapStorage[i] = V;
|
|
return;
|
|
}
|
|
}
|
|
RELEASE_ASSERT_NOT_REACHED();
|
|
}
|
|
}
|