Esempio n. 1
0
        private string GetText()
        {
            Variant value = Variant.Create();

            TextView_c.GetValue(Pointer, value.Pointer);
            return(value.AsString());
        }
        /// <exception cref="TjsException"></exception>
        /// <exception cref="VariantException"></exception>
        protected internal static void ThrowScriptException(Variant val, ScriptBlock block
                                                            , int srcpos)
        {
            string msg = null;

            if (val.IsObject())
            {
                VariantClosure clo = val.AsObjectClosure();
                if (clo.mObject != null)
                {
                    Variant v2           = new Variant();
                    string  message_name = "message";
                    int     hr           = clo.PropGet(0, message_name, v2, null);
                    if (hr >= 0)
                    {
                        msg = "script exception : " + v2.AsString();
                    }
                }
            }
            if (msg == null || msg.Length == 0)
            {
                msg = "script exception";
            }
            throw new TjsScriptException(msg, block, srcpos, val);
        }
Esempio n. 3
0
                public void TestString()
                {
                    String s = "hello";
                    Variant v = new Variant(s);

                    Assert.AreEqual(s, v.AsString());
                }
 /// <exception cref="TjsException"></exception>
 /// <exception cref="VariantException"></exception>
 private static void GetStringProperty(Variant result, Variant str, string name)
 {
     // processes properties toward strings.
     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);
 }
Esempio n. 5
0
 /// <exception cref="VariantException"></exception>
 public static string VariantToExpressionString(Variant val)
 {
     // convert given variant to string which can be interpret as an expression.
     // this function does not convert objects ( returns empty string )
     if (val.IsVoid())
     {
         return("void");
     }
     else
     {
         if (val.IsInteger())
         {
             return(val.AsString());
         }
         else
         {
             if (val.IsReal())
             {
                 string s = Variant.RealToHexString(val.AsDouble());
                 return(s + " /* " + val.AsString() + " */");
             }
             else
             {
                 if (val.IsString())
                 {
                     string s = LexBase.EscapeC(val.AsString());
                     return("\"" + s + "\"");
                 }
                 else
                 {
                     if (val.IsOctet())
                     {
                         string s = Variant.OctetToListString(val.AsOctet());
                         return("<%" + s + "%>");
                     }
                     else
                     {
                         return(string.Empty);
                     }
                 }
             }
         }
     }
 }
Esempio n. 6
0
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        public static void SaveStructuredDataForObject(Dispatch2 dsp, AList <Dispatch2> stack
                                                       , TextWriteStreamInterface stream, string indentstr)
        {
            // check object recursion
            int count = stack.Count;

            for (int i = 0; i < count; i++)
            {
                Dispatch2 d = stack[i];
                if (d == dsp)
                {
                    // object recursion detected
                    stream.Write("null /* object recursion detected */");
                    return;
                }
            }
            // determin dsp's object type
            DictionaryNI dicni;
            ArrayNI      arrayni;

            if (dsp != null)
            {
                dicni = (DictionaryNI)dsp.GetNativeInstance(DictionaryClass.ClassID);
                if (dicni != null)
                {
                    // dictionary
                    stack.AddItem(dsp);
                    dicni.SaveStructuredData(stack, stream, indentstr);
                    stack.Remove(stack.Count - 1);
                    return;
                }
                else
                {
                    arrayni = (ArrayNI)dsp.GetNativeInstance(ArrayClass.ClassID);
                    if (arrayni != null)
                    {
                        // array
                        stack.AddItem(dsp);
                        arrayni.SaveStructuredData(stack, stream, indentstr);
                        stack.Remove(stack.Count - 1);
                        return;
                    }
                    else
                    {
                        // other objects
                        stream.Write("null /* (object) \"");
                        // stored as a null
                        Variant val = new Variant(dsp, dsp);
                        stream.Write(LexBase.EscapeC(val.AsString()));
                        stream.Write("\" */");
                        return;
                    }
                }
            }
            stream.Write("null");
        }
        /// <exception cref="VariantException"></exception>
        public static void CharacterCodeOf(Variant val)
        {
            string str = val.AsString();

            if (str != null)
            {
                int v = str[0];
                val.Set(v);
            }
            else
            {
                val.Set(0);
            }
        }
 // getPropertyIndirect( ra[ra_offset+ca[code+1]], ra[ra_offset+ca[code+2]], ra[ra_offset+ca[code+3]], objthis, flags );
 /// <exception cref="TjsException"></exception>
 /// <exception cref="VariantException"></exception>
 protected internal static void GetPropertyIndirect(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 < 0)
             {
                 ThrowFrom_tjs_error(hr, str);
             }
         }
         else
         {
             int hr = clo.PropGetByNum(flags, member.AsInteger(), result, clo.mObjThis != null
                                          ? clo.mObjThis : objthis);
             if (hr < 0)
             {
                 ThrowFrom_tjs_error_num(hr, member.AsInteger());
             }
         }
     }
     else
     {
         if (target.IsString())
         {
             GetStringProperty(result, target, member);
         }
         else
         {
             if (target.IsOctet())
             {
                 GetOctetProperty(result, target, member);
             }
             else
             {
                 string mes = Error.VariantConvertErrorToObject.Replace("%1", Utils.VariantToReadableString
                                                                            (target));
                 throw new VariantException(mes);
             }
         }
     }
 }
Esempio n. 9
0
            /// <exception cref="VariantException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 1)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                string delimiter  = param[0].AsString();
                bool   purgeempty = false;

                if (param.Length >= 3 && param[2].IsVoid() != true)
                {
                    purgeempty = param[2].AsBoolean();
                }
                bool          first  = true;
                StringBuilder builer = new StringBuilder(1024);
                int           count  = ni.mItems.Count;

                for (int i = 0; i < count; i++)
                {
                    Variant v = ni.mItems[i];
                    if (purgeempty && v.IsVoid())
                    {
                    }
                    else
                    {
                        if (!first)
                        {
                            builer.Append(delimiter);
                        }
                        first = false;
                        builer.Append(v.AsString());
                    }
                }
                if (result != null)
                {
                    result.Set(builer.ToString());
                }
                return(Error.S_OK);
            }
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        protected internal static void InstanceOf(Variant name, Variant targ)
        {
            // checks instance inheritance.
            string str = name.AsString();

            if (str != null)
            {
                int hr = CustomObject.DefaultIsInstanceOf(0, targ, str, null);
                if (hr < 0)
                {
                    ThrowFrom_tjs_error(hr, null);
                }
                targ.Set((hr == Error.S_TRUE) ? 1 : 0);
                return;
            }
            targ.Set(0);
        }
Esempio n. 11
0
            /// <exception cref="TjsException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                ArrayNI ni = (ArrayNI)objthis.GetNativeInstance(ArrayClass.ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 1)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                string name = param[0].AsString();
                string mode = null;

                if (param.Length >= 2 && param[1].IsVoid() == false)
                {
                    mode = param[1].AsString();
                }
                TextWriteStreamInterface stream = Tjs.mStorage.CreateTextWriteStream(name, mode);

                try
                {
                    Iterator <Variant> i = ni.mItems.Iterator();
                    while (i.HasNext())
                    {
                        Variant o = i.Next();
                        if (o != null && (o.IsString() || o.IsNumber()))
                        {
                            stream.Write(o.AsString());
                        }
                        stream.Write("\n");
                    }
                }
                finally
                {
                    stream.Destruct();
                }
                if (result != null)
                {
                    result.Set(new Variant(objthis, objthis));
                }
                return(Error.S_OK);
            }
        /// <exception cref="TjsException"></exception>
        /// <exception cref="VariantException"></exception>
        private static void GetStringProperty(Variant result, Variant str, int n)
        {
            // processes properties toward strings.
            string s   = str.AsString();
            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;
        }
Esempio n. 13
0
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        public virtual void Assign(Dispatch2 dsp, bool clear)
        {
            // copy members from "dsp" to "Owner"
            // determin dsp's object type
            ArrayNI      arrayni = null;
            CustomObject owner   = mOwner.Get();

            if (dsp != null && (arrayni = (ArrayNI)dsp.GetNativeInstance(ArrayClass.ClassID))
                != null)
            {
                // convert from array
                if (clear)
                {
                    owner.Clear();
                }
                int count = arrayni.mItems.Count;
                for (int i = 0; i < count; i++)
                {
                    Variant v    = arrayni.mItems[i];
                    string  name = v.AsString();
                    i++;
                    if (i >= count)
                    {
                        break;
                    }
                    Variant v2 = arrayni.mItems[i];
                    owner.PropSet(Interface.MEMBERENSURE | Interface.IGNOREPROP, name, v2, owner);
                }
            }
            else
            {
                // otherwise
                if (clear)
                {
                    owner.Clear();
                }
                DictionaryNI.AssignCallback callback = new DictionaryNI.AssignCallback(owner);
                dsp.EnumMembers(Interface.IGNOREPROP, callback, dsp);
            }
        }
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        /// <exception cref="CompileException"></exception>
        protected internal virtual void Eval(Variant val, Dispatch2 objthis, bool resneed
                                             )
        {
            Variant res = new Variant();
            string  str = val.AsString();

            if (str.Length > 0)
            {
                if (resneed)
                {
                    GetOwner().EvalExpression(str, res, objthis, null, 0);
                }
                else
                {
                    GetOwner().EvalExpression(str, null, objthis, null, 0);
                }
            }
            if (resneed)
            {
                val.Set(res);
            }
        }
 /// <exception cref="TjsException"></exception>
 /// <exception cref="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="VariantException"></exception>
        public static object[] VariantArrayToJavaObjectArray(Variant[] @params, Type[] types)
        {
            if (types.Length == 0)
            {
                return(null);
            }
            // 元々引数不要
            if (@params.Length < types.Length)
            {
                return(null);
            }
            // パラメータが少ない
            int count = types.Length;

            object[] ret = new object[count];
            for (int i = 0; i < count; i++)
            {
                Type    type  = types[i];
                Variant param = @params[i];
                if (type.GetTypeInfo().IsPrimitive)
                {
                    // プリミティブタイプの场合
                    if (type == typeof(int))
                    {
                        ret[i] = Extensions.ValueOf(param.AsInteger());
                    }
                    else if (type == typeof(double))
                    {
                        ret[i] = (param.AsDouble());
                    }
                    else if (type == typeof(bool))
                    {
                        ret[i] = Extensions.ValueOf(param.AsInteger() != 0);
                    }
                    else if (type == typeof(float))
                    {
                        ret[i] = ((float)param.AsDouble());
                    }
                    else if (type == typeof(long))
                    {
                        ret[i] = Extensions.ValueOf(param.AsInteger());
                    }
                    else if (type == typeof(char))
                    {
                        ret[i] = ((char)param.AsInteger());
                    }
                    else if (type == typeof(byte))
                    {
                        ret[i] = (unchecked ((byte)param.AsInteger()));
                    }
                    else if (type == typeof(short))
                    {
                        ret[i] = ((short)param.AsInteger());
                    }
                    else
                    {
                        // may be Void.TYPE
                        ret[i] = null;
                    }
                }
                else if (type == typeof(string))
                {
                    ret[i] = param.AsString();
                }
                else if (type == typeof(ByteBuffer))
                {
                    ret[i] = param.AsOctet();
                }
                else if (type == typeof(Variant))
                {
                    ret[i] = param;
                }
                else if (type == typeof(VariantClosure))
                {
                    ret[i] = param.AsObjectClosure();
                }
                else if (type == typeof(Dispatch2))
                {
                    ret[i] = param.AsObject();
                }
                else if (type == param.ToJavaObject().GetType())
                {
                    ret[i] = param.ToJavaObject();
                }
                else
                {
                    // その他 のクラス
                    ret[i] = null;
                }
            }
            return(ret);
        }
Esempio n. 17
0
        private void WriteVariant(Variant value)
        {
            switch (value.Kind)
            {
                case VariantKind.Null:
                    _writer.Write((byte)EncodingKind.Null);
                    break;

                case VariantKind.Boolean:
                    _writer.Write((byte)(value.AsBoolean() ? EncodingKind.Boolean_True : EncodingKind.Boolean_False));
                    break;

                case VariantKind.Byte:
                    _writer.Write((byte)EncodingKind.UInt8);
                    _writer.Write(value.AsByte());
                    break;

                case VariantKind.SByte:
                    _writer.Write((byte)EncodingKind.Int8);
                    _writer.Write(value.AsSByte());
                    break;

                case VariantKind.Int16:
                    _writer.Write((byte)EncodingKind.Int16);
                    _writer.Write(value.AsInt16());
                    break;

                case VariantKind.UInt16:
                    _writer.Write((byte)EncodingKind.UInt16);
                    _writer.Write(value.AsUInt16());
                    break;

                case VariantKind.Int32:
                    {
                        var v = value.AsInt32();
                        if (v >= 0 && v <= 10)
                        {
                            _writer.Write((byte)((int)EncodingKind.Int32_0 + v));
                        }
                        else if (v >= 0 && v < byte.MaxValue)
                        {
                            _writer.Write((byte)EncodingKind.Int32_1Byte);
                            _writer.Write((byte)v);
                        }
                        else if (v >= 0 && v < ushort.MaxValue)
                        {
                            _writer.Write((byte)EncodingKind.Int32_2Bytes);
                            _writer.Write((ushort)v);
                        }
                        else
                        {
                            _writer.Write((byte)EncodingKind.Int32);
                            _writer.Write(v);
                        }
                    }
                    break;

                case VariantKind.UInt32:
                    {
                        var v = value.AsUInt32();
                        if (v >= 0 && v <= 10)
                        {
                            _writer.Write((byte)((int)EncodingKind.UInt32_0 + v));
                        }
                        else if (v >= 0 && v < byte.MaxValue)
                        {
                            _writer.Write((byte)EncodingKind.UInt32_1Byte);
                            _writer.Write((byte)v);
                        }
                        else if (v >= 0 && v < ushort.MaxValue)
                        {
                            _writer.Write((byte)EncodingKind.UInt32_2Bytes);
                            _writer.Write((ushort)v);
                        }
                        else
                        {
                            _writer.Write((byte)EncodingKind.UInt32);
                            _writer.Write(v);
                        }
                    }
                    break;

                case VariantKind.Int64:
                    _writer.Write((byte)EncodingKind.Int64);
                    _writer.Write(value.AsInt64());
                    break;

                case VariantKind.UInt64:
                    _writer.Write((byte)EncodingKind.UInt64);
                    _writer.Write(value.AsUInt64());
                    break;

                case VariantKind.Decimal:
                    _writer.Write((byte)EncodingKind.Decimal);
                    _writer.Write(value.AsDecimal());
                    break;

                case VariantKind.Float4:
                    _writer.Write((byte)EncodingKind.Float4);
                    _writer.Write(value.AsSingle());
                    break;

                case VariantKind.Float8:
                    _writer.Write((byte)EncodingKind.Float8);
                    _writer.Write(value.AsDouble());
                    break;

                case VariantKind.Char:
                    _writer.Write((byte)EncodingKind.Char);
                    _writer.Write((ushort)value.AsChar());  // written as ushort because BinaryWriter fails on chars that are unicode surrogates
                    break;

                case VariantKind.String:
                    WriteStringValue(value.AsString());
                    break;

                case VariantKind.BoxedEnum:
                    var e = value.AsBoxedEnum();
                    WriteBoxedEnum(e, e.GetType());
                    break;

                case VariantKind.DateTime:
                    _writer.Write((byte)EncodingKind.DateTime);
                    _writer.Write(value.AsDateTime().ToBinary());
                    break;

                case VariantKind.Type:
                    WriteType(value.AsType());
                    break;

                case VariantKind.Array:
                    WriteArray(value.AsArray());
                    break;

                case VariantKind.Object:
                    WriteObject(value.AsObject());
                    break;
            }
        }
Esempio n. 18
0
        /// <exception cref="VariantException"></exception>
        public static string VariantToReadableString(Variant val, int maxlen)
        {
            string ret = null;

            if (val == null || val.IsVoid())
            {
                ret = "(void)";
            }
            else
            {
                if (val.IsInteger())
                {
                    ret = "(int)" + val.AsString();
                }
                else
                {
                    if (val.IsReal())
                    {
                        ret = "(real)" + val.AsString();
                    }
                    else
                    {
                        if (val.IsString())
                        {
                            ret = "(string)\"" + LexBase.EscapeC(val.AsString()) + "\"";
                        }
                        else
                        {
                            if (val.IsOctet())
                            {
                                ret = "(octet)<% " + Variant.OctetToListString(val.AsOctet()) + " %>";
                            }
                            else
                            {
                                if (val.IsObject())
                                {
                                    VariantClosure c   = (VariantClosure)val.AsObjectClosure();
                                    StringBuilder  str = new StringBuilder(128);
                                    str.Append("(object)");
                                    str.Append('(');
                                    if (c.mObject != null)
                                    {
                                        str.Append('[');
                                        if (c.mObject is NativeClass)
                                        {
                                            str.Append(((NativeClass)c.mObject).GetClassName());
                                        }
                                        else
                                        {
                                            if (c.mObject is InterCodeObject)
                                            {
                                                str.Append(((InterCodeObject)c.mObject).GetName());
                                            }
                                            else
                                            {
                                                if (c.mObject is CustomObject)
                                                {
                                                    string name = ((CustomObject)c.mObject).GetClassNames();
                                                    if (name != null)
                                                    {
                                                        str.Append(name);
                                                    }
                                                    else
                                                    {
                                                        str.Append(c.mObject.GetType().FullName);
                                                    }
                                                }
                                                else
                                                {
                                                    str.Append(c.mObject.GetType().FullName);
                                                }
                                            }
                                        }
                                        str.Append(']');
                                    }
                                    else
                                    {
                                        str.Append("0x00000000");
                                    }
                                    if (c.mObjThis != null)
                                    {
                                        str.Append('[');
                                        if (c.mObjThis is NativeClass)
                                        {
                                            str.Append(((NativeClass)c.mObjThis).GetClassName());
                                        }
                                        else
                                        {
                                            if (c.mObjThis is InterCodeObject)
                                            {
                                                str.Append(((InterCodeObject)c.mObjThis).GetName());
                                            }
                                            else
                                            {
                                                if (c.mObjThis is CustomObject)
                                                {
                                                    string name = ((CustomObject)c.mObjThis).GetClassNames();
                                                    if (name != null)
                                                    {
                                                        str.Append(name);
                                                    }
                                                    else
                                                    {
                                                        str.Append(c.mObjThis.GetType().FullName);
                                                    }
                                                }
                                                else
                                                {
                                                    str.Append(c.mObjThis.GetType().FullName);
                                                }
                                            }
                                        }
                                        str.Append(']');
                                    }
                                    else
                                    {
                                        str.Append(":0x00000000");
                                    }
                                    str.Append(')');
                                    ret = str.ToString();
                                }
                                else
                                {
                                    // native object ?
                                    ret = "(octet) [" + val.GetType().FullName + "]";
                                }
                            }
                        }
                    }
                }
            }
            if (ret != null)
            {
                if (ret.Length > maxlen)
                {
                    return(Sharpen.Runtime.Substring(ret, 0, maxlen));
                }
                else
                {
                    return(ret);
                }
            }
            return(string.Empty);
        }
 /// <exception cref="VariantException"></exception>
 public static object VariantToJavaObject(Variant param, Type type)
 {
     if (type.GetTypeInfo().IsPrimitive)
     {
         // プリミティブタイプの场合
         if (type == typeof(int))
         {
             return(Extensions.ValueOf(param.AsInteger()));
         }
         if (type == typeof(double))
         {
             return(param.AsDouble());
         }
         if (type == typeof(bool))
         {
             return(Extensions.ValueOf(param.AsInteger() != 0));
         }
         if (type == typeof(float))
         {
             return((float)param.AsDouble());
         }
         if (type == typeof(long))
         {
             return(Extensions.ValueOf(param.AsInteger()));
         }
         if (type == typeof(char))
         {
             return((char)param.AsInteger());
         }
         if (type == typeof(byte))
         {
             return(unchecked ((byte)param.AsInteger()));
         }
         if (type == typeof(short))
         {
             return((short)param.AsInteger());
         }
         // may be Void.TYPE
         return(null);
     }
     if (type == typeof(string))
     {
         return(param.AsString());
     }
     if (type == typeof(ByteBuffer))
     {
         return(param.AsOctet());
     }
     if (type == typeof(Variant))
     {
         return(param);
     }
     if (type == typeof(VariantClosure))
     {
         return(param.AsObjectClosure());
     }
     if (type == typeof(Dispatch2))
     {
         return(param.AsObject());
     }
     if (type == param.ToJavaObject().GetType())
     {
         return(param.ToJavaObject());
     }
     // その他 のクラス
     return(null);
 }
Esempio n. 20
0
            /// <exception cref="TjsException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                RegExpNI _this = (RegExpNI)objthis.GetNativeInstance(RegExpClass.mClassID
                                                                     );

                if (_this == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (param.Length < 2)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                string         target = param[0].AsString();
                string         to     = null;
                bool           func;
                VariantClosure funcval = null;

                if (param[1].IsObject() != true)
                {
                    to   = param[1].AsString();
                    func = false;
                }
                else
                {
                    funcval = param[1].AsObjectClosure();
                    if (funcval.mObjThis == null)
                    {
                        funcval.mObjThis = objthis;
                    }
                    func = true;
                }
                string  ret = null;
                Matcher m   = _this.RegEx.Matcher(target);

                if (func == false)
                {
                    ret = m.ReplaceAll(to);
                }
                else
                {
                    int            hr;
                    VariantClosure clo      = new VariantClosure(null, null);
                    Variant        funcret  = new Variant();
                    Variant        arrayval = new Variant(clo);
                    Variant[]      args     = new Variant[1];
                    args[0] = arrayval;
                    int size = target.Length;
                    ret = string.Empty;
                    for (int i = 0; i < size;)
                    {
                        if (m.Find(i))
                        {
                            ret += Sharpen.Runtime.Substring(target, i, m.Start());
                            Dispatch2 array = RegExpClass.GetResultArray(true, _this, m);
                            clo.Set(array, array);
                            hr = funcval.FuncCall(0, null, funcret, args, null);
                            if (hr >= 0)
                            {
                                ret += funcret.AsString();
                            }
                            i = m.End();
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                if (result != null)
                {
                    result.Set(ret);
                }
                return(Error.S_OK);
            }
 /// <exception cref="TjsException"></exception>
 /// <exception cref="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);
             }
         }
     }
 }