diff --git a/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp b/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp index 952858077e..bcd06266dd 100644 --- a/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp @@ -325,8 +325,10 @@ JS_DEFINE_NATIVE_FUNCTION(GlobalObject::eval) auto& caller_frame = vm.call_stack().at(vm.call_stack().size() - 2); TemporaryChange scope_change(vm.call_frame().scope, caller_frame->scope); - // FIXME: eval() should return the result of the executed code. This currently does not work. - return vm.interpreter().execute_statement(global_object, program); + vm.interpreter().execute_statement(global_object, program); + if (vm.exception()) + return {}; + return vm.last_value(); } } diff --git a/Userland/Libraries/LibJS/Tests/eval-basic.js b/Userland/Libraries/LibJS/Tests/eval-basic.js new file mode 100644 index 0000000000..955e86dc22 --- /dev/null +++ b/Userland/Libraries/LibJS/Tests/eval-basic.js @@ -0,0 +1,10 @@ +test("basic eval() functionality", () => { + expect(eval("1 + 2")).toBe(3); + + function foo(a) { + var x = 5; + eval("x += a"); + return x; + } + expect(foo(7)).toBe(12); +});