CollectorCell cell;
void* storage = &cell;
COMPILE_ASSERT(sizeof(JSArray) <= sizeof(CollectorCell), sizeof_JSArray_must_be_less_than_CollectorCell);
JSCell* jsArray = new (storage) JSArray(JSArray::createStructure(jsNull()));
JSGlobalData::jsArrayVPtr = jsArray->vptr();
jsArray->~JSCell();
。。。。
void* vptr() { return *reinterpret_cast(this); }
在看javascriptcore的时候读到了这样一段代码。
先抛开jsc的含义,本身其获取vptr的方式可以分析一下。
1. 这个代码先预先分配了一块内存 storage
2. 然后用operator new 将jsarray 指向这个storage
3. 拿到jsarray的vptr
4. 通过在vs2008的观察(因为c++对象模型这本书在说明具体对象的内存布局的时候,讲到这个布局实际上是和cpp 编译器相关的), vptr 实际上就是位于this指针的开始处。
阅读(526) | 评论(0) | 转发(0) |