static void dump_addrinfo (struct connectdata *conn, const struct addrinfo *ai) { TRACE(("dump_addrinfo:\n")); for ( ; ai; ai = ai->ai_next) { char buf [INET6_ADDRSTRLEN]; trace_it(" fam %2d, CNAME %s, ", ai->ai_family, ai->ai_canonname ? ai->ai_canonname : "<none>"); if (Curl_printable_address(ai, buf, sizeof(buf))) trace_it("%s\n", buf); else trace_it("failed; %s\n", Curl_strerror(conn, SOCKERRNO)); } }
void execute(bool trace) { int32_t x; int32_t y; int32_t opcode; bool fatal = false; while (ip < _code_size && !fatal) { opcode = _code[ip]; if (trace) { trace_it(ip); } ip++; switch(opcode) { case I_STOP: return; case I_PUSH: _stack[++sp] = _code[ip++]; break; case I_POP: sp--; break; case I_ADD: if (sp < 0) { printf("Stack underflow"); fatal = true; } else { y = _stack[sp--]; x = _stack[sp]; _stack[sp] = x + y; } break; case I_MUL: if (sp < 0) { printf("Stack underflow"); fatal = true; } else { y = _stack[sp--]; x = _stack[sp]; _stack[sp] = x * y; } break; case I_DIV: if (sp < 0) { printf("Stack underflow"); fatal = true; } else { y = _stack[sp--]; x= _stack[sp]; _stack[sp] = x / y; } break; case I_MOD: if (sp < 0) { printf("Stack underflow"); fatal = true; } else { y = _stack[sp--]; x = _stack[sp]; _stack[sp] = x % y; } break; case I_SUB: if (sp < 0) { printf("Stack underflow"); fatal = true; } else { y = _stack[sp--]; x = _stack[sp]; _stack[sp] = x / y; } break; case I_INC: _stack[sp]++; break; case I_NEG: _stack[sp] = - _stack[sp];; break; case I_DEC: _stack[sp]--; break; case I_LOADPUSH: _stack[++sp] = _data[_code[ip++]]; break; case I_POPSTORE: if (sp < 0) { printf("Stack underflow"); fatal = true; } else { _data[_code[ip++]] = _stack[sp--]; } break; case I_FRPUSH: y = fp + _code[ip++]; _stack[++sp] = _stack[y]; break; case I_FRPOP: if (sp < 0) { printf("Stack underflow"); fatal = true; } else { y = fp + _code[ip++]; _stack[y] = _stack[sp--]; } break; case I_STORE: if (sp < 0) { printf("Stack underflow"); fatal = true; } else { _data[_code[ip++]] = _stack[sp]; } break; case I_JNZ: y = _code[ip++]; if (_stack[sp]) { ip += y; } break; case I_JZ: y = _code[ip++]; if (!_stack[sp]) { ip += y; } break; case I_JMP: y = _code[ip++]; ip += y; break; case I_CALL: { int32_t dest = _code[ip++]; int32_t arg_count = _code[ip++]; int32_t old_sp = sp; _stack[++sp] = arg_count; _stack[++sp] = old_sp;; _stack[++sp] = ip; _stack[++sp] = fp; ip = dest; fp = sp + 1; break; } case I_RETURN: { int32_t return_value = _stack[sp--]; int32_t old_fp = fp; sp = _stack[old_fp-3] - _stack[old_fp-4]; ip = _stack[old_fp-2]; fp = _stack[old_fp-1]; _stack[++sp] = return_value; break; } default: printf("Failure: Invalid opcode %d", opcode); return; } } }