diff --git a/src/eval.js b/src/eval.js index 7c0927c..28df1b3 100644 --- a/src/eval.js +++ b/src/eval.js @@ -447,7 +447,7 @@ export const eval_codestring = (codestring, scope) => ` ))(codestring, scope) -const get_args_scope = (fn_node, args) => { +const get_args_scope = (fn_node, args, closure) => { const arg_names = collect_destructuring_identifiers(fn_node.function_args) .map(i => i.value) @@ -464,7 +464,10 @@ const get_args_scope = (fn_node, args) => { */ const codestring = `(([${destructuring}]) => [${arg_names.join(',')}])(__args)` - const {ok, value, error} = eval_codestring(codestring, {__args: args}) + const {ok, value, error} = eval_codestring(codestring, { + ...closure, + __args: args, + }) if(!ok) { // TODO show exact destructuring error @@ -1142,7 +1145,11 @@ export const eval_frame = (calltree_node, modules) => { } else { // TODO default values for destructuring can be function calls - const args_scope_result = get_args_scope(node, calltree_node.args) + const args_scope_result = get_args_scope( + node, + calltree_node.args, + calltree_node.fn.__closure + ) // TODO fine-grained destructuring error, only for identifiers that // failed destructuring diff --git a/test/test.js b/test/test.js index 30fb147..807044f 100644 --- a/test/test.js +++ b/test/test.js @@ -820,6 +820,23 @@ export const tests = [ assert_equal(frame.children[0].children[0].children[0].result.value, [1,2,3]) }), + test('eval_frame default arg', () => { + const code = ` + const x = 1 + function y(z = x) { + return z + } + y() + ` + const tree = eval_tree(code) + const frame = eval_frame(tree.children[0]) + assert_equal( + // value for z in return statement + frame.children[1].children[0].children[0].result.value, + 1 + ) + }), + test('module not found', () => { const parsed = parse_modules( 'a', @@ -3174,6 +3191,7 @@ const y = x()` patch_builtin('random', null) }), + test('record io cache discarded if args does not match', async () => { // Patch fetch patch_builtin('fetch', async () => 'first')