From: <js...@us...> - 2010-11-29 02:39:32
|
Revision: 6472 http://exult.svn.sourceforge.net/exult/?rev=6472&view=rev Author: jsf Date: 2010-11-29 02:39:25 +0000 (Mon, 29 Nov 2010) Log Message: ----------- Writing usecode interpreter Modified Paths: -------------- ExultAndroid/src/com/exult/android/UsecodeMachine.java ExultAndroid/src/com/exult/android/UsecodeValue.java Modified: ExultAndroid/src/com/exult/android/UsecodeMachine.java =================================================================== --- ExultAndroid/src/com/exult/android/UsecodeMachine.java 2010-11-28 22:04:22 UTC (rev 6471) +++ ExultAndroid/src/com/exult/android/UsecodeMachine.java 2010-11-29 02:39:25 UTC (rev 6472) @@ -267,7 +267,7 @@ { UsecodeValue val1 = pop(); UsecodeValue val2 = pop(); - pushi(!(val1.eq(val2)) ? 1 : 0); + pushi(!(val1 == val2 || val1.eq(val2)) ? 1 : 0); break; } case 0x1c: // ADDSI. @@ -341,7 +341,7 @@ { UsecodeValue val1 = pop(); UsecodeValue val2 = pop(); - pushi(val1.eq(val2) ? 1 : 0); + pushi(val1 == val2 || val1.eq(val2) ? 1 : 0); break; } case 0x24: // CALL. @@ -435,7 +435,6 @@ } case 0x2d: // RET. (Return from function) { - // ++++ Testing. show_pending_text(); UsecodeValue r = pop(); @@ -762,16 +761,21 @@ case 0x5E: // Set class member array element. { UsecodeValue arr; + offset = (short)EUtil.Read2(frame.fcode, frame.ip); + short index = (short)popi(); + index--; // It's 1-based. + UsecodeValue val = pop(); if (opcode == 0x46) { - offset = (short)EUtil.Read2(frame.fcode, frame.ip); + // Get # of local array. if (offset < 0 || offset >= num_locals) { //LOCAL_VAR_ERROR(offset); break; } - arr = frame.locals[offset]; + frame.locals[offset] = + frame.locals[offset].putElem(index, val); + /* ++++++MAYBE LATER } else if (opcode == 0x5e) { - offset = (short)EUtil.Read2(frame.fcode, frame.ip); UsecodeValue ths = frame.getThis(); if (offset < 0 || offset >= ths.getClassVarCount()) { //cerr << "Class variable #" << (offset) << " out of range!";\ @@ -779,35 +783,29 @@ break; } arr = ths.nthClassVar(offset); + */ } else { - offset = (short)EUtil.Read2(frame.fcode, frame.ip); if (offset < 0) {// Global static. - if ((-offset) < statics.size()) - arr = statics.elementAt(-offset); - else { + if ((-offset) < statics.size()) { + arr = statics.elementAt(-offset).putElem(index, val); + statics.setElementAt(arr, -offset); + } else { //cerr << "Global static variable #" << (offset) << " out of range!";\ //CERR_CURRENT_IP(); break; } } else { - if (offset < frame.function.statics.size()) + if (offset < frame.function.statics.size()) { arr = frame.function.statics.elementAt(offset); - else { + arr = arr.putElem(index, val); + frame.function.statics.setElementAt(arr, offset); + } else { //cerr << "Local static variable #" << (offset) << " out of range!";\ //CERR_CURRENT_IP(); break; } } } - short index = (short)popi(); - index--; // It's 1-based. - UsecodeValue val = pop(); - int size = arr.getArraySize(); - /* +++++++++FINISH CREATE new value and STORE BACK!! - if (index >= 0 && - (index < size || arr.resize(index + 1))) - arr.put_elem(index, val); - */ break; } case 0x47: // CALLE. Stack has caller_item. @@ -827,7 +825,6 @@ case 0x48: // PUSH EVENTID. pushi(frame.eventid); break; - /* case 0x4a: // ARRA. { UsecodeValue val = pop(); @@ -843,6 +840,7 @@ frame.line_number = EUtil.Read2(frame.fcode, frame.ip); break; } + /* case 0x4d: // debugging opcode from spanish SI (function init) case 0xcd: // 32 bit debugging function init { @@ -932,37 +930,37 @@ cout << endl; break; } + */ case 0x50: // PUSH static. - offset = (sint16)EUtil.Read2(frame.fcode, frame.ip); + offset = (short)EUtil.Read2(frame.fcode, frame.ip); if (offset < 0) {// Global static. - if ((unsigned)(-offset) < statics.size()) - push(statics[-offset]); + if ((-offset) < statics.size()) + push(statics.elementAt(-offset)); else pushi(0); } else { - if ((unsigned)offset < frame.function.statics.size()) - push(frame.function.statics[offset]); + if (offset < frame.function.statics.size()) + push(frame.function.statics.elementAt(offset)); else pushi(0); } break; case 0x51: // POP static. { - offset = (sint16)EUtil.Read2(frame.fcode, frame.ip); + offset = (short)EUtil.Read2(frame.fcode, frame.ip); // Get value. UsecodeValue val = pop(); if (offset < 0) { - if ((unsigned)(-offset) >= statics.size()) - statics.resize(-offset + 1); - statics[-offset] = val; + if ((-offset) >= statics.size()) + statics.setSize(-offset + 1); + statics.setElementAt(val, -offset); } else { - if ((unsigned)offset >= frame.function.statics.size()) - frame.function.statics.resize(offset + 1); - frame.function.statics[offset]=val; + if (offset >= frame.function.statics.size()) + frame.function.statics.setSize(offset + 1); + frame.function.statics.setElementAt(val, offset);; } } break; - */ case 0x52: // CALLO (call original). { // Otherwise, like CALLE. UsecodeValue ival = pop(); Modified: ExultAndroid/src/com/exult/android/UsecodeValue.java =================================================================== --- ExultAndroid/src/com/exult/android/UsecodeValue.java 2010-11-28 22:04:22 UTC (rev 6471) +++ ExultAndroid/src/com/exult/android/UsecodeValue.java 2010-11-29 02:39:25 UTC (rev 6472) @@ -37,6 +37,16 @@ public int findElem(UsecodeValue val) { return -1; } + public UsecodeValue putElem(int index, UsecodeValue val) { + return this; + } + // Append array or value to end. + public UsecodeValue concat(UsecodeValue val) { + if (val instanceof ArrayValue) + return ((ArrayValue)val).insert(this); + else + return new ArrayValue(this, val); + } public UsecodeValue plus(UsecodeValue v2) { return new IntValue(0); // This is undefined for plus. } @@ -125,9 +135,16 @@ } public final static class ArrayValue extends UsecodeValue { private UsecodeValue elems[]; + private ArrayValue(UsecodeValue e[]) { + elems = e; + } public ArrayValue(Vector<UsecodeValue> vals) { elems = vals.toArray(elems); } + public ArrayValue(UsecodeValue v0, UsecodeValue v1) { + elems = new UsecodeValue[2]; + elems[0] = v0; elems[1] = v1; + } public int needIntValue() { return elems.length > 0 ? elems[0].needIntValue() : 0; } @@ -153,6 +170,36 @@ return (i); return (-1); } + public UsecodeValue putElem(int ind, UsecodeValue val) { + if (ind >= 0) { + int newcnt = ind >= elems.length ? ind + 1 : elems.length; + UsecodeValue newelems[] = new UsecodeValue[newcnt]; + System.arraycopy(elems, 0, newelems, 0, elems.length); + elems[ind] = val; + return new ArrayValue(elems); + } else + return this; + } + // Append array or value to end. + public UsecodeValue concat(UsecodeValue val) { + if (val instanceof ArrayValue) { + ArrayValue arr2 = (ArrayValue) val; + UsecodeValue newelems[] = + new UsecodeValue[elems.length + arr2.elems.length]; + System.arraycopy(elems, 0, newelems, 0, elems.length); + System.arraycopy(arr2.elems, 0, newelems, elems.length, + arr2.elems.length); + return new ArrayValue(newelems); + } else + return putElem(elems.length, val); + } + // Insert into front. + public final UsecodeValue insert(UsecodeValue val) { + UsecodeValue newelems[] = new UsecodeValue[elems.length + 1]; + newelems[0] = val; + System.arraycopy(elems, 0, newelems, 1, elems.length); + return new ArrayValue(newelems); + } public boolean eq(UsecodeValue v2) { if (v2 instanceof ArrayValue) { ArrayValue arr2 = (ArrayValue) v2; @@ -168,7 +215,7 @@ } else return v2.eq(this); } - // Add values to end, and return # added. + // Add values to end of a vector. public final static void addValues(Vector<UsecodeValue>vals, UsecodeValue val2) { if (val2 instanceof ArrayValue) { ArrayValue arr2 = (ArrayValue) val2; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |