[VER] v0.4.1-alpha
Some checks failed
Release Build / build-windows-x64 (push) Failing after 3m2s
Release Build / build-linux-x64 (push) Has been cancelled

[Fix] 修复struct定义创建instanceCtx时拷贝类方法错误的Bug,表现在同一类的2个不同实例内置函数一样的问题
      (即 addr A != addr B, addr A.method == addr B.method)
      修复后为 (addr A != addr B, addr A.method != addr B.method)
      方法的closureContext指向instance的Context
      修复后 std.time可以正常使用
This commit is contained in:
2026-01-19 16:10:12 +08:00
parent 9e3f17711f
commit caf058dd55
2 changed files with 35 additions and 10 deletions

View File

@@ -4,7 +4,7 @@
#include <cstdint> #include <cstdint>
#include <string_view> #include <string_view>
#define __FCORE_VERSION "0.4.0-alpha" #define __FCORE_VERSION "0.4.1-alpha"
#if defined(_WIN32) #if defined(_WIN32)
#define __FCORE_PLATFORM "Windows" #define __FCORE_PLATFORM "Windows"

View File

@@ -984,17 +984,42 @@ namespace Fig
} }
} }
} }
instanceCtx->merge(*structT.defContext); // instanceCtx->merge(*structT.defContext);
for (auto &[id, fn] : instanceCtx->getFunctions()) // for (auto &[id, fn] : instanceCtx->getFunctions())
// {
// instanceCtx->_update(*instanceCtx->getFunctionName(id),
// std::make_shared<Object>(Function(fn.paras,
// fn.retType,
// fn.body,
// instanceCtx) // change its closureContext to
// // struct instance's context
// ));
// }
ContextPtr stDefCtx = structT.defContext;
// load struct method
for (auto &[id, fn] : stDefCtx->getFunctions())
{ {
instanceCtx->_update(*instanceCtx->getFunctionName(id), auto funcNameOpt = stDefCtx->getFunctionName(id);
std::make_shared<Object>(Function(fn.paras, assert(funcNameOpt.has_value());
const FString &funcName = *funcNameOpt;
auto funcSlot = stDefCtx->get(funcName);
instanceCtx->def(
funcName,
ValueType::Function,
funcSlot->am,
std::make_shared<Object>(Function(
fn.paras,
fn.retType, fn.retType,
fn.body, fn.body,
instanceCtx) // change its closureContext to instanceCtx
// struct instance's context ))
)); );
} }
return std::make_shared<Object>(StructInstance(structT.type, instanceCtx)); return std::make_shared<Object>(StructInstance(structT.type, instanceCtx));
} }