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

Unified Diff: src/fast-accessor-assembler.cc

Issue 2186593002: Add faster, but unsafe version of LoadInternalField. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Revert 'deferred' label 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
« no previous file with comments | « src/fast-accessor-assembler.h ('k') | test/cctest/test-api-fast-accessor-builder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/fast-accessor-assembler.cc
diff --git a/src/fast-accessor-assembler.cc b/src/fast-accessor-assembler.cc
index a261eb01a63a5edfbd3a311b963cac30b1bc464d..6d46ae09384ed00cade6cce77ab935dc5fb3e7ff 100644
--- a/src/fast-accessor-assembler.cc
+++ b/src/fast-accessor-assembler.cc
@@ -43,47 +43,23 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField(
ValueId value, int field_no) {
CHECK_EQ(kBuilding, state_);
- // Determine the 'value' object's instance type.
- Node* object_map = assembler_->LoadObjectField(
- FromId(value), Internals::kHeapObjectMapOffset, MachineType::Pointer());
- Node* instance_type = assembler_->WordAnd(
- assembler_->LoadObjectField(object_map,
- Internals::kMapInstanceTypeAndBitFieldOffset,
- MachineType::Uint16()),
- assembler_->IntPtrConstant(0xff));
-
- // Check whether we have a proper JSObject.
CodeStubAssembler::Variable result(assembler_.get(),
MachineRepresentation::kTagged);
- CodeStubAssembler::Label is_jsobject(assembler_.get());
- CodeStubAssembler::Label maybe_api_object(assembler_.get());
- CodeStubAssembler::Label is_not_jsobject(assembler_.get());
+ LabelId is_not_jsobject = MakeLabel();
CodeStubAssembler::Label merge(assembler_.get(), &result);
- assembler_->Branch(
- assembler_->WordEqual(
- instance_type, assembler_->IntPtrConstant(Internals::kJSObjectType)),
- &is_jsobject, &maybe_api_object);
- // JSObject? Then load the internal field field_no.
- assembler_->Bind(&is_jsobject);
+ CheckIsJSObjectOrJump(value, is_not_jsobject);
+
Node* internal_field = assembler_->LoadObjectField(
FromId(value), JSObject::kHeaderSize + kPointerSize * field_no,
MachineType::Pointer());
+
result.Bind(internal_field);
assembler_->Goto(&merge);
- assembler_->Bind(&maybe_api_object);
- assembler_->Branch(
- assembler_->WordEqual(instance_type, assembler_->IntPtrConstant(
- Internals::kJSApiObjectType)),
- &is_jsobject, &is_not_jsobject);
-
- // No JSObject? Return undefined.
- // TODO(vogelheim): Check whether this is the appropriate action, or whether
- // the method should take a label instead.
- assembler_->Bind(&is_not_jsobject);
- Node* fail_value = assembler_->UndefinedConstant();
- result.Bind(fail_value);
+ // Return null, mimicking the C++ counterpart.
+ SetLabel(is_not_jsobject);
+ result.Bind(assembler_->NullConstant());
assembler_->Goto(&merge);
// Return.
@@ -91,6 +67,31 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField(
return FromRaw(result.value());
}
+FastAccessorAssembler::ValueId
+FastAccessorAssembler::LoadInternalFieldUnchecked(ValueId value, int field_no) {
+ CHECK_EQ(kBuilding, state_);
+
+ // Defensive debug checks.
+ if (FLAG_debug_code) {
+ LabelId is_jsobject = MakeLabel();
+ LabelId is_not_jsobject = MakeLabel();
+ CheckIsJSObjectOrJump(value, is_not_jsobject);
+ assembler_->Goto(FromId(is_jsobject));
+
+ SetLabel(is_not_jsobject);
+ assembler_->DebugBreak();
+ assembler_->Goto(FromId(is_jsobject));
+
+ SetLabel(is_jsobject);
+ }
+
+ Node* result = assembler_->LoadObjectField(
+ FromId(value), JSObject::kHeaderSize + kPointerSize * field_no,
+ MachineType::Pointer());
+
+ return FromRaw(result);
+}
+
FastAccessorAssembler::ValueId FastAccessorAssembler::LoadValue(ValueId value,
int offset) {
CHECK_EQ(kBuilding, state_);
@@ -193,6 +194,40 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::Call(
return FromRaw(call);
}
+void FastAccessorAssembler::CheckIsJSObjectOrJump(ValueId value_id,
+ LabelId label_id) {
+ CHECK_EQ(kBuilding, state_);
+
+ // Determine the 'value' object's instance type.
+ Node* object_map = assembler_->LoadObjectField(
+ FromId(value_id), Internals::kHeapObjectMapOffset,
+ MachineType::Pointer());
+
+ Node* instance_type = assembler_->WordAnd(
+ assembler_->LoadObjectField(object_map,
+ Internals::kMapInstanceTypeAndBitFieldOffset,
+ MachineType::Uint16()),
+ assembler_->IntPtrConstant(0xff));
+
+ CodeStubAssembler::Label is_jsobject(assembler_.get());
+
+ // Check whether we have a proper JSObject.
+ assembler_->GotoIf(
+ assembler_->WordEqual(
+ instance_type, assembler_->IntPtrConstant(Internals::kJSObjectType)),
+ &is_jsobject);
+
+ // JSApiObject?.
+ assembler_->GotoUnless(
+ assembler_->WordEqual(instance_type, assembler_->IntPtrConstant(
+ Internals::kJSApiObjectType)),
+ FromId(label_id));
+
+ // Continue.
+ assembler_->Goto(&is_jsobject);
+ assembler_->Bind(&is_jsobject);
+}
+
MaybeHandle<Code> FastAccessorAssembler::Build() {
CHECK_EQ(kBuilding, state_);
Handle<Code> code = assembler_->GenerateCode();
« no previous file with comments | « src/fast-accessor-assembler.h ('k') | test/cctest/test-api-fast-accessor-builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698