diff --git a/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/Alias.java b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/Alias.java index e417738..8beca16 100644 --- a/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/Alias.java +++ b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/Alias.java @@ -26,7 +26,9 @@ private int occurrenceExp; public static final int OCCURRENCE_EXP_CONTAINER = 0; public static final int OCCURRENCE_EXP_RECEIVER = 0; - public static final int OCCURRENCE_EXP_FIELD = 1; + public static final int OCCURRENCE_EXP_FIELD = 1; + public static final int OCCURRENCE_EXP_ARRAY = 1; + public static final int OCCURRENCE_EXP_FIRST_ARG = 1; public static final int OCCURRENCE_EXP_RETURN = -1; public Alias(String objectId, TracePoint occurrencePoint, int occurrenceExp) { diff --git a/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/TraceJSON.java b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/TraceJSON.java index ebb496d..41b079c 100644 --- a/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/TraceJSON.java +++ b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/TraceJSON.java @@ -979,45 +979,159 @@ public static Alias getAlias(String objectId, TracePoint occurrencePoint, int occurrenceExp) { return new Alias(objectId, occurrencePoint, occurrenceExp); } + + public static ArrayList> getObjectFlow(Alias alias) { + ArrayList> aliasLists = new ArrayList<>(); + ArrayList aliasList = new ArrayList<>(); + aliasList.add(alias); + aliasLists.add(aliasList); + return getObjectFlow(aliasLists, alias.getObjectId(), alias.getOccurrencePoint()); + } - public static ArrayList getObjectFlow(Alias alias) { - ArrayList aliases = new ArrayList<>(); - aliases.add(alias); - String aliasObjId = alias.getObjectId(); - TracePoint tracePoint = alias.getOccurrencePoint(); + public static ArrayList> getObjectFlow(final ArrayList> aliasLists, final String aliasObjId, TracePoint tracePoint) { while (tracePoint.stepBackOver()) { Statement statement = tracePoint.getStatement(); if (statement instanceof FieldAccess) { + // �t�B�[���h�A�N�Z�X�̏ꍇ FieldAccess fs = (FieldAccess)statement; String containerObjId = fs.getContainerObjId(); String valueObjId = fs.getValueObjId(); if (aliasObjId.equals(valueObjId)) { - aliases.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_FIELD)); - tracePoint = getFieldUpdateTracePoint(containerObjId, fs.getFieldName(), tracePoint); + // ���Y�n�_�ł̃G�C���A�X�����X�g�ɒlj�������Ƀt�B�[���h�ŏI�X�V�ɔ�ԃp�^�[���Ƃ��̂܂ܑk��p�^�[���Ƃŕ��� + Alias alias = new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_FIELD); + ArrayList aliasList = aliasLists.get(aliasLists.size() - 1); + aliasList.add(alias); + ArrayList aliasListCopy = new ArrayList<>(aliasList); // ���X�g���̂��f�B�[�v�R�s�[���Ă���(�t�B�[���h�ŏI�X�V�ɔ�ԍċA�����I�����, ���̂܂ܑk��p�^�[���ŗp����) + getObjectFlow(aliasLists, aliasObjId, getFieldUpdateTracePoint(containerObjId, fs.getFieldName(), tracePoint)); + aliasLists.add(aliasListCopy); // �ċA�����ɓ���O�Ƀf�B�[�v�R�s�[���Ă������X�g���Ō���ɒlj� (�ȍ~�̑k��ɂ���Č��‚����G�C���A�X�͂��̃��X�g�ɓ������) } } else if (statement instanceof ArrayAccess) { + // �z��A�N�Z�X�̏ꍇ ArrayAccess aa = (ArrayAccess)statement; String arrayObjId = aa.getArrayObjectId(); String valueObjId = aa.getValueObjectId(); if (aliasObjId.equals(valueObjId)) { - aliases.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_FIELD)); - tracePoint = getArrayUpdateTracePoint(arrayObjId, aa.getIndex(), tracePoint); + // ���Y�n�_�ł̃G�C���A�X�����X�g�ɒlj�������Ƀt�B�[���h�ŏI�X�V�ɔ�ԃp�^�[���Ƃ��̂܂ܑk��p�^�[���Ƃŕ��� + Alias alias = new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_ARRAY); + ArrayList aliasList = aliasLists.get(aliasLists.size() - 1); + aliasList.add(alias); + ArrayList aliasListCopy = new ArrayList<>(aliasList); // ���X�g���̂��f�B�[�v�R�s�[���Ă���(�t�B�[���h�ŏI�X�V�ɔ�ԍċA�����I�����, ���̂܂ܑk��p�^�[���ŗp����) + getObjectFlow(aliasLists, aliasObjId, getArrayUpdateTracePoint(arrayObjId, aa.getIndex(), tracePoint)); + aliasLists.add(aliasListCopy); // �ċA�����ɓ���O�Ƀf�B�[�v�R�s�[���Ă������X�g���Ō���ɒlj� (�ȍ~�̑k��ɂ���Č��‚����G�C���A�X�͂��̃��X�g�ɓ������) } } else if (statement instanceof ArrayCreate) { + // �z�񐶐��̏ꍇ ArrayCreate ac = (ArrayCreate)statement; - + String arrayObjId = ac.getArrayObjectId(); + if (aliasObjId.equals(arrayObjId)) { + Alias alias = new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_RETURN); // �z�񐶐��� new �^��[] �̖߂�l + ArrayList aliasList = aliasLists.get(aliasLists.size() - 1); + aliasList.add(alias); + return aliasLists; // �z�񐶐��ӏ��̓G�C���A�X�̋N���Ȃ̂ł���ȑO�ɂ͂����Ȃ��͂� + } } else if (statement instanceof MethodInvocation) { MethodExecution prevChildMethodExecution = ((MethodInvocation)statement).getCalledMethodExecution(); ObjectReference returnValue = prevChildMethodExecution.getReturnValue(); String returnId = returnValue.getId(); if (aliasObjId.equals(returnId)) { - aliases.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_RETURN)); - tracePoint.stepBackNoReturn(); + // �߂�l�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ + ArrayList aliasList = aliasLists.get(aliasLists.size() - 1); + aliasList.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_RETURN)); + if (prevChildMethodExecution.isConstructor()) { + return aliasLists; // �R���X�g���N�^�Ăяo���ӏ��̓G�C���A�X�̋N���Ȃ̂ł���ȑO�ɂ͂����Ȃ��͂� + } + tracePoint.stepBackNoReturn(); // ���\�b�h�̌Ăяo����ɐ��� + continue; + } + int argOrder = 0; + List args = prevChildMethodExecution.getArguments(); + for (ObjectReference objrf : args) { + if (aliasObjId.equalsIgnoreCase(objrf.getId())) { + // ���\�b�h�Ăяo���̎������ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ + ArrayList aliasList = aliasLists.get(aliasLists.size() - 1); + aliasList.add(new Alias(aliasObjId, tracePoint, (Alias.OCCURRENCE_EXP_FIRST_ARG + argOrder))); + break; + } + argOrder++; + } + if (argOrder == args.size()) { + // ���\�b�h�Ăяo���̂ǂ̎������ɂ��G�C���A�X�̃I�u�W�F�N�gID����v���Ȃ������ꍇ + if (aliasObjId.equals(prevChildMethodExecution.getThisObjId())) { + // ���\�b�h�Ăяo���̃R���e�i�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ + ArrayList aliasList = aliasLists.get(aliasLists.size() - 1); + aliasList.add(new Alias(aliasObjId, tracePoint, (Alias.OCCURRENCE_EXP_RECEIVER))); + continue; // �R���e�i���t�B�[���h�̏ꍇ�͂��̂܂ܑk��΃t�B�[���h�A�N�Z�X�ɂ��ǂ蒅���͂� + } } } } + // ���̉��Ɉ������G�C���A�X�ƂȂ��Ă��邩�ɂ‚��Ă̊֘A���������� - return aliases; + return aliasLists; } + +// public static ArrayList getObjectFlow(Alias alias) { +// ArrayList aliases = new ArrayList<>(); +// aliases.add(alias); +// String aliasObjId = alias.getObjectId(); +// TracePoint tracePoint = alias.getOccurrencePoint(); +// while (tracePoint.stepBackOver()) { +// Statement statement = tracePoint.getStatement(); +// if (statement instanceof FieldAccess) { +// // �t�B�[���h�A�N�Z�X�̏ꍇ (���������Y�G�C���A�X�Ȃ�, ���ݒT������tracePoint���t�B�[���h�̍ŏI�X�V����tracePoint�ɕς���) +// FieldAccess fs = (FieldAccess)statement; +// String containerObjId = fs.getContainerObjId(); +// String valueObjId = fs.getValueObjId(); +// if (aliasObjId.equals(valueObjId)) { +// aliases.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_FIELD)); +// tracePoint = getFieldUpdateTracePoint(containerObjId, fs.getFieldName(), tracePoint); +// } +// } else if (statement instanceof ArrayAccess) { +// ArrayAccess aa = (ArrayAccess)statement; +// String arrayObjId = aa.getArrayObjectId(); +// String valueObjId = aa.getValueObjectId(); +// if (aliasObjId.equals(valueObjId)) { +// aliases.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_ARRAY)); +// tracePoint = getArrayUpdateTracePoint(arrayObjId, aa.getIndex(), tracePoint); +// } +// } else if (statement instanceof ArrayCreate) { +// ArrayCreate ac = (ArrayCreate)statement; +// +// } else if (statement instanceof MethodInvocation) { +// MethodExecution prevChildMethodExecution = ((MethodInvocation)statement).getCalledMethodExecution(); +// ObjectReference returnValue = prevChildMethodExecution.getReturnValue(); +// String returnId = returnValue.getId(); +// if (aliasObjId.equals(returnId)) { +// // �߂�l�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ +// aliases.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_RETURN)); +// tracePoint.stepBackNoReturn(); +// continue; +// } +// int argOrder = 0; +// List args = prevChildMethodExecution.getArguments(); +// for (ObjectReference objrf : args) { +// if (aliasObjId.equalsIgnoreCase(objrf.getId())) { +// // ���\�b�h�Ăяo���̎������ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ +// aliases.add(new Alias(aliasObjId, tracePoint, (Alias.OCCURRENCE_EXP_FIRST_ARG + argOrder))); +// break; +// } +// argOrder++; +// } +// if (argOrder == args.size()) { +// // ���\�b�h�Ăяo���̂ǂ̎������ɂ��G�C���A�X�̃I�u�W�F�N�gID����v���Ȃ������ꍇ +// if (aliasObjId.equals(prevChildMethodExecution.getThisObjId())) { +// // ���\�b�h�Ăяo���̃R���e�i�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ +// aliases.add(new Alias(aliasObjId, tracePoint, (Alias.OCCURRENCE_EXP_RECEIVER))); +// // tracePoint���R���e�i�̍ŏI�X�V���ɔ�΂����� +// +// } +// } +// } +// } +// +// // ���̉��Ɉ������G�C���A�X�ƂȂ��Ă��邩�ɂ‚��Ă̊֘A���������� +// +// return aliases; +// } }