map是JSObject的一个重要属性,存放一个对象的所有的属性的入口。要想了解map,就需要打开jsobj.h文件,看里面的定义。
struct JSObject {
JSObjectMap *map;
jsval *slots;
};
很自然的,我们还要找到JSObjectMap的定义,它也在jsobj.h文件中
struct JSObjectMap {
jsrefcount nrefs; /* count of all referencing objects */
JSObjectOps *ops; /* high level object operation vtable */
uint32 nslots; /* length of obj->slots vector */
uint32 freeslot; /* index of next free obj->slots element */
};
在这个定义中,最重要的信息隐含在注释中,第一个是对ops的注释,我们会看到ops其实是一个virtual table。这表示,对象的所有的属性名,都存放在这个vtable中;第2个信息是对nslots的注释,它提及obj->slots其实是一个vector。
这如同在告诉我们,我们在定义一个对象的属性时,属性的名称和类型等信息,会通过ops增加到属性表中,属性的值会对应放到slots这个vector中。例如:
var obj = new Object();
obj.a = 5;
那么“a”这个属性的类型是整型的,slots中增加了个新的值5。仔细看去,ops是JSObjectOps这个结构体中,我们可以在jsapi.h中找到这个结构体的定义:
struct JSObjectOps {
/* Mandatory non-null function pointer members. */
JSNewObjectMapOp newObjectMap;
JSObjectMapOp destroyObjectMap;
JSLookupPropOp lookupProperty;
JSDefinePropOp defineProperty;
JSPropertyIdOp getProperty;
JSPropertyIdOp setProperty;
JSAttributesOp getAttributes;
JSAttributesOp setAttributes;
JSPropertyIdOp deleteProperty;
JSConvertOp defaultValue;
JSNewEnumerateOp enumerate;
JSCheckAccessIdOp checkAccess;
/* Optionally non-null members start here. */
JSObjectOp thisObject;
JSPropertyRefOp dropProperty;
JSNative call;
JSNative construct;
JSXDRObjectOp xdrObject;
JSHasInstanceOp hasInstance;
JSSetObjectSlotOp setProto;
JSSetObjectSlotOp setParent;
JSMarkOp mark;
JSFinalizeOp clear;
JSGetRequiredSlotOp getRequiredSlot;
JSSetRequiredSlotOp setRequiredSlot;
};
我们可以简单的浏览一下其中的函数指针名称,创建object的map,定义属性,删除属性,给属性设置值或者获取属性值。。。。闭上眼睛想一想,这其中的函数指针是如此之多,所以一个对象的属性的类型判断(比如是整型还是String还是其他的)或者是属性名或者属性值的存放,都是通过预先定义好的指针函数来完成。
我们甚至可以用一个新的示意图来表示这一切:
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 213.75pt; HEIGHT: 131.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>
我们可以这样去想,有一个table,里面存放对象的属性列表。根据ruby hacking guide的说法,我们可以想像,有一张大的表,存放所有的对象的属性,也可能每个对象有自己的属性表。但,这属于具体实现的范畴,我们只要明白每个对象有属于自己的属性表,对表格中的行或者列进行操作时,是由JSObjectOps这个结构体中的指针函数来完成的就可以了。
/*
* Share proto's map only if it has the same JSObjectOps, and only if
* proto's class has the same private and reserved slots as obj's map
* and class have. We assume that if prototype and object are of the
* same class, they always have the same number of computed reserved
* slots (returned via clasp->reserveSlots); otherwise, prototype and
* object classes must have the same (null or not) reserveSlots hook.
*/
if (proto &&
(map = proto->map)->ops == ops &&
((protoclasp = OBJ_GET_CLASS(cx, proto)) == clasp ||
(!((protoclasp->flags ^ clasp->flags) &
(JSCLASS_HAS_PRIVATE |
(JSCLASS_RESERVED_SLOTS_MASK << JSCLASS_RESERVED_SLOTS_SHIFT))) &&
protoclasp->reserveSlots == clasp->reserveSlots)))
{
/*
* Default parent to the parent of the prototype, which was set from
* the parent of the prototype's constructor.
*/
if (!parent)
parent = OBJ_GET_PARENT(cx, proto);
/* Share the given prototype's map. */
obj->map = js_HoldObjectMap(cx, map);
/* Ensure that obj starts with the minimum slots for clasp. */
nslots = JS_INITIAL_NSLOTS;
} else {
/* Leave parent alone. Allocate a new map for obj. */
map = ops->newObjectMap(cx, 1, ops, clasp, obj);
if (!map)
goto bad;
obj->map = map;
/* Let ops->newObjectMap set nslots so as to reserve slots. */
nslots = map->nslots;
}
Ok,我们在上回书说到有若干的判断条件,就是为了创建一个map,并设置为obj->map的属性――不管是用parent的原型来创建,还是单独创建新的map(if 。。。else 部分),最终都是为了这个目的。
/* Allocate a slots vector, with a -1'st element telling its length. */
newslots = AllocSlots(cx, NULL, nslots);
if (!newslots) {
js_DropObjectMap(cx, obj->map, obj);
obj->map = NULL;
goto bad;
}
/* Set the proto, parent, and class properties. */
newslots[JSSLOT_PROTO] = OBJECT_TO_JSVAL(proto);
newslots[JSSLOT_PARENT] = OBJECT_TO_JSVAL(parent);
newslots[JSSLOT_CLASS] = PRIVATE_TO_JSVAL(clasp);
/* Clear above JSSLOT_CLASS so the GC doesn't load uninitialized memory. */
for (i = JSSLOT_CLASS + 1; i < nslots; i++)
newslots[i] = JSVAL_VOID;
/* Store newslots after initializing all of 'em, just in case. */
obj->slots = newslots;
再看newObject中剩余的代码,真是容易多了,既然创建了map来存放属性名了,那么我们就要对应属性名来存放存放初始的属性值了。我们可以看到,每个创建的GC对象,都会被预先设置3个内置的属性,proto,parent和class。然后,对剩余的slot,会设置undefined(JSVal_VOID会被解释成Undefined)。
到现在,我们的Global内置对象就已经初步创建完成了。
分享到:
相关推荐
Hacking_ A 101 Hacking Guide,hack参考书,值的一看。
本书的第一目标是让读者了解Ruby解释器的内部机制,这包括解释器的各个组成部分,以及它们是如何协作完成代码的解析、编译和执行的。 在语言处理系统方面,本书介绍了实现一门编程语言所需掌握的各种知识,例如哈希...
Ruby Hacking Guide是一本探讨C Ruby实现的书,这次发布的部分包括对全书的介绍和本书的第一部分。第一部分的内容包括对Ruby语言一个概要介绍和对Ruby对象模型的讲解。从我个人阅读的感觉来看,第一章对于Ruby语言的...
《Ruby Hacking Guide》是一本深受Ruby爱好者喜爱的中文教程,它主要面向已经对Ruby有基本了解的读者,旨在深入挖掘Ruby语言的内部机制,帮助读者成为Ruby编程的高手。这本书详细介绍了Ruby语言的核心概念、语法特性...
本文档旨在根据提供的《Unreliable Guide To Hacking The Linux Kernel》的部分内容,深入分析与Linux内核相关的技术知识点,包括但不限于基本规则、系统调用替代方案、常见的死锁情况、通用函数及其用法等。...
《Ruby Hacking Guide》是一本深入探讨Ruby编程语言的书籍,尤其关注其在黑客技术方面的应用,这使得它成为Web安全领域中一个独特的资源。"Hacking Ruby Web"的标签揭示了本书的重点在于如何利用Ruby的知识来探索和...
### Unreliable Guide to Hacking the Linux Kernel:关键知识点概览 #### 1. 引言 本文档《Unreliable Guide To Hacking The Linux Kernel》由Rusty Russell撰写,旨在为有经验的C程序员提供一份Linux内核开发的...
5. 在最新iOS上使用Xcode编译源代码:指导如何下载源代码,启动工作区和应用配置,以供渗透测试使用。 6. iOS安全模型基础:介绍iOS安全功能。 7. 探索iOS文件系统:讲解如何使用各种工具如iExplorer、iFunBox等...
Guide to Hacking
Hacking For Beginners The Ultimate Guide To Becoming A Hacker
《远程车辆黑客攻击》是2015年黑帽大会上的一个主题演讲,由Charlie Miller和Chris Valasek两位安全...这篇演讲是当时汽车网络安全领域的热点话题,并且直接推动了汽车行业在车辆网络安全方面投入更多的关注和资源。
《Hacking Exposed 第五版:网络安全秘密与解决方案》是信息安全领域的一本经典著作,由Stuart McClure、Joel Scambray和George Kurtz三位资深信息安全专家共同撰写。本书于2005年由McGraw-Hill/Osborne出版社出版,...
Learn the basics of ethical hacking and gain insights into the logic, algorithms, and syntax of Python. This book will set you up with a foundation that will help you understand the advanced concepts ...
标题中提到的“Hacking With Python”表明本文档是一本面向初学者的黑客实践指南,特别强调使用Python语言进行黑客技术的学习。从这个标题可以引申出以下几个关键知识点: 1. 黑客基础技能:指南将为初学者介绍一些...