1 package com.tapina.robe.swi.clib.stdlib; 2 3 import com.tapina.robe.runtime.CodeBlock; 4 import com.tapina.robe.runtime.DecoderException; 5 import com.tapina.robe.runtime.Environment; 6 import com.tapina.robe.swi.clib.Stub; 7 8 import java.util.Iterator; 9 import java.util.LinkedList; 10 import java.util.List; 11 12 /*** 13 * This function causes the program to terminate normally, returning status to the host environment. 14 * Status should be zero (EXIT_SUCCESS), or EXIT_FAILURE. 15 */ 16 public class Exit extends Stub { 17 private static class ExitHandlerList extends ThreadLocal { 18 protected Object initialValue() { 19 return new LinkedList(); 20 } 21 public List getList() { 22 return (List) get(); 23 } 24 } 25 private final static ExitHandlerList exitHandlerList = new ExitHandlerList(); 26 27 public void executeStub(Environment environment) { 28 final List exitHandlers = exitHandlerList.getList(); 29 for (Iterator iterator = exitHandlers.iterator(); iterator.hasNext();) { 30 CodeBlock codeBlock = (CodeBlock) iterator.next(); 31 try { 32 environment.getCpu().setPC(codeBlock.getAddress() + 8); 33 codeBlock.execute(environment); 34 } catch (DecoderException e) { 35 throw new RuntimeException(e); 36 } 37 } 38 System.exit(environment.getCpu().R[0]); 39 } 40 41 public static void registerExitHandler(CodeBlock atexit) { 42 exitHandlerList.getList().add(atexit); 43 } 44 }