1 cananian 1.1.2.1 // Data.java, created Wed Sep 8 16:13:24 1999 by cananian 2 cananian 1.1.2.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.2.1 package harpoon.Backend.Runtime1; 5 cananian 1.1.2.1 6 cananian 1.1.2.1 import harpoon.Backend.Generic.Frame; 7 cananian 1.1.2.1 import harpoon.ClassFile.HClass; 8 cananian 1.1.2.1 import harpoon.ClassFile.HDataElement; 9 cananian 1.1.2.7 import harpoon.ClassFile.Linker; 10 cananian 1.1.2.1 import harpoon.IR.Tree.Exp; 11 cananian 1.1.2.5 import harpoon.IR.Tree.Stm; 12 cananian 1.1.2.5 import harpoon.IR.Tree.CONST; 13 cananian 1.1.2.6 import harpoon.IR.Tree.DATUM; 14 cananian 1.1.2.1 import harpoon.IR.Tree.NAME; 15 cananian 1.1.2.1 import harpoon.IR.Tree.Tree; 16 cananian 1.1.2.3 import harpoon.IR.Tree.Type; 17 cananian 1.1.2.1 import harpoon.Temp.Label; 18 cananian 1.1.2.1 19 cananian 1.1.2.1 import java.util.ArrayList; 20 cananian 1.1.2.5 import java.util.List; 21 cananian 1.1.2.1 /** 22 cananian 1.1.2.4 * <code>Data</code> is an abstract superclass with handy useful methods 23 cananian 1.1.2.4 * for the <code>harpoon.IR.Tree.Data</code> subclasses in 24 cananian 1.1.2.4 * <code>Runtime1</code>. 25 cananian 1.1.2.1 * 26 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 27 cananian 1.3 * @version $Id: Data.java,v 1.3 2002/04/10 03:03:20 cananian Exp $ 28 cananian 1.1.2.1 */ 29 cananian 1.1.2.1 public class Data extends harpoon.IR.Tree.Data { 30 cananian 1.1.2.7 final Linker linker; 31 cananian 1.1.2.1 final HClass hc; 32 wbeebee 1.1.2.8 // All subclasses should be able to set this. 33 wbeebee 1.1.2.8 protected HDataElement root = null; 34 cananian 1.1.2.1 35 cananian 1.1.2.1 /** Creates a <code>Data</code>. */ 36 wbeebee 1.1.2.8 protected Data(String desc, HClass hc, Frame f) { 37 cananian 1.1.2.1 super(desc, f); 38 cananian 1.1.2.7 this.linker = f.getLinker(); 39 cananian 1.1.2.1 this.hc = hc; 40 cananian 1.1.2.1 } 41 cananian 1.1.2.1 public HClass getHClass() { return hc; } 42 cananian 1.1.2.1 public HDataElement getRootElement() { return root; } 43 cananian 1.1.2.2 44 cananian 1.1.2.2 public int hashCode() { return hc.hashCode() ^ desc.hashCode(); } 45 cananian 1.1.2.1 46 cananian 1.1.2.1 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* 47 cananian 1.1.2.1 * * 48 cananian 1.1.2.1 * Utility methods * 49 cananian 1.1.2.1 * * 50 cananian 1.1.2.1 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 51 cananian 1.1.2.1 52 cananian 1.2.2.1 protected DATUM _DATUM(Exp e) { 53 cananian 1.1.2.6 return new DATUM(tf, null, e); 54 cananian 1.1.2.1 } 55 cananian 1.1.2.1 56 cananian 1.2.2.1 protected DATUM _DATUM(Label l) { 57 cananian 1.1.2.6 return new DATUM(tf,null,new NAME(tf,null,l)); 58 cananian 1.1.2.5 } 59 cananian 1.1.2.5 60 cananian 1.1.2.5 // UTF-8 handling methods ----------------------------------- 61 cananian 1.1.2.5 62 cananian 1.1.2.5 /** Make a java-style UTF-8 encoded byte array for a string. */ 63 cananian 1.1.2.5 public static byte[] toUTF8(String str) { 64 cananian 1.1.2.5 // first count how many bytes we'll need. 65 cananian 1.1.2.5 int len=0; 66 cananian 1.1.2.5 for (int i=0; i<str.length(); i++) { 67 cananian 1.1.2.5 int c = (int) str.charAt(i); 68 cananian 1.1.2.5 if (c >= 0x0001 && c <= 0x007f) len+=1; // one byte format 69 cananian 1.1.2.5 else if (c == 0 || (c >= 0x0080 && c <= 0x07FF)) len+=2; //two byte 70 cananian 1.1.2.5 else len += 3; // three byte format. 71 cananian 1.1.2.5 } 72 cananian 1.1.2.5 // allocate byte array for result. 73 cananian 1.1.2.5 byte[] r = new byte[len]; 74 cananian 1.1.2.5 // now make the UTF-8 encoding. 75 cananian 1.1.2.5 len=0; 76 cananian 1.1.2.5 for (int i=0; i<str.length(); i++) { 77 cananian 1.1.2.5 int c = (int) str.charAt(i); 78 cananian 1.1.2.5 if (c >= 0x0001 && c <= 0x007f) { // one byte format 79 cananian 1.1.2.5 r[len++] = (byte) c; 80 cananian 1.1.2.5 } else if (c == 0 || (c >= 0x0080 && c <= 0x07FF)) { // two byte 81 cananian 1.1.2.5 r[len++] = (byte) (0xC0 | (c>>>6)); 82 cananian 1.1.2.5 r[len++] = (byte) (0x80 | (c & 0x3F)); 83 cananian 1.1.2.5 } else { // three byte format 84 cananian 1.1.2.5 r[len++] = (byte) (0xE0 | (c>>>12)); 85 cananian 1.1.2.5 r[len++] = (byte) (0x80 | ((c>>>6) & 0x3F)); 86 cananian 1.1.2.5 r[len++] = (byte) (0x80 | (c & 0x3F)); 87 cananian 1.1.2.5 } 88 cananian 1.1.2.5 } 89 cananian 1.1.2.5 // okay, done. 90 cananian 1.1.2.5 return r; 91 cananian 1.1.2.5 } 92 cananian 1.1.2.5 93 cananian 1.1.2.5 /* Return a <code>Stm</code> representing a string constant in UTF-8 94 cananian 1.1.2.5 * encoded form. */ 95 cananian 1.1.2.5 protected Stm emitUtf8String(String str) { 96 cananian 1.1.2.5 byte[] bytes = toUTF8(str); 97 cananian 1.1.2.5 List stmlist = new ArrayList(bytes.length+1); 98 cananian 1.1.2.5 for (int i=0; i<bytes.length; i++) 99 cananian 1.1.2.6 stmlist.add(_DATUM(new CONST(tf, null, 8, false, 100 cananian 1.1.2.5 ((int)bytes[i])&0xFF))); 101 cananian 1.1.2.5 // null-terminate the string. 102 cananian 1.1.2.6 stmlist.add(_DATUM(new CONST(tf, null, 8, false, 0))); 103 cananian 1.1.2.5 return Stm.toStm(stmlist); 104 cananian 1.1.2.1 } 105 cananian 1.2 }