コード例 #1
0
 public void EmitCachedValues(IAstEmitter astEmitter, TypeExpressionCacher typeCacher, SignatureCacher signatureCacher, BaseMethodCacher baseMethodCacher)
 {
 }
コード例 #2
0
ファイル: TypeUtil.cs プロジェクト: y0ti/JSIL
        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);
        }
コード例 #3
0
ファイル: JavascriptAssemblyEmitter.cs プロジェクト: sq/JSIL
        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();
        }
コード例 #4
0
        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();
        }
コード例 #5
0
ファイル: AssemblyEmitter.cs プロジェクト: WebAssembly/ilwasm
 public void EmitCachedValues(IAstEmitter astEmitter, TypeExpressionCacher typeCacher, SignatureCacher signatureCacher, BaseMethodCacher baseMethodCacher)
 {
 }
コード例 #6
0
        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();
            }
        }