/*
* This file is part of the Jikes RVM project (http://jikesrvm.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
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.mmtk.harness.lang;
import org.mmtk.harness.Harness;
import org.mmtk.harness.Mutator;
import org.mmtk.harness.lang.runtime.ObjectValue;
import org.mmtk.harness.lang.runtime.PhantomReferenceValue;
import org.mmtk.harness.lang.runtime.SoftReferenceValue;
import org.mmtk.harness.lang.runtime.WeakReferenceValue;
import org.mmtk.harness.scheduler.Scheduler;
import org.mmtk.vm.Collection;
import org.mmtk.vm.VM;
/**************************************************************************
*
* "built in" intrinsic functions
*
*/
public class Intrinsics {
/**
* Force GC
* @param env Thread-local environment (language-dependent mutator context)
*/
public static void gc(Env env) {
VM.collection.triggerCollection(Collection.EXTERNAL_GC_TRIGGER);
}
/**
* Return the thread ID
* @param env Thread-local environment (language-dependent mutator context)
* @return the thread ID
*/
public static int threadId(Env env) {
return Mutator.current().getContext().getId();
}
/**
* Return the (identity) hash code
* @param env Thread-local environment (language-dependent mutator context)
* @param val The object to hash
* @return the (identity) hash code
*/
public static int hash(Env env, ObjectValue val) {
return env.hash(val.getObjectValue());
}
/**
* Set the random number generator seed for this thread
* @param env Thread-local environment (language-dependent mutator context)
* @param seed Pseudo-random seed value
*/
public static void setRandomSeed(Env env, int seed) {
env.random().setSeed(seed);
}
/**
* A random integer in the closed interval [low..high].
* @param env Thread-local environment (language-dependent mutator context)
* @param low Low bound (inclusive)
* @param high High bound (inclusive)
* @return A random integer in the closed interval [low..high]
*/
public static int random(Env env, int low, int high) {
return env.random().nextInt(high-low+1) + low;
}
/**
* Dump the heap
* @param env Thread-local environment (language-dependent mutator context)
*/
public static void heapDump(Env env) {
Mutator.dumpHeap();
}
/**
* Unit test method for the Intrinsic method
*
* @param env Thread-local environment (language-dependent mutator context)
* @param x An int
* @param y A boolean
* @param string A string
* @param val An object
* @return The string representation of <code>val</code>
*/
public static String testMethod(Env env, int x, boolean y, String string, ObjectValue val) {
return String.format("successfully called testMethod(%d,%b,%s,%s)", x,y,string,val.toString());
}
/**
* @param env Thread-local environment (language-dependent mutator context)
* @param referent The object to weakly refer to
* @return The created weak reference value
*
*/
public static WeakReferenceValue weakRef(Env env, ObjectValue referent) {
return new WeakReferenceValue(referent.getObjectValue());
}
/**
* @param env Thread-local environment (language-dependent mutator context)
* @param referent The object to weakly refer to
* @return The created weak reference value
*
*/
public static SoftReferenceValue softRef(Env env, ObjectValue referent) {
return new SoftReferenceValue(referent.getObjectValue());
}
/**
* @param env Thread-local environment (language-dependent mutator context)
* @param referent The object to weakly refer to
* @return The created weak reference value
*
*/
public static PhantomReferenceValue phantomRef(Env env, ObjectValue referent) {
return new PhantomReferenceValue(referent.getObjectValue());
}
/**
* Dereference a reference type
* @param env Thread-local environment (language-dependent mutator context)
* @param value The reference value
* @return The referent
*/
public static ObjectValue getReferent(Env env, WeakReferenceValue value) {
return new ObjectValue(value.getObjectValue());
}
/**
* Dereference a reference type
* @param env Thread-local environment (language-dependent mutator context)
* @param value The reference value
* @return The referent
*/
public static ObjectValue getReferent(Env env, SoftReferenceValue value) {
return new ObjectValue(value.getObjectValue());
}
/**
* Dereference a reference type
* @param env Thread-local environment (language-dependent mutator context)
* @param value The reference value
* @return The referent
*/
public static ObjectValue getReferent(Env env, PhantomReferenceValue value) {
return new ObjectValue(value.getObjectValue());
}
/**
* Set a command-line option from within a script
* @param env Thread-local environment (language-dependent mutator context)
* @param option The command-line option
*/
public static void setOption(Env env, String option) {
if (!Harness.options.process(option)) {
System.err.println("Error processing option "+option);
}
}
/**
* A synchronization barrier for script-language threads
* @param env
* @param name
* @param threadCount
* @return
*/
public static int barrierWait(Env env, String name, int threadCount) {
return Scheduler.mutatorRendezvous(name, threadCount);
}
}