add builtins handling and restricted flag
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 29cb171..52b4e52 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -30,12 +30,14 @@
 #include "frameobject.h"
 #include "opcode.h"
 #include "structmember.h"
+#include "bltinmodule.h"
 
 #define OFF(x) offsetof(frameobject, x)
 
 static struct memberlist frame_memberlist[] = {
 	{"f_back",	T_OBJECT,	OFF(f_back),	RO},
 	{"f_code",	T_OBJECT,	OFF(f_code),	RO},
+	{"f_builtins",	T_OBJECT,	OFF(f_builtins),RO},
 	{"f_globals",	T_OBJECT,	OFF(f_globals),	RO},
 	{"f_locals",	T_OBJECT,	OFF(f_locals),	RO},
 	{"f_owner",	T_OBJECT,	OFF(f_owner),	RO},
@@ -45,6 +47,7 @@
 	{"f_localmap",	T_OBJECT,	OFF(f_localmap),RO},
 	{"f_lasti",	T_INT,		OFF(f_lasti),	RO},
 	{"f_lineno",	T_INT,		OFF(f_lineno),	RO},
+	{"f_restricted",T_INT,		OFF(f_restricted),RO},
 	{"f_trace",	T_OBJECT,	OFF(f_trace)},
 	{NULL}	/* Sentinel */
 };
@@ -97,6 +100,7 @@
 {
 	XDECREF(f->f_back);
 	XDECREF(f->f_code);
+	XDECREF(f->f_builtins);
 	XDECREF(f->f_globals);
 	XDECREF(f->f_locals);
 	XDECREF(f->f_owner);
@@ -135,6 +139,7 @@
 	int nblocks;
 {
 	frameobject *f;
+	object *builtins;
 	if ((back != NULL && !is_frameobject(back)) ||
 		code == NULL || !is_codeobject(code) ||
 		globals == NULL || !is_dictobject(globals) ||
@@ -143,6 +148,11 @@
 		err_badcall();
 		return NULL;
 	}
+	builtins = dictlookup(globals, "__builtins__");
+	if (builtins == NULL || !is_mappingobject(builtins)) {
+		err_setstr(TypeError, "bad __builtins__ dictionary");
+		return NULL;
+	}
 	if (free_list == NULL) {
 		f = NEWOBJ(frameobject, &Frametype);
 		f->f_nvalues = f->f_nblocks = 0;
@@ -156,11 +166,12 @@
 		NEWREF(f);
 	}
 	if (f != NULL) {
-		if (back)
-			INCREF(back);
+		XINCREF(back);
 		f->f_back = back;
 		INCREF(code);
 		f->f_code = code;
+		XINCREF(builtins);
+		f->f_builtins = builtins;
 		INCREF(globals);
 		f->f_globals = globals;
 		INCREF(locals);
@@ -182,6 +193,7 @@
 		f->f_iblock = 0;
 		f->f_lasti = 0;
 		f->f_lineno = -1;
+		f->f_restricted = (builtins != getbuiltindict());
 		f->f_trace = NULL;
 		if (f->f_valuestack == NULL || f->f_blockstack == NULL) {
 			err_nomem();