コード例 #1
0
 public NamespaceFactory(ESObjectSpace objectSpace, NamespaceObject baseEnvironment, ESSymbol name, IDictionary <String, List <ESCompilationError> > compilationErrors)
 {
     this.objectSpace       = objectSpace;
     this.baseEnvironment   = baseEnvironment;
     this.name              = name;
     this.compilationErrors = compilationErrors;
 }
コード例 #2
0
        protected Delegate primitiveFunctionFor(List <KeywordMessageArgument> arguments)
        {
            ParseTreeNode node;
            var           argNames = argNamesFromPrimitiveSpecArgumentList(
                arguments,
                (errorMessage, span)
                => compiler.handlePrimitiveSpeficationError(errorMessage, span));
            ESSymbol            primName   = symbolRegistry.symbolFor(argNames[0]);
            String              domainName = argNames[1];
            PrimitiveDomainType domain     = (PrimitiveDomainType)ushort.MaxValue;         // On account of typical statically-typed compiler stupidity.

            try {
                domain = (PrimitiveDomainType)Enum.Parse(typeof(PrimitiveDomainType), domainName);
            } catch {
                Context.markAsUncompilable();
                node = arguments[1];
                compiler.handlePrimitiveSpeficationError(
                    "Unknown primitive domain <" + domainName + ">.",
                    node.Span);
            }
            Delegate function;

            if (!objectSpace.getPrimitiveFunction(domain, primName, out function))
            {
                Context.markAsUncompilable();
                node = arguments[0];
                compiler.handlePrimitiveSpeficationError(
                    "No primitive named <" + primName.PrimitiveValue + "> is defined in the primitive domain <" + domainName + ">.",
                    node.Span);
            }
            return(function);
        }
コード例 #3
0
 protected void bindToKernel()
 {
     messageSendBinderRegistry = objectSpace.MessageSendBinderRegistry;
     symbolRegistry            = objectSpace.SymbolRegistry;
     selfSymbol        = objectSpace.SymbolRegistry.symbolFor(selfName);
     superSymbol       = objectSpace.SymbolRegistry.symbolFor(superName);
     thisContextSymbol = objectSpace.SymbolRegistry.symbolFor(thisContextName);
 }
コード例 #4
0
 protected void logMessageSent(ESSymbol messageSelector)
 {
     if (messagesSent == null)
     {
         messagesSent = newMessagesSentSet();
     }
     messagesSent.Add(messageSelector);
 }
コード例 #5
0
ファイル: ESNameBinding.cs プロジェクト: vlastik01/cSharp
        public InstanceVariableDeclaration(NameBindingScope scope, ESSymbol name) : base(scope, name)
        {
            var namedSlotsObject = Expression.Convert(Scope.SelfParameter, TypeGuru.esNamedSlotsObjectType);

            namedSlots = Expression.Field(namedSlotsObject, "namedSlots");
            var statusFlags = Expression.Field(namedSlotsObject, "statusFlags");

            isMutable = Expression.Equal(Expression.And(statusFlags, mutabilityFlagBitConstant), zeroConstant);
        }
コード例 #6
0
 protected void logMessageSentToSuper(ESSymbol messageSelector)
 {
     logMessageSent(messageSelector);
     if (messagesSentToSuper == null)
     {
         messagesSentToSuper = newMessagesSentSet();
     }
     messagesSentToSuper.Add(messageSelector);
 }
コード例 #7
0
 protected void logMessageSentToThisContext(ESSymbol messageSelector)
 {
     logMessageSent(messageSelector);
     if (messagesSentToThisContext == null)
     {
         messagesSentToThisContext = newMessagesSentSet();
     }
     messagesSentToThisContext.Add(messageSelector);
 }
コード例 #8
0
ファイル: ESNameBinding.cs プロジェクト: vlastik01/cSharp
        public NamedValueOccurrence newOccurrenceOf(ESSymbol name)
        {
            var declaration = atIfAbsent(name, () => declareNonLocalVariable(name, null));
            var occurrence  = declaration.newOccurrenceIn(this);

            localOccurrences.Add(occurrence);
            if (occurrence.IsFreeVariable && declaration.IsStackResident)
            {
                freeVariableReferenceCount++;
            }
            return(occurrence);
        }
コード例 #9
0
        public NamedVariableBinder(DynamicBindingGuru dynamicBindingGuru, ESSymbol name, NamespaceObject environment)
        {
            this.dynamicBindingGuru = dynamicBindingGuru;
            objectSpace             = dynamicBindingGuru.ObjectSpace;
            this.name        = name;
            this.environment = environment;

            if (name != null)
            {
                nameString = name.PrimitiveValue;
            }
            addToUndeclared =
                () =>
            { var bindingRef = objectSpace.newBindingReference(NameString, new DirectBindingHandle((Object)null));
              objectSpace.UndeclaredNamespace.add(bindingRef);
              return(bindingRef); };
        }
コード例 #10
0
        public override IEnumerable <String> GetDynamicMemberNames()
        {
            var selectors = new System.Collections.Generic.HashSet <String>();
            var esClass   = ValueClass;

            while (esClass != null)
            {
                esClass.systemSelectorsDo((Object selectorObject, Object argCountObject) => { selectors.Add((String)selectorObject); return(null); });
                esClass.selectorsDo(
                    (Object selectorObject) => {
                    ESSymbol selector = (ESSymbol)selectorObject;
                    selectors.Add(selector.asHostSystemMemberName(CapitalizationScheme.InitialCapital));
                    return(null);
                });
                esClass = esClass.Superclass;
            }
            return(selectors);
        }
コード例 #11
0
ファイル: ESNameBinding.cs プロジェクト: vlastik01/cSharp
        public NamedValueDeclaration atIfAbsent(ESSymbol name, Functor0 <NamedValueDeclaration> notFoundAction)
        {
            StackResidentDeclaration localDeclaration;

            if (localBindings.TryGetValue(name, out localDeclaration))
            {
                return(localDeclaration);
            }
            NonLocalVariableDeclaration nonLocalVariableDeclaration;

            if (nonLocalBindings != null && nonLocalBindings.TryGetValue(name, out nonLocalVariableDeclaration))
            {
                return(nonLocalVariableDeclaration);
            }
            if (outerScope == null)
            {
                return(notFoundAction == null ? null : notFoundAction());
            }
            return(outerScope.atIfAbsent(name, notFoundAction));
        }
コード例 #12
0
            public SetVariableValueBinder canonicalBinderFor(ESSymbol name, NamespaceObject environment)
            {
                if (environment == null)
                {
                    environment = defaultNamespace;
                }
                Dictionary <ESSymbol, SetVariableValueBinder> nameRegistry;
                SetVariableValueBinder binder;

                if (!registry.TryGetValue(environment, out nameRegistry))
                {
                    nameRegistry       = new Dictionary <ESSymbol, SetVariableValueBinder>();
                    binder             = new SetVariableValueBinder(DynamicBindingGuru, name, environment);
                    nameRegistry[name] = binder;
                    return(binder);
                }
                if (!nameRegistry.TryGetValue(name, out binder))
                {
                    binder             = new SetVariableValueBinder(DynamicBindingGuru, name, environment);
                    nameRegistry[name] = binder;
                }
                return(binder);
            }
コード例 #13
0
        public virtual bool compileMethod(BehavioralObject methodClass, ESSymbol protocol, out ESMethod compiledMethod)
        {
            ESMethod method = null;

            if (compileMethod(
                    methodClass,
                    (MethodDeclarationNode methodDeclarationNode, Delegate function) => {
                if (function == null)
                {
                    return(false);
                }
                method = objectSpace.newMethod(methodClass, methodClass, methodDeclarationNode, protocol);
                return(true);
            }))
            {
                compiledMethod = method;
                return(true);
            }
            else
            {
                compiledMethod = null;
                return(false);
            }
        }
コード例 #14
0
 public DynamicMetaObject metaObjectToSendDoesNotUnderstand(ESSymbol selector, DynamicMetaObject[] args)
 {
     return(ExpressionTreeGuru.expressionToSendDoesNotUnderstand(Expression, ValueClass, selector, args).asDynamicMetaObject(DefaultBindingRestrictions, Value));
 }
コード例 #15
0
ファイル: ESObjectVisitor.cs プロジェクト: vlastik01/cSharp
 public override T applyToSymbol(ESSymbol operand)
 {
     return(operation.applyToSymbol(operand));
 }
コード例 #16
0
ファイル: ESObjectVisitor.cs プロジェクト: vlastik01/cSharp
 public virtual T applyToSymbol(ESSymbol operand)
 {
     return(applyToESObject(operand));
 }
コード例 #17
0
ファイル: ESNameBinding.cs プロジェクト: vlastik01/cSharp
 public AbstractNonStackResidentVariableDeclaration(NameBindingScope scope, ESSymbol name) : base(scope, name)
 {
 }
コード例 #18
0
 public virtual void setSelector(ESSymbol newSelector)
 {
     selector = newSelector;
     numArgs  = selector == null ? 0 : selector.NumArgs;
 }
コード例 #19
0
ファイル: ESNameBinding.cs プロジェクト: vlastik01/cSharp
 protected StackResidentDeclaration(NameBindingScope scope, ESSymbol name) : this(scope, name, TypeGuru.objectType)
 {
 }
コード例 #20
0
 public NamedVariableBinder(DynamicBindingGuru dynamicBindingGuru, ESSymbol name) : this(dynamicBindingGuru, name, null)
 {
 }
コード例 #21
0
ファイル: ESNameBinding.cs プロジェクト: vlastik01/cSharp
 public NamespaceResidentVariableDeclaration(NamespaceObject environment, NameBindingScope scope, ESSymbol name) : base(scope, name)
 {
     getVariableCallSite = Context.getVariableValueCallSiteConstantFor(environment, name);
     setVariableCallSite = Context.setVariableValueCallSiteConstantFor(environment, name);
 }
コード例 #22
0
ファイル: ESNameBinding.cs プロジェクト: vlastik01/cSharp
 protected StackResidentDeclaration(NameBindingScope scope, ESSymbol name, Type parameterType) : this(scope, parameterExpressionFrom(name, parameterType))
 {
 }
コード例 #23
0
ファイル: ESNameBinding.cs プロジェクト: vlastik01/cSharp
 public NonLocalVariableDeclaration(NameBindingScope scope, ESSymbol name) : base(scope, name)
 {
 }
コード例 #24
0
 public DynamicMetaObject metaObjectToThrowInvalidFunctionCallException(ESSymbol selector, DynamicMetaObject[] args, String messageText, Type expectedFunctionType, Type actualFunctionType)
 {
     return(ExpressionTreeGuru.expressionToThrowInvalidFunctionCallException(Expression, ValueClass, selector, messageText, (long)args.Length, expectedFunctionType, actualFunctionType).asDynamicMetaObject(BindingRestrictions.GetInstanceRestriction(Expression, Value), Value));
 }
コード例 #25
0
        public override DynamicMetaObject BindBinaryOperation(BinaryOperationBinder binder, DynamicMetaObject arg)
        {
            DynamicMetaObject messageSendMO = null;
            ESBehavior        esClass       = null;
            ESObjectSpace     kernel;
            ESSymbol          selector = null;

            switch (binder.Operation)
            {
            case ExpressionType.Add:
                if (createMetaObjectToSendMessage("+", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.And:
                if (createMetaObjectToSendMessage("&", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.Divide:
                if (createMetaObjectToSendMessage("/", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.Equal:
                if (createMetaObjectToSendMessage("=", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.ExclusiveOr:
                if (createMetaObjectToSendMessage("xor:", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.GreaterThan:
                if (createMetaObjectToSendMessage(">", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.GreaterThanOrEqual:
                if (createMetaObjectToSendMessage(">=", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.LeftShift:
                if (createMetaObjectToSendMessage("<<", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.LessThan:
                if (createMetaObjectToSendMessage("<", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.LessThanOrEqual:
                if (createMetaObjectToSendMessage("<=", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.Modulo:
                if (createMetaObjectToSendMessage("rem:", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.Multiply:
                if (createMetaObjectToSendMessage("*", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.NotEqual:
                if (createMetaObjectToSendMessage("~=", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.Or:
                if (createMetaObjectToSendMessage("|", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.Power:
                if (createMetaObjectToSendMessage("**", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.RightShift:
                if (createMetaObjectToSendMessage(">>", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.Subtract:
                if (createMetaObjectToSendMessage("-", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            default:
            case ExpressionType.AddAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("+=");
                break;

            case ExpressionType.AndAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("&=");
                break;

            case ExpressionType.DivideAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("/=");
                break;

            case ExpressionType.ExclusiveOrAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("^=");
                break;

            case ExpressionType.LeftShiftAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("<<=");
                break;

            case ExpressionType.ModuloAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("%=");
                break;

            case ExpressionType.MultiplyAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("*=");
                break;

            case ExpressionType.OrAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("|=");
                break;

            case ExpressionType.PowerAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("**=");
                break;

            case ExpressionType.RightShiftAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor(">>=");
                break;

            case ExpressionType.SubtractAssign:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("-=");
                break;

            case ExpressionType.Extension:
                esClass  = ValueClass;
                kernel   = esClass.ObjectSpace;
                selector = kernel.symbolFor("??");
                break;
            }

            if (messageSendMO == null)
            {
                messageSendMO = metaObjectToSendDoesNotUnderstand(selector, argArrayFor(arg));
            }

            return(binder.FallbackBinaryOperation(this, arg, messageSendMO));
        }
コード例 #26
0
 protected SetVariableValueBinder(DynamicBindingGuru dynamicBindingGuru, ESSymbol name, NamespaceObject environment) : base(dynamicBindingGuru, name, environment)
 {
 }
コード例 #27
0
 public ESMessage(ESBehavior esClass, ESSymbol selector, Object[] arguments) : base(esClass)
 {
     setSelector(selector);
     this.arguments = arguments;
 }
コード例 #28
0
 public SetVariableValueBinder canonicalBinderFor(ESSymbol name)
 {
     return(canonicalBinderFor(name, defaultNamespace));
 }
コード例 #29
0
 protected SetVariableValueBinder(DynamicBindingGuru dynamicBindingGuru, ESSymbol name) : base(dynamicBindingGuru, name)
 {
 }
コード例 #30
0
ファイル: ESNameBinding.cs プロジェクト: vlastik01/cSharp
 public ParameterDeclaration(NameBindingScope scope, ESSymbol name, Type parameterType) : base(scope, name, parameterType)
 {
 }