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"); }
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"); }
private static void CompileGetHashCode(JsClass klass) { var func = new JsFunction(null); func.Body.Add("$hash".Id().Call("this".Id()).Return()); klass.ExtendPrototype(func, "GetHashCode"); }
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"); }
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); }
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"); }
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"); }