 Chromium Code Reviews
 Chromium Code Reviews Issue 1474543004:
  Implement Fast Accessor Builder  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1474543004:
  Implement Fast Accessor Builder  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| Index: src/compiler/fast-accessor-assembler.h | 
| diff --git a/src/compiler/fast-accessor-assembler.h b/src/compiler/fast-accessor-assembler.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..01dfb0da2fa5440df128576da7e9fd47d844c870 | 
| --- /dev/null | 
| +++ b/src/compiler/fast-accessor-assembler.h | 
| @@ -0,0 +1,108 @@ | 
| +// Copyright 2015 the V8 project authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#ifndef V8_COMPILER_FAST_ACCESSOR_ASSEMBLER_H_ | 
| +#define V8_COMPILER_FAST_ACCESSOR_ASSEMBLER_H_ | 
| + | 
| +#include <stdint.h> | 
| +#include <vector> | 
| + | 
| +// Clients of this interface shouldn't depend on lots of compiler internals. | 
| +// Do not include anything from src/compiler here! | 
| +#include "include/v8-experimental.h" | 
| +#include "src/base/macros.h" | 
| +#include "src/base/smart-pointers.h" | 
| +#include "src/handles.h" | 
| + | 
| + | 
| +namespace v8 { | 
| +namespace internal { | 
| + | 
| +class Code; | 
| +class Isolate; | 
| +class Zone; | 
| + | 
| +namespace compiler { | 
| + | 
| +class Node; | 
| +class RawMachineAssembler; | 
| +class RawMachineLabel; | 
| + | 
| + | 
| +// This interface "exports" an aggregated subset of RawMachineAssembler, for | 
| +// use by the API to implement Fast Dom Accessors. | 
| +// | 
| +// This interface is made for this single purpose only and does not attempt | 
| +// to implement a general purpose solution. If you need one, please look at | 
| +// RawMachineAssembler instead. | 
| +// | 
| +// The life cycle of a FastAccessorAssembler has two phases: | 
| +// - After creating the instance, you can call an arbitrary sequence of | 
| +// builder functions to build the desired function. | 
| +// - When done, you can Build() the accessor and query for the build results. | 
| +// | 
| +// You cannot call any result getters before Build() was called & successful; | 
| +// and you cannot call any builder functions after Build() was called. | 
| +class FastAccessorAssembler { | 
| + public: | 
| + typedef v8::experimental::FastAccessorBuilder::ValueId ValueId; | 
| + typedef v8::experimental::FastAccessorBuilder::LabelId LabelId; | 
| + | 
| + explicit FastAccessorAssembler(Isolate* isolate); | 
| + ~FastAccessorAssembler(); | 
| + | 
| + // Builder / assembler functions: | 
| + ValueId IntegerConstant(int int_constant); | 
| + ValueId GetReceiver(); | 
| + ValueId LoadInternalField(ValueId value_id, int field_no); | 
| + ValueId LoadValue(ValueId value_id, int offset); | 
| + ValueId LoadObject(ValueId value_id, int offset); | 
| + | 
| + // Builder / assembler functions for control flow. | 
| + void ReturnValue(ValueId value_id); | 
| + void CheckFlagSetOrReturnNull(ValueId value_id, int mask); | 
| + void CheckNotZeroOrReturnNull(ValueId value_id); | 
| + | 
| + // TODO(vogelheim): Implement a C++ callback. | 
| + // void CheckNotNullOrCallback(ValueId value_id, ..c++-callback type..., | 
| + // ValueId arg1, ValueId arg2, ...); | 
| + | 
| + LabelId MakeLabel(); | 
| + void SetLabel(LabelId label_id); | 
| + void CheckNotZeroOrJump(ValueId value_id, LabelId label_id); | 
| + | 
| + // Assemble the code. | 
| + MaybeHandle<Code> Build(); | 
| + | 
| + private: | 
| + ValueId FromRaw(Node* node); | 
| + LabelId FromRaw(RawMachineLabel* label); | 
| + Node* FromId(ValueId value) const; | 
| + RawMachineLabel* FromId(LabelId value) const; | 
| + | 
| + Zone* zone() { return &zone_; } | 
| + | 
| + Zone zone_; | 
| + base::SmartPointer<RawMachineAssembler> assembler_; | 
| 
epertoso
2015/12/04 09:56:32
Do you need this to be a pointer?
 
vogelheim
2015/12/08 12:52:56
I do, if I don't want to include the src/compiler/
 
epertoso
2015/12/10 10:07:37
Sounds fair.
 | 
| + | 
| + // To prevent exposing the RMA internals to the outside world, we'll map | 
| 
epertoso
2015/12/04 09:56:32
This comment is outdated.
 
vogelheim
2015/12/08 12:52:56
Done.
 | 
| + // Node + Label pointers to ValueId integers, and use two vectors to | 
| + // remember + check them. | 
| + // Since ValueIds can map to either nodes_ or labels_, we can't use the | 
| + // same slot for both. | 
| + std::vector<Node*> nodes_; | 
| + std::vector<RawMachineLabel*> labels_; | 
| + | 
| + // Remember the current state for easy error checking. (We prefer to be | 
| + // strict as this class will be exposed at the API.) | 
| + enum { kBuilding, kBuilt, kError } state_; | 
| + | 
| + DISALLOW_COPY_AND_ASSIGN(FastAccessorAssembler); | 
| +}; | 
| + | 
| +} // namespace compiler | 
| +} // namespace internal | 
| +} // namespace v8 | 
| + | 
| +#endif // V8_COMPILER_FAST_ACCESSOR_ASSEMBLER_H_ |