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.

Reply via email to