public StackSlotAccessor buildAccessThisMember(ASTool.Token matchtoken, CompileEnv env) { if (!(member is VariableBase)) { throw new BuildException(new BuildError( matchtoken.line, matchtoken.ptr, matchtoken.sourceFile, "包外数据期望一个Variable")); } VariableBase var = (VariableBase)member; var eax_member = env.getAdditionalRegister(); eax_member.setEAXTypeWhenCompile(var.valueType); OpStep op = new OpStep(OpCode.link_outpackagevairable, new SourceToken(matchtoken.line, matchtoken.ptr, matchtoken.sourceFile)); op.reg = eax_member; op.regType = eax_member.valueType; op.arg1 = var; op.arg1Type = var.valueType; op.arg2 = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(outscopeclass.classid)); op.arg2Type = RunTimeDataType.rt_int; env.block.opSteps.Add(op); return(eax_member); }
public LeftValueBase buildAccessThisMember(ASTool.Token matchtoken, CompileEnv env) { if ( !(classMember.bindField is VariableBase) && env.block.scope is ASBinCode.scopes.FunctionScope && env.block.scope.parentScope is ASBinCode.scopes.ObjectInstanceScope && ((ASBinCode.scopes.ObjectInstanceScope)env.block.scope.parentScope)._class == static_class._class ) { return((LeftValueBase)classMember.bindField); } else { OpStep stepInitClass = new OpStep(OpCode.init_staticclass, new SourceToken(matchtoken.line, matchtoken.ptr, matchtoken.sourceFile)); stepInitClass.arg1 = new ASBinCode.rtData.RightValue( new ASBinCode.rtData.rtInt(static_class._class.instanceClass.classid)); stepInitClass.arg1Type = static_class._class.getRtType(); env.block.opSteps.Add(stepInitClass); var _buildin_ = static_class; var eax_member = env.getAdditionalRegister(); eax_member.setEAXTypeWhenCompile(classMember.valueType); eax_member._regMember = classMember; eax_member._regMemberSrcObj = _buildin_; AccessBuilder.make_dotStep(env, classMember, matchtoken, eax_member, _buildin_); return(eax_member); } }
public void build_class(CompileEnv env, ASBinCode.rtti.Class _class, ASTool.Token token, Builder builder, StackSlotAccessor outeax, List <ASTool.AS3.Expr.AS3DataStackElement> args ) { //***查找构造函数** if (_class.constructor != null) { MethodGetterBase field = (MethodGetterBase)_class.constructor.bindField; //(Field)builder._classbuildingEnv[_class].block.scope.members[_class.constructor.index]; int blockid = field.refdefinedinblockid; var signature = builder.dictSignatures[blockid][field]; FuncCallBuilder funcbuilder = new FuncCallBuilder(); funcbuilder.createParaOp(args, signature, token, env, field, builder, true, _class); } else { OpStep opMakeArgs = new OpStep(OpCode.prepare_constructor_argement, new SourceToken(token.line, token.ptr, token.sourceFile)); opMakeArgs.arg1 = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(_class.classid)); opMakeArgs.arg1Type = RunTimeDataType.rt_int; env.block.opSteps.Add(opMakeArgs); } OpStep op = new OpStep(OpCode.new_instance, new SourceToken(token.line, token.ptr, token.sourceFile)); op.arg1 = new RightValue(new rtInt(_class.classid)); op.arg1Type = _class.getRtType(); outeax.setEAXTypeWhenCompile(_class.getRtType()); op.reg = outeax; op.regType = _class.getRtType(); env.block.opSteps.Add(op); }
public void build_class(CompileEnv env, ASBinCode.rtti.Class _class, ASTool.Token token, Builder builder, StackSlotAccessor outeax, List <ASTool.AS3.Expr.AS3DataStackElement> args ) { var _cls = _class; if (_cls.staticClass == null) { _cls = _cls.instanceClass; } if (_cls.isLink_System) { OpStep stepInitClass = new OpStep(OpCode.init_staticclass, new SourceToken(token.line, token.ptr, token.sourceFile)); stepInitClass.arg1 = new ASBinCode.rtData.RightValue( new ASBinCode.rtData.rtInt(_cls.classid)); stepInitClass.arg1Type = _cls.staticClass.getRtType(); env.block.opSteps.Add(stepInitClass); } //***查找构造函数** if (_class.constructor != null) { MethodGetterBase field = (MethodGetterBase)_class.constructor.bindField; //(Field)builder._classbuildingEnv[_class].block.scope.members[_class.constructor.index]; int blockid = field.refdefinedinblockid; var signature = builder.dictSignatures[blockid][field]; FuncCallBuilder funcbuilder = new FuncCallBuilder(); OpStep opMakeArgs = null; funcbuilder.createParaOp(out opMakeArgs, args, signature, token, env, field, builder, true, _class); if (_cls.isLink_System) { if (signature.parameters.Count == 0) { opMakeArgs.opCode = OpCode.prepare_constructor_argement_linksystem; opMakeArgs.memregid1 = 0; } else { bool canconvert = true; for (int i = 0; i < signature.parameters.Count; i++) { if (signature.parameters[i].defaultValue != null || signature.parameters[i].isPara) { canconvert = false; } } if (canconvert) { opMakeArgs.opCode = OpCode.prepare_constructor_argement_linksystem; opMakeArgs.memregid1 = (short)signature.parameters.Count; } } } } else { OpStep opMakeArgs = new OpStep(OpCode.prepare_constructor_argement, new SourceToken(token.line, token.ptr, token.sourceFile)); opMakeArgs.arg1 = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(_class.classid)); opMakeArgs.arg1Type = RunTimeDataType.rt_int; env.block.opSteps.Add(opMakeArgs); if (_cls.isLink_System) { opMakeArgs.opCode = OpCode.prepare_constructor_argement_linksystem; opMakeArgs.memregid1 = 0; } } OpStep op = new OpStep(OpCode.new_instance, new SourceToken(token.line, token.ptr, token.sourceFile)); op.arg1 = new RightValue(new rtInt(_class.classid)); op.arg1Type = _class.getRtType(); outeax.setEAXTypeWhenCompile(_class.getRtType()); op.reg = outeax; op.regType = _class.getRtType(); env.block.opSteps.Add(op); }
public static List <ASBinCode.rtti.Class> findClassFromImports(string t, Builder builder, ASTool.Token token) { List <ASBinCode.rtti.Class> result = new List <ASBinCode.rtti.Class>(); if (!builder.isEval) { if (t.StartsWith("Vector.<")) { ASBinCode.rtti.Class outvectortype = null; t = builder.build_vector(t, token, out outvectortype); //如果是Vector,则先编译Vector类 result.Add(outvectortype); return(result); } } //***查找类定义*** //if (builder._buildingClass.Count > 0) //{ // //***查找是否是当前类的包外类 // var cls = builder._buildingClass.Peek(); // if (cls.mainClass == null) // { // //***查找当前类的包外类*** // foreach (var item in builder.buildingclasses) // { // if (item.Value.mainClass == cls) // { // if (item.Value.name.Equals(cls.name + "$" + t, StringComparison.Ordinal)) // { // result.Add(item.Value); // //return ASBinCode.RunTimeDataType.unknown; // } // } // } // } //} if (builder._currentImports.Count > 0) { //**查找当前导入的类 var imports = builder._currentImports.Peek(); for (int i = 0; i < imports.Count; i++) { if (imports[i].isPackageFunction) { continue; } if (t.IndexOf(".") > -1 && !t.StartsWith("Vector.<")) //完全限定名 { if ((imports[i].package + "." + imports[i].name).Equals(t, StringComparison.Ordinal)) { result.Add(imports[i]); } } else { string name = imports[i].name; if (name.Equals(t, StringComparison.Ordinal)) { result.Add(imports[i]); } } } } return(result); }
public static List <ASBinCode.rtti.Class> findPackageFunction(string t, Builder builder, ASTool.Token token) { List <ASBinCode.rtti.Class> result = new List <ASBinCode.rtti.Class>(); if (!builder.isEval) { if (t.StartsWith("Vector.<")) { return(result); } } if (builder.buildingclasses.Count > 0) { //在所有类中查找 List <ASBinCode.rtti.Class> imports = new List <ASBinCode.rtti.Class>(); foreach (var item in builder.buildingclasses) { imports.Add(item.Value); } for (int i = 0; i < imports.Count; i++) { if (!imports[i].isPackageFunction) { continue; } if (t.IndexOf(".") > -1 && !t.StartsWith("Vector.<")) //完全限定名 { if ((imports[i].package + "." + imports[i].name).Equals(t, StringComparison.Ordinal)) { result.Add(imports[i]); } } else { string name = imports[i].name; if (name.Equals(t, StringComparison.Ordinal)) { result.Add(imports[i]); } } } } return(result); }
public static List <ASBinCode.rtti.Class> findPackageFunctionFromImports(string t, Builder builder, ASTool.Token token) { List <ASBinCode.rtti.Class> result = new List <ASBinCode.rtti.Class>(); if (!builder.isEval) { if (t.StartsWith("Vector.<")) { return(result); } } if (builder._currentImports.Count > 0) { //**查找当前导入的类 var imports = builder._currentImports.Peek(); for (int i = 0; i < imports.Count; i++) { if (!imports[i].isPackageFunction) { continue; } if (t.IndexOf(".") > -1 && !t.StartsWith("Vector.<")) //完全限定名 { if ((imports[i].package + "." + imports[i].name).Equals(t, StringComparison.Ordinal)) { result.Add(imports[i]); } } else { string name = imports[i].name; if (name.Equals(t, StringComparison.Ordinal)) { result.Add(imports[i]); } } } } return(result); }
/// <summary> /// 从源代码的类型字符串中转换成运行时类型 /// </summary> /// <param name="t"></param> /// <returns></returns> public static ASBinCode.RunTimeDataType fromSourceCodeStr( string t, ASTool.Token token, Builder builder ) { if (t == "*" || t == "void") { return(rt.rt_void); } else if (t == "Boolean") { return(rt.rt_boolean); } else if (t == "int") { return(ASBinCode.RunTimeDataType.rt_int); } else if (t == "uint") { return(ASBinCode.RunTimeDataType.rt_uint); } else if (t == "Number") { return(ASBinCode.RunTimeDataType.rt_number); } else if (t == "String") { return(ASBinCode.RunTimeDataType.rt_string); } else if (t == "Function") { return(ASBinCode.RunTimeDataType.rt_function); } else if (t == "Array") { return(rt.rt_array); } else { //***查找类定义*** var found = findClassFromImports(t, builder, token); if (found.Count == 1) { return(found[0].getRtType()); // ASBinCode.RunTimeDataType.unknown; } else if (found.Count > 1) { throw new BuildException(token.line, token.ptr, token.sourceFile, "类型" + t + "不明确." ); } else { throw new BuildException(token.line, token.ptr, token.sourceFile, "类型" + t + "未实现" ); } } }
public static void make_dotStep(CompileEnv env, ASBinCode.rtti.ClassMember member, ASTool.Token token, StackSlotAccessor eax, RightValueBase rvObj ) { OpStep op = new OpStep( member.bindField is MethodGetterBase ? OpCode.access_method : OpCode.access_dot , new SourceToken(token.line, token.ptr, token.sourceFile)); RightValueBase field = (RightValueBase)member.bindField; op.reg = eax; eax._isDotAccessTarget = true; op.regType = eax.valueType; op.arg1 = rvObj; op.arg1Type = rvObj.valueType; op.arg2 = field; op.arg2Type = member.valueType; env.block.opSteps.Add(op); }
public static ASBinCode.IMember find(string name, CompileEnv env, bool isStaticMember, Builder builder, ASTool.Token token) { //List<IScope> findpath = new List<IScope>(); //List<IScope> outscopes = new List<IScope>();//查找顺序,最后查找包外代码 //Dictionary<IScope, ASBinCode.rtti.Class> finderclass = new Dictionary<IScope, ASBinCode.rtti.Class>(); //{ // ASBinCode.rtti.Class defineClass = null; // IScope s = env.block.scope; // while (s !=null) // { // if (s is ASBinCode.scopes.ObjectInstanceScope) // { // ASBinCode.rtti.Class cls = ((ASBinCode.scopes.ObjectInstanceScope)s)._class; // if (isStaticMember && cls.staticClass != null) // { // cls = cls.staticClass; // } // if (defineClass == null) // { // defineClass = cls; // if (cls.mainClass != null) // { // defineClass = cls.mainClass; // } // } // } // finderclass.Add(s,defineClass); // if (s is ASBinCode.scopes.OutPackageMemberScope && !(ReferenceEquals(s,env.block.scope))) // { // outscopes.Add(s); // } // else // { // findpath.Add(s); // } // s = s.parentScope; // } // findpath.AddRange(outscopes); //} //ASBinCode.IScope scope = null; //for (int j = 0; j < findpath.Count; j++) //{ // scope = findpath[j]; // if (scope is ASBinCode.scopes.ObjectInstanceScope) // { // //查找类方法 // ASBinCode.rtti.Class cls = ((ASBinCode.scopes.ObjectInstanceScope)scope)._class; // var fm = ASBinCode.ClassMemberFinder.find(cls, name, finderclass[scope]); // if (fm != null) // { // return fm.bindField; // } // } // if (!(scope is ASBinCode.scopes.OutPackageMemberScope) // || // ( // finderclass[scope] == null // || // ((ASBinCode.scopes.OutPackageMemberScope)scope).mainclass == finderclass[scope] // ) // ) // { // //从后往前找。可解决catch块同名变量e问题 // for (int i = scope.members.Count - 1; i >= 0; i--) // { // if (scope.members[i].name == name // ) // { // return scope.members[i].clone(); // } // } // } //} bool skipoutpackagescope = false; ASBinCode.rtti.Class defineClass = null; ASBinCode.IScope scope = env.block.scope; while (scope != null) { if (scope is ASBinCode.scopes.ObjectInstanceScope) { //查找类方法 ASBinCode.rtti.Class cls = ((ASBinCode.scopes.ObjectInstanceScope)scope)._class; if (defineClass == null) { defineClass = cls; } if (!isStaticMember && cls.staticClass == null) { defineClass = defineClass.instanceClass; skipoutpackagescope = true; break; } else { var fm = ASBinCode.ClassMemberFinder.find(cls, name, defineClass); if (fm != null) { return(fm.bindField); } else { break; } } } if (!(scope is ASBinCode.scopes.OutPackageMemberScope) || ( defineClass == null || ((ASBinCode.scopes.OutPackageMemberScope)scope).mainclass == defineClass ) ) { //从后往前找。可解决catch块同名变量e问题 for (int i = scope.members.Count - 1; i >= 0; i--) { if (scope.members[i].name == name ) { return(scope.members[i].clone()); } } } scope = scope.parentScope; } //***如果成员未找到,查找@__buildin__// if (!env.isEval) { var buildin = TypeReader.findClassFromImports("@__buildin__", builder, token); if (buildin.Count == 1) { var bi = buildin[0].staticClass; var member = ClassMemberFinder.find(bi, name, bi); if (member != null && !(member.bindField is ClassPropertyGetter) && member.inheritFrom == null && member.name != "Object" ) { FindStaticMember sm = new FindStaticMember(); sm.classMember = member; sm.static_class = new StaticClassDataGetter(bi); return(sm); //return member.bindField; } } } //***在静态成员中查找*** var findstaticclass = defineClass; while (findstaticclass != null && findstaticclass.staticClass != null) { var bi = findstaticclass.staticClass; var member = ClassMemberFinder.find(bi, name, defineClass.staticClass); if (member != null) { if (member != null && member.bindField is ClassPropertyGetter && name == "prototype") { throw new BuildException(token.line, token.ptr, token.sourceFile, "Access of possibly undefined property prototype."); } FindStaticMember sm = new FindStaticMember(); sm.classMember = member; sm.static_class = new StaticClassDataGetter(bi); return(sm); //return member.bindField; } findstaticclass = findstaticclass.super; } if (skipoutpackagescope) { return(null); } if (defineClass != null && defineClass.mainClass != null) { defineClass = defineClass.mainClass; } //***在包外代码中查找**** if (defineClass != null && defineClass.staticClass != null) { IScope outpackagescope = null; if (defineClass.mainClass == null) { outpackagescope = builder._class_outScopeBlock[defineClass].scope; } else { outpackagescope = builder._class_outScopeBlock[defineClass.mainClass].scope; } for (int i = outpackagescope.members.Count - 1; i >= 0; i--) { if (outpackagescope.members[i].name == name ) { //return outpackagescope.members[i].clone(); FindOutPackageScopeMember fo = new FindOutPackageScopeMember(); fo.member = outpackagescope.members[i].clone(); fo.outscopeclass = ((ASBinCode.scopes.OutPackageMemberScope)outpackagescope).mainclass; return(fo); //return fo; } } } return(null); }