44
55#include " constant-int.h"
66#include " llvm-context.h"
7+ #include " ../util/string.h"
78
89NAN_MODULE_INIT (ConstantIntWrapper::Init) {
910 auto constantInt = Nan::GetFunction (Nan::New (constantIntTemplate ())).ToLocalChecked ();
@@ -27,15 +28,14 @@ NAN_METHOD(ConstantIntWrapper::New) {
2728}
2829
2930NAN_METHOD (ConstantIntWrapper::get) {
30- if (info.Length () < 2 || !LLVMContextWrapper::isInstance (info[0 ]) || !info[1 ]->IsNumber () ||
31+ if (info.Length () < 2 || !LLVMContextWrapper::isInstance (info[0 ]) || ( !info[1 ]->IsNumber () && !info[ 1 ]-> IsString () ) ||
3132 (info.Length () > 2 && !info[2 ]->IsNumber () && !info[2 ]->IsUndefined ()) ||
3233 (info.Length () > 3 && !info[3 ]->IsBoolean ()) ||
3334 info.Length () > 4 ) {
34- return Nan::ThrowTypeError (" get needs to be called with: context: LLVMContext, value: number, numBits = 32, signed= true" );
35+ return Nan::ThrowTypeError (" get needs to be called with: context: LLVMContext, value: number|string , numBits = 32, signed= true" );
3536 }
3637
3738 auto & context = LLVMContextWrapper::FromValue (info[0 ])->getContext ();
38- int64_t number = Nan::To<int64_t >(info[1 ]).FromJust ();
3939 uint32_t numBits = 32 ;
4040 bool isSigned = true ;
4141
@@ -47,9 +47,17 @@ NAN_METHOD(ConstantIntWrapper::get) {
4747 isSigned = Nan::To<bool >(info[3 ]).FromJust ();
4848 }
4949
50- auto * constant = llvm::ConstantInt::get (context, llvm::APInt { numBits, static_cast <uint64_t >(number), isSigned } );
50+ if (info[1 ]->IsString ()) {
51+ auto number = ToString (Nan::To<v8::String>(info[1 ]).ToLocalChecked ());
52+ auto * constant = llvm::ConstantInt::get (context, llvm::APInt { numBits, llvm::StringRef (number.c_str ()), 10 } );
5153
52- info.GetReturnValue ().Set (ConstantIntWrapper::of (constant));
54+ info.GetReturnValue ().Set (ConstantIntWrapper::of (constant));
55+ } else {
56+ int64_t number = Nan::To<int64_t >(info[1 ]).FromJust ();
57+ auto * constant = llvm::ConstantInt::get (context, llvm::APInt { numBits, static_cast <uint64_t >(number), isSigned } );
58+
59+ info.GetReturnValue ().Set (ConstantIntWrapper::of (constant));
60+ }
5361}
5462
5563NAN_METHOD (ConstantIntWrapper::getTrue) {
@@ -74,9 +82,18 @@ NAN_METHOD(ConstantIntWrapper::getFalse) {
7482 info.GetReturnValue ().Set (ConstantIntWrapper::of (constant));
7583}
7684
85+ NAN_METHOD (ConstantIntWrapper::toString) {
86+ auto * wrapper = ConstantIntWrapper::FromValue (info.Holder ());
87+ auto constantInt = wrapper->getConstantInt ();
88+ auto value = constantInt->getValue ();
89+
90+ info.GetReturnValue ().Set (Nan::New<v8::String>(value.toString (10 , true )).ToLocalChecked ());
91+ }
92+
7793NAN_GETTER (ConstantIntWrapper::getValueApf) {
7894 auto * wrapper = ConstantIntWrapper::FromValue (info.Holder ());
79- auto value = wrapper->getConstantInt ()->getValue ();
95+ auto constantInt = wrapper->getConstantInt ();
96+ auto value = constantInt->getValue ();
8097
8198 info.GetReturnValue ().Set (Nan::New (value.signedRoundToDouble ()));
8299}
@@ -106,6 +123,7 @@ Nan::Persistent<v8::FunctionTemplate>& ConstantIntWrapper::constantIntTemplate()
106123 Nan::SetMethod (localTemplate, " get" , ConstantIntWrapper::get);
107124 Nan::SetMethod (localTemplate, " getFalse" , ConstantIntWrapper::getFalse);
108125 Nan::SetMethod (localTemplate, " getTrue" , ConstantIntWrapper::getTrue);
126+ Nan::SetPrototypeMethod (localTemplate, " toString" , ConstantIntWrapper::toString);
109127 Nan::SetAccessor (localTemplate->InstanceTemplate (), Nan::New (" value" ).ToLocalChecked (), ConstantIntWrapper::getValueApf);
110128
111129 functionTemplate.Reset (localTemplate);
0 commit comments