--- parser3/src/main/execute.C 2003/02/03 09:17:47 1.295.2.7 +++ parser3/src/main/execute.C 2003/02/17 16:44:57 1.295.2.15 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_EXECUTE_C="$Date: 2003/02/03 09:17:47 $"; +static const char* IDENT_EXECUTE_C="$Date: 2003/02/17 16:44:57 $"; #include "pa_opcode.h" #include "pa_array.h" @@ -23,15 +23,7 @@ static const char* IDENT_EXECUTE_C="$Dat #include "pa_vimage.h" #include "pa_wwrapper.h" -//#define DEBUG_EXECUTE -//#define DEBUG_STRING_APPENDS_VS_EXPANDS - - -#ifdef DEBUG_STRING_APPENDS_VS_EXPANDS -ulong wcontext_result_size=0; -#endif - - +#define DEBUG_EXECUTE #ifdef DEBUG_EXECUTE char *opcode_name[]={ @@ -62,35 +54,34 @@ char *opcode_name[]={ "IS" }; -void va_debug_printf(Pool& pool, const char* fmt,va_list args) { +void va_debug_printf(SAPI_Info& sapi_info, const char* fmt,va_list args) { char buf[MAX_STRING]; vsnprintf(buf, MAX_STRING, fmt, args); - SAPI::log(pool, "%s", buf); + SAPI::log(sapi_info, "%s", buf); } -void debug_printf(Pool& pool, const char* fmt, ...) { +void debug_printf(SAPI_Info& sapi_info, const char* fmt, ...) { va_list args; - va_start(args,fmt); - va_debug_printf(pool,fmt,args); + va_start(args, fmt); + va_debug_printf(sapi_info, fmt, args); va_end(args); } -void debug_dump(Pool& pool, int level, const Array& ops) { - Array_iterator i(ops); +void debug_dump(SAPI_Info& sapi_info, Pool& pool, int level, ArrayOperation& ops) { + Array_iterator i(ops); while(i.has_next()) { - Operation op; - op.cast=i.next(); + Operation& op=i.next(); if(op.code==OP_VALUE || op.code==OP_STRING__WRITE) { - Value* value=i.next().value; - debug_printf(pool, + ValuePtr value=i.next().value; + debug_printf(sapi_info, "%*s%s" " \"%s\" %s", level*4, "", opcode_name[op.code], - value->get_string()->cstr(), value->type()); + value->get_string(&pool)->cstr().get(), value->type()); continue; } - debug_printf(pool, "%*s%s", level*4, "", opcode_name[op.code]); + debug_printf(sapi_info, "%*s%s", level*4, "", opcode_name[op.code]); switch(op.code) { case OP_CURLY_CODE__STORE_PARAM: @@ -100,28 +91,22 @@ void debug_dump(Pool& pool, int level, c case OP_OBJECT_POOL: case OP_STRING_POOL: case OP_CALL: - local_ops=i.next().ops; - debug_dump(pool, level+1, *local_ops); + case OP_CALL__WRITE: + if(ArrayOperation* local_ops=i.next().ops.get()) + debug_dump(sapi_info, pool, level+1, *local_ops); } } } #endif -/*#define stack.push(value) stack.push(value.get()) -#define stack.pop().value static_cast(stack.pop()) - -#define stack.push(value) stack.push(value) -#define stack.pop().string static_cast(stack.pop())->as_string(&pool()).get() -#define POP_CODE() static_cast(stack.pop()) -*/ // Request void Request::execute(ArrayOperation& ops) { // _asm int 3; #ifdef DEBUG_EXECUTE - debug_printf("source----------------------------\n"); - debug_dump(0, ops); - debug_printf("execution-------------------------\n"); + debug_printf(sapi_info, "source----------------------------\n"); + debug_dump(sapi_info, pool(), 0, ops); + debug_printf(sapi_info, "execution-------------------------\n"); #endif StringPtr last_get_element_name(0); @@ -134,7 +119,7 @@ void Request::execute(ArrayOperation& op Operation& op=i.next(); #ifdef DEBUG_EXECUTE - debug_printf("%d:%s", stack.top_index()+1, opcode_name[op.code]); + debug_printf(sapi_info, "%d:%s", stack.top_index()+1, opcode_name[op.code]); #endif ValuePtr value; @@ -152,7 +137,7 @@ void Request::execute(ArrayOperation& op { value=i.next().value; #ifdef DEBUG_EXECUTE - debug_printf(" \"%s\" %s", value->get_string()->cstr(), value->type()); + debug_printf(sapi_info, " \"%s\" %s", value->get_string(&pool())->cstr().get(), value->type()); #endif stack.push(value); break; @@ -162,7 +147,7 @@ void Request::execute(ArrayOperation& op // maybe they do ^class:method[] call, remember the fact wcontext->set_somebody_entered_some_class(); - name=stack.pop().string; + name=stack.pop().string(); value=classes().get(name); if(!value) throw Exception("parser.runtime", @@ -204,7 +189,7 @@ void Request::execute(ArrayOperation& op case OP_CONSTRUCT_VALUE: { value=stack.pop().value; - name=stack.pop().string; + name=stack.pop().string(); ncontext=stack.pop().value.get(); ncontext->put_element(name, value, false); break; @@ -215,7 +200,7 @@ void Request::execute(ArrayOperation& op wcontext->set_in_expression(false); value=stack.pop().value; - name=stack.pop().string; + name=stack.pop().string(); ncontext=stack.pop().value.get(); ncontext->put_element(name, value->as_expr_result(), false); break; @@ -224,8 +209,8 @@ void Request::execute(ArrayOperation& op { local_ops=i.next().ops; #ifdef DEBUG_EXECUTE - debug_printf(" (%d)\n", local_ops->count()); - debug_dump(1, *local_ops); + debug_printf(sapi_info, " (%d)\n", local_ops->count()); + debug_dump(sapi_info, pool(), 1, *local_ops); #endif value=ValuePtr(new VJunction(JunctionPtr(new Junction( get_self(), 0, @@ -234,7 +219,7 @@ void Request::execute(ArrayOperation& op wcontext, local_ops)))); - name=stack.pop().string; + name=stack.pop().string(); ncontext=stack.pop().value.get(); ncontext->put_element(name, value, false); break; @@ -243,8 +228,8 @@ void Request::execute(ArrayOperation& op { local_ops=i.next().ops; #ifdef DEBUG_EXECUTE - debug_printf(" (%d)\n", local_ops->count()); - debug_dump(1, *local_ops); + debug_printf(sapi_info, " (%d)\n", local_ops->count()); + debug_dump(sapi_info, pool(), 1, *local_ops); #endif stack.push(local_ops); break; @@ -269,7 +254,7 @@ void Request::execute(ArrayOperation& op { value=i.next().value; #ifdef DEBUG_EXECUTE - debug_printf(" \"%s\"", value->get_string(0).cstr()); + debug_printf(sapi_info, " \"%s\"", value->get_string(0)->cstr().get()); #endif write_no_lang(*value->get_string(0)); break; @@ -303,7 +288,7 @@ void Request::execute(ArrayOperation& op WContext *saved_wcontext=wcontext; uchar saved_lang= flang; flang=String::UL_PASS_APPENDED; - WWrapper local(ValuePtr(0)/*empty*/, wcontext); + WWrapper local(ValuePtr(0)/*empty*/, wcontext); local.ref(); wcontext=&local; execute(*local_ops); @@ -320,7 +305,7 @@ void Request::execute(ArrayOperation& op local_ops=i.next().ops; WContext *saved_wcontext=wcontext; - WWrapper local(ValuePtr(0) /*empty*/, wcontext); + WWrapper local(ValuePtr(0) /*empty*/, wcontext); local.ref(); wcontext=&local; execute(*local_ops); @@ -341,7 +326,7 @@ void Request::execute(ArrayOperation& op case OP_STORE_PARAM: { value=stack.pop().value; - VMethodFrame *frame=static_cast(stack.top_value().unknown); + VMethodFrame *frame=static_cast(stack.top_value().ptr); // this op is executed from CALL local_ops only, so may skip the check "method_frame_to_fill==0" frame->store_param(value); break; @@ -351,10 +336,10 @@ void Request::execute(ArrayOperation& op { // code local_ops=i.next().ops; - VMethodFrame *frame=static_cast(stack.top_value().unknown); + VMethodFrame *frame=static_cast(stack.top_value().ptr); #ifdef DEBUG_EXECUTE - debug_printf(" (%d)\n", local_ops->count()); - debug_dump(1, *local_ops); + debug_printf(sapi_info, " (%d)\n", local_ops->count()); + debug_dump(sapi_info, pool(), 1, *local_ops); #endif // when they evaluate expression parameter, // the object expression result @@ -392,10 +377,11 @@ void Request::execute(ArrayOperation& op { local_ops=i.next().ops; #ifdef DEBUG_EXECUTE - debug_printf(" (%d)\n", local_ops->count()); - debug_dump(1, *local_ops); + debug_printf(sapi_info, " (%d)\n", local_ops?local_ops->count():0); + if(local_ops) + debug_dump(sapi_info, pool(), 1, *local_ops); - debug_printf("->\n"); + debug_printf(sapi_info, "->\n"); #endif value=stack.pop().value; @@ -418,7 +404,7 @@ void Request::execute(ArrayOperation& op value->type()); */ - VMethodFrame frame(pool(), last_get_element_name, *junction, method_frame/*caller*/); + VMethodFrame frame(pool(), last_get_element_name, *junction, method_frame/*caller*/); frame.ref(); if(local_ops){ // store param code goes here stack.push(&frame); // argument for *STORE_PARAM ops execute(*local_ops); @@ -443,7 +429,7 @@ void Request::execute(ArrayOperation& op throw Exception("parser.runtime", frame.name(), "is not a constructor, system class '%s' can be constructed only implicitly", - called_class->name()->cstr()); + (char*)called_class->name()->cstr()); frame.write(new_self, String::UL_CLEAN // not used, always an object, not string @@ -497,19 +483,14 @@ void Request::execute(ArrayOperation& op rcontext=saved_rcontext; method_frame=saved_method_frame; -#ifdef DEBUG_STRING_APPENDS_VS_EXPANDS - if(const String *s=value->get_string()) - wcontext_result_size+=s->used_rows()*sizeof(String::Chunk::Row); -#endif - if(op.code==OP_CALL__WRITE) { write_assign_lang(result, last_get_element_name); } else { // OP_CALL - stack.push(&result.as_value()); + stack.push(result.as_value()); } #ifdef DEBUG_EXECUTE - debug_printf("<-returned"); + debug_printf(sapi_info, "<-returned"); #endif break; } @@ -838,7 +819,7 @@ void Request::execute(ArrayOperation& op @bug ^superbase:method would dynamically call ^base:method if there is any */ ValuePtr Request::get_element(StringPtr& remember_name, bool can_call_operator) { - StringPtr name=stack.pop().string; remember_name=name; + StringPtr name=stack.pop().string(); remember_name=name; Value* ncontext=stack.pop().value.get(); ValuePtr value(0); if(can_call_operator) { @@ -895,7 +876,7 @@ StringOrValue Request::process(ValuePtr if(junction && junction->code) { // is it a code-junction? // process it #ifdef DEBUG_EXECUTE - debug_printf("ja->\n"); + debug_printf(sapi_info, "ja->\n"); #endif if(!junction->method_frame) @@ -917,7 +898,7 @@ StringOrValue Request::process(ValuePtr if(using_code_frame) { // almost plain wwrapper about junction wcontext, // BUT intercepts string writes - VCodeFrame local(*junction->wcontext, junction->wcontext); + VCodeFrame local(*junction->wcontext, junction->wcontext); local.ref(); wcontext=&local; // execute it @@ -929,7 +910,7 @@ StringOrValue Request::process(ValuePtr result.set_string(wcontext->get_string(&pool())); } else { // plain wwrapper - WWrapper local(ValuePtr(0)/*empty*/, wcontext); + WWrapper local(ValuePtr(0)/*empty*/, wcontext); local.ref(); wcontext=&local; // execute it @@ -943,7 +924,7 @@ StringOrValue Request::process(ValuePtr method_frame=saved_method_frame; #ifdef DEBUG_EXECUTE - debug_printf("<-ja returned"); + debug_printf(sapi_info, "<-ja returned"); #endif } else { result.set_value(input_value); @@ -981,7 +962,7 @@ StringPtr Request::execute_method(ValueP WContext *saved_wcontext=wcontext; Junction local_junction(aself, &method, 0,0,0, ArrayOperationPtr(0)); - VMethodFrame local_frame(pool(), method.name, local_junction, method_frame/*caller*/); + VMethodFrame local_frame(pool(), method.name, local_junction, method_frame/*caller*/); local_frame.ref(); if(optional_param && local_frame.can_store_param()) { local_frame.store_param(optional_param); local_frame.fill_unspecified_params(); @@ -991,7 +972,7 @@ StringPtr Request::execute_method(ValueP // prevent non-string writes for better error reporting if(do_return_string) - wcontext->write(pool(), ValuePtr(new VVoid)); + wcontext->write(pool(), ValuePtr(&local_frame)); // execute! execute(*method.parser_code); @@ -1008,20 +989,20 @@ StringPtr Request::execute_method(ValueP return result; } -StringPtr Request::execute_nonvirtual_method(VStateless_classPtr aclass, +StringPtr Request::execute_nonvirtual_method(VStateless_class& aclass, StringPtr method_name, VStringPtr optional_param, bool do_return_string, const Method **return_method) { - const Method *method=aclass->get_method(method_name); + const Method *method=aclass.get_method(method_name); StringPtr result(0); if(return_method) *return_method=method; if(method) - return execute_method(aclass, *method, optional_param, do_return_string); + return execute_method(ValuePtr(&aclass), *method, optional_param, do_return_string); else - return 0; + return StringPtr(0); } StringPtr Request::execute_virtual_method(ValuePtr aself, @@ -1031,5 +1012,5 @@ StringPtr Request::execute_virtual_metho if(const Method *method=junction->method) return execute_method(aself, *method, VStringPtr(0)/*no params*/, true); - return 0; + return StringPtr(0); }