1 package com.tapina.robe.runtime.instruction;
2
3 import java.lang.reflect.Method;
4 import java.io.Writer;
5 import java.io.IOException;
6
7 import com.tapina.robe.runtime.*;
8 import com.tapina.robe.swi.SWIDecoder;
9
10 /***
11 * Created by IntelliJ IDEA.
12 * User: gareth
13 * Date: Aug 21, 2003
14 * Time: 6:59:44 PM
15 */
16 public final class SWI extends Instruction {
17 private Method method;
18 private final boolean generateErrors;
19 public static final int X_BIT = 0x20000;
20
21 public SWI(Condition condition, int swiNumber) throws UnknownSWIException {
22 super(condition);
23 this.generateErrors = (swiNumber & X_BIT) == 0;
24 swiNumber &= 0x7dffff;
25 try {
26 this.method = SWIDecoder.decode(swiNumber);
27 } catch (NoSuchMethodException e) {
28 throw new UnknownSWIException(swiNumber);
29 }
30 }
31
32 protected final boolean execute(Environment environment) {
33 environment.dispatchSwi(method, generateErrors);
34 return false;
35 }
36
37 public void dumpJavaSourceUnconditional(Writer out) throws IOException {
38 out.write("env.dispatchSwi(");
39 out.write(method.getClass().getName());
40 out.write(".class.getMethod(\"");
41 out.write(method.getName());
42 out.write("\", SWIHandler.METHOD_PARAMETERS), ");
43 out.write(String.valueOf(generateErrors));
44 out.write(");\n");
45 }
46
47 public final String toString() {
48 final String className = method.getDeclaringClass().getName();
49 return "SWI " + className.substring(className.lastIndexOf('.') + 1) + "." + method.getName();
50 }
51 }