@@ -434,10 +434,12 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
434434 return m_builder.CreateUIToFP (boolValue, m_builder.getDoubleTy ());
435435 }
436436
437- case Compiler::StaticType::String:
437+ case Compiler::StaticType::String: {
438438 // Convert to double
439- // TODO: Use value_stringToDouble()
440- return m_builder.CreateCall (m_functions.resolve_value_toDouble (), reg->value );
439+ llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
440+ llvm::Value *stringPtr = m_builder.CreateLoad (m_stringPtrType->getPointerTo (), ptr);
441+ return m_builder.CreateCall (m_functions.resolve_value_stringToDouble (), stringPtr);
442+ }
441443
442444 default :
443445 assert (false );
@@ -486,8 +488,9 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
486488 sw->addCase (m_builder.getInt32 (static_cast <uint32_t >(ValueType::String)), stringBlock);
487489
488490 m_builder.SetInsertPoint (stringBlock);
489- // TODO: Use value_stringToDouble()
490- llvm::Value *stringResult = m_builder.CreateCall (m_functions.resolve_value_toDouble (), reg->value );
491+ llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
492+ llvm::Value *stringPtr = m_builder.CreateLoad (m_stringPtrType->getPointerTo (), ptr);
493+ llvm::Value *stringResult = m_builder.CreateCall (m_functions.resolve_value_stringToDouble (), stringPtr);
491494 m_builder.CreateBr (mergeBlock);
492495 results.push_back ({ stringBlock, stringResult });
493496 }
@@ -529,10 +532,12 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
529532 return m_builder.CreateLoad (m_builder.getInt1Ty (), ptr);
530533 }
531534
532- case Compiler::StaticType::String:
535+ case Compiler::StaticType::String: {
533536 // Convert to bool
534- // TODO: Use value_stringToBool()
535- return m_builder.CreateCall (m_functions.resolve_value_toBool (), reg->value );
537+ llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
538+ llvm::Value *stringPtr = m_builder.CreateLoad (m_stringPtrType->getPointerTo (), ptr);
539+ return m_builder.CreateCall (m_functions.resolve_value_stringToBool (), stringPtr);
540+ }
536541
537542 default :
538543 assert (false );
@@ -581,8 +586,9 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
581586 sw->addCase (m_builder.getInt32 (static_cast <uint32_t >(ValueType::String)), stringBlock);
582587
583588 m_builder.SetInsertPoint (stringBlock);
584- // TODO: Use value_stringToBool()
585- llvm::Value *stringResult = m_builder.CreateCall (m_functions.resolve_value_toBool (), reg->value );
589+ llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
590+ llvm::Value *stringPtr = m_builder.CreateLoad (m_stringPtrType->getPointerTo (), ptr);
591+ llvm::Value *stringResult = m_builder.CreateCall (m_functions.resolve_value_stringToBool (), stringPtr);
586592 m_builder.CreateBr (mergeBlock);
587593 results.push_back ({ stringBlock, stringResult });
588594 }
@@ -611,13 +617,22 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
611617 if (singleType) {
612618 // Handle single type cases directly
613619 switch (type) {
614- case Compiler::StaticType::Number:
620+ case Compiler::StaticType::Number: {
621+ // Cast double to string
622+ llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
623+ llvm::Value *value = m_builder.CreateLoad (m_builder.getDoubleTy (), ptr);
624+ llvm::Value *stringPtr = m_builder.CreateCall (m_functions.resolve_value_doubleToStringPtr (), value);
625+ freeStringLater (stringPtr);
626+ return stringPtr;
627+ }
628+
615629 case Compiler::StaticType::Bool: {
616- // Cast to string
617- // TODO: Use value_doubleToStringPtr() and value_boolToStringPtr()
618- llvm::Value *ptr = m_builder.CreateCall (m_functions.resolve_value_toStringPtr (), reg->value );
619- freeStringLater (ptr);
620- return ptr;
630+ // Cast bool to string
631+ llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
632+ llvm::Value *value = m_builder.CreateLoad (m_builder.getInt1Ty (), ptr);
633+ llvm::Value *stringPtr = m_builder.CreateCall (m_functions.resolve_value_boolToStringPtr (), value);
634+ // NOTE: Dot not deallocate later
635+ return stringPtr;
621636 }
622637
623638 case Compiler::StaticType::String: {
@@ -648,8 +663,9 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
648663 sw->addCase (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Number)), numberBlock);
649664
650665 m_builder.SetInsertPoint (numberBlock);
651- // TODO: Use value_doubleToStringPtr()
652- llvm::Value *numberResult = m_builder.CreateCall (m_functions.resolve_value_toStringPtr (), reg->value );
666+ llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
667+ llvm::Value *value = m_builder.CreateLoad (m_builder.getDoubleTy (), ptr);
668+ llvm::Value *numberResult = m_builder.CreateCall (m_functions.resolve_value_doubleToStringPtr (), value);
653669 m_builder.CreateBr (mergeBlock);
654670 results.push_back ({ numberBlock, numberResult });
655671 }
@@ -659,9 +675,13 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
659675 llvm::BasicBlock *boolBlock = llvm::BasicBlock::Create (m_llvmCtx, " bool" , m_function);
660676 sw->addCase (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Bool)), boolBlock);
661677
678+ // Since the value is deallocated later, we need to create a copy
662679 m_builder.SetInsertPoint (boolBlock);
663- // TODO: Use value_boolToStringPtr()
664- llvm::Value *boolResult = m_builder.CreateCall (m_functions.resolve_value_toStringPtr (), reg->value );
680+ llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
681+ llvm::Value *value = m_builder.CreateLoad (m_builder.getInt1Ty (), ptr);
682+ llvm::Value *stringPtr = m_builder.CreateCall (m_functions.resolve_value_boolToStringPtr (), value);
683+ llvm::Value *boolResult = m_builder.CreateCall (m_functions.resolve_string_pool_new (), m_builder.getInt1 (true ));
684+ m_builder.CreateCall (m_functions.resolve_string_assign (), { boolResult, stringPtr });
665685 m_builder.CreateBr (mergeBlock);
666686 results.push_back ({ boolBlock, boolResult });
667687 }
0 commit comments