Name: diC59631 Date: 08/11/98
-----> Ok. The compiler ask to report this:
cuba-vthierry% setenv CLASSPATH /usr/local/java11/lib
cuba-vthierry% javac Exec.java
-----> With the file:
/**************************************************************************
* ###@###.###, Copyright (C) 1996. All rights reserved. *
**************************************************************************/
package FR.inria.duck.util;
import java.io.*;
/**
* This class encapsulates an operating system exec interface.
* @see Runtime for more information on the Runtime environment.
* For example: <i>
* new ItemDialog(new Exec(command).get(0));
* </i> execute a command and pop the result in a message window.
*/
public class Exec {
// Thread which executes the command
private Process process;
private Wait wait;
private class Wait extends Thread {
public final void run() {
try {
process.waitFor();
} catch(Exception e) { }
}
}
private Run run;
private class Run extends Thread {
public final void run() {
try {
process = Runtime.getRuntime().exec(command);
(wait = new Wait()).start();
int c;
output = new StringBuffer();
InputStream stdout = process.getInputStream();
while(wait.isAlive() && ((c = stdout.read()) != -1)) {
output.append((char) c);
if (action != null)
action.run(null, output);
}
stdout.close();
if (process.exitValue() != 0) {
output.append("\n Error in Exec: Exit Value = " +
process.exitValue() + "\n");
InputStream stderr = process.getErrorStream();
while((c = stderr.read()) != -1)
output.append((char) c);
stderr.close();
}
if (action != null)
action.run(new Integer(process.exitValue()), output);
} catch(Exception e) {
if (output == null)
output = new StringBuffer();
output.append("Error in Exec: " + e.getMessage());
}
}
}
/** Parameter:
* @param command The command to be executed.
* - Optional parameter:
* @param action An action to run during command execution.
*/
private String command;
private StringBuffer output;
private Runnable action;
public Exec(String command, Exec.Runnable action) {
this.action = action;
this.command = command;
output = null;
(run = new Run()).start();
}
/*!*/ public Exec(String command) {
this(command, null);
}
/** Runnable called during command execution:
* - During the command execution, the runnable is called several time
* (in fact after each stdout char has been read) with:
* <i>status = null</i>, <i>output = stdout-buffer</i>
* - After the command completion, the runnable is called a last time
* width:
* <i>status = command-exit-value</i>, <i>output = final-stdout-buffer</a>
* thus the Runnable detects this last call by checking if status != null.
*/
public interface Runnable {
public abstract void run(Integer status, StringBuffer output);
}
/**
* Get the command output or null if not yet finished.
*/
public String get() {
if (output == null)
return null;
else
return output.toString();
}
/**
* Wait until the end of the execution and get the command output.
* @param time Optional maximal waiting time in second.
*/
public String get(int time) {
if (time == 0)
time = -1;
while(time != 0) {
if (output != null)
return get();
try {
Thread.sleep(1000);
} catch (InterruptedException e) { }
time--;
}
return get();
}
/**
* Stop the execution of the command.
*/
public final void stop() {
if (process != null)
process.destroy();
try {
Thread.sleep(100);
} catch (InterruptedException e) { }
if (run != null)
run.stop();
if (wait != null)
wait.stop();
}
}
----> and outputing this:
ERROR: sun.tools.java.CompilerError: stack under flow: 40: invokevirtual vo
id start() = -1
-- listing --
$38:
38: try 499363399
39: aload 0
39: getfield FR.inria.duck.util.Exec this$0
39: invokestatic java.lang.Runtime getRuntime()
39: aload 0
39: getfield FR.inria.duck.util.Exec this$0
39: invokestatic java.lang.String access$0(FR.inria.duck.util.Exec)
39: invokevirtual java.lang.Process exec(java.lang.String)
39: invokestatic void access$2(FR.inria.duck.util.Exec, java.lang.Process)
40: aload 0
40: getfield FR.inria.duck.util.Exec this$0
40: new inner class FR.inria.duck.util.Exec. Wait
40: dup
40: aload 0
40: getfield FR.inria.duck.util.Exec this$0
40: invokespecial FR.inria.duck.util.Exec. Wait(FR.inria.duck.util.Exec)
40: invokestatic void access$4(FR.inria.duck.util.Exec, FR.inria.duck.util.E
xec. Wait)
40: invokevirtual void start()
42: aload 0
42: getfield FR.inria.duck.util.Exec this$0
42: new class java.lang.StringBuffer
42: dup
42: invokespecial java.lang.StringBuffer()
42: invokestatic void access$6(FR.inria.duck.util.Exec, java.lang.StringBuff
er)
43: aload 0
43: getfield FR.inria.duck.util.Exec this$0
43: invokestatic java.lang.Process access$1(FR.inria.duck.util.Exec)
43: invokevirtual java.io.InputStream getInputStream()
43: astore 2
44: goto $43:
$44:
45: aload 0
45: getfield FR.inria.duck.util.Exec this$0
45: invokestatic java.lang.StringBuffer access$5(FR.inria.duck.util.Exec)
45: iload 1
45: i2c
45: invokevirtual java.lang.StringBuffer append(char)
45: pop
46: aload 0
46: getfield FR.inria.duck.util.Exec this$0
46: invokestatic FR.inria.duck.util.Exec. Runnable access$7(FR.inria.duck.ut
il.Exec)
46: ifnull $43:
47: aload 0
47: getfield FR.inria.duck.util.Exec this$0
47: invokestatic FR.inria.duck.util.Exec. Runnable access$7(FR.inria.duck.ut
il.Exec)
47: aconst_null
47: aload 0
47: getfield FR.inria.duck.util.Exec this$0
47: invokestatic java.lang.StringBuffer access$5(FR.inria.duck.util.Exec)
47: invokeinterface void run(java.lang.Integer, java.lang.StringBuffer)
$43:
44: aload 0
44: getfield FR.inria.duck.util.Exec this$0
44: invokestatic FR.inria.duck.util.Exec. Wait access$3(FR.inria.duck.util.E
xec)
44: invokevirtual boolean isAlive()
44: ifeq $42:
44: aload 2
44: invokevirtual int read()
44: dup
44: istore 1
44: iconst_m1 -1
44: if_icmpne $44:
$42:
49: aload 2
49: invokevirtual void close()
50: aload 0
50: getfield FR.inria.duck.util.Exec this$0
50: invokestatic java.lang.Process access$1(FR.inria.duck.util.Exec)
50: invokevirtual int exitValue()
50: ifeq $47:
51: aload 0
51: getfield FR.inria.duck.util.Exec this$0
51: invokestatic java.lang.StringBuffer access$5(FR.inria.duck.util.Exec)
51: new class java.lang.StringBuffer
51: dup
51: ldc "
Error in Exec: Exit Value = "
51: invokespecial java.lang.StringBuffer(java.lang.String)
52: aload 0
52: getfield FR.inria.duck.util.Exec this$0
52: invokestatic java.lang.Process access$1(FR.inria.duck.util.Exec)
52: invokevirtual int exitValue()
52: invokevirtual java.lang.StringBuffer append(int)
52: ldc "
"
52: invokevirtual java.lang.StringBuffer append(java.lang.String)
52: invokevirtual java.lang.String toString()
51: invokevirtual java.lang.StringBuffer append(java.lang.String)
51: pop
53: aload 0
53: getfield FR.inria.duck.util.Exec this$0
53: invokestatic java.lang.Process access$1(FR.inria.duck.util.Exec)
53: invokevirtual java.io.InputStream getErrorStream()
53: astore 3
54: goto $49:
$50:
55: aload 0
55: getfield FR.inria.duck.util.Exec this$0
55: invokestatic java.lang.StringBuffer access$5(FR.inria.duck.util.Exec)
55: iload 1
55: i2c
55: invokevirtual java.lang.StringBuffer append(char)
55: pop
$49:
54: aload 3
54: invokevirtual int read()
54: dup
54: istore 1
54: iconst_m1 -1
54: if_icmpne $50:
56: aload 3
56: invokevirtual void close()
$47:
58: aload 0
58: getfield FR.inria.duck.util.Exec this$0
58: invokestatic FR.inria.duck.util.Exec. Runnable access$7(FR.inria.duck.ut
il.Exec)
58: ifnull $39:
59: aload 0
59: getfield FR.inria.duck.util.Exec this$0
59: invokestatic FR.inria.duck.util.Exec. Runnable access$7(FR.inria.duck.ut
il.Exec)
59: new class java.lang.Integer
59: dup
59: aload 0
59: getfield FR.inria.duck.util.Exec this$0
59: invokestatic java.lang.Process access$1(FR.inria.duck.util.Exec)
59: invokevirtual int exitValue()
59: invokespecial java.lang.Integer(int)
59: aload 0
59: getfield FR.inria.duck.util.Exec this$0
59: invokestatic java.lang.StringBuffer access$5(FR.inria.duck.util.Exec)
59: invokeinterface void run(java.lang.Integer, java.lang.StringBuffer)
$40:
38: return
$41:
60: astore 1
61: aload 0
61: getfield FR.inria.duck.util.Exec this$0
61: invokestatic java.lang.StringBuffer access$5(FR.inria.duck.util.Exec)
61: ifnonnull $52:
62: aload 0
62: getfield FR.inria.duck.util.Exec this$0
62: new class java.lang.StringBuffer
62: dup
62: invokespecial java.lang.StringBuffer()
62: invokestatic void access$6(FR.inria.duck.util.Exec, java.lang.StringBuff
er)
$52:
63: aload 0
63: getfield FR.inria.duck.util.Exec this$0
63: invokestatic java.lang.StringBuffer access$5(FR.inria.duck.util.Exec)
63: new class java.lang.StringBuffer
63: dup
63: ldc "Error in Exec: "
63: invokespecial java.lang.StringBuffer(java.lang.String)
63: aload 1
63: invokevirtual java.lang.String getMessage()
63: invokevirtual java.lang.StringBuffer append(java.lang.String)
63: invokevirtual java.lang.String toString()
63: invokevirtual java.lang.StringBuffer append(java.lang.String)
63: pop
$39:
37: return
sun.tools.java.CompilerError: stack under flow: 40: invokevirtual void start
() = -1
at sun.tools.asm.Assembler.balance(Assembler.java)
at sun.tools.asm.Assembler.write(Assembler.java)
at sun.tools.javac.SourceClass.compileClass(SourceClass.java)
at sun.tools.javac.SourceClass.compile(SourceClass.java)
at sun.tools.javac.Main.compile(Main.java)
at sun.tools.javac.Main.main(Main.java)
error: An error has occurred in the compiler; please file a bug report (http://j
ava.sun.com/cgi-bin/bugreport.cgi).
1 error
-----> THIS MAY HELP YOU:
The bug diseapears if the line 40 :
// (waitFor = new WaitFor()).start();
is escaped by a //.
(Review ID: 36748)
======================================================================
- duplicates
-
JDK-4098316 Stack underflow on inner class chained assignments
-
- Closed
-