Esempio n. 1
0
 internal CLSInstanceSymbol(String name, String memberName, Type type)
     : base(name)
 {
     globalValue = CLSMember.FindMember(
         memberName,
         type, false);
 }
Esempio n. 2
0
 internal CLSStaticSymbol(String name, String memberName, Type type)
     : base(name)
 {
     globalValue = member = CLSMember.FindMember(
         memberName,
         type, true);
 }
        public override Object Invoke(params Object[] args)
        {
            // instance member gets target from first arg
            Object target = args[0];

            if (target is Record)
            {
                Record rec = (Record)target;

                if (args.Length == 2)           //set call
                {
                    rec[name] = args[1];
                    return(args[1]);
                }
                else            //get
                {
                    Object ret = rec[name];
                    if (ret == null && !rec.Contains(name))
                    {
                        throw new Exception("Record does not contain member: " + name);
                    }
                    return(ret);
                }
            }
            else
            {
                //get a real member to do the work
                //first check the cache
                Type      targetType = target.GetType();
                CLSMember member     = (CLSMember)cache[targetType];
                if (member == null)
                {
                    //late-bound members are never static
                    cache[targetType] = member = CLSMember.FindMember(name, targetType, false);
                }
                return(member.Invoke(args));
            }
        }
Esempio n. 4
0
        internal Symbol intern(String name)
        {
            var    table  = this.table;
            Symbol result = (Symbol)table[name];

            if (result == null)
            {
                var p = Parent;
                while (p != null)
                {
                    Symbol result2 = p.table[name] as Symbol;
                    if (result2 != null)
                    {
                        return(result2);
                    }
                    p = p.Parent;
                }
            }
            if (result == null)
            {
                if (name.StartsWith(":"))
                {
                    table[name] = result = new Keyword(name);
                }
                else
                {
                    int firstdot   = name.IndexOf('.');
                    int lastdot    = name.LastIndexOf('.');
                    int lastcolon  = name.LastIndexOf(':');
                    int nameLength = name.Length;

                    // .instance
                    // .[namespace.]type:explicitinstance
                    // [namespace.]type.
                    // [namespace.]type:static
                    // obj.member - transformed by reader
                    if ((firstdot != -1 || lastcolon != -1) && nameLength > 1)
                    {
                        if (firstdot == 0)                      //instance
                        {
                            if (lastcolon > 0)                  //explicitly qualified
                            {
                                String    memberName  = name.Substring(lastcolon + 1, nameLength - (lastcolon + 1));
                                CLSMember innermember = CLSMember.FindMember(
                                    memberName, this,
                                    name.Substring(1, lastcolon - 1), false);
                                table[name] = result = new CLSInstanceSymbol(name, innermember);
                            }
                            else
                            {
                                String memberName = name.Substring(1, nameLength - 1);
                                table[name] = result = new CLSInstanceSymbol(name, memberName, null);
                            }
                        }
                        else if (lastcolon > 0)                 //static
                        {
                            String    memberName  = name.Substring(lastcolon + 1, nameLength - (lastcolon + 1));
                            CLSMember innermember = CLSMember.FindMember(
                                memberName, this,
                                name.Substring(0, lastcolon), true);
                            table[name] = result = new CLSStaticSymbol(name, innermember);
                        }
                        else if (lastdot == nameLength - 1)            //type
                        {
                            Type type = findType(name.Substring(0, lastdot));
                            table[name] = result = new CLSTypeSymbol(name, type);
                        }
                    }
                    else
                    {
                        table[name]      = result = new Symbol(name);
                        result.isDynamic = (name[0] == '*');
                    }
                }
            }
            return(result);
        }