JavaScript::V8 を動かしてみた。
FreeBSD 13.3 ports 2024Q1
make test は全て通ります。

# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	make_test.log
#	Makefile
#	files/patch-Makefile.PL
#	files/patch-V8Context.cpp
#	distinfo
#	pkg-descr
#	pkg-plist
#
echo x - make_test.log
sed 's/^X//' >make_test.log << 'c9891b13d8d0ca1e6710989b08242cf1'
X# uname -a
XFreeBSD host1 13.3-STABLE FreeBSD 13.3-STABLE n257699-c39938ddd3a7 MYKERNEL amd64
X# git branch
X* local-2024Q1
X# pkg query %n-%v v8
Xv8-10.4.132.20_3
X# pwd
X/usr/ports/lang/p5-JavaScript-V8
X# make test
X===>   p5-JavaScript-V8-0.11 depends on file: /usr/local/sbin/pkg - found
X===> Fetching all distfiles required by p5-JavaScript-V8-0.11 for building
X===>  Extracting for p5-JavaScript-V8-0.11
X=> SHA256 Checksum OK for JavaScript-V8-0.11.tar.gz.
X===>  Patching for p5-JavaScript-V8-0.11
X===>  Applying FreeBSD patches for p5-JavaScript-V8-0.11 from /usr/ports/lang/p5-JavaScript-V8/files
X===>   p5-JavaScript-V8-0.11 depends on package: p5-Devel-CheckLib>=0.92 - found
X===>   p5-JavaScript-V8-0.11 depends on package: p5-ExtUtils-CppGuess>=0.19 - found
X===>   p5-JavaScript-V8-0.11 depends on package: p5-ExtUtils-XSpp>=0.11 - found
X===>   p5-JavaScript-V8-0.11 depends on package: perl5>=5.36<5.37 - found
X===>   p5-JavaScript-V8-0.11 depends on shared library: libv8.so - found (/usr/local/lib/libv8.so)
X===>  Configuring for p5-JavaScript-V8-0.11
XChecking if your kit is complete...
XLooks good
XGenerating a Unix-style Makefile
XWriting Makefile for JavaScript::V8
XWriting MYMETA.yml and MYMETA.json
X===>  Building for p5-JavaScript-V8-0.11
X--- blib/lib/JavaScript/.exists ---
X--- blib/arch/.exists ---
X--- blib/lib/auto/JavaScript/V8/.exists ---
X--- blib/arch/auto/JavaScript/V8/.exists ---
X--- blib/bin/.exists ---
X--- blib/script/.exists ---
X--- blib/man1/.exists ---
X--- blib/man3/.exists ---
X--- config ---
X--- subdirs ---
X--- dynamic ---
X--- WithV8Context.c ---
X--- V8.bs ---
X--- V8Context.o ---
X--- pm_to_blib ---
X--- WithV8Context.c ---
X"/usr/local/bin/perl" "/usr/local/lib/perl5/5.36/ExtUtils/xsubpp"  -C++ -hiertype -typemap '/usr/local/lib/perl5/5.36/ExtUtils/typemap' -typemap '/usr/ports/lang/p5-JavaScript-V8/work/JavaScript-V8-0.11/perlobject.map' -typemap '/usr/ports/lang/p5-JavaScript-V8/work/JavaScript-V8-0.11/typemap'  WithV8Context.xs > WithV8Context.xsc
XRunning Mkbootstrap for V8 ()
X--- V8Context.o ---
Xc++ -c  -I.  -O2 -pipe  -DV8_COMPRESS_POINTERS=1 -DV8_31BIT_SMIS_ON_64BIT_ARCH=1 -fstack-protector-strong -isystem /usr/local/include -fno-strict-aliasing -O2 -pipe -fstack-protector-strong -fno-strict-aliasing    -DVERSION=\"0.11\"  -DXS_VERSION=\"0.11\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.36/mach/CORE"   V8Context.cpp
X--- V8.bs ---
Xchmod 644 "V8.bs"
X--- blib/arch/auto/JavaScript/V8/V8.bs ---
X"/usr/local/bin/perl" -MExtUtils::Command::MM -e 'cp_nonempty' -- V8.bs blib/arch/auto/JavaScript/V8/V8.bs 644
X--- blibdirs ---
X--- config ---
X--- pm_to_blib ---
Xcp lib/JavaScript/V8.pm blib/lib/JavaScript/V8.pm
Xcp lib/JavaScript/V8/Context.pm blib/lib/JavaScript/V8/Context.pm
X--- WithV8Context.c ---
XPlease specify prototyping behavior for WithV8Context.xs (see perlxs manual)
Xmv WithV8Context.xsc WithV8Context.c
X--- WithV8Context.o ---
Xc++ -c  -I.  -O2 -pipe  -DV8_COMPRESS_POINTERS=1 -DV8_31BIT_SMIS_ON_64BIT_ARCH=1 -fstack-protector-strong -isystem /usr/local/include -fno-strict-aliasing -O2 -pipe -fstack-protector-strong -fno-strict-aliasing    -DVERSION=\"0.11\"  -DXS_VERSION=\"0.11\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.36/mach/CORE"   WithV8Context.c
Xc++: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
XWithV8Context.c:515:1: warning: duplicate 'extern' declaration specifier [-Wduplicate-decl-specifier]
X  515 | XS_EXTERNAL(boot_JavaScript__V8); /* prototype to pass -Wmissing-prototypes */
X      | ^
X/usr/local/lib/perl5/5.36/mach/CORE/XSUB.h:146:29: note: expanded from macro 'XS_EXTERNAL'
X  146 | #  define XS_EXTERNAL(name) extern "C" XSPROTO(name)
X      |                             ^
X--- V8Context.o ---
XV8Context.cpp:699:9: warning: ignoring return value of function declared with 'warn_unused_result' attribute [-Wunused-result]
X  699 |         prototype->Set(this->get_local_context(), name, (new PerlMethodData(this, SvPV_nolen(key)))->object.Get(isolate));
X      |         ^~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
XV8Context.cpp:797:13: warning: ignoring return value of function declared with 'warn_unused_result' attribute [-Wunused-result]
X  797 |             array->Set(this->get_local_context(), Integer::New(isolate, i), sv2v8(*sv, seen));
X      |             ^~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
XV8Context.cpp:812:16: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
X  812 |     while (val = hv_iternextsv(hv, &key, &len)) {
X      |            ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
XV8Context.cpp:812:16: note: place parentheses around the assignment to silence this warning
X  812 |     while (val = hv_iternextsv(hv, &key, &len)) {
X      |                ^
X      |            (                                  )
XV8Context.cpp:812:16: note: use '==' to turn this assignment into an equality comparison
X  812 |     while (val = hv_iternextsv(hv, &key, &len)) {
X      |                ^
X      |                ==
XV8Context.cpp:813:9: warning: ignoring return value of function declared with 'warn_unused_result' attribute [-Wunused-result]
X  813 |         object->Set(this->get_local_context(), v8::String::NewFromUtf8(isolate, key, v8::NewStringType::kNormal).ToLocalChecked(), sv2v8(val, seen));
X      |         ^~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
XV8Context.cpp:1033:1: warning: non-void function does not return a value [-Wreturn-type]
X 1033 | }
X      | ^
X--- WithV8Context.o ---
X1 warning generated.
X--- V8Context.o ---
X5 warnings generated.
X--- blib/arch/auto/JavaScript/V8/V8.so ---
Xrm -f blib/arch/auto/JavaScript/V8/V8.so
XLD_RUN_PATH="/usr/local/lib" c++  -shared  -L/usr/local/lib/perl5/5.36/mach/CORE -lperl -L/usr/local/lib -fstack-protector-strong  V8Context.o  WithV8Context.o -lc++ -o blib/arch/auto/JavaScript/V8/V8.so    -lv8 -lv8_libplatform
Xchmod 755 blib/arch/auto/JavaScript/V8/V8.so
X--- dynamic ---
X--- linkext ---
X--- pure_all ---
X--- manifypods ---
XManifying 2 pod documents
X--- all ---
X===>  Staging for p5-JavaScript-V8-0.11
X===>   p5-JavaScript-V8-0.11 depends on package: perl5>=5.36<5.37 - found
X===>   Generating temporary packing list
X"/usr/local/bin/perl" -MExtUtils::Command::MM -e 'cp_nonempty' -- V8.bs blib/arch/auto/JavaScript/V8/V8.bs 644
XManifying 2 pod documents
XFiles found in blib/arch: installing files in blib/lib into architecture dependent library tree
XInstalling /usr/ports/lang/p5-JavaScript-V8/work/stage/usr/local/lib/perl5/site_perl/mach/5.36/auto/JavaScript/V8/V8.so
XInstalling /usr/ports/lang/p5-JavaScript-V8/work/stage/usr/local/lib/perl5/site_perl/mach/5.36/JavaScript/V8.pm
XInstalling /usr/ports/lang/p5-JavaScript-V8/work/stage/usr/local/lib/perl5/site_perl/mach/5.36/JavaScript/V8/Context.pm
XInstalling /usr/ports/lang/p5-JavaScript-V8/work/stage/usr/local/lib/perl5/site_perl/man/man3/JavaScript::V8::Context.3
XInstalling /usr/ports/lang/p5-JavaScript-V8/work/stage/usr/local/lib/perl5/site_perl/man/man3/JavaScript::V8.3
X====> Compressing man pages (compress-man)
X===>  Testing for p5-JavaScript-V8-0.11
X===>   p5-JavaScript-V8-0.11 depends on package: p5-Test-Number-Delta>=0 - found
X"/usr/local/bin/perl" -MExtUtils::Command::MM -e 'cp_nonempty' -- V8.bs blib/arch/auto/JavaScript/V8/V8.bs 644
XPERL_DL_NONLAZY=1 "/usr/local/bin/perl" "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
Xt/00-report-prereqs.t .. #
X# Versions for all modules listed in MYMETA.json (including optional ones):
X#
X# === Configure Requires ===
X#
X#     Module              Want Have Where                          Howbig
X#     ------------------- ---- ---- ------------------------------ ------
X#     Devel::CheckLib     0.92 1.16 /usr/local/lib/perl5/site_perl  18784
X#     ExtUtils::CppGuess  0.19 0.27 /usr/local/lib/perl5/site_perl  16076
X#     ExtUtils::MakeMaker 6.64 7.64 /usr/local/lib/perl5/5.36      109482
X#
X# === Build Requires ===
X#
X#     Module         Want Have Where                          Howbig
X#     -------------- ---- ---- ------------------------------ ------
X#     ExtUtils::XSpp 0.11 0.18 /usr/local/lib/perl5/site_perl    108
X#
X# === Test Requires ===
X#
X#     Module              Want Have Where                          Howbig
X#     ------------------- ---- ---- ------------------------------ ------
X#     Test::Number::Delta  any 1.06 /usr/local/lib/perl5/site_perl  19391
X#
Xt/00-report-prereqs.t .. ok
Xt/01load.t ............. ok
Xt/basic.t .............. ok
Xt/bind_function.t ...... ok
Xt/bind_object.t ........ ok
Xt/boolean.t ............ ok
Xt/circular.t ........... ok
Xt/error.t .............. ok
Xt/eval_array.t ......... ok
Xt/eval_object.t ........ ok
Xt/global.t ............. ok
Xt/interrupt.t .......... ok
Xt/jsobj.t .............. ok
Xt/null.t ............... ok
Xt/plobj.t .............. ok
Xt/refcnt.t ............. ok
Xt/syntax_error.t ....... ok
Xt/types.t .............. ok
Xt/void.t ............... ok
Xt/zzmem_plojb1.t ....... skipped: apparent memory-leak, fixes welcome
Xt/zzmem_plojb2.t ....... ok
Xt/zzmem_sub.t .......... ok
XAll tests successful.
X
XTest Summary Report
X-------------------
Xt/interrupt.t        (Wstat: 0 Tests: 2 Failed: 0)
X  TODO passed:   2
XFiles=22, Tests=2104,  6 wallclock secs ( 0.12 usr  0.02 sys +  6.25 cusr  0.30 csys =  6.70 CPU)
XResult: PASS
c9891b13d8d0ca1e6710989b08242cf1
echo x - Makefile
sed 's/^X//' >Makefile << 'b67911656ef5d18c4ae36cb6741b7965'
XPORTNAME=	JavaScript-V8
XPORTVERSION=	0.11
XCATEGORIES=	lang perl5
XMASTER_SITES=	CPAN
XMASTER_SITE_SUBDIR=CPAN:ETJ
XPKGNAMEPREFIX=	p5-
X
XMAINTAINER=	bokutin@bokut.in
XCOMMENT=	Perl interface to the V8 JavaScript engine
X
XBUILD_DEPENDS=	p5-Devel-CheckLib>=0.92:devel/p5-Devel-CheckLib \
X		p5-ExtUtils-CppGuess>=0.19:devel/p5-ExtUtils-CppGuess \
X		p5-ExtUtils-XSpp>=0.11:devel/p5-ExtUtils-XSpp
XLIB_DEPENDS=	libv8.so:lang/v8
XTEST_DEPENDS=	p5-Test-Number-Delta>=0:devel/p5-Test-Number-Delta
X
XUSES=		perl5 localbase:ldflags
XUSE_PERL5=	configure
X
XCC=		c++
XCFLAGS+=	-DV8_COMPRESS_POINTERS=1 -DV8_31BIT_SMIS_ON_64BIT_ARCH=1
X
X.include <bsd.port.mk>
b67911656ef5d18c4ae36cb6741b7965
echo x - files/patch-Makefile.PL
sed 's/^X//' >files/patch-Makefile.PL << '492eac760546ef81beff3720b53ed455'
X--- Makefile.PL.orig	2022-12-18 20:03:30 UTC
X+++ Makefile.PL
X@@ -30,7 +30,7 @@ WriteMakefile(
X     },
X     ABSTRACT_FROM  => 'lib/JavaScript/V8.pm',
X     AUTHOR         => 'Pawel Murias <pawelmurias@gmail.org>',
X-    LIBS              => [($V8_DIR ? "-L$V8_DIR " : '') . '-lv8'],
X+    LIBS              => [($V8_DIR ? "-L$V8_DIR " : '') . '-lv8 -lv8_libplatform'],
X     INC               => '-I.' . ($V8_DIR ? " -I$V8_DIR/include" : ''),
X     OBJECT            => '$(O_FILES)', # link all the C files too
X     XSOPT             => '-C++ -hiertype',
492eac760546ef81beff3720b53ed455
echo x - files/patch-V8Context.cpp
sed 's/^X//' >files/patch-V8Context.cpp << '45010345c41f6fdf65e66720125c9ae8'
X--- V8Context.cpp.orig	2022-12-18 23:52:31 UTC
X+++ V8Context.cpp
X@@ -47,9 +47,9 @@ check_perl_error() {
X     const char *err = SvPV_nolen(ERRSV);
X 
X     if (err && strlen(err) > 0) {
X-        Handle<String> error = v8::String::NewFromUtf8(isolate, err, v8::String::kNormalString);
X+        MaybeLocal<String> error = v8::String::NewFromUtf8(isolate, err, v8::NewStringType::kNormal);
X         sv_setsv(ERRSV, &PL_sv_no);
X-        Handle<Value> v = isolate->ThrowException(Exception::Error(error));
X+        Handle<Value> v = isolate->ThrowException(Exception::Error(error.ToLocalChecked()));
X         return v;
X     }
X 
X@@ -223,7 +223,7 @@ class V8FunctionData : public V8ObjectData {
X public:
X     V8FunctionData(V8Context* context_, Handle<Object> object_, SV* sv_)
X         : V8ObjectData(context_, object_, sv_)
X-        , returns_list(object_->Has(context_->get_local_context(), String::NewFromUtf8(isolate, "__perlReturnsList", v8::String::kNormalString)).FromMaybe(0))
X+        , returns_list(object_->Has(context_->get_local_context(), String::NewFromUtf8(isolate, "__perlReturnsList", v8::NewStringType::kNormal).ToLocalChecked()).FromMaybe(0))
X     { }
X 
X     bool returns_list;
X@@ -356,8 +356,9 @@ V8Context::V8Context(
X 
X     Local<FunctionTemplate> tmpl = FunctionTemplate::New(isolate, PerlFunctionData::v8invoke);
X 
X-    context->Global()->Set(
X-        v8::String::NewFromUtf8(isolate, "__perlFunctionWrapper", v8::String::kNormalString),
X+    (void) context->Global()->Set(
X+	context,
X+        v8::String::NewFromUtf8(isolate, "__perlFunctionWrapper", v8::NewStringType::kNormal).ToLocalChecked(),
X         tmpl->GetFunction(context).ToLocalChecked()
X     );
X 
X@@ -372,13 +373,13 @@ V8Context::V8Context(
X             "        return __perlFunctionWrapper.apply(this, args)"
X             "    };"
X             "})",
X-            v8::String::kNormalString
X-        )
X+            v8::NewStringType::kNormal
X+        ).ToLocalChecked()
X     ).ToLocalChecked();
X 
X     make_function.Reset(isolate, Handle<Function>::Cast(script->Run(context).ToLocalChecked()));
X 
X-    string_wrap.Reset(isolate, String::NewFromUtf8(isolate, "wrap"));
X+    string_wrap.Reset(isolate, String::NewFromUtf8(isolate, "wrap").ToLocalChecked());
X 
X     number++;
X }
X@@ -440,7 +441,7 @@ V8Context::bind(const char *name, SV *thing) {
X     Local<Context> local_context = Local<Context>::New(isolate, context);
X     Context::Scope context_scope(local_context);
X 
X-    local_context->Global()->Set(v8::String::NewFromUtf8(isolate, name, v8::String::kNormalString), sv2v8(thing));
X+    (void) local_context->Global()->Set(local_context, v8::String::NewFromUtf8(isolate, name, v8::NewStringType::kNormal).ToLocalChecked(), sv2v8(thing));
X }
X 
X void
X@@ -453,7 +454,7 @@ V8Context::bind_ro(const char *name, SV *thing) {
X 
X     bool result = context.Get(isolate)->Global()->DefineOwnProperty(
X         isolate->GetCurrentContext(),
X-        v8::String::NewFromUtf8(isolate, name, v8::String::kNormalString),
X+        v8::String::NewFromUtf8(isolate, name, v8::NewStringType::kNormal).ToLocalChecked(),
X         sv2v8(thing),
X         v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete)
X     ).IsJust();
X@@ -467,7 +468,7 @@ void V8Context::name_global(const char *name) {
X 
X     bool result = context.Get(isolate)->Global()->DefineOwnProperty(
X         isolate->GetCurrentContext(),
X-        v8::String::NewFromUtf8(isolate, name, v8::String::kNormalString),
X+        v8::String::NewFromUtf8(isolate, name, v8::NewStringType::kNormal).ToLocalChecked(),
X         context.Get(isolate)->Global(),
X         v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete)
X     ).IsJust();
X@@ -476,13 +477,13 @@ void V8Context::name_global(const char *name) {
X // I fucking hate pthreads, this lacks error handling, but hopefully works.
X class thread_canceller {
X public:
X-    thread_canceller(int sec)
X+    thread_canceller(int sec, bool *p_timeouted_arg)
X         : sec_(sec)
X     {
X+        p_timeouted = p_timeouted_arg;
X         if (sec_) {
X             pthread_cond_init(&cond_, NULL);
X             pthread_mutex_init(&mutex_, NULL);
X-            pthread_mutex_lock(&mutex_); // passed locked to canceller
X             pthread_create(&id_, NULL, canceller, this);
X         }
X     }
X@@ -509,16 +510,19 @@ class thread_canceller { (private)
X         ts.tv_sec = tv.tv_sec + me->sec_;
X         ts.tv_nsec = tv.tv_usec * 1000;
X 
X+        pthread_mutex_lock(&me->mutex_); // passed locked to canceller
X         if (pthread_cond_timedwait(&me->cond_, &me->mutex_, &ts) == ETIMEDOUT) {
X             isolate->TerminateExecution();
X+            *me->p_timeouted = true;
X         }
X         pthread_mutex_unlock(&me->mutex_);
X         return NULL;
X     }
X 
X     pthread_t id_;
X-    pthread_cond_t cond_;
X-    pthread_mutex_t mutex_;
X+    bool *p_timeouted;
X+    pthread_cond_t cond_ = PTHREAD_COND_INITIALIZER;
X+    pthread_mutex_t mutex_ = PTHREAD_MUTEX_INITIALIZER;
X     int sec_;
X };
X 
X@@ -532,7 +536,7 @@ V8Context::eval(SV* source, SV* origin) {
X 
X     // V8 expects everything in UTF-8, ensure SVs are upgraded.
X     sv_utf8_upgrade(source);
X-    ScriptOrigin orig(origin ? sv2v8str(origin) : String::NewFromUtf8(isolate, "eval", v8::String::kNormalString));
X+    ScriptOrigin orig(isolate, origin ? sv2v8str(origin) : String::NewFromUtf8(isolate, "eval", v8::NewStringType::kNormal).ToLocalChecked());
X     MaybeLocal<Script> script = Script::Compile(
X         local_context,
X         sv2v8str(source),
X@@ -543,11 +547,18 @@ V8Context::eval(SV* source, SV* origin) {
X         set_perl_error(local_context, try_catch);
X         return &PL_sv_undef;
X     }
X-    thread_canceller canceller(time_limit_);
X+
X+    bool timeouted = false;
X+    thread_canceller canceller(time_limit_, &timeouted);
X     MaybeLocal<Value> val = script.ToLocalChecked()->Run(local_context);
X 
X     if (val.IsEmpty()) {
X-        set_perl_error(local_context, try_catch);
X+        if (timeouted) {
X+            sv_setpv(ERRSV, "timeouted terminated");
X+        }
X+        else {
X+            set_perl_error(local_context, try_catch);
X+        }
X         return &PL_sv_undef;
X     }
X     sv_setsv(ERRSV,&PL_sv_undef);
X@@ -564,7 +575,7 @@ V8Context::sv2v8(SV *sv, HandleMap& seen) {
X     if (SvPOK(sv)) {
X         // Upgrade string to UTF-8 if needed
X         char *utf8 = SvPVutf8_nolen(sv);
X-        return String::NewFromUtf8(isolate, utf8, v8::String::kNormalString);
X+        return String::NewFromUtf8(isolate, utf8, v8::NewStringType::kNormal).ToLocalChecked();
X     }
X     if (SvUOK(sv)) {
X         UV v = SvUV(sv);
X@@ -593,7 +604,7 @@ Handle<String> V8Context::sv2v8str(SV* sv)
X {
X     // Upgrade string to UTF-8 if needed
X     char *utf8 = SvPVutf8_nolen(sv);
X-    return String::NewFromUtf8(isolate, utf8, v8::String::kNormalString, SvCUR(sv));
X+    return String::NewFromUtf8(isolate, utf8, v8::NewStringType::kNormal, SvCUR(sv)).ToLocalChecked();
X }
X 
X SV* V8Context::seen_v8(Handle<Object> object) {
X@@ -641,8 +652,8 @@ V8Context::v82sv(Handle<Value> value, SvMap& seen) {
X     }
X 
X     if (value->IsArray() || value->IsObject() || value->IsFunction()) {
X-        Handle<Object> object = value->ToObject(isolate);
X-
X+        Handle<Object> object = value->ToObject(ctx).ToLocalChecked();
X+        
X         if (SV *cached = seen_v8(object))
X             return cached;
X 
X@@ -680,12 +691,12 @@ V8Context::fill_prototype(Handle<Object> prototype, HV
X     HE *he;
X     while ((he = hv_iternext(stash))) {
X         SV *key = HeSVKEY_force(he);
X-        Local<String> name = v8::String::NewFromUtf8(isolate, SvPV_nolen(key), v8::String::kNormalString);
X+        Local<String> name = v8::String::NewFromUtf8(isolate, SvPV_nolen(key), v8::NewStringType::kNormal).ToLocalChecked();
X 
X         if (prototype->Has(this->get_local_context(), name).FromMaybe(0))
X             continue;
X 
X-        prototype->Set(name, (new PerlMethodData(this, SvPV_nolen(key)))->object.Get(isolate));
X+        prototype->Set(this->get_local_context(), name, (new PerlMethodData(this, SvPV_nolen(key)))->object.Get(isolate));
X     }
X }
X 
X@@ -783,7 +794,7 @@ V8Context::av2array(AV *av, HandleMap& seen, long ptr)
X     seen[ptr] = array;
X     for (i = 0; i < len; i++) {
X         if (SV** sv = av_fetch(av, i, 0)) {
X-            array->Set(Integer::New(isolate, i), sv2v8(*sv, seen));
X+            array->Set(this->get_local_context(), Integer::New(isolate, i), sv2v8(*sv, seen));
X         }
X     }
X     return array;
X@@ -799,7 +810,7 @@ V8Context::hv2object(HV *hv, HandleMap& seen, long ptr
X     Handle<Object> object = Object::New(isolate);
X     seen[ptr] = object;
X     while (val = hv_iternextsv(hv, &key, &len)) {
X-        object->Set(v8::String::NewFromUtf8(isolate, key, v8::String::kNormalString), sv2v8(val, seen));
X+        object->Set(this->get_local_context(), v8::String::NewFromUtf8(isolate, key, v8::NewStringType::kNormal).ToLocalChecked(), sv2v8(val, seen));
X     }
X     return object;
X }
X@@ -817,7 +828,7 @@ V8Context::array2sv(Handle<Array> array, SvMap& seen) 
X     seen.add(array, PTR2IV(av));
X 
X     for (int i = 0; i < array->Length(); i++) {
X-        Handle<Value> elementVal = array->Get( Integer::New( isolate, i ) );
X+        Handle<Value> elementVal = array->Get(this->get_local_context(), Integer::New( isolate, i ) ).ToLocalChecked();
X         av_push(av, v82sv(elementVal, seen));
X     }
X     return rv;
X@@ -825,7 +836,7 @@ V8Context::array2sv(Handle<Array> array, SvMap& seen) 
X 
X SV *
X V8Context::object2sv(Handle<Object> obj, SvMap& seen) {
X-    if (enable_blessing && obj->Has(this->get_local_context(), v8::String::NewFromUtf8(isolate, "__perlPackage", v8::String::kNormalString)).FromMaybe(0)) {
X+    if (enable_blessing && obj->Has(this->get_local_context(), v8::String::NewFromUtf8(isolate, "__perlPackage", v8::NewStringType::kNormal).ToLocalChecked()).FromMaybe(0)) {
X         return object2blessed(obj);
X     }
X 
X@@ -837,10 +848,10 @@ V8Context::object2sv(Handle<Object> obj, SvMap& seen) 
X     Local<Array> properties = obj->GetPropertyNames(this->get_local_context()).ToLocalChecked();
X     for (int i = 0; i < properties->Length(); i++) {
X         Local<Integer> propertyIndex = Integer::New( isolate, i );
X-        Local<String> propertyName = Local<String>::Cast( properties->Get( propertyIndex ) );
X+        Local<String> propertyName = Local<String>::Cast( properties->Get(this->get_local_context(), propertyIndex ).ToLocalChecked() );
X         String::Utf8Value propertyNameUTF8( isolate, propertyName );
X 
X-        Local<Value> propertyValue = obj->Get( propertyName );
X+        Local<Value> propertyValue = obj->Get(this->get_local_context(), propertyName ).ToLocalChecked();
X         if (*propertyValue)
X             hv_store(hv, *propertyNameUTF8, 0 - propertyNameUTF8.length(), v82sv(propertyValue, seen), 0);
X     }
X@@ -899,7 +910,7 @@ my_gv_setsv(pTHX_ GV* const gv, SV* const sv){
X                     count = array->Length(); \
X                     EXTEND(SP, count - items); \
X                     for (int i = 0; i < count; i++) { \
X-                        ST(i) = sv_2mortal(self->v82sv(array->Get(Integer::New(isolate, i)))); \
X+                        ST(i) = sv_2mortal(self->v82sv(array->Get(ctx, Integer::New(isolate, i)).ToLocalChecked())); \
X                     } \
X                 } \
X                 else { \
X@@ -939,7 +950,7 @@ XS(v8method) {
X SV*
X V8Context::function2sv(Handle<Function> fn) {
X     CV          *code = newXS(NULL, v8closure, __FILE__);
X-    V8ObjectData *data = new V8FunctionData(this, fn->ToObject(isolate), (SV*)code);
X+    V8ObjectData *data = new V8FunctionData(this, fn, (SV*)code);
X     return newRV_noinc((SV*)code);
X }
X 
X@@ -947,7 +958,13 @@ SV*
X V8Context::object2blessed(Handle<Object> obj) {
X     char package[128];
X 
X-    String::Utf8Value stringified( isolate, obj->Get( String::NewFromUtf8(isolate, "__perlPackage") )->ToString(isolate));
X+    String::Utf8Value stringified(
X+        isolate,
X+	obj->Get(
X+            this->get_local_context(),
X+            String::NewFromUtf8(isolate, "__perlPackage").ToLocalChecked()
X+        ).ToLocalChecked()
X+    );
X 
X     snprintf(
X         package,
X@@ -961,14 +978,14 @@ V8Context::object2blessed(Handle<Object> obj) {
X     HV *stash = gv_stashpv(package, 0);
X 
X     if (!stash) {
X-        Local<Object> prototype = obj->GetPrototype()->ToObject(isolate);
X+        Local<Object> prototype = obj->GetPrototype()->ToObject(this->get_local_context()).ToLocalChecked();
X 
X         stash = gv_stashpv(package, GV_ADD);
X 
X         Local<Array> properties = prototype->GetPropertyNames(this->get_local_context()).ToLocalChecked();
X         for (int i = 0; i < properties->Length(); i++) {
X-            Local<String> name = properties->Get(i)->ToString(isolate);
X-            Local<Value> property = prototype->Get(name);
X+            Local<String> name = properties->Get(this->get_local_context(), i).ToLocalChecked()->ToString(this->get_local_context()).ToLocalChecked();
X+            Local<Value> property = prototype->Get(this->get_local_context(), name).ToLocalChecked();
X 
X             if (!property->IsFunction())
X                 continue;
45010345c41f6fdf65e66720125c9ae8
echo x - distinfo
sed 's/^X//' >distinfo << '57677d168a5ec21bdf22c9501f075a8f'
XTIMESTAMP = 1715084932
XSHA256 (JavaScript-V8-0.11.tar.gz) = a49a32931436b14143acda738ff21b9bd3d2d82429bc1c62ec8035a889fa4a43
XSIZE (JavaScript-V8-0.11.tar.gz) = 72003
57677d168a5ec21bdf22c9501f075a8f
echo x - pkg-descr
sed 's/^X//' >pkg-descr << '7f9555c3c1089940396b503dd37f3979'
XPerl interface to the V8 JavaScript engine
X
XWWW: https://metacpan.org/release/JavaScript-V8
7f9555c3c1089940396b503dd37f3979
echo x - pkg-plist
sed 's/^X//' >pkg-plist << '842cde48cf18b70a11b15515ca566742'
X%%SITE_ARCH%%/JavaScript/V8.pm
X%%SITE_ARCH%%/JavaScript/V8/Context.pm
X%%SITE_ARCH%%/auto/JavaScript/V8/V8.so
X%%PERL5_MAN3%%/JavaScript::V8.3.gz
X%%PERL5_MAN3%%/JavaScript::V8::Context.3.gz
842cde48cf18b70a11b15515ca566742
exit
# freebsd-version -k
12.2-RELEASE-p12
# freebsd-update upgrade -r 12.3-RELEASE

で躓いた。

手順通り kernelfirst 後に reboot するのだが、rc.conf からの ipfw でエラー。
問題の行は ipfw nat 1 config if em0 というシンプルなもの。
ipfw: setsockopt(IP_FW_NAT44_XCONFIG): Invalid argument というエラーが起こる。

どうやら /sbin/ipfw を新しくしなくてはならないようだ。(libaliasの変更に対応するため)

  1. freebsd-update upgrade -r 12.3-RELEASE
  2. freebsd-update install (kernel, kernelfirst)
  3. reboot
  4. freebsd-update install (userland, kerneldone)

となるのだが /sbin/ipfw は kerneldone ステップで置き換わるので、当然このエラーが起こる。

残念だ。

FreeBSD は 2.2.1頃 からリモートで上げ続けているけど、こんな配布側の問題に遭遇したのは稀。初めてかも。relnote にも特に記載は無かったし。
Linux のディストリは色々試すものの、どれもリモートでのメジャーアップグレードで辛い思いをして脱落。
ステップが面倒でも確かな FreeBSD に落ち着いているので、たのんます。

続けていた筋トレも熱が醒め、一段落しました。
プリズナートレーニングを買ったのが 2019年3月 ですから、約2年8ヶ月続けていたようです。

現在は、コンビクトコンディショニングという原題の通りか
筋肉の動きを確認しながら調子を確かめる程度に、低いステップ数のものを行ったり
ストレッチ、ヨガのマネ、短かく簡単なランを継続しています。
記録は付けていません。レップ数は数えていますが、前回の記録も全く意識していません。
辛くなる手前で終了することが殆で、追い込むことは全く辞めました。

食事も以前はプロテイン(ソイ・ホエイ)を摂取していましたが辞めました。
果実食性・ローフード・80/10/10・PBWF・プーファ など は頭の片隅に残してはいますが
カロリー・栄養素計算を全く考えずに、今食べたいもの・取り入れたいものを食べています。

以下、種目別。記念に。

胸・三頭

MAX: 片手5cm台片手胸足肩幅13cm台ワンアームプッシュアップ左20右22
現在: フラットやデクラインの両手プッシュアップを、丁寧に行っています。胸への負荷が終始一瞬でも抜けないように。少し上を向いて胸に掛かるように。手幅、手の前後、手の角度は今日掛けたい場所によって細かく調整。

MAX: 人差し指幅0cm頭付クローズハンドスタンドプッシュアップ4
現在: 逆立ち歩き・直進・右折左折、手幅狭め広めのハンドスタンドプッシュアップ(頭が着くかは意識せず)

背中・二頭

MAX: 片手懸垂1レップ
現在: 普通に懸垂、珠にアンイーブンを少なめで

脊柱

MAX: スタンドトゥスタンドブリッジ10、ゲッコーブリッジキープ左右30s
現在: 普通にブリッジ(隅々まで温められるように僅かに軋んだり)。珠にスタンドトゥスタンドブリッジ

腹直

MAX: ハンギングレッグレイズToesToBar25
現在: 日常的にはLシット20sぐらい。たまに、タオルハング中にハンギングレッグレイズToesToBar、ヒューマンフラッグ5sぐらい。ごく稀にハンギングレッグレイズToesToBar、立ちコロ。

太もも・ハム・尻

MAX: ピストルスクワット20
現在: 足トレはやっぱ、普通に使うのが良いのではないかと考えて軽めのランです。珠に、普通の両足ハーフスクワットを30程度

前腕

MAX: ツインタオルハング70s
現在: 前腕のみそこそこ頻繁に行っています。握力は老人でも最後まで残る、というのが印象に残っています。ツインタオルハングをやりながら、10s毎にToesToBarしたりしています。カウントしてません。

フラッグ

MAX: ヒューマンフラッグ10s
現在: ヒューマンフラッグ5s

ふくらはぎ

MAX: カーフレイズ八左72左70(壁は指)
現在: ごく稀に、カーフレイズ八60程度

MAX: フロントブリッジ・レスラーブリッジ ハンドレスヘッドスタンド
現在: 三点倒立。ごく稀に、フロントブリッジ・レスラーブリッジ

MAX: フィンガーチップワンアームプッシュアップ右8左7 指立・拳立・手の甲立てフルボディポップアップ
現在: 稀にフィンガーチッププッシュアップ

パワージャンプ

現在: 普通にジャンプしてます

その他

フィットネスも退会しました。(マスクして運動が人間のデザインとは思えません)

もし、初める前の 自分に 言えるんだったら。
プリズナートレーニングにはとにかく無理せずゆっくり進むこと書いてあると思いますが、本当に重要だと思います。
少しの不調・関節の違和感などを見逃さずに、十分すぎるぐらい休んで、二歩進んで三歩下がり続けてもよいので、世間の論調より、自分の体のサイン・フィードバックを最重要視してください。
食事については、新鮮なもの、高度に加工・調理・加熱されていない訳が分かっているもの、をメインに普通に食べましょう。
トレーニングが終わったら直ぐ食べなきゃなど、タイミングも気にする必要ないです。
栄養素・カロリー計算もする必要ないです。(栄養が無いと言われる? きゅうりなんかも食べたいセンサーを不活性にしていたらいけません)
粉末・サプリも摂らなくていいと思います。
無理して沢山食べる必要はありません。食べ疲れしない程度がよいでしょう。

マッスルアップの練習を初めました。

perl adv
perl adv