diff --git a/libs/yscript/javascript.cpp b/libs/yscript/javascript.cpp index 5e326bf4..da99fc0f 100644 --- a/libs/yscript/javascript.cpp +++ b/libs/yscript/javascript.cpp @@ -49,10 +49,10 @@ public: virtual bool runField(ObjList& stack, const ExpOperation& oper, GenObject* context); virtual bool runAssign(ObjList& stack, const ExpOperation& oper, GenObject* context); GenObject* resolve(ObjList& stack, String& name, GenObject* context); -private: - GenObject* resolveTop(ObjList& stack, const String& name, GenObject* context); bool runStringFunction(GenObject* obj, const String& name, ObjList& stack, const ExpOperation& oper, GenObject* context); bool runStringField(GenObject* obj, const String& name, ObjList& stack, const ExpOperation& oper, GenObject* context); +private: + GenObject* resolveTop(ObjList& stack, const String& name, GenObject* context); }; class JsNull : public JsObject @@ -2060,12 +2060,24 @@ bool JsCode::runOperation(ObjList& stack, const ExpOperation& oper, GenObject* c return gotError("Expecting field names",oper.lineNumber()); } if (op1->opcode() != OpcField) { + // try to obtain an object on which to run the field ScriptContext* ctx = YOBJECT(ScriptContext,op1); if (ctx && ctx->runField(stack,*op2,context)) { TelEngine::destruct(op1); TelEngine::destruct(op2); break; } + else { + // op1 is not an object, it's a string + JsContext* jsCtx = 0; + if (sr) + jsCtx = static_cast(sr->context()); + if (jsCtx && jsCtx->runStringField(op1,op2->name(),stack,*op2,context)) { + TelEngine::destruct(op1); + TelEngine::destruct(op2); + break; + } + } TelEngine::destruct(op1); TelEngine::destruct(op2); return gotError("Expecting field names",oper.lineNumber());