/// <exception cref="Kirikiri.Tjs2.TJSException"></exception> /// <exception cref="Kirikiri.Tjs2.VariantException"></exception> private static void GetStringProperty(Variant result, Variant str, Variant member ) { // processes properties toward strings. if (member.IsNumber() != true) { string name = member.GetString(); if (name == null) { ThrowFrom_tjs_error(Error.E_MEMBERNOTFOUND, string.Empty); } if (name.Equals("length")) { // get string length string s = str.AsString(); if (s == null) { result.Set(0); } else { // tTJSVariantString::GetLength can return zero if 'this' is NULL result.Set(s.Length); } return; } else { if (name[0] >= '0' && name[0] <= '9') { string s = str.AsString(); int n = int.Parse(name); int len = s.Length; if (n == len) { result.Set(string.Empty); return; } if (n < 0 || n > len) { throw new TJSException(Error.RangeError); } result.Set(Sharpen.Runtime.Substring(s, n, n + 1)); return; } } ThrowFrom_tjs_error(Error.E_MEMBERNOTFOUND, name); } else { // member.Type() == tvtInteger || member.Type() == tvtReal string s = str.AsString(); int n = member.AsInteger(); int len = s.Length; if (n == len) { result.Set(string.Empty); return; } if (n < 0 || n > len) { throw new TJSException(Error.RangeError); } result.Set(Sharpen.Runtime.Substring(s, n, n + 1)); return; } }
/// <exception cref="Kirikiri.Tjs2.TJSException"></exception> /// <exception cref="Kirikiri.Tjs2.VariantException"></exception> protected internal static void TypeOfMemberIndirect(Variant result, Variant target , Variant member, Dispatch2 objthis, int flags) { if (target.IsObject()) { VariantClosure clo = target.AsObjectClosure(); if (member.IsInteger() != true) { string str = member.AsString(); int hr = clo.PropGet(flags, str, result, clo.mObjThis != null ? clo.mObjThis : objthis ); if (hr == Error.S_OK) { TypeOf(result); } else { if (hr == Error.E_MEMBERNOTFOUND) { result.Set("undefined"); } else { if (hr < 0) { ThrowFrom_tjs_error(hr, str); } } } } else { int hr = clo.PropGetByNum(flags, member.AsInteger(), result, clo.mObjThis != null ? clo.mObjThis : objthis); if (hr == Error.S_OK) { TypeOf(result); } else { if (hr == Error.E_MEMBERNOTFOUND) { result.Set("undefined"); } else { if (hr < 0) { ThrowFrom_tjs_error_num(hr, member.AsInteger()); } } } } } else { if (target.IsString()) { GetStringProperty(result, target, member); TypeOf(result); } else { if (target.IsOctet()) { GetOctetProperty(result, target, member); TypeOf(result); } else { string mes = Error.VariantConvertErrorToObject.Replace("%1", Utils.VariantToReadableString (target)); throw new VariantException(mes); } } } }
/// <exception cref="Kirikiri.Tjs2.TJSException"></exception> /// <exception cref="Kirikiri.Tjs2.VariantException"></exception> private static void GetOctetProperty(Variant result, Variant octet, Variant member ) { // processes properties toward octets. if (member.IsNumber() != true) { string name = member.GetString(); if (name == null) { ThrowFrom_tjs_error(Error.E_MEMBERNOTFOUND, string.Empty); } if (name.Equals("length")) { // get string length ByteBuffer o = octet.AsOctet(); if (o != null) { result.Set(o.Capacity()); } else { result.Set(0); } return; } else { if (name[0] >= '0' && name[0] <= '9') { ByteBuffer o = octet.AsOctet(); int n = int.Parse(name); int len = o != null ? o.Capacity() : 0; if (n < 0 || n >= len) { throw new TJSException(Error.RangeError); } result.Set(o.Get(n)); return; } } ThrowFrom_tjs_error(Error.E_MEMBERNOTFOUND, name); } else { // member.Type() == tvtInteger || member.Type() == tvtReal ByteBuffer o = octet.AsOctet(); int n = member.AsInteger(); int len = o != null ? o.Capacity() : 0; if (n < 0 || n >= len) { throw new TJSException(Error.RangeError); } result.Set(o.Get(n)); return; } }
/// <exception cref="Kirikiri.Tjs2.TJSException"></exception> /// <exception cref="Kirikiri.Tjs2.VariantException"></exception> protected internal static void SetPropertyIndirect(Variant target, Variant member , Variant param, Dispatch2 objthis, int flags) { if (target.IsObject()) { VariantClosure clo = target.AsObjectClosure(); if (member.IsInteger() != true) { string str = member.AsString(); int hr = clo.PropSet(flags, str, param, clo.mObjThis != null ? clo.mObjThis : objthis ); if (hr < 0) { ThrowFrom_tjs_error(hr, str); } } else { int hr = clo.PropSetByNum(flags, member.AsInteger(), param, clo.mObjThis != null ? clo.mObjThis : objthis); if (hr < 0) { ThrowFrom_tjs_error_num(hr, member.AsInteger()); } } } else { if (target.IsString()) { SetStringProperty(param, target, member); } else { if (target.IsOctet()) { SetOctetProperty(param, target, member); } else { string mes = Error.VariantConvertErrorToObject.Replace("%1", Utils.VariantToReadableString (target)); throw new VariantException(mes); } } } }
/// <exception cref="Kirikiri.Tjs2.VariantException"></exception> public static void CharacterCodeFrom(Variant val) { char[] ch = new char[1]; ch[0] = (char)val.AsInteger(); val.Set(new string(ch)); }
/// <exception cref="Kirikiri.Tjs2.TJSException"></exception> /// <exception cref="Kirikiri.Tjs2.VariantException"></exception> protected internal static void OperatePropertyIndirect0(VariantClosure clo, Variant name, Variant result, Dispatch2 objthis, int ope) { if (name.IsInteger() != true) { string str = name.AsString(); int hr = clo.Operation(ope, str, result, null, clo.mObjThis != null ? clo.mObjThis : objthis); if (hr < 0) { ThrowFrom_tjs_error(hr, str); } } else { int hr = clo.OperationByNum(ope, name.AsInteger(), result, null, clo.mObjThis != null ? clo.mObjThis : objthis); if (hr < 0) { ThrowFrom_tjs_error_num(hr, name.AsInteger()); } } }
/// <exception cref="Kirikiri.Tjs2.VariantException"></exception> public static object VariantToJavaObject(Variant param, Type type) { if (type.IsPrimitive) { // プリミティブタイプの场合 if (type.Equals(typeof(int))) { return Sharpen.Extensions.ValueOf(param.AsInteger()); } else { if (type.Equals(typeof(double))) { return (param.AsDouble()); } else { if (type.Equals(typeof(bool))) { return Sharpen.Extensions.ValueOf(param.AsInteger() != 0 ? true : false); } else { if (type.Equals(typeof(float))) { return ((float)param.AsDouble()); } else { if (type.Equals(typeof(long))) { return Sharpen.Extensions.ValueOf(param.AsInteger()); } else { if (type.Equals(typeof(char))) { return ((char)param.AsInteger()); } else { if (type.Equals(typeof(byte))) { return (unchecked((byte)param.AsInteger())); } else { if (type.Equals(typeof(short))) { return ((short)param.AsInteger()); } else { // may be Void.TYPE return null; } } } } } } } } } else { if (type.Equals(typeof(string))) { return param.AsString(); } else { if (type.Equals(typeof(ByteBuffer))) { return param.AsOctet(); } else { if (type.Equals(typeof(Variant))) { return param; } else { if (type.Equals(typeof(VariantClosure))) { return param.AsObjectClosure(); } else { if (type.Equals(typeof(Dispatch2))) { return param.AsObject(); } else { if (type.Equals(param.ToJavaObject().GetType())) { return param.ToJavaObject(); } else { // その他 のクラス return null; } } } } } } } }
/// <exception cref="Kirikiri.Tjs2.VariantException"></exception> public override int Set(Variant param, Dispatch2 objthis) { RegExpNI _this = (RegExpNI)objthis.GetNativeInstance(Kirikiri.Tjs2.RegExpClass.mClassID ); if (_this == null) { return Error.E_NATIVECLASSCRASH; } _this.mStart = param.AsInteger(); return Error.S_OK; }
/// <exception cref="Kirikiri.Tjs2.VariantException"></exception> /// <exception cref="Kirikiri.Tjs2.TJSException"></exception> private bool CallSetMissing(string name, Variant value) { // call 'missing' method for PopSet if (mProsessingMissing) { return false; } mProsessingMissing = true; bool res = false; try { Variant val = new Variant(value); SimpleGetSetProperty prop = new SimpleGetSetProperty(val); try { Variant[] args = new Variant[3]; args[0] = new Variant(1); // true: set args[1] = new Variant(name); // member name args[2] = new Variant(prop); //tTJSVariant *pargs[3] = {args +0, args +1, args +2}; Variant funcresult = new Variant(); int er = FuncCall(0, mmissing_name, funcresult, args, this); if (er < 0) { res = false; } else { res = funcresult.AsInteger() != 0; } } finally { } } finally { //prop.Release(); mProsessingMissing = false; } return res; }
/// <exception cref="Kirikiri.Tjs2.TJSException"></exception> /// <exception cref="Kirikiri.Tjs2.VariantException"></exception> public virtual void Randomize(Variant[] param) { if (param.Length == 0) { // parametor not given if (mRandomBits128 != null) { // another random generator is given //tjs_uint8 buf[32]; //unsigned long tmp[32]; ByteBuffer buf = ByteBuffer.AllocateDirect(32); mRandomBits128.GetRandomBits128(buf, 0); mRandomBits128.GetRandomBits128(buf, 16); int[] tmp = new int[32]; for (int i = 0; i < 32; i++) { long num = (long)buf.Get(i) + ((long)buf.Get(i) << 8) + ((long)buf.Get(1) << 16) + ((long)buf.Get(i) << 24); tmp[i] = (int)(num > int.MaxValue ? num - unchecked((long)(0x100000000L)) : num); } if (mGenerator != null) { mGenerator = null; } mGenerator = new MersenneTwister(tmp); } else { if (mGenerator != null) { mGenerator = null; } mGenerator = new MersenneTwister(Runtime.CurrentTimeMillis()); } } else { if (param.Length >= 1) { if (param[0].IsObject()) { MersenneTwisterData data = null; try { // may be a reconstructible information VariantClosure clo = param[0].AsObjectClosure(); if (clo.mObject == null) { throw new TJSException(Error.NullAccess); } string state; Variant val = new Variant(); data = new MersenneTwisterData(); // get state array //TJSThrowFrom_tjs_error int hr = clo.PropGet(Interface.MEMBERMUSTEXIST, "state", val, null); if (hr < 0) { Error.ThrowFrom_tjs_error(hr, null); } state = val.AsString(); if (state.Length != MT_N * 8) { throw new TJSException(Error.NotReconstructiveRandomizeData); } int p = 0; for (int i = 0; i < MT_N; i++) { long n = 0; int tmp; for (int j = 0; j < 8; j++) { int c = state[p + j]; tmp = -1; if (c >= '0' && c <= '9') { n = c - '0'; } else { if (c >= 'a' && c <= 'f') { n = c - 'a' + 10; } else { if (c >= 'A' && c <= 'F') { n = c - 'A' + 10; } } } if (tmp == -1) { throw new TJSException(Error.NotReconstructiveRandomizeData); } else { n <<= 4; n += tmp; } } p += 8; data.state.Put(i, n & unchecked((long)(0xffffffffL))); } // get other members hr = clo.PropGet(Interface.MEMBERMUSTEXIST, "left", val, null); if (hr < 0) { Error.ThrowFrom_tjs_error(hr, null); } data.left = val.AsInteger(); hr = clo.PropGet(Interface.MEMBERMUSTEXIST, "next", val, null); data.next = val.AsInteger(); if (mGenerator != null) { mGenerator = null; } mGenerator = new MersenneTwister(data); } catch (VariantException) { data = null; throw new TJSException(Error.NotReconstructiveRandomizeData); } catch (TJSException) { data = null; throw new TJSException(Error.NotReconstructiveRandomizeData); } data = null; } else { // 64bitじゃなくて、32bit にしてしまっている。实用上问题あれば修正。 int n = param[0].AsInteger(); int[] tmp = new int[1]; tmp[0] = n; if (mGenerator != null) { mGenerator = null; } mGenerator = new MersenneTwister(tmp); } } } }