blob: e6fa7e592a0e51515e8412a2e975763fa0d32213 [file] [log] [blame]
//===--- 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;
}