public void EmitCachedValues(IAstEmitter astEmitter, TypeExpressionCacher typeCacher, SignatureCacher signatureCacher, BaseMethodCacher baseMethodCacher) { }
public static bool TypesAreEqual(TypeReference target, TypeReference source, bool strictEquality = false) { bool shallowMatch; if (target == source) { return(true); } else if ((target == null) || (source == null)) { return(target == source); } else if (TypesAreTriviallyEqual(source, target, out shallowMatch)) { return(true); } int targetDepth, sourceDepth; FullyDereferenceType(target, out targetDepth); FullyDereferenceType(source, out sourceDepth); var targetGp = target as GenericParameter; var sourceGp = source as GenericParameter; if ((targetGp != null) || (sourceGp != null)) { if ((targetGp == null) || (sourceGp == null)) { return(false); } var isTargetGpArg = SignatureCacher.IsTypeArgument(targetGp); var isSourceGpArg = SignatureCacher.IsTypeArgument(targetGp); if (isSourceGpArg || isTargetGpArg) { return(isSourceGpArg && isTargetGpArg && targetGp.Name == sourceGp.Name); } TypeReference temp; // Generic parameters may be in positional (!0) form; expand them so they compare // correctly with named (T) form. if (IsPositionalGenericParameter(sourceGp)) { ExpandPositionalGenericParameters(sourceGp, out temp); sourceGp = (GenericParameter)temp; } if (IsPositionalGenericParameter(targetGp)) { ExpandPositionalGenericParameters(targetGp, out temp); targetGp = (GenericParameter)temp; } var targetOwnerType = targetGp.Owner as TypeReference; var sourceOwnerType = sourceGp.Owner as TypeReference; // https://github.com/jbevain/cecil/issues/97 if ((targetOwnerType != null) || (sourceOwnerType != null)) { var basesEqual = false; if (TypeInBases(targetOwnerType, sourceOwnerType, strictEquality)) { basesEqual = true; } else if (TypeInBases(sourceOwnerType, targetOwnerType, strictEquality)) { basesEqual = true; } if (!basesEqual) { return(false); } } else { // FIXME: Can't do an exact comparison here since we get called by MemberIdentifier comparisons. } if (targetGp.Type != sourceGp.Type) { return(false); } if (targetGp.Name != sourceGp.Name) { return(false); } if (targetGp.Position != sourceGp.Position) { return(false); } return(true); } var targetGit = target as GenericInstanceType; var sourceGit = source as GenericInstanceType; if ((targetGit != null) || (sourceGit != null)) { if (!strictEquality) { if ((targetGit != null) && TypesAreEqual(targetGit.ElementType, source)) { return(true); } if ((sourceGit != null) && TypesAreEqual(target, sourceGit.ElementType)) { return(true); } } if ((targetGit == null) || (sourceGit == null)) { return(false); } if (targetGit.GenericArguments.Count != sourceGit.GenericArguments.Count) { return(false); } for (var i = 0; i < targetGit.GenericArguments.Count; i++) { if (!TypesAreEqual(targetGit.GenericArguments[i], sourceGit.GenericArguments[i], strictEquality)) { return(false); } } return(TypesAreEqual(targetGit.ElementType, sourceGit.ElementType, strictEquality)); } var areEqualArray = SubtypeElementComparison <ArrayType>(target, source, strictEquality); if (areEqualArray.HasValue) { return(areEqualArray.Value && ( ((ArrayType)target).Rank == ((ArrayType)source).Rank )); } var areEqualBR = SubtypeElementComparison <ByReferenceType>(target, source, strictEquality); if (areEqualBR.HasValue) { return(areEqualBR.Value); } var areEqualP = SubtypeElementComparison <PointerType>(target, source, strictEquality); if (areEqualP.HasValue) { return(areEqualP.Value); } var areEqualOM = SubtypeElementComparison <OptionalModifierType>(target, source, strictEquality); if (areEqualOM.HasValue) { return(areEqualOM.Value); } var areEqualRM = SubtypeElementComparison <RequiredModifierType>(target, source, strictEquality); if (areEqualRM.HasValue) { return(areEqualRM.Value); } var areEqualFP = SubtypeElementComparison <FunctionPointerType>(target, source, strictEquality); if (areEqualFP.HasValue) { return(areEqualFP.Value); } areEqualP = SubtypeElementComparison <PinnedType>(target, source, strictEquality); if (areEqualP.HasValue) { return(areEqualP.Value); } return(shallowMatch); }
public void EmitCachedValues (IAstEmitter astEmitter, TypeExpressionCacher typeCacher, SignatureCacher signatureCacher, BaseMethodCacher baseMethodCacher) { var cts = typeCacher.CachedTypes.Values.OrderBy((ct) => ct.Index).ToArray(); if (cts.Length > 0) { foreach (var ct in cts) { Formatter.WriteRaw("var $T{0:X2} = function () ", ct.Index); Formatter.OpenBrace(); Formatter.WriteRaw("return ($T{0:X2} = JSIL.Memoize(", ct.Index); Formatter.Identifier(ct.Type, astEmitter.ReferenceContext, false); Formatter.WriteRaw(")) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } var css = signatureCacher.Global.Signatures.OrderBy((cs) => cs.Value).ToArray(); if (css.Length > 0) { foreach (var cs in css) { if (cs.Key.RewritenGenericParametersCount == 0) { Formatter.WriteRaw("var $S{0:X2} = function () ", cs.Value); Formatter.OpenBrace(); Formatter.WriteRaw("return ($S{0:X2} = JSIL.Memoize(", cs.Value); Formatter.Signature(cs.Key.Method, cs.Key.Signature, astEmitter.ReferenceContext, cs.Key.IsConstructor, false, true); Formatter.WriteRaw(")) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } else { Formatter.WriteRaw("var $S{0:X2} = function ", cs.Value); Formatter.LPar(); Formatter.CommaSeparatedList( Enumerable.Range(1, cs.Key.RewritenGenericParametersCount).Select(item => "arg" + item), astEmitter.ReferenceContext, ListValueType.Raw); Formatter.RPar(); Formatter.Space(); Formatter.OpenBrace(); Formatter.WriteRaw("return JSIL.MemoizeTypes($S{0:X2}, function() {{return ", cs.Value); Formatter.Signature(cs.Key.Method, cs.Key.Signature, astEmitter.ReferenceContext, cs.Key.IsConstructor, false, true); Formatter.WriteRaw(";}"); Formatter.Comma(); Formatter.OpenBracket(); Formatter.CommaSeparatedList( Enumerable.Range(1, cs.Key.RewritenGenericParametersCount).Select(item => "arg" + item), astEmitter.ReferenceContext, ListValueType.Raw); Formatter.CloseBracket(); Formatter.WriteRaw(")"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } } var bms = baseMethodCacher.CachedMethods.Values.OrderBy((ct) => ct.Index).ToArray(); if (bms.Length > 0) { foreach (var bm in bms) { Formatter.WriteRaw("var $BM{0:X2} = function () ", bm.Index); Formatter.OpenBrace(); Formatter.WriteRaw("return ($BM{0:X2} = JSIL.Memoize(", bm.Index); Formatter.WriteRaw("Function.call.bind("); Formatter.Identifier(bm.Method.Reference, astEmitter.ReferenceContext, true); Formatter.WriteRaw("))) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } var cims = signatureCacher.Global.InterfaceMembers.OrderBy((cim) => cim.Value).ToArray(); if (cims.Length > 0) { foreach (var cim in cims) { if (cim.Key.RewritenGenericParametersCount == 0) { Formatter.WriteRaw("var $IM{0:X2} = function () ", cim.Value); Formatter.OpenBrace(); Formatter.WriteRaw("return ($IM{0:X2} = JSIL.Memoize(", cim.Value); Formatter.Identifier(cim.Key.InterfaceType, astEmitter.ReferenceContext, false); Formatter.Dot(); Formatter.Identifier(cim.Key.InterfaceMember, EscapingMode.MemberIdentifier); Formatter.WriteRaw(")) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } else { Formatter.WriteRaw("var $IM{0:X2} = function ", cim.Value); Formatter.LPar(); Formatter.CommaSeparatedList( Enumerable.Range(1, cim.Key.RewritenGenericParametersCount).Select(item => "arg" + item), astEmitter.ReferenceContext, ListValueType.Raw); Formatter.RPar(); Formatter.Space(); Formatter.OpenBrace(); Formatter.WriteRaw("return JSIL.MemoizeTypes($IM{0:X2}, function() {{return ", cim.Value); Formatter.Identifier(cim.Key.InterfaceType, astEmitter.ReferenceContext, false); Formatter.Dot(); Formatter.Identifier(cim.Key.InterfaceMember, EscapingMode.MemberIdentifier); Formatter.WriteRaw(";}"); Formatter.Comma(); Formatter.OpenBracket(); Formatter.CommaSeparatedList( Enumerable.Range(1, cim.Key.RewritenGenericParametersCount).Select(item => "arg" + item), astEmitter.ReferenceContext, ListValueType.Raw); Formatter.CloseBracket(); Formatter.WriteRaw(")"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } } if ((cts.Length > 0) || (css.Length > 0)) Formatter.NewLine(); }
public void EmitCachedValues (IAstEmitter astEmitter, TypeExpressionCacher typeCacher, SignatureCacher signatureCacher, BaseMethodCacher baseMethodCacher) { var cts = typeCacher.CachedTypes.Values.OrderBy((ct) => ct.Index).ToArray(); if (cts.Length > 0) { foreach (var ct in cts) { Formatter.WriteRaw("var $T{0:X2} = function () ", ct.Index); Formatter.OpenBrace(); Formatter.WriteRaw("return ($T{0:X2} = JSIL.Memoize(", ct.Index); Formatter.Identifier(ct.Type, astEmitter.ReferenceContext, false); Formatter.WriteRaw(")) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } var css = signatureCacher.Global.Signatures.OrderBy((cs) => cs.Value).ToArray(); if (css.Length > 0) { foreach (var cs in css) { Formatter.WriteRaw("var $S{0:X2} = function () ", cs.Value); Formatter.OpenBrace(); Formatter.WriteRaw("return ($S{0:X2} = JSIL.Memoize(", cs.Value); Formatter.Signature(cs.Key.Method, cs.Key.Signature, astEmitter.ReferenceContext, cs.Key.IsConstructor, false); Formatter.WriteRaw(")) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } var bms = baseMethodCacher.CachedMethods.Values.OrderBy((ct) => ct.Index).ToArray(); if (bms.Length > 0) { foreach (var bm in bms) { Formatter.WriteRaw("var $BM{0:X2} = function () ", bm.Index); Formatter.OpenBrace(); Formatter.WriteRaw("return ($BM{0:X2} = JSIL.Memoize(", bm.Index); Formatter.WriteRaw("Function.call.bind("); Formatter.Identifier(bm.Method.Reference, astEmitter.ReferenceContext, true); Formatter.WriteRaw("))) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } var cims = signatureCacher.Global.InterfaceMembers.OrderBy((cim) => cim.Value).ToArray(); if (cims.Length > 0) { foreach (var cim in cims) { Formatter.WriteRaw("var $IM{0:X2} = function () ", cim.Value); Formatter.OpenBrace(); Formatter.WriteRaw("return ($IM{0:X2} = JSIL.Memoize(", cim.Value); Formatter.Identifier(cim.Key.InterfaceType, astEmitter.ReferenceContext, false); Formatter.Dot(); Formatter.Identifier(cim.Key.InterfaceMember, EscapingMode.MemberIdentifier); Formatter.WriteRaw(")) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } if ((cts.Length > 0) || (css.Length > 0)) Formatter.NewLine(); }
public void EmitCachedValues(IAstEmitter astEmitter, TypeExpressionCacher typeCacher, SignatureCacher signatureCacher, BaseMethodCacher baseMethodCacher) { var cts = typeCacher.CachedTypes.Values.OrderBy((ct) => ct.Index).ToArray(); if (cts.Length > 0) { foreach (var ct in cts) { Formatter.WriteRaw("var $T{0:X2} = function () ", ct.Index); Formatter.OpenBrace(); Formatter.WriteRaw("return ($T{0:X2} = JSIL.Memoize(", ct.Index); Formatter.Identifier(ct.Type, astEmitter.ReferenceContext, false); Formatter.WriteRaw(")) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } var css = signatureCacher.Global.Signatures.OrderBy((cs) => cs.Value).ToArray(); if (css.Length > 0) { foreach (var cs in css) { Formatter.WriteRaw("var $S{0:X2} = function () ", cs.Value); Formatter.OpenBrace(); Formatter.WriteRaw("return ($S{0:X2} = JSIL.Memoize(", cs.Value); Formatter.Signature(cs.Key.Method, cs.Key.Signature, astEmitter.ReferenceContext, cs.Key.IsConstructor, false); Formatter.WriteRaw(")) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } var bms = baseMethodCacher.CachedMethods.Values.OrderBy((ct) => ct.Index).ToArray(); if (bms.Length > 0) { foreach (var bm in bms) { Formatter.WriteRaw("var $BM{0:X2} = function () ", bm.Index); Formatter.OpenBrace(); Formatter.WriteRaw("return ($BM{0:X2} = JSIL.Memoize(", bm.Index); Formatter.WriteRaw("Function.call.bind("); Formatter.Identifier(bm.Method.Reference, astEmitter.ReferenceContext, true); Formatter.WriteRaw("))) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } var cims = signatureCacher.Global.InterfaceMembers.OrderBy((cim) => cim.Value).ToArray(); if (cims.Length > 0) { foreach (var cim in cims) { Formatter.WriteRaw("var $IM{0:X2} = function () ", cim.Value); Formatter.OpenBrace(); Formatter.WriteRaw("return ($IM{0:X2} = JSIL.Memoize(", cim.Value); Formatter.Identifier(cim.Key.InterfaceType, astEmitter.ReferenceContext, false); Formatter.Dot(); Formatter.Identifier(cim.Key.InterfaceMember, EscapingMode.MemberIdentifier); Formatter.WriteRaw(")) ()"); Formatter.Semicolon(true); Formatter.CloseBrace(false); Formatter.Semicolon(true); } } if ((cts.Length > 0) || (css.Length > 0)) { Formatter.NewLine(); } }