mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
Remove broken feature: trace()
This commit is contained in:
parent
6bbf0777b1
commit
7f204b9803
6 changed files with 0 additions and 168 deletions
1
BUILD.gn
1
BUILD.gn
|
@ -105,7 +105,6 @@ ts_sources = [
|
||||||
"js/symlink.ts",
|
"js/symlink.ts",
|
||||||
"js/text_encoding.ts",
|
"js/text_encoding.ts",
|
||||||
"js/timers.ts",
|
"js/timers.ts",
|
||||||
"js/trace.ts",
|
|
||||||
"js/truncate.ts",
|
"js/truncate.ts",
|
||||||
"js/types.ts",
|
"js/types.ts",
|
||||||
"js/url_search_params.ts",
|
"js/url_search_params.ts",
|
||||||
|
|
|
@ -34,7 +34,6 @@ export { writeFileSync, writeFile } from "./write_file";
|
||||||
export { ErrorKind, DenoError } from "./errors";
|
export { ErrorKind, DenoError } from "./errors";
|
||||||
export { libdeno } from "./libdeno";
|
export { libdeno } from "./libdeno";
|
||||||
export { platform } from "./platform";
|
export { platform } from "./platform";
|
||||||
export { trace } from "./trace";
|
|
||||||
export { truncateSync, truncate } from "./truncate";
|
export { truncateSync, truncate } from "./truncate";
|
||||||
export { FileInfo } from "./file_info";
|
export { FileInfo } from "./file_info";
|
||||||
export { connect, dial, listen, Listener, Conn } from "./net";
|
export { connect, dial, listen, Listener, Conn } from "./net";
|
||||||
|
|
|
@ -4,7 +4,6 @@ import * as flatbuffers from "./flatbuffers";
|
||||||
import * as msg from "gen/msg_generated";
|
import * as msg from "gen/msg_generated";
|
||||||
import * as errors from "./errors";
|
import * as errors from "./errors";
|
||||||
import * as util from "./util";
|
import * as util from "./util";
|
||||||
import { maybePushTrace } from "./trace";
|
|
||||||
|
|
||||||
let nextCmdId = 0;
|
let nextCmdId = 0;
|
||||||
const promiseTable = new Map<number, util.Resolvable<msg.Base>>();
|
const promiseTable = new Map<number, util.Resolvable<msg.Base>>();
|
||||||
|
@ -43,7 +42,6 @@ export function sendAsync(
|
||||||
inner: flatbuffers.Offset,
|
inner: flatbuffers.Offset,
|
||||||
data?: ArrayBufferView
|
data?: ArrayBufferView
|
||||||
): Promise<msg.Base> {
|
): Promise<msg.Base> {
|
||||||
maybePushTrace(innerType, false); // add to trace if tracing
|
|
||||||
const [cmdId, resBuf] = sendInternal(builder, innerType, inner, data, false);
|
const [cmdId, resBuf] = sendInternal(builder, innerType, inner, data, false);
|
||||||
util.assert(resBuf == null);
|
util.assert(resBuf == null);
|
||||||
const promise = util.createResolvable<msg.Base>();
|
const promise = util.createResolvable<msg.Base>();
|
||||||
|
@ -58,7 +56,6 @@ export function sendSync(
|
||||||
inner: flatbuffers.Offset,
|
inner: flatbuffers.Offset,
|
||||||
data?: ArrayBufferView
|
data?: ArrayBufferView
|
||||||
): null | msg.Base {
|
): null | msg.Base {
|
||||||
maybePushTrace(innerType, true); // add to trace if tracing
|
|
||||||
const [cmdId, resBuf] = sendInternal(builder, innerType, inner, data, true);
|
const [cmdId, resBuf] = sendInternal(builder, innerType, inner, data, true);
|
||||||
util.assert(cmdId >= 0);
|
util.assert(cmdId >= 0);
|
||||||
if (resBuf == null) {
|
if (resBuf == null) {
|
||||||
|
|
80
js/trace.ts
80
js/trace.ts
|
@ -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<any>
|
|
||||||
): Promise<TraceInfo[]> {
|
|
||||||
pushStack();
|
|
||||||
if (typeof fnOrPromise === "function") {
|
|
||||||
await fnOrPromise();
|
|
||||||
} else {
|
|
||||||
await fnOrPromise;
|
|
||||||
}
|
|
||||||
return popStack();
|
|
||||||
}
|
|
|
@ -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" });
|
|
||||||
});
|
|
|
@ -24,7 +24,6 @@ import "./symlink_test.ts";
|
||||||
import "./platform_test.ts";
|
import "./platform_test.ts";
|
||||||
import "./text_encoding_test.ts";
|
import "./text_encoding_test.ts";
|
||||||
import "./net_test.ts";
|
import "./net_test.ts";
|
||||||
import "./trace_test.ts";
|
|
||||||
import "./truncate_test.ts";
|
import "./truncate_test.ts";
|
||||||
import "./v8_source_maps_test.ts";
|
import "./v8_source_maps_test.ts";
|
||||||
import "../website/app_test.js";
|
import "../website/app_test.js";
|
||||||
|
|
Loading…
Add table
Reference in a new issue