private void exec_step3(ASBinCode.rtData.rtObjectBase rtobject) { if (constructor == null) { objectResult = rtobject; //objectResult.directSet(rtobject); if (callbacker != null) { callbacker.call(this); callbacker = null; } } else { HeapSlot _temp = tempSlot; _temp.directSet(ASBinCode.rtData.rtUndefined.undefined); _function_constructor.returnSlot = _temp; //_function_constructor.function = (ASBinCode.rtData.rtFunction)TypeConverter.ObjectImplicit_ToPrimitive(constructor).Clone(); //_function_constructor.function.setThis(rtobject); _function_constructor.SetFunction((ASBinCode.rtData.rtFunction)TypeConverter.ObjectImplicit_ToPrimitive(constructor),rtobject); BlockCallBackBase cb = player.blockCallBackPool.create(); cb.args = cb.cacheObjects; //new object[] { rtobject , _temp }; cb.cacheObjects[0] = rtobject; cb.cacheObjects[1] = _temp; cb.setCallBacker(_finalStep); _function_constructor.callbacker = cb; _function_constructor.call(); _function_constructor = null; } }
//public override NativeFunctionMode mode //{ // get // { // return NativeFunctionMode.normal_1; // } //} //public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argements, object stackframe, out string errormessage, out int errorno) //{ // throw new ASRunTimeException(); //} //public override void execute2(RunTimeValueBase thisObj, FunctionDefine functionDefine, SLOT[] argements, SLOT returnSlot, SourceToken token, object stackframe, out bool success) //{ // success = true; // ASBinCode.rtData.rtObject obj = argements[0].getValue() as ASBinCode.rtData.rtObject; // if (obj == null) // { // returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); // return; // } // LinkSystemObject other = obj.value as LinkSystemObject; // if (other == null) // { // returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); // return; // } // LinkSystemObject iv = ((LinkSystemObject)((ASBinCode.rtData.rtObject)thisObj).value); // if (System.Object.Equals(iv, other)) // { // returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); // return; // } // else // { // returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); // return; // } //} public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success) { success = true; ASBinCode.rtData.rtObjectBase obj = argements[0] as ASBinCode.rtData.rtObjectBase; if (obj == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject other = obj.value as LinkSystemObject; if (other == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject iv = ((LinkSystemObject)((ASBinCode.rtData.rtObjectBase)thisObj).value); if (System.Object.Equals(iv,other)) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); return; } else { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } }
public override RunTimeValueBase execute(RunTimeValueBase thisObj,SLOT[] argements,object stackframe,out string errormessage,out int errorno) { errormessage = null; errorno = 0; string name = TypeConverter.ConvertToString(argements[0].getValue(),null,null); bool isEnum = TypeConverter.ConvertToBoolean(argements[1].getValue(),null,null).value; if (string.IsNullOrEmpty(name)) { return(ASBinCode.rtData.rtUndefined.undefined); } ASBinCode.rtData.rtObjectBase obj = (ASBinCode.rtData.rtObjectBase)thisObj; if (!(obj.value is ASBinCode.rtti.DynamicObject)) { return(ASBinCode.rtData.rtUndefined.undefined); } ASBinCode.rtti.DynamicObject dobj = (ASBinCode.rtti.DynamicObject)obj.value; if (dobj is ASBinCode.rtti.DictionaryObject) { return(ASBinCode.rtData.rtUndefined.undefined); } if (dobj.hasproperty(name)) { dobj.setPropertyIsEnumerable(name,isEnum); } return(ASBinCode.rtData.rtUndefined.undefined); }
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 override void execute2(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT[] argements,SLOT returnSlot,SourceToken token,object stackframe,out bool success) { //base.execute2(thisObj, functionDefine, argements, returnSlot, stackframe, out success); success = true; var a1 = argements[0].getValue(); var a2 = argements[1].getValue(); if (a1.rtType == a2.rtType && a1.rtType == RunTimeDataType.rt_null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); return; } ASBinCode.rtData.rtObjectBase obj = a1 as ASBinCode.rtData.rtObjectBase; if (obj == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject o1 = obj.value as LinkSystemObject; if (o1 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } ASBinCode.rtData.rtObjectBase obj2 = a2 as ASBinCode.rtData.rtObjectBase; if (obj2 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject o2 = obj2.value as LinkSystemObject; if (o2 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } if (object.ReferenceEquals(o1.GetLinkData(),o2.GetLinkData())) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); return; } else { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } }
public static void _doSetThisItem(ASBinCode.rtData.rtObjectBase thisObj, RunTimeValueBase v,RunTimeValueBase index,StackSlot slot,StackFrame frame,OpStep step ) { //***读取setter*** RunTimeValueBase func; func = ((MethodGetterBase)thisObj.value._class.set_this_item.bindField).getMethod( thisObj ); //***调用设置器*** var funCaller = frame.player.funcCallerPool.create(frame,step.token); funCaller.SetFunction((ASBinCode.rtData.rtFunction)func); ((ASBinCode.rtData.rtFunction)func).Clear(); funCaller.loadDefineFromFunction(); if (!funCaller.createParaScope()) { return; } //funCaller.releaseAfterCall = true; bool success; funCaller.pushParameter(v,0,out success); if (!success) { frame.endStep(step); return; } funCaller.pushParameter(index,1,out success); if (!success) { frame.endStep(step); return; } funCaller._tempSlot = frame._tempSlot1; funCaller.returnSlot = frame._tempSlot1; BlockCallBackBase cb = frame.player.blockCallBackPool.create(); cb.setCallBacker(_setthisitem_callbacker); cb.step = step; cb.args = frame; funCaller.callbacker = cb; funCaller.call(); return; }
private static void afterCreateInstanceDataCallBacker(BlockCallBackBase sender,object args) { InstanceCreator ic = (InstanceCreator)sender.args; ASBinCode.rtti.Object obj = (ASBinCode.rtti.Object)sender.cacheObjects[0]; RunTimeScope objScope = (RunTimeScope)sender.cacheObjects[2]; ASBinCode.rtData.rtObjectBase rtObject = (ASBinCode.rtData.rtObjectBase)sender.cacheObjects[1]; ic.toNoticeFailed1 = sender; ic.exec_step2(obj,objScope,rtObject); ic.toNoticeFailed1 = null; }
internal Iterator(ASBinCode.RunTimeValueBase v, Player player) { this.player = player; if (v.rtType > ASBinCode.RunTimeDataType.unknown) { var cls = player.swc.getClassByRunTimeDataType(v.rtType); if (cls.isLink_System) { var lobj = ((ASBinCode.rtti.LinkSystemObject)((ASBinCode.rtData.rtObjectBase)v).value).GetLinkData(); if (lobj is System.Collections.IEnumerator) { innerenumerator = (System.Collections.IEnumerator)lobj; } else if (lobj is System.Collections.IEnumerable) { innerenumerator = ((System.Collections.IEnumerable)lobj).GetEnumerator(); } else { throw new InvalidCastException("不能将" + v.ToString() + "包装为Iterator"); } } else if (ASRuntime.TypeConverter.testImplicitConvert(v.rtType, player.swc.IEnumeratorInterface.getRtType(), player.swc)) { as3ienumerator = (ASBinCode.rtData.rtObjectBase)v; get_current = player.getMethod(as3ienumerator, "@current_get"); movenext = player.getMethod(as3ienumerator, "moveNext"); reset = player.getMethod(as3ienumerator, "reset"); } else if (ASRuntime.TypeConverter.testImplicitConvert(v.rtType, player.swc.IEnumerableInterface.getRtType(), player.swc)) { var getenumerator = player.getMethod((ASBinCode.rtData.rtObjectBase)v, "getEnumerator"); as3ienumerator = (ASBinCode.rtData.rtObjectBase)player.InvokeFunction(getenumerator, 0, null, null, null, null, null, null); get_current = player.getMethod(as3ienumerator, "@current_get"); movenext = player.getMethod(as3ienumerator, "moveNext"); reset = player.getMethod(as3ienumerator, "reset"); } else { throw new InvalidCastException("不能将" + v.ToString() + "包装为Iterator"); } } else { throw new InvalidCastException("不能将" + v.ToString() + "包装为Iterator"); } }
public override void execute2(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT[] argements,SLOT returnSlot,SourceToken token,object stackframe,out bool success) { //base.execute2(thisObj, functionDefine, argements, returnSlot, stackframe, out success); success = true; ASBinCode.rtData.rtObjectBase obj = argements[0].getValue() as ASBinCode.rtData.rtObjectBase; if (obj == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject o1 = obj.value as LinkSystemObject; if (o1 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } ASBinCode.rtData.rtObjectBase obj2 = argements[1].getValue() as ASBinCode.rtData.rtObjectBase; if (obj2 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } LinkSystemObject o2 = obj2.value as LinkSystemObject; if (o2 == null) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } if (System.Object.Equals(o1,o2)) { returnSlot.setValue(ASBinCode.rtData.rtBoolean.True); return; } else { returnSlot.setValue(ASBinCode.rtData.rtBoolean.False); return; } }
public void clear() { token = null; _class = null; step = null; callbacker = null; constructorCaller = null; objectResult = null; constructor = null; _function_constructor = null; objectStoreToSlot = null; toNoticeFailed1 = null; toNoticeFailed2 = null; tempSlot.directSet(ASBinCode.rtData.rtUndefined.undefined); }
public override RunTimeValueBase execute(RunTimeValueBase thisObj,SLOT[] argements,object stackframe,out string errormessage,out int errorno) { errormessage = null; errorno = 0; string name = TypeConverter.ConvertToString(argements[0].getValue(),null,null); if (String.IsNullOrEmpty(name)) { return(ASBinCode.rtData.rtBoolean.False); } //固定实例属性 — 对象类定义的非静态变量、常量或方法; //继承的固定实例属性 — 对象类继承的变量、常量或方法; //动态属性 — 对象实例化后添加到其中的属性(在其类定义之外)。要添加动态属性,必须用 dynamic 关键字声明对象的定义类。 //return new ASBinCode.rtData.rtString(TypeConverter.ConvertToString(thisObj, null, null)); ASBinCode.rtData.rtObjectBase obj = (ASBinCode.rtData.rtObjectBase)thisObj; if (ClassMemberFinder.find(obj.value._class,name,null) != null) { return(ASBinCode.rtData.rtBoolean.True); } if (obj.value is ASBinCode.rtti.DynamicObject) { ASBinCode.rtti.DynamicObject d = (ASBinCode.rtti.DynamicObject)obj.value; if (d.hasproperty(name)) { return(ASBinCode.rtData.rtBoolean.True); } else { return(ASBinCode.rtData.rtBoolean.False); } } return(ASBinCode.rtData.rtBoolean.False); }
public override RunTimeValueBase execute(RunTimeValueBase thisObj,SLOT[] argements,object stackframe,out string errormessage,out int errorno) { errormessage = null; errorno = 0; string name = TypeConverter.ConvertToString(argements[0].getValue(),null,null); if (string.IsNullOrEmpty(name)) { return(ASBinCode.rtData.rtBoolean.False); } ASBinCode.rtData.rtObjectBase obj = (ASBinCode.rtData.rtObjectBase)thisObj; if (!(obj.value is ASBinCode.rtti.DynamicObject)) { return(ASBinCode.rtData.rtBoolean.False); } ASBinCode.rtti.DynamicObject dobj = (ASBinCode.rtti.DynamicObject)obj.value; if (dobj.hasproperty(name)) { if (dobj.propertyIsEnumerable(name)) { return(ASBinCode.rtData.rtBoolean.True); } else { return(ASBinCode.rtData.rtBoolean.False); } } else { return(ASBinCode.rtData.rtBoolean.False); } }
public DictionarySlot(ASBinCode.rtData.rtObjectBase obj, RunTimeDataType functionClassRtType) : base(obj, functionClassRtType, RunTimeDataType.rt_void, null) { propertyIsEnumerable = false; }
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); } } }
private static ASBinCode.rtti.Object createObject(CSWC swc,Class cls,InstanceCreator creator, out ASBinCode.rtData.rtObjectBase rtObjectBase, out ASBinCode.rtData.rtObjectBase linkrtobj, out string errinfo ) { ASBinCode.rtti.Object obj = null;// = new ASBinCode.rtti.Object(cls); rtObjectBase = null; linkrtobj = null; errinfo = null; if (cls.isLink_System) { if (creator != null) { StackSlot stackSlot = creator.objectStoreToSlot as StackSlot; if (stackSlot != null) { rtObjectBase = stackSlot.getStackCacheObject(cls); return(rtObjectBase.value); } } var func = (NativeFunctionBase)swc.class_Creator[cls]; string err; int no; ASBinCode.rtData.rtObjectBase rtObj = func.execute(null,null,cls,out err,out no) as ASBinCode.rtData.rtObjectBase; linkrtobj = rtObj; if (rtObj == null) { errinfo = cls.ToString() + " create linksystem object failed"; return(null); } else { return(rtObj.value); } } else if (cls.isCrossExtend) { var scls = cls.super; while (!scls.isLink_System) { scls = scls.super; } var cextend = scls.staticClass.linkObjCreator; var func = swc.getNativeFunction(((ClassMethodGetter)cextend.bindField).functionId); if (func == null) { errinfo = cls.ToString() + " create crossextend object failed, creator function not found"; return(null); } string err; int no; ASBinCode.rtData.rtObjectBase rtObj = func.execute(null,null,cls,out err,out no) as ASBinCode.rtData.rtObjectBase; linkrtobj = rtObj; if (rtObj == null) { errinfo = cls.ToString() + " create crossextend object failed"; return(null); } else { LinkSystemObject lo = (LinkSystemObject)rtObj.value; return(lo); } } else if ( swc.DictionaryClass != null && ClassMemberFinder.isInherits(cls,swc.DictionaryClass)) { obj = new DictionaryObject(cls); } else if (cls.dynamic) { if (cls.isUnmanaged) { obj = new HostedDynamicObject(cls); } else { obj = new DynamicObject(cls); } } else if (cls.isUnmanaged) { obj = new HostedObject(cls); } else { obj = new ASBinCode.rtti.Object(cls); } return(obj); }
public void SetAS3RuntimeEnvironment(Player player, Class typeclass, ASBinCode.rtData.rtObjectBase bindAS3Object) { this.player = player; this.typeclass = typeclass; this.bindAS3Object = bindAS3Object; }
public static void _do_prop_read( ClassPropertyGetter prop,StackFrame frame,OpStep step,Player player,RunTimeScope scope, ASBinCode.rtData.rtObjectBase propBindObj,Class superPropBindClass ) { do { //***调用访问器。*** if (prop.getter == null) { frame.throwError( step.token,0,"Illegal read of write-only property" ); break; } //检查访问权限 CodeBlock block = player.swc.blocks[scope.blockId]; Class finder; if (block.isoutclass) { var c = prop._class; if (c.instanceClass != null) { c = c.instanceClass; } if (c.mainClass != null) { c = c.mainClass; } if (block.define_class_id == c.classid) { finder = player.swc.classes[block.define_class_id]; } else { finder = null; } } else { finder = player.swc.classes[block.define_class_id]; } var getter = ClassMemberFinder.find(prop._class,prop.getter.name,finder); if (getter == null || getter.bindField != prop.getter) { frame.throwError( step.token,0,"Illegal read of write-only property" ); break; } //***读取getter*** RunTimeValueBase func; if (superPropBindClass != null) { func = ((MethodGetterBase)getter.bindField).getSuperMethod( //propslot.bindObj.objScope propBindObj.objScope, superPropBindClass ); } else { func = ((MethodGetterBase)getter.bindField).getMethod( //propslot.bindObj.objScope propBindObj ); } //***调用访问器*** var funCaller = player.funcCallerPool.create(frame,step.token); //funCaller.releaseAfterCall = true; funCaller.SetFunction((ASBinCode.rtData.rtFunction)func); ((ASBinCode.rtData.rtFunction)func).Clear(); funCaller.loadDefineFromFunction(); if (!funCaller.createParaScope()) { return; } funCaller._tempSlot = frame._tempSlot1; funCaller.returnSlot = step.reg.getSlot(scope,frame); ((StackSlot)funCaller.returnSlot).stackObjects.propGetSet = prop; ((StackSlot)funCaller.returnSlot).refPropChanged = true; ((StackSlot)funCaller.returnSlot).stackObjects.propBindObj = propBindObj; BlockCallBackBase cb = frame.player.blockCallBackPool.create(); cb.setCallBacker(D_getter_callbacker); cb.step = step; cb.args = frame; funCaller.callbacker = cb; funCaller.call(); return; } while (false); frame.endStep(step); }
private void exec_step2( ASBinCode.rtti.Object obj, RunTimeScope objScope,ASBinCode.rtData.rtObjectBase _object) { //***添加Object的动态对象**** if ( //(obj._class.classid == 0) obj is DynamicObject && obj._class.staticClass != null) { DynamicObject dobj = (DynamicObject)obj; if (constructor == null) { dobj.createproperty("constructor",new DynamicPropertySlot(_object,false,player.swc.FunctionClass.getRtType())); dobj["constructor"].directSet(player.static_instance[obj._class.staticClass.classid]); dobj._prototype_ = (DynamicObject)player.static_instance[_class.staticClass.classid].value; } else { dobj._prototype_ = (DynamicObject)constructor.value; } } ClassMember ctor = obj._class.constructor; //if (obj._class.isCrossExtend) //{ // //***创建Adapter*** // var scls = obj._class.super; // while (!scls.isLink_System) // { // scls = scls.super; // } // ctor = scls.crossExtendAdapterCreator; // var nf = player.swc.getNativeFunction(((MethodGetterBase)ctor.bindField).functionId); // if (!(nf is ICrossExtendAdapterCreator)) // { // invokerFrame.throwAneException(token, "adapter不是ICrossExtendAdapterCreator"); // callbacker.noticeRunFailed(); // noticeWhenCreateAneFailed(); // invokerFrame.endStep(); // return; // } // constructorCaller.toCallFunc = player.swc.functions[((MethodGetterBase)ctor.bindField).functionId]; //} //调用构造函数 if (ctor != null) { ASBinCode.rtData.rtFunction function = (ASBinCode.rtData.rtFunction)((MethodGetterBase)ctor.bindField).getConstructor(objScope); HeapSlot _temp = tempSlot; constructorCaller.returnSlot = _temp; constructorCaller.SetFunction(function); function.Clear(); //afterCallConstructor callbacker = new afterCallConstructor(); var callbacker = player.blockCallBackPool.create(); callbacker.args = this; //callbacker.obj = obj; //callbacker.objScope = objScope; //callbacker.rtObject = _object; callbacker.cacheObjects[0] = _object; callbacker.setWhenFailed(creatorFailed); callbacker.setCallBacker(afterCallConstructorCallbacker); constructorCaller.callbacker = callbacker; toNoticeFailed2 = callbacker; constructorCaller.call(); toNoticeFailed2 = null; constructorCaller = null; } else { exec_step3(_object); } }
public static void _doPropAssigning(ClassPropertyGetter prop,StackFrame frame, OpStep step,Player player,RunTimeScope scope, ASBinCode.rtData.rtObjectBase bindobj,RunTimeValueBase v,StackSlot sslot) { do { if (prop.setter == null) { frame.throwError( step.token,0,"Illegal write to read-only property " ); break; } //检查访问权限 CodeBlock block = player.swc.blocks[scope.blockId]; Class finder; if (block.isoutclass) { var c = prop._class; if (c.instanceClass != null) { c = c.instanceClass; } if (c.mainClass != null) { c = c.mainClass; } if (block.define_class_id == c.classid) { finder = player.swc.classes[block.define_class_id]; } else { finder = null; } } else { finder = player.swc.classes[block.define_class_id]; } var setter = ClassMemberFinder.find(prop._class,prop.setter.name,finder); if (setter == null || setter.bindField != prop.setter) { frame.throwError( step.token,0,"Illegal write to read-only property " ); break; } //***读取setter*** RunTimeValueBase func; if (sslot.stackObjects.superPropBindClass != null) { func = ((MethodGetterBase)setter.bindField).getSuperMethod( bindobj.objScope, sslot.stackObjects.superPropBindClass ); } else { func = ((MethodGetterBase)setter.bindField).getMethod( bindobj ); } //***调用设置器*** var funCaller = frame.player.funcCallerPool.create(frame,step.token); funCaller.SetFunction((ASBinCode.rtData.rtFunction)func); ((ASBinCode.rtData.rtFunction)func).Clear(); funCaller.loadDefineFromFunction(); if (!funCaller.createParaScope()) { return; } //funCaller.releaseAfterCall = true; bool success; funCaller.pushParameter(v,0,out success); if (!success) { frame.endStep(step); return; } funCaller._tempSlot = frame._tempSlot1; funCaller.returnSlot = frame._tempSlot1; BlockCallBackBase cb = frame.player.blockCallBackPool.create(); cb.setCallBacker(_assign_callbacker); cb.step = step; cb.args = frame; funCaller.callbacker = cb; funCaller.call(); return; } while (false); frame.endStep(step); }
/// <summary> /// 对于可以隐式转换到基本类型的对象,执行隐式转换 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static ASBinCode.RunTimeValueBase ObjectImplicit_ToPrimitive(ASBinCode.rtData.rtObjectBase obj) { //return ASBinCode.rtData.rtUndefined.undefined; return(obj.value.memberData[0].getValue()); }