mirror of
https://github.com/RGBCube/serenity
synced 2025-05-16 23:15:07 +00:00
LibJS/Bytecode: Add support for new.target
This commit is contained in:
parent
fd235d8a06
commit
eac5534ce4
5 changed files with 46 additions and 0 deletions
|
@ -1866,6 +1866,7 @@ public:
|
||||||
|
|
||||||
virtual Completion execute(Interpreter&, GlobalObject&) const override;
|
virtual Completion execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Type m_type;
|
Type m_type;
|
||||||
|
|
|
@ -2031,4 +2031,25 @@ Bytecode::CodeGenerationErrorOr<void> ForOfStatement::generate_bytecode(Bytecode
|
||||||
return for_in_of_body_evaluation(generator, *this, m_lhs, body(), head_result, loop_end, loop_update);
|
return for_in_of_body_evaluation(generator, *this, m_lhs, body(), head_result, loop_end, loop_update);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 13.3.12.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-meta-properties-runtime-semantics-evaluation
|
||||||
|
Bytecode::CodeGenerationErrorOr<void> MetaProperty::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
|
{
|
||||||
|
// NewTarget : new . target
|
||||||
|
if (m_type == MetaProperty::Type::NewTarget) {
|
||||||
|
// 1. Return GetNewTarget().
|
||||||
|
generator.emit<Bytecode::Op::GetNewTarget>();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// ImportMeta : import . meta
|
||||||
|
if (m_type == MetaProperty::Type::ImportMeta) {
|
||||||
|
return Bytecode::CodeGenerationError {
|
||||||
|
this,
|
||||||
|
"Unimplemented meta property: import.meta"sv,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
O(GetById) \
|
O(GetById) \
|
||||||
O(GetByValue) \
|
O(GetByValue) \
|
||||||
O(GetIterator) \
|
O(GetIterator) \
|
||||||
|
O(GetNewTarget) \
|
||||||
O(GetObjectPropertyIterator) \
|
O(GetObjectPropertyIterator) \
|
||||||
O(GetVariable) \
|
O(GetVariable) \
|
||||||
O(GreaterThan) \
|
O(GreaterThan) \
|
||||||
|
|
|
@ -358,6 +358,12 @@ ThrowCompletionOr<void> ResolveThisBinding::execute_impl(Bytecode::Interpreter&
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ThrowCompletionOr<void> GetNewTarget::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||||
|
{
|
||||||
|
interpreter.accumulator() = interpreter.vm().get_new_target();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
void Jump::replace_references_impl(BasicBlock const& from, BasicBlock const& to)
|
void Jump::replace_references_impl(BasicBlock const& from, BasicBlock const& to)
|
||||||
{
|
{
|
||||||
if (m_true_target.has_value() && &m_true_target->block() == &from)
|
if (m_true_target.has_value() && &m_true_target->block() == &from)
|
||||||
|
@ -976,4 +982,9 @@ String ResolveThisBinding::to_string_impl(Bytecode::Executable const&) const
|
||||||
return "ResolveThisBinding"sv;
|
return "ResolveThisBinding"sv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String GetNewTarget::to_string_impl(Bytecode::Executable const&) const
|
||||||
|
{
|
||||||
|
return "GetNewTarget"sv;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -838,6 +838,18 @@ public:
|
||||||
void replace_references_impl(BasicBlock const&, BasicBlock const&) { }
|
void replace_references_impl(BasicBlock const&, BasicBlock const&) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class GetNewTarget final : public Instruction {
|
||||||
|
public:
|
||||||
|
explicit GetNewTarget()
|
||||||
|
: Instruction(Type::GetNewTarget)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ThrowCompletionOr<void> execute_impl(Bytecode::Interpreter&) const;
|
||||||
|
String to_string_impl(Bytecode::Executable const&) const;
|
||||||
|
void replace_references_impl(BasicBlock const&, BasicBlock const&) { }
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace JS::Bytecode {
|
namespace JS::Bytecode {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue