private void UpdateStackAndInstrStream(OpCode?instr, TransitionWrapper transitions, bool firstParamIsThis = false) { if (Invalidated) { throw new InvalidOperationException("Cannot modify Emit after a delegate has been generated from it"); } if (MustMark) { throw new SigilVerificationException("Unreachable code detected", IL.Instructions(AllLocals)); } var wrapped = new InstructionAndTransitions(instr, instr.HasValue ? (int?)IL.Index : null, transitions.Transitions); TypesProducedAtIndex[IL.Index] = transitions.Transitions.SelectMany(t => t.PushedToStack).ToList(); var verifyRes = CurrentVerifiers.Transition(wrapped); if (!verifyRes.Success) { throw new SigilVerificationException(transitions.MethodName, verifyRes, IL.Instructions(AllLocals)); } if (IsVerifying) { MaxStackSize = Math.Max(verifyRes.StackSize, MaxStackSize); } }
public StateFactory() { isTransitionDone = true; //Don't show transition screen if it's our first load. isSceneLoaded = false; GameObject transitionScreen = GameObject.Instantiate(Resources.Load <GameObject>(TRANSITION_SCREEN_ID)) as GameObject; m_transitionScreen = new TransitionWrapper(transitionScreen); }
private void UpdateState(OpCode instr, FieldInfo field, TransitionWrapper transitions) { UpdateStackAndInstrStream(instr, transitions); IL.Emit(instr, field); }
private void UpdateState(OpCode instr, MethodInfo method, IEnumerable <Type> parameterTypes, TransitionWrapper transitions, bool firstParamIsThis = false, Type[] arglist = null) { UpdateStackAndInstrStream(instr, transitions, firstParamIsThis); if (arglist == null) { IL.Emit(instr, method, parameterTypes); } else { IL.EmitCall(instr, method, parameterTypes, arglist); } }
private void UpdateState(OpCode instr, ConstructorInfo cons, TransitionWrapper transitions) { UpdateStackAndInstrStream(instr, transitions); IL.Emit(instr, cons); }
private void UpdateState(OpCode instr, ConstructorInfo cons, IEnumerable <Type> parameterTypes, TransitionWrapper transitions) { UpdateStackAndInstrStream(instr, transitions, firstParamIsThis: true); IL.Emit(instr, cons, parameterTypes); }
private void UpdateState(OpCode instr, Label[] param, TransitionWrapper transitions, out UpdateOpCodeDelegate update) { UpdateStackAndInstrStream(instr, transitions); IL.Emit(instr, param, out update); }
private TransitionWrapper Wrap(IEnumerable <StackTransition> trans, string name) { return(TransitionWrapper.Get(name, trans)); }
private void ConvertToSByte(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_I1, transitions); }
private void ConvertToByteOverflow(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_Ovf_U1, transitions); }
private void ConvertToUInt32Overflow(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_Ovf_U4, transitions); }
private void ConvertToFloat(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_R4, transitions); }
private void ConvertToDouble(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_R8, transitions); }
private void ConvertToInt64Overflow(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_Ovf_I8, transitions); }
private void ConvertToInt32(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_I4, transitions); }
private void UnsignedConvertToSByteOverflow(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_Ovf_I1_Un, transitions); }
private void UpdateState(OpCode instr, string str, TransitionWrapper transitions) { UpdateStackAndInstrStream(instr, transitions); IL.Emit(instr, str); }
private void UpdateState(TransitionWrapper transitions) { UpdateStackAndInstrStream(null, transitions); }
private void UpdateState(OpCode instr, CallingConventions callConventions, Type returnType, Type[] parameterTypes, TransitionWrapper transitions, Type[] arglist) { UpdateStackAndInstrStream(instr, transitions); if (arglist == null) { IL.Emit(instr, callConventions, returnType, parameterTypes); } else { IL.EmitCalli(callConventions, returnType, parameterTypes, arglist); } }
private void ConvertToNativeInt(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_I, transitions); }
private void ConvertToUInt64(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_U8, transitions); }
private void ConvertToUnsignedNativeIntOverflow(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_Ovf_U, transitions); }
private void UpdateState(OpCode instr, long param, TransitionWrapper transitions) { UpdateStackAndInstrStream(instr, transitions); IL.Emit(instr, param); }
private void UnsignedConvertToUInt64Overflow(TransitionWrapper transitions) { UpdateState(OpCodes.Conv_Ovf_U8_Un, transitions); }