16313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
26313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
36313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org// found in the LICENSE file.
46313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
56313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#ifndef V8_CODE_FACTORY_H_
66313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#define V8_CODE_FACTORY_H_
76313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
86313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#include "src/allocation.h"
96313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#include "src/assembler.h"
106313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#include "src/codegen.h"
116313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#include "src/globals.h"
126313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#include "src/interface-descriptors.h"
136313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
146313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgnamespace v8 {
156313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgnamespace internal {
166313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
176313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org// Associates a body of code with an interface descriptor.
186313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgclass Callable FINAL BASE_EMBEDDED {
196313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org public:
206313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Callable(Handle<Code> code, CallInterfaceDescriptor descriptor)
216313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      : code_(code), descriptor_(descriptor) {}
226313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
236313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Handle<Code> code() const { return code_; }
246313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  CallInterfaceDescriptor descriptor() const { return descriptor_; }
256313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
266313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org private:
276313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  const Handle<Code> code_;
286313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  const CallInterfaceDescriptor descriptor_;
296313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org};
306313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
316313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
326313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgclass CodeFactory FINAL {
336313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org public:
346313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  // Initial states for ICs.
356313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  static Callable LoadIC(Isolate* isolate, ContextualMode mode);
366313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  static Callable KeyedLoadIC(Isolate* isolate);
376313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  static Callable StoreIC(Isolate* isolate, StrictMode mode);
386313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  static Callable KeyedStoreIC(Isolate* isolate, StrictMode mode);
396313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
406313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  static Callable CompareIC(Isolate* isolate, Token::Value op);
416313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
426313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  static Callable BinaryOpIC(Isolate* isolate, Token::Value op,
436313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org                             OverwriteMode mode = NO_OVERWRITE);
446313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
456313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  // Code stubs. Add methods here as needed to reduce dependency on
466313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  // code-stubs.h.
476313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  static Callable ToBoolean(
486313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      Isolate* isolate, ToBooleanStub::ResultMode mode,
496313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      ToBooleanStub::Types types = ToBooleanStub::Types());
506313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
516313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  static Callable ToNumber(Isolate* isolate);
526313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
536313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  static Callable StringAdd(Isolate* isolate, StringAddFlags flags,
546313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org                            PretenureFlag pretenure_flag);
556313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org
566313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  static Callable CallFunction(Isolate* isolate, int argc,
576313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org                               CallFunctionFlags flags);
586313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org};
596313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org}
606313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org}
616313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#endif  // V8_CODE_FACTORY_H_
62