variables.java
来自「linux下建立JAVA虚拟机的源码KAFFE」· Java 代码 · 共 138 行
JAVA
138 行
/* Variables.java -- Copyright (c) 2004, 2005 Free Software Foundation, Inc.This file is part of GNU Classpath.GNU Classpath is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU Classpath is distributed in the hope that it will be useful, butWITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNUGeneral Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU Classpath; see the file COPYING. If not, write to theFree Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307 USA. */package gnu.classpath.tools.rmi.rmic;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;class Variables{ private final HashSet free = new HashSet(); private final HashMap names = new HashMap(); private final HashSet wides = new HashSet(); private final HashSet declared = new HashSet(); private boolean allocated = false; public void declare(Object name) { declare(name, 1); } public void declareWide(Object name) { declare(name, 2); } public void declare(Object name, int size) { if (allocated) throw new IllegalStateException("cannot declare after allocating"); if (size != 1 && size != 2) throw new IllegalArgumentException("size must be 1 or 2"); if (names.containsKey(name)) throw new IllegalStateException("already allocated " + name); allocateNew(name, size); declared.add(name); } private int allocateNew(Object name, int size) { // total allocation size is first unallocated slot int i = free.size() + names.size() + wides.size(); names.put(name, new Integer(i)); if (size == 2) wides.add(name); return i; } public int allocate(Object name) { return allocate(name, 1); } public int allocateWide(Object name) { return allocate(name, 2); } public int allocate(Object name, int size) { allocated = true; if (size != 1 && size != 2) throw new IllegalArgumentException("size must be 1 or 2"); if (names.containsKey(name)) throw new IllegalStateException("already allocated " + name); if (size == 2) { // look for consecutive free slots for (Iterator it = free.iterator(); it.hasNext(); ) { Integer i = (Integer) it.next(); Integer next = new Integer(i.intValue() + 1); if (free.contains(next)) { free.remove(i); free.remove(next); wides.add(name); names.put(name, i); return i.intValue(); } } } else if (free.size() > 0) { Integer i = (Integer) free.iterator().next(); free.remove(i); names.put(name, i); return i.intValue(); } return allocateNew(name, size); } public int deallocate(Object name) { if (! names.containsKey(name)) throw new IllegalArgumentException("no variable " + name); if (declared.contains(name)) throw new IllegalStateException(name + " can't be deallocated"); Integer i = (Integer) names.get(name); names.remove(name); free.add(i); if (wides.remove(name)) free.add(new Integer(i.intValue() + 1)); return i.intValue(); } public int get(Object name) { if (! names.containsKey(name)) throw new IllegalArgumentException("no variable " + name); return ((Integer) names.get(name)).intValue(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?