示例#1
0
        public P5MainSymbolTable(Runtime runtime, string name)
            : base(runtime, name)
        {
            var stdout = GetStashGlob(runtime, "STDOUT", true);
            stdout.Handle = new P5Handle(runtime, null, System.Console.Out);

            var stdin = GetStashGlob(runtime, "STDIN", true);
            stdin.Handle = new P5Handle(runtime, System.Console.In, null);

            var stderr = GetStashGlob(runtime, "STDERR", true);
            stderr.Handle = new P5Handle(runtime, null, System.Console.Error);

            var dquote = GetStashGlob(runtime, "\"", true);
            dquote.Scalar = new P5Scalar(runtime, " ");

            var version = GetStashGlob(runtime, "]", true);
            version.Scalar = new P5Scalar(runtime, 5.008);

            // UNIVERSAL
            universal = GetPackage(runtime, "UNIVERSAL", true);

            var isa = universal.GetStashGlob(runtime, "isa", true);
            isa.Code = new P5NativeCode("UNIVERSAL::isa", new P5Code.Sub(WrapIsa));

            // Internals
            var internals = GetPackage(runtime, "Internals", true);

            var add_overload = internals.GetStashGlob(runtime, "add_overload", true);
            add_overload.Code = new P5NativeCode("Internals::add_overload", new P5Code.Sub(WrapAddOverload));

            // Internals::Net (TODO move to external assembly)
            var internals_net = GetPackage(runtime, "Internals::Net", true);

            var get_class = internals_net.GetStashGlob(runtime, "get_class", true);
            get_class.Code = new P5NativeCode("Internals::Net::get_class", new P5Code.Sub(WrapGetClass));

            var specialize_type = internals_net.GetStashGlob(runtime, "specialize_type", true);
            specialize_type.Code = new P5NativeCode("Internals::Net::specialize_type", new P5Code.Sub(WrapSpecializeType));

            var create = internals_net.GetStashGlob(runtime, "create", true);
            create.Code = new P5NativeCode("Internals::Net::create", new P5Code.Sub(WrapCreate));

            var call_method = internals_net.GetStashGlob(runtime, "call_method", true);
            call_method.Code = new P5NativeCode("Internals::Net::call_mehtod", new P5Code.Sub(WrapCallMethod));

            var call_static = internals_net.GetStashGlob(runtime, "call_static", true);
            call_static.Code = new P5NativeCode("Internals::Net::call_static", new P5Code.Sub(WrapCallStatic));

            var get_property = internals_net.GetStashGlob(runtime, "get_property", true);
            get_property.Code = new P5NativeCode("Internals::Net::get_property", new P5Code.Sub(WrapGetProperty));

            var set_property = internals_net.GetStashGlob(runtime, "set_property", true);
            set_property.Code = new P5NativeCode("Internals::Net::set_property", new P5Code.Sub(WrapSetProperty));

            var extend = internals_net.GetStashGlob(runtime, "extend", true);
            extend.Code = new P5NativeCode("Internals::Net::extend", new P5Code.Sub(WrapExtend));

            var compile = internals_net.GetStashGlob(runtime, "compile_assembly", true);
            compile.Code = new P5NativeCode("Internals::Net::compile_assembly", new P5Code.Sub(WrapCompileAssembly));
        }
示例#2
0
 public virtual void Bless(Runtime runtime, P5SymbolTable stash)
 {
     throw new System.InvalidOperationException("Not a reference");
 }
示例#3
0
 public virtual void Bless(Runtime runtime, P5SymbolTable stash)
 {
     // do nothing
 }
示例#4
0
 // IP5Referrable
 public override void Bless(Runtime runtime, P5SymbolTable stash)
 {
     throw new System.NotImplementedException();
 }
示例#5
0
        internal void BlessReference(Runtime runtime, P5SymbolTable stash)
        {
            var refbody = body as P5Reference;
            if (refbody == null)
                throw new System.Exception("Not a reference");

            refbody.Referred.Bless(runtime, stash);
        }
示例#6
0
 public virtual void Bless(Runtime runtime, P5SymbolTable stash)
 {
     blessed = stash;
 }
示例#7
0
        public bool IsDerivedFrom(Runtime runtime, P5SymbolTable parent)
        {
            if (this == parent)
                return true;

            IP5Any isa;
            P5Array isa_array = null;
            if (hash.TryGetValue("ISA", out isa))
                isa_array = (isa as P5Typeglob).Array;

            if (isa_array == null || isa_array.GetCount(runtime) == 0)
                return parent == runtime.SymbolTable.Universal;

            foreach (var e in isa_array)
            {
                var base_name = e.AsString(runtime);
                var base_stash = runtime.SymbolTable.GetPackage(runtime, base_name);

                if (base_stash == null)
                    continue;
                if (base_stash == parent || base_stash.IsDerivedFrom(runtime, parent))
                    return true;
            }

            return false;
        }
示例#8
0
 // IP5Referrable
 public abstract void Bless(Runtime runtime, P5SymbolTable stash);