/*
* This file is part of the X10 project (http://x10-lang.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* (C) Copyright IBM Corporation 2006-2010.
*/
package x10.core;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import x10.rtt.RuntimeType;
import x10.rtt.RuntimeType.Variance;
import x10.rtt.Type;
import x10.rtt.Types;
import x10.serialization.X10JavaDeserializer;
import x10.serialization.X10JavaSerializable;
import x10.serialization.X10JavaSerializer;
public class LocalVar<T> extends x10.core.Ref {
private static final long serialVersionUID = 1L;
public static final RuntimeType<LocalVar<?>> $RTT =
x10.rtt.NamedType.<LocalVar<?>> make(
"x10.compiler.LocalVar",
/* base class */ LocalVar.class,
/* variances */ RuntimeType.INVARIANTS(1)
);
public RuntimeType<?> $getRTT() { return $RTT; }
public Type<?> $getParam(int i) { if (i == 0) return T; return null; }
private void writeObject(java.io.ObjectOutputStream oos) throws java.io.IOException {
if (x10.runtime.impl.java.Runtime.TRACE_SER) {
java.lang.System.out.println("Serializer: writeObject(ObjectOutputStream) of " + this + " calling");
}
oos.defaultWriteObject();
}
private static final Map<java.lang.Long, Object> idToObject = new ConcurrentHashMap<java.lang.Long, Object>();
private static final Object nullObject = new Object();
private static AtomicLong lastId = new AtomicLong(0);
private Type<?> T;
private long id;
// constructor just for allocation
public LocalVar(java.lang.System[] $dummy) {
super($dummy);
}
public final LocalVar<T> x10$compiler$LocalVar$$init$S(final Type<?> T, final T local, __0x10$compiler$LocalVar$$T $dummy) {
super.x10$lang$Object$$init$S();
this.T = T;
long temp = lastId.getAndIncrement();
while (idToObject.containsKey(temp)) {
temp = lastId.getAndIncrement();
}
id = temp;
idToObject.put(id, local == null ? nullObject : local);
return this;
}
public LocalVar(final Type<?> T, final T local, __0x10$compiler$LocalVar$$T $dummy) {
super();
this.T = T;
long temp = lastId.getAndIncrement();
while (idToObject.containsKey(temp)) {
temp = lastId.getAndIncrement();
}
id = temp;
idToObject.put(id, local == null ? nullObject : local);
}
// synthetic type for parameter mangling
public abstract static class __0x10$compiler$LocalVar$$T {}
public T $apply$G() {
Object local = idToObject.remove(id);
return (T) (local == nullObject ? null : local);
}
public T get$G() {
Object local = idToObject.get(id);
return (T) (local == nullObject ? null : local);
}
public T set__0x10$compiler$LocalVar$$T$G(final T local) {
idToObject.put(id,local);
return local;
}
final public LocalVar<T> x10$compiler$LocalVar$$x10$compiler$LocalVar$this() {
return LocalVar.this;
}
public static X10JavaSerializable $_deserialize_body(Ref $_obj, X10JavaDeserializer $deserializer) throws java.io.IOException {
return $_obj;
}
public static X10JavaSerializable $_deserializer(X10JavaDeserializer $deserializer) throws java.io.IOException {
LocalVar $_obj = new LocalVar((java.lang.System[]) null);
$deserializer.record_reference($_obj);
return $_deserialize_body($_obj, $deserializer);
}
public void $_serialize(X10JavaSerializer $serializer) throws java.io.IOException {
}
}