require 'littlejit'

stack = []
function = LittleJIT::Function.new(0)
function.compile do
  ARGV.each do |arg|
    case arg
    when /\d+/
      i = arg.to_i
      value = function.constant(i)
      stack.push(value)
      
    when '+'
      value2 = stack.pop
      value1 = stack.pop
      result = function.insn_add(value1, value2)
      stack.push(result)

    when '-'
      value2 = stack.pop
      value1 = stack.pop
      result = function.insn_sub(value1, value2)
      stack.push(result)

    when '*'
      value2 = stack.pop
      value1 = stack.pop
      result = function.insn_mul(value1, value2)
      stack.push(result)

    when '/'
      value2 = stack.pop
      value1 = stack.pop
      result = function.insn_div(value1, value2)
      stack.push(result)

    else
      raise "Invalid token #{arg.inspect}"
    end
  end

  if stack.size == 0 then
    raise "Stack is empty"
  end

  if stack.size > 1 then
    raise "Too many items on stack"
  end

  result = stack.pop
  function.insn_return(result)
end

puts function.apply()


