Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Unified Diff: src/ast/variables.h

Issue 2223523002: [Interpreter] Avoid dereferencing handles on BytecodeGenerator for AST operations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@offheap_const_array
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/ast/variables.h
diff --git a/src/ast/variables.h b/src/ast/variables.h
index 7d54bc09c4d8d77d52f2b53ba8b398d6bd50c499..620ffc287aec55421b8b39e6ff10596722b5190b 100644
--- a/src/ast/variables.h
+++ b/src/ast/variables.h
@@ -55,10 +55,6 @@ class Variable: public ZoneObject {
int initializer_position() { return initializer_position_; }
void set_initializer_position(int pos) { initializer_position_ = pos; }
- bool IsVariable(Handle<String> n) const {
- return !is_this() && name().is_identical_to(n);
- }
-
bool IsUnallocated() const {
return location_ == VariableLocation::UNALLOCATED;
}
@@ -90,13 +86,20 @@ class Variable: public ZoneObject {
// any variable named "this" does indeed refer to a Variable::THIS binding;
// the grammar ensures this to be the case. So wherever a "this" binding
// might be provided by the global, use HasThisName instead of is_this().
- bool HasThisName(Isolate* isolate) const {
- return is_this() || *name() == *isolate->factory()->this_string();
+ bool HasThisName(Isolate* isolate,
+ HandleDereferenceMode deref_mode =
+ HandleDereferenceMode::kHandleDereferenceAllowed) const {
+ return is_this() ||
+ name_is_identical_to(isolate->factory()->this_string(), deref_mode);
marja 2016/08/08 08:20:13 If handle dereferencing is not allowed (i.e., we a
rmcilroy 2016/08/08 13:05:56 I believe it is OK to access constant heap roots o
}
// True if the variable is named eval and not known to be shadowed.
- bool is_possibly_eval(Isolate* isolate) const {
- return IsVariable(isolate->factory()->eval_string());
+ bool is_possibly_eval(
+ Isolate* isolate,
+ HandleDereferenceMode deref_mode =
+ HandleDereferenceMode::kHandleDereferenceAllowed) const {
+ return !is_this() &&
+ name_is_identical_to(isolate->factory()->eval_string(), deref_mode);
}
Variable* local_if_not_shadowed() const {
@@ -122,6 +125,18 @@ class Variable: public ZoneObject {
static int CompareIndex(Variable* const* v, Variable* const* w);
private:
+ bool name_is_identical_to(Handle<Object> object,
+ HandleDereferenceMode deref_mode) const {
+ if (deref_mode == HandleDereferenceMode::kHandleDereferenceAllowed) {
+ return *name() == *object;
+ } else {
+ // If handle dereference isn't allowed use the handle address for
+ // identity. This depends on the variable name being internalized in a
+ // CanonicalHandleScope.
+ return name().address() == object.address();
+ }
+ }
+
Scope* scope_;
const AstRawString* name_;
VariableMode mode_;

Powered by Google App Engine
This is Rietveld 408576698