--- parser3/src/classes/reflection.C 2015/10/25 22:24:05 1.35 +++ parser3/src/classes/reflection.C 2015/10/26 13:47:12 1.39 @@ -1,7 +1,7 @@ /** @file Parser: @b reflection parser class. - Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ @@ -9,7 +9,7 @@ #include "pa_request.h" #include "pa_vbool.h" -volatile const char * IDENT_REFLECTION_C="$Id: reflection.C,v 1.35 2015/10/25 22:24:05 moko Exp $"; +volatile const char * IDENT_REFLECTION_C="$Id: reflection.C,v 1.39 2015/10/26 13:47:12 moko Exp $"; static const String class_type_methoded("methoded"); @@ -334,10 +334,10 @@ static void _dynamical(Request& r, Metho } static void _is(Request& r, MethodParams& params) { - const String& type=params.as_string(0, "class name must be string"); - const String& name=params.as_string(params.count()-1, "element name must be string"); - Value &context=params.count()==3 ? params.as_no_junction(1, "context must not be code") : *(r.get_method_frame()->caller()); - Value *value=context.get_element(name); + const String& name=params.as_string(0, "element name must be string"); + const String& type=params.as_string(1, "class name must be string"); + Value *context=params.count()==3 ? &(params.as_no_junction(2, "context must not be code")) : r.get_method_frame()->caller(); + Value *value=context ? context->get_element(name) : 0; if(value) { if(type == "code" || type == "method") { @@ -347,7 +347,7 @@ static void _is(Request& r, MethodParams r.write_no_lang(VBool::get( value->is(type.cstr()) )); } } else - r.write_no_lang(VBool::get(false)); + r.write_no_lang(VBool::get(type == "void")); } static void _copy(Request& r, MethodParams& params) { @@ -423,7 +423,7 @@ MReflection::MReflection(): Methoded("re // ^reflection:dynamical[[object or class, caller if absent]] add_native_method("dynamical", Method::CT_STATIC, _dynamical, 0, 1); - // ^reflection:is[class_name|code|method;[context;]element_name] + // ^reflection:is[element_name;class_name|code|method[;context]] add_native_method("is", Method::CT_STATIC, _is, 2, 3); // ^reflection:copy[src;dst]