public void Memory(char action, string targetName, int paramCount) { uint crush; switch (action) { case 's' when paramCount > 1: //set indexed _opcodes.Add(NanTags.EncodeVariableRef(targetName, out crush)); AddSymbol(crush, targetName); _opcodes.Add(NanTags.EncodeOpcode('m', 'S', (ushort)paramCount, 0)); break; case 'g' when paramCount > 0: // get indexed _opcodes.Add(NanTags.EncodeVariableRef(targetName, out crush)); AddSymbol(crush, targetName); _opcodes.Add(NanTags.EncodeOpcode('m', 'G', (ushort)paramCount, 0)); break; default: NanTags.EncodeVariableRef(targetName, out crush); AddSymbol(crush, targetName); _opcodes.Add(NanTags.EncodeLongOpcode('m', action, crush)); break; } }
/// <summary> /// Encode a compound compare /// </summary> /// <param name="operation">compare to do</param> /// <param name="argCount">number of value-stack args to compare</param> /// <param name="opCodeCount">opcodes to jump relative down if top if comparison result is false</param> public void CompoundCompareJump(CmpOp operation, ushort argCount, ushort opCodeCount) { _opcodes.Add(NanTags.EncodeOpcode('C', (byte)operation, argCount, opCodeCount)); }
public void Return(int pCount) { _opcodes.Add(NanTags.EncodeOpcode('c', 'r', 0, (ushort)pCount)); }
/// <summary> /// Function return that should not happen /// </summary> public void InvalidReturn() { _opcodes.Add(NanTags.EncodeOpcode('c', 't', 0, 0)); }
/// <summary> /// Add a define-and-skip set of opcodes *before* merging in the compiled function opcodes. /// </summary> public void FunctionDefine(string functionName, int argCount, uint tokenCount) { _opcodes.Add(NanTags.EncodeVariableRef(functionName, out var crushed)); AddSymbol(crushed, functionName); _opcodes.Add(NanTags.EncodeOpcode('f', 'd', (ushort)argCount, (ushort)tokenCount)); }
public void FunctionCall(string functionName, int parameterCount) { _opcodes.Add(NanTags.EncodeVariableRef(functionName, out _)); _opcodes.Add(NanTags.EncodeOpcode('f', 'c', (ushort)parameterCount, 0)); }