diff --git a/BUILD.gn b/BUILD.gn index abb5b7e06f..cfd7227bf1 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -105,7 +105,6 @@ ts_sources = [ "js/symlink.ts", "js/text_encoding.ts", "js/timers.ts", - "js/trace.ts", "js/truncate.ts", "js/types.ts", "js/url_search_params.ts", diff --git a/js/deno.ts b/js/deno.ts index 84b6b14b86..8a6b627b6b 100644 --- a/js/deno.ts +++ b/js/deno.ts @@ -34,7 +34,6 @@ export { writeFileSync, writeFile } from "./write_file"; export { ErrorKind, DenoError } from "./errors"; export { libdeno } from "./libdeno"; export { platform } from "./platform"; -export { trace } from "./trace"; export { truncateSync, truncate } from "./truncate"; export { FileInfo } from "./file_info"; export { connect, dial, listen, Listener, Conn } from "./net"; diff --git a/js/dispatch.ts b/js/dispatch.ts index d416264bd5..b27e5e1b56 100644 --- a/js/dispatch.ts +++ b/js/dispatch.ts @@ -4,7 +4,6 @@ import * as flatbuffers from "./flatbuffers"; import * as msg from "gen/msg_generated"; import * as errors from "./errors"; import * as util from "./util"; -import { maybePushTrace } from "./trace"; let nextCmdId = 0; const promiseTable = new Map>(); @@ -43,7 +42,6 @@ export function sendAsync( inner: flatbuffers.Offset, data?: ArrayBufferView ): Promise { - maybePushTrace(innerType, false); // add to trace if tracing const [cmdId, resBuf] = sendInternal(builder, innerType, inner, data, false); util.assert(resBuf == null); const promise = util.createResolvable(); @@ -58,7 +56,6 @@ export function sendSync( inner: flatbuffers.Offset, data?: ArrayBufferView ): null | msg.Base { - maybePushTrace(innerType, true); // add to trace if tracing const [cmdId, resBuf] = sendInternal(builder, innerType, inner, data, true); util.assert(cmdId >= 0); if (resBuf == null) { diff --git a/js/trace.ts b/js/trace.ts deleted file mode 100644 index 104d048deb..0000000000 --- a/js/trace.ts +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2018 the Deno authors. All rights reserved. MIT license. -import * as msg from "gen/msg_generated"; - -export interface TraceInfo { - sync: boolean; // is synchronous call - name: string; // name of operation -} - -interface TraceStackNode { - list: TraceInfo[]; - prev: TraceStackNode | null; -} - -let current: TraceStackNode | null = null; - -// Push a new list to trace stack -function pushStack(): void { - if (current === null) { - current = { list: [], prev: null }; - } else { - const newStack = { list: [], prev: current }; - current = newStack; - } -} - -// Pop from trace stack and (if possible) concat to parent trace stack node -function popStack(): TraceInfo[] { - if (current === null) { - throw new Error("trace list stack should not be empty"); - } - const resultList = current!.list; - if (!!current!.prev) { - const prev = current!.prev!; - // concat inner results to outer stack - prev.list = prev.list.concat(resultList); - current = prev; - } else { - current = null; - } - return resultList; -} - -// Push to trace stack if we are tracing -// @internal -export function maybePushTrace(op: msg.Any, sync: boolean): void { - if (current === null) { - return; // no trace requested - } - // Freeze the object, avoid tampering - current!.list.push( - Object.freeze({ - sync, - name: msg.Any[op] // convert to enum names - }) - ); -} - -/** Trace privileged operations executed inside a given function or promise. - * - * _Notice:_ To capture every operation in asynchronous `deno.*` calls, - * you might want to put them in functions instead of directly invoking. - * - * import { trace, mkdir } from "deno"; - * - * const ops = await trace(async () => { - * await mkdir("my_dir"); - * }); - */ -export async function trace( - // tslint:disable-next-line:no-any - fnOrPromise: Function | Promise -): Promise { - pushStack(); - if (typeof fnOrPromise === "function") { - await fnOrPromise(); - } else { - await fnOrPromise; - } - return popStack(); -} diff --git a/js/trace_test.ts b/js/trace_test.ts deleted file mode 100644 index bbfc9f23cb..0000000000 --- a/js/trace_test.ts +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2018 the Deno authors. All rights reserved. MIT license. -import { testPerm, assertEqual } from "./test_util.ts"; -import * as deno from "deno"; - -testPerm({ write: true }, async function traceFunctionSuccess() { - const op = await deno.trace(async () => { - const enc = new TextEncoder(); - const data = enc.encode("Hello"); - // Mixing sync and async calls - const filename = deno.makeTempDirSync() + "/test.txt"; - await deno.writeFile(filename, data, 0o666); - deno.removeSync(filename); - }); - assertEqual(op.length, 3); - assertEqual(op[0], { sync: true, name: "MakeTempDir" }); - assertEqual(op[1], { sync: false, name: "WriteFile" }); - assertEqual(op[2], { sync: true, name: "Remove" }); -}); - -testPerm({ write: true }, async function tracePromiseSuccess() { - // Ensure we don't miss any send actions - // (new Promise(fn), fn runs synchronously) - const asyncFunction = async () => { - const enc = new TextEncoder(); - const data = enc.encode("Hello"); - // Mixing sync and async calls - const filename = deno.makeTempDirSync() + "/test.txt"; - await deno.writeFile(filename, data, 0o666); - deno.removeSync(filename); - }; - const promise = Promise.resolve().then(asyncFunction); - const op = await deno.trace(promise); - assertEqual(op.length, 3); - assertEqual(op[0], { sync: true, name: "MakeTempDir" }); - assertEqual(op[1], { sync: false, name: "WriteFile" }); - assertEqual(op[2], { sync: true, name: "Remove" }); -}); - -testPerm({ write: true }, async function traceRepeatSuccess() { - const op1 = await deno.trace(async () => await deno.makeTempDir()); - assertEqual(op1.length, 1); - assertEqual(op1[0], { sync: false, name: "MakeTempDir" }); - const op2 = await deno.trace(() => deno.statSync(".")); - assertEqual(op2.length, 1); - assertEqual(op2[0], { sync: true, name: "Stat" }); -}); - -testPerm({ write: true }, async function traceIdempotence() { - let op1, op2, op3; - op1 = await deno.trace(async () => { - const filename = (await deno.makeTempDir()) + "/test.txt"; - op2 = await deno.trace(async () => { - const enc = new TextEncoder(); - const data = enc.encode("Hello"); - deno.writeFileSync(filename, data, 0o666); - op3 = await deno.trace(async () => { - await deno.remove(filename); - }); - await deno.makeTempDir(); - }); - }); - - // Flatten the calls - assertEqual(op1.length, 4); - assertEqual(op1[0], { sync: false, name: "MakeTempDir" }); - assertEqual(op1[1], { sync: true, name: "WriteFile" }); - assertEqual(op1[2], { sync: false, name: "Remove" }); - assertEqual(op1[3], { sync: false, name: "MakeTempDir" }); - - assertEqual(op2.length, 3); - assertEqual(op2[0], { sync: true, name: "WriteFile" }); - assertEqual(op2[1], { sync: false, name: "Remove" }); - assertEqual(op2[2], { sync: false, name: "MakeTempDir" }); - - assertEqual(op3.length, 1); - assertEqual(op3[0], { sync: false, name: "Remove" }); - - // Expect top-level repeat still works after all the nestings - const op4 = await deno.trace(() => deno.statSync(".")); - assertEqual(op4.length, 1); - assertEqual(op4[0], { sync: true, name: "Stat" }); -}); diff --git a/js/unit_tests.ts b/js/unit_tests.ts index 610de02dba..392a061ccf 100644 --- a/js/unit_tests.ts +++ b/js/unit_tests.ts @@ -24,7 +24,6 @@ import "./symlink_test.ts"; import "./platform_test.ts"; import "./text_encoding_test.ts"; import "./net_test.ts"; -import "./trace_test.ts"; import "./truncate_test.ts"; import "./v8_source_maps_test.ts"; import "../website/app_test.js";