diff --git a/js2/src/js2engine.cpp b/js2/src/js2engine.cpp index adabea7ba8e5..094841ed8272 100644 --- a/js2/src/js2engine.cpp +++ b/js2/src/js2engine.cpp @@ -125,13 +125,16 @@ float64 *JS2Engine::newDoubleValue(float64 x) // if the argument can be stored as an integer value, do so // otherwise get a double value -void JS2Engine::pushNumber(float64 x) +js2val JS2Engine::pushNumber(float64 x) { uint32 i; + js2val retval; if (JSDOUBLE_IS_INT(x, i) && INT_FITS_IN_JS2VAL(i)) - push(INT_TO_JS2VAL(i)); + retval = INT_TO_JS2VAL(i); else - push(DOUBLE_TO_JS2VAL(newDoubleValue(x))); + retval = DOUBLE_TO_JS2VAL(newDoubleValue(x)); + push(retval); + return retval; } // Convert an integer to a string diff --git a/js2/src/js2engine.h b/js2/src/js2engine.h index fa1e20ac2f25..f9844b6a4012 100644 --- a/js2/src/js2engine.h +++ b/js2/src/js2engine.h @@ -82,7 +82,7 @@ public: size_t errorPos(); - void pushNumber(float64 x); + js2val pushNumber(float64 x); #define MAX_EXEC_STACK (20) diff --git a/js2/src/js2metadata.cpp b/js2/src/js2metadata.cpp index 296aa516b077..d1d2cd0ef8ba 100644 --- a/js2/src/js2metadata.cpp +++ b/js2/src/js2metadata.cpp @@ -178,6 +178,18 @@ namespace MetaData { break; case StmtNode::Use: { + UseStmtNode *u = checked_cast(p); + ExprList *eList = u->namespaces; + while (eList) { + js2val av = EvalExpression(env, CompilePhase, eList->expr); + if (JS2VAL_IS_NULL(av) || !JS2VAL_IS_OBJECT(av)) + reportError(Exception::badValueError, "Namespace expected in use directive", p->pos); + JS2Object *obj = JS2VAL_TO_OBJECT(av); + if ((obj->kind != AttributeObjectKind) || (checked_cast(obj)->attrKind != Attribute::NamespaceAttr)) + reportError(Exception::badValueError, "Namespace expected in use directive", p->pos); + cxt->openNamespaces.push_back(checked_cast(obj)); + eList = eList->next; + } } break; } // switch (p->getKind()) @@ -253,14 +265,6 @@ namespace MetaData { break; case StmtNode::Use: { - UseStmtNode *u = checked_cast(p); - ExprList *eList = u->namespaces; - while (eList) { - Reference *r = EvalExprNode(env, phase, eList->expr); - if (r) r->emitReadBytecode(bCon, p->pos); - bCon->emitOp(eUse, p->pos); - eList = eList->next; - } } break; default: @@ -585,8 +589,8 @@ namespace MetaData { { BinaryExprNode *b = checked_cast(p); Reference *lVal = EvalExprNode(env, phase, b->op1); - Reference *rVal = EvalExprNode(env, phase, b->op2); if (lVal) lVal->emitReadBytecode(bCon, p->pos); + Reference *rVal = EvalExprNode(env, phase, b->op2); if (rVal) rVal->emitReadBytecode(bCon, p->pos); bCon->emitOp(ePlus, p->pos); } @@ -628,6 +632,7 @@ namespace MetaData { { IdentifierExprNode *i = checked_cast(p); returnRef = new LexicalReference(i->name, cxt.strict); + ((LexicalReference *)returnRef)->variableMultiname->addNamespace(cxt); ((LexicalReference *)returnRef)->emitBindBytecode(bCon, p->pos); } break; diff --git a/js2/src/js2op_arithmetic.cpp b/js2/src/js2op_arithmetic.cpp index ddd27ac19872..f58ca6d713d2 100644 --- a/js2/src/js2op_arithmetic.cpp +++ b/js2/src/js2op_arithmetic.cpp @@ -44,12 +44,13 @@ String *bstr = toString(b); String *c = new String(*astr); *c += *bstr; - push(STRING_TO_JS2VAL(c)); + retval = STRING_TO_JS2VAL(c); + push(retval); } else { float64 anum = toNumber(a); float64 bnum = toNumber(b); - pushNumber(anum + bnum); + retval = pushNumber(anum + bnum); } } break;