diff --git a/docs/examples/ethers/index.js b/docs/examples/ethers/index.js index f4f6f3c..fe7f5a3 100644 --- a/docs/examples/ethers/index.js +++ b/docs/examples/ethers/index.js @@ -1,41 +1,15 @@ -//import {ethers} from 'https://unpkg.com/ethers/dist/ethers.js' import {ethers} from 'https://unpkg.com/ethers@5.7.2/dist/ethers.esm.js' -const URL = 'https://ethereum-goerli-rpc.allthatnode.com' +const URL = 'https://rpc.ankr.com/eth_goerli' const p = ethers.getDefaultProvider(URL) -await p._networkPromise - const latest = await p.getBlock() -latest - const txs = await Promise.all(latest.transactions.map(t => p.getTransactionReceipt(t) )) - -const totalGas = txs.reduce((gas,tx) => - gas.add(tx.gasUsed), ethers.BigNumber.from(0)) - - - - - totalGas.add(21) - - -/* -const totalGas = txs.reduce((gas,tx) => - gas + tx.gasUsed, BigInt(0)) - - totalGas + 1 -*/ - - - - - - - - +const totalGas = txs + .filter(tx => tx != null) + .reduce((gas,tx) => gas.add(tx.gasUsed), ethers.BigNumber.from(0)) diff --git a/src/calltree.js b/src/calltree.js index d67c204..54c8e09 100644 --- a/src/calltree.js +++ b/src/calltree.js @@ -610,6 +610,7 @@ export const find_call = (state, index) => { if(call != null) { if(call.has_more_children) { active_calltree_node = eval_expand_calltree_node( + // TODO copy eval_cxt? state.eval_cxt, state.parse_result, call @@ -625,6 +626,7 @@ export const find_call = (state, index) => { } } else { const find_result = eval_find_call( + // TODO copy eval_cxt? state.eval_cxt, state.parse_result, state.calltree, diff --git a/src/record_io.js b/src/record_io.js index a118a7b..a715bb6 100644 --- a/src/record_io.js +++ b/src/record_io.js @@ -216,13 +216,6 @@ const io_patch = (path, use_context = false) => { } export const apply_io_patches = () => { - // TODO remove, only for dev - // TODO test open_run_window - if(cxt.window.__io_patched) { - throw new Error('illegal state') - } - cxt.window.__io_patched = true - io_patch(['Math', 'random']) io_patch(['setTimeout']) diff --git a/src/runtime.js b/src/runtime.js index 5800e38..7dec0a6 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -202,7 +202,7 @@ export const do_eval_expand_calltree_node = (cxt, node) => { synchronous for simplicity */ export const do_eval_find_call = (cxt, calltree, location) => { - // TODO remove + // Sanity check if(cxt.children != null) { throw new Error('illegal state') } diff --git a/test/test.js b/test/test.js index 0755dd5..37141d9 100644 --- a/test/test.js +++ b/test/test.js @@ -2882,7 +2882,7 @@ const y = x()` test('async/await logs out of order timeout', async () => { const i = await test_initial_state_async(` const delay = async time => { - await new Promise(res => globalThis.setTimeout(res, time*10)) + await new Promise(res => setTimeout(res, time*10)) console.log(time) } @@ -3091,10 +3091,8 @@ const y = x()` }), test('record io fetch rejects', async () => { - const original_fetch = globalThis.run_window.fetch - // Patch fetch - Object.assign(globalThis.run_window, {fetch: () => Promise.reject('fail')}) + patch_builtin('fetch', () => Promise.reject('fail')) const initial = await test_initial_state_async(` await fetch('url', {method: 'GET'}) @@ -3102,7 +3100,7 @@ const y = x()` assert_equal(root_calltree_node(initial).error, 'fail') // Patch fetch again - Object.assign(globalThis.run_window, {fetch: async () => 'result'}) + patch_builtin('fetch', () => async () => 'result') const with_cache = await command_input_async(initial, ` await fetch('url', {method: 'GET'}) @@ -3110,7 +3108,7 @@ const y = x()` assert_equal(root_calltree_node(initial).error, 'fail') // Remove patch - Object.assign(globalThis.run_window, {fetch: original_fetch}) + patch_builtin('fetch', null) }), test('record io preserve promise resolution order', async () => { diff --git a/test/utils.js b/test/utils.js index cd11a6c..5e5ca8f 100644 --- a/test/utils.js +++ b/test/utils.js @@ -12,36 +12,39 @@ Object.assign(globalThis, } ) -export const original_setTimeout = globalThis.setTimeout - export const patch_builtin = new Function(` - // Substitute some builtin functions: fetch, setTimeout, Math.random to be - // able to patch them in tests + let originals = globalThis.run_window.__builtins_originals + let patched = globalThis.run_window.__builtins_patched + if(originals == null) { + globalThis.run_window.__original_setTimeout = globalThis.setTimeout + // This code can execute twice when tests are run in self-hosted mode. + // Ensure that patches will be applied only once + originals = globalThis.run_window.__builtins_originals = {} + patched = globalThis.run_window.__builtins_patched = {} - const originals = { - random: Math.random, - fetch: globalThis.fetch, - setTimeout: globalThis.setTimeout, + const patch = (obj, name) => { + originals[name] = obj[name] + obj[name] = (...args) => { + return patched[name] == null + ? originals[name].apply(null, args) + : patched[name].apply(null, args) + } + } + + // Substitute some builtin functions: fetch, setTimeout, Math.random to be + // able to patch them in tests + patch(globalThis.run_window, 'fetch') + patch(globalThis.run_window, 'setTimeout') + patch(globalThis.run_window.Math, 'random') } - const patched = {} - - const patch = (obj, name) => { - originals[name] = obj[name] - obj[name] = (...args) => patched[name] == null - ? originals[name](...args) - : patched[name](...args) - } - - patch(globalThis, 'fetch') - patch(globalThis, 'setTimeout') - patch(Math, 'random') - return (name, fn) => { patched[name] = fn } `)() +export const original_setTimeout = globalThis.run_window.__original_setTimeout + export const parse_modules = (entry, modules) => load_modules(entry, module_name => modules[module_name])