A draft for ProgramPlayDialog

This commit is contained in:
romanman 2014-06-02 18:00:24 +03:00
parent 63e217e630
commit a49f8b5e5c
3 changed files with 174 additions and 6 deletions

View File

@ -0,0 +1,150 @@
package org.ethereum.gui;
import org.ethereum.vm.Program;
import org.ethereum.vm.VM;
import org.spongycastle.util.encoders.Hex;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowListener;
import java.util.*;
import java.util.List;
/**
* www.ethereumJ.com
* User: Roman Mandeleil
* Created on: 02/06/2014 16:58
*/
public class ProgramPlayDialog extends JPanel implements ActionListener, ChangeListener, Program.ProgramListener {
public List<String> outputList;
public JTextArea console;
public ProgramPlayDialog() {
outputList = new ArrayList<String>();
VM vm = new VM();
Program program = new Program(Hex.decode("630000000060445960CC60DD611234600054615566602054"));
program.addListener(this);
program.fullTrace();
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
//Create the slider.
JSlider stepSlider = new JSlider(JSlider.HORIZONTAL,
0, outputList.size() - 1, 0);
stepSlider.addChangeListener(this);
//Turn on labels at major tick marks.
stepSlider.setMajorTickSpacing(1);
stepSlider.setMinorTickSpacing(1);
stepSlider.setPaintTicks(true);
stepSlider.setPaintLabels(true);
stepSlider.setBorder(
BorderFactory.createEmptyBorder(0, 0, 10, 0));
Font font = new Font("Serif", Font.ITALIC, 15);
stepSlider.setFont(font);
stepSlider.addChangeListener(this);
//Create the label that displays the animation.
add(stepSlider);
int i = stepSlider.getValue();
console = new JTextArea(outputList.get(i));
console.setFont(new Font("Courier New", Font.PLAIN, 13));
console.setForeground(Color.GRAY);
add(console);
this.setPreferredSize(new Dimension(600, 300));
}
@Override
public void actionPerformed(ActionEvent e) {
}
@Override
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
int step = (int)source.getValue();
int i = source.getValue();
String out = outputList.get(i);
console.setText(out);
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
ProgramPlayDialog ppd = new ProgramPlayDialog();
//Create and set up the window.
JFrame frame = new JFrame("SliderDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add content to the window.
frame.add(ppd, BorderLayout.CENTER);
//Display the window.
frame.pack();
frame.setVisible(true);
}
@Override
public void output(String out) {
outputList.add(out);
}
public static void main(String []args){
/* Turn off metal's use of bold fonts */
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}

View File

@ -20,6 +20,7 @@ import java.util.*;
public class Program { public class Program {
Logger logger = LoggerFactory.getLogger("VM"); Logger logger = LoggerFactory.getLogger("VM");
ProgramListener listener;
Stack<DataWord> stack = new Stack<DataWord>(); Stack<DataWord> stack = new Stack<DataWord>();
Map<DataWord, DataWord> storage = new HashMap<DataWord, DataWord>(); Map<DataWord, DataWord> storage = new HashMap<DataWord, DataWord>();
@ -209,7 +210,24 @@ public class Program {
logger.debug(" -- STORAGE -- {}\n", storageData); logger.debug(" -- STORAGE -- {}\n", storageData);
StringBuilder global = new StringBuilder();
global.append(" -- OPS -- ").append(opsString).append("\n");
global.append(" -- STACK -- ").append(stackData).append("\n");
global.append(" -- MEMORY -- ").append(memoryData).append("\n");
global.append(" -- STORAGE -- ").append(storageData).append("\n");
if (listener != null){
listener.output(global.toString());
}
}; };
} }
public void addListener(ProgramListener listener){
this.listener = listener;
}
public interface ProgramListener{
public void output(String out);
}
} }

View File

@ -71,10 +71,10 @@ public class VM {
program.stackPush(word1); program.stackPush(word1);
program.step(); program.step();
}break; }break;
// case SLT: case SLT:
// break; break;
// case SGT: case SGT:
// break; break;
case GT:{ case GT:{
DataWord word1 = program.stackPull(); DataWord word1 = program.stackPull();
DataWord word2 = program.stackPull(); DataWord word2 = program.stackPull();
@ -165,8 +165,8 @@ public class VM {
* SHA3 * SHA3
*/ */
// case SHA3: case SHA3:
// break; break;
/** /**
* Environmental Information * Environmental Information