GlobalHandles是实现v8中持久句柄功能的类。GlobalHandles主要是维护一个链表,每个节点维护堆对象的状态。我们先看看节点的定义。...= NULL) { func(v8::Persistent(ToApi(handle())), par); } } Object...An object group is treated like // a single JS object: if one of object in the group is alive, // all...p = (*p)->next_addr(); } } // 重置free队列的头指针,因为链表的节点都被释放了 set_first_free(NULL); } 总结,主要介绍了v8
Object是所有js对象在c++层的基类。...1 c++对象的类型 1 v8的对象是4字节对齐的,用地址的低两位出来标记对象的类型。 2 堆对象(HeapObject)是Object的子类。..., JS_GLOBAL_OBJECT_TYPE, JS_BUILTINS_OBJECT_TYPE, JS_VALUE_TYPE, JS_ARRAY_TYPE, JS_FUNCTION_TYPE..., FIRST_JS_OBJECT_TYPE = JS_OBJECT_TYPE, LAST_JS_OBJECT_TYPE = JS_ARRAY_TYPE } 示例图如下 ?...smi是小整形,在v8中表示整形。长度是31位。 double Object::Number() { return IsSmi() ?
length); Counters::memory_allocated.Decrement(length); size_ -= length; ASSERT(size_ >= 0); } // v8
NewSpace是v8内存管理中,负责管理新生代区的类。分为from和to两个区,每个区由SemiSpace对象管理。
void** v8::HandleScope::CreateHandle(void* value) { // 获取下一个可用的地址 void** result = current...void v8::HandleScope::DeleteExtensions() { ASSERT(current_.extensions !...在这里插入图片描述 这就是v8中的HandleScope的大致原理。
Handle是使用v8的时候很重要的一个概念和类。他本质是堆对象的封装。我们通过Handle管理真正的对象,而不是直接操作对象。Handle在v8中有两个实现。一个是对外使用的一个是内部使用的。...::String> Utils::ToLocal(v8::internal::Handle obj) { return Local(...Persistent v8::Context::New(v8::ExtensionConfiguration* extensions,...v8::Handle global_template, v8::Handle global_object...总结,这就是v8中关于handle的一些知识。
SemiSpace的管理新生代内存的类,即我们常听到的from区和to区。from区和to区都由一个SemiSpace对象管理。SemiSpace只管理地址,不...
GetHeapObjectField(HeapObject* obj, int index); static inline HeapObject* cast(Object* obj); // 内存布局信息,v8...if (instance_type == JS_OBJECT_TYPE) return map->instance_size(); if (instance_type == FIXED_ARRAY_TYPE
v8里有smi保存整形,但是他只有31位,超过31位的就需要用HeapNumber。
watch.js 源码解读 用麻雀虽小五脏俱全来描述Watch.js比较合适。“观察者”模式是我们在开发的时候经常需要用到的。...使用Watch.js那么我们就可以实现在“每当对象属性改变的时候,执行你的函数”。...虽然有很多其他的库可以实现相同的功能,但是Watch.js却可以不改变你平时书写代码的方式,并且实现属性改变的监听功能。...”修改的时候“观察者”函数会被调用 ex1.attr1 = "other value";` [try demo](http://jsfiddle.net/NbJuh/17/) Watch.js...总结 抛开watch.js的bug不谈,它还是有很多可圈可点的地方。
Otherwise it behaves like // a normal JS object.
PlatformData 是管理线程中,不同系统中的数据。这里只看linux系统。只保存了线程id。
了解 V8 Promise 源码全过程,世界上不再有能困住你的 Promise 题目,我就是这么肯定这篇文章的干货 仅仅了解或者实现了 Promise/A+ 规范,这与 JavaScript 的 Promise...接下来我就结合 ECMAScript 规范来对 V8 中 Promise 源码进行全面的解读。...JavaScript 层的 then 函数实际上是 V8 中的 PromisePrototypeThen 函数,源码如下[7]: PromisePrototypeThen(js-implicit context...resolve 函数归根到底调用了 V8 的 FulfillPromise 函数,源码如下[14]: // https://tc39.es/ecma262/#sec-fulfillpromise transitioning...RejectPromise ECMAScript 规范[18] reject(season) 函数调用了 V8 的 RejectPromise(promise, season) 函数,源码如下[19]
zone.h #ifndef V8_ZONE_H_ #define V8_ZONE_H_ namespace v8 { namespace internal { // The Zone supports...ZoneList(int capacity) : List(capacity) { } }; } } // namespace v8.../ V8_ZONE_H_ zone-inl.h #ifndef V8_ZONE_INL_H_ #define V8_ZONE_INL_H_ #include "zone.h" namespace v8...::internal #endif // V8_ZONE_INL_H_ zone.cc #include "v8.h" #include "zone-inl.h" namespace v8 {...size; limit_ = segment->end(); ASSERT(position_ <= limit_); return result; } } } // namespace v8
#ifndef V8_TOKEN_H_ #define V8_TOKEN_H_ namespace v8 { namespace internal { // TOKEN_LIST takes a...IsCountOp(Value op) { return op == INC || op == DEC; } // Returns a string corresponding to the JS...static const char* string_[NUM_TOKENS]; static int8_t precedence_[NUM_TOKENS]; }; } } // namespace v8...::internal #endif // V8_TOKEN_H_ token.cc #include "v8.h" #include "token.h" namespace v8 { namespace...(Lookup(string) == name); TOKEN_LIST(T, K, IGNORE_TOKEN) #undef K #undef T } } } // namespace v8
#ifndef V8_ALLOCATION_H_ #define V8_ALLOCATION_H_ namespace v8 { namespace internal { // A class that...other); void Unlink(); DISALLOW_IMPLICIT_CONSTRUCTORS(PreallocatedStorage); }; } } // namespace v8...internal #endif // V8_ALLOCATION_H_ allocation.cc #include #include "v8.h" namespace v8...NativeAllocationChecker::allocation_allowed()); void* result = malloc(size); if (result == NULL) V8...PreallocatedStorage(size_t size) : size_(size) { previous_ = next_ = this; } } } // namespace v8
#ifndef V8_LIST_H_ #define V8_LIST_H_ namespace v8 { namespace internal { // ---------------------...DeleteData(T* data)) { P::Delete(data); } DISALLOW_EVIL_CONSTRUCTORS(List); }; } } // namespace v8.../ V8_LIST_H_ list-inl #ifndef V8_LIST_INL_H_ #define V8_LIST_INL_H_ #include "list.h" namespace v8...capacity) : NULL; // 容量 capacity_ = capacity; // 已分配元素个数 length_ = 0; } } } // namespace v8
SemiSpace他自己不申请内存。他是负责管理某块内存的,内存申请在其他地方处理。
我们发现数组的对象内存布局中,只有一个属性。就是保存length大小的。首先看看读写length属性的实现。
flag()->value())); } /* // Ecma-262 3rd 8.6.1 enum PropertyAttributes { NONE = v8...::None, READ_ONLY = v8::ReadOnly, DONT_ENUM = v8::DontEnum, DONT_DELETE...= v8::DontDelete, INTERCEPTED = 1 << 3, ABSENT = 16 // Used in runtime to indicate...AccessorInfo就是我们在js里的属性描述符。
领取专属 10元无门槛券
手把手带您无忧上云