//===--- PNetString.cpp - Implementation of PNet string interface ---------===//
//
//                                N3
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "llvm/DerivedTypes.h"
#include "llvm/GlobalVariable.h"

#include "mvm/JIT.h"

#include "CLIString.h"
#include "MSCorlib.h"
#include "N3.h"
#include "PNetString.h"
#include "VMArray.h"
#include "VMClass.h"
#include "VMThread.h"

using namespace n3;
using namespace llvm;


CLIString* CLIString::stringDup(const ArrayChar* array, N3* vm) {
	llvm_gcroot(array, 0);
  declare_gcroot(PNetString*, obj) = (PNetString*)MSCorlib::pString->doNew();
  obj->capacity = array->size;
  obj->length = array->size;
  if (array->size == 0) {
    obj->firstChar = 0;
  } else {
    obj->firstChar = array->elements[0];
  }
  obj->value = array; 
  return obj;
}

GlobalVariable* CLIString::llvmVar(CLIString *self) {
	llvm_gcroot(self, 0);
  declare_gcroot(PNetString*, str) = (PNetString*)self;
  if (!str->_llvmVar) {
    N3* vm = VMThread::get()->getVM();
    if (!str->_llvmVar) {
      const Type* pty = PointerType::getUnqual(Type::getInt8Ty(getGlobalContext()));
      Constant* cons = 
        ConstantExpr::getIntToPtr(ConstantInt::get(Type::getInt64Ty(getGlobalContext()), uint64_t (self)),
                                  pty);
      str->_llvmVar = new GlobalVariable(*(vm->getLLVMModule()), pty, true,
                                    GlobalValue::ExternalLinkage,
                                    cons, "");
    }
  }
  return str->_llvmVar;
}
