Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
	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("Члена класса с таким именем не существует!");
			}
		}
	}