Diff for /parser3/src/main/Attic/core.C between versions 1.31 and 1.37

version 1.31, 2001/02/23 22:22:08 version 1.37, 2001/02/25 08:50:13
Line 17  void core() { Line 17  void core() {
   
 void Request::core() {  void Request::core() {
         TRY {          TRY {
                 String name_RUN(pool()); name_RUN.APPEND_CONST("RUN");                  char *file="Y:\\parser3\\src\\test.p";
                 char *result=execute_MAIN(construct_class(name_RUN, load_and_compile_RUN()));                  String RUN(pool()); RUN.APPEND_CONST(NAME_RUN);
                 printf("-----------------\n%s\n----------------\n", result);                  use(file, &RUN);
   
                   char *result=execute_MAIN();
                   printf("result-----------------\n%sEOF----------------\n", result);
         }           } 
         CATCH(e) {          CATCH(e) {
                 printf("\nERROR: ");                  printf("\nERROR: ");
Line 29  void Request::core() { Line 32  void Request::core() {
                         if(origin.file)                          if(origin.file)
                                 printf("%s(%d): ",                                  printf("%s(%d): ",
                                 origin.file, 1+origin.line);                                  origin.file, 1+origin.line);
                         printf("%s ",                           printf("'%s' ", 
                                 problem_source->cstr());                                  problem_source->cstr());
                 }                  }
                 printf("%s", e.comment());                  printf("%s", e.comment());
Line 45  void Request::core() { Line 48  void Request::core() {
         END_CATCH          END_CATCH
 }  }
   
 Array& Request::load_and_compile_RUN() {  void Request::use(char *file, String *name) {
         char *file="Y:\\parser3\\src\\test.p";  
         char *source=file_read(pool(), file);          char *source=file_read(pool(), file);
         Array& compiled_methods=COMPILE(source, file);          if(!source)
         return compiled_methods;                  THROW(0,0,
 }                          0,
                           "use: can not read '%s' file", file);
 VClass *Request::construct_class(String& name, Array& compiled_methods) {  
         // create new 'name' vclass, add it to request's classes  
         Array immediate_parents(pool());  
         // TODO: immediate_parents=@PARENTS  
   
         VClass *result=NEW VClass(pool(), name, immediate_parents);  
         result->set_name(name);  
         classes().put(name, result);  
                   
         for(int i=0; i<compiled_methods.size(); i++) {  
                 // TODO: filter out @PARENTS & @CLASS & ?co?  
                 Method &method=*static_cast<Method *>(compiled_methods.quick_get(i));  
                 result->add_method(method.name, method);  
         }  
   
         return result;          VClass& vclass=COMPILE(source, file);
           if(name) // they forced some name?
                   vclass.set_name(*name);
           name=vclass.name();
           if(!name)
                   return; //TODO: add operators 
           classes_array()+=&vclass;
           classes().put(*name, &vclass);
 }  }
   
 char *Request::execute_MAIN(VClass *class_RUN) {  char *Request::execute_MAIN() {
         // initialize contexts          // locate class with @main & it's code
         root=self=rcontext=class_RUN;  
         wcontext=NEW WWrapper(pool(), class_RUN);  
   
         // locate @main code  
         String name_main(pool());          String name_main(pool());
         name_main.APPEND_CONST(MAIN_METHOD_NAME);          name_main.APPEND_CONST(MAIN_METHOD_NAME);
   
         Value *value_main=class_RUN->get_element(name_main);          // looking for latest known @main
         if(!value_main)          for(int i=classes_array().size(); --i>=0;) {
                 THROW(0,0,                  VClass *vclass=static_cast<VClass *>(classes_array().get(i));
                         &class_RUN->name(),                  Value *main=vclass->get_element(name_main);
                         "no '"MAIN_METHOD_NAME"' method in class");                  if(main) { // found some 'main' element
                           Junction *junction=main->get_junction();
         Junction *junction_main=value_main->get_junction();                          if(junction) {// it even has junction!
         const Method *method_main=junction_main->method;                                  const Method *method=junction->method;
                                   if(method) { // and junction is method-junction! call it
         if(!method_main)                                          // initialize contexts
                 THROW(0,0,                                          self=root=rcontext=vclass;
                         &class_RUN->name(),                                          wcontext=NEW WWrapper(pool(), vclass);
                         "'"MAIN_METHOD_NAME"' in class is not a method");                                          
                                           // execute!     
         // execute!                                               execute(method->code);
         execute(method_main->code);                                          
                                           // return chars
         // return chars                                          return wcontext->get_string()->cstr();
         return wcontext->get_string()->cstr();                                  }
                           }
                   }
           }
           
           THROW(0,0,
                   0, 
                   "'"MAIN_METHOD_NAME"' method not found");
           return 0;
 }  }

Removed from v.1.31  
changed lines
  Added in v.1.37


E-mail: