本文整理汇总了C#中CodeGen.EmitObjectArray方法的典型用法代码示例。如果您正苦于以下问题:C# CodeGen.EmitObjectArray方法的具体用法?C# CodeGen.EmitObjectArray怎么用?C# CodeGen.EmitObjectArray使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CodeGen
的用法示例。
在下文中一共展示了CodeGen.EmitObjectArray方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: EmitWithCatchBlock
private void EmitWithCatchBlock(CodeGen cg, Slot exc, Slot exit)
{
cg.BeginCatchBlock(typeof(Exception));
// Extract state from the carrier exception
cg.EmitCallerContext();
cg.EmitCall(typeof(Ops), "ExtractException",
new Type[] { typeof(Exception), typeof(ICallerContext) });
cg.Emit(OpCodes.Pop);
// except body
cg.PushExceptionBlock(Targets.TargetBlockType.Catch, null, null);
cg.EmitConstantBoxed(false);
exc.EmitSet(cg);
cg.EmitCallerContext();
exit.EmitGet(cg);
cg.EmitObjectArray(new Expression[0]);
cg.EmitCallerContext();
cg.EmitCall(typeof(Ops), "ExtractSysExcInfo");
cg.EmitCall(typeof(Ops), "CallWithArgsTupleAndContext", new Type[] { typeof(ICallerContext), typeof(object), typeof(object[]), typeof(object) });
Label afterRaise = cg.DefineLabel();
cg.EmitTestTrue();
cg.Emit(OpCodes.Brtrue, afterRaise);
cg.EmitCall(typeof(Ops), "Raise", new Type[0]); //, new Type[] { typeof(object), typeof(SymbolId) });
cg.MarkLabel(afterRaise);
cg.EmitCallerContext();
cg.EmitCall(typeof(Ops), "ClearException", new Type[] { typeof(ICallerContext) });
cg.PopTargets();
}
示例2: Emit
internal override void Emit(CodeGen cg)
{
cg.EmitPosition(Start, header);
SignatureInfo sigInfo = GetSignature(cg);
FlowChecker.Check(this);
string mname = name.GetString() + "$f" + counter++;
// create the new method & setup it's locals
CodeGen impl = cg.DefineMethod(mname, typeof(object), sigInfo.ParamTypes, sigInfo.ParamNames);
impl.Names = CodeGen.CreateLocalNamespace(impl);
impl.Context = cg.Context;
for (int arg = sigInfo.HasContext ? 1 : 0; arg < sigInfo.ParamNames.Length; arg++) {
impl.Names.SetSlot(sigInfo.ParamNames[arg], impl.GetArgumentSlot(arg));
}
if (sigInfo.HasContext) {
if (IsClosure) {
impl.StaticLinkSlot = impl.GetArgumentSlot(0);
}
impl.ContextSlot = impl.GetArgumentSlot(0);
impl.ModuleSlot = new PropertySlot(impl.ContextSlot, typeof(ICallerContext).GetProperty("Module"));
}
// then generate the actual method
EmitFunctionImplementation(impl, cg);
impl.Finish();
if (NeedsWrapperMethod()) impl = MakeWrapperMethodN(cg, impl.MethodInfo, sigInfo.HasContext);
// Create instance of the Function? object
Type funcType, targetType;
using (impl) {
GetFunctionType(out funcType, out targetType);
cg.EmitModuleInstance();
cg.EmitString(name.GetString());
cg.EmitDelegate(impl, targetType, sigInfo.ContextSlot);
}
int first = sigInfo.HasContext ? 1 : 0;
// Emit string array (minus the first environment argument)
cg.EmitInt(sigInfo.ParamNames.Length - first);
cg.Emit(OpCodes.Newarr, typeof(string));
for (int i = first; i < sigInfo.ParamNames.Length; i++) {
cg.Emit(OpCodes.Dup);
cg.EmitInt(i - first);
cg.EmitStringOrNull(sigInfo.ParamNames[i].GetString());
cg.Emit(OpCodes.Stelem_Ref);
}
cg.EmitObjectArray(defaults);
if (flags == FunctionAttributes.None) {
cg.Emit(OpCodes.Newobj, funcType.GetConstructor(
new Type[] { typeof(PythonModule), typeof(string), targetType, typeof(string[]), typeof(object[]) }));
} else {
cg.EmitInt((int)flags);
cg.Emit(OpCodes.Newobj, funcType.GetConstructor(
new Type[] { typeof(PythonModule), typeof(string), targetType, typeof(string[]), typeof(object[]), typeof(FunctionAttributes) }));
}
string doc = Body.Documentation;
if (doc != null) {
cg.Emit(OpCodes.Dup);
cg.EmitString(doc);
cg.EmitCall(typeof(PythonFunction).GetProperty("Documentation").GetSetMethod());
}
// update func_code w/ appropriate state.
cg.Emit(OpCodes.Dup);
Slot functionCode = cg.GetLocalTmp(typeof(FunctionCode));
cg.EmitCall(typeof(PythonFunction).GetProperty("FunctionCode").GetGetMethod());
cg.Emit(OpCodes.Castclass, typeof(FunctionCode));
cg.Emit(OpCodes.Dup);
functionCode.EmitSet(cg);
if (IsExternal) {
cg.EmitInt(this.ExternalStart.Line);
} else {
cg.EmitInt(this.Start.Line);
}
cg.EmitCall(typeof(FunctionCode), "SetLineNumber");
functionCode.EmitGet(cg);
if (IsExternal) {
cg.EmitString(ExternalInfo.OriginalFileName);
} else {
cg.EmitString(this.filename);
}
cg.EmitCall(typeof(FunctionCode), "SetFilename");
// Only codegen the call into SetFlags if there are flags to set.
FunctionCode.FuncCodeFlags codeFlags = 0;
if (cg.Context.TrueDivision) codeFlags |= FunctionCode.FuncCodeFlags.FutureDivision;
if (this.yieldCount > 0) codeFlags |= FunctionCode.FuncCodeFlags.Generator;
if (codeFlags != 0) {
functionCode.EmitGet(cg);
//.........这里部分代码省略.........
示例3: Emit
// ***WITH STATEMENT CODE GENERATION ALGORITHM***
//
//GRAMMAR :=
//with EXPR as VAR:
// BLOCK
//
//CODE GEN :=
//
//mgr = (EXPR)
//exit = mgr.__exit__ # Not calling it yet
//value = mgr.__enter__()
//exc = True
//isTryYielded = False
//try:
//
// VAR = value # Only if "as VAR" is present
// BLOCK
// // if yield happens in the Block,
// // then isTryYielded is set to True by Yield's Code Gen
//except:
// # The exceptional case is handled here
// exc = False
// if not exit(*sys.exc_info()):
// raise
// # The exception is consumed if exit() returns true
//finally:
// # The normal and non-local-goto cases are handled here
// if isTryYielded = False && exc == True :
// exit(None, None, None)
internal override void Emit(CodeGen cg)
{
Slot exc = null;
Slot isTryYielded = null;
Slot exit = null;
if (cg.IsGenerator()) {
exc = cg.Names.GetTempSlot("with", typeof(object));
isTryYielded = cg.Names.GetTempSlot("with", typeof(object));
exit = cg.Names.GetTempSlot("with", typeof(object));
} else {
exc = cg.GetLocalTmp(typeof(object));
isTryYielded = cg.GetLocalTmp(typeof(object));
exit = cg.GetLocalTmp(typeof(object));
}
// mgr = (EXPR)
Slot mgr = cg.GetLocalTmp(typeof(object));
contextManager.Emit(cg);
mgr.EmitSet(cg);
// exit = mgr.__exit__ # not calling it yet
cg.EmitCallerContext();
mgr.EmitGet(cg);
cg.EmitSymbolId("__exit__");
cg.EmitCall(typeof(Ops), "GetAttr");
exit.EmitSet(cg);
mgr.EmitGet(cg);
cg.FreeLocalTmp(mgr);
cg.EmitSymbolId("__enter__");
cg.EmitObjectArray(new Expression[0]);
cg.EmitCall(typeof(Ops), "Invoke", new Type[] { typeof(object), typeof(SymbolId), typeof(object[]) });
Slot value = cg.GetLocalTmp(typeof(object));
value.EmitSet(cg);
// exc = True
cg.EmitConstantBoxed(true);
exc.EmitSet(cg);
Slot choiceVar = null;
if (yieldTargets != null && yieldTargets.Count > 0) {
Label startOfBlock = cg.DefineLabel();
choiceVar = cg.GetLocalTmp(typeof(int));
cg.EmitInt(-1);
choiceVar.EmitSet(cg);
cg.Emit(OpCodes.Br, startOfBlock);
int index = 0;
foreach (YieldTarget yt in yieldTargets) {
cg.MarkLabel(yt.TopBranchTarget);
cg.EmitInt(index++);
choiceVar.EmitSet(cg);
cg.Emit(OpCodes.Br, startOfBlock);
}
cg.MarkLabel(startOfBlock);
}
cg.EmitConstantBoxed(false);
isTryYielded.EmitSet(cg);
Label beforeFinally = cg.DefineLabel();
cg.PushWithTryBlock(isTryYielded);
cg.BeginExceptionBlock();
if (yieldTargets != null && yieldTargets.Count > 0) {
int index = 0;
foreach (YieldTarget yt in yieldTargets) {
//.........这里部分代码省略.........
示例4: Emit
internal override void Emit(CodeGen cg)
{
Label done = new Label();
bool emitDone = false;
Expression[] exprs = new Expression[args.Length - extraArgs];
Expression argsTuple = null, keywordDict = null;
string[] keywordNames = new string[keywordCount];
int index = 0, keywordIndex = 0;
foreach (Arg arg in args) {
if (arg.Name == SymbolTable.Star) {
argsTuple = arg.Expression; continue;
} else if (arg.Name == SymbolTable.StarStar) {
keywordDict = arg.Expression; continue;
} else if (arg.Name != SymbolTable.Empty) {
keywordNames[keywordIndex++] = arg.Name.GetString();
}
exprs[index++] = arg.Expression;
}
if (hasKeywordDict || (hasArgsTuple && keywordCount > 0)) {
cg.EmitCallerContext();
target.Emit(cg);
cg.EmitObjectArray(exprs);
cg.EmitStringArray(keywordNames);
cg.EmitExprOrNone(argsTuple);
cg.EmitExprOrNone(keywordDict);
cg.EmitCall(typeof(Ops), "CallWithArgsTupleAndKeywordDictAndContext",
new Type[] { typeof(ICallerContext), typeof(object), typeof(object[]), typeof(string[]),
typeof(object), typeof(object)});
} else if (hasArgsTuple) {
cg.EmitCallerContext();
target.Emit(cg);
cg.EmitObjectArray(exprs);
cg.EmitExprOrNone(argsTuple);
cg.EmitCall(typeof(Ops), "CallWithArgsTupleAndContext",
new Type[] { typeof(ICallerContext), typeof(object), typeof(object[]), typeof(object) });
} else if (keywordCount > 0) {
cg.EmitCallerContext();
target.Emit(cg);
cg.EmitObjectArray(exprs);
cg.EmitStringArray(keywordNames);
cg.EmitCall(typeof(Ops), "Call",
new Type[] { typeof(ICallerContext), typeof(object), typeof(object[]), typeof(string[]) });
} else {
cg.EmitCallerContext();
target.Emit(cg);
if (args.Length <= Ops.MaximumCallArgs) {
Type[] argTypes = new Type[args.Length + 2];
int i = 0;
argTypes[i++] = typeof(ICallerContext);
argTypes[i++] = typeof(object);
foreach (Expression e in exprs) {
e.Emit(cg);
argTypes[i++] = typeof(object);
}
cg.EmitCall(typeof(Ops), "CallWithContext", argTypes);
} else {
cg.EmitObjectArray(exprs);
cg.EmitCall(typeof(Ops), "CallWithContext",
new Type[] { typeof(ICallerContext), typeof(object), typeof(object[]) });
}
}
if (emitDone) {
cg.MarkLabel(done);
}
}
示例5: EmitCallFromClrToPython
public static void EmitCallFromClrToPython(CodeGen cg, Slot callTarget, int firstArg, Ast.FunctionAttributes functionAttributes)
{
callTarget.EmitGet(cg);
List<ReturnFixer> fixers = new List<ReturnFixer>(0);
Slot[] args = cg.argumentSlots;
int nargs = args.Length - firstArg;
if (nargs <= Ops.MaximumCallArgs && (functionAttributes & IronPython.Compiler.Ast.FunctionAttributes.ArgumentList) == 0) {
for (int i = firstArg; i < args.Length; i++) {
ReturnFixer rf = CompilerHelpers.EmitArgument(cg, args[i]);
if (rf != null) fixers.Add(rf);
}
cg.EmitCall(typeof(Ops), "Call", CompilerHelpers.MakeRepeatedArray(typeof(object), nargs + 1));
} else if ((functionAttributes & IronPython.Compiler.Ast.FunctionAttributes.ArgumentList) == 0) {
cg.EmitObjectArray(nargs, delegate(int index) {
ReturnFixer rf = CompilerHelpers.EmitArgument(cg, args[index + firstArg]);
if (rf != null) fixers.Add(rf);
});
cg.EmitCall(typeof(Ops), "Call", new Type[] { typeof(object), typeof(object[]) });
} else {
cg.EmitObjectArray(nargs - 1, delegate(int index) {
ReturnFixer rf = CompilerHelpers.EmitArgument(cg, args[index + firstArg]);
if (rf != null) fixers.Add(rf);
});
args[args.Length - 1].EmitGet(cg);
cg.EmitCall(typeof(Tuple), "Make");
cg.EmitCall(typeof(Ops), "CallWithArgsTuple");
}
foreach (ReturnFixer rf in fixers) {
rf.FixReturn(cg);
}
cg.EmitReturnFromObject();
}
示例6: Emit
internal override void Emit(CodeGen cg)
{
cg.EmitPosition(Start, header);
CodeGen icg = CreateClassMaker(cg);
try {
// emit call to MakeClass(ICallerContext mod, string modName, string name, Tuple bases, IDictionary<object, object> vars)
// ICallerContext mod
cg.EmitModuleInstance();
// string modName (can't pull from context, could be changed)
cg.EmitGetGlobal(SymbolTable.Name);
cg.Emit(OpCodes.Castclass, typeof(string));
// class name
cg.EmitString(name.GetString());
// bases array
cg.EmitObjectArray(bases);
cg.EmitCall(typeof(Ops), "MakeTuple");
// vars
cg.EmitEnvironmentOrNull();
cg.EmitContextOrNull();
cg.EmitCall(icg.MethodInfo);
cg.EmitCall(typeof(Ops), "MakeClass");
// store result to class name
cg.EmitSet(name);
} finally {
icg.Dispose();
}
}