From 82611fb13009d348a8a5df6b9ba48e5236244cfd Mon Sep 17 00:00:00 2001 From: "rogerl%netscape.com" Date: Wed, 6 Nov 2002 23:15:02 +0000 Subject: [PATCH] DumpByteCode implemented/ git-svn-id: svn://10.0.0.236/trunk@133215 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js2/src/bytecodecontainer.h | 1 + mozilla/js2/src/epimetheus.cpp | 28 +++++++++++- mozilla/js2/src/js2engine.cpp | 67 ++++++++++++++++++++++++++--- mozilla/js2/src/js2engine.h | 5 ++- mozilla/js2/src/js2metadata.cpp | 9 +++- 5 files changed, 99 insertions(+), 11 deletions(-) diff --git a/mozilla/js2/src/bytecodecontainer.h b/mozilla/js2/src/bytecodecontainer.h index 406f5fa771e..d34d95dbb7f 100644 --- a/mozilla/js2/src/bytecodecontainer.h +++ b/mozilla/js2/src/bytecodecontainer.h @@ -92,6 +92,7 @@ public: void mark(); uint8 *getCodeStart() { return mBuffer.begin(); } + uint8 *getCodeEnd() { return mBuffer.begin() + mBuffer.size(); } typedef std::pair MapEntry; std::vector pcMap; diff --git a/mozilla/js2/src/epimetheus.cpp b/mozilla/js2/src/epimetheus.cpp index 92cd894251c..c739efb2313 100644 --- a/mozilla/js2/src/epimetheus.cpp +++ b/mozilla/js2/src/epimetheus.cpp @@ -209,6 +209,30 @@ js2val print(JS2Metadata * /* meta */, const js2val /* thisValue */, js2val argv return JS2VAL_UNDEFINED; } +#ifdef DEBUG +js2val dump(JS2Metadata *meta, const js2val /* thisValue */, js2val argv[], uint32 argc) +{ + if (argc) { + if (JS2VAL_IS_OBJECT(argv[0])) { + JS2Object *fObj = JS2VAL_TO_OBJECT(argv[0]); + if ((((fObj->kind == FixedInstanceKind) || (fObj->kind == DynamicInstanceKind)) + && (meta->objectType(argv[0]) == meta->functionClass))) { + FunctionWrapper *fWrap; + if (fObj->kind == FixedInstanceKind) + fWrap = (checked_cast(fObj))->fWrap; + else + fWrap = (checked_cast(fObj))->fWrap; + if (fWrap->code) + stdOut << "\n"; + else + dumpBytecode(fWrap->bCon); + } + } + } + return JS2VAL_UNDEFINED; +} +#endif + js2val load(JS2Metadata *meta, const js2val /* thisValue */, js2val argv[], uint32 argc) { // Set the environment to global object and system frame so that the @@ -244,7 +268,9 @@ int main(int argc, char **argv) metadata = new MetaData::JS2Metadata(world); metadata->addGlobalObjectFunction("print", print); metadata->addGlobalObjectFunction("load", load); - +#ifdef DEBUG + metadata->addGlobalObjectFunction("dump", dump); +#endif try { bool doInteractive = true; diff --git a/mozilla/js2/src/js2engine.cpp b/mozilla/js2/src/js2engine.cpp index 4b132f90cb5..600b228883a 100644 --- a/mozilla/js2/src/js2engine.cpp +++ b/mozilla/js2/src/js2engine.cpp @@ -382,9 +382,9 @@ namespace MetaData { activationStackTop = activationStack = new ActivationFrame[MAX_ACTIVATION_STACK]; } -#ifdef NYI_DEBUG +#ifdef DEBUG - enum { BRANCH_OFFSET = 1, STR_PTR, NAME_INDEX, FRAME_INDEX, BRANCH_PAIR, U16 }; + enum { BRANCH_OFFSET = 1, STR_PTR, NAME_INDEX, FRAME_INDEX, BRANCH_PAIR, U16, FLOAT64 }; struct { JS2Op op; char *name; @@ -416,8 +416,8 @@ namespace MetaData { { eTrue, "True", 0 }, { eFalse, "False", 0 }, { eNull, "Null", 0 }, - { eNumber, "Number", 0 }, - { eRegExp, "RegExp", 0 }, + { eNumber, "Number", FLOAT64 }, + { eRegExp, "RegExp", U16 }, { eUInt64, "UInt64", 0 }, { eInt64, "Int64", 0 }, { eString, "String", STR_PTR }, // @@ -484,10 +484,65 @@ namespace MetaData { }; - void dumpBytecode(uint8 *start, uint8 *end) + void dumpBytecode(BytecodeContainer *bCon) { + uint8 *start = bCon->getCodeStart(); + uint8 *end = bCon->getCodeEnd(); uint8 *pc = start; - while () { + while (pc < end) { + printFormat(stdOut, "%.4d ", pc - start); + stdOut << opcodeData[*pc].name; + switch (opcodeData[*pc++].flags) { + case BRANCH_OFFSET: + { + int32 offset = BytecodeContainer::getOffset(pc); + stdOut << " " << offset << " --> " << (pc - start) + offset; + pc += sizeof(int32); + } + break; + case STR_PTR: + { + uint16 index = BytecodeContainer::getShort(pc); + stdOut << "\"" << bCon->mStringList[index] << "\""; + pc += sizeof(short); + } + break; + case NAME_INDEX: + { + Multiname *mn = bCon->mMultinameList[BytecodeContainer::getShort(pc)]; + stdOut << " " << *mn->name; + pc += sizeof(short); + } + break; + case FRAME_INDEX: + { + pc += sizeof(short); + } + break; + case BRANCH_PAIR: + { + int32 offset1 = BytecodeContainer::getOffset(pc); + pc += sizeof(int32); + int32 offset2 = BytecodeContainer::getOffset(pc); + pc += sizeof(int32); + if (offset1 == NotALabel) + stdOut << "no finally; "; + else + stdOut << "(finally) " << offset1 << " --> " << (pc - start) + offset1 << "; "; + if (offset2 == -1) + stdOut << "no catch;"; + else + stdOut << "(catch) " << offset2 << " --> " << (pc - start) + offset2; + } + break; + case FLOAT64: + { + stdOut << " " << BytecodeContainer::getFloat64(pc); + pc += sizeof(float64); + } + break; + } + stdOut << "\n"; } } diff --git a/mozilla/js2/src/js2engine.h b/mozilla/js2/src/js2engine.h index 66c2de89ee4..ec5d96e7573 100644 --- a/mozilla/js2/src/js2engine.h +++ b/mozilla/js2/src/js2engine.h @@ -139,8 +139,6 @@ enum JS2Op { }; -int getStackEffect(JS2Op op); - class Frame; class JS2Object; @@ -148,6 +146,9 @@ class JS2Metadata; class BytecodeContainer; class JS2Class; +int getStackEffect(JS2Op op); +void dumpBytecode(BytecodeContainer *bCon); + class JS2Engine { public: diff --git a/mozilla/js2/src/js2metadata.cpp b/mozilla/js2/src/js2metadata.cpp index 37d1cab9ce8..f2bfa08f1d1 100644 --- a/mozilla/js2/src/js2metadata.cpp +++ b/mozilla/js2/src/js2metadata.cpp @@ -3091,8 +3091,13 @@ doUnary: reportError(Exception::propertyAccessError, "Forbidden access", engine->errorPos()); break; case StaticMember::Variable: - *rval = (checked_cast(m))->value; - return true; + { + Variable *v = checked_cast(m); + if ((phase == CompilePhase) && !v->immutable) + reportError(Exception::compileExpressionError, "Inappropriate compile time expression", engine->errorPos()); + *rval = v->value; + return true; + } case StaticMember::HoistedVariable: if (phase == CompilePhase) reportError(Exception::compileExpressionError, "Inappropriate compile time expression", engine->errorPos());