Ejemplo n.º 1
0
 private TypeScope internalInstance(TypeScope ts, List<TypeScope> gen_args)
 {
     if (ts is TemplateParameterScope || ts is UnknownScope)
     {
         int ind = this.generic_params.IndexOf(ts.Name);
         if (ind != -1)
         {
             return gen_args[ind];
         }
         else
             return ts;
     }
     else if (ts is ArrayScope)
     {
         ArrayScope arr = null;
         if ((ts as ArrayScope).is_dynamic_arr)
         {
             arr = new ArrayScope(internalInstance(ts.elementType, gen_args), (ts as ArrayScope).indexes);
             arr.is_dynamic_arr = true;
         }
         else
             arr = new ArrayScope(internalInstance(ts.elementType, gen_args), (ts as ArrayScope).indexes);
         return arr;
     }
     else if (ts is TypeScope && ts.instances != null && ts.instances.Count > 0)
     {
         return ts.simpleGetInstance(gen_args);
     }
     else
         return ts;
 }
		private TypeScope CreateInterfaceCommonType(string name, int offset)
		{
            TypeScope ctn = (TypeScope)members[offset];
            if (ctn != null) return ctn;
			bool in_scope = false;
            if (name != null) in_scope = true;
            bool is_interface = br.ReadBoolean();                        
            if (is_interface)//ïðîïóñêàåì ôëàã - èíòåðôåéñíîñòè
            {
                name = GetString(br.ReadInt32());
            }
            else
            {
                name = br.ReadString();
            }
			//br.ReadInt32();
            //ssyy
            //×èòàåì, ÿâëÿåòñÿ ëè òèï èíòåðôåéñîì
            bool type_is_interface = (br.ReadByte() == 1);

            //×èòàåì, ÿâëÿåòñÿ ëè òèï äåëåãàòîì
            bool type_is_delegate = (br.ReadByte() == 1);
            //\ssyy
			
            bool type_is_generic_definition = (br.ReadByte() == 1);
            
            if (type_is_generic_definition)
            {
            	throw new Exception();
            }
            TypeScope base_type = GetTypeReference();
            bool is_value_type = br.ReadBoolean();

            //ssyy
            //×èòàåì ïîääåðæèâàåìûå èíòåðôåéñû
            int interf_count = br.ReadInt32();
            List<TypeScope> interfaces = new List<TypeScope>();
            for (int i = 0; i < interf_count; i++)
            {
                interfaces.Add(GetTypeReference());
            }
            //\ssyy
			object low_val=null;
			object upper_val=null;
            PascalABCCompiler.SemanticTree.type_access_level tal = (PascalABCCompiler.SemanticTree.type_access_level)br.ReadByte();
            PascalABCCompiler.SemanticTree.type_special_kind tsk = (PascalABCCompiler.SemanticTree.type_special_kind)br.ReadByte();
            bool is_sealed = br.ReadBoolean();
            bool is_abstract = br.ReadBoolean();
            if (tsk == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
            {
            	low_val = CreateExpression();
            	upper_val = CreateExpression();
            }
	
            TypeScope element_type = null;
            if (CanReadObject())
                element_type = GetTypeReference();
            switch (tsk)
            {
            	case PascalABCCompiler.SemanticTree.type_special_kind.none_kind : ctn = new TypeScope(SymbolKind.Class,cur_scope,base_type); break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.record : ctn = new TypeScope(SymbolKind.Struct,cur_scope,base_type); break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.array_wrapper : ctn = new ArrayScope(); break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.enum_kind : ctn = new EnumScope(SymbolKind.Enum,cur_scope,base_type); break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.set_type : ctn = new SetScope(element_type); break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.array_kind : if (!in_scope) ctn = new ArrayScope(); else return null; break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.diap_type : ctn = new DiapasonScope(low_val,upper_val);break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.typed_file : ctn = new FileScope(element_type,null);break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.binary_file : ctn = new FileScope(null,null);break;
           		
            }
            ctn.declaringUnit = root_scope;
            ctn.si.name = name;
            ctn.is_abstract = is_abstract;
            ctn.is_final = is_sealed;
            AddMember(ctn, offset);
            ctn.elementType = element_type;
			
            br.ReadInt32();
            br.ReadInt32();//attributes
            //common_namespace_node ns = cun.namespaces[0];
            byte flag = br.ReadByte();
            int def_prop_off=0;
            if (flag == 1)
            {
                def_prop_off = br.ReadInt32();
            }
            ReadDebugInfo();
            ctn.si.describe = ctn.GetDescription();
            //ñîçäàåì scope äëÿ êëàññà
            //ctn = new wrapped_common_type_node(this, base_type, name, tal, ns, scope, loc, offset);
            //members[offset] = ctn;
            //AddMember(ctn, offset);
            RestoreAllMembers(ctn);

            return ctn;
		}
		private TypeScope GetTypeReference()
		{
			byte b = br.ReadByte();
            //(ssyy) Âñòàâèë switch âìåñòî óñëîâèé
            TypeScope tn;
            switch (b)
            {
                case 255:
                	return null;
                case 1://åñëè òèï îïèñàí â ìîäóëå
                	int offset = br.ReadInt32();
                    tn = (TypeScope)members[offset];
                	if (tn == null) return GetCommonType(offset);
                	return tn;
                case 0://åñëè ýòî èìïîðòèð. òèï
                    tn = null;
					int pos = br.ReadInt32();
					tn = ext_members[pos] as TypeScope;
					if (tn != null) return tn;
					int tmp = (int)br.BaseStream.Position;
					br.BaseStream.Seek(ext_pos+pos,SeekOrigin.Begin);
					if ((ImportKind)br.ReadByte() == ImportKind.Common)
					{
						//tn = ReadCommonExtType();
						//ext_members[pos] = tn;
						tn = new UnknownScope(new SymInfo("$", SymbolKind.Type,"$"));
						ext_members[pos] = tn;
					}
					else // ýòî íåòîâñêèé òèï
					{
						tn = ReadNetExtType();
						ext_members[pos] = tn;
					}
					br.BaseStream.Seek(tmp,SeekOrigin.Begin);
					return tn;
                case 2://ýòî ìàññèâ
                	//simple_array type = new simple_array(GetTypeReference(),br.ReadInt32());
                	TypeScope type = new ArrayScope(GetTypeReference(),new TypeScope[0]);
                	return type;
                case 3://ýòî óêàçàòåëü
                	TypeScope pointed_type = GetTypeReference();
                	return new PointerScope(pointed_type);
                case 4://ýòî äèíàìè÷åñêèé ìàññèâ
					ReadDebugInfo();
               	 	TypeScope elem_type = GetTypeReference();
               	 	return new ArrayScope(elem_type,null);
                case 6:
                	//return GetTemplateInstance();
                	return null;
                case 7:
                    return GetGenericInstance();
                case 8:
                    //return GetShortStringType();
                    return null;
            }
			return null;
		}
Ejemplo n.º 4
0
		public override void visit(new_expr _new_expr)
		{
			_new_expr.type.visit(this);
			if (returned_scope != null && returned_scope is TypeScope)
			{
				TypeScope ts = returned_scope as TypeScope;
				if (_new_expr.new_array)
				{
					ts = new ArrayScope(ts,new TypeScope[1]{TypeTable.int_type});
					(ts as ArrayScope).is_dynamic_arr = true;
					returned_scope = ts;
					return;
				}
				ProcScope tmp = ts.GetConstructor();
				List<ProcScope> cnstrs = ts.GetConstructors(false);
				if (search_all)
					returned_scopes.AddRange(cnstrs.ToArray());
				if (!on_bracket)
				{
					ProcScope[] constrs = cnstrs.ToArray();
					ProcScope ps = select_method(constrs,_new_expr.params_list!=null?_new_expr.params_list.expressions.ToArray():null);
					if (ps != null)
						returned_scope = ps;
					else
						returned_scope = tmp;
				}
				else
				returned_scope = tmp;
			}
		}