Ejemplo n.º 1
0
        public ASBinCode.rtti.Class buildInterfaceDefine(ASTool.AS3.AS3Interface as3interface,
                                                         Builder builder,
                                                         ASBinCode.rtti.Class mainClass,
                                                         ASTool.AS3.AS3SrcFile as3srcfile, bool isbuildvector, RunTimeDataType vectortype)
        {
            if (builder.buildingclasses.isExistsBuildSuccess(new ASBinCode.rtti.Class(-1, -1, builder.bin, as3srcfile.md5Key + "_" + as3interface.Name)
            {
                name = as3interface.Name, package = as3interface.Package.Name
            }))
            {
                //重复编译,跳过
                return(null);
            }

            int classid = builder.getClassId();
            int blockid = builder.getBlockId();

            ASBinCode.rtti.Class cls = new ASBinCode.rtti.Class(classid, blockid, builder.bin, as3srcfile.md5Key + "_" + as3interface.Name);
            cls.package = as3interface.Package.Name;
            cls.name    = as3interface.Name;



            builder.buildingclasses.Add(as3interface, cls);

            if (isbuildvector)
            {
                builder.bin.dict_Vector_type.Add(cls, vectortype);
            }


            cls.ispackageout   = false;
            cls.isPublic       = as3interface.Access.IsPublic;
            cls.package        = as3interface.Package.Name;
            cls.name           = as3interface.Name;
            cls.no_constructor = true;
            cls.isInterface    = true;
            if (as3interface.Access.IsDynamic)
            {
                throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                         "Interface attribute dynamic is invalid.");
            }
            if (as3interface.Access.IsFinal)
            {
                throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                         "Interface attribute final is invalid.");
            }
            //cls.dynamic = as3class.Access.IsDynamic;
            //cls.final = as3class.Access.IsFinal;
            if (mainClass != null)
            {
                cls.mainClass    = mainClass;
                cls.ispackageout = true;
            }

            NativeFunctionBase creatorfunction = null;

            if (as3interface.Meta != null)
            {
                foreach (var m in as3interface.Meta)
                {
                    if (!m.Value.IsReg)
                    {
                        if (m.Value.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                        {
                            if (m.Value.Data.Value.ToString() == "_IEnumerator_")
                            {
                                if (builder.bin.IEnumeratorInterface == null)
                                {
                                    builder.bin.IEnumeratorInterface = cls;
                                }
                                else
                                {
                                    throw new BuildException(as3interface.token.line,
                                                             as3interface.token.ptr, as3interface.token.sourceFile,
                                                             "[_IEnumerator_]只能指定一次");
                                }
                            }
                            else if (m.Value.Data.Value.ToString() == "_IEnumerable_")
                            {
                                if (builder.bin.IEnumerableInterface == null)
                                {
                                    builder.bin.IEnumerableInterface = cls;
                                }
                                else
                                {
                                    throw new BuildException(as3interface.token.line,
                                                             as3interface.token.ptr, as3interface.token.sourceFile,
                                                             "[_IEnumerable_]只能指定一次");
                                }
                            }
                        }
                    }
                    else
                    {
                        if (m.exprStepList != null && m.exprStepList.Count == 1)
                        {
                            var step = m.exprStepList[0];
                            if (step.Type == ASTool.AS3.Expr.OpType.CallFunc)
                            {
                                if (!step.Arg2.IsReg)
                                {
                                    if (step.Arg2.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                                    {
                                        if (step.Arg2.Data.Value.ToString() == "link_system_interface")
                                        {
                                            cls.isLink_System = true;

                                            if (step.Arg3.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.as3_callargements)
                                            {
                                                List <ASTool.AS3.Expr.AS3DataStackElement>
                                                cargs = (List <ASTool.AS3.Expr.AS3DataStackElement>)step.Arg3.Data.Value;
                                                if (cargs.Count == 1)
                                                {
                                                    if (cargs[0].Data.FF1Type
                                                        == ASTool.AS3.Expr.FF1DataValueType.identifier)
                                                    {
                                                        string creator = cargs[0].Data.Value.ToString();

                                                        if (builder.bin.ContainsNativeFunction(creator))
                                                        {
                                                            var nf = builder.bin.getNativeFunction(creator);                                                            //nativefunctions[builder.bin.nativefunctionNameIndex[creator]];
                                                            if (!(nf is ASBinCode.rtti.ILinkSystemObjCreator))
                                                            {
                                                                throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                                                         "链接接口必须有一个INativeFunctionRegister类型的创建器");
                                                            }

                                                            creatorfunction = nf;
                                                        }
                                                        else if (!builder.options.CheckNativeFunctionSignature)
                                                        {
                                                            creatorfunction = new mocks.MockNativeFunction(creator);
                                                        }
                                                        else
                                                        {
                                                            throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                                                     "本地函数 " + creator + " 未注册");
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }



            //****编译metaclass***
            int metaclassid = builder.getClassId();
            int metablockid = builder.getBlockId();

            ASBinCode.rtti.Class metaclass = new ASBinCode.rtti.Class(metaclassid, metablockid, builder.bin, as3srcfile.md5Key + "_metaclass_" + "$" + as3interface.Name);
            metaclass.package      = as3interface.Package.Name;
            metaclass.ispackageout = false;
            metaclass.isPublic     = as3interface.Access.IsPublic;
            metaclass.name         = "$" + as3interface.Name;
            metaclass.dynamic      = true;
            metaclass.final        = true;

            cls.staticClass         = metaclass;
            metaclass.instanceClass = cls;

            if (cls.isLink_System)
            {
                builder.linkinterfaceCreators.Add(cls, creatorfunction);
            }

            return(cls);
        }
 public AS3Class_Type(RunTimeDataType rttype,Type linktype)
 {
     this.rttype   = rttype;
     this.linktype = linktype;
 }
Ejemplo n.º 3
0
 public ObjectMemberSlot(ASBinCode.rtData.rtObjectBase obj, RunTimeDataType FunctionClassRtType, RunTimeDataType slottype, IClassFinder classfinder)
 {
     this.obj                 = obj;
     this.isConstMember       = false;
     this.FunctionClassRtType = FunctionClassRtType;
     this.slottype            = slottype;
     this.classfinder         = classfinder;
 }
        public void init(CSWC swc)
        {
            this.swc  = swc;
            arrayType = typeof(Array);

            link_type = new Dictionary <Type, RunTimeDataType>();



            link_type.Add(typeof(int), RunTimeDataType.rt_int);
            link_type.Add(typeof(string), RunTimeDataType.rt_string);
            link_type.Add(typeof(double), RunTimeDataType.rt_number);
            link_type.Add(typeof(bool), RunTimeDataType.rt_boolean);
            link_type.Add(typeof(uint), RunTimeDataType.rt_uint);
            link_type.Add(typeof(ASBinCode.rtData.rtArray), RunTimeDataType.rt_array);
            link_type.Add(typeof(ASBinCode.rtData.rtFunction), RunTimeDataType.rt_function);
            link_type.Add(typeof(DictionaryKey), _DICT_KEY);
            link_type.Add(typeof(RunTimeValueBase), _OBJECT_LINK);
            link_type.Add(typeof(float), _FLOAT);
            link_type.Add(typeof(short), _SHORT);
            link_type.Add(typeof(ushort), _USHORT);

            foreach (var item in swc.creator_Class)
            {
                link_type.Add(item.Key.getLinkSystemObjType(), item.Value.getRtType());
                link_type.Add(new AS3Class_Type(item.Value.staticClass.getRtType(), item.Key.getLinkSystemObjType()), item.Value.staticClass.getRtType());

                if (item.Key.getLinkSystemObjType().Equals(typeof(object)))
                {
                    _objectType_ = item.Value.getRtType();
                }
            }

            type_link = new Dictionary <RunTimeDataType, Type>();
            type_link.Add(RunTimeDataType.rt_int, typeof(int));
            type_link.Add(RunTimeDataType.rt_string, typeof(string));
            type_link.Add(RunTimeDataType.rt_number, typeof(double));
            type_link.Add(RunTimeDataType.rt_boolean, typeof(bool));
            type_link.Add(RunTimeDataType.rt_uint, typeof(uint));
            type_link.Add(RunTimeDataType.rt_array, typeof(ASBinCode.rtData.rtArray));
            type_link.Add(RunTimeDataType.rt_function, typeof(ASBinCode.rtData.rtFunction));
            type_link.Add(_DICT_KEY, typeof(DictionaryKey));
            type_link.Add(_OBJECT_LINK, typeof(RunTimeValueBase));
            type_link.Add(_FLOAT, typeof(float));
            type_link.Add(_SHORT, typeof(short));
            type_link.Add(_USHORT, typeof(ushort));

            foreach (var item in swc.creator_Class)
            {
                type_link.Add(item.Value.getRtType(), item.Key.getLinkSystemObjType());

                type_link.Add(item.Value.staticClass.getRtType(), new AS3Class_Type(item.Value.staticClass.getRtType(), item.Key.getLinkSystemObjType()));
            }

            if (swc.TypeClass == null)
            {
                return;
            }

            {
                var clsint = swc.getClassDefinitionByName("int").staticClass.getRtType();
                link_type.Add(new AS3Class_Type(clsint, typeof(int)), clsint);
                type_link.Add(clsint, new AS3Class_Type(clsint, typeof(int)));
            }
            {
                var clsuint = swc.getClassDefinitionByName("uint").staticClass.getRtType();
                link_type.Add(new AS3Class_Type(clsuint, typeof(uint)), clsuint);
                type_link.Add(clsuint, new AS3Class_Type(clsuint, typeof(uint)));
            }
            {
                var clsstring = swc.getClassDefinitionByName("String").staticClass.getRtType();
                link_type.Add(new AS3Class_Type(clsstring, typeof(string)), clsstring);
                type_link.Add(clsstring, new AS3Class_Type(clsstring, typeof(string)));
            }
            {
                var clsboolean = swc.getClassDefinitionByName("Boolean").staticClass.getRtType();
                link_type.Add(new AS3Class_Type(clsboolean, typeof(bool)), clsboolean);
                type_link.Add(clsboolean, new AS3Class_Type(clsboolean, typeof(bool)));
            }
            {
                var clsnumber = swc.getClassDefinitionByName("Number").staticClass.getRtType();
                link_type.Add(new AS3Class_Type(clsnumber, typeof(double)), clsnumber);
                type_link.Add(clsnumber, new AS3Class_Type(clsnumber, typeof(double)));
            }
        }
        public bool rtValueToLinkObject
            (RunTimeValueBase value,Type linkType,IClassFinder bin,bool needclone,out object linkobject)
        {
            RunTimeDataType vt = value.rtType;

            if (vt == RunTimeDataType.rt_null)
            {
                linkobject = null;
                return(true);
            }

            if (vt > RunTimeDataType.unknown)
            {
                var cls = bin.getClassByRunTimeDataType(vt);

                RunTimeDataType ot;
                if (TypeConverter.Object_CanImplicit_ToPrimitive(
                        cls,out ot
                        ))
                {
                    vt    = ot;
                    value = TypeConverter.ObjectImplicit_ToPrimitive((ASBinCode.rtData.rtObjectBase)value);
                }
                else if (linkType is AS3Class_Type && cls.staticClass == null)
                {
                    if (cls.getRtType() == ((AS3Class_Type)linkType).rttype)
                    {
                        linkobject = ((AS3Class_Type)linkType).linktype;
                        return(true);
                    }
                }
            }
            RunTimeDataType at =
                getRuntimeDataType(
                    linkType);

            if (at == RunTimeDataType.rt_int)
            {
                linkobject = (TypeConverter.ConvertToInt(value));
            }
            else if (at == RunTimeDataType.rt_uint)
            {
                linkobject = (TypeConverter.ConvertToUInt(value,null,null));
            }
            else if (at == RunTimeDataType.rt_string)
            {
                linkobject = (TypeConverter.ConvertToString(value,null,null));
            }
            else if (at == RunTimeDataType.rt_number)
            {
                linkobject = (TypeConverter.ConvertToNumber(value));
            }
            else if (at == RunTimeDataType.rt_boolean)
            {
                var b = TypeConverter.ConvertToBoolean(value,null,null);
                linkobject = b.value;
            }
            else if (at == RunTimeDataType.rt_array)
            {
                linkobject = (ASBinCode.rtData.rtArray)value;
            }
            else if (at == RunTimeDataType.rt_function)
            {
                if (needclone)
                {
                    linkobject = (ASBinCode.rtData.rtFunction)value;
                }
                else
                {
                    linkobject = ((ASBinCode.rtData.rtFunction)value).Clone();
                }
            }
            else if (at == _OBJECT_LINK)
            {
                if (vt > RunTimeDataType.unknown)
                {
                    if (needclone)
                    {
                        linkobject = ((ASBinCode.rtData.rtObjectBase)value).Clone();
                    }
                    else
                    {
                        linkobject = (ASBinCode.rtData.rtObjectBase)value;
                    }
                }
                else
                {
                    if (needclone)
                    {
                        linkobject = value.Clone();
                    }
                    else
                    {
                        linkobject = value;
                    }
                }
            }
            else if (at > RunTimeDataType.unknown)
            {
                if (vt > RunTimeDataType.unknown)
                {
                    Class c = bin.getClassByRunTimeDataType(vt);
                    if (c.isLink_System)
                    {
                        LinkSystemObject lo = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)value).value;
                        linkobject = lo.GetLinkData();
                    }
                    else if (c.isCrossExtend)
                    {
                        LinkSystemObject lo = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)value).value;
                        linkobject = lo.GetLinkData();
                    }
                    else if (c.staticClass == null)
                    {
                        if (c.instanceClass.isCrossExtend)
                        {
                            //***isCrossExtend Class转换为 基础类型的type
                            var sc = c.instanceClass.super;
                            while (!sc.isLink_System)
                            {
                                sc = sc.super;
                            }

                            var nf = (ICrossExtendAdapterCreator)swc.getNativeFunction(((ClassMethodGetter)sc.crossExtendAdapterCreator.bindField).functionId);

                            linkobject = nf.GetAdapterType();
                        }
                        else
                        {
                            linkobject = null;
                            return(false);
                        }
                    }
                    else
                    {
                        linkobject = null;
                        return(false);
                    }
                }
                else if (at == _objectType_) //托管object
                {
                    if (vt == RunTimeDataType.rt_int)
                    {
                        linkobject = (TypeConverter.ConvertToInt(value));
                    }
                    else if (vt == RunTimeDataType.rt_uint)
                    {
                        linkobject = (TypeConverter.ConvertToUInt(value,null,null));
                    }
                    else if (vt == RunTimeDataType.rt_string)
                    {
                        linkobject = (TypeConverter.ConvertToString(value,null,null));
                    }
                    else if (vt == RunTimeDataType.rt_number)
                    {
                        linkobject = (TypeConverter.ConvertToNumber(value));
                    }
                    else if (vt == RunTimeDataType.rt_boolean)
                    {
                        var b = TypeConverter.ConvertToBoolean(value,null,null);
                        linkobject = b.value;
                    }
                    else if (vt == RunTimeDataType.rt_void)
                    {
                        linkobject = null;
                    }
                    else
                    {
                        linkobject = null;
                        return(false);
                    }
                }
                else
                {
                    linkobject = null;
                    return(false);
                }
            }
            else
            {
                linkobject = null;
                return(false);
            }

            return(true);
        }
Ejemplo n.º 6
0
        private static void build_bracket_access(CompileEnv env, ASTool.AS3.Expr.AS3ExprStep step, RightValueBase v1, Builder builder)
        {
            ASBinCode.StackSlotAccessor eax = env.createASTRegister(step.Arg1.Reg);
            eax.setEAXTypeWhenCompile(RunTimeDataType.rt_void);

            var v2 = ExpressionBuilder.getRightValue(env, step.Arg3, step.token, builder);

            if (v1.valueType == RunTimeDataType.rt_void
                )
            {
                OpStep op = new OpStep(OpCode.bracket_access, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                op.reg      = eax; eax._isDotAccessTarget = true;
                op.regType  = eax.valueType;
                op.arg1     = v1;
                op.arg1Type = v1.valueType;
                op.arg2     = v2;
                op.arg2Type = v2.valueType;


                env.block.opSteps.Add(op);
            }
            else if (v1.valueType > RunTimeDataType.unknown
                     &&
                     builder.bin.dict_Vector_type.ContainsKey(builder.getClassByRunTimeDataType(v1.valueType))
                     )
            {
                ASBinCode.rtti.Class vector = builder.getClassByRunTimeDataType(v1.valueType);
                RunTimeDataType      vt     = builder.bin.dict_Vector_type[vector];

                if (v2.valueType > RunTimeDataType.unknown)
                {
                    v2 = ExpressionBuilder.addCastToPrimitive(env, v2, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile), builder);
                }

                if (v2.valueType == RunTimeDataType.rt_int ||
                    v2.valueType == RunTimeDataType.rt_number ||
                    v2.valueType == RunTimeDataType.rt_uint
                    )
                {
                    v2 = ExpressionBuilder.addCastOpStep(env, v2, RunTimeDataType.rt_int,
                                                         new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)
                                                         , builder);
                    eax.setEAXTypeWhenCompile(vt);

                    {
                        OpStep op = new OpStep(OpCode.vectorAccessor_bind, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                        op.reg      = eax; eax._isDotAccessTarget = true;
                        op.regType  = eax.valueType;
                        op.arg1     = v1;
                        op.arg1Type = v1.valueType;
                        op.arg2     = v2;
                        op.arg2Type = v2.valueType;
                        env.block.opSteps.Add(op);
                    }
                }
                else
                {
                    OpStep op = new OpStep(OpCode.vectorAccessor_convertidx, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                    op.reg      = eax; eax._isDotAccessTarget = true;
                    op.regType  = eax.valueType;
                    op.arg1     = v1;
                    op.arg1Type = v1.valueType;
                    op.arg2     = v2;
                    op.arg2Type = v2.valueType;
                    env.block.opSteps.Add(op);
                }

                //if (v2.valueType != RunTimeDataType.rt_int)
                //{
                //    v2=ExpressionBuilder.addCastOpStep(env, v2, RunTimeDataType.rt_int,
                //        new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)
                //        , builder);
                //}

                //eax.setEAXTypeWhenCompile(vt);
                //eax._vector_Type = vt;
                //{

                //    OpStep op = new OpStep(OpCode.vectorAccessor_bind, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                //    op.reg = eax;
                //    op.regType = eax.valueType;
                //    op.arg1 = v1;
                //    op.arg1Type = v1.valueType;
                //    op.arg2 = v2;
                //    op.arg2Type = v2.valueType;
                //    env.block.opSteps.Add(op);
                //}
            }
            else if (builder.bin.ArrayClass != null && builder.bin.ArrayClass.getRtType() == v1.valueType
                     &&
                     (v2.valueType == RunTimeDataType.rt_int ||
                      v2.valueType == RunTimeDataType.rt_number ||
                      v2.valueType == RunTimeDataType.rt_uint
                     )

                     )
            {
                v1 = builds.ExpressionBuilder.addCastToPrimitive(env, v1, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile), builder);
                v2 = ExpressionBuilder.addCastOpStep(env, v2, RunTimeDataType.rt_int,
                                                     new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)
                                                     , builder);


                OpStep op = new OpStep(OpCode.arrayAccessor_bind, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                op.reg      = eax; eax._isDotAccessTarget = true;
                op.regType  = eax.valueType;
                op.arg1     = v1;
                op.arg1Type = v1.valueType;
                op.arg2     = v2;
                op.arg2Type = v2.valueType;
                env.block.opSteps.Add(op);
            }
            else if (v1.valueType == RunTimeDataType.rt_array
                     &&
                     (v2.valueType == RunTimeDataType.rt_int ||
                      v2.valueType == RunTimeDataType.rt_number ||
                      v2.valueType == RunTimeDataType.rt_uint
                     )
                     )
            {
                v2 = ExpressionBuilder.addCastOpStep(env, v2, RunTimeDataType.rt_int,
                                                     new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile)
                                                     , builder);


                OpStep op = new OpStep(OpCode.arrayAccessor_bind, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                op.reg      = eax; eax._isDotAccessTarget = true;
                op.regType  = eax.valueType;
                op.arg1     = v1;
                op.arg1Type = v1.valueType;
                op.arg2     = v2;
                op.arg2Type = v2.valueType;
                env.block.opSteps.Add(op);
            }
            else
            {
                OpStep op = new OpStep(OpCode.bracket_byname, new SourceToken(step.token.line, step.token.ptr, step.token.sourceFile));
                op.reg      = eax; eax._isDotAccessTarget = true;
                op.regType  = eax.valueType;
                op.arg1     = v1;
                op.arg1Type = v1.valueType;
                op.arg2     = v2;
                op.arg2Type = v2.valueType;
                env.block.opSteps.Add(op);
            }
        }
        public void storeLinkObject_ToSlot(object obj, RunTimeDataType defineReturnType, SLOT returnSlot,IClassFinder bin,Player player)
        {
            if (obj is ICrossExtendAdapter)
            {
                obj = ((ICrossExtendAdapter)obj).AS3Object;
            }

            if (obj == null)
            {
                returnSlot.setValue(ASBinCode.rtData.rtNull.nullptr);
            }
            else
            {
                RunTimeDataType rt = defineReturnType;                 //getLinkType(funcDefine.signature.returnType);
                //RunTimeDataType rt =
                //    getRuntimeDataType(obj.GetType());
                if (rt == RunTimeDataType.rt_void)
                {
                    rt = getRuntimeDataType(obj.GetType());

                    if (rt == _FLOAT)
                    {
                        rt = RunTimeDataType.rt_number;
                    }
                    else if (rt == _SHORT)
                    {
                        rt = RunTimeDataType.rt_int;
                    }
                    else if (rt == _USHORT)
                    {
                        rt = RunTimeDataType.rt_uint;
                    }
                }

                if (rt == _DICT_KEY)
                {
                    DictionaryKey key = (DictionaryKey)obj;
                    rt  = _OBJECT_LINK;
                    obj = key.key;
                }

                if (rt == RunTimeDataType._OBJECT)
                {
                    rt = _OBJECT_LINK;
                }
                if (rt == _OBJECT_LINK)
                {
                    rt = ((RunTimeValueBase)obj).rtType;
                    if (rt < RunTimeDataType.unknown)                    //否则走下面的Object路径
                    {
                        returnSlot.directSet((RunTimeValueBase)obj);
                        return;
                    }
                }

                if (rt == RunTimeDataType.rt_int)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    if (realObjType == RunTimeDataType.rt_uint)
                    {
                        returnSlot.setValue((int)(uint)obj);
                    }
                    else if (realObjType == RunTimeDataType.rt_number)
                    {
                        returnSlot.setValue((int)(double)obj);
                    }
                    else if (realObjType == _FLOAT)
                    {
                        returnSlot.setValue((int)(float)obj);
                    }
                    else if (realObjType == _SHORT)
                    {
                        returnSlot.setValue((int)(short)obj);
                    }
                    else if (realObjType == _USHORT)
                    {
                        returnSlot.setValue((int)(ushort)obj);
                    }
                    else
                    {
                        returnSlot.setValue((int)obj);
                    }
                }
                else if (rt == RunTimeDataType.rt_uint)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    if (realObjType == RunTimeDataType.rt_int)
                    {
                        returnSlot.setValue((uint)(int)obj);
                    }
                    else if (realObjType == RunTimeDataType.rt_number)
                    {
                        returnSlot.setValue((uint)(double)obj);
                    }
                    else if (realObjType == _FLOAT)
                    {
                        returnSlot.setValue((uint)(float)obj);
                    }
                    else if (realObjType == _SHORT)
                    {
                        returnSlot.setValue((uint)(short)obj);
                    }
                    else if (realObjType == _USHORT)
                    {
                        returnSlot.setValue((uint)(ushort)obj);
                    }
                    else
                    {
                        returnSlot.setValue((uint)obj);
                    }
                }
                else if (rt == RunTimeDataType.rt_string)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    returnSlot.setValue((string)obj);
                }
                else if (rt == RunTimeDataType.rt_number)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    if (realObjType == RunTimeDataType.rt_uint)
                    {
                        returnSlot.setValue((double)(uint)obj);
                    }
                    else if (realObjType == RunTimeDataType.rt_int)
                    {
                        returnSlot.setValue((double)(int)obj);
                    }
                    else if (realObjType == _FLOAT)
                    {
                        returnSlot.setValue((double)(float)obj);
                    }
                    else if (realObjType == _SHORT)
                    {
                        returnSlot.setValue((double)(short)obj);
                    }
                    else if (realObjType == _USHORT)
                    {
                        returnSlot.setValue((double)(ushort)obj);
                    }
                    else
                    {
                        returnSlot.setValue((double)obj);
                    }
                }
                else if (rt == RunTimeDataType.rt_boolean)
                {
                    if ((bool)obj)
                    {
                        returnSlot.setValue(ASBinCode.rtData.rtBoolean.True);
                    }
                    else
                    {
                        returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                    }
                }
                else if (rt == RunTimeDataType.rt_array)
                {
                    returnSlot.directSet((ASBinCode.rtData.rtArray)obj);
                }
                else if (rt == RunTimeDataType.rt_function)
                {
                    returnSlot.directSet((ASBinCode.rtData.rtFunction)obj);
                }
                else if (rt > RunTimeDataType.unknown)
                {
                    Class rtCls;                    // = ((ASBinCode.rtData.rtObject)obj).value._class; //bin.getClassByRunTimeDataType(rt);
                    ASBinCode.rtData.rtObjectBase testObj = obj as ASBinCode.rtData.rtObjectBase;
                    if (testObj != null)
                    {
                        rtCls = ((ASBinCode.rtData.rtObjectBase)obj).value._class;

                        if (rtCls.isLink_System)
                        {
                            var f = ((CSWC)bin).class_Creator[rtCls];
                            f.setLinkObjectValueToSlot(returnSlot,player,
                                                       ((LinkSystemObject)testObj.value).GetLinkData(),rtCls);
                        }
                        else
                        {
                            returnSlot.directSet((ASBinCode.rtData.rtObjectBase)obj);
                        }
                    }
                    else
                    {
                        rtCls = bin.getClassByRunTimeDataType(rt);

                        if (rtCls.classid == player.swc.TypeClass.classid)
                        {
                            Type type = obj as Type;
                            if (type != null)
                            {
                                try
                                {
                                    var rttype = getRuntimeDataType(type);
                                    if (rttype < RunTimeDataType.unknown
                                        &&
                                        player.swc.primitive_to_class_table[rttype] != null
                                        )
                                    {
                                        rttype = player.swc.primitive_to_class_table[rttype].getRtType();
                                    }

                                    var rtcls = bin.getClassByRunTimeDataType(rttype);

                                    if (player.init_static_class(rtcls,SourceToken.Empty))
                                    {
                                        returnSlot.directSet(
                                            player.static_instance[rtcls.staticClass.classid]);
                                    }
                                    else
                                    {
                                        throw new ASRunTimeException("转换Class失败",String.Empty);
                                    }
                                }
                                catch (KeyNotFoundException)
                                {
                                    throw new TypeLinkClassException(type.FullName + " 没有链接到脚本");
                                }
                            }
                            else
                            {
                                throw new ASRunTimeException("没有将Class链接到Type",String.Empty);
                            }
                        }
                        else
                        {
                            var f = ((CSWC)bin).class_Creator[rtCls];
                            f.setLinkObjectValueToSlot(returnSlot,player,obj,rtCls);
                        }
                    }
                }
                else
                {
                    throw new ASRunTimeException("意外的链接类型",String.Empty);
                }
            }
        }
Ejemplo n.º 8
0
        private string GetConvertToAS3ParameterFunctionName(RunTimeDataType type)
        {
            string paratype = GetTypeString(type);

            return(GetConvertToAS3ParameterFunctionName(paratype));
        }
 public Vector_Data(RunTimeDataType vector_type)
 {
     this.vector_type = vector_type;
 }
Ejemplo n.º 10
0
 public void setTypeWhenCompile(RunTimeDataType t)
 {
     _type = t;
 }
Ejemplo n.º 11
0
 //序列化时用
 private ClassMember()
 {
     _type = RunTimeDataType.rt_void;
 }
Ejemplo n.º 12
0
        public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success)
        {
            success = true;

            if (argements[0].rtType == RunTimeDataType.rt_null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[0].name + "不能为null");

                return;
            }

            Class cls = bin.getClassByRunTimeDataType(argements[0].rtType).instanceClass;

            if (argements[1].rtType == RunTimeDataType.rt_null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "不能为null");

                return;
            }
            else if (argements[1].rtType < RunTimeDataType.unknown)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组");

                return;
            }

            LinkSystemObject lengthsObj = ((ASBinCode.rtData.rtObjectBase)argements[1]).value as LinkSystemObject;

            if (lengthsObj == null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组");

                return;
            }
            int[] lengths = lengthsObj.GetLinkData() as int[];
            if (lengths == null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组int[]");

                return;
            }

            //int length = TypeConverter.ConvertToInt(argements[1], stackframe, token);

            Class _array_ = ((ASBinCode.rtData.rtObjectBase)thisObj).value._class;

            var arr = stackframe.player.alloc_pureHostedOrLinkedObject(_array_.instanceClass);

            LinkSystemObject lo = (LinkSystemObject)arr.value;


            try
            {
                RunTimeDataType et = cls.getRtType();
                RunTimeDataType ot;
                if (TypeConverter.Object_CanImplicit_ToPrimitive(cls,out ot))
                {
                    et = ot;
                }

                Type elementType = stackframe.player.linktypemapper.getLinkType(et);
                lo.SetLinkData(Array.CreateInstance(elementType,lengths));

                returnSlot.directSet(arr);
            }
            catch (KeyNotFoundException)
            {
                success = false;
                stackframe.throwArgementException(token,"类型" + cls + "不是一个链接到系统类库的对象,不能创建托管数组");
            }
            catch (ArgumentOutOfRangeException a)
            {
                success = false;
                stackframe.throwAneException(token,a.Message);
            }
            catch
            {
                throw new EngineException();
            }
        }
Ejemplo n.º 13
0
 public DynamicPropertySlot(ASBinCode.rtData.rtObjectBase obj, bool _canDelete, RunTimeDataType functionClassRtType) : base(obj, functionClassRtType, RunTimeDataType.rt_void, null)
 {
     this._canDelete      = _canDelete;
     propertyIsEnumerable = false;
 }
 public DictionarySlot(ASBinCode.rtData.rtObjectBase obj, RunTimeDataType functionClassRtType) : base(obj, functionClassRtType, RunTimeDataType.rt_void, null)
 {
     propertyIsEnumerable = false;
 }