Example #1
0
        protected ObjectDef EmitObjectCreation(ITree expressionNode)
        {
            ObjectDef result;

            var objectName = expressionNode.GetChild(0).Text;

            if (!ClassBuilders_.ContainsKey(objectName))
            {
                CompilerErrors.Add(new UndefinedClassError(objectName, CompilerErrors.Count, expressionNode.Line,
                                                           expressionNode.CharPositionInLine));
                result = new ValueObjectDef(typeof(object), null);
            }
            else
            {
                var returnType = ClassBuilders_[objectName];

                //CurrentILGenerator_.Emit(OpCodes.Newobj, Constructors_[objectName]);

                result = new ValueObjectDef(returnType, null, Constructors_[objectName]);
            }

            return(result);
        }
Example #2
0
        protected static ValueObjectDef EmitDefaultValue(Type type)
        {
            object value;

            if (type == BoolType)
            {
                value = false;
            }
            else if (type == IntegerType)
            {
                value = 0;
            }
            else if (type == StringType)
            {
                value = "";
            }
            else
            {
                value = null;
            }
            var result = new ValueObjectDef(type, value);

            return(result);
        }
Example #3
0
        protected ObjectDef EmitInvoke(ITree invokeExpressionNode, ITree atSignNode,
                                       ITree functionNode, ITree argsExpressionNode)
        {
            var           functionName = functionNode.Text;
            ObjectDef     invokeObjectDef;
            MethodBuilder methodBuilder;
            string        invokeObjectName;

            if (invokeExpressionNode != null)
            {
                invokeObjectDef  = EmitExpression(invokeExpressionNode);
                invokeObjectName = invokeObjectDef.Type.Name;
            }
            else
            {
                invokeObjectDef  = new ArgObjectDef(CurrentTypeBuilder_, 0, "this");
                invokeObjectName = CurrentTypeBuilder_.Name;
            }

            ObjectDef result;

            if (!Functions_.ContainsKey(invokeObjectName) || !Functions_[invokeObjectName].ContainsKey(functionName))
            {
                CompilerErrors.Add(new UndefinedFunctionError(functionName, invokeObjectName,
                                                              CompilerErrors.Count, functionNode.Line, functionNode.CharPositionInLine));
                result = LocalObjectDef.AllocateLocal(typeof(object));
            }
            else
            {
                methodBuilder = Functions_[invokeObjectName][functionName].MethodBuilder;
                var args = new List <ObjectDef>();
                args.Add(invokeObjectDef);

                if (argsExpressionNode != null)
                {
                    for (int i = 0; i < argsExpressionNode.ChildCount; i++)
                    {
                        var objectDef = EmitExpression(argsExpressionNode.GetChild(i));
                        args.Add(objectDef);
                    }

                    List <ArgObjectDef> args2 = new List <ArgObjectDef>();
                    foreach (var arg in Functions_[invokeObjectDef.Type.Name][functionName].Args)
                    {
                        args2.Add(arg.Value);
                    }
                    if (!CheckTypes(args, args2))
                    {
                        var args2types = new List <Type>();
                        foreach (var arg in args2)
                        {
                            args2types.Add(arg.Type);
                        }
                        CompilerErrors.Add(new FunctionArgumentsError(functionName, args2types,
                                                                      CompilerErrors.Count, functionNode.Line, functionNode.CharPositionInLine));
                    }
                }

                foreach (var arg in args)
                {
                    arg.Load();
                }

                if (invokeExpressionNode == null)
                {
                    CurrentILGenerator_.Emit(OpCodes.Call, methodBuilder);
                }
                else
                {
                    CurrentILGenerator_.Emit(OpCodes.Callvirt, methodBuilder);
                }

                foreach (var arg in args)
                {
                    arg.Remove();
                }
                invokeObjectDef.Remove();

                if (functionNode.Parent.Parent.Type == CoolGrammarLexer.Exprs &&
                    functionNode.Parent.ChildIndex != functionNode.Parent.Parent.ChildCount - 1)
                {
                    CurrentILGenerator_.Emit(OpCodes.Pop);
                    result = new ValueObjectDef(Functions_[invokeObjectDef.Type.Name][functionName].MethodBuilder.ReturnType, null);
                }
                else
                {
                    result = LocalObjectDef.AllocateLocal(Functions_[invokeObjectDef.Type.Name][functionName].MethodBuilder.ReturnType);
                }
            }

            return(result);
        }
Example #4
0
        protected ObjectDef EmitVoid(ITree expressionNode)
        {
            var result = new ValueObjectDef(typeof(Nullable), null);

            return(result);
        }
Example #5
0
        protected ObjectDef EmitBoolean(ITree expressionNode)
        {
            var result = new ValueObjectDef(BoolType, bool.Parse(expressionNode.Text));

            return(result);
        }
Example #6
0
        protected ObjectDef EmitString(ITree expressionNode)
        {
            var result = new ValueObjectDef(StringType, expressionNode.Text);

            return(result);
        }
Example #7
0
        protected ObjectDef EmitInteger(ITree expressionNode)
        {
            var result = new ValueObjectDef(IntegerType, int.Parse(expressionNode.Text));

            return(result);
        }
        protected ObjectDef EmitInvoke(ITree invokeExpressionNode, ITree atSignNode,
			ITree functionNode, ITree argsExpressionNode)
        {
            var functionName = functionNode.Text;
            ObjectDef invokeObjectDef;
            MethodBuilder methodBuilder;
            string invokeObjectName;
            if (invokeExpressionNode != null)
            {
                invokeObjectDef = EmitExpression(invokeExpressionNode);
                invokeObjectName = invokeObjectDef.Type.Name;
            }
            else
            {
                invokeObjectDef = new ArgObjectDef(CurrentTypeBuilder_, 0, "this");
                invokeObjectName = CurrentTypeBuilder_.Name;
            }

            ObjectDef result;
            if (!Functions_.ContainsKey(invokeObjectName) || !Functions_[invokeObjectName].ContainsKey(functionName))
            {
                CompilerErrors.Add(new UndefinedFunctionError(functionName, invokeObjectName,
                    CompilerErrors.Count, functionNode.Line, functionNode.CharPositionInLine));
                result = LocalObjectDef.AllocateLocal(typeof(object));
            }
            else
            {
                methodBuilder = Functions_[invokeObjectName][functionName].MethodBuilder;
                var args = new List<ObjectDef>();
                args.Add(invokeObjectDef);

                if (argsExpressionNode != null)
                {
                    for (int i = 0; i < argsExpressionNode.ChildCount; i++)
                    {
                        var objectDef = EmitExpression(argsExpressionNode.GetChild(i));
                        args.Add(objectDef);
                    }

                    List<ArgObjectDef> args2 = new List<ArgObjectDef>();
                    foreach (var arg in Functions_[invokeObjectDef.Type.Name][functionName].Args)
                        args2.Add(arg.Value);
                    if (!CheckTypes(args, args2))
                    {
                        var args2types = new List<Type>();
                        foreach (var arg in args2)
                            args2types.Add(arg.Type);
                        CompilerErrors.Add(new FunctionArgumentsError(functionName, args2types,
                            CompilerErrors.Count, functionNode.Line, functionNode.CharPositionInLine));
                    }
                }

                foreach (var arg in args)
                    arg.Load();

                if (invokeExpressionNode == null)
                    CurrentILGenerator_.Emit(OpCodes.Call, methodBuilder);
                else
                    CurrentILGenerator_.Emit(OpCodes.Callvirt, methodBuilder);

                foreach (var arg in args)
                    arg.Remove();
                invokeObjectDef.Remove();

                if (functionNode.Parent.Parent.Type == CoolGrammarLexer.Exprs
                        && functionNode.Parent.ChildIndex != functionNode.Parent.Parent.ChildCount - 1)
                {
                    CurrentILGenerator_.Emit(OpCodes.Pop);
                    result = new ValueObjectDef(Functions_[invokeObjectDef.Type.Name][functionName].MethodBuilder.ReturnType, null);
                }
                else
                    result = LocalObjectDef.AllocateLocal(Functions_[invokeObjectDef.Type.Name][functionName].MethodBuilder.ReturnType);
            }

            return result;
        }
        protected ObjectDef EmitObjectCreation(ITree expressionNode)
        {
            ObjectDef result;

            var objectName = expressionNode.GetChild(0).Text;
            if (!ClassBuilders_.ContainsKey(objectName))
            {
                CompilerErrors.Add(new UndefinedClassError(objectName, CompilerErrors.Count, expressionNode.Line,
                    expressionNode.CharPositionInLine));
                result = new ValueObjectDef(typeof(object), null);
            }
            else
            {
                var returnType = ClassBuilders_[objectName];

                //CurrentILGenerator_.Emit(OpCodes.Newobj, Constructors_[objectName]);

                result = new ValueObjectDef(returnType, null, Constructors_[objectName]);
            }

            return result;
        }
Example #10
0
 protected ObjectDef EmitInteger(ITree expressionNode)
 {
     var result = new ValueObjectDef(IntegerType, int.Parse(expressionNode.Text));
     return result;
 }
Example #11
0
 protected ObjectDef EmitBoolean(ITree expressionNode)
 {
     var result = new ValueObjectDef(BoolType, bool.Parse(expressionNode.Text));
     return result;
 }
Example #12
0
        protected static ValueObjectDef EmitDefaultValue(Type type)
        {
            object value;
            if (type == BoolType)
                value = false;
            else if (type == IntegerType)
                value = 0;
            else if (type == StringType)
                value = "";
            else
                value = null;
            var result = new ValueObjectDef(type, value);

            return result;
        }
Example #13
0
 protected ObjectDef EmitVoid(ITree expressionNode)
 {
     var result = new ValueObjectDef(typeof(Nullable), null);
     return result;
 }
Example #14
0
 protected ObjectDef EmitString(ITree expressionNode)
 {
     var result = new ValueObjectDef(StringType, expressionNode.Text);
     return result;
 }