Hi everyone, For some research reason, I need to log all property access to Blink in v8. Since all the property load information is passed to Blink through class `FunctionCallbackInfo`, I tried to add a pointer field in this class to hold the property name (represented as std::string) like follow:
V8_INLINE FunctionCallbackInfo(internal::Address* implicit_args, internal::Address* values, int length); internal::Address* implicit_args_; internal::Address* values_; int length_; std::string* property_info_; // The field I add. } The `property_info_` field is initialized in the constructor function through c++ `new`. I also added a const setter function for the `property_info_` field. The setter function like follow: void FunctionCallbackInfo<T>::SetPropertyInfo(::std::string s) const { *property_info_ = s; } In Blink, I modified the template file to set this field every time an attribute in Blink is visited. In code snips I write by myself, it works well. However, when I try to run the code on some real-world websites, I found that the value of the field property_info_ is set to a strange value 0x38, so the pointer to the string is overlapped by some other value. I tried to mark the property_info_ field as private and even moved it to class `ReturnValue<T>`, the overlapping case still happens: template<typename T> class ReturnValue { public: template <class S> V8_INLINE ReturnValue(const ReturnValue<S>& that) : value_(that.value_) { TYPE_CHECK(T, S); } // Local setters template <typename S> V8_INLINE void Set(const Global<S>& handle); template <typename S> V8_INLINE void Set(const TracedGlobal<S>& handle); template <typename S> V8_INLINE void Set(const Local<S> handle); // Fast primitive setters V8_INLINE void Set(bool value); V8_INLINE void Set(double i); V8_INLINE void Set(int32_t i); V8_INLINE void Set(uint32_t i); // Fast JS primitive setters V8_INLINE void SetNull(); V8_INLINE void SetUndefined(); V8_INLINE void SetEmptyString(); // Convenience getter for Isolate V8_INLINE Isolate* GetIsolate() const; // Pointer setter: Uncompilable to prevent inadvertent misuse. template <typename S> V8_INLINE void Set(S* whatever); // Getter. Creates a new Local<> so it comes with a certain performance // hit. If the ReturnValue was not yet set, this will return the undefined // value. V8_INLINE Local<Value> Get() const; // use for taint map by n0b0dy V8_INLINE internal::Address GetValueAddr() const; V8_INLINE void SetProperty(std::string) const; // The setter function I add private: template<class F> friend class ReturnValue; template<class F> friend class FunctionCallbackInfo; template<class F> friend class PropertyCallbackInfo; template <class F, class G, class H> friend class PersistentValueMapBase; V8_INLINE void SetInternal(internal::Address value) { *value_ = value; } V8_INLINE internal::Address GetDefaultValue(); V8_INLINE explicit ReturnValue(internal::Address* slot); internal::Address* value_; internal::Address* property_info_; // the field I add }; I read the in https://source.chromium.org/chromium/chromium/src/+/master:v8/src/builtins/x64/builtins-x64.cc;drc=34ad93361f96ad875bf350ced27e15b7aa126113;bpv=1;bpt=1;l=3317 and found that v8 will arrange the stack frame with its own call convention, But I didn't find why the pointer value is still overlapped in class ReturnValue. Does anyone have ideas about what should I do? Thanks a lot! -- -- v8-dev mailing list v8-dev@googlegroups.com http://groups.google.com/group/v8-dev --- You received this message because you are subscribed to the Google Groups "v8-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-dev/96c9afe2-5c55-40fc-86b6-9f34de988809%40googlegroups.com.