javap/src/main/java/org/apidesign/javap/Hashtable.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 13 Dec 2012 23:20:47 +0100
changeset 316 8da329789435
parent 167 77f7135b6eb1
child 377 1295e596fd35
permissions -rw-r--r--
Providing JavaScript specific implementations of Hashtable and Vector. Those should likely be faster for the JavaScript VM than interpreting bytecode. This is the way to get the best of JavaScript and yet provide reasonably well working implementation in Java.
     1 /*
     2  * To change this template, choose Tools | Templates
     3  * and open the template in the editor.
     4  */
     5 package org.apidesign.javap;
     6 
     7 import org.apidesign.bck2brwsr.core.JavaScriptBody;
     8 
     9 /** A JavaScript optimized replacement for Hashtable.
    10  *
    11  * @author Jaroslav Tulach <jtulach@netbeans.org>
    12  */
    13 final class Hashtable {
    14     private Object[] keys;
    15     private Object[] values;
    16 
    17     Hashtable(int i) {
    18         this();
    19     }
    20 
    21     Hashtable(int i, double d) {
    22         this();
    23     }
    24 
    25     Hashtable() {
    26     }
    27 
    28     @JavaScriptBody(args = { "self", "key", "val" }, body = 
    29         "self[key] = val;"
    30     )
    31     synchronized void put(Object key, Object val) {
    32         int[] where = { -1, -1 };
    33         Object found = get(key, where);
    34         if (where[0] != -1) {
    35             // key exists
    36             values[where[0]] = val;
    37         } else {
    38             if (where[1] != -1) {
    39                 // null found
    40                 keys[where[1]] = key;
    41                 values[where[1]] = val;
    42             } else {
    43                 if (keys == null) {
    44                     keys = new Object[11];
    45                     values = new Object[11];
    46                     keys[0] = key;
    47                     values[0] = val;
    48                 } else {
    49                     Object[] newKeys = new Object[keys.length * 2];
    50                     Object[] newValues = new Object[values.length * 2];
    51                     for (int i = 0; i < keys.length; i++) {
    52                         newKeys[i] = keys[i];
    53                         newValues[i] = values[i];
    54                     }
    55                     newKeys[keys.length] = key;
    56                     newValues[keys.length] = val;
    57                     keys = newKeys;
    58                     values = newValues;
    59                 }
    60             }
    61         }
    62     }
    63 
    64     @JavaScriptBody(args = {"self", "key" }, body = 
    65         "return self[key];"
    66     )
    67     Object get(Object key) {
    68         return get(key, null);
    69     }
    70     private synchronized Object get(Object key, int[] foundAndNull) {
    71         if (keys == null) {
    72             return null;
    73         }
    74         for (int i = 0; i < keys.length; i++) {
    75             if (keys[i] == null) {
    76                 if (foundAndNull != null) {
    77                     foundAndNull[1] = i;
    78                 }
    79             } else if (keys[i].equals(key)) {
    80                 if (foundAndNull != null) {
    81                     foundAndNull[0] = i;
    82                 }
    83                 return values[i];
    84             }
    85         }
    86         return null;
    87     }
    88     
    89 }