00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 # include "incls/_precompiled.incl"
00026 # include "incls/_delta.cpp.incl"
00027
00028
00029
00030 DeltaCallCache* DeltaCallCache::_root = NULL;
00031
00032
00033 DeltaCallCache::DeltaCallCache() {
00034 _link = _root;
00035 _root = this;
00036 clear();
00037 }
00038
00039
00040 void DeltaCallCache::clear() {
00041 _key.clear();
00042 _result.clear();
00043 }
00044
00045
00046 void DeltaCallCache::clearAll() {
00047 DeltaCallCache* p = _root;
00048 while (p != NULL) {
00049 p->clear();
00050 p = p->_link;
00051 }
00052 }
00053
00054
00055
00056
00057 extern "C" oop call_delta(void* method, oop receiver, int nofArgs, oop* args);
00058
00059 oop Delta::call_generic(DeltaCallCache* ic, oop receiver, oop selector, int nofArgs, oop* args) {
00060 if (ic->match(receiver->klass(), symbolOop(selector))) {
00061
00062 jumpTableEntry* entry = ic->result().entry();
00063 if (entry != NULL && entry->method()->isZombie()) {
00064
00065 LookupResult result = ic->lookup(receiver->klass(), symbolOop(selector));
00066 if (result.is_empty()) fatal("lookup failure - not treated");
00067 return call_delta(result.value(), receiver, nofArgs, args);
00068 }
00069 return call_delta(ic->result().value(), receiver, nofArgs, args);
00070 }
00071
00072 if (!selector->is_symbol())
00073 return markSymbol(vmSymbols::second_argument_has_wrong_type());
00074
00075 LookupResult result = ic->lookup(receiver->klass(), symbolOop(selector));
00076 if (result.is_empty()) fatal("lookup failure - not treated");
00077 return call_delta(result.value(), receiver, nofArgs, args);
00078 }
00079
00080 oop Delta::call(oop receiver, oop selector) {
00081 static DeltaCallCache cache;
00082 return call_generic(&cache, receiver, selector, 0, NULL);
00083 }
00084
00085 oop Delta::call(oop receiver, oop selector, oop arg1) {
00086 static DeltaCallCache cache;
00087 return call_generic(&cache, receiver, selector, 1, &arg1);
00088 }
00089
00090 oop Delta::call(oop receiver, oop selector, oop arg1, oop arg2) {
00091 static DeltaCallCache cache;
00092 return call_generic(&cache, receiver, selector, 2, &arg1);
00093 }
00094
00095 oop Delta::call(oop receiver, oop selector, oop arg1, oop arg2, oop arg3) {
00096 static DeltaCallCache cache;
00097 return call_generic(&cache, receiver, selector, 3, &arg1);
00098 }
00099
00100 oop Delta::call(oop receiver, oop selector, objArrayOop args) {
00101 static DeltaCallCache cache;
00102 return call_generic(&cache, receiver, selector, args->length(), args->objs(1));
00103 }