blob: 93d56d545f893d90280937f2d33bee7d90693f52 [file] [log] [blame]
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set ts=8 sts=4 et sw=4 tw=99:
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef jit_CompileInfo_h
#define jit_CompileInfo_h
#include "Registers.h"
namespace js {
namespace jit {
inline unsigned
StartArgSlot(JSScript *script, JSFunction *fun)
{
// First slot is for scope chain.
// Second one may be for arguments object.
return 1 + (script->argumentsHasVarBinding() ? 1 : 0);
}
inline unsigned
CountArgSlots(JSScript *script, JSFunction *fun)
{
return StartArgSlot(script, fun) + (fun ? fun->nargs + 1 : 0);
}
enum ExecutionMode {
// Normal JavaScript execution
SequentialExecution = 0,
// JavaScript code to be executed in parallel worker threads,
// e.g. by ParallelArray
ParallelExecution
};
// Contains information about the compilation source for IR being generated.
class CompileInfo
{
public:
CompileInfo(JSScript *script, JSFunction *fun, jsbytecode *osrPc, bool constructing,
ExecutionMode executionMode);
CompileInfo(unsigned nlocals, ExecutionMode executionMode)
: script_(NULL), fun_(NULL), osrPc_(NULL), constructing_(false),
executionMode_(executionMode)
{
nimplicit_ = 0;
nargs_ = 0;
nlocals_ = nlocals;
nstack_ = 1; /* For FunctionCompiler::pushPhiInput/popPhiOutput */
nslots_ = nlocals_ + nstack_;
}
JSScript *script() const {
return script_;
}
JSFunction *fun() const {
return fun_;
}
bool constructing() const {
return constructing_;
}
jsbytecode *osrPc() {
return osrPc_;
}
bool hasOsrAt(jsbytecode *pc) {
JS_ASSERT(JSOp(*pc) == JSOP_LOOPENTRY);
return pc == osrPc();
}
jsbytecode *startPC() const {
return script_->code;
}
jsbytecode *limitPC() const {
return script_->code + script_->length;
}
inline const char *filename() const;
unsigned lineno() const {
return script_->lineno;
}
unsigned lineno(JSContext *cx, jsbytecode *pc) const {
return PCToLineNumber(script_, pc);
}
// Script accessors based on PC.
inline JSAtom *getAtom(jsbytecode *pc) const;
inline PropertyName *getName(jsbytecode *pc) const;
inline RegExpObject *getRegExp(jsbytecode *pc) const;
inline JSObject *getObject(jsbytecode *pc) const;
inline JSFunction *getFunction(jsbytecode *pc) const;
inline const Value &getConst(jsbytecode *pc) const;
inline jssrcnote *getNote(JSContext *cx, jsbytecode *pc) const;
// Total number of slots: args, locals, and stack.
unsigned nslots() const {
return nslots_;
}
unsigned nargs() const {
return nargs_;
}
unsigned nlocals() const {
return nlocals_;
}
unsigned ninvoke() const {
return nslots_ - nstack_;
}
uint32_t scopeChainSlot() const {
JS_ASSERT(script());
return 0;
}
uint32_t argsObjSlot() const {
JS_ASSERT(hasArguments());
return 1;
}
uint32_t thisSlot() const {
JS_ASSERT(fun());
return hasArguments() ? 2 : 1;
}
uint32_t firstArgSlot() const {
return nimplicit_;
}
uint32_t argSlotUnchecked(uint32_t i) const {
// During initialization, some routines need to get at arg
// slots regardless of how regular argument access is done.
JS_ASSERT(i < nargs_);
return nimplicit_ + i;
}
uint32_t argSlot(uint32_t i) const {
// This should only be accessed when compiling functions for
// which argument accesses don't need to go through the
// argument object.
JS_ASSERT(!argsObjAliasesFormals());
return argSlotUnchecked(i);
}
uint32_t firstLocalSlot() const {
return nimplicit_ + nargs_;
}
uint32_t localSlot(uint32_t i) const {
return firstLocalSlot() + i;
}
uint32_t firstStackSlot() const {
return firstLocalSlot() + nlocals();
}
uint32_t stackSlot(uint32_t i) const {
return firstStackSlot() + i;
}
uint32_t startArgSlot() const {
JS_ASSERT(scopeChainSlot() == 0);
return StartArgSlot(script(), fun());
}
uint32_t endArgSlot() const {
JS_ASSERT(scopeChainSlot() == 0);
return CountArgSlots(script(), fun());
}
uint32_t totalSlots() const {
return 2 + (hasArguments() ? 1 : 0) + nargs() + nlocals();
}
bool hasArguments() const {
return script()->argumentsHasVarBinding();
}
bool needsArgsObj() const {
return script()->needsArgsObj();
}
bool argsObjAliasesFormals() const {
return script()->argsObjAliasesFormals();
}
ExecutionMode executionMode() const {
return executionMode_;
}
bool isParallelExecution() const {
return executionMode_ == ParallelExecution;
}
private:
unsigned nimplicit_;
unsigned nargs_;
unsigned nlocals_;
unsigned nstack_;
unsigned nslots_;
JSScript *script_;
JSFunction *fun_;
jsbytecode *osrPc_;
bool constructing_;
ExecutionMode executionMode_;
};
} // namespace jit
} // namespace js
#endif /* jit_CompileInfo_h */