bool ShockerScriptableObject::HasMethod (NPIdentifier id) { bool res = false; char *name = Browser::Instance ()->UTF8FromIdentifier (id); ShockerScriptableObjectMethod *method = GetMethods (); while (method->name) { if (!strcmp (name, method->name)) { res = true; break; } method++; } LOG_PLUGIN ("[%i shocker] %s::HasMethod (%s): %i\n", getpid (), GetTypeName (), name, res); free (name); return res; }
bool ShockerScriptableObject::Invoke (NPIdentifier id, const NPVariant *args, guint32 arg_count, NPVariant *result) { bool res = false; char *name = Browser::Instance ()->UTF8FromIdentifier (id); ShockerScriptableObjectMethod *method = GetMethods (); while (method->name) { if (!strcmp (name, method->name)) { scriptable_method m = method->Invoke; (this->*m) (args, arg_count, result); res = true; break; } method++; } LOG_PLUGIN ("[%i shocker] %s::Invoke (%s): %i\n", getpid (), GetTypeName (), name, res); free (name); return res; }
void Visit(SyntaxApi::IOperations::IGetMemberOp* operation_node) { TSOperation *left; left = VisitNode(operation_node->GetLeft()); TExpressionResult left_result = left->GetFormalParameter(); auto left_class = dynamic_cast<TSClass*>(left_result.GetClass()); if (left_result.IsMethods()) syntax_node->Error("Оператор доступа к члену класса нельзя применить к методу!"); if (left_result.IsType()) { auto left_result_class = dynamic_cast<TSClass*>(left_result.GetType()); if (left_result_class->GetSyntax()->IsEnumeration()) { int id = left_result_class->GetSyntax()->GetEnumId(operation_node->GetName()); //TODO ввести спец функции min max count if (id == -1) syntax_node->Error("Перечислимого типа с таким именем не существует!"); else { delete left; TSExpression::TEnumValue* result = new TSExpression::TEnumValue(owner, dynamic_cast<TSClass*>(left_result.GetType())); result->val = id; Return(result); } } else { TSClassField* static_member = left_result_class->GetField(operation_node->GetName(), true, true); if (static_member != nullptr) { TSExpression::TGetClassField* result = new TSExpression::TGetClassField( left, left_result, static_member); Return(result); } else { std::vector<SemanticApi::ISMethod*> methods; if (left_result_class->GetMethods(methods, operation_node->GetName(), SemanticApi::Filter::True)) { TSExpression::TGetMethods* result = new TSExpression::TGetMethods( left, left_result, TExpressionResult(methods, method->GetSyntax()->IsStatic())); Return(result); } else syntax_node->Error("Статического поля или метода с таким именем не существует!"); } } } else { TSClassField* member = (left_class != nullptr) ? left_class->GetField(operation_node->GetName(), true) : nullptr; if (member != nullptr) { if (member->GetSyntax()->IsStatic()) syntax_node->Error("Оператор доступа к члену класса нельзя применить к объекту для доступа к статическому члену, \nвместо объекта следует использовать имя класса!"); ValidateAccess(syntax_node, owner, member); TSExpression::TGetClassField* result = new TSExpression::TGetClassField( left, left_result, member); Return(result); } else { std::vector<SemanticApi::ISMethod*> methods; if (left_class->GetMethods(methods, operation_node->GetName(), SemanticApi::Filter::False)) { TSExpression::TGetMethods* result = new TSExpression::TGetMethods( left, left_result, TExpressionResult(methods, false)); Return(result); } else syntax_node->Error("Члена класса с таким именем не существует!"); } } }