Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions agents/repl/value.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export interface EncodeOptions {
}

const DEFAULT_MAX_DEPTH = 3;
const MAX_ITERATOR_ITEMS = 100;

export type PackedValue = [EncodedValueTree, ArrayBuffer | null];

Expand Down Expand Up @@ -40,6 +41,7 @@ const enum ValueTag {
WeakSet = 19,
DepthLimit = 20,
Circular = 21,
Iterator = 22,
}

type TypedArrayName =
Expand Down Expand Up @@ -145,6 +147,7 @@ function collectTree(
const isArray = Array.isArray(obj);
const isMap = obj instanceof Map;
const isSet = obj instanceof Set;
const isIterator = typeof obj.next === "function" && typeof obj[Symbol.iterator] === "function";

const existingId = state.seen.get(obj);
if (existingId !== undefined) {
Expand All @@ -161,6 +164,9 @@ function collectTree(
if (isSet) {
return [ValueTag.DepthLimit, ValueTag.Set];
}
if (isIterator) {
return [ValueTag.DepthLimit, ValueTag.Iterator];
}
return [ValueTag.DepthLimit, ValueTag.Object];
}

Expand Down Expand Up @@ -194,6 +200,20 @@ function collectTree(
return [ValueTag.Array, id, elements];
}

if (isIterator) {
const label = obj[Symbol.toStringTag] ?? "Iterator";
const items: EncodedValueTree[] = [];
let truncated = false;
for (const v of obj as Iterable<unknown>) {
if (items.length === MAX_ITERATOR_ITEMS) {
truncated = true;
break;
}
items.push(collectTree(v, chunks, maxDepth, depth + 1, state));
}
return [ValueTag.Iterator, id, label, items, truncated];
}

try {
const maybeToJSON = obj.toJSON;
if (typeof maybeToJSON === "function") {
Expand Down Expand Up @@ -349,6 +369,15 @@ function patchTree(
return [ValueTag.Set, id, patchedItems];
}

case ValueTag.Iterator: {
const id = rest[0] as number;
const label = rest[1] as string;
const items = rest[2] as EncodedValueTree[];
const truncated = rest[3] as boolean;
const patchedItems = items.map(child => patchTree(child, offsets));
return [ValueTag.Iterator, id, label, patchedItems, truncated];
}

default:
return tree;
}
Expand Down
28 changes: 27 additions & 1 deletion frida_tools/repl_inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
WEAKSET = 19
DEPTH_LIMIT = 20
CIRCULAR = 21
ITERATOR = 22

_CYAN = "fg:#64d2ff"
_MINT = "fg:#66d4cf"
Expand All @@ -47,7 +48,7 @@

_HEX_BYTES_PER_ROW = 16

_CONTAINER_NAMES = {OBJECT: "Object", ARRAY: "Array", MAP: "Map", SET: "Set"}
_CONTAINER_NAMES = {OBJECT: "Object", ARRAY: "Array", MAP: "Map", SET: "Set", ITERATOR: "Iterator"}

Node = Sequence[Any]
Fragment = Tuple[str, str]
Expand Down Expand Up @@ -147,6 +148,9 @@ def _append(node: Node, level: int, out: List[Fragment], blob: Sequence[int]) ->
elif tag == CIRCULAR:
out.append((_ORANGE, "⟳ circular *%d" % node[1]))

elif tag == ITERATOR:
_append_iterator(node, level, out, blob)


def _append_object(node: Node, level: int, out: List[Fragment], blob: Sequence[int]) -> None:
properties = node[2]
Expand Down Expand Up @@ -263,6 +267,28 @@ def _append_set(node: Node, level: int, out: List[Fragment], blob: Sequence[int]
out.append((_CYAN, "]"))


def _append_iterator(node: Node, level: int, out: List[Fragment], blob: Sequence[int]) -> None:
label, elements, truncated = node[2], node[3], node[4]
if not elements:
out.append((_CYAN, "%s[]" % label))
return

out.append((_CYAN, "%s[" % label))
out.append(("", "\n"))
for index, element in enumerate(elements):
_indent(level + 1, out)
_append(element, level + 1, out, blob)
if _has_more(index, elements, truncated):
out.append(("", ","))
out.append(("", "\n"))
if truncated:
_indent(level + 1, out)
out.append((_ORANGE, "… more"))
out.append(("", "\n"))
_indent(level, out)
out.append((_CYAN, "]"))


def _capped(items: Sequence[Any]) -> Tuple[Sequence[Any], int]:
shown = items[:_MAX_ITEMS]
return shown, len(items) - len(shown)
Expand Down
Loading