#include <spvm_native.h>

#include "mylib.hpp"

#include <iostream>
#include <sstream>
#include <thread>

extern "C" {

void ThreadFunc(int num) {
  std::cerr << "ThreadFunc " << num << std::endl;
}

int32_t SPVM__TestCase__NativeAPICpp__call_cpp_func(SPVM_ENV* env, SPVM_VALUE* stack) {
  (void)env;
  (void)stack;
  
  int32_t value = stack[0].ival;
  
  value *= 2;
  
  std::ostringstream str_stream;
  
  str_stream << "abc";
  
  std::thread th1(ThreadFunc, 1);
  th1.join();
  
  stack[0].ival = value;
  
  return 0;
}

int32_t SPVM__TestCase__NativeAPICpp__call_native_func(SPVM_ENV* env, SPVM_VALUE* stack) {
  (void)env;
  (void)stack;
  
  int32_t value = stack[0].ival;
  
  value = Foo::mul3((int)value);
  
  spvm_warn("spvm_warn test: %s %d", "aaa", 3);
  spvm_warn("spvm_warn test:");
  
  spvm_warnf(env->api->runtime->get_spvm_stderr(env->runtime), "spvm_warnf test: %s %d", "aaa", 3);
  spvm_warnf(env->api->runtime->get_spvm_stderr(env->runtime), "spvm_warnf test:Foo");
  
  const char* func_name = __func__;
  
  stack[0].ival = value;
  
  return 0;
}

}