2000-04-18 04:19:09 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Netscape Public
|
|
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.mozilla.org/NPL/
|
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed on an "AS
|
|
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
|
|
|
* implied. See the License for the specific language governing
|
|
|
|
* rights and limitations under the License.
|
|
|
|
*
|
|
|
|
* The Original Code is the JavaScript 2 Prototype.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is Netscape
|
|
|
|
* Communications Corporation. Portions created by Netscape are
|
|
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
|
|
* Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the
|
|
|
|
* terms of the GNU Public License (the "GPL"), in which case the
|
|
|
|
* provisions of the GPL are applicable instead of those above.
|
|
|
|
* If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of the GPL and not to allow others to use your
|
|
|
|
* version of this file under the NPL, indicate your decision by
|
|
|
|
* deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this
|
|
|
|
* file under either the NPL or the GPL.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "utilities.h"
|
|
|
|
#include "vmtypes.h"
|
|
|
|
|
|
|
|
namespace JavaScript {
|
2000-04-19 01:51:45 +04:00
|
|
|
namespace VM {
|
2000-06-21 02:45:45 +04:00
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
using namespace JSTypes;
|
|
|
|
|
|
|
|
#define OPCODE_NAMES
|
|
|
|
#include "icode.h"
|
|
|
|
|
|
|
|
Formatter& operator<< (Formatter& f, Instruction& i)
|
|
|
|
{
|
|
|
|
return i.print(f);
|
|
|
|
}
|
|
|
|
|
|
|
|
Formatter& operator<< (Formatter& f, RegisterList& rl)
|
|
|
|
{
|
|
|
|
TypedRegister* e = rl.end();
|
2000-04-18 04:19:09 +04:00
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
f << "(";
|
|
|
|
for (RegisterList::iterator r = rl.begin(); r != e; r++) {
|
|
|
|
f << "R" << r->first;
|
|
|
|
if ((r + 1) != e)
|
|
|
|
f << ", ";
|
2000-04-19 01:51:45 +04:00
|
|
|
}
|
2000-06-29 08:19:19 +04:00
|
|
|
f << ")";
|
2000-04-19 01:51:45 +04:00
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
return f;
|
|
|
|
}
|
2000-04-28 17:18:03 +04:00
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
Formatter& operator<< (Formatter& f, const ArgList& al)
|
|
|
|
{
|
|
|
|
const RegisterList& rl = al.mList;
|
|
|
|
const JSValues& registers = al.mRegisters;
|
|
|
|
f << "(";
|
|
|
|
RegisterList::const_iterator i = rl.begin(), e = rl.end();
|
|
|
|
if (i != e) {
|
|
|
|
TypedRegister r = *i++;
|
|
|
|
f << "R" << r.first << '=' << registers[r.first];
|
|
|
|
while (i != e) {
|
|
|
|
r = *i++;
|
|
|
|
f << ", R" << r.first << '=' << registers[r.first];
|
2000-04-28 17:18:03 +04:00
|
|
|
}
|
|
|
|
}
|
2000-06-29 08:19:19 +04:00
|
|
|
f << ")";
|
|
|
|
|
|
|
|
return f;
|
|
|
|
}
|
2000-04-28 17:18:03 +04:00
|
|
|
|
2000-07-12 00:54:06 +04:00
|
|
|
Formatter& operator<< (Formatter& f, TypedRegister& r)
|
|
|
|
{
|
|
|
|
if (r.first == NotARegister)
|
|
|
|
f << "<NaR>";
|
|
|
|
else
|
|
|
|
f << "R" << r.first;
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
Formatter& operator<< (Formatter &f, InstructionStream &is)
|
|
|
|
{
|
2000-05-05 02:42:49 +04:00
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
for (InstructionIterator i = is.begin();
|
|
|
|
i != is.end(); i++) {
|
|
|
|
/*
|
|
|
|
bool isLabel = false;
|
2000-05-05 02:42:49 +04:00
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
for (LabelList::iterator k = labels.begin();
|
|
|
|
k != labels.end(); k++)
|
|
|
|
if ((ptrdiff_t)(*k)->mOffset == (i - is.begin())) {
|
|
|
|
f << "#" << (uint32)(i - is.begin()) << "\t";
|
|
|
|
isLabel = true;
|
|
|
|
break;
|
|
|
|
}
|
2000-05-05 02:42:49 +04:00
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
if (!isLabel)
|
|
|
|
f << "\t";
|
2000-05-05 02:42:49 +04:00
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
f << **i << "\n";
|
|
|
|
*/
|
2000-05-05 02:42:49 +04:00
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
printFormat(stdOut, "%04u", (uint32)(i - is.begin()));
|
|
|
|
f << ": " << **i << "\n";
|
|
|
|
|
2000-05-05 02:42:49 +04:00
|
|
|
}
|
|
|
|
|
2000-06-29 08:19:19 +04:00
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
2000-04-19 01:51:45 +04:00
|
|
|
} /* namespace VM */
|
|
|
|
} /* namespace JavaScript */
|
2000-04-18 04:19:09 +04:00
|
|
|
|
|
|
|
|