void
Perl_Slab_Free(pTHX_ void *op)
{
//释放某个slab片区
I32 * const * const ptr = (I32 **) op;
I32 * const slab = ptr[-1];
PERL_ARGS_ASSERT_SLAB_FREE;
assert( ptr-1 > (I32 **) slab );
assert( ptr < ( (I32 **) slab + PERL_SLAB_SIZE) );
assert( *slab > 0 );
Slab_to_rw(op);
if (--(*slab) == 0) {
# ifdef NETWARE
# define PerlMemShared PerlMem
# endif
#ifdef PERL_DEBUG_READONLY_OPS
U32 count = PL_slab_count;
/* Need to remove this slab from our list of slabs */
if (count) {
while (count--) {//在片区数组中找到需要的free的片区
if (PL_slabs[count] == slab) {//找到该片区slab
dVAR;
/* Found it. Move the entry at the end to overwrite it. */
DEBUG_m(PerlIO_printf(Perl_debug_log,
"Deallocate %p by moving %p from %lu to %lu\n",
PL_OpSlab,
PL_slabs[PL_slab_count - 1],
PL_slab_count, count));
PL_slabs[count] = PL_slabs[--PL_slab_count];//将PL_slabs[PL_slab_count-1]即PL_slabs底部的片区移动至被释放片区中(这里的移动是指针)
/* Could realloc smaller at this point, but probably not
worth it. */
if(munmap(slab, PERL_SLAB_SIZE*sizeof(I32*))) {//释放片区
perror("munmap failed");
abort();
}
break;
}
}
}
#else
PerlMemShared_free(slab);{//释放片区
#endif
if (slab == PL_OpSlab) {//该片区已经用完
PL_OpSpace = 0;
}
}
}
#endif
/*
* In the following definition, the ", (OP*)0" is just to make the compiler
* think the expression is of the right type: croak actually does a Siglongjmp.
*/
#define CHECKOP(type,o) \
((PL_op_mask && PL_op_mask[type]) \
? ( op_free((OP*)o), \
Perl_croak(aTHX_ "'%s' trapped by operation mask", PL_op_desc[type]), \
(OP*)0 ) \
: CALL_FPTR(PL_check[type])(aTHX_ (OP*)o))
#define RETURN_UNLIMITED_NUMBER (PERL_INT_MAX / 2)
STATIC const char*
S_gv_ename(pTHX_ GV *gv)
{
SV* const tmpsv = sv_newmortal();
PERL_ARGS_ASSERT_GV_ENAME;
gv_efullname3(tmpsv, gv, NULL);
return SvPV_nolen_const(tmpsv);
}
STATIC OP *
S_no_fh_allowed(pTHX_ OP *o)
{
PERL_ARGS_ASSERT_NO_FH_ALLOWED;
yyerror(Perl_form(aTHX_ "Missing comma after first argument to %s function",
OP_DESC(o)));
return o;
}
STATIC OP *
S_too_few_arguments(pTHX_ OP *o, const char *name)
{
PERL_ARGS_ASSERT_TOO_FEW_ARGUMENTS;
yyerror(Perl_form(aTHX_ "Not enough arguments for %s", name));
return o;
}
STATIC OP *
S_too_many_arguments(pTHX_ OP *o, const char *name)
{
PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS;
yyerror(Perl_form(aTHX_ "Too many arguments for %s", name));
return o;
}
STATIC void
S_bad_type(pTHX_ I32 n, const char *t, const char *name, const OP *kid)
{
PERL_ARGS_ASSERT_BAD_TYPE;
yyerror(Perl_form(aTHX_ "Type of arg %d to %s must be %s (not %s)",
(int)n, name, t, OP_DESC(kid)));
}
STATIC void
S_no_bareword_allowed(pTHX_ const OP *o)
{
PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED;
if (PL_madskills)
return; /* various ok barewords are hidden in extra OP_NULL */
qerror(Perl_mess(aTHX_
"Bareword \"%"SVf"\" not allowed while \"strict subs\" in use",
SVfARG(cSVOPo_sv)));
}
/* "register" allocation */
分享到:
相关推荐
我自己制作的PDF目录,很详细的。 作为C++的准标准库,在C++的开发中的地位已经变得很重要了,自从发现了这本书后,我就开始迫不及待看起来。但是,从网上下载的许多pdf都是没有目录的,要么就是加密了的,所以我...
《C++探秘--68讲贯通C++》是一本深度解析C++编程语言的教程,旨在帮助初学者和有经验的程序员全面理解和掌握C++的核心概念与技术。该书以PDF格式提供,适合希望通过系统学习提升C++技能的读者。 C++是一种强大的、...
101Linux内核探秘:深入解析文件系统和设备驱动的架构与设计
《深入解析luke-src-0.8.1源码:JAVA实现与倒排索引探秘》 luke-src-0.8.1是一个专用于查看Lucene倒排索引的开源工具,它以JAVA代码的形式呈现,为开发者提供了一个直观、方便的方式来检查和理解Lucene索引的工作...
"微信小程序-婚礼邀请函源码"是一个专为婚礼设计的小程序应用实例,适合那些希望学习或快速构建个性化婚礼邀请函的小程序开发初学者。这个源码包包含了一整套完成的代码,可以帮助开发者了解小程序的开发流程和实现...
探秘 CPython 对象模型 Python 中一切皆对象,这里的对象究竟是什么?在 Python 的世界里,一切都是对象。整数是一个对象、字符串是一个对象、字典是一个对象,甚至 int、str、list 等等,再加上我们使用 class ...
LabVIEW DSP探秘 NI-SPEEDY33探秘(新版LabVIEW技术白皮书)pdf,该白皮书向您介绍适用于NI SPEEDY 33,TI C6711 DSK和TI C6733 DSK 的NI LabVIEW DSP模块,通过一个易于使用的交互式图形环境,帮助您设计、构建原型和...
《LINUX内核探秘:深入解析文件系统和设备驱动》一书,是关于Linux操作系统内核中核心组件——文件系统和设备驱动的深度解析。Linux文件系统是操作系统与硬件之间的重要桥梁,它负责管理存储设备上的数据,而设备...
### 广工探秘自动化课程选择题题目及答案解析 #### 一、基础知识与历史背景 1. **《控制论》的作者** - 正确答案:B、维纳 - 解析:诺伯特·维纳(Norbert Wiener)是控制论的创始人之一,《控制论》一书是他最...
Zabbix对Trap监控功能探秘-王军-共27页.zip 包含PPT和PDF两种格式的文件,每个文件都是27页。 ========================================= Zabbix对Trap监控功能探秘-王军-共27页.zip 包含PPT和PDF两种格式的文件,...
Win32 结构化异常处理(SEH)探秘的网页截图
Win32结构化异常处理(SEH)是Windows操作系统中的一种异常处理机制,它在C++编程环境中尤为重要,因为C++标准库中的某些操作可能会触发硬件异常,如除以零或访问无效内存。SEH为程序员提供了一种捕获和处理这些异常...
1. **类加载检查**:在创建对象之前,JVM会检查该类是否已经被加载、解析和初始化。如果还没有,会执行相应的类加载过程。 2. **内存分配**:对象所需内存的大小在类加载完成后即可确定。内存分配有两种主要方式: ...
Vue.js作为一款流行的JavaScript框架,用于构建用户界面,RxJS(Reactive Extensions for JavaScript)则是一种利用可观察序列来编写异步和基于事件的程序的库。两者结合使用,可以在处理复杂业务逻辑的同时,保持视...
《Boost程序库探秘——深度解析C++准标准库》是一部深入探讨Boost库的权威著作,旨在揭示C++编程中的高级技巧和最佳实践。Boost库是C++社区中备受推崇的一套开源库,它为C++标准库提供了大量的扩展和补充,涵盖了...
《Boost程序库探秘:深度解析C++准标准库(第2版)》基于Boost 1.54版,深入探讨了其中的许多重要组件,包括迭代器、函数对象、容器、流处理、序列化以及C++语言中最复杂最具威力的模板元编程,并专辟一章详细阐述...
【高清实时监控的新选择:HD-SDI摄像机】 随着现代安全监控系统向数字化和高清化转型,高清网络产品在提供高清晰度画面的同时,也暴露出一些问题,如视频延迟、编解码过程中的画质损失以及对网络带宽的巨大需求。...
此书讲解linux操作系统的基础设施之一,文件系统,详细讲述了文件系统的挂载,设备驱动等,
下面我们将详细探讨"vue源码解析.zip"中的关键知识点。 首先,我们来看"Vue源码探秘之指令和生命周期"。Vue.js的指令是用于在DOM上执行特定操作的特殊属性,如`v-if`、`v-for`等。这些指令的处理逻辑在源码中表现为...