Changeset: 89d856e979ed for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=89d856e979ed
Added Files:
monetdb5/mal/mal_resolve.c
monetdb5/mal/mal_resolve.h
Removed Files:
monetdb5/mal/mal_resolve.mx
Modified Files:
monetdb5/mal/Makefile.ag
monetdb5/mal/mal_module.c
monetdb5/optimizer/opt_remap.mx
Branch: default
Log Message:
Merge with Apr2012 branch.
diffs (truncated from 1385 to 300 lines):
diff --git a/monetdb5/mal/Makefile.ag b/monetdb5/mal/Makefile.ag
--- a/monetdb5/mal/Makefile.ag
+++ b/monetdb5/mal/Makefile.ag
@@ -49,7 +49,7 @@ lib_mal = {
mal_properties.c mal_properties.h \
mal_readline.c mal_readline.h \
mal_recycle.c mal_recycle.h \
- mal_resolve.mx \
+ mal_resolve.c mal_resolve.h \
mal_sabaoth.c mal_sabaoth.h \
mal_scenario.c mal_scenario.h \
mal_session.c mal_session.h \
diff --git a/monetdb5/mal/mal_module.c b/monetdb5/mal/mal_module.c
--- a/monetdb5/mal/mal_module.c
+++ b/monetdb5/mal/mal_module.c
@@ -214,12 +214,12 @@ void freeModuleList(Module s){
s=t;
}
}
+
/*
- * @-
- * After filling in a structure it is added to the multi-level
- * symbol table. We keep a skip list of similar named function
- * symbols. This speeds up searching provided the modules adhire
- * to the structure group the functions as well.
+ * After filling in a structure it is added to the multi-level symbol
+ * table. We keep a skip list of similarly named function symbols.
+ * This speeds up searching provided the modules adhere to the
+ * structure and group the functions as well.
*/
void insertSymbol(Module scope, Symbol prg){
InstrPtr sig;
diff --git a/monetdb5/mal/mal_resolve.mx b/monetdb5/mal/mal_resolve.c
rename from monetdb5/mal/mal_resolve.mx
rename to monetdb5/mal/mal_resolve.c
--- a/monetdb5/mal/mal_resolve.mx
+++ b/monetdb5/mal/mal_resolve.c
@@ -1,23 +1,22 @@
-@/
-The contents of this file are subject to the MonetDB Public License
-Version 1.1 (the "License"); you may not use this file except in
-compliance with the License. You may obtain a copy of the License at
-http://www.monetdb.org/Legal/MonetDBLicense
+/*
+ * The contents of this file are subject to the MonetDB Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.monetdb.org/Legal/MonetDBLicense
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * The Original Code is the MonetDB Database System.
+ *
+ * The Initial Developer of the Original Code is CWI.
+ * Portions created by CWI are Copyright (C) 1997-July 2008 CWI.
+ * Copyright August 2008-2012 MonetDB B.V.
+ * All Rights Reserved.
+ */
-Software distributed under the License is distributed on an "AS IS"
-basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-License for the specific language governing rights and limitations
-under the License.
-
-The Original Code is the MonetDB Database System.
-
-The Initial Developer of the Original Code is CWI.
-Portions created by CWI are Copyright (C) 1997-July 2008 CWI.
-Copyright August 2008-2012 MonetDB B.V.
-All Rights Reserved.
-@
-
-@c
/*
* @a M. Kersten
* @v 1.0
@@ -40,7 +39,7 @@ All Rights Reserved.
* y := io.print(val);
* end sample;
* @end example
- * @-
+ *
* The function definition is polymorphic typed on the 2nd argument,
* it becomes a concrete type upon invocation. The system could attempt
* a type check, but quickly runs into assumptions that generally do not hold.
@@ -76,31 +75,6 @@ All Rights Reserved.
* TYPE_RESOLVED implies that the type of the instruction is fully
* resolved, it is marked TYPE_DYNAMIC otherwise.
*/
-@h
-#ifndef _MAL_RESOLVE_H
-#define _MAL_RESOLVE_H
-
-#include "mal_exception.h"
-#include "mal_function.h"
-#include "mal_listing.h"
-#include "mal_exception.h"
-
-/*
-#define DEBUG_MAL_RESOLVE 1
-*/
-#define MAXTYPEVAR 10
-
-mal_export void chkProgram(stream *out, Module s, MalBlkPtr mb);
-mal_export void chkInstruction(stream *out, Module s, MalBlkPtr mb, InstrPtr
p);
-mal_export void chkTypes(stream *out, Module s, MalBlkPtr mb, int silent);
-mal_export void typeChecker(stream *out, Module scope, MalBlkPtr mb, InstrPtr
p, int silent);
-mal_export int fcnBinder(stream *out, Module scope, MalBlkPtr mb, InstrPtr p);
-
-extern str traceFcnName;
-mal_export void expandMacro(MalBlkPtr mb, InstrPtr p, MalBlkPtr mc);
-
-#endif /* _MAL_RESOLVE_H*/
-@c
/*
* @- Function call resolution
* Search the first definition of the operator in the current module
@@ -119,16 +93,88 @@ int typeKind(MalBlkPtr mb, InstrPtr p, i
#define MAXMALARG 256
-str traceFcnName= "____";
+str traceFcnName = "____";
int tracefcn;
int polyVector[MAXTYPEVAR];
#if 0
-void polyInit(void){
+void
+polyInit(void)
+{
int i;
- for(i=0;i<MAXTYPEVAR;i++) polyVector[i]= TYPE_any;
+ for (i = 0; i < MAXTYPEVAR; i++)
+ polyVector[i] = TYPE_any;
}
#endif
+/*
+ * We found the proper function. Copy some properties. In particular,
+ * determine the calling strategy, i.e. FCNcall, CMDcall, FACcall, PATcall
+ * Beware that polymorphic functions may produce type-incorrect clones.
+ * This piece of code may be shared by the separate binder
+ */
+#define bindFunction(s, p, mb, out)
\
+ do {
\
+ if (s->def->errors) {
\
+ p->typechk = TYPE_UNKNOWN;
\
+ mb->errors++;
\
+ goto wrapup;
\
+ }
\
+ if (p->token == ASSIGNsymbol) {
\
+ switch (getSignature(s)->token) {
\
+ case COMMANDsymbol:
\
+ p->token = CMDcall;
\
+ p->fcn = getSignature(s)->fcn; /* C
implementation mandatory */ \
+ if (p->fcn == NULL) {
\
+ showScriptException(out, mb, getPC(mb,
p), TYPE, \
+
"object code for command %s.%s missing", \
+
p->modname, p->fcnname); \
+ p->typechk = TYPE_UNKNOWN;
\
+ mb->errors++;
\
+ goto wrapup;
\
+ }
\
+ break;
\
+ case PATTERNsymbol:
\
+ p->token = PATcall;
\
+ p->fcn = getSignature(s)->fcn; /* C
implementation optional */ \
+ break;
\
+ case FACTORYsymbol:
\
+ p->token = FACcall;
\
+ p->fcn = getSignature(s)->fcn; /* C
implementation optional */ \
+ break;
\
+ case FUNCTIONsymbol:
\
+ p->token = FCNcall;
\
+ if (getSignature(s)->fcn)
\
+ p->fcn = getSignature(s)->fcn; /* C
implementation optional */ \
+ break;
\
+ default: {
\
+ if (!silent)
\
+ showScriptException(out, mb, getPC(mb,
p), MAL, \
+
"MALresolve: unexpected token type"); \
+ mb->errors++;
\
+ goto wrapup;
\
+ }
\
+ }
\
+ p->blk = s->def;
\
+ }
\
+ } while (0)
+
+/*
+ * Since we now know the storage type of the receiving variable, we can
+ * set the garbage collection flag.
+ */
+#define prepostProcess(tp, p, b, mb) \
+ do {
\
+ if (findGDKtype(tp) == TYPE_bat ||
\
+ isaBatType(tp) ||
\
+ findGDKtype(tp) == TYPE_str ||
\
+ (!isPolyType(tp) && tp < TYPE_any && \
+ tp >= 0 && ATOMextern(tp))) {
\
+ getInstrPtr(mb, 0)->gc |= GARBAGECONTROL; \
+ setVarCleanup(mb, getArg(p, b));
\
+ p->gc |= GARBAGECONTROL;
\
+ }
\
+ } while (0)
+
static malType
findFunctionType(stream *out, Module scope, MalBlkPtr mb, InstrPtr p, int
silent)
{
@@ -136,11 +182,10 @@ findFunctionType(stream *out, Module sco
Symbol s;
InstrPtr sig;
int i, k, unmatched = 0, s1;
- /* int foundbutwrong=0;*/
+ /* int foundbutwrong=0; */
int polytype[MAXTYPEVAR];
- int *returntype= NULL;
+ int *returntype = NULL;
/*
- * @-
* Within a module find the subscope to locate the element in its list
* of symbols. A skiplist is used to speed up the search for the
* definition of the function.
@@ -157,32 +202,36 @@ findFunctionType(stream *out, Module sco
* Simplify polytype using a map into the concrete argument table.
*/
m = scope;
- s = m->subscope[(int)(getSubScope(getFunctionId(p)))];
- if (s == 0) return -1;
+ s = m->subscope[(int) (getSubScope(getFunctionId(p)))];
+ if (s == 0)
+ return -1;
- returntype= (int*) GDKzalloc(p->retc * sizeof(int));
- if ( returntype == 0) return -1;
+ returntype = (int *) GDKzalloc(p->retc * sizeof(int));
+ if (returntype == 0)
+ return -1;
- while (s != NULL) { /* single scope element check */
+ while (s != NULL) { /* single scope element check */
if (getFunctionId(p) != s->name) {
- s = s->skip; continue;
+ s = s->skip;
+ continue;
}
/*
- * @-
- * Perform a strong type-check on the actual arguments. If it
turns
- * out to be a polymorphic MAL function, we have to clone it.
- * Provided the actual/formal parameters are compliant
throughout
- * the function call.
+ * Perform a strong type-check on the actual arguments. If it
+ * turns out to be a polymorphic MAL function, we have to
+ * clone it. Provided the actual/formal parameters are
+ * compliant throughout the function call.
*
- * Also look out for variable argument lists. This means that we
- * have to keep two iterators, one for the caller (i) and one
for
- * the callee (k). Since a variable argument only occurs as the
last one,
- * we simple avoid an increment when running out of formal
arguments.
+ * Also look out for variable argument lists. This means that
+ * we have to keep two iterators, one for the caller (i) and
+ * one for the callee (k). Since a variable argument only
+ * occurs as the last one, we simple avoid an increment when
+ * running out of formal arguments.
*
- * A call of the form (X1,..., Xi) := f(Y1,....,Yn) can be
matched against
- * the function signature (B1,...,Bk):= f(A1,...,Am) where i==k
, n<=m
- * and type(Ai)=type(Yi). Furthermore, the variables Xi obtain
their type
- * from Bi (or type(Bi)==type(Xi)).
+ * A call of the form (X1,..., Xi) := f(Y1,....,Yn) can be
+ * matched against the function signature (B1,...,Bk):=
+ * f(A1,...,Am) where i==k , n<=m and
+ * type(Ai)=type(Yi). Furthermore, the variables Xi obtain
+ * their type from Bi (or type(Bi)==type(Xi)).
*/
sig = getSignature(s);
unmatched = 0;
@@ -197,23 +246,24 @@ findFunctionType(stream *out, Module sco
}
#endif
/*
- * @-
- * The simple case could be taken care of separately to speedup
processing
- * However, it turned out not to make a big difference.
- * The first time we encounter a polymorphic argument in the
+ * The simple case could be taken care of separately to
+ * speedup processing
+ * However, it turned out not to make a big difference. The
+ * first time we encounter a polymorphic argument in the
* signature.
* Subsequently, the polymorphic arguments update this table
- * and check for any type mismatches that might occur.
- * There are at most 2 type variables involved per argument
- * due to the limited type nesting permitted.
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list