mirror of
https://github.com/RGBCube/serenity
synced 2025-05-28 09:35:09 +00:00
LibJS/Bytecode: Move TypeofVariable impl to CommonImplementations
This commit is contained in:
parent
c65aecd878
commit
d368dc5d25
3 changed files with 20 additions and 18 deletions
|
@ -226,4 +226,22 @@ ThrowCompletionOr<void> throw_if_needed_for_call(Interpreter& interpreter, Instr
|
||||||
template ThrowCompletionOr<void> throw_if_needed_for_call(Interpreter&, Op::Call const&, Value);
|
template ThrowCompletionOr<void> throw_if_needed_for_call(Interpreter&, Op::Call const&, Value);
|
||||||
template ThrowCompletionOr<void> throw_if_needed_for_call(Interpreter&, Op::CallWithArgumentArray const&, Value);
|
template ThrowCompletionOr<void> throw_if_needed_for_call(Interpreter&, Op::CallWithArgumentArray const&, Value);
|
||||||
|
|
||||||
|
ThrowCompletionOr<Value> typeof_variable(VM& vm, DeprecatedFlyString const& string)
|
||||||
|
{
|
||||||
|
// 1. Let val be the result of evaluating UnaryExpression.
|
||||||
|
auto reference = TRY(vm.resolve_binding(string));
|
||||||
|
|
||||||
|
// 2. If val is a Reference Record, then
|
||||||
|
// a. If IsUnresolvableReference(val) is true, return "undefined".
|
||||||
|
if (reference.is_unresolvable())
|
||||||
|
return PrimitiveString::create(vm, "undefined"_string);
|
||||||
|
|
||||||
|
// 3. Set val to ? GetValue(val).
|
||||||
|
auto value = TRY(reference.get_value(vm));
|
||||||
|
|
||||||
|
// 4. NOTE: This step is replaced in section B.3.6.3.
|
||||||
|
// 5. Return a String according to Table 41.
|
||||||
|
return PrimitiveString::create(vm, value.typeof());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,5 +20,6 @@ ThrowCompletionOr<void> put_by_property_key(VM&, Value base, Value this_value, V
|
||||||
ThrowCompletionOr<Value> perform_call(Interpreter&, Value this_value, Op::CallType, Value callee, MarkedVector<Value> argument_values);
|
ThrowCompletionOr<Value> perform_call(Interpreter&, Value this_value, Op::CallType, Value callee, MarkedVector<Value> argument_values);
|
||||||
template<typename InstructionType>
|
template<typename InstructionType>
|
||||||
ThrowCompletionOr<void> throw_if_needed_for_call(Interpreter&, InstructionType const&, Value callee);
|
ThrowCompletionOr<void> throw_if_needed_for_call(Interpreter&, InstructionType const&, Value callee);
|
||||||
|
ThrowCompletionOr<Value> typeof_variable(VM&, DeprecatedFlyString const&);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1639,24 +1639,7 @@ ThrowCompletionOr<void> NewClass::execute_impl(Bytecode::Interpreter& interprete
|
||||||
ThrowCompletionOr<void> TypeofVariable::execute_impl(Bytecode::Interpreter& interpreter) const
|
ThrowCompletionOr<void> TypeofVariable::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||||
{
|
{
|
||||||
auto& vm = interpreter.vm();
|
auto& vm = interpreter.vm();
|
||||||
|
interpreter.accumulator() = TRY(typeof_variable(vm, interpreter.current_executable().get_identifier(m_identifier)));
|
||||||
// 1. Let val be the result of evaluating UnaryExpression.
|
|
||||||
auto const& string = interpreter.current_executable().get_identifier(m_identifier);
|
|
||||||
auto reference = TRY(vm.resolve_binding(string));
|
|
||||||
|
|
||||||
// 2. If val is a Reference Record, then
|
|
||||||
// a. If IsUnresolvableReference(val) is true, return "undefined".
|
|
||||||
if (reference.is_unresolvable()) {
|
|
||||||
interpreter.accumulator() = PrimitiveString::create(vm, "undefined"_string);
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. Set val to ? GetValue(val).
|
|
||||||
auto value = TRY(reference.get_value(vm));
|
|
||||||
|
|
||||||
// 4. NOTE: This step is replaced in section B.3.6.3.
|
|
||||||
// 5. Return a String according to Table 41.
|
|
||||||
interpreter.accumulator() = PrimitiveString::create(vm, value.typeof());
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue