Thank you very much for your advice, really appreciate it. 在 2020年3月31日星期二 UTC+8下午5:36:59,Jakob Kummerow写道: > > This is expected. FunctionCallbackInfo instances are rarely constructed > via C++ `new`; instead they are usually created manually on the stack. So > adding a field to the class definition is going to be a lot of work, and > that field's type can't be a std::string -- it would have to be something > where you have precise control over the object layout. > > I would suggest that you explore alternative approaches. > > > On Fri, Mar 27, 2020 at 6:21 AM L TY <n0b0...@gmail.com <javascript:>> > wrote: > >> 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-...@googlegroups.com <javascript:> >> 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-...@googlegroups.com <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/v8-dev/96c9afe2-5c55-40fc-86b6-9f34de988809%40googlegroups.com >> >> <https://groups.google.com/d/msgid/v8-dev/96c9afe2-5c55-40fc-86b6-9f34de988809%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> >
-- -- 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/3bde27cd-2190-47a3-89bd-57e94b3b339a%40googlegroups.com.