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
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import '../../../shared/primitives/utils.dart';
import '../../../shared/table/table.dart';
import '../../../shared/table/table_data.dart';
import '../../../shared/theme.dart';
import '../vm_developer_common_widgets.dart';
import '../vm_service_private_extensions.dart';
import 'object_inspector_view_controller.dart';
import 'vm_object_model.dart';
Expand Down Expand Up @@ -157,67 +158,27 @@ class _InstructionColumn extends _CodeColumnData
}
}

class _DartObjectColumn extends _CodeColumnData {
_DartObjectColumn() : super.wide('Object');

@override
String getValue(Instruction dataObject) =>
_objectToDisplayValue(dataObject.object);

// TODO(bkonyi): verify this covers all cases.
String _objectToDisplayValue(Object? object) {
if (object is InstanceRef) {
final instance = object;
switch (instance.kind!) {
case InstanceKind.kNull:
return 'null';
case InstanceKind.kBool:
return instance.valueAsString!;
case InstanceKind.kList:
return 'List(${instance.length})';
case InstanceKind.kString:
return '"${instance.valueAsString}"';
case InstanceKind.kPlainInstance:
return 'TODO(PlainInstance)';
case InstanceKind.kClosure:
return instance.closureFunction!.name!;
}
}

if (object is FuncRef) {
final func = object;
return '${func.owner.name}.${func.name!}';
}

if (object is CodeRef) {
final code = object;
return code.name!;
}

if (object is FieldRef) {
final field = object;
return '${field.declaredType!.name} ${field.name}';
}
class _DartObjectColumn extends _CodeColumnData
implements ColumnRenderer<Instruction> {
_DartObjectColumn({required this.controller}) : super.wide('Object');

if (object is TypeArgumentsRef) {
final typeArgsRef = object;
return 'TypeArguments(${typeArgsRef.name!})';
}
final ObjectInspectorViewController controller;

// Note: this check should be last as [ObjRef] is a super type to most
// other types in package:vm_service.
if (object is ObjRef) {
final objRef = object;
if (objRef.isICData) {
final icData = objRef.asICData;
return 'ICData (${icData.selector})';
}
if (objRef.vmType != null) {
return objRef.vmType!;
}
}
@override
ObjRef? getValue(Instruction inst) => inst.object;

return object?.toString() ?? '';
@override
Widget? build(
BuildContext context,
Instruction data, {
bool isRowSelected = false,
VoidCallback? onPressed,
}) {
if (data.object == null) return Container();
return VmServiceObjectLink<ObjRef>(
object: data.object!,
onTap: controller.findAndSelectNodeForObject,
);
}
}

Expand All @@ -234,26 +195,31 @@ class VmCodeDisplay extends StatelessWidget {

@override
Widget build(BuildContext context) {
return CodeTable(code: code);
return CodeTable(
code: code,
controller: controller,
);
}
}

class CodeTable extends StatelessWidget {
CodeTable({
Key? key,
required this.code,
required this.controller,
}) : super(key: key);

final columns = <ColumnData<Instruction>>[
late final columns = <ColumnData<Instruction>>[
_AddressColumn(),
_InstructionColumn(),
_DartObjectColumn(),
_DartObjectColumn(controller: controller),
if (profilerTicksEnabled) ...[
_ProfileTicksColumn('Inclusive'),
_ProfileTicksColumn('Exclusive'),
],
];

final ObjectInspectorViewController controller;
final CodeObject code;

@override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ class DisplayProvider extends StatelessWidget {
),
if (variable.ref!.value is! Sentinel)
VmServiceObjectLink(
object: variable.ref!.value,
object: variable.ref!.value as ObjRef,
textBuilder: (object) {
if (object is InstanceRef &&
object.kind == InstanceKind.kString) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ class InboundReferencesWidget extends StatelessWidget {
}
}

class VmServiceObjectLink<T> extends StatelessWidget {
class VmServiceObjectLink<T extends ObjRef?> extends StatelessWidget {
const VmServiceObjectLink({
required this.object,
required this.onTap,
Expand Down Expand Up @@ -766,6 +766,9 @@ class VmServiceObjectLink<T> extends StatelessWidget {
} else if (object is Sentinel) {
final sentinel = object as Sentinel;
text = sentinel.valueAsString!;
} else if (object?.isICData ?? false) {
final icData = object!.asICData;
text = 'ICData(${icData.selector})';
} else {
isServiceObject = false;
text = object.toString();
Expand Down