示例#1
0
        public static void CompileCopy(JsClass klass)
        {
            var type = klass.Type;
            var func = new JsFunction(null);

            var obj = "o".Id();

            func.Body.Add(type.New().Var(obj.Value));

            foreach (var field in GetInstanceFields(klass))
            {
                var name  = field.JsName();
                var value = "this".Id().Get(name);

                if (field.Type.TypeKind == TypeKind.Struct)
                {
                    value = "$copy".Id().Call(value);
                }

                func.Body.Add(obj.Set(name, value));
            }

            func.Body.Add(obj.Return());

            klass.ExtendPrototype(func, "$copy");
        }
示例#2
0
        private void Build(JsClass klass)
        {
            var type = klass.Type;

            // ignore Avm.String we use System.String
            if (type.IsAvmString())
            {
                return;
            }

            Register(type);

            var func = new JsFunction(null);

            if (type.Is(SystemTypeCode.Array))
            {
                func.Body.Add("$types".Id().Get("this".Id().Get("m_type")).Call().Return());
            }
            else
            {
                func.Body.Add("$types".Id().Get(type.FullName).Call().Return());
            }

            klass.ExtendPrototype(func, "GetType");
        }
示例#3
0
        private static void CompileGetHashCode(JsClass klass)
        {
            var func = new JsFunction(null);

            func.Body.Add("$hash".Id().Call("this".Id()).Return());

            klass.ExtendPrototype(func, "GetHashCode");
        }
示例#4
0
        private static void CompileToString(JsCompiler compiler, JsClass klass)
        {
            var type = klass.Type;

            CompileValues(compiler, klass);

            var func      = new JsFunction(null);
            var withFlags = type.HasAttribute("System.FlagsAttribute");

            func.Body.Add(new JsText(withFlags ? "return $enum.flags(this);" : "return $enum.stringify(this);"));

            klass.ExtendPrototype(func, "toString");
        }
示例#5
0
        private static void CompileEquals(JsCompiler compiler, JsClass klass)
        {
            var other = "o".Id();

            var func = new JsFunction(null, other.Value);

            func.Body.Add(new JsText("if (o === null || o === undefined) return false;"));

            //TODO: check object type

            JsNode result = null;

            foreach (var field in GetInstanceFields(klass))
            {
                var name  = field.JsName();
                var left  = "this".Id().Get(name);
                var right = other.Get(name);

                JsNode e;
                // primitive and ref types
                if (field.Type.TypeKind != TypeKind.Struct && !field.Type.IsInt64Based())
                {
                    e = left.Op(right, BinaryOperator.Equality);
                }
                else                 // value types, int64 based
                {
                    var objectType = compiler.SystemTypes.Object;
                    var eq         = objectType.Methods.Find("Equals", objectType, objectType);
                    compiler.CompileMethod(eq);
                    e = eq.JsFullName().Id().Call(left, right);
                }

                result = result == null ? e : result.And(e);
            }

            func.Body.Add(result == null ? "false".Id().Return() : result.Return());

            var methodName = ObjectMethods.Find(compiler.SystemTypes.Object, ObjectMethodId.Equals).JsName();

            klass.ExtendPrototype(func, methodName);
        }
示例#6
0
        private static void CompileValues(JsCompiler compiler, JsClass klass)
        {
            var type = klass.Type;

            var fields = type.GetEnumFields()
                         .Select(x =>
            {
                var value = GetValue(compiler, x, type.ValueType);
                return(new { Name = x.Name, Value = value });
            });

            var    typeName    = type.JsFullName();
            var    valuesField = string.Format("{0}.$$values", typeName);
            object values;

            if (type.ValueType.IsInt64())
            {
                values = new JsArray(fields.Select(x => (object)new JsObject
                {
                    { "name", x.Name },
                    { "value", x.Value },
                }));
            }
            else
            {
                values = new JsObject(fields.Select(x => new KeyValuePair <object, object>(x.Value, x.Name)));
            }

            klass.Add(new JsGeneratedField(valuesField, values));

            var func = new JsFunction(null);

            func.Body.Add(valuesField.Id().Return());

            klass.ExtendPrototype(func, "$values");
        }
示例#7
0
        private static void CompileGetHashCode(JsCompiler compiler, JsClass klass)
        {
            var type = klass.Type;
            var func = new JsFunction(null);

            var value = "this.$value".Id();

            if (type.ValueType.IsInt64())
            {
                //TODO: inline [U]Int64.GetHashCode implementation
                func.Body.Add(value.Get("GetHashCode").Call().Return());
            }
            else if (!type.ValueType.Is(SystemTypeCode.Int32))
            {
                var int32Type = compiler.SystemTypes.Int32;
                func.Body.Add("$conv".Id().Call(value, type.ValueType.JsTypeCode(), int32Type.JsTypeCode()).Return());
            }
            else
            {
                func.Body.Add(value.Return());
            }

            klass.ExtendPrototype(func, "GetHashCode");
        }