Exemplo n.º 1
0
 /// <exception cref="VariantException"></exception>
 /// <exception cref="TjsException"></exception>
 public virtual bool Callback(string name, int flags, Variant value)
 {
     if ((flags & Interface.HIDDENMEMBER) != 0)
     {
         return(true);
     }
     if (mCalled)
     {
         mStream.Write(",\n");
     }
     mCalled = true;
     mStream.Write(mIndentStr);
     mStream.Write("\"");
     mStream.Write(LexBase.EscapeC(name));
     mStream.Write("\" => ");
     if (value.IsObject())
     {
         // object
         VariantClosure clo = value.AsObjectClosure();
         ArrayNI.SaveStructuredDataForObject(clo.SelectObject(), mStack, mStream, mIndentStr
                                             );
     }
     else
     {
         mStream.Write(Utils.VariantToExpressionString(value));
     }
     return(true);
 }
 /// <exception cref="TjsException"></exception>
 /// <exception cref="VariantException"></exception>
 protected internal static void GetPropertyDirect(Variant result, Variant target,
                                                  int member, Dispatch2 objthis, int flags)
 {
     if (target.IsObject())
     {
         VariantClosure clo  = target.AsObjectClosure();
         string         name = Sharpen.Extensions.ToString(member);
         int            hr   = clo.PropGet(flags, name, result, clo.mObjThis != null ? clo.mObjThis : objthis
                                           );
         if (hr < 0)
         {
             ThrowFrom_tjs_error(hr, name);
         }
     }
     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);
             }
         }
     }
 }
Exemplo n.º 3
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);
                }
                ((ArrayObject)objthis).Clear(ni);
                AList <Dispatch2> stack = new AList <Dispatch2>();
                VariantClosure    clo   = param[0].AsObjectClosure();

                if (clo.mObjThis != null)
                {
                    ni.AssignStructure(clo.mObjThis, stack);
                }
                else
                {
                    if (clo.mObject != null)
                    {
                        ni.AssignStructure(clo.mObject, stack);
                    }
                    else
                    {
                        throw new TjsException(Error.NullAccess);
                    }
                }
                return(Error.S_OK);
            }
 // setPropertyDirect( ra[ra_offset+ca[code+1]], da[ca[code+2]], ra[ra_offset+ca[code+3]], objthis, flags );
 // member は、固定值なので、事前に分岐判定出来るから、展开するようにした方がいいな
 /// <exception cref="TjsException"></exception>
 /// <exception cref="VariantException"></exception>
 protected internal static void SetPropertyDirect(Variant target, string member, Variant
                                                  param, Dispatch2 objthis, int flags)
 {
     if (target.IsObject())
     {
         VariantClosure clo = target.AsObjectClosure();
         int            hr  = clo.PropSet(flags, member, param, clo.mObjThis != null ? clo.mObjThis :
                                          objthis);
         if (hr < 0)
         {
             ThrowFrom_tjs_error(hr, member);
         }
     }
     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);
             }
         }
     }
 }
Exemplo n.º 5
0
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        public virtual void SaveStructuredData(AList <Dispatch2> stack, TextWriteStreamInterface
                                               stream, string indentstr)
        {
            stream.Write("(const) [\n");
            string indentstr2 = indentstr + " ";
            int    count      = mItems.Count;

            for (int i = 0; i < count; i++)
            {
                Variant v = mItems[i];
                stream.Write(indentstr2);
                if (v.IsObject())
                {
                    // object
                    VariantClosure clo = v.AsObjectClosure();
                    SaveStructuredDataForObject(clo.SelectObject(), stack, stream, indentstr2);
                }
                else
                {
                    stream.Write(Utils.VariantToExpressionString(v));
                }
                if (i != mItems.Count - 1)
                {
                    // unless last
                    stream.Write(",\n");
                }
                else
                {
                    stream.Write("\n");
                }
            }
            stream.Write(indentstr);
            stream.Write("]");
        }
        /// <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);
        }
        /// <exception cref="TjsException"></exception>
        /// <exception cref="VariantException"></exception>
        protected internal static void OperatePropertyDirect(VariantClosure clo, string name
                                                             , Variant result, Variant param, Dispatch2 objthis, int ope)
        {
            Dispatch2 objThis = clo.mObjThis != null ? clo.mObjThis : objthis;
            int       hr      = clo.Operation(ope, name, result, param, objThis);

            if (hr < 0)
            {
                ThrowFrom_tjs_error(hr, name);
            }
        }
 /// <exception cref="TjsException"></exception>
 /// <exception cref="VariantException"></exception>
 protected internal static void TypeOfMemberDirect(Variant result, Variant target,
                                                   string member, Dispatch2 objthis, int flags)
 {
     if (target.IsObject())
     {
         int            hr;
         VariantClosure clo = target.AsObjectClosure();
         hr = clo.PropGet(flags, member, 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, member);
                 }
             }
         }
     }
     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);
             }
         }
     }
 }
 // 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);
             }
         }
     }
 }
Exemplo n.º 10
0
            /// <exception cref="TjsException"></exception>
            protected internal override int Process(Variant result, Variant[] param, Dispatch2
                                                    objthis)
            {
                DictionaryNI ni = (DictionaryNI)objthis.GetNativeInstance(DictionaryClass
                                                                          .ClassID);

                if (ni == null)
                {
                    return(Error.E_NATIVECLASSCRASH);
                }
                if (!ni.IsValid())
                {
                    return(Error.E_INVALIDOBJECT);
                }
                if (param.Length < 1)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                bool clear = true;

                if (param.Length >= 2 && param[1].IsVoid() != true)
                {
                    clear = param[1].AsBoolean();
                }
                VariantClosure clo = param[0].AsObjectClosure();

                if (clo.mObjThis != null)
                {
                    ni.Assign(clo.mObjThis, clear);
                }
                else
                {
                    if (clo.mObject != null)
                    {
                        ni.Assign(clo.mObject, clear);
                    }
                    else
                    {
                        throw new TjsException(Error.NullAccess);
                    }
                }
                return(Error.S_OK);
            }
Exemplo n.º 11
0
        /// <summary>TJSGetExceptionObject : retrieves TJS 'Exception' object</summary>
        /// <exception cref="TjsException">TJSException</exception>
        /// <exception cref="VariantException">VariantException</exception>
        /// <exception cref="VariantException"></exception>
        /// <exception cref="TjsException"></exception>
        public static void GetExceptionObject(Tjs tjs, Variant res, Variant msg, Variant
                                              trace)
        {
            if (res == null)
            {
                return;
            }
            // not prcess
            // retrieve class "Exception" from global
            Dispatch2 global = tjs.GetGlobal();
            Variant   val    = new Variant();
            int       hr     = global.PropGet(0, EXCEPTION_NAME, val, global);

            if (hr < 0)
            {
                throw new TjsException(ExceptionNotFound);
            }
            // create an Exception object
            Holder <Dispatch2> excpobj = new Holder <Dispatch2>(null);
            VariantClosure     clo     = val.AsObjectClosure();

            Variant[] pmsg = new Variant[1];
            pmsg[0] = msg;
            hr      = clo.CreateNew(0, null, excpobj, pmsg, clo.mObjThis);
            if (hr < 0)
            {
                throw new TjsException(ExceptionNotFound);
            }
            Dispatch2 disp = excpobj.mValue;

            if (trace != null)
            {
                string trace_name = "trace";
                disp.PropSet(Interface.MEMBERENSURE, trace_name, trace, disp);
            }
            res.Set(disp, disp);
            excpobj = null;
        }
 /// <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());
         }
     }
 }
Exemplo n.º 13
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);
            }
Exemplo n.º 14
0
 // enumerate members
 /// <exception cref="VariantException"></exception>
 /// <exception cref="TjsException"></exception>
 public virtual int EnumMembers(int flag, VariantClosure callback, Dispatch2 objThis
                                )
 {
     return(Error.E_NOTIMPL);
 }
Exemplo n.º 15
0
 public ArraySortCompare_Functional(VariantClosure clo)
 {
     mClosure = clo;
 }
Exemplo n.º 16
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 < 2)
                {
                    return(Error.E_BADPARAMCOUNT);
                }
                ni.mItems.Clear();
                string @string    = param[1].AsString();
                bool   purgeempty = false;

                if (param.Length >= 4 && param[3].IsVoid() == false)
                {
                    purgeempty = param[3].AsBoolean();
                }
                if (param[0].IsObject())
                {
                    RegExpNI       re;
                    VariantClosure clo = param[0].AsObjectClosure();
                    if (clo.mObject != null)
                    {
                        if ((re = (RegExpNI)clo.mObject.GetNativeInstance(RegExpClass.ClassID)) != null)
                        {
                            Holder <Dispatch2> array = new Holder <Dispatch2>(objthis);
                            re.Split(array, @string, purgeempty);
                            if (result != null)
                            {
                                result.Set(new Variant(objthis, objthis));
                            }
                            return(Error.S_OK);
                        }
                    }
                }
                string pattern = param[0].AsString();
                int    count   = @string.Length;
                int    start   = 0;

                for (int i = 0; i < count; i++)
                {
                    char ch = @string[i];
                    if (pattern.IndexOf(ch) != -1)
                    {
                        if (purgeempty == false || (purgeempty == true && (i - start) != 0))
                        {
                            ni.mItems.AddItem(new Variant(Sharpen.Runtime.Substring(@string, start, i)));
                        }
                        start = i + 1;
                    }
                }
                if (purgeempty == false || (purgeempty == true && (count - start) >= 0))
                {
                    ni.mItems.AddItem(new Variant(Sharpen.Runtime.Substring(@string, start, count)));
                }
                if (result != null)
                {
                    result.Set(new Variant(objthis, objthis));
                }
                return(Error.S_OK);
            }
Exemplo n.º 17
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);
                }
                int            method  = '+';
                VariantClosure closure = null;

                if (param.Length >= 1 && param[0].IsVoid() != true)
                {
                    if (param[0].IsObject())
                    {
                        closure = param[0].AsObjectClosure();
                        method  = (char)0;
                    }
                    else
                    {
                        string me = param[0].AsString();
                        method = me[0];
                        switch (method)
                        {
                        case '+':
                        case '-':
                        case '0':
                        case '9':
                        case 'a':
                        case 'z':
                        {
                            break;
                        }

                        default:
                        {
                            method = '+';
                            break;
                        }
                        }
                    }
                }
                switch (method)
                {
                case '+':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_NormalAscending());
                    break;
                }

                case '-':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_NormalDescending());
                    break;
                }

                case '0':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_NumericAscending());
                    break;
                }

                case '9':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_NumericDescending());
                    break;
                }

                case 'a':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_StringAscending());
                    break;
                }

                case 'z':
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_StringDescending());
                    break;
                }

                case 0:
                {
                    ni.mItems.Sort(new ArrayClass.ArraySortCompare_Functional(closure));
                    break;
                }
                }
                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);
             }
         }
     }
 }