1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 19:38:12 +00:00

LibJS: NewClass bytecode instruction

This adds a the NewClass bytecode instruction, enough of it
is implemented for it to show it in the bytecode (js -d).
This commit is contained in:
Johan Dahlin 2021-06-30 15:42:13 -03:00 committed by Andreas Kling
parent 3694b8b690
commit f6028c2534
6 changed files with 37 additions and 1 deletions

View file

@ -1300,4 +1300,10 @@ void SwitchStatement::generate_bytecode(Bytecode::Generator& generator) const
generator.switch_to_basic_block(end_block);
}
void ClassDeclaration::generate_bytecode(Bytecode::Generator& generator) const
{
generator.emit<Bytecode::Op::NewClass>(m_class_expression);
generator.emit<Bytecode::Op::SetVariable>(generator.intern_string(m_class_expression.ptr()->name()));
}
}

View file

@ -72,7 +72,8 @@
O(GetIterator) \
O(IteratorNext) \
O(IteratorResultDone) \
O(IteratorResultValue)
O(IteratorResultValue) \
O(NewClass)
namespace JS::Bytecode {

View file

@ -452,6 +452,11 @@ void IteratorResultValue::execute_impl(Bytecode::Interpreter& interpreter) const
interpreter.accumulator() = iterator_value(interpreter.global_object(), *iterator_result);
}
void NewClass::execute_impl(Bytecode::Interpreter&) const
{
TODO();
}
String Load::to_string_impl(Bytecode::Executable const&) const
{
return String::formatted("Load {}", m_src);
@ -598,6 +603,11 @@ String NewFunction::to_string_impl(Bytecode::Executable const&) const
return "NewFunction";
}
String NewClass::to_string_impl(Bytecode::Executable const&) const
{
return "NewClass";
}
String Return::to_string_impl(Bytecode::Executable const&) const
{
return "Return";

View file

@ -484,6 +484,22 @@ private:
Register m_arguments[];
};
class NewClass final : public Instruction {
public:
explicit NewClass(ClassExpression const& class_expression)
: Instruction(Type::NewClass)
, m_class_expression(class_expression)
{
}
void execute_impl(Bytecode::Interpreter&) const;
String to_string_impl(Bytecode::Executable const&) const;
void replace_references_impl(BasicBlock const&, BasicBlock const&) { }
private:
ClassExpression const& m_class_expression;
};
class NewFunction final : public Instruction {
public:
explicit NewFunction(FunctionNode const& function_node)