Sha256: ff0569baa45de8e86a1b5f02ce37b23b418df15ab988bd152c0ae75ec0e9ae3e

Contents?: true

Size: 1.94 KB

Versions: 135

Compression:

Stored size: 1.94 KB

Contents

/** 
 * Copyright 2005-2007 Ye Zheng
 * Distributed under the BSD License
 */

package com.xruby.runtime.lang;

class MethodCache {
	private static int CACHE_SIZE = 0x800;
	private static int CACHE_MASK = 0x7ff;
	
	private CacheEntry[] cache = clearCache();
	
	public void reset() {
		if (!RubyRuntime.running) {
			return;
		}
		
		for (int i = 0; i < CACHE_SIZE; i++) {
			cache[i].klass = null;
			cache[i].mid = null;
			cache[i].method = null;
		}
	}
	
	private CacheEntry[] clearCache() {
		CacheEntry[] cache = new CacheEntry[CACHE_SIZE];
		for (int i = 0; i < CACHE_SIZE; i++) {
			cache[i] = new CacheEntry();
			cache[i].klass = null;
			cache[i].mid = null;
			cache[i].method = null;
		}
		
		return cache;
	}
	
	private int cacheIndex(RubyClass c, RubyID id) {		
		return (((c.objectAddress() >> 3) ^ ((int)id.getId())) & CACHE_MASK);
	}
	
	public CacheEntry getMethod(RubyClass c, RubyID id) {		
		int index = cacheIndex(c, id);
		return cache[index];
	}
	
	public void putMethod(RubyClass c, RubyID id, RubyMethod m) {
		int index = cacheIndex(c, id);
		
		cache[index].klass = c;
		cache[index].mid = id;
		cache[index].method = m;
	}
	
	public void removeMethod(RubyClass c, RubyID id) {
		if (!RubyRuntime.running) {
			return;
		}
		
		for (CacheEntry entry : cache) {
			if (entry.mid == id && entry.klass == c) {
				// FIXME: method table should be compared
				entry.mid = null;
			}
		}
	}
	
	public void removeMethod(RubyID id) {
		if (!RubyRuntime.running) {
			return;
		}
		
		for (CacheEntry entry : cache) {
			if (entry.mid == id) {
				entry.mid = null;
			}
		}
	}
	
	public void removeClass(RubyClass c) {
		if (!RubyRuntime.running) {
			return;
		}
		
		for (CacheEntry entry : cache) {
			if (entry.klass == c) {
				entry.mid = null;
			}
		}
	}
	
	static class CacheEntry {
		public RubyClass klass;
		public RubyID mid;
		public RubyMethod method;
	}
}

Version data entries

135 entries across 135 versions & 2 rubygems

Version Path
rhodes-2.0.0.beta7 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-2.0.0.beta6 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-2.0.0.beta4 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-2.0.0.beta3 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-1.5.5 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-2.0.0.beta2 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-2.0.0.beta1 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-1.5.4 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-1.5.3 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-1.5.2 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-1.5.1 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-1.5.0 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-1.4.2 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-1.4.1 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java
rhodes-1.4.0 platform/shared/xruby/src/com/xruby/runtime/lang/MethodCache.java