mirror of
https://github.com/denoland/deno.git
synced 2025-03-10 06:07:03 -04:00
fix(core): op metrics op_names mismatch (#14716)
This commit is contained in:
parent
03ae0f0e83
commit
f81ea85bb7
3 changed files with 29 additions and 18 deletions
|
@ -1,5 +1,5 @@
|
||||||
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
|
||||||
import { assert } from "./test_util.ts";
|
import { assert, assertEquals } from "./test_util.ts";
|
||||||
|
|
||||||
Deno.test(async function metrics() {
|
Deno.test(async function metrics() {
|
||||||
// Write to stdout to ensure a "data" message gets sent instead of just
|
// Write to stdout to ensure a "data" message gets sent instead of just
|
||||||
|
@ -76,3 +76,14 @@ Deno.test(function metricsForOpCrates() {
|
||||||
assert(m1.opsDispatched > 0);
|
assert(m1.opsDispatched > 0);
|
||||||
assert(m1.opsCompleted > 0);
|
assert(m1.opsCompleted > 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Test that op_names == Objects.keys(Deno.core.ops)
|
||||||
|
// since building the per-op metrics depends on op_names being complete
|
||||||
|
Deno.test(function opNamesMatch() {
|
||||||
|
assertEquals(
|
||||||
|
// @ts-ignore: Deno.core allowed
|
||||||
|
Deno.core.opNames().sort(),
|
||||||
|
// @ts-ignore: Deno.core allowed
|
||||||
|
Object.keys(Deno.core.ops).sort(),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
|
@ -217,7 +217,7 @@
|
||||||
function metrics() {
|
function metrics() {
|
||||||
const [aggregate, perOps] = opSync("op_metrics");
|
const [aggregate, perOps] = opSync("op_metrics");
|
||||||
aggregate.ops = ObjectFromEntries(ArrayPrototypeMap(
|
aggregate.ops = ObjectFromEntries(ArrayPrototypeMap(
|
||||||
core.op_names,
|
core.opNames(),
|
||||||
(opName, opId) => [opName, perOps[opId]],
|
(opName, opId) => [opName, perOps[opId]],
|
||||||
));
|
));
|
||||||
return aggregate;
|
return aggregate;
|
||||||
|
|
|
@ -114,6 +114,9 @@ pub static EXTERNAL_REFERENCES: Lazy<v8::ExternalReferences> =
|
||||||
v8::ExternalReference {
|
v8::ExternalReference {
|
||||||
function: apply_source_map.map_fn_to(),
|
function: apply_source_map.map_fn_to(),
|
||||||
},
|
},
|
||||||
|
v8::ExternalReference {
|
||||||
|
function: op_names.map_fn_to(),
|
||||||
|
},
|
||||||
])
|
])
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -174,13 +177,10 @@ pub fn initialize_context<'s>(
|
||||||
// a really weird usecase. Remove this once all
|
// a really weird usecase. Remove this once all
|
||||||
// tsc ops are static at snapshot time.
|
// tsc ops are static at snapshot time.
|
||||||
if snapshot_loaded {
|
if snapshot_loaded {
|
||||||
// Grab the Deno.core & Deno.core.ops objects
|
// Grab the Deno.core.ops object & init it
|
||||||
let core_obj = JsRuntime::grab_global::<v8::Object>(scope, "Deno.core")
|
|
||||||
.expect("Deno.core to exist");
|
|
||||||
let ops_obj = JsRuntime::grab_global::<v8::Object>(scope, "Deno.core.ops")
|
let ops_obj = JsRuntime::grab_global::<v8::Object>(scope, "Deno.core.ops")
|
||||||
.expect("Deno.core.ops to exist");
|
.expect("Deno.core.ops to exist");
|
||||||
initialize_ops(scope, ops_obj, op_ctxs);
|
initialize_ops(scope, ops_obj, op_ctxs);
|
||||||
initialize_op_names(scope, core_obj, op_ctxs);
|
|
||||||
return scope.escape(context);
|
return scope.escape(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,6 +243,7 @@ pub fn initialize_context<'s>(
|
||||||
set_func(scope, core_val, "destructureError", destructure_error);
|
set_func(scope, core_val, "destructureError", destructure_error);
|
||||||
set_func(scope, core_val, "terminate", terminate);
|
set_func(scope, core_val, "terminate", terminate);
|
||||||
set_func(scope, core_val, "applySourceMap", apply_source_map);
|
set_func(scope, core_val, "applySourceMap", apply_source_map);
|
||||||
|
set_func(scope, core_val, "opNames", op_names);
|
||||||
|
|
||||||
// Direct bindings on `window`.
|
// Direct bindings on `window`.
|
||||||
set_func(scope, global, "queueMicrotask", queue_microtask);
|
set_func(scope, global, "queueMicrotask", queue_microtask);
|
||||||
|
@ -250,7 +251,6 @@ pub fn initialize_context<'s>(
|
||||||
// Bind functions to Deno.core.ops.*
|
// Bind functions to Deno.core.ops.*
|
||||||
let ops_obj = JsRuntime::ensure_objs(scope, global, "Deno.core.ops").unwrap();
|
let ops_obj = JsRuntime::ensure_objs(scope, global, "Deno.core.ops").unwrap();
|
||||||
initialize_ops(scope, ops_obj, op_ctxs);
|
initialize_ops(scope, ops_obj, op_ctxs);
|
||||||
initialize_op_names(scope, core_val, op_ctxs);
|
|
||||||
scope.escape(context)
|
scope.escape(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,17 +265,6 @@ fn initialize_ops(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn initialize_op_names(
|
|
||||||
scope: &mut v8::HandleScope,
|
|
||||||
core_obj: v8::Local<v8::Object>,
|
|
||||||
op_ctxs: &[OpCtx],
|
|
||||||
) {
|
|
||||||
let names: Vec<&str> = op_ctxs.iter().map(|o| o.decl.name).collect();
|
|
||||||
let k = v8::String::new(scope, "op_names").unwrap().into();
|
|
||||||
let v = serde_v8::to_v8(scope, names).unwrap();
|
|
||||||
core_obj.set(scope, k, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn set_func(
|
pub fn set_func(
|
||||||
scope: &mut v8::HandleScope<'_>,
|
scope: &mut v8::HandleScope<'_>,
|
||||||
obj: v8::Local<v8::Object>,
|
obj: v8::Local<v8::Object>,
|
||||||
|
@ -1553,3 +1542,14 @@ fn get_memory_usage(isolate: &mut v8::Isolate) -> MemoryUsage {
|
||||||
external: s.external_memory(),
|
external: s.external_memory(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn op_names(
|
||||||
|
scope: &mut v8::HandleScope,
|
||||||
|
_args: v8::FunctionCallbackArguments,
|
||||||
|
mut rv: v8::ReturnValue,
|
||||||
|
) {
|
||||||
|
let state_rc = JsRuntime::state(scope);
|
||||||
|
let state = state_rc.borrow();
|
||||||
|
let names: Vec<_> = state.op_ctxs.iter().map(|o| o.decl.name).collect();
|
||||||
|
rv.set(serde_v8::to_v8(scope, names).unwrap());
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue