Browse Source

* gen_high_tree now uses an inline node of type in_high_x in most cases
so that it doesn't duplicate any code anymore from ninl.pas (and
dynamic array support was still missing)

Jonas Maebe 24 years ago
parent
commit
8ddb738e07
1 changed files with 23 additions and 23 deletions
  1. 23 23
      compiler/ncal.pas

+ 23 - 23
compiler/ncal.pas

@@ -539,6 +539,7 @@ implementation
 
     procedure tcallparanode.gen_high_tree(openstring:boolean);
       var
+        temp: tnode;
         len : longint;
         st  : tsymtable;
         loadconst : boolean;
@@ -551,34 +552,25 @@ implementation
         case left.resulttype.def.deftype of
           arraydef :
             begin
-              if is_open_array(left.resulttype.def) or
-                 is_array_of_const(left.resulttype.def) then
-               begin
-                 st:=tloadnode(left).symtable;
-                 srsym:=searchsymonlyin(st,'high'+tvarsym(tloadnode(left).symtableentry).name);
-                 hightree:=cloadnode.create(tvarsym(srsym),st);
-                 loadconst:=false;
-               end
+              { handle via a normal inline in_high_x node }
+              loadconst := false;
+              hightree := geninlinenode(in_high_x,false,left.getcopy);
+              { only substract low(array) if it's <> 0 }
+              temp := geninlinenode(in_low_x,false,left.getcopy);
+              firstpass(temp);
+              if (temp.nodetype <> ordconstn) or
+                 (tordconstnode(temp).value <> 0) then
+                hightree := caddnode.create(subn,hightree,temp)
               else
-                begin
-                  { this is an empty constructor }
-                  len:=tarraydef(left.resulttype.def).highrange-
-                       tarraydef(left.resulttype.def).lowrange;
-                end;
+                temp.free;
             end;
           stringdef :
             begin
               if openstring then
                begin
-                 if is_open_string(left.resulttype.def) then
-                  begin
-                    st:=tloadnode(left).symtable;
-                    srsym:=searchsymonlyin(st,'high'+tvarsym(tloadnode(left).symtableentry).name);
-                    hightree:=cloadnode.create(tvarsym(srsym),st);
-                    loadconst:=false;
-                  end
-                 else
-                  len:=tstringdef(left.resulttype.def).len;
+                 { handle via a normal inline in_high_x node }
+                 loadconst := false;
+                 hightree := geninlinenode(in_high_x,false,left.getcopy);
                end
               else
              { passing a string to an array of char }
@@ -593,7 +585,10 @@ implementation
                    begin
                      hightree:=caddnode.create(subn,geninlinenode(in_length_x,false,left.getcopy),
                                                cordconstnode.create(1,s32bittype));
+{
+                     not necessary (JM) 
                      firstpass(hightree);
+}
                      hightree:=ctypeconvnode.create(hightree,s32bittype);
                      loadconst:=false;
                    end;
@@ -1763,7 +1758,12 @@ begin
 end.
 {
   $Log$
-  Revision 1.58  2001-11-20 18:49:43  peter
+  Revision 1.59  2001-12-10 14:28:47  jonas
+    * gen_high_tree now uses an inline node of type in_high_x in most cases
+      so that it doesn't duplicate any code anymore from ninl.pas (and
+      dynamic array support was still missing)
+
+  Revision 1.58  2001/11/20 18:49:43  peter
     * require overload for cross object overloading
 
   Revision 1.57  2001/11/18 20:18:54  peter